* wl-summary.el (wl-summary-collect-unread): Eliminated.
[elisp/wanderlust.git] / wl / wl-summary.el
index 8c7234a..67ebaac 100644 (file)
@@ -35,7 +35,7 @@
 ;;; Code:
 ;;
 
 ;;; Code:
 ;;
 
-(require 'elmo)
+(require 'elmo2)
 (require 'elmo-multi)
 (require 'wl-message)
 (require 'wl-vars)
 (require 'elmo-multi)
 (require 'wl-message)
 (require 'wl-vars)
@@ -45,7 +45,6 @@
 (condition-case nil (require 'timezone) (error nil))
 (condition-case nil (require 'easymenu) (error nil))
 (require 'elmo-date)
 (condition-case nil (require 'timezone) (error nil))
 (condition-case nil (require 'easymenu) (error nil))
 (require 'elmo-date)
-(require 'elmo-dop)
 (condition-case nil (require 'ps-print) (error nil))
 
 (eval-when-compile
 (condition-case nil (require 'ps-print) (error nil))
 
 (eval-when-compile
 (defvar wl-summary-mode-map nil)
 (defvar wl-current-summary-buffer nil)
 
 (defvar wl-summary-mode-map nil)
 (defvar wl-current-summary-buffer nil)
 
-(defvar wl-summary-buffer-elmo-folder nil)
-
-(defmacro wl-summary-buffer-folder-name ()
-  (` (and wl-summary-buffer-elmo-folder
-         (elmo-folder-name-internal wl-summary-buffer-elmo-folder))))
-
-(defmacro wl-summary-buffer-msgdb ()
-  (` (and wl-summary-buffer-elmo-folder
-         (elmo-folder-msgdb wl-summary-buffer-elmo-folder))))
-
+(defvar wl-summary-buffer-msgdb       nil)
+(defvar wl-summary-buffer-folder-name nil)
 (defvar wl-summary-buffer-folder-indicator nil)
 (defvar wl-summary-buffer-disp-msg    nil)
 (defvar wl-summary-buffer-disp-folder nil)
 (defvar wl-summary-buffer-folder-indicator nil)
 (defvar wl-summary-buffer-disp-msg    nil)
 (defvar wl-summary-buffer-disp-folder nil)
 (defvar wl-summary-buffer-saved-message nil)
 (defvar wl-summary-buffer-prev-folder-func nil)
 (defvar wl-summary-buffer-next-folder-func nil)
 (defvar wl-summary-buffer-saved-message nil)
 (defvar wl-summary-buffer-prev-folder-func nil)
 (defvar wl-summary-buffer-next-folder-func nil)
+(defvar wl-summary-buffer-next-message-func nil)
 (defvar wl-summary-buffer-exit-func nil)
 (defvar wl-summary-buffer-number-list nil)
 (defvar wl-summary-buffer-exit-func nil)
 (defvar wl-summary-buffer-number-list nil)
-(defvar wl-summary-buffer-msgdb nil)
-(defvar wl-summary-buffer-folder-name nil)
 
 (defvar wl-thread-indent-level-internal nil)
 (defvar wl-thread-have-younger-brother-str-internal nil)
 
 (defvar wl-thread-indent-level-internal nil)
 (defvar wl-thread-have-younger-brother-str-internal nil)
 (defvar wl-summary-alike-hashtb nil)
 (defvar wl-summary-search-buf-name " *wl-search-subject*")
 (defvar wl-summary-delayed-update nil)
 (defvar wl-summary-alike-hashtb nil)
 (defvar wl-summary-search-buf-name " *wl-search-subject*")
 (defvar wl-summary-delayed-update nil)
-(defvar wl-summary-search-buf-folder-name nil)
 
 (defvar wl-summary-get-petname-func 'wl-address-get-petname-1)
 
 
 (defvar wl-summary-get-petname-func 'wl-address-get-petname-1)
 
-(defvar wl-summary-message-regexp "^ *\\([0-9-]+\\)")
+(defvar wl-summary-message-regexp "^ *\\([0-9]+\\)")
 
 (defvar wl-summary-shell-command-last "")
 
 (defvar wl-ps-preprint-hook nil)
 (defvar wl-ps-print-hook nil)
 
 
 (defvar wl-summary-shell-command-last "")
 
 (defvar wl-ps-preprint-hook nil)
 (defvar wl-ps-print-hook nil)
 
-(make-variable-buffer-local 'wl-summary-buffer-elmo-folder)
-(make-variable-buffer-local 'wl-summary-search-buf-folder-name)
+(make-variable-buffer-local 'wl-summary-buffer-msgdb)
 (make-variable-buffer-local 'wl-summary-buffer-disp-msg)
 (make-variable-buffer-local 'wl-summary-buffer-disp-folder)
 (make-variable-buffer-local 'wl-summary-buffer-refile-list)
 (make-variable-buffer-local 'wl-summary-buffer-copy-list)
 (make-variable-buffer-local 'wl-summary-buffer-target-mark-list)
 (make-variable-buffer-local 'wl-summary-buffer-delete-list)
 (make-variable-buffer-local 'wl-summary-buffer-disp-msg)
 (make-variable-buffer-local 'wl-summary-buffer-disp-folder)
 (make-variable-buffer-local 'wl-summary-buffer-refile-list)
 (make-variable-buffer-local 'wl-summary-buffer-copy-list)
 (make-variable-buffer-local 'wl-summary-buffer-target-mark-list)
 (make-variable-buffer-local 'wl-summary-buffer-delete-list)
+(make-variable-buffer-local 'wl-summary-buffer-folder-name)
 (make-variable-buffer-local 'wl-summary-buffer-folder-indicator)
 (make-variable-buffer-local 'wl-summary-buffer-last-displayed-msg)
 (make-variable-buffer-local 'wl-summary-buffer-unread-status)
 (make-variable-buffer-local 'wl-summary-buffer-folder-indicator)
 (make-variable-buffer-local 'wl-summary-buffer-last-displayed-msg)
 (make-variable-buffer-local 'wl-summary-buffer-unread-status)
 (make-variable-buffer-local 'wl-summary-buffer-mime-charset)
 (make-variable-buffer-local 'wl-summary-buffer-weekday-name-lang)
 (make-variable-buffer-local 'wl-summary-buffer-thread-indent-set)
 (make-variable-buffer-local 'wl-summary-buffer-mime-charset)
 (make-variable-buffer-local 'wl-summary-buffer-weekday-name-lang)
 (make-variable-buffer-local 'wl-summary-buffer-thread-indent-set)
+(make-variable-buffer-local 'wl-summary-buffer-message-redisplay-func)
 (make-variable-buffer-local 'wl-summary-buffer-view)
 (make-variable-buffer-local 'wl-summary-buffer-message-modified)
 (make-variable-buffer-local 'wl-summary-buffer-mark-modified)
 (make-variable-buffer-local 'wl-summary-buffer-view)
 (make-variable-buffer-local 'wl-summary-buffer-message-modified)
 (make-variable-buffer-local 'wl-summary-buffer-mark-modified)
 (make-variable-buffer-local 'wl-thread-space-str-internal)
 (make-variable-buffer-local 'wl-summary-buffer-prev-folder-func)
 (make-variable-buffer-local 'wl-summary-buffer-next-folder-func)
 (make-variable-buffer-local 'wl-thread-space-str-internal)
 (make-variable-buffer-local 'wl-summary-buffer-prev-folder-func)
 (make-variable-buffer-local 'wl-summary-buffer-next-folder-func)
+(make-variable-buffer-local 'wl-summary-buffer-next-message-func)
 (make-variable-buffer-local 'wl-summary-buffer-exit-func)
 (make-variable-buffer-local 'wl-summary-buffer-number-list)
 (make-variable-buffer-local 'wl-summary-buffer-exit-func)
 (make-variable-buffer-local 'wl-summary-buffer-number-list)
-(make-variable-buffer-local 'wl-summary-buffer-msgdb)
-(make-variable-buffer-local 'wl-summary-buffer-folder-name)
 
 ;; internal functions (dummy)
 (unless (fboundp 'wl-summary-append-message-func-internal)
 
 ;; internal functions (dummy)
 (unless (fboundp 'wl-summary-append-message-func-internal)
   (defun wl-summary-subject-filter-func-internal (subject)
     subject))
 
   (defun wl-summary-subject-filter-func-internal (subject)
     subject))
 
-(defmacro wl-summary-sticky-buffer-name (name)
-  (` (concat wl-summary-buffer-name ":" (, name))))
+(defmacro wl-summary-sticky-buffer-name (folder)
+  (` (concat wl-summary-buffer-name ":" (, folder))))
 
 (defun wl-summary-default-subject (subject-string)
   (if (string-match "^[ \t]*\\[[^:]+[,: ][0-9]+\\][ \t]*" subject-string)
 
 (defun wl-summary-default-subject (subject-string)
   (if (string-match "^[ \t]*\\[[^:]+[,: ][0-9]+\\][ \t]*" subject-string)
        (and (eq major-mode 'wl-summary-mode)
             (stringp wl-summary-showto-folder-regexp)
             (string-match wl-summary-showto-folder-regexp
        (and (eq major-mode 'wl-summary-mode)
             (stringp wl-summary-showto-folder-regexp)
             (string-match wl-summary-showto-folder-regexp
-                          (wl-summary-buffer-folder-name))
+                          wl-summary-buffer-folder-name)
             (wl-address-user-mail-address-p from)
             (cond
              ((and (setq tos (elmo-msgdb-overview-entity-get-to entity))
             (wl-address-user-mail-address-p from)
             (cond
              ((and (setq tos (elmo-msgdb-overview-entity-get-to entity))
   (define-key wl-summary-mode-map "\e\r" 'wl-summary-prev-line-content)
   (define-key wl-summary-mode-map "g"    'wl-summary-goto-folder)
   (define-key wl-summary-mode-map "c"    'wl-summary-mark-as-read-all)
   (define-key wl-summary-mode-map "\e\r" 'wl-summary-prev-line-content)
   (define-key wl-summary-mode-map "g"    'wl-summary-goto-folder)
   (define-key wl-summary-mode-map "c"    'wl-summary-mark-as-read-all)
-;  (define-key wl-summary-mode-map "D"    'wl-summary-drop-unsync)
+  (define-key wl-summary-mode-map "D"    'wl-summary-drop-unsync)
 
   (define-key wl-summary-mode-map "a"    'wl-summary-reply)
   (define-key wl-summary-mode-map "A"    'wl-summary-reply-with-citation)
 
   (define-key wl-summary-mode-map "a"    'wl-summary-reply)
   (define-key wl-summary-mode-map "A"    'wl-summary-reply-with-citation)
   (if wl-summary-buffer-disp-msg
       (wl-summary-redisplay)))
 
   (if wl-summary-buffer-disp-msg
       (wl-summary-redisplay)))
 
-(defun wl-summary-collect-unread (mark-alist &optional folder)
-  (let (mark ret-val)
-    (while mark-alist
-      (setq mark (cadr (car mark-alist)))
-      (and mark
-          (or (string= mark wl-summary-new-mark)
-              (string= mark wl-summary-unread-uncached-mark)
-              (string= mark wl-summary-unread-cached-mark))
-          (setq ret-val (cons (car (car mark-alist)) ret-val)))
-      (setq mark-alist (cdr mark-alist)))
-    ret-val))
-
-(defun wl-summary-count-unread (mark-alist)
+(defun wl-summary-count-unread (mark-alist &optional folder)
   (let ((new 0)
        (unread 0)
        mark)
   (let ((new 0)
        (unread 0)
        mark)
@@ -584,7 +561,7 @@ If ARG is non-nil, Supersedes message"
   (interactive "P")
   (if arg
       (wl-summary-supersedes-message)
   (interactive "P")
   (if arg
       (wl-summary-supersedes-message)
-    (if (string= (wl-summary-buffer-folder-name) wl-draft-folder)
+    (if (string= wl-summary-buffer-folder-name wl-draft-folder)
        (if (wl-summary-message-number)
            (unwind-protect
                (wl-draft-reedit (wl-summary-message-number))
        (if (wl-summary-message-number)
            (unwind-protect
                (wl-draft-reedit (wl-summary-message-number))
@@ -596,7 +573,8 @@ If ARG is non-nil, Supersedes message"
        (let ((mmelmo-force-fetch-entire-message t))
          (if (null (wl-summary-message-number))
              (message "No message.")
        (let ((mmelmo-force-fetch-entire-message t))
          (if (null (wl-summary-message-number))
              (message "No message.")
-           (set-buffer (wl-summary-get-original-buffer))
+           (wl-summary-set-message-buffer-or-redisplay)
+           (set-buffer (wl-message-get-original-buffer))
            (wl-draft-edit-string (buffer-substring (point-min)
                                                    (point-max)))))))))
 
            (wl-draft-edit-string (buffer-substring (point-min)
                                                    (point-max)))))))))
 
@@ -615,7 +593,7 @@ you."
        (cond
         ((and
           (re-search-forward
        (cond
         ((and
           (re-search-forward
-           (concat "^\\($\\|[Cc]ontent-[Tt]ype:[ \t]+multipart/report\\)") nil t)
+           (concat "^\\($\\|[Cc]ontent-[Tt]ype:[ \t]+multipart/\\(report\\|mixed\\)\\)") nil t)
           (not (bolp))
           (re-search-forward "boundary=\"\\([^\"]+\\)\"" nil t))
          (let ((boundary (buffer-substring (match-beginning 1) (match-end 1)))
           (not (bolp))
           (re-search-forward "boundary=\"\\([^\"]+\\)\"" nil t))
          (let ((boundary (buffer-substring (match-beginning 1) (match-end 1)))
@@ -623,6 +601,7 @@ you."
            (cond
             ((and (setq start (re-search-forward
                           (concat "^--" boundary "\n"
            (cond
             ((and (setq start (re-search-forward
                           (concat "^--" boundary "\n"
+                                  "\\([Cc]ontent-[Dd]escription:.*\n\\)?"
                                   "[Cc]ontent-[Tt]ype:[ \t]+"
                                   "\\(message/rfc822\\|text/rfc822-headers\\)\n"
                                   "\\(.+\n\\)*\n") nil t))
                                   "[Cc]ontent-[Tt]ype:[ \t]+"
                                   "\\(message/rfc822\\|text/rfc822-headers\\)\n"
                                   "\\(.+\n\\)*\n") nil t))
@@ -688,31 +667,54 @@ you."
        (kill-buffer (current-buffer)))
       (message "Resending message to %s...done" address))))
 
        (kill-buffer (current-buffer)))
       (message "Resending message to %s...done" address))))
 
+(defun wl-summary-msgdb-load-async (folder)
+  "Loading msgdb and selecting FOLDER is executed asynchronously in IMAP4."
+  (if (and (elmo-folder-plugged-p folder)
+          (eq (elmo-folder-get-type folder) 'imap4))
+      (let ((spec (elmo-folder-get-spec folder))
+           session mailbox
+           msgdb response tag)
+       (unwind-protect
+           (progn
+             (setq session (elmo-imap4-get-session spec)
+                   mailbox (elmo-imap4-spec-mailbox spec)
+                   tag (elmo-imap4-send-command session
+                                                (list "select "
+                                                      (elmo-imap4-mailbox
+                                                       mailbox))))
+             (setq msgdb (elmo-msgdb-load (elmo-string folder)))
+             (setq response (elmo-imap4-read-response session tag)))
+         (if response
+             (elmo-imap4-session-set-current-mailbox-internal session mailbox)
+           (and session
+                (elmo-imap4-session-set-current-mailbox-internal session nil))
+           (message "Select mailbox %s failed" mailbox)))
+       msgdb)
+    (elmo-msgdb-load (elmo-string folder))))
+
 (defun wl-summary-buffer-set-folder (folder)
 (defun wl-summary-buffer-set-folder (folder)
-  (if (stringp folder)
-      (setq folder (wl-folder-get-elmo-folder folder)))
-  (setq wl-summary-buffer-elmo-folder folder)
+  (setq wl-summary-buffer-folder-name folder)
   (setq wl-summary-buffer-folder-indicator
        (if (memq 'modeline wl-use-folder-petname)
   (setq wl-summary-buffer-folder-indicator
        (if (memq 'modeline wl-use-folder-petname)
-           (wl-folder-get-petname (elmo-folder-name-internal folder))
-         (elmo-folder-name-internal folder)))
-  (make-local-variable 'wl-message-buffer)
+           (wl-folder-get-petname folder)
+         folder))
+  (when (wl-summary-sticky-p)
+    (make-local-variable 'wl-message-buf-name)
+    (setq wl-message-buf-name (format "%s:%s" wl-message-buf-name folder)))
   (setq wl-summary-buffer-mime-charset (or (wl-get-assoc-list-value
                                            wl-folder-mime-charset-alist
   (setq wl-summary-buffer-mime-charset (or (wl-get-assoc-list-value
                                            wl-folder-mime-charset-alist
-                                           (elmo-folder-name-internal folder))
+                                           folder)
                                           wl-mime-charset))
   (setq wl-summary-buffer-weekday-name-lang
        (or (wl-get-assoc-list-value
             wl-folder-weekday-name-lang-alist
                                           wl-mime-charset))
   (setq wl-summary-buffer-weekday-name-lang
        (or (wl-get-assoc-list-value
             wl-folder-weekday-name-lang-alist
-            (elmo-folder-name-internal folder))
+            folder)
            wl-summary-weekday-name-lang))
   (setq wl-summary-buffer-thread-indent-set
        (wl-get-assoc-list-value
         wl-folder-thread-indent-set-alist
            wl-summary-weekday-name-lang))
   (setq wl-summary-buffer-thread-indent-set
        (wl-get-assoc-list-value
         wl-folder-thread-indent-set-alist
-        (elmo-folder-name-internal folder)))
-  (setq wl-summary-buffer-persistent
-       (wl-folder-persistent-p (elmo-folder-name-internal folder)))
-  (elmo-folder-set-persistent-internal folder wl-summary-buffer-persistent)
+        folder))
+  (setq wl-summary-buffer-persistent (wl-folder-persistent-p folder))
   (setq
    wl-thread-indent-level-internal
    (or (nth 0 wl-summary-buffer-thread-indent-set)
   (setq
    wl-thread-indent-level-internal
    (or (nth 0 wl-summary-buffer-thread-indent-set)
@@ -760,13 +762,18 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
 ;;;(make-local-variable 'tab-width)
 ;;;(setq tab-width 1)
   (buffer-disable-undo (current-buffer))
 ;;;(make-local-variable 'tab-width)
 ;;;(setq tab-width 1)
   (buffer-disable-undo (current-buffer))
+  (if wl-use-semi
+      (setq wl-summary-buffer-message-redisplay-func
+           'wl-mmelmo-message-redisplay)
+    (setq wl-summary-buffer-message-redisplay-func
+         'wl-normal-message-redisplay))
   (wl-mode-line-buffer-identification '("Wanderlust: "
                                        wl-summary-buffer-folder-indicator
                                        wl-summary-buffer-unread-status))
   (easy-menu-add wl-summary-mode-menu)
   (when wl-summary-lazy-highlight
   (wl-mode-line-buffer-identification '("Wanderlust: "
                                        wl-summary-buffer-folder-indicator
                                        wl-summary-buffer-unread-status))
   (easy-menu-add wl-summary-mode-menu)
   (when wl-summary-lazy-highlight
-    (make-local-variable 'window-scroll-functions)
-    (add-hook 'window-scroll-functions 'wl-highlight-summary-window))  
+    (make-local-hook 'window-scroll-functions)
+    (add-hook 'window-scroll-functions 'wl-highlight-summary-window nil t))
   ;; This hook may contain the function `wl-setup-summary' for reasons
   ;; of system internal to accord facilities for the Emacs variants.
   (run-hooks 'wl-summary-mode-hook))
   ;; This hook may contain the function `wl-setup-summary' for reasons
   ;; of system internal to accord facilities for the Emacs variants.
   (run-hooks 'wl-summary-mode-hook))
@@ -819,7 +826,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
   "Rescan current folder without updating."
   (interactive)
   (let* ((cur-buf (current-buffer))
   "Rescan current folder without updating."
   (interactive)
   (let* ((cur-buf (current-buffer))
-        (msgdb (wl-summary-buffer-msgdb))
+        (msgdb wl-summary-buffer-msgdb)
         (overview (elmo-msgdb-get-overview msgdb))
         (number-alist (elmo-msgdb-get-number-alist msgdb))
         (mark-alist (elmo-msgdb-get-mark-alist msgdb))
         (overview (elmo-msgdb-get-overview msgdb))
         (number-alist (elmo-msgdb-get-number-alist msgdb))
         (mark-alist (elmo-msgdb-get-mark-alist msgdb))
@@ -844,7 +851,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
                  (intern (format "wl-summary-overview-entity-compare-by-%s"
                                  sort-by))))
       (message "Sorting by %s...done" sort-by)
                  (intern (format "wl-summary-overview-entity-compare-by-%s"
                                  sort-by))))
       (message "Sorting by %s...done" sort-by)
-      (elmo-msgdb-set-overview (wl-summary-buffer-msgdb)
+      (elmo-msgdb-set-overview wl-summary-buffer-msgdb
                               overview))
     (setq curp overview)
     (set-buffer cur-buf)
                               overview))
     (setq curp overview)
     (set-buffer cur-buf)
@@ -896,9 +903,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
                 (setq expunged (wl-summary-score-update-all-lines)))
        (message "%d message(s) are expunged by scoring." (length expunged))))
     (wl-summary-set-message-modified)
                 (setq expunged (wl-summary-score-update-all-lines)))
        (message "%d message(s) are expunged by scoring." (length expunged))))
     (wl-summary-set-message-modified)
-    (wl-summary-count-unread
-     (elmo-msgdb-get-mark-alist
-      (elmo-folder-msgdb-internal wl-summary-buffer-elmo-folder)))
+    (wl-summary-count-unread mark-alist)
     (wl-summary-update-modeline)
     (goto-char (point-max))
     (forward-line -1)
     (wl-summary-update-modeline)
     (goto-char (point-max))
     (forward-line -1)
@@ -948,14 +953,10 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
       "folder mode"))
 
 (defun wl-summary-set-message-modified ()
       "folder mode"))
 
 (defun wl-summary-set-message-modified ()
-  (elmo-folder-set-message-modified-internal
-   wl-summary-buffer-elmo-folder t)
   (setq wl-summary-buffer-message-modified t))
 (defun wl-summary-message-modified-p ()
   wl-summary-buffer-message-modified)
 (defun wl-summary-set-mark-modified ()
   (setq wl-summary-buffer-message-modified t))
 (defun wl-summary-message-modified-p ()
   wl-summary-buffer-message-modified)
 (defun wl-summary-set-mark-modified ()
-  (elmo-folder-set-mark-modified-internal
-   wl-summary-buffer-elmo-folder t)
   (setq wl-summary-buffer-mark-modified t))
 (defun wl-summary-mark-modified-p ()
   wl-summary-buffer-mark-modified)
   (setq wl-summary-buffer-mark-modified t))
 (defun wl-summary-mark-modified-p ()
   wl-summary-buffer-mark-modified)
@@ -964,6 +965,41 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
 (defun wl-summary-thread-modified-p ()
   wl-summary-buffer-thread-modified)
 
 (defun wl-summary-thread-modified-p ()
   wl-summary-buffer-thread-modified)
 
+(defun wl-summary-msgdb-save ()
+  "Save msgdb if modified."
+  (when wl-summary-buffer-msgdb
+    (save-excursion
+      (let (path)
+       (when (wl-summary-message-modified-p)
+         (setq path (elmo-msgdb-expand-path wl-summary-buffer-folder-name))
+         (elmo-msgdb-overview-save
+          path
+          (elmo-msgdb-get-overview wl-summary-buffer-msgdb))
+         (elmo-msgdb-number-save
+          path
+          (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb))
+         (elmo-folder-set-info-max-by-numdb
+          (elmo-string wl-summary-buffer-folder-name)
+          (elmo-msgdb-get-number-alist
+           wl-summary-buffer-msgdb))
+         (setq wl-summary-buffer-message-modified nil)
+         (run-hooks 'wl-summary-buffer-message-saved-hook))
+       (when (wl-summary-mark-modified-p)
+         (or path
+             (setq path (elmo-msgdb-expand-path
+                         wl-summary-buffer-folder-name)))
+         (elmo-msgdb-mark-save
+          path
+          (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
+;;;      (elmo-folder-set-info-hashtb
+;;;       (elmo-string wl-summary-buffer-folder-name)
+;;;       nil nil
+;;;       0
+;;;       (+ wl-summary-buffer-new-count wl-summary-buffer-unread-count))
+;;;      (setq wl-folder-info-alist-modified t)
+         (setq wl-summary-buffer-mark-modified nil)
+         (run-hooks 'wl-summary-buffer-mark-saved-hook))))))
+
 (defsubst wl-summary-cleanup-temp-marks (&optional sticky)
   (if (or wl-summary-buffer-refile-list
          wl-summary-buffer-copy-list
 (defsubst wl-summary-cleanup-temp-marks (&optional sticky)
   (if (or wl-summary-buffer-refile-list
          wl-summary-buffer-copy-list
@@ -988,8 +1024,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
   (setq wl-summary-scored nil))
 
 ;; a subroutine for wl-summary-exit/wl-save-status
   (setq wl-summary-scored nil))
 
 ;; a subroutine for wl-summary-exit/wl-save-status
-;; Note that folder is not commited here.
-(defun wl-summary-save-view (&optional sticky)
+(defun wl-summary-save-status (&optional sticky)
   ;; already in summary buffer.
   (when wl-summary-buffer-persistent
     ;; save the current summary buffer view.
   ;; already in summary buffer.
   (when wl-summary-buffer-persistent
     ;; save the current summary buffer view.
@@ -997,7 +1032,9 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
             (or (wl-summary-message-modified-p)
                 (wl-summary-mark-modified-p)
                 (wl-summary-thread-modified-p)))
             (or (wl-summary-message-modified-p)
                 (wl-summary-mark-modified-p)
                 (wl-summary-thread-modified-p)))
-       (wl-summary-save-view-cache))))
+       (wl-summary-save-view-cache))
+    ;; save msgdb ...
+    (wl-summary-msgdb-save)))
 
 (defun wl-summary-force-exit ()
   "Exit current summary.  Buffer is deleted even the buffer is sticky."
 
 (defun wl-summary-force-exit ()
   "Exit current summary.  Buffer is deleted even the buffer is sticky."
@@ -1009,6 +1046,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
   (interactive "P")
   (let ((summary-buf (current-buffer))
        (sticky (wl-summary-sticky-p))
   (interactive "P")
   (let ((summary-buf (current-buffer))
        (sticky (wl-summary-sticky-p))
+       (message-buf (get-buffer wl-message-buf-name))
        summary-win
        message-buf message-win
        folder-buf folder-win)
        summary-win
        message-buf message-win
        folder-buf folder-win)
@@ -1018,26 +1056,37 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
       (unwind-protect
          ;; save summary status
          (progn
       (unwind-protect
          ;; save summary status
          (progn
-           (if (or force-exit
-                   (not sticky))
-               (elmo-folder-close wl-summary-buffer-elmo-folder)
-             (elmo-folder-commit wl-summary-buffer-elmo-folder)
-             (elmo-folder-check wl-summary-buffer-elmo-folder))
-           (wl-summary-save-view sticky)
-           (if wl-use-scoring (wl-score-save)))
+           (wl-summary-save-status sticky)
+           (elmo-commit wl-summary-buffer-folder-name)
+           (if wl-use-scoring
+               (wl-score-save)))
        ;; for sticky summary
        (wl-delete-all-overlays)
        (setq wl-summary-buffer-disp-msg nil)
        (elmo-kill-buffer wl-summary-search-buf-name)
        ;; delete message window if displayed.
        ;; for sticky summary
        (wl-delete-all-overlays)
        (setq wl-summary-buffer-disp-msg nil)
        (elmo-kill-buffer wl-summary-search-buf-name)
        ;; delete message window if displayed.
-       (if (and wl-message-buffer (get-buffer-window wl-message-buffer))
-           (delete-window (get-buffer-window wl-message-buffer)))
+       (if (setq message-buf (get-buffer wl-message-buf-name))
+           (if (setq message-win (get-buffer-window message-buf))
+               (delete-window message-win)))
+       (if (and wl-summary-use-frame
+                (> (length (visible-frame-list)) 1))
+           (delete-frame))
        (if (setq folder-buf (get-buffer wl-folder-buffer-name))
        (if (setq folder-buf (get-buffer wl-folder-buffer-name))
-           (if (setq folder-win (get-buffer-window folder-buf))
-               ;; folder win is already displayed.
-               (select-window folder-win)
-             ;; folder win is not displayed.
-             (switch-to-buffer folder-buf))
+           (if wl-summary-use-frame
+               (let (select-frame)
+                 (save-selected-window
+                   (dolist (frame (visible-frame-list))
+                     (select-frame frame)
+                     (if (get-buffer-window folder-buf)
+                         (setq select-frame frame))))
+                 (if select-frame
+                     (select-frame select-frame)
+                   (switch-to-buffer folder-buf)))
+             (if (setq folder-win (get-buffer-window folder-buf))
+                 ;; folder win is already displayed.
+                 (select-window folder-win)
+               ;; folder win is not displayed.
+               (switch-to-buffer folder-buf)))
          ;; currently no folder buffer
          (wl-folder))
        (and wl-folder-move-cur-folder
          ;; currently no folder buffer
          (wl-folder))
        (and wl-folder-move-cur-folder
@@ -1055,12 +1104,41 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
                (not sticky))
            (progn
              (set-buffer summary-buf)
                (not sticky))
            (progn
              (set-buffer summary-buf)
+             (and (get-buffer wl-message-buf-name)
+                  (kill-buffer wl-message-buf-name))
+             ;; kill buffers of mime-view-caesar
+             (wl-kill-buffers
+              (format "^%s-([0-9 ]+)$" (regexp-quote wl-message-buf-name)))
              (kill-buffer summary-buf)))
        (run-hooks 'wl-summary-exit-hook)))))
 
 (defun wl-summary-sync-force-update (&optional unset-cursor)
   (interactive)
              (kill-buffer summary-buf)))
        (run-hooks 'wl-summary-exit-hook)))))
 
 (defun wl-summary-sync-force-update (&optional unset-cursor)
   (interactive)
-  (wl-summary-sync-update unset-cursor))
+  (let ((msgdb-dir (elmo-msgdb-expand-path wl-summary-buffer-folder-name))
+       (type (elmo-folder-get-type wl-summary-buffer-folder-name))
+       ret-val seen-list)
+    (unwind-protect
+       (progn
+         (if wl-summary-buffer-persistent
+             (setq seen-list (elmo-msgdb-seen-load msgdb-dir)))
+         (setq ret-val (wl-summary-sync-update3 seen-list unset-cursor))
+         (if wl-summary-buffer-persistent
+             (progn
+               (if (and (eq type 'imap4)
+                        (not (elmo-folder-plugged-p
+                              wl-summary-buffer-folder-name)))
+                   (let* ((msgdb wl-summary-buffer-msgdb)
+                          (number-alist (elmo-msgdb-get-number-alist msgdb)))
+                     (elmo-mark-as-read wl-summary-buffer-folder-name
+                                        (mapcar
+                                         (lambda (msgid)
+                                           (car (rassoc msgid number-alist)))
+                                         seen-list) msgdb)))
+               (elmo-msgdb-seen-save msgdb-dir nil))))
+      (set-buffer (current-buffer)))
+    (if (interactive-p)
+       (message "%s" ret-val))
+    ret-val))
 
 (defsubst wl-summary-sync-all-init ()
   (wl-summary-cleanup-temp-marks)
 
 (defsubst wl-summary-sync-all-init ()
   (wl-summary-cleanup-temp-marks)
@@ -1069,7 +1147,8 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
   (wl-summary-set-mark-modified)
   (setq wl-thread-entity-hashtb (elmo-make-hash
                                 (* (length (elmo-msgdb-get-number-alist
   (wl-summary-set-mark-modified)
   (setq wl-thread-entity-hashtb (elmo-make-hash
                                 (* (length (elmo-msgdb-get-number-alist
-                                            (wl-summary-buffer-msgdb))) 2)))
+                                            wl-summary-buffer-msgdb)) 2)))
+  (setq wl-summary-buffer-msgdb (elmo-msgdb-clear)) ;;'(nil nil nil nil))
   (setq wl-thread-entity-list nil)
   (setq wl-thread-entities nil)
   (setq wl-summary-buffer-number-list nil)
   (setq wl-thread-entity-list nil)
   (setq wl-thread-entities nil)
   (setq wl-summary-buffer-number-list nil)
@@ -1081,13 +1160,41 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
 
 (defun wl-summary-sync (&optional unset-cursor force-range)
   (interactive)
 
 (defun wl-summary-sync (&optional unset-cursor force-range)
   (interactive)
-  (let* ((folder wl-summary-buffer-elmo-folder)
+  (let* ((folder wl-summary-buffer-folder-name)
         (inhibit-read-only t)
         (buffer-read-only nil)
         (inhibit-read-only t)
         (buffer-read-only nil)
-        (msgdb-dir (elmo-folder-msgdb-path folder))
-        (range (or force-range (wl-summary-input-range
-                                (elmo-folder-name-internal folder)))))
-    (cond ((string= range "rescan")
+        (msgdb-dir (elmo-msgdb-expand-path
+                    folder))
+        (range (or force-range (wl-summary-input-range folder)))
+        mes seen-list killed-list)
+    (cond ((or (string= range "all")
+              (string= range "all-visible"))
+          ;; initialize buffer local databases.
+          (unless (elmo-folder-plugged-p folder) ; forbidden
+            (error "Unplugged"))
+          (setq seen-list
+                (nconc
+                 (elmo-msgdb-mark-alist-to-seen-list
+                  (elmo-msgdb-get-number-alist
+                   wl-summary-buffer-msgdb)
+                  (elmo-msgdb-get-mark-alist
+                   wl-summary-buffer-msgdb)
+                  (concat wl-summary-important-mark
+                          wl-summary-read-uncached-mark))
+                 (elmo-msgdb-seen-load msgdb-dir)))
+          (setq killed-list (elmo-msgdb-killed-list-load msgdb-dir))
+          (elmo-clear-killed wl-summary-buffer-folder-name)
+          (condition-case nil
+              (setq mes (wl-summary-sync-update3 seen-list unset-cursor
+                                                 (string= range "all")))
+            (quit
+             ;; Resume killed-list if quit.
+             (message "") ; clear minibuffer.
+             (elmo-msgdb-killed-list-save msgdb-dir killed-list)))
+          (elmo-msgdb-seen-save msgdb-dir nil) ; delete all seen.
+          (if mes (message "%s" mes)))
+;;;       (wl-summary-sync-all folder t))
+         ((string= range "rescan")
           (let ((msg (wl-summary-message-number)))
             (wl-summary-rescan)
             (and msg (wl-summary-jump-to-msg msg))))
           (let ((msg (wl-summary-message-number)))
             (wl-summary-rescan)
             (and msg (wl-summary-jump-to-msg msg))))
@@ -1098,16 +1205,16 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
             (and msg (wl-summary-jump-to-msg msg))))
          ((or (string-match "last:" range)
               (string-match "first:" range))
             (and msg (wl-summary-jump-to-msg msg))))
          ((or (string-match "last:" range)
               (string-match "first:" range))
-          (wl-summary-goto-folder-subr
-           (wl-folder-get-elmo-folder (concat "/" range "/"
-                                              (elmo-folder-name-internal
-                                               folder)))
-           'force-update nil nil t))
+          (wl-summary-goto-folder-subr (concat "/" range "/" folder)
+                                       'force-update nil nil t))
+         ((string= range "no-sync")
+          ;; do nothing.
+          )
          (t
          (t
-          (wl-summary-sync-update unset-cursor
-                                  (cond ((string= range "all") 'all)
-                                        ((string= range "all-visible")
-                                         'visible-only)))))))
+          (setq seen-list (elmo-msgdb-seen-load msgdb-dir))
+          (setq mes (wl-summary-sync-update3 seen-list unset-cursor))
+          (elmo-msgdb-seen-save msgdb-dir nil) ; delete all seen.
+          (if mes (message "%s" mes))))))
 
 (defvar wl-summary-edit-addresses-candidate-fields
   ;; First element becomes default.
 
 (defvar wl-summary-edit-addresses-candidate-fields
   ;; First element becomes default.
@@ -1192,40 +1299,41 @@ Optional argument ADDR-STR is used as a target address if specified."
   (if (null (wl-summary-message-number))
       (message "No message.")
     (save-excursion
   (if (null (wl-summary-message-number))
       (message "No message.")
     (save-excursion
-      (let* ((charset wl-summary-buffer-mime-charset)
-            (candidates
-             (with-current-buffer (wl-summary-get-original-buffer)
-               (wl-summary-edit-addresses-collect-candidate-fields
-                charset)))
-            address pair result)
-       (if addr-str
-           (setq address addr-str)
-         (when candidates
-           (setq address (car (car candidates)))
-           (setq address
-                 (completing-read
-                  (format "Target address (%s): " address)
-                  (mapcar
-                   (function (lambda (x) (cons (car x) (car x))))
-                   candidates)
-                  nil nil nil nil address))))
-       (when address
-         (setq pair (assoc address candidates))
-         (unless pair
-           (setq pair (cons address nil)))
-         (when (setq result (wl-summary-edit-addresses-subr (car pair) (cdr pair)))
-           ;; update alias
-           (wl-status-update)
-           (setq address (assoc (car pair) wl-address-list))
-           (if address
-               (message "%s, %s, <%s> is %s."
-                        (nth 2 address)
-                        (nth 1 address)
-                        (nth 0 address)
-                        result)))
+      (wl-summary-set-message-buffer-or-redisplay))
+    (let* ((charset wl-summary-buffer-mime-charset)
+          (candidates
+           (with-current-buffer (wl-message-get-original-buffer)
+             (wl-summary-edit-addresses-collect-candidate-fields
+              charset)))
+          address pair result)
+      (if addr-str
+         (setq address addr-str)
+       (when candidates
+         (setq address (car (car candidates)))
+         (setq address
+               (completing-read
+                (format "Target address (%s): " address)
+                (mapcar
+                 (function (lambda (x) (cons (car x) (car x))))
+                 candidates)
+                nil nil nil nil address))))
+      (when address
+       (setq pair (assoc address candidates))
+       (unless pair
+         (setq pair (cons address nil)))
+       (when (setq result (wl-summary-edit-addresses-subr (car pair) (cdr pair)))
+         ;; update alias
+         (wl-status-update)
+         (setq address (assoc (car pair) wl-address-list))
+         (if address
+             (message "%s, %s, <%s> is %s."
+                      (nth 2 address)
+                      (nth 1 address)
+                      (nth 0 address)
+                      result)))
 ;;; i'd like to update summary-buffer, but...
 ;;;    (wl-summary-rescan)
 ;;; i'd like to update summary-buffer, but...
 ;;;    (wl-summary-rescan)
-         (run-hooks 'wl-summary-edit-addresses-hook))))))
+       (run-hooks 'wl-summary-edit-addresses-hook)))))
 
 (defun wl-summary-incorporate (&optional arg)
   "Check and prefetch all uncached messages.
 
 (defun wl-summary-incorporate (&optional arg)
   "Check and prefetch all uncached messages.
@@ -1241,7 +1349,7 @@ If ARG is non-nil, checking is omitted."
   "Returns status-mark. if skipped, returns nil."
   ;; prefetching procedure.
   (save-excursion
   "Returns status-mark. if skipped, returns nil."
   ;; prefetching procedure.
   (save-excursion
-    (let* ((msgdb (wl-summary-buffer-msgdb))
+    (let* ((msgdb wl-summary-buffer-msgdb)
           (mark-alist (elmo-msgdb-get-mark-alist msgdb))
           (number-alist (elmo-msgdb-get-number-alist msgdb))
           (message-id (cdr (assq number number-alist)))
           (mark-alist (elmo-msgdb-get-mark-alist msgdb))
           (number-alist (elmo-msgdb-get-number-alist msgdb))
           (message-id (cdr (assq number number-alist)))
@@ -1256,7 +1364,7 @@ If ARG is non-nil, checking is omitted."
                                (< size wl-prefetch-threshold))))
           mark new-mark)
       (if (or arg
                                (< size wl-prefetch-threshold))))
           mark new-mark)
       (if (or arg
-             (null (elmo-file-cache-exists-p message-id)))
+             (null (elmo-cache-exists-p message-id)))
          (unwind-protect
              (progn
                (when (and size (not force-read) wl-prefetch-confirm)
          (unwind-protect
              (progn
                (when (and size (not force-read) wl-prefetch-confirm)
@@ -1285,33 +1393,33 @@ If ARG is non-nil, checking is omitted."
                    (save-excursion
                      (save-match-data
                        (if (and (null (elmo-folder-plugged-p
                    (save-excursion
                      (save-match-data
                        (if (and (null (elmo-folder-plugged-p
-                                       wl-summary-buffer-elmo-folder))
+                                       wl-summary-buffer-folder-name))
                                 elmo-enable-disconnected-operation)
                            (progn;; append-queue for offline
                              (elmo-dop-prefetch-msgs
                                 elmo-enable-disconnected-operation)
                            (progn;; append-queue for offline
                              (elmo-dop-prefetch-msgs
-                              wl-summary-buffer-elmo-folder (list number))
-                             (setq
-                              new-mark
-                              (cond
-                               ((string= mark
-                                         wl-summary-unread-uncached-mark)
-                                wl-summary-unread-cached-mark)
-                               ((string= mark wl-summary-new-mark)
-                                (setq wl-summary-buffer-new-count
-                                      (- wl-summary-buffer-new-count 1))
-                                (setq wl-summary-buffer-unread-count
-                                      (+ wl-summary-buffer-unread-count 1))
-                                wl-summary-unread-cached-mark)
-                               ((or (null mark)
-                                    (string= mark wl-summary-read-uncached-mark))
-                                (setq wl-summary-buffer-unread-count
-                                      (+ wl-summary-buffer-unread-count 1))
-                                wl-summary-unread-cached-mark)
-                               (t mark))))
+                              wl-summary-buffer-folder-name (list number))
+                             (setq new-mark
+                                   (cond
+                                    ((string= mark
+                                              wl-summary-unread-uncached-mark)
+                                     wl-summary-unread-cached-mark)
+                                    ((string= mark wl-summary-new-mark)
+                                     (setq wl-summary-buffer-new-count
+                                           (- wl-summary-buffer-new-count 1))
+                                     (setq wl-summary-buffer-unread-count
+                                           (+ wl-summary-buffer-unread-count 1))
+                                     wl-summary-unread-cached-mark)
+                                    ((or (null mark)
+                                         (string= mark wl-summary-read-uncached-mark))
+                                     (setq wl-summary-buffer-unread-count
+                                           (+ wl-summary-buffer-unread-count 1))
+                                     wl-summary-unread-cached-mark)
+                                    (t mark))))
                          ;; online
                          ;; online
-                         (elmo-message-encache
-                          wl-summary-buffer-elmo-folder
-                          number)
+                         (elmo-prefetch-msg wl-summary-buffer-folder-name
+                                            number
+                                            (wl-message-get-original-buffer)
+                                            msgdb)
                          (setq new-mark
                                (cond
                                 ((string= mark
                          (setq new-mark
                                (cond
                                 ((string= mark
@@ -1333,7 +1441,7 @@ If ARG is non-nil, checking is omitted."
                        (wl-summary-set-mark-modified)
                        (wl-summary-update-modeline)
                        (wl-folder-update-unread
                        (wl-summary-set-mark-modified)
                        (wl-summary-update-modeline)
                        (wl-folder-update-unread
-                        (wl-summary-buffer-folder-name)
+                        wl-summary-buffer-folder-name
                         (+ wl-summary-buffer-unread-count
                            wl-summary-buffer-new-count)))
                      new-mark))))))))
                         (+ wl-summary-buffer-unread-count
                            wl-summary-buffer-new-count)))
                      new-mark))))))))
@@ -1359,15 +1467,15 @@ If ARG is non-nil, checking is omitted."
        (goto-char (point-min))
        (while (not (eobp))
          (beginning-of-line)
        (goto-char (point-min))
        (while (not (eobp))
          (beginning-of-line)
-         (when (looking-at "^ *\\([0-9-]+\\)[^0-9]\\([^0-9]\\)")
+         (when (looking-at "^ *\\([0-9]+\\)[^0-9]\\([^0-9]\\)")
            (setq mark (wl-match-buffer 2))
            (setq msg (string-to-int (wl-match-buffer 1)))
            (if (or (and (null prefetch-marks)
                         msg
            (setq mark (wl-match-buffer 2))
            (setq msg (string-to-int (wl-match-buffer 1)))
            (if (or (and (null prefetch-marks)
                         msg
-                        (null (elmo-file-cache-exists-p
+                        (null (elmo-cache-exists-p
                                (cdr (assq msg
                                           (elmo-msgdb-get-number-alist
                                (cdr (assq msg
                                           (elmo-msgdb-get-number-alist
-                                           (wl-summary-buffer-msgdb)))))))
+                                           wl-summary-buffer-msgdb))))))
                    (member mark prefetch-marks))
                (setq targets (nconc targets (list msg))))
            (setq entity (wl-thread-get-entity msg))
                    (member mark prefetch-marks))
                (setq targets (nconc targets (list msg))))
            (setq entity (wl-thread-get-entity msg))
@@ -1413,7 +1521,7 @@ If ARG is non-nil, checking is omitted."
   (save-excursion
     (save-match-data
       (beginning-of-line)
   (save-excursion
     (save-match-data
       (beginning-of-line)
-      (when (looking-at "^ *\\([0-9-]+\\)[^0-9]\\([^0-9]\\)")
+      (when (looking-at "^ *\\([0-9]+\\)[^0-9]\\([^0-9]\\)")
        (goto-char (match-beginning 2))
        (let ((inhibit-read-only t)
              (buffer-read-only nil)
        (goto-char (match-beginning 2))
        (let ((inhibit-read-only t)
              (buffer-read-only nil)
@@ -1522,7 +1630,7 @@ If ARG is non-nil, checking is omitted."
        (while (not (eobp))
          (wl-summary-mark-as-read t)
          (forward-line 1)))))
        (while (not (eobp))
          (wl-summary-mark-as-read t)
          (forward-line 1)))))
-  (wl-summary-count-unread (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+  (wl-summary-count-unread (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
   (wl-summary-update-modeline))
 
 (defun wl-summary-mark-as-unread-region (beg end)
   (wl-summary-update-modeline))
 
 (defun wl-summary-mark-as-unread-region (beg end)
@@ -1555,7 +1663,7 @@ If ARG is non-nil, checking is omitted."
        (while (not (eobp))
          (wl-summary-mark-as-unread)
          (forward-line 1)))))
        (while (not (eobp))
          (wl-summary-mark-as-unread)
          (forward-line 1)))))
-  (wl-summary-count-unread (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+  (wl-summary-count-unread (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
   (wl-summary-update-modeline))
 
 (defun wl-summary-mark-as-important-region (beg end)
   (wl-summary-update-modeline))
 
 (defun wl-summary-mark-as-important-region (beg end)
@@ -1586,17 +1694,17 @@ If ARG is non-nil, checking is omitted."
        (while (not (eobp))
          (wl-summary-mark-as-important)
          (forward-line 1)))))
        (while (not (eobp))
          (wl-summary-mark-as-important)
          (forward-line 1)))))
-  (wl-summary-count-unread (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+  (wl-summary-count-unread (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
   (wl-summary-update-modeline))
 
 (defun wl-summary-mark-as-read-all ()
   (interactive)
   (if (or (not (interactive-p))
          (y-or-n-p "Mark all messages as read? "))
   (wl-summary-update-modeline))
 
 (defun wl-summary-mark-as-read-all ()
   (interactive)
   (if (or (not (interactive-p))
          (y-or-n-p "Mark all messages as read? "))
-      (let* ((folder wl-summary-buffer-elmo-folder)
+      (let* ((folder wl-summary-buffer-folder-name)
             (cur-buf (current-buffer))
             (cur-buf (current-buffer))
-            (msgdb (wl-summary-buffer-msgdb))
-;;;         (number-alist (elmo-msgdb-get-number-alist msgdb))
+            (msgdb wl-summary-buffer-msgdb)
+            (number-alist (elmo-msgdb-get-number-alist msgdb))
             (mark-alist (elmo-msgdb-get-mark-alist msgdb))
             (malist mark-alist)
             (inhibit-read-only t)
             (mark-alist (elmo-msgdb-get-mark-alist msgdb))
             (malist mark-alist)
             (inhibit-read-only t)
@@ -1604,16 +1712,24 @@ If ARG is non-nil, checking is omitted."
             (case-fold-search nil)
             msg mark)
        (message "Setting all msgs as read...")
             (case-fold-search nil)
             msg mark)
        (message "Setting all msgs as read...")
-       (elmo-folder-mark-as-read folder (wl-summary-collect-unread mark-alist))
+       (elmo-mark-as-read folder
+                          (elmo-list-folder-unread
+                           folder
+                           number-alist
+                           mark-alist
+                           (list wl-summary-unread-cached-mark
+                                 wl-summary-unread-uncached-mark
+                                 wl-summary-new-mark))
+                          msgdb)
        (save-excursion
          (goto-char (point-min))
        (save-excursion
          (goto-char (point-min))
-         (while (re-search-forward "^ *\\([0-9-]+\\)[^0-9]\\([^0-9 ]\\)" nil t)
+         (while (re-search-forward "^ *\\([0-9]+\\)[^0-9]\\([^0-9 ]\\)" nil t)
            (setq msg (string-to-int (wl-match-buffer 1)))
            (setq mark (wl-match-buffer 2))
            (when (and (not (string= mark wl-summary-important-mark))
                       (not (string= mark wl-summary-read-uncached-mark)))
              (delete-region (match-beginning 2) (match-end 2))
            (setq msg (string-to-int (wl-match-buffer 1)))
            (setq mark (wl-match-buffer 2))
            (when (and (not (string= mark wl-summary-important-mark))
                       (not (string= mark wl-summary-read-uncached-mark)))
              (delete-region (match-beginning 2) (match-end 2))
-             (if (or (not (elmo-message-use-cache-p folder msg))
+             (if (or (not (elmo-use-cache-p folder msg))
                      (string= mark wl-summary-unread-cached-mark))
                  (progn
                    (insert " ")
                      (string= mark wl-summary-unread-cached-mark))
                  (progn
                    (insert " ")
@@ -1637,7 +1753,7 @@ If ARG is non-nil, checking is omitted."
        (wl-summary-set-mark-modified)
        (set-buffer cur-buf); why is this needed???
        (elmo-msgdb-set-mark-alist msgdb mark-alist)
        (wl-summary-set-mark-modified)
        (set-buffer cur-buf); why is this needed???
        (elmo-msgdb-set-mark-alist msgdb mark-alist)
-       (wl-folder-update-unread (wl-summary-buffer-folder-name) 0)
+       (wl-folder-update-unread wl-summary-buffer-folder-name 0)
        (setq wl-summary-buffer-unread-count 0)
        (setq wl-summary-buffer-new-count    0)
        (wl-summary-update-modeline)
        (setq wl-summary-buffer-unread-count 0)
        (setq wl-summary-buffer-new-count    0)
        (wl-summary-update-modeline)
@@ -1650,15 +1766,15 @@ If ARG is non-nil, checking is omitted."
   (save-excursion
     (let* ((inhibit-read-only t)
           (buffer-read-only nil)
   (save-excursion
     (let* ((inhibit-read-only t)
           (buffer-read-only nil)
-          (folder wl-summary-buffer-elmo-folder)
-          (msgdb (wl-summary-buffer-msgdb))
+          (folder wl-summary-buffer-folder-name)
+          (msgdb wl-summary-buffer-msgdb)
           (mark-alist (elmo-msgdb-get-mark-alist msgdb))
           (number-alist (elmo-msgdb-get-number-alist msgdb))
           (case-fold-search nil)
           mark number unread new-mark)
 ;;;   (re-search-backward "^ *[0-9]+..[0-9]+/[0-9]+" nil t) ; set cursor line
       (beginning-of-line)
           (mark-alist (elmo-msgdb-get-mark-alist msgdb))
           (number-alist (elmo-msgdb-get-number-alist msgdb))
           (case-fold-search nil)
           mark number unread new-mark)
 ;;;   (re-search-backward "^ *[0-9]+..[0-9]+/[0-9]+" nil t) ; set cursor line
       (beginning-of-line)
-      (when (looking-at "^ *\\([0-9-]+\\)[^0-9]\\([^0-9]\\)")
+      (when (looking-at "^ *\\([0-9]+\\)[^0-9]\\([^0-9]\\)")
        (progn
          (setq mark (wl-match-buffer 2))
          (cond
        (progn
          (setq mark (wl-match-buffer 2))
          (cond
@@ -1676,10 +1792,9 @@ If ARG is non-nil, checking is omitted."
            (delete-region (match-beginning 2) (match-end 2))
            (goto-char (match-beginning 2))
            (insert new-mark)
            (delete-region (match-beginning 2) (match-end 2))
            (goto-char (match-beginning 2))
            (insert new-mark)
-           (elmo-file-cache-delete 
-            (elmo-message-field wl-summary-buffer-elmo-folder
-                                    number
-                                    'message-id))
+           (elmo-cache-delete (cdr (assq number number-alist))
+                              wl-summary-buffer-folder-name
+                              number)
            (setq mark-alist
                  (elmo-msgdb-mark-set mark-alist number new-mark))
            (elmo-msgdb-set-mark-alist msgdb mark-alist)
            (setq mark-alist
                  (elmo-msgdb-mark-set mark-alist number new-mark))
            (elmo-msgdb-set-mark-alist msgdb mark-alist)
@@ -1691,9 +1806,9 @@ If ARG is non-nil, checking is omitted."
 (defun wl-summary-resume-cache-status ()
   "Resume the cache status of all messages in the current folder."
   (interactive)
 (defun wl-summary-resume-cache-status ()
   "Resume the cache status of all messages in the current folder."
   (interactive)
-  (let* ((folder wl-summary-buffer-elmo-folder)
+  (let* ((folder wl-summary-buffer-folder-name)
         (cur-buf (current-buffer))
         (cur-buf (current-buffer))
-        (msgdb (wl-summary-buffer-msgdb))
+        (msgdb wl-summary-buffer-msgdb)
         (number-alist (elmo-msgdb-get-number-alist msgdb))
         (mark-alist (elmo-msgdb-get-mark-alist msgdb))
         (inhibit-read-only t)
         (number-alist (elmo-msgdb-get-number-alist msgdb))
         (mark-alist (elmo-msgdb-get-mark-alist msgdb))
         (inhibit-read-only t)
@@ -1703,13 +1818,13 @@ If ARG is non-nil, checking is omitted."
     (message "Resuming cache status...")
     (save-excursion
       (goto-char (point-min))
     (message "Resuming cache status...")
     (save-excursion
       (goto-char (point-min))
-      (while (re-search-forward "^ *\\([0-9-]+\\)[^0-9]\\([^0-9]\\)" nil t)
+      (while (re-search-forward "^ *\\([0-9]+\\)[^0-9]\\([^0-9]\\)" nil t)
        (setq msg (string-to-int
                   (wl-match-buffer 1)))
        (setq mark (wl-match-buffer 2))
        (setq msgid (cdr (assq msg number-alist)))
        (setq set-mark nil)
        (setq msg (string-to-int
                   (wl-match-buffer 1)))
        (setq mark (wl-match-buffer 2))
        (setq msgid (cdr (assq msg number-alist)))
        (setq set-mark nil)
-       (if (elmo-file-cache-exists-p msgid)
+       (if (elmo-cache-exists-p msgid folder msg)
            (if (or
                 (string= mark wl-summary-unread-uncached-mark) ; U -> !
                 (string= mark wl-summary-new-mark)             ; N -> !
            (if (or
                 (string= mark wl-summary-unread-uncached-mark) ; U -> !
                 (string= mark wl-summary-new-mark)             ; N -> !
@@ -1740,7 +1855,7 @@ If ARG is non-nil, checking is omitted."
       (set-buffer-modified-p nil))))
 
 (defun wl-summary-resume-marks-and-highlight ()
       (set-buffer-modified-p nil))))
 
 (defun wl-summary-resume-marks-and-highlight ()
-  (let* ((msgdb (wl-summary-buffer-msgdb))
+  (let* ((msgdb wl-summary-buffer-msgdb)
         (mark-alist (elmo-msgdb-get-mark-alist msgdb))
 ;;;     (number-alist (elmo-msgdb-get-number-alist msgdb))
         (count (count-lines (point-min)(point-max)))
         (mark-alist (elmo-msgdb-get-mark-alist msgdb))
 ;;;     (number-alist (elmo-msgdb-get-number-alist msgdb))
         (count (count-lines (point-min)(point-max)))
@@ -1768,7 +1883,7 @@ If ARG is non-nil, checking is omitted."
     (message "Resuming all marks...done")))
 
 (defun wl-summary-resume-marks ()
     (message "Resuming all marks...done")))
 
 (defun wl-summary-resume-marks ()
-  (let* ((msgdb (wl-summary-buffer-msgdb))
+  (let* ((msgdb wl-summary-buffer-msgdb)
         (mark-alist (elmo-msgdb-get-mark-alist msgdb))
         (number-alist (elmo-msgdb-get-number-alist msgdb))
         (count (length mark-alist))
         (mark-alist (elmo-msgdb-get-mark-alist msgdb))
         (number-alist (elmo-msgdb-get-number-alist msgdb))
         (count (length mark-alist))
@@ -1840,10 +1955,10 @@ If ARG is non-nil, checking is omitted."
                                    (unless deleting-info 'no-msg))
        (wl-thread-cleanup-symbols msgs2))
       (wl-summary-count-unread
                                    (unless deleting-info 'no-msg))
        (wl-thread-cleanup-symbols msgs2))
       (wl-summary-count-unread
-       (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+       (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
       (wl-summary-update-modeline)
       (wl-folder-update-unread
       (wl-summary-update-modeline)
       (wl-folder-update-unread
-       (wl-summary-buffer-folder-name)
+       wl-summary-buffer-folder-name
        (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count)))))
 
 (defun wl-summary-set-as-read-mark-alist (mark-alist)
        (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count)))))
 
 (defun wl-summary-set-as-read-mark-alist (mark-alist)
@@ -1858,11 +1973,11 @@ If ARG is non-nil, checking is omitted."
     (while mark-alist
       (setq entity (car mark-alist))
       (when (setq pair (assoc (cadr entity) marks))
     (while mark-alist
       (setq entity (car mark-alist))
       (when (setq pair (assoc (cadr entity) marks))
-       (if (elmo-message-use-cache-p wl-summary-buffer-elmo-folder
-                                     (caar mark-alist))
+       (if (elmo-use-cache-p wl-summary-buffer-folder-name
+                             (caar mark-alist))
            (if (cdr pair)
                (setcar (cdr entity) (cdr pair))
            (if (cdr pair)
                (setcar (cdr entity) (cdr pair))
-             (setq ret-val (delete entity ret-val)))
+               (setq ret-val (delete entity ret-val)))
          (setq ret-val (delete entity ret-val))))
       (setq mark-alist (cdr mark-alist)))
     ret-val))
          (setq ret-val (delete entity ret-val))))
       (setq mark-alist (cdr mark-alist)))
     ret-val))
@@ -1952,26 +2067,29 @@ If ARG is non-nil, checking is omitted."
 (defun wl-summary-sync-marks ()
   "Update marks in summary."
   (interactive)
 (defun wl-summary-sync-marks ()
   "Update marks in summary."
   (interactive)
-  (let ((last-progress 0)
+  (let ((plugged (elmo-folder-plugged-p wl-summary-buffer-folder-name))
+       (last-progress 0)
        (i 0)
        (i 0)
-       mark-alist unread-marks importants unreads
-       importants-in-db unreads-in-db diff diffs
+       mark-alist unread-marks msgs mark importants unreads
+       importants-in-db unreads-in-db has-imap4 diff diffs
        mes num-ma progress)
     ;; synchronize marks.
        mes num-ma progress)
     ;; synchronize marks.
-    (when (not (eq (elmo-folder-type-internal
-                   wl-summary-buffer-elmo-folder)
+    (when (not (eq (elmo-folder-get-type
+                   wl-summary-buffer-folder-name)
                   'internal))
       (message "Updating marks...")
       (setq unread-marks (list wl-summary-unread-cached-mark
                               wl-summary-unread-uncached-mark
                               wl-summary-new-mark)
                   'internal))
       (message "Updating marks...")
       (setq unread-marks (list wl-summary-unread-cached-mark
                               wl-summary-unread-uncached-mark
                               wl-summary-new-mark)
-           mark-alist (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))
+           mark-alist (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)
             num-ma (length mark-alist)
             num-ma (length mark-alist)
-           importants (elmo-folder-list-importants
-                       wl-summary-buffer-elmo-folder
-                       wl-summary-important-mark)
-           unreads (elmo-folder-list-unreads
-                    wl-summary-buffer-elmo-folder
+           importants (elmo-list-folder-important
+                       wl-summary-buffer-folder-name
+                       (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb))
+           unreads (elmo-list-folder-unread
+                    wl-summary-buffer-folder-name
+                    (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb)
+                    (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)
                     unread-marks))
       (while mark-alist
        (if (string= (cadr (car mark-alist))
                     unread-marks))
       (while mark-alist
        (if (string= (cadr (car mark-alist))
@@ -2036,74 +2154,125 @@ If ARG is non-nil, checking is omitted."
          (nthcdr (max (- len in) 0) appends))
       appends)))
 
          (nthcdr (max (- len in) 0) appends))
       appends)))
 
-(defun wl-summary-sync-update (&optional unset-cursor sync-all)
-  "Update the summary view to the newest folder status."
+(defun wl-summary-sync-update3 (&optional seen-list unset-cursor sync-all)
+  "Update the summary view."
   (interactive)
   (interactive)
-  (let* ((folder wl-summary-buffer-elmo-folder)
+  (let* ((folder wl-summary-buffer-folder-name)
+        (cur-buf (current-buffer))
+        (number-alist (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb))
+        (mark-alist (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
+        (overview (elmo-msgdb-get-overview wl-summary-buffer-msgdb))
+;;;     (location (elmo-msgdb-get-location msgdb))
         (case-fold-search nil)
         (elmo-mime-charset wl-summary-buffer-mime-charset)
         (inhibit-read-only t)
         (buffer-read-only nil)
         (case-fold-search nil)
         (elmo-mime-charset wl-summary-buffer-mime-charset)
         (inhibit-read-only t)
         (buffer-read-only nil)
+        diff initial-append-list append-list delete-list has-nntp
+        i num result
         gc-message
         gc-message
-        overview number-alist mark-alist 
-        curp num i new-msgdb
-        append-list delete-list crossed
-        update-thread update-top-list
-        expunged mes sync-result)
-    (unless wl-summary-buffer-elmo-folder
-      (error "(Internal error) Folder is not set:%s" (buffer-name
-                                                     (current-buffer))))
+        in-folder
+        in-db curp
+        overview-append
+        entity ret-val crossed crossed2
+        update-thread update-top-list mark
+        expunged msgs unreads importants)
+;;; (setq seen-list nil) ;for debug.
     (fset 'wl-summary-append-message-func-internal
          (wl-summary-get-append-message-func))
     ;; Flush pending append operations (disconnected operation).
     (fset 'wl-summary-append-message-func-internal
          (wl-summary-get-append-message-func))
     ;; Flush pending append operations (disconnected operation).
-    ;;(setq seen-list
-    ;;(wl-summary-flush-pending-append-operations seen-list))
+    (setq seen-list
+         (wl-summary-flush-pending-append-operations seen-list))
     (goto-char (point-max))
     (wl-folder-confirm-existence folder 'force)
     (goto-char (point-max))
     (wl-folder-confirm-existence folder 'force)
-    (setq sync-result (elmo-folder-synchronize
-                      folder
-                      wl-summary-new-mark
-                      wl-summary-unread-uncached-mark
-                      wl-summary-unread-cached-mark
-                      wl-summary-read-uncached-mark
-                      wl-summary-important-mark
-                      sync-all))
-    (setq new-msgdb (nth 0 sync-result))
-    (setq delete-list (nth 1 sync-result))
-    (setq crossed (nth 2 sync-result))
-    (if (or (and sync-all sync-result)
-           sync-result)
-       (progn
-         ;; Setup sync-all
-         (if sync-all (wl-summary-sync-all-init))
-;    (if (and has-nntp
-;           (elmo-nntp-max-number-precedes-list-active-p))
+    (message "Checking folder diff...")
+    (elmo-commit folder)
+    (setq in-folder (elmo-list-folder folder sync-all))
+    (setq in-db (unless sync-all (sort (mapcar 'car number-alist) '<)))
+    (if (not elmo-use-killed-list)
+       (setq diff (if (eq (elmo-folder-get-type folder) 'multi)
+                      (elmo-multi-list-bigger-diff in-folder in-db)
+                    (elmo-list-bigger-diff in-folder in-db)))
+      (setq diff (elmo-list-diff in-folder in-db)))
+    (setq initial-append-list (car diff))
+    (setq delete-list (cadr diff))
+    (message "Checking folder diff...done")
+    ;; Confirm appended message number.
+    (setq append-list (wl-summary-confirm-appends initial-append-list))
+    (when (and elmo-use-killed-list
+              (not (eq (length initial-append-list)
+                       (length append-list)))
+              (setq diff (elmo-list-diff initial-append-list append-list)))
+      (elmo-msgdb-append-to-killed-list folder (car diff)))
+    ;; Setup sync-all
+    (if sync-all (wl-summary-sync-all-init))
+    ;; Don't delete important-marked msgs other than 'internal.
+    (unless (eq (elmo-folder-get-type folder) 'internal)
+      (setq delete-list
+           (wl-summary-delete-important-msgs-from-list delete-list
+                                                       mark-alist)))
+    (if (and has-nntp
+            (elmo-nntp-max-number-precedes-list-active-p))
        ;; XXX this does not work correctly in rare case.
        ;; XXX this does not work correctly in rare case.
-;      (setq delete-list
-;            (wl-summary-delete-canceled-msgs-from-list
-;             delete-list
-;             (wl-summary-buffer-msgdb))))
-         (when delete-list
-           (wl-summary-delete-messages-on-buffer delete-list "Deleting...")
-           (message "Deleting...done"))
-         (wl-summary-set-status-marks-on-buffer
-          wl-summary-new-mark
-          wl-summary-unread-uncached-mark)
-         (setq append-list (elmo-msgdb-get-overview new-msgdb))
-         (setq curp append-list)
-         (setq num (length curp))
-         (when append-list
+       (setq delete-list
+             (wl-summary-delete-canceled-msgs-from-list
+              delete-list
+              wl-summary-buffer-msgdb)))
+    (if (or (equal diff '(nil nil))
+           (equal diff '(nil))
+           (and (eq (length delete-list) 0)
+                (eq (length initial-append-list) 0)))
+       (progn
+         ;; For max-number update...
+         (if (and (elmo-folder-contains-type folder 'nntp)
+                  (elmo-nntp-max-number-precedes-list-active-p)
+                  (elmo-update-number folder wl-summary-buffer-msgdb))
+             (wl-summary-set-message-modified)
+           (setq ret-val (format "No update is needed for \"%s\"" folder))))
+      (when delete-list
+       (message "Deleting...")
+       (elmo-msgdb-delete-msgs folder delete-list
+                               wl-summary-buffer-msgdb t) ; reserve cache.
+;;;    (set-buffer cur-buf)
+       (wl-summary-delete-messages-on-buffer delete-list "Deleting...")
+       (message "Deleting...done"))
+;;;   (set-buffer cur-buf)
+      ;; Change "New" marks to "Uncached Unread" marks.
+      (wl-summary-set-status-marks mark-alist
+                                  wl-summary-new-mark
+                                  wl-summary-unread-uncached-mark)
+      (wl-summary-set-status-marks-on-buffer
+       wl-summary-new-mark
+       wl-summary-unread-uncached-mark)
+      (setq num (length append-list))
+      (if append-list
+         (progn
            (setq i 0)
            (setq i 0)
+           (setq result (elmo-msgdb-create
+                         folder
+                         append-list
+                         wl-summary-new-mark
+                         wl-summary-unread-cached-mark ; !
+                         wl-summary-read-uncached-mark ; u ;; XXXX
+                         wl-summary-important-mark
+                         seen-list))
+           ;; delete duplicated messages.
+           (when (elmo-folder-contains-multi folder)
+             (setq crossed (elmo-multi-delete-crossposts
+                            wl-summary-buffer-msgdb result))
+             (setq result (cdr crossed))
+             (setq crossed (car crossed)))
+           (setq overview-append (car result))
+           (setq wl-summary-buffer-msgdb
+                 (elmo-msgdb-append wl-summary-buffer-msgdb result t))
            ;; set these value for append-message-func
            ;; set these value for append-message-func
-           (setq overview (elmo-msgdb-get-overview
-                           (elmo-folder-msgdb-internal
-                            folder)))
+           (setq overview (elmo-msgdb-get-overview wl-summary-buffer-msgdb))
            (setq number-alist (elmo-msgdb-get-number-alist
            (setq number-alist (elmo-msgdb-get-number-alist
-                               (elmo-folder-msgdb-internal
-                                folder)))
+                               wl-summary-buffer-msgdb))
            (setq mark-alist (elmo-msgdb-get-mark-alist
            (setq mark-alist (elmo-msgdb-get-mark-alist
-                             (elmo-folder-msgdb-internal
-                              folder)))
+                             wl-summary-buffer-msgdb))
+;;;        (setq location (elmo-msgdb-get-location msgdb))
+           (setq curp overview-append)
+           (setq num (length curp))
            (setq wl-summary-delayed-update nil)
            (elmo-kill-buffer wl-summary-search-buf-name)
            (while curp
            (setq wl-summary-delayed-update nil)
            (elmo-kill-buffer wl-summary-search-buf-name)
            (while curp
@@ -2115,14 +2284,14 @@ If ARG is non-nil, checking is omitted."
                (wl-append update-top-list update-thread))
              (if elmo-use-database
                  (elmo-database-msgid-put
                (wl-append update-top-list update-thread))
              (if elmo-use-database
                  (elmo-database-msgid-put
-                  (car entity) (elmo-folder-name-internal folder)
+                  (car entity) folder
                   (elmo-msgdb-overview-entity-get-number entity)))
              (setq curp (cdr curp))
              (when (> num elmo-display-progress-threshold)
                (setq i (+ i 1))
                (if (or (zerop (% i 5)) (= i num))
                    (elmo-display-progress
                   (elmo-msgdb-overview-entity-get-number entity)))
              (setq curp (cdr curp))
              (when (> num elmo-display-progress-threshold)
                (setq i (+ i 1))
                (if (or (zerop (% i 5)) (= i num))
                    (elmo-display-progress
-                    'wl-summary-sync-update "Updating thread..."
+                    'wl-summary-sync-update3 "Updating thread..."
                     (/ (* i 100) num)))))
            (when wl-summary-delayed-update
              (while wl-summary-delayed-update
                     (/ (* i 100) num)))))
            (when wl-summary-delayed-update
              (while wl-summary-delayed-update
@@ -2141,54 +2310,57 @@ If ARG is non-nil, checking is omitted."
                       update-top-list)
              (wl-thread-update-indent-string-thread
               (elmo-uniq-list update-top-list)))
                       update-top-list)
              (wl-thread-update-indent-string-thread
               (elmo-uniq-list update-top-list)))
-           (message "Updating thread...done"))
-         (unless (eq wl-summary-buffer-view 'thread)
-           (wl-summary-make-number-list))
-         (wl-summary-set-message-modified)
-         (wl-summary-set-mark-modified)
-         (when (and sync-all (eq wl-summary-buffer-view 'thread))
-           (elmo-kill-buffer wl-summary-search-buf-name)
-           (message "Inserting thread...")
-           (setq wl-thread-entity-cur 0)
-           (wl-thread-insert-top)
-           (message "Inserting thread...done"))
-         (if elmo-use-database
-             (elmo-database-close))
-         (run-hooks 'wl-summary-sync-updated-hook)
-         (setq mes (format "Updated (-%d/+%d) message(s)"
+           (message "Updating thread...done")
+;;;        (set-buffer cur-buf)
+           ))
+      (unless (eq wl-summary-buffer-view 'thread)
+       (wl-summary-make-number-list))
+      (wl-summary-set-message-modified)
+      (wl-summary-set-mark-modified)
+      (when (and sync-all (eq wl-summary-buffer-view 'thread))
+       (elmo-kill-buffer wl-summary-search-buf-name)
+       (message "Inserting thread...")
+       (setq wl-thread-entity-cur 0)
+       (wl-thread-insert-top)
+       (message "Inserting thread...done"))
+      (if elmo-use-database
+         (elmo-database-close))
+      (run-hooks 'wl-summary-sync-updated-hook)
+      (setq ret-val (format "Updated (-%d/+%d) message(s)"
                            (length delete-list) num)))
                            (length delete-list) num)))
-      (setq mes (format
-                "No updates for \"%s\"" (elmo-folder-name-internal folder))))
     ;; synchronize marks.
     (if wl-summary-auto-sync-marks
        (wl-summary-sync-marks))
     ;; scoring
     (when wl-use-scoring
       (setq wl-summary-scored nil)
     ;; synchronize marks.
     (if wl-summary-auto-sync-marks
        (wl-summary-sync-marks))
     ;; scoring
     (when wl-use-scoring
       (setq wl-summary-scored nil)
-      (wl-summary-score-headers nil (wl-summary-buffer-msgdb)
+      (wl-summary-score-headers nil wl-summary-buffer-msgdb
                                (and sync-all
                                     (wl-summary-rescore-msgs number-alist))
                                sync-all)
       (when (and wl-summary-scored
                 (setq expunged (wl-summary-score-update-all-lines)))
                                (and sync-all
                                     (wl-summary-rescore-msgs number-alist))
                                sync-all)
       (when (and wl-summary-scored
                 (setq expunged (wl-summary-score-update-all-lines)))
-       (setq mes (concat mes
-                         (format " (%d expunged)"
-                                 (length expunged))))))
-    (if (and crossed (> crossed 0))
-       (setq mes
-             (if mes
-                 (concat mes
-                         (format " (%d crosspost)" crossed))
-               (format "%d crosspost message(s)" crossed)))
-      (and mes (setq mes (concat mes "."))))
+       (setq ret-val (concat ret-val
+                             (format " (%d expunged)"
+                                     (length expunged))))))
+    ;; crosspost
+    (setq crossed2 (wl-summary-update-crosspost))
+    (if (or crossed crossed2)
+       (let ((crosses (+ (or crossed 0)
+                         (or crossed2 0))))
+         (setq ret-val
+               (if ret-val
+                   (concat ret-val
+                           (format " (%d crosspost)" crosses))
+                 (format "%d crosspost message(s)" crosses))))
+      (and ret-val
+          (setq ret-val (concat ret-val "."))))
     ;; Update Folder mode
     ;; Update Folder mode
-    (wl-folder-set-folder-updated
-     (elmo-folder-name-internal folder)
-     (list 0
-          (wl-summary-count-unread
-           (elmo-msgdb-get-mark-alist
-            (elmo-folder-msgdb-internal folder)))
-          (elmo-folder-messages folder)))
+    (wl-folder-set-folder-updated folder (list 0
+                                              (wl-summary-count-unread
+                                               (elmo-msgdb-get-mark-alist
+                                                wl-summary-buffer-msgdb))
+                                              (length in-folder)))
     (wl-summary-update-modeline)
     (wl-summary-buffer-number-column-detect t)
     ;;
     (wl-summary-update-modeline)
     (wl-summary-buffer-number-column-detect t)
     ;;
@@ -2208,8 +2380,8 @@ If ARG is non-nil, checking is omitted."
              (wl-highlight-summary (point) (point-max))))))
     (wl-delete-all-overlays)
     (set-buffer-modified-p nil)
              (wl-highlight-summary (point) (point-max))))))
     (wl-delete-all-overlays)
     (set-buffer-modified-p nil)
-    (if mes (message "%s" mes))))
-  
+    ret-val))
+
 (defun wl-summary-set-score-mark (mark)
   (save-excursion
     (beginning-of-line)
 (defun wl-summary-set-score-mark (mark)
   (save-excursion
     (beginning-of-line)
@@ -2217,7 +2389,7 @@ If ARG is non-nil, checking is omitted."
          (buffer-read-only nil)
          msg-num
          cur-mark)
          (buffer-read-only nil)
          msg-num
          cur-mark)
-      (when (looking-at "^ *\\([0-9-]+\\)\\([^0-9]\\)")
+      (when (looking-at "^ *\\([0-9]+\\)\\([^0-9]\\)")
        (setq msg-num  (string-to-int (wl-match-buffer 1)))
        (setq cur-mark (wl-match-buffer 2))
        (when (member cur-mark (list " "
        (setq msg-num  (string-to-int (wl-match-buffer 1)))
        (setq cur-mark (wl-match-buffer 2))
        (when (member cur-mark (list " "
@@ -2284,14 +2456,14 @@ If ARG is non-nil, checking is omitted."
 (defun wl-summary-message-number ()
   (save-excursion
     (beginning-of-line)
 (defun wl-summary-message-number ()
   (save-excursion
     (beginning-of-line)
-    (if (looking-at "^ *\\([0-9-]+\\)")
+    (if (looking-at "^ *\\([0-9]+\\)")
        (string-to-int (wl-match-buffer 1))
       nil)))
 
 (defun wl-summary-move (src dsts-msgs)
   (let* ((dsts (car dsts-msgs))                ; (+foo +bar)
 ;;;     (msgs (cdr dsts-msgs))         ; (1 2 3)
        (string-to-int (wl-match-buffer 1))
       nil)))
 
 (defun wl-summary-move (src dsts-msgs)
   (let* ((dsts (car dsts-msgs))                ; (+foo +bar)
 ;;;     (msgs (cdr dsts-msgs))         ; (1 2 3)
-;;;     (msgdb (wl-summary-buffer-msgdb))
+;;;     (msgdb wl-summary-buffer-msgdb)
 ;;;     result)
         )
     (while dsts
 ;;;     result)
         )
     (while dsts
@@ -2299,15 +2471,14 @@ If ARG is non-nil, checking is omitted."
 
 (defun wl-summary-flush-pending-append-operations (&optional seen-list)
   "Execute append operations that are done while offline status."
 
 (defun wl-summary-flush-pending-append-operations (&optional seen-list)
   "Execute append operations that are done while offline status."
-  (when (and (elmo-folder-plugged-p wl-summary-buffer-elmo-folder)
+  (when (and (elmo-folder-plugged-p wl-summary-buffer-folder-name)
             elmo-enable-disconnected-operation)
     (let* ((resumed-list (elmo-dop-append-list-load
             elmo-enable-disconnected-operation)
     (let* ((resumed-list (elmo-dop-append-list-load
-                         wl-summary-buffer-elmo-folder t))
+                         wl-summary-buffer-folder-name t))
           (append-list (elmo-dop-append-list-load
           (append-list (elmo-dop-append-list-load
-                        wl-summary-buffer-elmo-folder))
+                        wl-summary-buffer-folder-name))
           (appends (append resumed-list append-list))
           (appends (append resumed-list append-list))
-          (number-alist (elmo-msgdb-get-number-alist
-                         (wl-summary-buffer-msgdb)))
+          (number-alist (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb))
           dels pair)
       (when appends
        (while appends
           dels pair)
       (when appends
        (while appends
@@ -2316,46 +2487,44 @@ If ARG is non-nil, checking is omitted."
          (setq appends (cdr appends)))
        (when dels
          (setq seen-list
          (setq appends (cdr appends)))
        (when dels
          (setq seen-list
-               (elmo-msgdb-add-msgs-to-seen-list
+               (elmo-msgdb-add-msgs-to-seen-list-subr
                 dels
                 dels
-                (wl-summary-buffer-msgdb)
-                (list wl-summary-unread-cached-mark
-                      wl-summary-unread-uncached-mark
-                      wl-summary-new-mark)
+                wl-summary-buffer-msgdb
+                (concat wl-summary-important-mark
+                        wl-summary-read-uncached-mark)
                 seen-list))
          (message "Resuming summary status...")
                 seen-list))
          (message "Resuming summary status...")
-         (elmo-msgdb-delete-msgs wl-summary-buffer-elmo-folder
-                                 dels)
+         (elmo-msgdb-delete-msgs wl-summary-buffer-folder-name
+                                 dels wl-summary-buffer-msgdb t)
          (wl-summary-delete-messages-on-buffer dels)
          (message "Resuming summary status...done"))
        ;; delete resume-file
          (wl-summary-delete-messages-on-buffer dels)
          (message "Resuming summary status...done"))
        ;; delete resume-file
-       (elmo-dop-append-list-save wl-summary-buffer-elmo-folder nil t)
+       (elmo-dop-append-list-save wl-summary-buffer-folder-name nil t)
        (when append-list
          (elmo-dop-flush-pending-append-operations
        (when append-list
          (elmo-dop-flush-pending-append-operations
-          wl-summary-buffer-elmo-folder append-list)))))
+          wl-summary-buffer-folder-name append-list)))))
   seen-list)
 
 (defun wl-summary-delete-all-msgs ()
   (interactive)
   (let ((cur-buf (current-buffer))
   seen-list)
 
 (defun wl-summary-delete-all-msgs ()
   (interactive)
   (let ((cur-buf (current-buffer))
-       (dels (elmo-folder-list-messages wl-summary-buffer-elmo-folder)))
+       (dels (elmo-list-folder wl-summary-buffer-folder-name)))
     (set-buffer cur-buf)
     (if (null dels)
        (message "No message to delete.")
       (if (y-or-n-p (format "%s has %d message(s).  Delete all? "
     (set-buffer cur-buf)
     (if (null dels)
        (message "No message to delete.")
       (if (y-or-n-p (format "%s has %d message(s).  Delete all? "
-                           (wl-summary-buffer-folder-name)
+                           wl-summary-buffer-folder-name
                            (length dels)))
          (progn
            (message "Deleting...")
                            (length dels)))
          (progn
            (message "Deleting...")
-           (elmo-folder-delete-messages
-            wl-summary-buffer-elmo-folder dels)
-           (elmo-msgdb-delete-msgs wl-summary-buffer-elmo-folder
-                                   dels)
-
-;;;        (elmo-msgdb-save (wl-summary-buffer-folder-name) nil)
+           (elmo-delete-msgs wl-summary-buffer-folder-name dels
+                             wl-summary-buffer-msgdb)
+           (elmo-msgdb-delete-msgs wl-summary-buffer-folder-name
+                                   dels wl-summary-buffer-msgdb)
+;;;        (elmo-msgdb-save wl-summary-buffer-folder-name nil)
            (wl-summary-set-message-modified)
            (wl-summary-set-mark-modified)
            (wl-summary-set-message-modified)
            (wl-summary-set-mark-modified)
-           (wl-folder-set-folder-updated (wl-summary-buffer-folder-name)
+           (wl-folder-set-folder-updated wl-summary-buffer-folder-name
                                          (list 0 0 0))
 ;;; for thread.
 ;;;        (setq wl-thread-top-entity '(nil t nil nil))
                                          (list 0 0 0))
 ;;; for thread.
 ;;;        (setq wl-thread-top-entity '(nil t nil nil))
@@ -2418,17 +2587,14 @@ If ARG, without confirm."
                (wl-folder-get-entity-id entity))))
   (wl-summary-goto-folder-subr wl-summary-last-visited-folder nil nil nil t))
 
                (wl-folder-get-entity-id entity))))
   (wl-summary-goto-folder-subr wl-summary-last-visited-folder nil nil nil t))
 
-(defun wl-summary-sticky-p (&optional folder)
-  (if folder
-      (get-buffer (wl-summary-sticky-buffer-name
-                  (elmo-folder-name-internal folder)))
+(defun wl-summary-sticky-p (&optional fld)
+  (if fld
+      (get-buffer (wl-summary-sticky-buffer-name fld))
     (not (string= wl-summary-buffer-name (buffer-name)))))
 
     (not (string= wl-summary-buffer-name (buffer-name)))))
 
-(defun wl-summary-always-sticky-folder-p (folder)
+(defun wl-summary-always-sticky-folder-p (fld)
   (or (eq t wl-summary-always-sticky-folder-list)
   (or (eq t wl-summary-always-sticky-folder-list)
-      (wl-string-match-member
-       (elmo-folder-name-internal folder)
-       wl-summary-always-sticky-folder-list)))
+      (wl-string-match-member fld wl-summary-always-sticky-folder-list)))
 
 (defun wl-summary-stick (&optional force)
   "Make current summary buffer sticky."
 
 (defun wl-summary-stick (&optional force)
   "Make current summary buffer sticky."
@@ -2439,32 +2605,30 @@ If ARG, without confirm."
       (wl-summary-toggle-disp-msg 'off)
       (wl-summary-switch-to-clone-buffer
        (wl-summary-sticky-buffer-name
       (wl-summary-toggle-disp-msg 'off)
       (wl-summary-switch-to-clone-buffer
        (wl-summary-sticky-buffer-name
-       (wl-summary-buffer-folder-name)))
+       wl-summary-buffer-folder-name))
 ;;; ???hang up
 ;;;   (rename-buffer (wl-summary-sticky-buffer-name
 ;;; ???hang up
 ;;;   (rename-buffer (wl-summary-sticky-buffer-name
-;;;                  (wl-summary-buffer-folder-name))))
-      (message "Folder `%s' is now sticky." (wl-summary-buffer-folder-name)))))
+;;;                  wl-summary-buffer-folder-name)))
+      (message "Folder `%s' is now sticky." wl-summary-buffer-folder-name))))
 
 (defun wl-summary-switch-to-clone-buffer (buffer-name)
   (let ((cur-buf (current-buffer))
        (msg (wl-summary-message-number))
        (buf (get-buffer-create buffer-name))
 
 (defun wl-summary-switch-to-clone-buffer (buffer-name)
   (let ((cur-buf (current-buffer))
        (msg (wl-summary-message-number))
        (buf (get-buffer-create buffer-name))
-       (folder wl-summary-buffer-elmo-folder)
+       (folder wl-summary-buffer-folder-name)
        (copy-variables
         (append '(wl-summary-buffer-view
                   wl-summary-buffer-refile-list
                   wl-summary-buffer-delete-list
                   wl-summary-buffer-copy-list
                   wl-summary-buffer-target-mark-list
        (copy-variables
         (append '(wl-summary-buffer-view
                   wl-summary-buffer-refile-list
                   wl-summary-buffer-delete-list
                   wl-summary-buffer-copy-list
                   wl-summary-buffer-target-mark-list
-                  wl-summary-buffer-elmo-folder
+                  wl-summary-buffer-msgdb
                   wl-summary-buffer-number-column
                   wl-summary-buffer-number-regexp
                   wl-summary-buffer-message-modified
                   wl-summary-buffer-mark-modified
                   wl-summary-buffer-thread-modified
                   wl-summary-buffer-number-column
                   wl-summary-buffer-number-regexp
                   wl-summary-buffer-message-modified
                   wl-summary-buffer-mark-modified
                   wl-summary-buffer-thread-modified
-                  wl-summary-buffer-number-list
-                  wl-summary-buffer-msgdb
-                  wl-summary-buffer-folder-name)
+                  wl-summary-buffer-number-list)
                 (and (eq wl-summary-buffer-view 'thread)
                      '(wl-thread-entity-hashtb
                        wl-thread-entities
                 (and (eq wl-summary-buffer-view 'thread)
                      '(wl-thread-entity-hashtb
                        wl-thread-entities
@@ -2494,7 +2658,7 @@ If ARG, without confirm."
     (switch-to-buffer buf)
     (kill-buffer cur-buf)
     (wl-summary-count-unread
     (switch-to-buffer buf)
     (kill-buffer cur-buf)
     (wl-summary-count-unread
-     (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+     (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
     (wl-summary-update-modeline)
     (if msg
        (if (eq wl-summary-buffer-view 'thread)
     (wl-summary-update-modeline)
     (if msg
        (if (eq wl-summary-buffer-view 'thread)
@@ -2508,48 +2672,74 @@ If ARG, without confirm."
           (get-buffer (wl-summary-sticky-buffer-name folder)))
       (get-buffer wl-summary-buffer-name)))
 
           (get-buffer (wl-summary-sticky-buffer-name folder)))
       (get-buffer wl-summary-buffer-name)))
 
-(defun wl-summary-get-buffer-create (name &optional force-sticky)
+(defun wl-summary-get-buffer-create (folder &optional force-sticky)
   (if force-sticky
       (get-buffer-create
   (if force-sticky
       (get-buffer-create
-       (wl-summary-sticky-buffer-name name))
-    (or (get-buffer (wl-summary-sticky-buffer-name name))
+       (wl-summary-sticky-buffer-name folder))
+    (or (get-buffer (wl-summary-sticky-buffer-name folder))
        (get-buffer-create wl-summary-buffer-name))))
 
        (get-buffer-create wl-summary-buffer-name))))
 
+(defun wl-summary-disp-msg (folder disp-msg)
+  (let (disp mes-win)
+    (if (and disp-msg
+            wl-summary-buffer-disp-msg)
+       (let ((view-message-buffer (get-buffer wl-message-buf-name))
+             (number (wl-summary-message-number))
+             cur-folder cur-number sel-win)
+         (when view-message-buffer
+           (save-excursion
+             (set-buffer view-message-buffer)
+             (setq cur-folder wl-message-buffer-cur-folder
+                   cur-number wl-message-buffer-cur-number))
+           (when (and (string= folder cur-folder)
+                      (eq number cur-number))
+             (setq sel-win (selected-window))
+             (wl-select-buffer view-message-buffer)
+             (select-window sel-win)
+             (setq disp t)))))
+    (if (not disp)
+       (setq wl-summary-buffer-disp-msg nil))
+    (when (and (not disp)
+              (setq mes-win (wl-message-buffer-window)))
+      (delete-window mes-win)
+      (run-hooks 'wl-summary-toggle-disp-off-hook))))
+
 (defun wl-summary-make-number-list ()
   (setq wl-summary-buffer-number-list
        (mapcar
         (lambda (x) (elmo-msgdb-overview-entity-get-number x))
 (defun wl-summary-make-number-list ()
   (setq wl-summary-buffer-number-list
        (mapcar
         (lambda (x) (elmo-msgdb-overview-entity-get-number x))
-        (elmo-msgdb-get-overview (wl-summary-buffer-msgdb)))))
+        (elmo-msgdb-get-overview wl-summary-buffer-msgdb))))
+
+(defun wl-summary-auto-select-msg-p (unread-msg)
+  (and unread-msg
+       (not (string=
+            (cadr (assoc unread-msg
+                         (elmo-msgdb-get-mark-alist
+                          wl-summary-buffer-msgdb)))
+            wl-summary-important-mark))))
 
 
-(defun wl-summary-goto-folder-subr (&optional name scan-type other-window
+(defun wl-summary-goto-folder-subr (&optional folder scan-type other-window
                                              sticky interactive scoring)
   "Display target folder on summary."
   (interactive)
   (let* ((keep-cursor (memq this-command
                            wl-summary-keep-cursor-command))
                                              sticky interactive scoring)
   "Display target folder on summary."
   (interactive)
   (let* ((keep-cursor (memq this-command
                            wl-summary-keep-cursor-command))
-        (name (or name (wl-summary-read-folder wl-default-folder)))
-        (cur-fld wl-summary-buffer-elmo-folder)
-        folder buf mes hilit reuse-buf
+        (fld (or folder (wl-summary-read-folder wl-default-folder)))
+        (cur-fld wl-summary-buffer-folder-name)
+        buf mes hilit reuse-buf
         retval entity)
         retval entity)
-    (if (string= name "")
-       (setq name wl-default-folder))
-    (setq folder (wl-folder-get-elmo-folder name))
-    (when (and (not (string=
-                    (and cur-fld
-                         (elmo-folder-name-internal cur-fld))
-                    (elmo-folder-name-internal folder))) ; folder is moved.
+    (if (string= fld "")
+       (setq fld wl-default-folder))
+    (when (and (not (string= cur-fld fld)) ; folder is moved.
               (eq major-mode 'wl-summary-mode)) ; called in summary.
               (eq major-mode 'wl-summary-mode)) ; called in summary.
-      (setq wl-summary-last-visited-folder (wl-summary-buffer-folder-name))
+      (setq wl-summary-last-visited-folder wl-summary-buffer-folder-name)
       (wl-summary-cleanup-temp-marks (wl-summary-sticky-p))
       (wl-summary-cleanup-temp-marks (wl-summary-sticky-p))
-      (wl-summary-save-view 'keep) ; keep current buffer, anyway.
-      (elmo-folder-commit wl-summary-buffer-elmo-folder))
-    (setq buf (wl-summary-get-buffer-create (elmo-folder-name-internal folder)
-                                           sticky))
+      (wl-summary-save-status 'keep)) ;; keep current buffer, anyway.
+    (setq buf (wl-summary-get-buffer-create fld sticky))
     (setq reuse-buf
          (save-excursion
            (set-buffer buf)
     (setq reuse-buf
          (save-excursion
            (set-buffer buf)
-           (string= (elmo-folder-name-internal folder)
-                    (wl-summary-buffer-folder-name))))
+           (string= fld wl-summary-buffer-folder-name)))
     (unwind-protect
        (if reuse-buf
            (if interactive
     (unwind-protect
        (if reuse-buf
            (if interactive
@@ -2560,23 +2750,24 @@ If ARG, without confirm."
          (set-buffer buf)
          (unless (eq major-mode 'wl-summary-mode)
            (wl-summary-mode))
          (set-buffer buf)
          (unless (eq major-mode 'wl-summary-mode)
            (wl-summary-mode))
-         (wl-summary-buffer-set-folder folder)
+         (wl-summary-buffer-set-folder fld)
          (setq wl-summary-buffer-disp-msg nil)
          (setq wl-summary-buffer-last-displayed-msg nil)
          (setq wl-summary-buffer-current-msg nil)
          (let ((case-fold-search nil)
                (inhibit-read-only t)
                (buffer-read-only nil))
          (setq wl-summary-buffer-disp-msg nil)
          (setq wl-summary-buffer-last-displayed-msg nil)
          (setq wl-summary-buffer-current-msg nil)
          (let ((case-fold-search nil)
                (inhibit-read-only t)
                (buffer-read-only nil))
-           ;; Select folder
-           (elmo-folder-open folder)
-           ;; For compatibility
-           (setq wl-summary-buffer-msgdb (elmo-folder-msgdb folder))
-           (setq wl-summary-buffer-folder-name (elmo-folder-name-internal
-                                                folder))
+           ;; Load msgdb
+           (setq wl-summary-buffer-msgdb nil) ; new msgdb
+           (setq wl-summary-buffer-msgdb
+                 (wl-summary-msgdb-load-async fld))
+           (if (null wl-summary-buffer-msgdb)
+               (setq wl-summary-buffer-msgdb
+                     (elmo-msgdb-load (elmo-string fld))))
            (erase-buffer)
            ;; Resume summary view
            (if wl-summary-cache-use
            (erase-buffer)
            ;; Resume summary view
            (if wl-summary-cache-use
-               (let* ((dir (elmo-folder-msgdb-path folder))
+               (let* ((dir (elmo-msgdb-expand-path fld))
                       (cache (expand-file-name wl-summary-cache-file dir))
                       (view (expand-file-name wl-summary-view-file dir)))
                  (when (file-exists-p cache)
                       (cache (expand-file-name wl-summary-cache-file dir))
                       (view (expand-file-name wl-summary-view-file dir)))
                  (when (file-exists-p cache)
@@ -2590,18 +2781,18 @@ If ARG, without confirm."
                    (setq wl-summary-buffer-view
                          (wl-summary-load-file-object view)))
                  (if (eq wl-summary-buffer-view 'thread)
                    (setq wl-summary-buffer-view
                          (wl-summary-load-file-object view)))
                  (if (eq wl-summary-buffer-view 'thread)
-                     (wl-thread-resume-entity folder)
-                   (wl-summary-make-number-list)))
+                     (wl-thread-resume-entity fld)
+                   (wl-summary-make-number-list)))
              (setq wl-summary-buffer-view
                    (wl-summary-load-file-object
                     (expand-file-name wl-summary-view-file
              (setq wl-summary-buffer-view
                    (wl-summary-load-file-object
                     (expand-file-name wl-summary-view-file
-                                      (elmo-folder-msgdb-path folder))))
+                                      (elmo-msgdb-expand-path fld))))
              (wl-summary-rescan))
            (wl-summary-count-unread
              (wl-summary-rescan))
            (wl-summary-count-unread
-            (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+            (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
            (wl-summary-update-modeline)))
       (wl-summary-buffer-number-column-detect t)
            (wl-summary-update-modeline)))
       (wl-summary-buffer-number-column-detect t)
-      (wl-summary-toggle-disp-msg 'on)
+      (wl-summary-disp-msg fld (and reuse-buf keep-cursor))
       (unless (and reuse-buf keep-cursor)
        ;(setq hilit wl-summary-highlight)
        (unwind-protect
       (unless (and reuse-buf keep-cursor)
        ;(setq hilit wl-summary-highlight)
        (unwind-protect
@@ -2611,7 +2802,7 @@ If ARG, without confirm."
              (if (and (not scan-type)
                       interactive
                       (not wl-ask-range))
              (if (and (not scan-type)
                       interactive
                       (not wl-ask-range))
-                 (setq scan-type (wl-summary-get-sync-range folder)))
+                 (setq scan-type (wl-summary-get-sync-range fld)))
              (cond
               ((eq scan-type nil)
                (wl-summary-sync 'unset-cursor))
              (cond
               ((eq scan-type nil)
                (wl-summary-sync 'unset-cursor))
@@ -2625,7 +2816,7 @@ If ARG, without confirm."
              (switch-to-buffer buf)
            (set-buffer buf))
          ;; stick always-sticky-folder
              (switch-to-buffer buf)
            (set-buffer buf))
          ;; stick always-sticky-folder
-         (when (wl-summary-always-sticky-folder-p folder)
+         (when (wl-summary-always-sticky-folder-p fld)
            (or (wl-summary-sticky-p) (wl-summary-stick t)))
          (run-hooks 'wl-summary-prepared-pre-hook)
          (set-buffer-modified-p nil)
            (or (wl-summary-sticky-p) (wl-summary-stick t)))
          (run-hooks 'wl-summary-prepared-pre-hook)
          (set-buffer-modified-p nil)
@@ -2633,10 +2824,14 @@ If ARG, without confirm."
          (if (wl-summary-cursor-down t)
              (let ((unreadp (wl-summary-next-message 
                              (wl-summary-message-number)
          (if (wl-summary-cursor-down t)
              (let ((unreadp (wl-summary-next-message 
                              (wl-summary-message-number)
-                             'down nil)))
-               (cond ((and wl-auto-select-first unreadp)
+                             'down t)))
+               (cond ((and wl-auto-select-first
+                           (wl-summary-auto-select-msg-p unreadp))
+                      ;; wl-auto-select-first is non-nil and
+                      ;; unreadp is non-nil but not important
                       (setq retval 'disp-msg))
                       (setq retval 'disp-msg))
-                     ((not unreadp)
+                     ((not (wl-summary-auto-select-msg-p unreadp))
+                      ;; unreadp is nil or important
                       (setq retval 'more-next))))
            (goto-char (point-max))
            (if (elmo-folder-plugged-p folder)
                       (setq retval 'more-next))))
            (goto-char (point-max))
            (if (elmo-folder-plugged-p folder)
@@ -2658,6 +2853,9 @@ If ARG, without confirm."
                                    wl-summary-highlight-partial-threshold)))
                    (wl-highlight-summary (point) (point-max)))
                (wl-highlight-summary (point-min) (point-max))))
                                    wl-summary-highlight-partial-threshold)))
                    (wl-highlight-summary (point) (point-max)))
                (wl-highlight-summary (point-min) (point-max))))
+         (if (null wl-summary-buffer-msgdb) ;; one more try.
+             (setq wl-summary-buffer-msgdb
+                   (elmo-msgdb-load (elmo-string fld))))
          (if (eq retval 'disp-msg)
              (wl-summary-redisplay))
          (if mes (message "%s" mes))
          (if (eq retval 'disp-msg)
              (wl-summary-redisplay))
          (if mes (message "%s" mes))
@@ -2666,8 +2864,7 @@ If ARG, without confirm."
     ;; set current entity-id
     (if (and (not folder)
             (setq entity
     ;; set current entity-id
     (if (and (not folder)
             (setq entity
-                  (wl-folder-search-entity-by-name (elmo-folder-name-internal
-                                                    folder)
+                  (wl-folder-search-entity-by-name fld
                                                    wl-folder-entity
                                                    'folder)))
        ;; entity-id is unknown.
                                                    wl-folder-entity
                                                    'folder)))
        ;; entity-id is unknown.
@@ -2796,14 +2993,14 @@ If ARG, without confirm."
 
 (defun wl-summary-search-by-subject (entity overview)
   (let ((buf (get-buffer-create wl-summary-search-buf-name))
 
 (defun wl-summary-search-by-subject (entity overview)
   (let ((buf (get-buffer-create wl-summary-search-buf-name))
-       (folder-name (wl-summary-buffer-folder-name))
+       (folder-name wl-summary-buffer-folder-name)
        match founds found-entity)
     (save-excursion
       (set-buffer buf)
       (let ((case-fold-search t))
        match founds found-entity)
     (save-excursion
       (set-buffer buf)
       (let ((case-fold-search t))
-       (when (or (not (string= wl-summary-search-buf-folder-name folder-name))
+       (when (or (not (string= wl-summary-buffer-folder-name folder-name))
                  (zerop (buffer-size)))
                  (zerop (buffer-size)))
-         (setq wl-summary-search-buf-folder-name folder-name)
+         (setq wl-summary-buffer-folder-name folder-name)
          (wl-summary-insert-headers
           overview
           (function
          (wl-summary-insert-headers
           overview
           (function
@@ -2934,8 +3131,8 @@ If ARG, without confirm."
     (let* (eol
          (inhibit-read-only t)
          (buffer-read-only nil)
     (let* (eol
          (inhibit-read-only t)
          (buffer-read-only nil)
-         (folder wl-summary-buffer-elmo-folder)
-         (msgdb (wl-summary-buffer-msgdb))
+         (folder wl-summary-buffer-folder-name)
+         (msgdb wl-summary-buffer-msgdb)
          (mark-alist (elmo-msgdb-get-mark-alist msgdb))
 ;;;      (number-alist (elmo-msgdb-get-number-alist msgdb))
          new-mark visible mark)
          (mark-alist (elmo-msgdb-get-mark-alist msgdb))
 ;;;      (number-alist (elmo-msgdb-get-number-alist msgdb))
          new-mark visible mark)
@@ -2971,14 +3168,14 @@ If ARG, without confirm."
              (setq new-mark (if (string= mark
                                          wl-summary-read-uncached-mark)
                                 wl-summary-unread-uncached-mark
              (setq new-mark (if (string= mark
                                          wl-summary-read-uncached-mark)
                                 wl-summary-unread-uncached-mark
-                              (if (elmo-message-use-cache-p folder number)
+                              (if (elmo-use-cache-p folder number)
                                   wl-summary-unread-mark
                                 wl-summary-unread-uncached-mark))))
            ;; server side mark
            (unless no-server-update
                                   wl-summary-unread-mark
                                 wl-summary-unread-uncached-mark))))
            ;; server side mark
            (unless no-server-update
-             (save-match-data
-               (unless (elmo-folder-unmark-read folder (list number))
-                 (error "Setting mark failed"))))
+             (unless (elmo-mark-as-unread folder (list number)
+                                          msgdb)
+               (error "Setting mark failed")))
            (when visible
              (delete-region (match-beginning 2) (match-end 2))
              (insert new-mark))
            (when visible
              (delete-region (match-beginning 2) (match-end 2))
              (insert new-mark))
@@ -2992,7 +3189,7 @@ If ARG, without confirm."
                    (+ 1 wl-summary-buffer-unread-count))
              (wl-summary-update-modeline)
              (wl-folder-update-unread
                    (+ 1 wl-summary-buffer-unread-count))
              (wl-summary-update-modeline)
              (wl-folder-update-unread
-              (wl-summary-buffer-folder-name)
+              folder
               (+ wl-summary-buffer-unread-count
                  wl-summary-buffer-new-count)))
            (wl-summary-set-mark-modified)
               (+ wl-summary-buffer-unread-count
                  wl-summary-buffer-new-count)))
            (wl-summary-set-mark-modified)
@@ -3117,7 +3314,7 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
       (message "No marks")
     (save-excursion
       (let ((del-fld (wl-summary-get-delete-folder
       (message "No marks")
     (save-excursion
       (let ((del-fld (wl-summary-get-delete-folder
-                     (wl-summary-buffer-folder-name)))
+                     wl-summary-buffer-folder-name))
            (start (point))
            (unread-marks (list wl-summary-unread-cached-mark
                                wl-summary-unread-uncached-mark
            (start (point))
            (unread-marks (list wl-summary-unread-cached-mark
                                wl-summary-unread-uncached-mark
@@ -3146,20 +3343,24 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
        (goto-char start)               ; avoid moving cursor to
                                        ; the bottom line.
        (while dst-msgs
        (goto-char start)               ; avoid moving cursor to
                                        ; the bottom line.
        (while dst-msgs
+;;;      (elmo-msgdb-add-msgs-to-seen-list
+;;;       (car (car dst-msgs))         ;dst-folder
+;;;       (cdr (car dst-msgs))         ;msgs
+;;;       wl-summary-buffer-msgdb
+;;;       (concat wl-summary-important-mark
+;;;               wl-summary-read-uncached-mark))
          (setq result nil)
          (condition-case nil
          (setq result nil)
          (condition-case nil
-             (setq result (elmo-folder-move-messages
-                           wl-summary-buffer-elmo-folder
-                           (cdr (car dst-msgs))
-                           (wl-folder-get-elmo-folder
-                            (car (car dst-msgs)))
-                           (wl-summary-buffer-msgdb)
-                           refile-len
-                           refile-executed
-                           (not (null (cdr dst-msgs)))
-                           nil ; no-delete
-                           nil ; same-number
-                           unread-marks))
+             (setq result (elmo-move-msgs wl-summary-buffer-folder-name
+                                          (cdr (car dst-msgs))
+                                          (car (car dst-msgs))
+                                          wl-summary-buffer-msgdb
+                                          refile-len
+                                          refile-executed
+                                          (not (null (cdr dst-msgs)))
+                                          nil ; no-delete
+                                          nil ; same-number
+                                          unread-marks))
            (error nil))
          (if result                    ; succeeded.
              (progn
            (error nil))
          (if result                    ; succeeded.
              (progn
@@ -3168,7 +3369,7 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
                ;; update refile-alist.
                (setq wl-summary-buffer-refile-list
                      (wl-delete-associations (cdr (car dst-msgs))
                ;; update refile-alist.
                (setq wl-summary-buffer-refile-list
                      (wl-delete-associations (cdr (car dst-msgs))
-                                             wl-summary-buffer-refile-list)))
+                                            wl-summary-buffer-refile-list)))
            (setq refile-failures
                  (+ refile-failures (length (cdr (car dst-msgs))))))
          (setq refile-executed (+ refile-executed (length (cdr (car dst-msgs)))))
            (setq refile-failures
                  (+ refile-failures (length (cdr (car dst-msgs))))))
          (setq refile-executed (+ refile-executed (length (cdr (car dst-msgs)))))
@@ -3177,19 +3378,24 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
        ;; begin cOpy...
        (setq dst-msgs (wl-inverse-alist copies wl-summary-buffer-copy-list))
        (while dst-msgs
        ;; begin cOpy...
        (setq dst-msgs (wl-inverse-alist copies wl-summary-buffer-copy-list))
        (while dst-msgs
+;;;      (elmo-msgdb-add-msgs-to-seen-list
+;;;       (car (car dst-msgs))         ;dst-folder
+;;;       (cdr (car dst-msgs))         ;msgs
+;;;       wl-summary-buffer-msgdb
+;;;       (concat wl-summary-important-mark
+;;;               wl-summary-read-uncached-mark))
          (setq result nil)
          (condition-case nil
          (setq result nil)
          (condition-case nil
-             (setq result (elmo-folder-move-messages
-                           (wl-summary-buffer-folder-name)
-                           (cdr (car dst-msgs))
-                           (car (car dst-msgs))
-                           (wl-summary-buffer-msgdb)
-                           copy-len
-                           copy-executed
-                           (not (null (cdr dst-msgs)))
-                           t ; t is no-delete (copy)
-                           nil ; same number
-                           unread-marks))
+             (setq result (elmo-move-msgs wl-summary-buffer-folder-name
+                                          (cdr (car dst-msgs))
+                                          (car (car dst-msgs))
+                                          wl-summary-buffer-msgdb
+                                          copy-len
+                                          copy-executed
+                                          (not (null (cdr dst-msgs)))
+                                          t ; t is no-delete (copy)
+                                          nil ; same number
+                                          unread-marks))
            (error nil))
          (if result                    ; succeeded.
              (progn
            (error nil))
          (if result                    ; succeeded.
              (progn
@@ -3237,13 +3443,8 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
        (error "Not supported folder name: %s" fld))    
     (unless no-create
       (if ignore-error
        (error "Not supported folder name: %s" fld))    
     (unless no-create
       (if ignore-error
-         (condition-case nil
-             (wl-folder-confirm-existence
-              (wl-folder-get-elmo-folder
-               fld))
-           (error))
-       (wl-folder-confirm-existence (wl-folder-get-elmo-folder
-                                     fld))))
+         (ignore-errors (wl-folder-confirm-existence fld))
+       (wl-folder-confirm-existence fld)))
     fld))
 
 (defun wl-summary-print-destination (msg-num folder)
     fld))
 
 (defun wl-summary-print-destination (msg-num folder)
@@ -3296,7 +3497,7 @@ If folder is read-only, message should be copied.
 See `wl-refile-policy-alist' for more details."
   (interactive)
   (let ((policy (wl-get-assoc-list-value wl-refile-policy-alist
 See `wl-refile-policy-alist' for more details."
   (interactive)
   (let ((policy (wl-get-assoc-list-value wl-refile-policy-alist
-                                        (wl-summary-buffer-folder-name))))
+                                        wl-summary-buffer-folder-name)))
     (cond ((eq policy 'copy)
           (if (interactive-p)
               (call-interactively 'wl-summary-copy)
     (cond ((eq policy 'copy)
           (if (interactive-p)
               (call-interactively 'wl-summary-copy)
@@ -3317,11 +3518,12 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
   (let* ((buffer-num (wl-summary-message-number))
         (msg-num (or number buffer-num))
         (msgid (and msg-num
   (let* ((buffer-num (wl-summary-message-number))
         (msg-num (or number buffer-num))
         (msgid (and msg-num
-                    (elmo-message-field wl-summary-buffer-elmo-folder
-                                        msg-num 'message-id)))
+                    (cdr (assq msg-num
+                               (elmo-msgdb-get-number-alist
+                                wl-summary-buffer-msgdb)))))
         (entity (and msg-num
                      (elmo-msgdb-overview-get-entity
         (entity (and msg-num
                      (elmo-msgdb-overview-get-entity
-                      msg-num (wl-summary-buffer-msgdb))))
+                      msg-num wl-summary-buffer-msgdb)))
         (variable
          (intern (format "wl-summary-buffer-%s-list" copy-or-refile)))
         folder mark already tmp-folder)
         (variable
          (intern (format "wl-summary-buffer-%s-list" copy-or-refile)))
         folder mark already tmp-folder)
@@ -3345,9 +3547,8 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
                                 (or (wl-refile-guess entity) wl-trash-folder)
                                 (format "for %s" copy-or-refile)))))
       ;; Cache folder hack by okada@opaopa.org
                                 (or (wl-refile-guess entity) wl-trash-folder)
                                 (format "for %s" copy-or-refile)))))
       ;; Cache folder hack by okada@opaopa.org
-      (if (and (eq (elmo-folder-type-internal
-                   (wl-folder-get-elmo-folder
-                    (wl-folder-get-realname folder))) 'cache)
+      (if (and (eq (car (elmo-folder-get-spec
+                        (wl-folder-get-realname folder))) 'cache)
               (not (string= folder
                             (setq tmp-folder
                                   (concat "'cache/"
               (not (string= folder
                             (setq tmp-folder
                                   (concat "'cache/"
@@ -3356,8 +3557,14 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
          (progn
            (setq folder tmp-folder)
            (message "Force refile to %s." folder)))
          (progn
            (setq folder tmp-folder)
            (message "Force refile to %s." folder)))
-      (if (string= folder (wl-summary-buffer-folder-name))
+      (if (string= folder wl-summary-buffer-folder-name)
          (error "Same folder"))
          (error "Same folder"))
+      (unless (or (elmo-folder-plugged-p wl-summary-buffer-folder-name)
+                 (and (eq (elmo-folder-get-type wl-summary-buffer-folder-name) 'pipe)
+                      (elmo-folder-plugged-p
+                       (elmo-pipe-spec-dst (elmo-folder-get-spec wl-summary-buffer-folder-name))))
+                 (elmo-cache-exists-p msgid))
+       (error "Unplugged (no cache or msgid)"))
       (if (or (string= folder wl-queue-folder)
              (string= folder wl-draft-folder))
          (error "Don't %s messages to %s" copy-or-refile folder))
       (if (or (string= folder wl-queue-folder)
              (string= folder wl-draft-folder))
          (error "Don't %s messages to %s" copy-or-refile folder))
@@ -3411,11 +3618,11 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
     (if (and (eq wl-summary-buffer-view 'thread)
             open-all)
        (wl-thread-open-all))
     (if (and (eq wl-summary-buffer-view 'thread)
             open-all)
        (wl-thread-open-all))
-    (let* ((spec (wl-summary-buffer-folder-name))
+    (let* ((spec wl-summary-buffer-folder-name)
           (overview (elmo-msgdb-get-overview
           (overview (elmo-msgdb-get-overview
-                     (wl-summary-buffer-msgdb)))
+                     wl-summary-buffer-msgdb))
           (mark-alist (elmo-msgdb-get-mark-alist
           (mark-alist (elmo-msgdb-get-mark-alist
-                       (wl-summary-buffer-msgdb)))
+                       wl-summary-buffer-msgdb))
           checked-dsts
           (count 0)
           number dst thr-entity)
           checked-dsts
           (count 0)
           number dst thr-entity)
@@ -3428,10 +3635,10 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
                         (wl-folder-get-realname
                          (wl-refile-guess-by-rule
                           (elmo-msgdb-overview-get-entity
                         (wl-folder-get-realname
                          (wl-refile-guess-by-rule
                           (elmo-msgdb-overview-get-entity
-                           number (wl-summary-buffer-msgdb)))))
+                           number wl-summary-buffer-msgdb))))
                   (not (equal dst spec)))
          (when (not (member dst checked-dsts))
                   (not (equal dst spec)))
          (when (not (member dst checked-dsts))
-           (wl-folder-confirm-existence (wl-folder-get-elmo-folder dst))
+           (wl-folder-confirm-existence dst)
            (setq checked-dsts (cons dst checked-dsts)))
          (if (wl-summary-refile dst number)
              (incf count))
            (setq checked-dsts (cons dst checked-dsts)))
          (if (wl-summary-refile dst number)
              (incf count))
@@ -3451,7 +3658,7 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
                  (when (and (setq dst
                                   (wl-refile-guess-by-rule
                                    (elmo-msgdb-overview-get-entity
                  (when (and (setq dst
                                   (wl-refile-guess-by-rule
                                    (elmo-msgdb-overview-get-entity
-                                    (car messages) (wl-summary-buffer-msgdb))))
+                                    (car messages) wl-summary-buffer-msgdb)))
                             (not (equal dst spec)))
                    (if (wl-summary-refile dst (car messages))
                        (incf count))
                             (not (equal dst spec)))
                    (if (wl-summary-refile dst (car messages))
                        (incf count))
@@ -3561,10 +3768,10 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
       ;; guess by first msg
       (let* ((msgid (cdr (assq (wl-summary-message-number)
                               (elmo-msgdb-get-number-alist
       ;; guess by first msg
       (let* ((msgid (cdr (assq (wl-summary-message-number)
                               (elmo-msgdb-get-number-alist
-                               (wl-summary-buffer-msgdb)))))
+                               wl-summary-buffer-msgdb))))
             (function (intern (format "wl-summary-%s" copy-or-refile)))
             (entity (assoc msgid (elmo-msgdb-get-overview
             (function (intern (format "wl-summary-%s" copy-or-refile)))
             (entity (assoc msgid (elmo-msgdb-get-overview
-                                  (wl-summary-buffer-msgdb))))
+                                  wl-summary-buffer-msgdb)))
             folder)
        (if entity
            (setq folder (wl-summary-read-folder (wl-refile-guess entity)
             folder)
        (if entity
            (setq folder (wl-summary-read-folder (wl-refile-guess entity)
@@ -3648,7 +3855,7 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
   (wl-summary-target-mark-region (point-min) (point-max))
   (setq wl-summary-buffer-target-mark-list
        (mapcar 'car
   (wl-summary-target-mark-region (point-min) (point-max))
   (setq wl-summary-buffer-target-mark-list
        (mapcar 'car
-               (elmo-msgdb-get-number-alist (wl-summary-buffer-msgdb)))))
+               (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb))))
 
 (defun wl-summary-delete-all-mark (mark)
   (goto-char (point-min))
 
 (defun wl-summary-delete-all-mark (mark)
   (goto-char (point-min))
@@ -3701,9 +3908,9 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
 (defun wl-summary-pick (&optional from-list delete-marks)
   (interactive)
   (let ((result (elmo-msgdb-search
 (defun wl-summary-pick (&optional from-list delete-marks)
   (interactive)
   (let ((result (elmo-msgdb-search
-                wl-summary-buffer-elmo-folder
+                wl-summary-buffer-folder-name
                 (elmo-read-search-condition wl-summary-pick-field-default)
                 (elmo-read-search-condition wl-summary-pick-field-default)
-                (wl-summary-buffer-msgdb))))
+                wl-summary-buffer-msgdb)))
     (if delete-marks
       (let ((mlist wl-summary-buffer-target-mark-list))
        (while mlist
     (if delete-marks
       (let ((mlist wl-summary-buffer-target-mark-list))
        (while mlist
@@ -3722,12 +3929,10 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
   "Exit from current virtual folder."
   (interactive)
   (if (eq 'filter
   "Exit from current virtual folder."
   (interactive)
   (if (eq 'filter
-         (elmo-folder-type-internal wl-summary-buffer-elmo-folder))
-      (wl-summary-goto-folder-subr
-       (elmo-folder-name-internal
-       (elmo-filter-folder-target-internal
-        wl-summary-buffer-elmo-folder))
-       'update nil nil t)
+         (elmo-folder-get-type wl-summary-buffer-folder-name))
+      (wl-summary-goto-folder-subr (nth 2 (elmo-folder-get-spec
+                                          wl-summary-buffer-folder-name))
+                                  'update nil nil t)
     (error "This folder is not filtered")))
 
 (defun wl-summary-virtual (&optional arg)
     (error "This folder is not filtered")))
 
 (defun wl-summary-virtual (&optional arg)
@@ -3740,7 +3945,7 @@ If ARG, exit virtual folder."
                                         (elmo-read-search-condition
                                          wl-summary-pick-field-default)
                                         "/"
                                         (elmo-read-search-condition
                                          wl-summary-pick-field-default)
                                         "/"
-                                        (wl-summary-buffer-folder-name))
+                                        wl-summary-buffer-folder-name)
                                 'update nil nil t)))
 
 (defun wl-summary-delete-all-temp-marks ()
                                 'update nil nil t)))
 
 (defun wl-summary-delete-all-temp-marks ()
@@ -3863,10 +4068,10 @@ If ARG, exit virtual folder."
       (when (re-search-forward regexp nil t)
        (setq msgid (cdr (assq (setq number (wl-summary-message-number))
                               (elmo-msgdb-get-number-alist
       (when (re-search-forward regexp nil t)
        (setq msgid (cdr (assq (setq number (wl-summary-message-number))
                               (elmo-msgdb-get-number-alist
-                               (wl-summary-buffer-msgdb))))
+                               wl-summary-buffer-msgdb)))
              entity (assoc msgid
                            (elmo-msgdb-get-overview
              entity (assoc msgid
                            (elmo-msgdb-get-overview
-                            (wl-summary-buffer-msgdb))))
+                            wl-summary-buffer-msgdb)))
        (if (null entity)
            (error "Cannot %s" copy-or-refile))
        (funcall function
        (if (null entity)
            (error "Cannot %s" copy-or-refile))
        (funcall function
@@ -3927,7 +4132,7 @@ If ARG, exit virtual folder."
              (delq (car mlist) wl-summary-buffer-target-mark-list))
        (setq mlist (cdr mlist)))
       (wl-summary-count-unread
              (delq (car mlist) wl-summary-buffer-target-mark-list))
        (setq mlist (cdr mlist)))
       (wl-summary-count-unread
-       (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+       (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
       (wl-summary-update-modeline))))
 
 (defun wl-summary-target-mark-mark-as-unread ()
       (wl-summary-update-modeline))))
 
 (defun wl-summary-target-mark-mark-as-unread ()
@@ -3957,7 +4162,7 @@ If ARG, exit virtual folder."
              (delq (car mlist) wl-summary-buffer-target-mark-list))
        (setq mlist (cdr mlist)))
       (wl-summary-count-unread
              (delq (car mlist) wl-summary-buffer-target-mark-list))
        (setq mlist (cdr mlist)))
       (wl-summary-count-unread
-       (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+       (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
       (wl-summary-update-modeline))))
 
 (defun wl-summary-target-mark-mark-as-important ()
       (wl-summary-update-modeline))))
 
 (defun wl-summary-target-mark-mark-as-important ()
@@ -3987,7 +4192,7 @@ If ARG, exit virtual folder."
              (delq (car mlist) wl-summary-buffer-target-mark-list))
        (setq mlist (cdr mlist)))
       (wl-summary-count-unread
              (delq (car mlist) wl-summary-buffer-target-mark-list))
        (setq mlist (cdr mlist)))
       (wl-summary-count-unread
-       (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+       (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
       (wl-summary-update-modeline))))
 
 (defun wl-summary-target-mark-save ()
       (wl-summary-update-modeline))))
 
 (defun wl-summary-target-mark-save ()
@@ -4022,8 +4227,8 @@ If ARG, exit virtual folder."
     (let* (eol
           (inhibit-read-only t)
           (buffer-read-only nil)
     (let* (eol
           (inhibit-read-only t)
           (buffer-read-only nil)
-          (folder wl-summary-buffer-elmo-folder)
-          (msgdb (wl-summary-buffer-msgdb))
+          (folder wl-summary-buffer-folder-name)
+          (msgdb wl-summary-buffer-msgdb)
           (mark-alist (elmo-msgdb-get-mark-alist msgdb))
 ;;;       (number-alist (elmo-msgdb-get-number-alist msgdb))
           (case-fold-search nil)
           (mark-alist (elmo-msgdb-get-mark-alist msgdb))
 ;;;       (number-alist (elmo-msgdb-get-number-alist msgdb))
           (case-fold-search nil)
@@ -4059,16 +4264,14 @@ If ARG, exit virtual folder."
            (setq number (or number (string-to-int (wl-match-buffer 1))))
            ;; set server side mark...
            (setq new-mark (if (and uncached
            (setq number (or number (string-to-int (wl-match-buffer 1))))
            ;; set server side mark...
            (setq new-mark (if (and uncached
-                                   (if (elmo-message-use-cache-p folder number)
+                                   (if (elmo-use-cache-p folder number)
                                        (not (elmo-folder-local-p folder)))
                                    (not cached))
                               wl-summary-read-uncached-mark
                             nil))
            (if (not leave-server-side-mark-untouched)
                                        (not (elmo-folder-local-p folder)))
                                    (not cached))
                               wl-summary-read-uncached-mark
                             nil))
            (if (not leave-server-side-mark-untouched)
-               (save-match-data
-                 (setq marked (elmo-folder-mark-as-read
-                               folder
-                               (list number)))))
+               (setq marked (elmo-mark-as-read folder
+                                               (list number) msgdb)))
            (if (or leave-server-side-mark-untouched
                    marked)
                (progn
            (if (or leave-server-side-mark-untouched
                    marked)
                (progn
@@ -4080,7 +4283,7 @@ If ARG, exit virtual folder."
                               (1- wl-summary-buffer-new-count))))
                  (wl-summary-update-modeline)
                  (wl-folder-update-unread
                               (1- wl-summary-buffer-new-count))))
                  (wl-summary-update-modeline)
                  (wl-folder-update-unread
-                  (wl-summary-buffer-folder-name)
+                  folder
                   (+ wl-summary-buffer-unread-count
                      wl-summary-buffer-new-count))
                  (when (or stat cached)
                   (+ wl-summary-buffer-unread-count
                      wl-summary-buffer-new-count))
                  (when (or stat cached)
@@ -4093,7 +4296,11 @@ If ARG, exit virtual folder."
                    (elmo-msgdb-set-mark-alist msgdb mark-alist)
                    (wl-summary-set-mark-modified))
                  (if (and visible wl-summary-highlight)
                    (elmo-msgdb-set-mark-alist msgdb mark-alist)
                    (wl-summary-set-mark-modified))
                  (if (and visible wl-summary-highlight)
-                     (wl-highlight-summary-current-line nil nil t)))
+                     (wl-highlight-summary-current-line nil nil t))
+                 (if (not notcrosses)
+                     (wl-summary-set-crosspost nil
+                                               (and wl-summary-buffer-disp-msg
+                                                    (interactive-p)))))
              (if mark (message "Warning: Changing mark failed.")))))
       (set-buffer-modified-p nil)
       (if stat
              (if mark (message "Warning: Changing mark failed.")))))
       (set-buffer-modified-p nil)
       (if stat
@@ -4105,15 +4312,15 @@ If ARG, exit virtual folder."
                                               mark
                                               no-server-update)
   (interactive)
                                               mark
                                               no-server-update)
   (interactive)
-  (if (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder)
+  (if (eq (elmo-folder-get-type wl-summary-buffer-folder-name)
          'internal)
       (error "Cannot process mark in this folder"))
   (save-excursion
     (let* (eol
          (inhibit-read-only t)
          (buffer-read-only nil)
          'internal)
       (error "Cannot process mark in this folder"))
   (save-excursion
     (let* (eol
          (inhibit-read-only t)
          (buffer-read-only nil)
-         (folder wl-summary-buffer-elmo-folder)
-         (msgdb (wl-summary-buffer-msgdb))
+         (folder wl-summary-buffer-folder-name)
+         (msgdb wl-summary-buffer-msgdb)
          (mark-alist (elmo-msgdb-get-mark-alist msgdb))
          (number-alist (elmo-msgdb-get-number-alist msgdb))
          message-id visible)
          (mark-alist (elmo-msgdb-get-mark-alist msgdb))
          (number-alist (elmo-msgdb-get-number-alist msgdb))
          message-id visible)
@@ -4137,23 +4344,16 @@ If ARG, exit virtual folder."
          (progn
            (setq number (or number (string-to-int (wl-match-buffer 1))))
            (setq mark (or mark (wl-match-buffer 2)))
          (progn
            (setq number (or number (string-to-int (wl-match-buffer 1))))
            (setq mark (or mark (wl-match-buffer 2)))
-           (setq message-id (elmo-message-field
-                             wl-summary-buffer-elmo-folder
-                             number
-                             'message-id))
+           (setq message-id (cdr (assq number number-alist)))
            (if (string= mark wl-summary-important-mark)
                (progn
                  ;; server side mark
                  (unless no-server-update
            (if (string= mark wl-summary-important-mark)
                (progn
                  ;; server side mark
                  (unless no-server-update
-                   (elmo-folder-unmark-important folder (list number))
+                   (elmo-unmark-important folder (list number) msgdb)
                    (elmo-msgdb-global-mark-delete message-id))
                  ;; Remove cache if local folder.
                    (elmo-msgdb-global-mark-delete message-id))
                  ;; Remove cache if local folder.
-                 (save-match-data
-                   (if (and (elmo-folder-local-p folder)
-                            (not (eq 'mark
-                                     (elmo-folder-type-internal folder))))
-                       (elmo-file-cache-delete
-                        (elmo-file-cache-get-path message-id))))
+                 (if (elmo-folder-local-p folder)
+                     (elmo-cache-delete message-id folder number))
                  (when visible
                    (delete-region (match-beginning 2) (match-end 2))
                    (insert " "))
                  (when visible
                    (delete-region (match-beginning 2) (match-end 2))
                    (insert " "))
@@ -4163,7 +4363,7 @@ If ARG, exit virtual folder."
                                             nil)))
              ;; server side mark
              (unless no-server-update
                                             nil)))
              ;; server side mark
              (unless no-server-update
-               (elmo-folder-mark-as-important folder (list number)))
+               (elmo-mark-as-important folder (list number) msgdb))
              (when visible
                (delete-region (match-beginning 2) (match-end 2))
                (insert wl-summary-important-mark))
              (when visible
                (delete-region (match-beginning 2) (match-end 2))
                (insert wl-summary-important-mark))
@@ -4172,7 +4372,10 @@ If ARG, exit virtual folder."
                                         (string-to-int (wl-match-buffer 1))
                                         wl-summary-important-mark))
              ;; Force cache message!!
                                         (string-to-int (wl-match-buffer 1))
                                         wl-summary-important-mark))
              ;; Force cache message!!
-             (elmo-message-encache folder number)
+             (save-match-data
+               (unless (elmo-cache-exists-p message-id)
+                 (elmo-force-cache-msg folder number message-id
+                                       (elmo-msgdb-get-location msgdb))))
              (unless no-server-update
                (elmo-msgdb-global-mark-set message-id
                                            wl-summary-important-mark)))
              (unless no-server-update
                (elmo-msgdb-global-mark-set message-id
                                            wl-summary-important-mark)))
@@ -4293,11 +4496,11 @@ If ARG, exit virtual folder."
       (setq wl-summary-buffer-number-column
            (or
             (if (and update
       (setq wl-summary-buffer-number-column
            (or
             (if (and update
-                     (setq end (if (re-search-forward "^ *[0-9-]+[^0-9]" nil t)
+                     (setq end (if (re-search-forward "^ *[0-9]+[^0-9]" nil t)
                                    (point))))
                 (- end (progn (beginning-of-line) (point)) 1))
             (wl-get-assoc-list-value wl-summary-number-column-alist
                                    (point))))
                 (- end (progn (beginning-of-line) (point)) 1))
             (wl-get-assoc-list-value wl-summary-number-column-alist
-                                     (wl-summary-buffer-folder-name))
+                                     wl-summary-buffer-folder-name)
             wl-summary-default-number-column))
       (setq wl-summary-buffer-number-regexp
            (wl-repeat-string "." wl-summary-buffer-number-column)))))
             wl-summary-default-number-column))
       (setq wl-summary-buffer-number-regexp
            (wl-repeat-string "." wl-summary-buffer-number-column)))))
@@ -4308,48 +4511,65 @@ If ARG, exit virtual folder."
        (wl-match-string 1 wday-str)
       (elmo-date-get-week year month mday))))
 
        (wl-match-string 1 wday-str)
       (elmo-date-get-week year month mday))))
 
-(defvar wl-summary-move-spec-alist
-  (` ((new . ((t . nil)
-             (p . (, wl-summary-new-mark))
-             (p . (, (wl-regexp-opt
-                      (list wl-summary-unread-uncached-mark
-                            wl-summary-unread-cached-mark))))
-             (p . (, (regexp-quote wl-summary-important-mark)))))
-      (unread . ((t . nil)
-                (p . (, (wl-regexp-opt
-                         (list wl-summary-new-mark
-                               wl-summary-unread-uncached-mark
-                               wl-summary-unread-cached-mark))))
-                (p . (, (regexp-quote wl-summary-important-mark))))))))
+(defvar wl-summary-move-spec-plugged-alist
+  (list (cons 'new (list (cons 't nil)
+                        (cons 'p wl-summary-new-mark)
+                        (cons 'p (wl-regexp-opt
+                                  (list wl-summary-unread-uncached-mark
+                                        wl-summary-unread-cached-mark)))
+                        (cons 'p (regexp-quote wl-summary-important-mark))))
+       (cons 'unread (list (cons 't nil)
+                           (cons 'p (wl-regexp-opt
+                                     (list wl-summary-new-mark
+                                           wl-summary-unread-uncached-mark
+                                           wl-summary-unread-cached-mark)))
+                           (cons 'p (regexp-quote
+                                     wl-summary-important-mark))))))
+
+(defvar wl-summary-move-spec-unplugged-alist
+  (list (cons 'new (list (cons 't nil)
+                        (cons 'p wl-summary-unread-cached-mark)
+                        (cons 'p (regexp-quote wl-summary-important-mark))))
+       (cons 'unread (list (cons 't nil)
+                           (cons 'p wl-summary-unread-cached-mark)
+                           (cons 'p (regexp-quote
+                                     wl-summary-important-mark))))))
 
 (defsubst wl-summary-next-message (num direction hereto)
 
 (defsubst wl-summary-next-message (num direction hereto)
-  (let ((cur-spec (cdr (assq wl-summary-move-order 
-                            wl-summary-move-spec-alist)))
-       (nums (memq num (if (eq direction 'up)
-                           (reverse wl-summary-buffer-number-list)
-                         wl-summary-buffer-number-list)))
-       marked-list nums2)
-    (unless hereto (setq nums (cdr nums)))
-    (setq nums2 nums)
-    (catch 'done
-      (while cur-spec
-       (setq nums nums2)
-       (cond ((eq (car (car cur-spec)) 'p)
-              (if (setq marked-list (elmo-folder-list-messages-mark-match
-                                     wl-summary-buffer-elmo-folder
-                                     (cdr (car cur-spec))))
-                  (while nums
-                    (if (memq (car nums) marked-list)
-                        (throw 'done (car nums)))
-                    (setq nums (cdr nums)))))
-             ((eq (car (car cur-spec)) 't)
-              (while nums
-                (if (and wl-summary-buffer-target-mark-list
-                         (memq (car nums)
-                               wl-summary-buffer-target-mark-list))
-                    (throw 'done (car nums)))
-                (setq nums (cdr nums)))))
-       (setq cur-spec (cdr cur-spec))))))
+  (if wl-summary-buffer-next-message-func
+      (funcall wl-summary-buffer-next-message-func num direction hereto)  
+    (let ((cur-spec (cdr (assq wl-summary-move-order 
+                              (if (elmo-folder-plugged-p 
+                                   wl-summary-buffer-folder-name)
+                                  wl-summary-move-spec-plugged-alist
+                                wl-summary-move-spec-unplugged-alist))))
+         (nums (memq num (if (eq direction 'up)
+                             (reverse wl-summary-buffer-number-list)
+                           wl-summary-buffer-number-list)))
+         marked-list nums2)
+      (unless hereto (setq nums (cdr nums)))
+      (setq nums2 nums)
+      (if cur-spec
+         (catch 'done
+           (while cur-spec
+             (setq nums nums2)
+             (cond ((eq (car (car cur-spec)) 'p)
+                    (if (setq marked-list (elmo-msgdb-list-messages-mark-match
+                                           wl-summary-buffer-msgdb
+                                           (cdr (car cur-spec))))
+                        (while nums
+                          (if (memq (car nums) marked-list)
+                              (throw 'done (car nums)))
+                          (setq nums (cdr nums)))))
+                   ((eq (car (car cur-spec)) 't)
+                    (while nums
+                      (if (and wl-summary-buffer-target-mark-list
+                               (memq (car nums)
+                                     wl-summary-buffer-target-mark-list))
+                          (throw 'done (car nums)))
+                      (setq nums (cdr nums)))))
+             (setq cur-spec (cdr cur-spec))))
+       (car nums)))))
 
 (defsubst wl-summary-cursor-move (direction hereto)
   (when (and (eq direction 'up)
 
 (defsubst wl-summary-cursor-move (direction hereto)
   (when (and (eq direction 'up)
@@ -4359,7 +4579,8 @@ If ARG, exit virtual folder."
   (let (num)
     (when (setq num (wl-summary-next-message (wl-summary-message-number)
                                             direction hereto))
   (let (num)
     (when (setq num (wl-summary-next-message (wl-summary-message-number)
                                             direction hereto))
-      (wl-thread-jump-to-msg num)
+      (if (numberp num)
+         (wl-thread-jump-to-msg num))
       t)))
 ;;
 ;; Goto unread or important
       t)))
 ;;
 ;; Goto unread or important
@@ -4374,7 +4595,7 @@ If ARG, exit virtual folder."
 
 (defun wl-summary-save-view-cache ()
   (save-excursion
 
 (defun wl-summary-save-view-cache ()
   (save-excursion
-    (let* ((dir (elmo-folder-msgdb-path wl-summary-buffer-elmo-folder))
+    (let* ((dir (elmo-msgdb-expand-path wl-summary-buffer-folder-name))
           (cache (expand-file-name wl-summary-cache-file dir))
           (view (expand-file-name wl-summary-view-file dir))
           (save-view wl-summary-buffer-view)
           (cache (expand-file-name wl-summary-cache-file dir))
           (view (expand-file-name wl-summary-view-file dir))
           (save-view wl-summary-buffer-view)
@@ -4412,7 +4633,7 @@ If ARG, exit virtual folder."
               (elmo-folder-plugged-p folder)
               (wl-get-assoc-list-value
                wl-folder-sync-range-alist
               (elmo-folder-plugged-p folder)
               (wl-get-assoc-list-value
                wl-folder-sync-range-alist
-               (elmo-folder-name-internal folder)))
+               folder))
              wl-default-sync-range)))
 
 ;; redefined for wl-summary-sync-update
              wl-default-sync-range)))
 
 ;; redefined for wl-summary-sync-update
@@ -4437,9 +4658,10 @@ If ARG, exit virtual folder."
 
 (defun wl-summary-toggle-disp-folder (&optional arg)
   (interactive)
 
 (defun wl-summary-toggle-disp-folder (&optional arg)
   (interactive)
-  (let ((cur-buf (current-buffer))
-       (summary-win (get-buffer-window (current-buffer)))
-       fld-buf fld-win)
+  (let (fld-buf fld-win
+       (view-message-buffer (wl-message-get-buffer-create))
+       (cur-buf (current-buffer))
+       (summary-win (get-buffer-window (current-buffer))))
     (cond
      ((eq arg 'on)
       (setq wl-summary-buffer-disp-folder t)
     (cond
      ((eq arg 'on)
       (setq wl-summary-buffer-disp-folder t)
@@ -4450,9 +4672,8 @@ If ARG, exit virtual folder."
      ((eq arg 'off)
       (setq wl-summary-buffer-disp-folder nil)
       ;; hide your wl-message window!
      ((eq arg 'off)
       (setq wl-summary-buffer-disp-folder nil)
       ;; hide your wl-message window!
-      (when (buffer-live-p wl-message-buffer)
-       (wl-message-select-buffer wl-message-buffer)
-       (delete-window))
+      (wl-select-buffer view-message-buffer)
+      (delete-window)
       (select-window (get-buffer-window cur-buf))
       ;; display wl-folder window!!
       (if (setq fld-buf (get-buffer wl-folder-buffer-name))
       (select-window (get-buffer-window cur-buf))
       ;; display wl-folder window!!
       (if (setq fld-buf (get-buffer wl-folder-buffer-name))
@@ -4476,8 +4697,7 @@ If ARG, exit virtual folder."
            (setq wl-summary-buffer-disp-folder t)))
       (if (not wl-summary-buffer-disp-folder)
          ;; hide message window
            (setq wl-summary-buffer-disp-folder t)))
       (if (not wl-summary-buffer-disp-folder)
          ;; hide message window
-         (let ((mes-win (and wl-message-buffer
-                             (get-buffer-window wl-message-buffer)))
+         (let ((mes-win (get-buffer-window view-message-buffer))
                (wl-stay-folder-window t))
            (if mes-win (delete-window mes-win))
            ;; hide your folder window
                (wl-stay-folder-window t))
            (if mes-win (delete-window mes-win))
            ;; hide your folder window
@@ -4490,14 +4710,13 @@ If ARG, exit virtual folder."
            (run-hooks 'wl-summary-toggle-disp-folder-off-hook)
            ;; resume message window.
            (when mes-win
            (run-hooks 'wl-summary-toggle-disp-folder-off-hook)
            ;; resume message window.
            (when mes-win
-             (wl-message-select-buffer wl-message-buffer)
+             (wl-select-buffer view-message-buffer)
              (run-hooks 'wl-summary-toggle-disp-folder-message-resumed-hook)
              (select-window (get-buffer-window cur-buf)))
            )
        ;; hide message window
              (run-hooks 'wl-summary-toggle-disp-folder-message-resumed-hook)
              (select-window (get-buffer-window cur-buf)))
            )
        ;; hide message window
-       (let ((wl-stay-folder-window t)
-             (mes-win (and wl-message-buffer
-                           (get-buffer-window wl-message-buffer))))
+       (let ((mes-win (get-buffer-window view-message-buffer))
+             (wl-stay-folder-window t))
          (if mes-win (delete-window mes-win))
          (select-window (get-buffer-window cur-buf))
          ;; display wl-folder window!!
          (if mes-win (delete-window mes-win))
          (select-window (get-buffer-window cur-buf))
          ;; display wl-folder window!!
@@ -4515,7 +4734,7 @@ If ARG, exit virtual folder."
          ;; resume message window.
          (run-hooks 'wl-summary-toggle-disp-folder-on-hook)
          (when mes-win
          ;; resume message window.
          (run-hooks 'wl-summary-toggle-disp-folder-on-hook)
          (when mes-win
-           (wl-message-select-buffer wl-message-buffer)
+           (wl-select-buffer view-message-buffer)
            (run-hooks 'wl-summary-toggle-disp-folder-message-resumed-hook)
            (select-window (get-buffer-window cur-buf))))
        ))))
            (run-hooks 'wl-summary-toggle-disp-folder-message-resumed-hook)
            (select-window (get-buffer-window cur-buf))))
        ))))
@@ -4523,32 +4742,29 @@ If ARG, exit virtual folder."
 
 (defun wl-summary-toggle-disp-msg (&optional arg)
   (interactive)
 
 (defun wl-summary-toggle-disp-msg (&optional arg)
   (interactive)
-  (let ((cur-buf (current-buffer))
-       fld-buf fld-win
+  (let (fld-buf fld-win
+       (view-message-buffer (wl-message-get-buffer-create))
+       (cur-buf (current-buffer))
        summary-win)
     (cond
      ((eq arg 'on)
       (setq wl-summary-buffer-disp-msg t)
        summary-win)
     (cond
      ((eq arg 'on)
       (setq wl-summary-buffer-disp-msg t)
-      (save-excursion
-       ;; hide your folder window
-       (if (and (not wl-stay-folder-window)
-                (setq fld-buf (get-buffer wl-folder-buffer-name)))
-           (if (setq fld-win (get-buffer-window fld-buf))
-               (unless (one-window-p fld-win)
-                 (delete-window fld-win))))))
+      ;; hide your folder window
+      (if (and (not wl-stay-folder-window)
+              (setq fld-buf (get-buffer wl-folder-buffer-name)))
+         (if (setq fld-win (get-buffer-window fld-buf))
+             (delete-window fld-win))))
      ((eq arg 'off)
       (wl-delete-all-overlays)
       (setq wl-summary-buffer-disp-msg nil)
       (save-excursion
      ((eq arg 'off)
       (wl-delete-all-overlays)
       (setq wl-summary-buffer-disp-msg nil)
       (save-excursion
-       (when (buffer-live-p wl-message-buffer)
-         (wl-message-select-buffer wl-message-buffer)
-         (delete-window)
-         (and (get-buffer-window cur-buf)
-              (select-window (get-buffer-window cur-buf))))
+        (wl-select-buffer view-message-buffer)
+        (delete-window)
+       (and (get-buffer-window cur-buf)
+            (select-window (get-buffer-window cur-buf)))
         (run-hooks 'wl-summary-toggle-disp-off-hook)))
      (t
         (run-hooks 'wl-summary-toggle-disp-off-hook)))
      (t
-      (if (and wl-message-buffer
-              (get-buffer-window wl-message-buffer)) ; already displayed
+      (if (get-buffer-window view-message-buffer) ; already displayed
          (setq wl-summary-buffer-disp-msg nil)
        (setq wl-summary-buffer-disp-msg t))
       (if wl-summary-buffer-disp-msg
          (setq wl-summary-buffer-disp-msg nil)
        (setq wl-summary-buffer-disp-msg t))
       (if wl-summary-buffer-disp-msg
@@ -4561,7 +4777,7 @@ If ARG, exit virtual folder."
            (run-hooks 'wl-summary-toggle-disp-on-hook))
        (wl-delete-all-overlays)
        (save-excursion
            (run-hooks 'wl-summary-toggle-disp-on-hook))
        (wl-delete-all-overlays)
        (save-excursion
-         (wl-message-select-buffer wl-message-buffer)
+         (wl-select-buffer view-message-buffer)
          (delete-window)
          (select-window (get-buffer-window cur-buf))
          (run-hooks 'wl-summary-toggle-disp-off-hook))
          (delete-window)
          (select-window (get-buffer-window cur-buf))
          (run-hooks 'wl-summary-toggle-disp-off-hook))
@@ -4569,7 +4785,6 @@ If ARG, exit virtual folder."
        )))))
 
 (defun wl-summary-next-line-content ()
        )))))
 
 (defun wl-summary-next-line-content ()
-  "Show next line of the message."
   (interactive)
   (let ((cur-buf (current-buffer)))
     (wl-summary-toggle-disp-msg 'on)
   (interactive)
   (let ((cur-buf (current-buffer)))
     (wl-summary-toggle-disp-msg 'on)
@@ -4594,31 +4809,37 @@ If ARG, exit virtual folder."
   (wl-message-prev-page))
 
 (defsubst wl-summary-no-mime-p (folder)
   (wl-message-prev-page))
 
 (defsubst wl-summary-no-mime-p (folder)
-  (wl-string-match-member (elmo-folder-name-internal folder)
-                         wl-summary-no-mime-folder-list))
-
-(defun wl-summary-set-message-buffer-or-redisplay (&rest args)
-  "Set message buffer.
-If message is not displayed yet, display it.
-Return t if message exists."
-  (let ((folder wl-summary-buffer-elmo-folder)
+  (wl-string-match-member folder wl-summary-no-mime-folder-list))
+
+(defun wl-summary-set-message-buffer-or-redisplay (&optional ignore-original)
+  ;; if current message is not displayed, display it.
+  ;; return t if exists.
+  (let ((folder wl-summary-buffer-folder-name)
        (number (wl-summary-message-number))
        (number (wl-summary-message-number))
-       cur-folder cur-number message-last-pos)
-    (when (buffer-live-p wl-message-buffer)
-      (save-window-excursion
-       (wl-message-select-buffer wl-message-buffer)
-       (setq cur-folder wl-message-buffer-cur-folder)
-       (setq cur-number wl-message-buffer-cur-number)))
-    (if (and (string= (elmo-folder-name-internal folder) (or cur-folder ""))
-            (eq number (or cur-number 0)))
+       cur-folder cur-number message-last-pos
+       (view-message-buffer (wl-message-get-buffer-create)))
+    (save-excursion
+      (set-buffer view-message-buffer)
+      (setq cur-folder wl-message-buffer-cur-folder)
+      (setq cur-number wl-message-buffer-cur-number))
+    (if (and (not ignore-original)
+            (not
+             (and (eq number (wl-message-original-buffer-number))
+                  (string= folder (wl-message-original-buffer-folder)))))
        (progn
        (progn
-         (set-buffer wl-message-buffer)
-         t)
-      (if (wl-summary-no-mime-p folder)
-         (wl-summary-redisplay-no-mime folder number)
-       (wl-summary-redisplay-internal folder number))
-      (set-buffer wl-message-buffer)
-      nil)))
+         (if (wl-summary-no-mime-p folder)
+             (wl-summary-redisplay-no-mime folder number)
+           (wl-summary-redisplay-internal folder number))
+         nil)
+      (if (and (string= folder (or cur-folder ""))
+              (eq number (or cur-number 0)))
+         (progn
+           (set-buffer view-message-buffer)
+           t)
+       (if (wl-summary-no-mime-p folder)
+           (wl-summary-redisplay-no-mime folder number)
+         (wl-summary-redisplay-internal folder number))
+       nil))))
 
 (defun wl-summary-target-mark-forward (&optional arg)
   (interactive "P")
 
 (defun wl-summary-target-mark-forward (&optional arg)
   (interactive "P")
@@ -4688,13 +4909,13 @@ Return t if message exists."
   (interactive)
   (let* ((original (wl-summary-message-number))
         (msgid (elmo-string (or id (read-from-minibuffer "Message-ID: "))))
   (interactive)
   (let* ((original (wl-summary-message-number))
         (msgid (elmo-string (or id (read-from-minibuffer "Message-ID: "))))
-        (number-alist (elmo-msgdb-get-number-alist (wl-summary-buffer-msgdb)))
+        (number-alist (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb))
         msg otherfld schar
         (errmsg
          (format "No message with id \"%s\" in the folder." msgid)))
     (if (setq msg (car (rassoc msgid number-alist)))
 ;;;    (wl-summary-jump-to-msg-internal
         msg otherfld schar
         (errmsg
          (format "No message with id \"%s\" in the folder." msgid)))
     (if (setq msg (car (rassoc msgid number-alist)))
 ;;;    (wl-summary-jump-to-msg-internal
-;;;     (wl-summary-buffer-folder-name) msg 'no-sync)
+;;;     wl-summary-buffer-folder-name msg 'no-sync)
        (progn
          (wl-thread-jump-to-msg msg)
          t)
        (progn
          (wl-thread-jump-to-msg msg)
          t)
@@ -4709,10 +4930,10 @@ Return t if message exists."
              t ; succeed.
            ;; Back to original.
            (wl-summary-jump-to-msg-internal
              t ; succeed.
            ;; Back to original.
            (wl-summary-jump-to-msg-internal
-            (wl-summary-buffer-folder-name) original 'no-sync))
+            wl-summary-buffer-folder-name original 'no-sync))
        (cond ((eq wl-summary-search-via-nntp 'confirm)
               (message "Search message in nntp server \"%s\" <y/n/s(elect)>?"
        (cond ((eq wl-summary-search-via-nntp 'confirm)
               (message "Search message in nntp server \"%s\" <y/n/s(elect)>?"
-                       elmo-nntp-default-server)
+                       elmo-default-nntp-server)
               (setq schar (read-char))
               (cond ((eq schar ?y)
                      (wl-summary-jump-to-msg-by-message-id-via-nntp msgid))
               (setq schar (read-char))
               (cond ((eq schar ?y)
                      (wl-summary-jump-to-msg-by-message-id-via-nntp msgid))
@@ -4736,19 +4957,19 @@ Return t if message exists."
         user server port type spec)
     (if server-spec
        (if (string-match "^-" server-spec)
         user server port type spec)
     (if server-spec
        (if (string-match "^-" server-spec)
-           (setq spec (wl-folder-get-elmo-folder server-spec)
-                 user (elmo-net-folder-user-internal spec)
-                 server (elmo-net-folder-server-internal spec)
-                 port (elmo-net-folder-port-internal spec)
-                 type (elmo-net-folder-stream-type-internal spec))
+           (setq spec (elmo-nntp-get-spec server-spec)
+                 user (nth 2 spec)
+                 server (nth 3 spec)
+                 port (nth 4 spec)
+                 type (nth 5 spec))
          (setq server server-spec)))
     (when (setq ret (elmo-nntp-get-newsgroup-by-msgid
                     msgid
          (setq server server-spec)))
     (when (setq ret (elmo-nntp-get-newsgroup-by-msgid
                     msgid
-                    (or server elmo-nntp-default-server)
-                    (or user elmo-nntp-default-user)
-                    (or port elmo-nntp-default-port)
-                    (or type elmo-nntp-default-stream-type)))
-      (setq newsgroups (elmo-nntp-parse-newsgroups ret))
+                    (or server elmo-default-nntp-server)
+                    (or user elmo-default-nntp-user)
+                    (or port elmo-default-nntp-port)
+                    (or type elmo-default-nntp-stream-type)))
+      (setq newsgroups (wl-parse-newsgroups ret))
       (setq folder (concat "-" (car newsgroups)
                           (elmo-nntp-folder-postfix user server port type)))
       (catch 'found
       (setq folder (concat "-" (car newsgroups)
                           (elmo-nntp-folder-postfix user server port type)))
       (catch 'found
@@ -4763,12 +4984,12 @@ Return t if message exists."
     (if ret
        (wl-summary-jump-to-msg-internal folder nil 'update msgid)
       (message "No message id \"%s\" in nntp server \"%s\"."
     (if ret
        (wl-summary-jump-to-msg-internal folder nil 'update msgid)
       (message "No message id \"%s\" in nntp server \"%s\"."
-              msgid (or server elmo-nntp-default-server))
+              msgid (or server elmo-default-nntp-server))
       nil)))
 
 (defun wl-summary-jump-to-msg-internal (folder msg scan-type &optional msgid)
   (let (wl-auto-select-first entity)
       nil)))
 
 (defun wl-summary-jump-to-msg-internal (folder msg scan-type &optional msgid)
   (let (wl-auto-select-first entity)
-    (if (or (string= folder (wl-summary-buffer-folder-name))
+    (if (or (string= folder wl-summary-buffer-folder-name)
            (y-or-n-p
             (format
              "Message was found in the folder \"%s\". Jump to it? "
            (y-or-n-p
             (format
              "Message was found in the folder \"%s\". Jump to it? "
@@ -4781,7 +5002,7 @@ Return t if message exists."
                (setq msg
                      (car (rassoc msgid
                                   (elmo-msgdb-get-number-alist
                (setq msg
                      (car (rassoc msgid
                                   (elmo-msgdb-get-number-alist
-                                   (wl-summary-buffer-msgdb))))))
+                                   wl-summary-buffer-msgdb)))))
            (setq entity (wl-folder-search-entity-by-name folder
                                                          wl-folder-entity
                                                          'folder))
            (setq entity (wl-folder-search-entity-by-name folder
                                                          wl-folder-entity
                                                          'folder))
@@ -4870,25 +5091,26 @@ Return t if message exists."
   "Reply to current message. Default is \"wide\" reply.
 Reply to author if invoked with ARG."
   (interactive "P")
   "Reply to current message. Default is \"wide\" reply.
 Reply to author if invoked with ARG."
   (interactive "P")
-  (let ((folder wl-summary-buffer-elmo-folder)
+  (let ((folder wl-summary-buffer-folder-name)
        (number (wl-summary-message-number))
        (summary-buf (current-buffer))
        mes-buf)
        (number (wl-summary-message-number))
        (summary-buf (current-buffer))
        mes-buf)
-    (when number
-      (save-excursion
-       (wl-summary-redisplay-internal folder number))
-      (setq mes-buf wl-message-buffer)
-      (wl-message-select-buffer wl-message-buffer)
-      (set-buffer mes-buf)
-      (goto-char (point-min))
-      (or wl-draft-use-frame
-         (split-window-vertically))
-      (other-window 1)
-      (when (setq mes-buf (wl-message-get-original-buffer))
-       (wl-draft-reply mes-buf arg summary-buf)
-       (unless without-setup-hook
-         (run-hooks 'wl-mail-setup-hook)))
-      t)))
+    (if number
+       (unwind-protect
+           (progn
+             (wl-summary-redisplay-internal folder number)
+             (wl-select-buffer
+              (get-buffer (setq mes-buf (wl-current-message-buffer))))
+             (set-buffer mes-buf)
+             (goto-char (point-min))
+             (or wl-draft-use-frame
+                 (split-window-vertically))
+             (other-window 1)
+             (when (setq mes-buf (wl-message-get-original-buffer))
+               (wl-draft-reply mes-buf arg summary-buf)
+               (unless without-setup-hook
+                 (run-hooks 'wl-mail-setup-hook)))
+             t)))))
 
 (defun wl-summary-write ()
   "Write a new draft from Summary."
 
 (defun wl-summary-write ()
   "Write a new draft from Summary."
@@ -4911,7 +5133,7 @@ Use function list is `wl-summary-write-current-folder-functions'."
   (interactive)
   (let (newsgroups to cc)
     ;; default FOLDER is current buffer folder
   (interactive)
   (let (newsgroups to cc)
     ;; default FOLDER is current buffer folder
-    (setq folder (or folder (wl-summary-buffer-folder-name)))
+    (setq folder (or folder wl-summary-buffer-folder-name))
     (let ((flist wl-summary-write-current-folder-functions)
          guess-list)
       (while flist
     (let ((flist wl-summary-write-current-folder-functions)
          guess-list)
       (while flist
@@ -4921,31 +5143,26 @@ Use function list is `wl-summary-write-current-folder-functions'."
                (nth 2 guess-list))     ; Newsgroups:
            (setq flist nil)
          (setq flist (cdr flist))))
                (nth 2 guess-list))     ; Newsgroups:
            (setq flist nil)
          (setq flist (cdr flist))))
-      (if guess-list
-         (progn
-           (wl-draft (nth 0 guess-list) ; To:
-                     nil nil
-                     (nth 1 guess-list) ; Cc:
-                     nil               
-                     (nth 2 guess-list)) ; Newsgroups:
-           (run-hooks 'wl-mail-setup-hook))
-;;;    (error "%s is not newsgroup" folder)
-       (error "Can't guess by folder %s" folder)))))
+      (when (null guess-list)
+       (error "Can't guess by folder %s" folder))
+      (wl-draft (nth 0 guess-list) nil nil ; To:
+               (nth 1 guess-list) nil  ; Cc:
+               (nth 2 guess-list))     ; Newsgroups:
+      (run-hooks 'wl-mail-setup-hook)
+      (mail-position-on-field "Subject"))))
 
 (defun wl-summary-forward (&optional without-setup-hook)
   ""
   (interactive)
 
 (defun wl-summary-forward (&optional without-setup-hook)
   ""
   (interactive)
-  (let ((folder wl-summary-buffer-elmo-folder)
+  (let ((folder wl-summary-buffer-folder-name)
        (number (wl-summary-message-number))
        (summary-buf (current-buffer))
        (wl-draft-forward t)
        (number (wl-summary-message-number))
        (summary-buf (current-buffer))
        (wl-draft-forward t)
-       mes-buf
        entity subject num)
     (if (null number)
        (message "No message.")
        entity subject num)
     (if (null number)
        (message "No message.")
-      (wl-summary-redisplay-internal nil nil 'force-reload)
-      (setq mes-buf wl-message-buffer)
-      (wl-message-select-buffer mes-buf)
+      (wl-summary-redisplay-internal folder number)
+      (wl-select-buffer (get-buffer wl-message-buf-name))
       (or wl-draft-use-frame
          (split-window-vertically))
       (other-window 1)
       (or wl-draft-use-frame
          (split-window-vertically))
       (other-window 1)
@@ -4953,9 +5170,16 @@ Use function list is `wl-summary-write-current-folder-functions'."
       (if summary-buf
          (save-excursion
            (set-buffer summary-buf)
       (if summary-buf
          (save-excursion
            (set-buffer summary-buf)
-           (setq subject 
-                 (or (elmo-message-field folder number 'subject) ""))))
-      (set-buffer mes-buf)
+           (setq num (wl-summary-message-number))
+           (setq entity (assoc (cdr (assq num
+                                          (elmo-msgdb-get-number-alist
+                                           wl-summary-buffer-msgdb)))
+                               (elmo-msgdb-get-overview
+                                wl-summary-buffer-msgdb)))
+           (and entity
+                (setq subject
+                      (or (elmo-msgdb-overview-entity-get-subject entity)
+                          "")))))
       (wl-draft-forward subject summary-buf)
       (unless without-setup-hook
        (run-hooks 'wl-mail-setup-hook)))))
       (wl-draft-forward subject summary-buf)
       (unless without-setup-hook
        (run-hooks 'wl-mail-setup-hook)))))
@@ -4966,26 +5190,48 @@ Use function list is `wl-summary-write-current-folder-functions'."
   (wl-summary-read))
 
 (defun wl-summary-read ()
   (wl-summary-read))
 
 (defun wl-summary-read ()
-  "Proceed reading message in the summary buffer."
+  ""
   (interactive)
   (interactive)
-  (let ((cur-buf (current-buffer)))
+  (let ((folder wl-summary-buffer-folder-name)
+       (number (wl-summary-message-number))
+       cur-folder cur-number message-last-pos
+       (view-message-buffer (get-buffer-create wl-message-buf-name))
+        (sticky-buf-name (and (wl-summary-sticky-p) wl-message-buf-name))
+        (summary-buf-name (buffer-name)))
+    (save-excursion
+      (set-buffer view-message-buffer)
+      (when (and sticky-buf-name
+                 (not (wl-local-variable-p 'wl-message-buf-name
+                                          (current-buffer))))
+        (make-local-variable 'wl-message-buf-name)
+        (setq wl-message-buf-name sticky-buf-name)
+        (make-local-variable 'wl-message-buffer-cur-summary-buffer)
+        (setq wl-message-buffer-cur-summary-buffer summary-buf-name))
+      (setq cur-folder wl-message-buffer-cur-folder)
+      (setq cur-number wl-message-buffer-cur-number))
     (wl-summary-toggle-disp-msg 'on)
     (wl-summary-toggle-disp-msg 'on)
-    (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original)
-      (set-buffer cur-buf)
-      (if (wl-message-next-page)
-         (wl-summary-down t)))))
+    (if (and (string= folder cur-folder)
+            (eq number cur-number))
+       (progn
+         (if (wl-summary-next-page)
+             (wl-summary-down t)))
+;;;        (wl-summary-scroll-up-content)))
+      (if (wl-summary-no-mime-p folder)
+         (wl-summary-redisplay-no-mime folder number)
+       (wl-summary-redisplay-internal folder number)))))
 
 (defun wl-summary-prev (&optional interactive)
   ""
   (interactive)
   (if wl-summary-move-direction-toggle
       (setq wl-summary-move-direction-downward nil))
 
 (defun wl-summary-prev (&optional interactive)
   ""
   (interactive)
   (if wl-summary-move-direction-toggle
       (setq wl-summary-move-direction-downward nil))
-  (let ((skip-mark-regexp (mapconcat
+  (let ((type (elmo-folder-get-type wl-summary-buffer-folder-name))
+       (skip-mark-regexp (mapconcat
                           'regexp-quote
                           wl-summary-skip-mark-list ""))
        goto-next regex-list regex next-entity finfo)
     (beginning-of-line)
                           'regexp-quote
                           wl-summary-skip-mark-list ""))
        goto-next regex-list regex next-entity finfo)
     (beginning-of-line)
-    (if (elmo-folder-plugged-p wl-summary-buffer-elmo-folder)
+    (if (elmo-folder-plugged-p wl-summary-buffer-folder-name)
        (setq regex (format "^%s[^%s]"
                            wl-summary-buffer-number-regexp
                            skip-mark-regexp))
        (setq regex (format "^%s[^%s]"
                            wl-summary-buffer-number-regexp
                            skip-mark-regexp))
@@ -5019,12 +5265,13 @@ Use function list is `wl-summary-write-current-folder-functions'."
   (interactive)
   (if wl-summary-move-direction-toggle
       (setq wl-summary-move-direction-downward t))
   (interactive)
   (if wl-summary-move-direction-toggle
       (setq wl-summary-move-direction-downward t))
-  (let ((skip-mark-regexp (mapconcat
+  (let ((type (elmo-folder-get-type wl-summary-buffer-folder-name))
+       (skip-mark-regexp (mapconcat
                           'regexp-quote
                           wl-summary-skip-mark-list ""))
        goto-next regex regex-list next-entity finfo)
     (end-of-line)
                           'regexp-quote
                           wl-summary-skip-mark-list ""))
        goto-next regex regex-list next-entity finfo)
     (end-of-line)
-    (if (elmo-folder-plugged-p wl-summary-buffer-elmo-folder)
+    (if (elmo-folder-plugged-p wl-summary-buffer-folder-name)
        (setq regex (format "^%s[^%s]"
                            wl-summary-buffer-number-regexp
                            skip-mark-regexp))
        (setq regex (format "^%s[^%s]"
                            wl-summary-buffer-number-regexp
                            skip-mark-regexp))
@@ -5152,17 +5399,19 @@ Use function list is `wl-summary-write-current-folder-functions'."
 (defun wl-summary-redisplay (&optional arg)
   (interactive "P")
   (if (and (not arg)
 (defun wl-summary-redisplay (&optional arg)
   (interactive "P")
   (if (and (not arg)
-          (wl-summary-no-mime-p wl-summary-buffer-elmo-folder))
+          (wl-summary-no-mime-p wl-summary-buffer-folder-name))
       (wl-summary-redisplay-no-mime)
     (wl-summary-redisplay-internal nil nil arg)))
 
 (defsubst wl-summary-redisplay-internal (&optional folder number force-reload)
   (interactive)
       (wl-summary-redisplay-no-mime)
     (wl-summary-redisplay-internal nil nil arg)))
 
 (defsubst wl-summary-redisplay-internal (&optional folder number force-reload)
   (interactive)
-  (let* ((msgdb (wl-summary-buffer-msgdb))
-        (folder (or folder wl-summary-buffer-elmo-folder))
+  (let* ((msgdb wl-summary-buffer-msgdb)
+        (fld (or folder wl-summary-buffer-folder-name))
         (num (or number (wl-summary-message-number)))
         (wl-mime-charset      wl-summary-buffer-mime-charset)
         (default-mime-charset wl-summary-buffer-mime-charset)
         (num (or number (wl-summary-message-number)))
         (wl-mime-charset      wl-summary-buffer-mime-charset)
         (default-mime-charset wl-summary-buffer-mime-charset)
+        (wl-message-redisplay-func
+         wl-summary-buffer-message-redisplay-func)
         fld-buf fld-win thr-entity)
     (if (and wl-thread-open-reading-thread
             (eq wl-summary-buffer-view 'thread)
         fld-buf fld-win thr-entity)
     (if (and wl-thread-open-reading-thread
             (eq wl-summary-buffer-view 'thread)
@@ -5182,38 +5431,44 @@ Use function list is `wl-summary-write-current-folder-functions'."
              (if (setq fld-win (get-buffer-window fld-buf))
                  (delete-window fld-win)))
           (setq wl-current-summary-buffer (current-buffer))
              (if (setq fld-win (get-buffer-window fld-buf))
                  (delete-window fld-win)))
           (setq wl-current-summary-buffer (current-buffer))
-         (wl-summary-mark-as-read
-          nil
-          ;; not fetched, then change server-mark.
-          (if (wl-message-redisplay folder num 'mime force-reload)
-              nil
-            ;; plugged, then leave server-mark.
-            (if (and
-                 (not
-                  (elmo-folder-local-p
-                   wl-summary-buffer-elmo-folder))
-                 (elmo-folder-plugged-p
-                  wl-summary-buffer-elmo-folder))
-                'leave))
-          t ; displayed
-          nil
-          'cached ; cached by reading.
-          )
+         (if (wl-message-redisplay fld num 'mime msgdb
+                                   (or force-reload
+                                       ;; if draft folder, force reload.
+                                       (string= fld wl-draft-folder)))
+             (wl-summary-mark-as-read nil
+                                      ;; cached, then change server-mark.
+                                      (if wl-message-cache-used
+                                          nil
+                                        ;; plugged, then leave server-mark.
+                                        (if (and
+                                             (not
+                                              (elmo-folder-local-p
+                                               wl-summary-buffer-folder-name))
+                                             (elmo-folder-plugged-p
+                                              wl-summary-buffer-folder-name))
+                                            'leave))
+                                      t ; displayed
+                                      nil
+                                      'cached ; cached by reading.
+                                      )
+           )
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
            (recenter (/ (- (window-height) 2) 2))
            (if (not wl-summary-width)
                (wl-horizontal-recenter)))
          (wl-highlight-summary-displaying)
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
            (recenter (/ (- (window-height) 2) 2))
            (if (not wl-summary-width)
                (wl-horizontal-recenter)))
          (wl-highlight-summary-displaying)
-         (wl-message-buffer-prefetch-next folder num (current-buffer)
-                                          wl-summary-buffer-mime-charset)
+         (wl-cache-prefetch-next fld num (current-buffer))
          (run-hooks 'wl-summary-redisplay-hook))
       (message "No message to display."))))
 
 (defun wl-summary-redisplay-no-mime (&optional folder number)
   (interactive)
          (run-hooks 'wl-summary-redisplay-hook))
       (message "No message to display."))))
 
 (defun wl-summary-redisplay-no-mime (&optional folder number)
   (interactive)
-  (let* ((fld (or folder wl-summary-buffer-elmo-folder))
+  (let* ((msgdb wl-summary-buffer-msgdb)
+        (fld (or folder wl-summary-buffer-folder-name))
         (num (or number (wl-summary-message-number)))
         (num (or number (wl-summary-message-number)))
+        (wl-mime-charset      wl-summary-buffer-mime-charset)
+        (default-mime-charset wl-summary-buffer-mime-charset)
         wl-break-pages)
     (if num
        (progn
         wl-break-pages)
     (if num
        (progn
@@ -5221,7 +5476,9 @@ Use function list is `wl-summary-write-current-folder-functions'."
          (setq wl-summary-buffer-last-displayed-msg
                wl-summary-buffer-current-msg)
          (setq wl-current-summary-buffer (current-buffer))
          (setq wl-summary-buffer-last-displayed-msg
                wl-summary-buffer-current-msg)
          (setq wl-current-summary-buffer (current-buffer))
-         (wl-message-redisplay fld num 'as-is)
+         (wl-normal-message-redisplay fld num 'no-mime msgdb
+                                      ;; if draft folder, force reload.
+                                      (string= fld wl-draft-folder))
          (wl-summary-mark-as-read nil nil t)
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
          (wl-summary-mark-as-read nil nil t)
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
@@ -5236,17 +5493,21 @@ Use function list is `wl-summary-write-current-folder-functions'."
 
 (defun wl-summary-redisplay-all-header (&optional folder number)
   (interactive)
 
 (defun wl-summary-redisplay-all-header (&optional folder number)
   (interactive)
-  (let* ((fld (or folder wl-summary-buffer-elmo-folder))
+  (let* ((msgdb wl-summary-buffer-msgdb)
+        (fld (or folder wl-summary-buffer-folder-name))
         (num (or number (wl-summary-message-number)))
         (wl-mime-charset      wl-summary-buffer-mime-charset)
         (num (or number (wl-summary-message-number)))
         (wl-mime-charset      wl-summary-buffer-mime-charset)
-        (default-mime-charset wl-summary-buffer-mime-charset))
+        (default-mime-charset wl-summary-buffer-mime-charset)
+        (wl-message-redisplay-func wl-summary-buffer-message-redisplay-func))
     (if num
        (progn
          (setq wl-summary-buffer-disp-msg t)
          (setq wl-summary-buffer-last-displayed-msg
                wl-summary-buffer-current-msg)
          (setq wl-current-summary-buffer (current-buffer))
     (if num
        (progn
          (setq wl-summary-buffer-disp-msg t)
          (setq wl-summary-buffer-last-displayed-msg
                wl-summary-buffer-current-msg)
          (setq wl-current-summary-buffer (current-buffer))
-         (if (wl-message-redisplay fld num 'all-header); t if displayed.
+         (if (wl-message-redisplay fld num 'all-header msgdb
+                                   ;; if draft folder, force reload.
+                                   (string= fld wl-draft-folder))
              (wl-summary-mark-as-read nil nil t))
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
              (wl-summary-mark-as-read nil nil t))
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
@@ -5260,12 +5521,12 @@ Use function list is `wl-summary-write-current-folder-functions'."
 (defun wl-summary-jump-to-current-message ()
   (interactive)
   (let (message-buf message-win)
 (defun wl-summary-jump-to-current-message ()
   (interactive)
   (let (message-buf message-win)
-    (if (setq message-buf wl-message-buffer)
+    (if (setq message-buf (get-buffer wl-message-buf-name))
        (if (setq message-win (get-buffer-window message-buf))
            (select-window message-win)
        (if (setq message-win (get-buffer-window message-buf))
            (select-window message-win)
-         (wl-message-select-buffer wl-message-buffer))
+         (wl-select-buffer (get-buffer wl-message-buf-name)))
       (wl-summary-redisplay)
       (wl-summary-redisplay)
-      (wl-message-select-buffer wl-message-buffer))
+      (wl-select-buffer (get-buffer wl-message-buf-name)))
     (goto-char (point-min))))
 
 (defun wl-summary-cancel-message ()
     (goto-char (point-min))))
 
 (defun wl-summary-cancel-message ()
@@ -5280,7 +5541,7 @@ Use function list is `wl-summary-write-current-folder-functions'."
          (set-buffer message-buf))
       (unless (wl-message-news-p)
        (set-buffer summary-buf)
          (set-buffer message-buf))
       (unless (wl-message-news-p)
        (set-buffer summary-buf)
-       (if (and (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder)
+       (if (and (eq (elmo-folder-get-type wl-summary-buffer-folder-name)
                     'nntp)
                 (y-or-n-p "Cannot get Newsgroups. Fetch again? "))
            (progn
                     'nntp)
                 (y-or-n-p "Cannot get Newsgroups. Fetch again? "))
            (progn
@@ -5329,7 +5590,7 @@ Use function list is `wl-summary-write-current-folder-functions'."
        (set-buffer message-buf))
     (unless (wl-message-news-p)
       (set-buffer summary-buf)
        (set-buffer message-buf))
     (unless (wl-message-news-p)
       (set-buffer summary-buf)
-      (if (and (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder)
+      (if (and (eq (elmo-folder-get-type wl-summary-buffer-folder-name)
                   'nntp)
               (y-or-n-p "Cannot get Newsgroups. Fetch again? "))
          (progn
                   'nntp)
               (y-or-n-p "Cannot get Newsgroups. Fetch again? "))
          (progn
@@ -5432,7 +5693,10 @@ Use function list is `wl-summary-write-current-folder-functions'."
       (if (or (not (interactive-p))
              (y-or-n-p "Print ok? "))
          (progn
       (if (or (not (interactive-p))
              (y-or-n-p "Print ok? "))
          (progn
-           (let ((buffer (generate-new-buffer " *print*")))
+           (let* ((message-buffer (get-buffer wl-message-buf-name))
+;;;               (summary-buffer (get-buffer wl-summary-buffer-name))
+                  (buffer (generate-new-buffer " *print*")))
+             (set-buffer message-buffer)
              (copy-to-buffer buffer (point-min) (point-max))
              (set-buffer buffer)
              (funcall wl-print-buffer-func)
              (copy-to-buffer buffer (point-min) (point-max))
              (set-buffer buffer)
              (funcall wl-print-buffer-func)
@@ -5449,17 +5713,18 @@ Use function list is `wl-summary-write-current-folder-functions'."
        (let ((summary-buffer (current-buffer))
              wl-break-pages)
          (save-excursion
        (let ((summary-buffer (current-buffer))
              wl-break-pages)
          (save-excursion
-           (wl-summary-set-message-buffer-or-redisplay)
-           ;; (wl-summary-redisplay-internal)
-           (let* ((buffer (generate-new-buffer " *print*"))
+;;;        (wl-summary-set-message-buffer-or-redisplay)
+           (wl-summary-redisplay-internal)
+           (let* ((message-buffer (get-buffer wl-message-buf-name))
+                  (buffer (generate-new-buffer " *print*"))
                   (entity (progn
                             (set-buffer summary-buffer)
                             (assoc (cdr (assq
                                          (wl-summary-message-number)
                                          (elmo-msgdb-get-number-alist
                   (entity (progn
                             (set-buffer summary-buffer)
                             (assoc (cdr (assq
                                          (wl-summary-message-number)
                                          (elmo-msgdb-get-number-alist
-                                          (wl-summary-buffer-msgdb))))
+                                          wl-summary-buffer-msgdb)))
                                    (elmo-msgdb-get-overview
                                    (elmo-msgdb-get-overview
-                                    (wl-summary-buffer-msgdb)))))
+                                    wl-summary-buffer-msgdb))))
                   (wl-ps-subject
                    (and entity
                         (or (elmo-msgdb-overview-entity-get-subject entity)
                   (wl-ps-subject
                    (and entity
                         (or (elmo-msgdb-overview-entity-get-subject entity)
@@ -5471,7 +5736,7 @@ Use function list is `wl-summary-write-current-folder-functions'."
                    (and entity
                         (or (elmo-msgdb-overview-entity-get-date entity) ""))))
              (run-hooks 'wl-ps-preprint-hook)
                    (and entity
                         (or (elmo-msgdb-overview-entity-get-date entity) ""))))
              (run-hooks 'wl-ps-preprint-hook)
-             (set-buffer wl-message-buffer)
+             (set-buffer message-buffer)
              (copy-to-buffer buffer (point-min) (point-max))
              (set-buffer buffer)
              (unwind-protect
              (copy-to-buffer buffer (point-min) (point-max))
              (set-buffer buffer)
              (unwind-protect
@@ -5490,24 +5755,119 @@ Use function list is `wl-summary-write-current-folder-functions'."
     (fset 'wl-summary-print-message 'wl-summary-print-message-with-ps-print))
 
 (defun wl-summary-folder-info-update ()
     (fset 'wl-summary-print-message 'wl-summary-print-message-with-ps-print))
 
 (defun wl-summary-folder-info-update ()
-  (let ((folder (elmo-string (wl-summary-buffer-folder-name)))
+  (let ((folder (elmo-string wl-summary-buffer-folder-name))
        (num-db (elmo-msgdb-get-number-alist
        (num-db (elmo-msgdb-get-number-alist
-                (wl-summary-buffer-msgdb))))
+                wl-summary-buffer-msgdb)))
     (wl-folder-set-folder-updated folder
                                  (list 0
                                        (+ wl-summary-buffer-unread-count
                                           wl-summary-buffer-new-count)
                                        (length num-db)))))
 
     (wl-folder-set-folder-updated folder
                                  (list 0
                                        (+ wl-summary-buffer-unread-count
                                           wl-summary-buffer-new-count)
                                        (length num-db)))))
 
-(defun wl-summary-get-original-buffer ()
-  "Get original buffer for the current summary."
-  (save-excursion
-    (wl-summary-set-message-buffer-or-redisplay)
-    (wl-message-get-original-buffer)))
+(defun wl-summary-get-newsgroups ()
+  (let ((spec-list (elmo-folder-get-primitive-spec-list
+                   (elmo-string wl-summary-buffer-folder-name)))
+       ng-list)
+    (while spec-list
+      (when (eq (caar spec-list) 'nntp)
+       (wl-append ng-list (list (nth 1 (car spec-list)))))
+      (setq spec-list (cdr spec-list)))
+    ng-list))
+
+(defun wl-summary-set-crosspost (&optional type redisplay)
+  (let* ((number (wl-summary-message-number))
+        (spec (elmo-folder-number-get-spec wl-summary-buffer-folder-name
+                                           number))
+        (folder (nth 1 spec))
+        message-buf newsgroups)
+    (when (eq (car spec) 'nntp)
+      (if redisplay
+         (wl-summary-redisplay))
+      (save-excursion
+       (if (setq message-buf (wl-message-get-original-buffer))
+           (set-buffer message-buf))
+       (setq newsgroups (std11-field-body "newsgroups")))
+      (when newsgroups
+       (let* ((msgdb wl-summary-buffer-msgdb)
+              (num-db (elmo-msgdb-get-number-alist msgdb))
+              (ng-list (wl-summary-get-newsgroups)) ;; for multi folder
+              crosspost-folders)
+         (when (setq crosspost-folders
+                     (elmo-list-delete ng-list
+                                       (wl-parse-newsgroups newsgroups t)))
+           (elmo-crosspost-message-set (cdr (assq number num-db)) ;;message-id
+                                       crosspost-folders
+                                       type) ;;not used
+           (setq wl-crosspost-alist-modified t)))))))
+
+(defun wl-summary-is-crosspost-folder (spec-list fld-list)
+  (let (fld flds)
+    (while spec-list
+      (if (and (eq (caar spec-list) 'nntp)
+              (member (setq fld (nth 1 (car spec-list))) fld-list))
+         (wl-append flds (list fld)))
+      (setq spec-list (cdr spec-list)))
+    flds))
+
+(defun wl-summary-update-crosspost ()
+  (let* ((msgdb wl-summary-buffer-msgdb)
+        (number-alist (elmo-msgdb-get-number-alist msgdb))
+        (mark-alist (elmo-msgdb-get-mark-alist msgdb))
+        (spec-list (elmo-folder-get-primitive-spec-list
+                    (elmo-string wl-summary-buffer-folder-name)))
+        (alist elmo-crosspost-message-alist)
+        (crossed 0)
+        mark ngs num)
+    (when (assq 'nntp spec-list)
+      (while alist
+       (when (setq ngs
+                   (wl-summary-is-crosspost-folder
+                    spec-list
+                    (nth 1 (car alist))))
+         (when (setq num (car (rassoc (caar alist) number-alist)))
+           (if (and (setq mark (cadr (assq num mark-alist)))
+                    (member mark (list wl-summary-new-mark
+                                       wl-summary-unread-uncached-mark
+                                       wl-summary-unread-cached-mark)))
+               (setq crossed (1+ crossed)))
+           (if (wl-summary-jump-to-msg num)
+               (wl-summary-mark-as-read t);; opened
+             (wl-summary-mark-as-read t nil nil num)));; closed
+         ;; delete if message does't exists.
+         (elmo-crosspost-message-delete (caar alist) ngs)
+         (setq wl-crosspost-alist-modified t))
+       (setq alist (cdr alist))))
+    (if (> crossed 0)
+       crossed)))
+
+(defun wl-crosspost-alist-load ()
+  (setq elmo-crosspost-message-alist (elmo-crosspost-alist-load))
+  (setq wl-crosspost-alist-modified nil))
+
+(defun wl-crosspost-alist-save ()
+  (when wl-crosspost-alist-modified
+    ;; delete non-exists newsgroups
+    (let ((alist elmo-crosspost-message-alist)
+         newsgroups)
+      (while alist
+       (setq newsgroups
+             (elmo-delete-if
+              '(lambda (x)
+                 (not (intern-soft x wl-folder-newsgroups-hashtb)))
+              (nth 1 (car alist))))
+       (if newsgroups
+           (setcar (cdar alist) newsgroups)
+         (setq elmo-crosspost-message-alist
+               (delete (car alist) elmo-crosspost-message-alist)))
+       (setq alist (cdr alist)))
+      (elmo-crosspost-alist-save elmo-crosspost-message-alist)
+      (setq wl-crosspost-alist-modified nil))))
 
 (defun wl-summary-pack-number (&optional arg)
   (interactive "P")
 
 (defun wl-summary-pack-number (&optional arg)
   (interactive "P")
-  (elmo-folder-pack-numbers wl-summary-buffer-elmo-folder)
+  (setq wl-summary-buffer-msgdb
+       (elmo-pack-number
+        wl-summary-buffer-folder-name wl-summary-buffer-msgdb arg))
   (let (wl-use-scoring)
     (wl-summary-rescan)))
 
   (let (wl-use-scoring)
     (wl-summary-rescan)))
 
@@ -5526,7 +5886,7 @@ Use function list is `wl-summary-write-current-folder-functions'."
        (set-buffer summary-buf)
        (wl-summary-jump-to-msg (car mlist))
        (wl-summary-redisplay)
        (set-buffer summary-buf)
        (wl-summary-jump-to-msg (car mlist))
        (wl-summary-redisplay)
-       (set-buffer (setq orig-buf (wl-summary-get-original-buffer)))
+       (set-buffer (setq orig-buf (wl-message-get-original-buffer)))
        (goto-char (point-min))
        (cond ((= i 1) ; first
               (if (setq filename (wl-message-uu-substring
        (goto-char (point-min))
        (cond ((= i 1) ; first
               (if (setq filename (wl-message-uu-substring
@@ -5579,41 +5939,40 @@ Use function list is `wl-summary-write-current-folder-functions'."
                (message "Saved as %s" filename)))
        (kill-buffer tmp-buf)))))
 
                (message "Saved as %s" filename)))
        (kill-buffer tmp-buf)))))
 
-;; Someday
-;; (defun wl-summary-drop-unsync ()
-;;   "Drop all unsync messages."
-;;   (interactive)
-;;   (if (elmo-folder-pipe-p (wl-summary-buffer-folder-name))
-;;       (error "You cannot drop unsync messages in this folder"))
-;;   (if (or (not (interactive-p))
-;;       (y-or-n-p "Drop all unsync messages? "))
-;;       (let* ((folder-list (elmo-folder-get-primitive-folder-list
-;;                        (wl-summary-buffer-folder-name)))
-;;          (is-multi (elmo-multi-p (wl-summary-buffer-folder-name)))
-;;          (sum 0)
-;;          (multi-num 0)
-;;          pair)
-;;     (message "Dropping...")
-;;     (while folder-list
-;;       (setq pair (elmo-folder-message-numbers (car folder-list)))
-;;       (when is-multi ;; dirty hack...
-;;         (incf multi-num)
-;;         (setcar pair (+ (* multi-num elmo-multi-divide-number)
-;;                         (car pair))))
-;;       (elmo-msgdb-set-number-alist
-;;        (wl-summary-buffer-msgdb)
-;;        (nconc
-;;         (elmo-msgdb-get-number-alist (wl-summary-buffer-msgdb))
-;;         (list (cons (car pair) nil))))
-;;       (setq sum (+ sum (cdr pair)))
-;;       (setq folder-list (cdr folder-list)))
-;;     (wl-summary-set-message-modified)
-;;     (wl-folder-set-folder-updated (wl-summary-buffer-folder-name)
-;;                                   (list 0
-;;                                         (+ wl-summary-buffer-unread-count
-;;                                            wl-summary-buffer-new-count)
-;;                                         sum))
-;;     (message "Dropping...done"))))
+(defun wl-summary-drop-unsync ()
+  "Drop all unsync messages."
+  (interactive)
+  (if (elmo-folder-pipe-p wl-summary-buffer-folder-name)
+      (error "You cannot drop unsync messages in this folder"))
+  (if (or (not (interactive-p))
+         (y-or-n-p "Drop all unsync messages? "))
+      (let* ((folder-list (elmo-folder-get-primitive-folder-list
+                          wl-summary-buffer-folder-name))
+            (is-multi (elmo-multi-p wl-summary-buffer-folder-name))
+            (sum 0)
+            (multi-num 0)
+            pair)
+       (message "Dropping...")
+       (while folder-list
+         (setq pair (elmo-max-of-folder (car folder-list)))
+         (when is-multi ;; dirty hack...
+           (incf multi-num)
+           (setcar pair (+ (* multi-num elmo-multi-divide-number)
+                           (car pair))))
+         (elmo-msgdb-set-number-alist
+          wl-summary-buffer-msgdb
+          (nconc
+           (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb)
+           (list (cons (car pair) nil))))
+         (setq sum (+ sum (cdr pair)))
+         (setq folder-list (cdr folder-list)))
+       (wl-summary-set-message-modified)
+       (wl-folder-set-folder-updated wl-summary-buffer-folder-name
+                                     (list 0
+                                           (+ wl-summary-buffer-unread-count
+                                              wl-summary-buffer-new-count)
+                                           sum))
+       (message "Dropping...done"))))
 
 (defun wl-summary-default-get-next-msg (msg)
   (or (wl-summary-next-message msg
 
 (defun wl-summary-default-get-next-msg (msg)
   (or (wl-summary-next-message msg
@@ -5624,6 +5983,71 @@ Use function list is `wl-summary-write-current-folder-functions'."
                          wl-summary-buffer-number-list
                        (reverse wl-summary-buffer-number-list))))))
 
                          wl-summary-buffer-number-list
                        (reverse wl-summary-buffer-number-list))))))
 
+(defsubst wl-cache-prefetch-p (fld &optional num)
+  (cond ((and num wl-cache-prefetch-folder-type-list)
+        (memq
+         (elmo-folder-number-get-type fld num)
+         wl-cache-prefetch-folder-type-list))
+       (wl-cache-prefetch-folder-type-list
+        (let ((list wl-cache-prefetch-folder-type-list)
+              type)
+          (catch 'done
+            (while (setq type (pop list))
+              (if (elmo-folder-contains-type fld type)
+                  (throw 'done t))))))
+       ((consp wl-cache-prefetch-folder-list)
+        (wl-string-match-member fld wl-cache-prefetch-folder-list))
+       (t
+        wl-cache-prefetch-folder-list)))
+
+(defconst wl-cache-prefetch-idle-time
+  (if (featurep 'lisp-float-type) (/ (float 1) (float 10)) 1))
+
+(defun wl-cache-prefetch-next (fld msg &optional summary)
+  (if (wl-cache-prefetch-p fld)
+      (if elmo-use-buffer-cache
+;;;      (message "`elmo-use-buffer-cache' is nil, cache prefetch is disable.")
+       (save-excursion
+         (set-buffer (or summary (get-buffer wl-summary-buffer-name)))
+         (let ((next (funcall wl-cache-prefetch-get-next-func msg)))
+           (when (and next
+                      (wl-cache-prefetch-p fld next))
+             (if (not (fboundp 'run-with-idle-timer))
+                 (when (sit-for wl-cache-prefetch-idle-time)
+                   (wl-cache-prefetch-message fld next summary))
+               (run-with-idle-timer
+                wl-cache-prefetch-idle-time
+                nil
+                'wl-cache-prefetch-message fld next summary)
+               (sit-for 0))))))))
+
+(defvar wl-cache-prefetch-debug nil)
+(defun wl-cache-prefetch-message (folder msg summary &optional next)
+  (when (buffer-live-p summary)
+    (save-excursion
+      (set-buffer summary)
+      (when (string= folder wl-summary-buffer-folder-name)
+       (unless next
+         (setq next msg))
+       (let* ((msgdb wl-summary-buffer-msgdb)
+              (message-id (cdr (assq next
+                                     (elmo-msgdb-get-number-alist msgdb)))))
+         (if (not (elmo-buffer-cache-hit (list folder next message-id)))
+             (let* ((size (elmo-msgdb-overview-entity-get-size
+                           (assoc message-id
+                                  (elmo-msgdb-get-overview msgdb)))))
+               (when (or (elmo-local-file-p folder next)
+                         (not (and (integerp size)
+                                   wl-cache-prefetch-threshold
+                                   (>= size wl-cache-prefetch-threshold)
+                                   (not (elmo-cache-exists-p message-id
+                                                             folder next)))))
+                 (if wl-cache-prefetch-debug
+                     (message "Reading %d..." msg))
+                 (elmo-buffer-cache-message folder next msgdb nil 'unread)
+                 (if wl-cache-prefetch-debug
+                     (message "Reading %d... done" msg))))))))))
+
 (defun wl-summary-save-current-message ()
   "Save current message for `wl-summary-yank-saved-message'."
   (interactive)
 (defun wl-summary-save-current-message ()
   "Save current message for `wl-summary-yank-saved-message'."
   (interactive)