* wl-draft.el (wl-draft-create-contents): Fix docstring.
[elisp/wanderlust.git] / wl / wl-summary.el
index b2db735..227a820 100644 (file)
@@ -1,4 +1,4 @@
-;;; wl-summary.el -- Summary mode for Wanderlust.
+;;; wl-summary.el --- Summary mode for Wanderlust.
 
 ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
 ;; Copyright (C) 1998,1999,2000 Masahiro MURATA <muse@ba2.so-net.ne.jp>
 
 ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
 ;; Copyright (C) 1998,1999,2000 Masahiro MURATA <muse@ba2.so-net.ne.jp>
@@ -35,7 +35,7 @@
 ;;; Code:
 ;;
 
 ;;; Code:
 ;;
 
-(require 'elmo2)
+(require 'elmo)
 (require 'elmo-multi)
 (require 'wl-message)
 (require 'wl-vars)
 (require 'elmo-multi)
 (require 'wl-message)
 (require 'wl-vars)
 (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-msgdb       nil)
-(defvar wl-summary-buffer-folder-name 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-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)
@@ -80,7 +88,6 @@
 (defvar wl-summary-buffer-mime-charset  nil)
 (defvar wl-summary-buffer-weekday-name-lang  nil)
 (defvar wl-summary-buffer-thread-indent-set-alist  nil)
 (defvar wl-summary-buffer-mime-charset  nil)
 (defvar wl-summary-buffer-weekday-name-lang  nil)
 (defvar wl-summary-buffer-thread-indent-set-alist  nil)
-(defvar wl-summary-buffer-message-redisplay-func nil)
 (defvar wl-summary-buffer-view 'thread)
 (defvar wl-summary-buffer-message-modified nil)
 (defvar wl-summary-buffer-mark-modified nil)
 (defvar wl-summary-buffer-view 'thread)
 (defvar wl-summary-buffer-message-modified nil)
 (defvar wl-summary-buffer-mark-modified nil)
 (defvar wl-summary-buffer-prev-refile-destination nil)
 (defvar wl-summary-buffer-prev-copy-destination nil)
 (defvar wl-summary-buffer-saved-message nil)
 (defvar wl-summary-buffer-prev-refile-destination nil)
 (defvar wl-summary-buffer-prev-copy-destination 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-exit-func nil)
+(defvar wl-summary-buffer-prev-folder-function nil)
+(defvar wl-summary-buffer-next-folder-function nil)
+(defvar wl-summary-buffer-exit-function nil)
+(defvar wl-summary-buffer-next-message-function 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-youngest-child-str-internal nil)
 (defvar wl-thread-indent-level-internal nil)
 (defvar wl-thread-have-younger-brother-str-internal nil)
 (defvar wl-thread-youngest-child-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-message-regexp "^ *\\([0-9]+\\)")
+(defvar wl-summary-get-petname-function 'wl-address-get-petname-1)
+
+(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-msgdb)
+(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-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-vertical-str-internal)
 (make-variable-buffer-local 'wl-thread-horizontal-str-internal)
 (make-variable-buffer-local 'wl-thread-space-str-internal)
 (make-variable-buffer-local 'wl-thread-vertical-str-internal)
 (make-variable-buffer-local 'wl-thread-horizontal-str-internal)
 (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-exit-func)
+(make-variable-buffer-local 'wl-summary-buffer-prev-folder-function)
+(make-variable-buffer-local 'wl-summary-buffer-next-folder-function)
+(make-variable-buffer-local 'wl-summary-buffer-exit-function)
+(make-variable-buffer-local 'wl-summary-buffer-next-message-function)
+(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 (folder)
-  (` (concat wl-summary-buffer-name ":" (, folder))))
+(defmacro wl-summary-sticky-buffer-name (name)
+  (` (concat wl-summary-buffer-name ":" (, name))))
 
 (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))
                                 (eword-decode-string
                                  (if wl-use-petname
                                      (or
                                 (eword-decode-string
                                  (if wl-use-petname
                                      (or
-                                      (wl-address-get-petname-1 to)
+                                      (funcall wl-summary-get-petname-function to)
                                       (car
                                        (std11-extract-address-components to))
                                       to)
                                       (car
                                        (std11-extract-address-components to))
                                       to)
                         entity "newsgroups"))
               (setq retval (concat "Ng:" ng)))))
       (if wl-use-petname
                         entity "newsgroups"))
               (setq retval (concat "Ng:" ng)))))
       (if wl-use-petname
-         (setq retval (or (wl-address-get-petname-1 from)
+         (setq retval (or (funcall wl-summary-get-petname-function from)
                           (car (std11-extract-address-components from))
                           from))
        (setq retval from)))
                           (car (std11-extract-address-components from))
                           from))
        (setq retval from)))
 
 (defun wl-summary-simple-from (string)
   (if wl-use-petname
 
 (defun wl-summary-simple-from (string)
   (if wl-use-petname
-      (or (wl-address-get-petname-1 string)
+      (or (funcall wl-summary-get-petname-function string)
          (car (std11-extract-address-components string))
          string)
     string))
          (car (std11-extract-address-components string))
          string)
     string))
     "----"
     ("Writing Messages"
      ["Write a message" wl-summary-write t]
     "----"
     ("Writing Messages"
      ["Write a message" wl-summary-write t]
+     ["Write for current folder" wl-summary-write-current-folder t]
      ["Reply" wl-summary-reply t]
      ["Reply with citation" wl-summary-reply-with-citation t]
      ["Forward" wl-summary-forward t])
      ["Reply" wl-summary-reply t]
      ["Reply with citation" wl-summary-reply-with-citation t]
      ["Forward" wl-summary-forward t])
       (define-key wl-summary-mode-map [(shift button5)]
        'wl-summary-down)
       (define-key wl-summary-mode-map 'button2 'wl-summary-click))
       (define-key wl-summary-mode-map [(shift button5)]
        'wl-summary-down)
       (define-key wl-summary-mode-map 'button2 'wl-summary-click))
-  (if wl-on-nemacs
-      (defun wl-summary-setup-mouse ())
-    (defun wl-summary-setup-mouse ()
-      (define-key wl-summary-mode-map [mouse-4] 'wl-summary-prev)
-      (define-key wl-summary-mode-map [mouse-5] 'wl-summary-next)
-      (define-key wl-summary-mode-map [S-mouse-4] 'wl-summary-up)
-      (define-key wl-summary-mode-map [S-mouse-5] 'wl-summary-down)
-      (define-key wl-summary-mode-map [mouse-2] 'wl-summary-click))))
+  (defun wl-summary-setup-mouse ()
+    (define-key wl-summary-mode-map [mouse-4] 'wl-summary-prev)
+    (define-key wl-summary-mode-map [mouse-5] 'wl-summary-next)
+    (define-key wl-summary-mode-map [S-mouse-4] 'wl-summary-up)
+    (define-key wl-summary-mode-map [S-mouse-5] 'wl-summary-down)
+    (define-key wl-summary-mode-map [mouse-2] 'wl-summary-click)))
 
 (if wl-summary-mode-map
     ()
 
 (if wl-summary-mode-map
     ()
   (define-key wl-summary-mode-map "<"    'wl-summary-display-top)
   (define-key wl-summary-mode-map ">"    'wl-summary-display-bottom)
   (define-key wl-summary-mode-map "\177" 'wl-summary-prev-page)
   (define-key wl-summary-mode-map "<"    'wl-summary-display-top)
   (define-key wl-summary-mode-map ">"    'wl-summary-display-bottom)
   (define-key wl-summary-mode-map "\177" 'wl-summary-prev-page)
-  (unless wl-on-nemacs
-    (define-key wl-summary-mode-map [backspace] 'wl-summary-prev-page))
+  (define-key wl-summary-mode-map [backspace] 'wl-summary-prev-page)
   (define-key wl-summary-mode-map "\r"   'wl-summary-next-line-content)
   (define-key wl-summary-mode-map "\C-m" 'wl-summary-next-line-content)
   (define-key wl-summary-mode-map "/"    'wl-thread-open-close)
   (define-key wl-summary-mode-map "\r"   'wl-summary-next-line-content)
   (define-key wl-summary-mode-map "\C-m" 'wl-summary-next-line-content)
   (define-key wl-summary-mode-map "/"    'wl-thread-open-close)
   (define-key wl-summary-mode-map "-"    'wl-summary-prev-line-content)
   (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 "-"    'wl-summary-prev-line-content)
   (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 "G"    'wl-summary-goto-folder-sticky)
   (define-key wl-summary-mode-map "c"    'wl-summary-mark-as-read-all)
   (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)
 ;;;(define-key wl-summary-mode-map "e"     'wl-draft-open-file)
   (define-key wl-summary-mode-map "e"     'wl-summary-save)
   (define-key wl-summary-mode-map "\C-c\C-o" 'wl-jump-to-draft-buffer)
 ;;;(define-key wl-summary-mode-map "e"     'wl-draft-open-file)
   (define-key wl-summary-mode-map "e"     'wl-summary-save)
   (define-key wl-summary-mode-map "\C-c\C-o" 'wl-jump-to-draft-buffer)
+  (define-key wl-summary-mode-map "\C-c\C-a" 'wl-addrmgr)
+  (define-key wl-summary-mode-map "\C-c\C-p" 'wl-summary-previous-buffer)
+  (define-key wl-summary-mode-map "\C-c\C-n" 'wl-summary-next-buffer)
   (define-key wl-summary-mode-map "H"    'wl-summary-redisplay-all-header)
   (define-key wl-summary-mode-map "M"    'wl-summary-redisplay-no-mime)
   (define-key wl-summary-mode-map "B"    'wl-summary-burst)
   (define-key wl-summary-mode-map "H"    'wl-summary-redisplay-all-header)
   (define-key wl-summary-mode-map "M"    'wl-summary-redisplay-no-mime)
   (define-key wl-summary-mode-map "B"    'wl-summary-burst)
   (define-key wl-summary-mode-map "\M-t" 'wl-toggle-plugged)
   (define-key wl-summary-mode-map "\C-t" 'wl-plugged-change)
   ;;
   (define-key wl-summary-mode-map "\M-t" 'wl-toggle-plugged)
   (define-key wl-summary-mode-map "\C-t" 'wl-plugged-change)
   ;;
+  (define-key wl-summary-mode-map "\C-x\C-s" 'wl-summary-save-status)
   (wl-summary-setup-mouse)
   (easy-menu-define
    wl-summary-mode-menu
   (wl-summary-setup-mouse)
   (easy-menu-define
    wl-summary-mode-menu
   (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 &optional folder)
+(defun wl-summary-count-unread (mark-alist)
   (let ((new 0)
        (unread 0)
        mark)
   (let ((new 0)
        (unread 0)
        mark)
     (if (eq major-mode 'wl-summary-mode)
        (setq wl-summary-buffer-new-count new
              wl-summary-buffer-unread-count unread))
     (if (eq major-mode 'wl-summary-mode)
        (setq wl-summary-buffer-new-count new
              wl-summary-buffer-unread-count unread))
-    (+ new unread)))
+    (cons new unread)))
+
+(defun wl-summary-message-string (&optional use-cache)
+  "Return full body string of current message.
+If optional USE-CACHE is non-nil, use cache if exists."
+  (let ((number (wl-summary-message-number))
+       (folder wl-summary-buffer-elmo-folder))
+    (if (null number)
+       (message "No message.")
+      (elmo-set-work-buf
+       (elmo-message-fetch folder
+                          number
+                          (elmo-make-fetch-strategy
+                           'entire
+                           use-cache ; use cache
+                           nil ; save cache (should `t'?)
+                           (and
+                            use-cache
+                            (elmo-file-cache-get-path
+                             (elmo-message-field folder number 'message-id))))
+                          nil
+                          (current-buffer)
+                          'unread)
+       (buffer-string)))))
 
 (defun wl-summary-reedit (&optional arg)
   "Re-edit current message.
 
 (defun wl-summary-reedit (&optional arg)
   "Re-edit current message.
@@ -566,22 +598,15 @@ 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)
        (if (wl-summary-message-number)
-           (unwind-protect
-               (wl-draft-reedit (wl-summary-message-number))
+           (progn
+             (wl-draft-reedit (wl-summary-message-number))
              (if (wl-message-news-p)
                  (mail-position-on-field "Newsgroups")
                (mail-position-on-field "To"))
              (delete-other-windows)))
              (if (wl-message-news-p)
                  (mail-position-on-field "Newsgroups")
                (mail-position-on-field "To"))
              (delete-other-windows)))
-      (save-excursion
-       (let ((mmelmo-force-fetch-entire-message t))
-         (if (null (wl-summary-message-number))
-             (message "No message.")
-           (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 (wl-summary-message-string)))))
 
 (defun wl-summary-resend-bounced-mail ()
   "Re-mail the current message.
 
 (defun wl-summary-resend-bounced-mail ()
   "Re-mail the current message.
@@ -590,36 +615,36 @@ contains some mail you have written but has been bounced back to
 you."
   (interactive)
   (save-excursion
 you."
   (interactive)
   (save-excursion
-    (let ((mmelmo-force-fetch-entire-message t))
-      (wl-summary-set-message-buffer-or-redisplay)
-      (set-buffer (wl-message-get-original-buffer))
-      (goto-char (point-min))
-      (let ((case-fold-search nil))
-       (cond
-        ((and
-          (re-search-forward
-           (concat "^\\($\\|[Cc]ontent-[Tt]ype:[ \t]+multipart/report\\)") nil t)
-          (not (bolp))
-          (re-search-forward "boundary=\"\\([^\"]+\\)\"" nil t))
-         (let ((boundary (buffer-substring (match-beginning 1) (match-end 1)))
-               start)
-           (cond
-            ((and (setq start (re-search-forward
-                          (concat "^--" boundary "\n"
-                                  "[Cc]ontent-[Tt]ype:[ \t]+"
-                                  "\\(message/rfc822\\|text/rfc822-headers\\)\n"
-                                  "\\(.+\n\\)*\n") nil t))
-                  (re-search-forward
-                        (concat "\n\\(--" boundary "\\)--\n") nil t))
-             (wl-draft-edit-string (buffer-substring start (match-beginning 1))))
-            (t
-             (message "Seems no message/rfc822 part.")))))
-        ((let ((case-fold-search t))
-           (re-search-forward wl-rejected-letter-start nil t))
-         (skip-chars-forward " \t\n")
-         (wl-draft-edit-string (buffer-substring (point) (point-max))))
-        (t
-         (message "Does not appear to be a rejected letter.")))))))
+    (wl-summary-set-message-buffer-or-redisplay)
+    (set-buffer (wl-message-get-original-buffer))
+    (goto-char (point-min))
+    (let ((case-fold-search nil))
+      (cond
+       ((and
+        (re-search-forward
+         (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)))
+             start)
+         (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))
+                (re-search-forward
+                 (concat "\n\\(--" boundary "\\)--\n") nil t))
+           (wl-draft-edit-string (buffer-substring start (match-beginning 1))))
+          (t
+           (message "Seems no message/rfc822 part.")))))
+       ((let ((case-fold-search t))
+         (re-search-forward wl-rejected-letter-start nil t))
+       (skip-chars-forward " \t\n")
+       (wl-draft-edit-string (buffer-substring (point) (point-max))))
+       (t
+       (message "Does not appear to be a rejected letter."))))))
 
 (defun wl-summary-resend-message (address)
   "Resend the current message to ADDRESS."
 
 (defun wl-summary-resend-message (address)
   "Resend the current message to ADDRESS."
@@ -628,8 +653,7 @@ you."
       (message "No address specified.")
     (message "Resending message to %s..." address)
     (save-excursion
       (message "No address specified.")
     (message "Resending message to %s..." address)
     (save-excursion
-      (let ((mmelmo-force-fetch-entire-message t))
-       (wl-summary-set-message-buffer-or-redisplay)
+      (let ((original (wl-summary-get-original-buffer)))
        ;; We first set up a normal mail buffer.
        (set-buffer (get-buffer-create " *wl-draft-resend*"))
        (buffer-disable-undo (current-buffer))
        ;; We first set up a normal mail buffer.
        (set-buffer (get-buffer-create " *wl-draft-resend*"))
        (buffer-disable-undo (current-buffer))
@@ -649,7 +673,7 @@ you."
        (delete-region (point) (point-max))
        (let ((beg  (point)))
          ;; Insert the message to be resent.
        (delete-region (point) (point-max))
        (let ((beg  (point)))
          ;; Insert the message to be resent.
-         (insert-buffer-substring (wl-message-get-original-buffer))
+         (insert-buffer-substring original)
          (goto-char (point-min))
          (search-forward "\n\n")
          (forward-char -1)
          (goto-char (point-min))
          (search-forward "\n\n")
          (forward-char -1)
@@ -671,54 +695,36 @@ 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)
-  (setq wl-summary-buffer-folder-name folder)
+  (if (stringp folder)
+      (setq folder (wl-folder-get-elmo-folder folder)))
+  (setq wl-summary-buffer-elmo-folder 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 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)))
+           (wl-folder-get-petname (elmo-folder-name-internal folder))
+         (elmo-folder-name-internal folder)))
+  (make-local-variable 'wl-message-buffer)
   (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
-                                           folder)
+                                           (elmo-folder-name-internal 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
-            folder)
+            (elmo-folder-name-internal 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
-        folder))
-  (setq wl-summary-buffer-persistent (wl-folder-persistent-p folder))
+        (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)
+  ;; process duplicates.
+  (elmo-folder-set-process-duplicates-internal
+   folder (cdr (elmo-string-matched-assoc
+               (elmo-folder-name-internal folder)
+               wl-folder-process-duplicates-alist)))
   (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)
@@ -749,50 +755,12 @@ you."
 
 (defun wl-summary-mode ()
   "Major mode for reading threaded messages.
 
 (defun wl-summary-mode ()
   "Major mode for reading threaded messages.
-The keys that are defined for this mode are:\\<wl-summary-mode-map>
-
-SPC    Read messages.
-DEL    Back-scroll this message.
-.      Force to display this message.
-RET    Make this message scroll up with one line.
-M-RET -        Make this message scroll down with one line.
-
-C-n    Go to the next line.
-C-p    Go to the previous line.
-n      Move to below then display.
-N       Move to next unread.
-p      Move to above then display.
-P       Move to previous unread.
-s      Sync current folder.
-t       Same as 's' but force update.
-g      Go to the folder which you input.
-w      Write a message. A new draft is prepared.
-a      Answer to this message. A new draft is prepared in Draft mode.
-f      Forward this message to a third person. A new draft is prepared in
-       Draft mode and this message is automatically attached.
-v      Toggle \"Summary and Folder view\".
-        You can quickly put the delete marks since the next message is not
-        displayed.
-i       Prefetch message if uncached.
-o      Put the refile mark('o') on this message.
-!      Mark current message as unread.
-$      Toggle mark current message as important.
-d      Put the delete mark('D') on this message.
-c       Check all messages as read.
-*      Put the temporal mark('*') on this message.
-u      Cancel the mark on this message.
-x      Process marked messages.
-
-mo     Put the refile mark onto all messages marked with '*'.
-       This is very convenient to refile all messages picked by '?'.
-md     Put the delete mark onto all messages marked with '*'.
-mi      Prefetch all messages marked with '*'.
-mu     Unmark all target-marked messages.
-mt      Put the '*' mark onto all messages which belong to th current thread.
-ma      Put the '*' mark onto all messages.
-?      Pick messages according to a pick pattern which you input,
-       then put the '*' mark onto them.
-q      Goto folder mode."
+See Info under Wanderlust for full documentation.
+
+Special commands:
+\\{wl-summary-mode-map}
+
+Entering Folder mode calls the value of `wl-summary-mode-hook'."
   (interactive)
   (unless (interactive-p) (kill-all-local-variables))
   (setq major-mode 'wl-summary-mode)
   (interactive)
   (unless (interactive-p) (kill-all-local-variables))
   (setq major-mode 'wl-summary-mode)
@@ -804,15 +772,13 @@ q Goto folder mode."
 ;;;(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)
   (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))
   ;; 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))
@@ -865,7 +831,7 @@ q   Goto folder mode."
   "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))
@@ -878,6 +844,7 @@ q   Goto folder mode."
         expunged)
     (fset 'wl-summary-append-message-func-internal
          (wl-summary-get-append-message-func))
         expunged)
     (fset 'wl-summary-append-message-func-internal
          (wl-summary-get-append-message-func))
+    (wl-summary-buffer-number-column-detect nil)
     (erase-buffer)
     (message "Re-scanning...")
     (setq i 0)
     (erase-buffer)
     (message "Re-scanning...")
     (setq i 0)
@@ -889,13 +856,14 @@ q Goto folder mode."
                  (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)
     (setq wl-thread-entity-hashtb (elmo-make-hash (* (length overview) 2)))
     (setq wl-thread-entity-list nil)
     (setq wl-thread-entities nil)
                               overview))
     (setq curp overview)
     (set-buffer cur-buf)
     (setq wl-thread-entity-hashtb (elmo-make-hash (* (length overview) 2)))
     (setq wl-thread-entity-list nil)
     (setq wl-thread-entities nil)
+    (setq wl-summary-buffer-number-list nil)
     (setq wl-summary-buffer-target-mark-list nil)
     (setq wl-summary-buffer-refile-list nil)
     (setq wl-summary-buffer-delete-list nil)
     (setq wl-summary-buffer-target-mark-list nil)
     (setq wl-summary-buffer-refile-list nil)
     (setq wl-summary-buffer-delete-list nil)
@@ -925,10 +893,12 @@ q Goto folder mode."
        (setq wl-summary-delayed-update (cdr wl-summary-delayed-update))))
     (message "Constructing summary structure...done")
     (set-buffer cur-buf)
        (setq wl-summary-delayed-update (cdr wl-summary-delayed-update))))
     (message "Constructing summary structure...done")
     (set-buffer cur-buf)
-    (when (eq wl-summary-buffer-view 'thread)
-      (message "Inserting thread...")
-      (wl-thread-insert-top)
-      (message "Inserting thread...done"))
+    (if (eq wl-summary-buffer-view 'thread)
+       (progn
+         (message "Inserting thread...")
+         (wl-thread-insert-top)
+         (message "Inserting thread...done"))
+      (wl-summary-make-number-list))
     (when wl-use-scoring
       (setq wl-summary-scored nil)
       (wl-summary-score-headers nil msgdb
     (when wl-use-scoring
       (setq wl-summary-scored nil)
       (wl-summary-score-headers nil msgdb
@@ -938,7 +908,9 @@ q   Goto folder mode."
                 (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 mark-alist)
+    (wl-summary-count-unread
+     (elmo-msgdb-get-mark-alist
+      (elmo-folder-msgdb wl-summary-buffer-elmo-folder)))
     (wl-summary-update-modeline)
     (goto-char (point-max))
     (forward-line -1)
     (wl-summary-update-modeline)
     (goto-char (point-max))
     (forward-line -1)
@@ -988,10 +960,14 @@ q Goto folder mode."
       "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)
@@ -1000,41 +976,6 @@ q Goto folder mode."
 (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
@@ -1059,7 +1000,8 @@ q Goto folder mode."
   (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
-(defun wl-summary-save-status (&optional sticky)
+;; Note that folder is not commited here.
+(defun wl-summary-save-view ()
   ;; 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.
@@ -1067,9 +1009,17 @@ q        Goto folder mode."
             (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))
-    ;; save msgdb ...
-    (wl-summary-msgdb-save)))
+       (wl-summary-save-view-cache))))
+
+(defun wl-summary-save-status ()
+  "Save summary view and msgdb."
+  (interactive)
+  (if (interactive-p) (message "Saving summary status..."))
+  (wl-summary-save-view)
+  (elmo-folder-commit wl-summary-buffer-elmo-folder)
+  (elmo-folder-check wl-summary-buffer-elmo-folder)
+  (if wl-use-scoring (wl-score-save))
+  (if (interactive-p) (message "Saving summary status...done.")))
 
 (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."
@@ -1081,34 +1031,49 @@ q       Goto folder mode."
   (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)
-    (if wl-summary-buffer-exit-func
-       (funcall wl-summary-buffer-exit-func)
-      (wl-summary-cleanup-temp-marks sticky)
+    (run-hooks 'wl-summary-exit-pre-hook)
+    (if wl-summary-buffer-exit-function
+       (funcall wl-summary-buffer-exit-function)
+      (if (or force-exit (not sticky))
+         (wl-summary-cleanup-temp-marks sticky))
       (unwind-protect
          ;; save summary status
          (progn
       (unwind-protect
          ;; save summary status
          (progn
-           (wl-summary-save-status sticky)
-           (elmo-commit wl-summary-buffer-folder-name)
-           (if wl-use-scoring
-               (wl-score-save)))
+           (wl-summary-save-view)
+           (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))
+           (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 (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-message-buffer (get-buffer-window wl-message-buffer))
+           (delete-window (get-buffer-window wl-message-buffer)))
+       (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
@@ -1126,83 +1091,39 @@ q       Goto folder mode."
                (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)))))
 
              (kill-buffer summary-buf)))
        (run-hooks 'wl-summary-exit-hook)))))
 
-(defun wl-summary-sync-force-update (&optional unset-cursor)
+(defun wl-summary-sync-force-update (&optional unset-cursor no-check)
   (interactive)
   (interactive)
-  (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))
+  (wl-summary-sync-update unset-cursor nil no-check))
+
+(defsubst wl-summary-sync-all-init ()
+  (wl-summary-cleanup-temp-marks)
+  (erase-buffer)
+  (wl-summary-set-message-modified)
+  (wl-summary-set-mark-modified)
+  (setq wl-thread-entity-hashtb (elmo-make-hash
+                                (* (length (elmo-msgdb-get-number-alist
+                                            (wl-summary-buffer-msgdb))) 2)))
+  (setq wl-thread-entity-list nil)
+  (setq wl-thread-entities nil)
+  (setq wl-summary-buffer-number-list nil)
+  (setq wl-summary-buffer-target-mark-list nil)
+  (setq wl-summary-buffer-refile-list nil)
+  (setq wl-summary-buffer-copy-list nil)
+  (setq wl-summary-buffer-delete-list nil)
+  (wl-summary-buffer-number-column-detect nil))
 
 (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-folder-name)
+  (let* ((folder wl-summary-buffer-elmo-folder)
         (inhibit-read-only t)
         (buffer-read-only nil)
         (inhibit-read-only t)
         (buffer-read-only nil)
-        (msgdb-dir (elmo-msgdb-expand-path
-                    folder))
-        (range (or force-range (wl-summary-input-range folder)))
-        mes seen-list)
-    (cond ((string= range "all")
-          ;; initialize buffer local databases.
-          (unless (elmo-folder-plugged-p folder) ; forbidden
-            (error "Unplugged"))
-          (wl-summary-cleanup-temp-marks)
-          (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 wl-thread-entity-hashtb (elmo-make-hash
-                                         (* (length (elmo-msgdb-get-number-alist
-                                                     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-target-mark-list nil)
-          (setq wl-summary-buffer-refile-list nil)
-          (setq wl-summary-buffer-copy-list nil)
-          (setq wl-summary-buffer-delete-list nil)
-          (wl-summary-buffer-number-column-detect nil)
-          (elmo-clear-killed folder)
-          (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)))
-;;;       (wl-summary-sync-all folder t))
-         ((string= range "rescan")
+        (msgdb-dir (elmo-folder-msgdb-path folder))
+        (range (or force-range (wl-summary-input-range
+                                (elmo-folder-name-internal folder)))))
+    (cond ((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))))
@@ -1211,18 +1132,21 @@ q       Goto folder mode."
                 wl-use-scoring)
             (wl-summary-rescan)
             (and msg (wl-summary-jump-to-msg msg))))
                 wl-use-scoring)
             (wl-summary-rescan)
             (and msg (wl-summary-jump-to-msg msg))))
+         ((string= range "cache-status")
+          (let ((msg (wl-summary-message-number)))
+            (wl-summary-resume-cache-status)
+            (and msg (wl-summary-jump-to-msg msg))))
          ((or (string-match "last:" range)
               (string-match "first:" range))
          ((or (string-match "last:" range)
               (string-match "first:" range))
-          (wl-summary-goto-folder-subr (concat "/" range "/" folder)
-                                       'force-update nil nil t))
-         ((string= range "no-sync")
-          ;; do nothing.
-          )
+          (wl-summary-goto-folder-subr (concat "/" range "/"
+                                               (elmo-folder-name-internal
+                                                folder))
+           'force-update nil nil t))
          (t
          (t
-          (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))))))
+          (wl-summary-sync-update unset-cursor
+                                  (cond ((string= range "all") 'all)
+                                        ((string= range "all-visible")
+                                         'visible-only)))))))
 
 (defvar wl-summary-edit-addresses-candidate-fields
   ;; First element becomes default.
 
 (defvar wl-summary-edit-addresses-candidate-fields
   ;; First element becomes default.
@@ -1256,8 +1180,8 @@ q Goto folder mode."
   ;; returns nil if there's no change.
   (if (elmo-get-hash-val (downcase the-email) wl-address-petname-hash)
       (let (char)
   ;; returns nil if there's no change.
   (if (elmo-get-hash-val (downcase the-email) wl-address-petname-hash)
       (let (char)
-       (message (format "'%s' already exists. (e)dit/(d)elete/(c)ancel?"
-                        the-email))
+       (message "'%s' already exists. (e)dit/(d)elete/(c)ancel?"
+                the-email)
        (while (not (or (eq (setq char (read-char)) ?\r)
                        (eq char ?\n)
                        (eq char ? )
        (while (not (or (eq (setq char (read-char)) ?\r)
                        (eq char ?\n)
                        (eq char ? )
@@ -1272,27 +1196,29 @@ q       Goto folder mode."
              (eq char ?\r)
              (eq char ? ))
          ;; Change Addresses
              (eq char ?\r)
              (eq char ? ))
          ;; Change Addresses
-         (wl-address-petname-add-or-change
+         (wl-address-add-or-change
           the-email
           the-email
-          (elmo-get-hash-val the-email wl-address-petname-hash)
           (wl-address-header-extract-realname
           (wl-address-header-extract-realname
-           (cdr (assoc (downcase the-email)
-                       wl-address-completion-list))) t)
+           (cdr (assoc
+                 (let ((completion-ignore-case t) comp)
+                   (setq comp
+                         (try-completion the-email wl-address-completion-list))
+                   (if (equal comp t) the-email comp))
+                 wl-address-completion-list))))
          "edited")
         ((eq char ?d)
          ;; Delete Addresses
          (if (y-or-n-p (format "Delete '%s'? "
                                the-email))
              (progn
          "edited")
         ((eq char ?d)
          ;; Delete Addresses
          (if (y-or-n-p (format "Delete '%s'? "
                                the-email))
              (progn
-               (wl-address-petname-delete the-email)
+               (wl-address-delete the-email)
                "deleted")
            (message "")
            nil))
         (t (message "")
            nil)))
     ;; Add Petname
                "deleted")
            (message "")
            nil))
         (t (message "")
            nil)))
     ;; Add Petname
-    (wl-address-petname-add-or-change
-     the-email name-in-addr name-in-addr)
+    (wl-address-add-or-change the-email name-in-addr)
     "added"))
 
 (defun wl-summary-edit-addresses (&optional addr-str)
     "added"))
 
 (defun wl-summary-edit-addresses (&optional addr-str)
@@ -1303,41 +1229,40 @@ 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
-      (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)))
+      (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)))
 ;;; 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.
@@ -1353,102 +1278,78 @@ 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)))
-          (ov (assoc message-id
-                     (elmo-msgdb-get-overview msgdb)))
+          (ov (elmo-msgdb-overview-get-entity message-id msgdb))
           (entity ov)
           (size (elmo-msgdb-overview-entity-get-size ov))
           (inhibit-read-only t)
           (buffer-read-only nil)
           (entity ov)
           (size (elmo-msgdb-overview-entity-get-size ov))
           (inhibit-read-only t)
           (buffer-read-only nil)
+          (file-cached (elmo-file-cache-exists-p message-id))
           (force-read (and size
                            (or (null wl-prefetch-threshold)
                                (< size wl-prefetch-threshold))))
           mark new-mark)
           (force-read (and size
                            (or (null wl-prefetch-threshold)
                                (< size wl-prefetch-threshold))))
           mark new-mark)
-      (if (or arg
-             (null (elmo-cache-exists-p message-id)))
-         (unwind-protect
-             (progn
-               (when (and size (not force-read) wl-prefetch-confirm)
-                 (setq force-read
-                       (save-restriction
-                         (widen)
-                         (y-or-n-p
-                          (format
-                           "Message from %s has %d bytes.  Prefetch it? "
-                           (concat
-                            "[ "
-                            (save-match-data
-                              (wl-set-string-width
-                               wl-from-width
-                               (wl-summary-from-func-internal
-                                (eword-decode-string
-                                 (elmo-delete-char
-                                  ?\"
-                                  (or
-                                   (elmo-msgdb-overview-entity-get-from ov)
-                                   "??")))))) " ]")
-                           size))))
-                 (message ""))         ; flush.
-               (setq mark (cadr (assq number mark-alist)))
-               (if force-read
-                   (save-excursion
-                     (save-match-data
-                       (if (and (null (elmo-folder-plugged-p
-                                       wl-summary-buffer-folder-name))
-                                elmo-enable-disconnected-operation)
-                           (progn;; append-queue for offline
-                             (elmo-dop-prefetch-msgs
-                              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
-                         (elmo-prefetch-msg wl-summary-buffer-folder-name
-                                            number
-                                            (wl-message-get-original-buffer)
-                                            msgdb)
-                         (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)
-                                ((string= mark wl-summary-read-uncached-mark)
-                                 nil)
-                                (t mark))))
-                       (setq mark-alist (elmo-msgdb-mark-set
-                                         mark-alist number new-mark))
-                       (or new-mark (setq new-mark " "))
-                       (elmo-msgdb-set-mark-alist msgdb mark-alist)
-                       (wl-summary-set-mark-modified)
-                       (wl-summary-update-modeline)
-                       (wl-folder-update-unread
-                        wl-summary-buffer-folder-name
-                        (+ wl-summary-buffer-unread-count
-                           wl-summary-buffer-new-count)))
-                     new-mark))))))))
+      (unwind-protect
+         (progn
+           (when (and (or arg (not file-cached))
+                      size (not force-read) wl-prefetch-confirm)
+             (setq force-read
+                   (save-restriction
+                     (widen)
+                     (y-or-n-p
+                      (format
+                       "Message from %s has %d bytes.  Prefetch it? "
+                       (concat
+                        "[ "
+                        (save-match-data
+                          (wl-set-string-width
+                           wl-summary-from-width
+                           (wl-summary-from-func-internal
+                            (eword-decode-string
+                             (elmo-delete-char
+                              ?\"
+                              (or
+                               (elmo-msgdb-overview-entity-get-from ov)
+                               "??")))))) " ]")
+                       size))))
+             (message ""))             ; flush.
+           (setq mark (cadr (assq number mark-alist)))
+           (if force-read
+               (save-excursion
+                 (save-match-data
+                   ;; online
+                   (if (or arg (not file-cached))
+                       (elmo-message-encache
+                        wl-summary-buffer-elmo-folder
+                        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)
+                          ((string= mark wl-summary-read-uncached-mark)
+                           nil)
+                          (t mark)))
+                   (setq mark-alist (elmo-msgdb-mark-set
+                                     mark-alist number new-mark))
+                   (or new-mark (setq new-mark " "))
+                   (elmo-msgdb-set-mark-alist msgdb mark-alist)
+                   (wl-summary-set-mark-modified)
+                   (wl-summary-update-modeline)
+                   (wl-folder-update-unread
+                    (wl-summary-buffer-folder-name)
+                    (+ wl-summary-buffer-unread-count
+                       wl-summary-buffer-new-count)))
+                 new-mark)))))))
 
 ;;(defvar wl-summary-message-uncached-marks
 ;;  (list wl-summary-new-mark
 
 ;;(defvar wl-summary-message-uncached-marks
 ;;  (list wl-summary-new-mark
@@ -1471,15 +1372,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-cache-exists-p
+                        (null (elmo-file-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))
@@ -1525,16 +1426,17 @@ 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)
+             (beg (match-beginning 2))
+             (end (match-end 2))
              mark)
          (setq mark (wl-summary-prefetch-msg
                      (string-to-int (wl-match-buffer 1)) arg))
          (when mark
              mark)
          (setq mark (wl-summary-prefetch-msg
                      (string-to-int (wl-match-buffer 1)) arg))
          (when mark
-           (delete-region (match-beginning 2)
-                          (match-end 2))
+           (delete-region beg end)
            (insert mark)
            (if wl-summary-highlight
                (wl-highlight-summary-current-line)))
            (insert mark)
            (if wl-summary-highlight
                (wl-highlight-summary-current-line)))
@@ -1634,7 +1536,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)
@@ -1667,7 +1569,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)
@@ -1698,16 +1600,16 @@ 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-folder-name)
+      (let* ((folder wl-summary-buffer-elmo-folder)
             (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))
             (malist mark-alist)
 ;;;         (number-alist (elmo-msgdb-get-number-alist msgdb))
             (mark-alist (elmo-msgdb-get-mark-alist msgdb))
             (malist mark-alist)
@@ -1716,17 +1618,21 @@ 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-mark-as-read folder (wl-summary-collect-unread mark-alist)
-                          msgdb)
+       (elmo-folder-mark-as-read folder
+                                 (elmo-folder-list-unreads
+                                  folder
+                                  (list wl-summary-unread-cached-mark
+                                        wl-summary-unread-uncached-mark
+                                        wl-summary-new-mark)))
        (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-use-cache-p folder msg))
+             (if (or (not (elmo-message-use-cache-p folder msg))
                      (string= mark wl-summary-unread-cached-mark))
                  (progn
                    (insert " ")
                      (string= mark wl-summary-unread-cached-mark))
                  (progn
                    (insert " ")
@@ -1750,7 +1656,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)
@@ -1763,15 +1669,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-folder-name)
-          (msgdb wl-summary-buffer-msgdb)
+          (folder wl-summary-buffer-elmo-folder)
+          (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
@@ -1789,9 +1695,11 @@ 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-cache-delete (cdr (assq number number-alist))
-                              wl-summary-buffer-folder-name
-                              number)
+           (elmo-file-cache-delete
+            (elmo-file-cache-get-path
+             (elmo-message-field wl-summary-buffer-elmo-folder
+                                 number
+                                 'message-id)))
            (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)
@@ -1803,9 +1711,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-folder-name)
+  (let* ((folder wl-summary-buffer-elmo-folder)
         (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)
@@ -1815,16 +1723,16 @@ 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-cache-exists-p msgid folder msg)
+       (if (elmo-file-cache-exists-p msgid)
            (if (or
                 (string= mark wl-summary-unread-uncached-mark) ; U -> !
            (if (or
                 (string= mark wl-summary-unread-uncached-mark) ; U -> !
-                (string= mark wl-summary-new-mark)             ; N -> !
+                (string= mark wl-summary-new-mark)             ; N -> !
                 )
                (setq set-mark wl-summary-unread-cached-mark)
              (if (string= mark wl-summary-read-uncached-mark)  ; u -> ' '
                 )
                (setq set-mark wl-summary-unread-cached-mark)
              (if (string= mark wl-summary-read-uncached-mark)  ; u -> ' '
@@ -1852,7 +1760,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)))
@@ -1880,7 +1788,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))
@@ -1891,7 +1799,7 @@ If ARG is non-nil, checking is omitted."
       (while mark-alist
        (setq entity (car mark-alist))
        (if (setq msg-num (car (rassoc (car entity) number-alist)))
       (while mark-alist
        (setq entity (car mark-alist))
        (if (setq msg-num (car (rassoc (car entity) number-alist)))
-           (progn 
+           (progn
 ;;;          (goto-char (point-min))
              (if (re-search-forward (format "^ *%s \\( \\)" msg-num) nil t)
                  (progn
 ;;;          (goto-char (point-min))
              (if (re-search-forward (format "^ *%s \\( \\)" msg-num) nil t)
                  (progn
@@ -1937,7 +1845,8 @@ If ARG is non-nil, checking is omitted."
              (progn
                (delete-region (match-beginning 0) (match-end 0))
                (delete-char 1) ; delete '\n'
              (progn
                (delete-region (match-beginning 0) (match-end 0))
                (delete-char 1) ; delete '\n'
-               )))
+               (setq wl-summary-buffer-number-list
+                     (delq (car msgs) wl-summary-buffer-number-list)))))
        (when (and deleting-info
                   (> len elmo-display-progress-threshold))
          (setq i (1+ i))
        (when (and deleting-info
                   (> len elmo-display-progress-threshold))
          (setq i (1+ i))
@@ -1951,10 +1860,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)
@@ -1969,11 +1878,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-use-cache-p wl-summary-buffer-folder-name
-                             (caar mark-alist))
+       (if (elmo-message-use-cache-p wl-summary-buffer-elmo-folder
+                                     (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))
@@ -2063,29 +1972,26 @@ 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 ((plugged (elmo-folder-plugged-p wl-summary-buffer-folder-name))
-       (last-progress 0)
+  (let ((last-progress 0)
        (i 0)
        (i 0)
-       mark-alist unread-marks msgs mark importants unreads
-       importants-in-db unreads-in-db has-imap4 diff diffs
+       mark-alist unread-marks importants unreads
+       importants-in-db unreads-in-db diff diffs
        mes num-ma progress)
     ;; synchronize marks.
        mes num-ma progress)
     ;; synchronize marks.
-    (when (not (eq (elmo-folder-get-type
-                   wl-summary-buffer-folder-name)
+    (when (not (eq (elmo-folder-type-internal
+                   wl-summary-buffer-elmo-folder)
                   '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)
-            num-ma (length mark-alist)
-           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)
+           mark-alist (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))
+           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
                     unread-marks))
       (while mark-alist
        (if (string= (cadr (car mark-alist))
                     unread-marks))
       (while mark-alist
        (if (string= (cadr (car mark-alist))
@@ -2130,256 +2036,185 @@ If ARG is non-nil, checking is omitted."
        (setq diffs (cdr diffs)))
       (if (interactive-p) (message mes)))))
 
        (setq diffs (cdr diffs)))
       (if (interactive-p) (message mes)))))
 
-(defun wl-summary-confirm-appends (appends)
-  (condition-case nil
-      (let ((len (length appends))
-           in)
-       (if (> len wl-summary-update-confirm-threshold)
-           (if (y-or-n-p (format "Too many messages(%d).  Continue? " len))
-               appends
-             (setq in wl-summary-update-confirm-threshold)
-             (catch 'end
-               (while t
-                 (setq in (read-from-minibuffer "Update number: "
-                                                (int-to-string in))
-                       in (string-to-int in))
-                 (if (< len in)
-                     (throw 'end len))
-                 (if (y-or-n-p (format "%d messages are disappeared.  OK? "
-                                       (max (- len in) 0)))
-                     (throw 'end in))))
-             (nthcdr (max (- len in) 0) appends))
-         appends))
-    (quit nil)
-    (error nil))) ;
-
-(defun wl-summary-sync-update3 (&optional seen-list unset-cursor)
-  "Update the summary view."
+(defun wl-summary-sync-update (&optional unset-cursor sync-all no-check)
+  "Update the summary view to the newest folder status."
   (interactive)
   (interactive)
-  (let* ((folder wl-summary-buffer-folder-name)
-        (cur-buf (current-buffer))
-        (msgdb wl-summary-buffer-msgdb)
-        (number-alist (elmo-msgdb-get-number-alist msgdb))
-        (mark-alist (elmo-msgdb-get-mark-alist msgdb))
-        (overview (elmo-msgdb-get-overview msgdb))
-;;;     (location (elmo-msgdb-get-location msgdb))
+  (let* ((folder wl-summary-buffer-elmo-folder)
         (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
-        in-folder
-        in-db curp
-        overview-append
-        entity ret-val crossed crossed2 sync-all
-        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).
-    (setq seen-list
-         (wl-summary-flush-pending-append-operations seen-list))
-    (goto-char (point-max))
-    (wl-folder-confirm-existence folder 'force)
-    (message "Checking folder diff...")
-    (elmo-commit folder)
-    (setq in-folder (elmo-list-folder folder))
-    (setq in-db (sort (mapcar 'car number-alist) '<))
-    (when (or (eq msgdb nil) ; trick for unplugged...
-             (and (null overview)
-                  (null number-alist)
-                  (null mark-alist)))
-      (setq sync-all t)
-      (wl-summary-set-message-modified)
-      (wl-summary-set-mark-modified)
-      (erase-buffer))
-    (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")
-    ;; 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.
-       (setq delete-list
-             (wl-summary-delete-canceled-msgs-from-list delete-list msgdb)))
-    (if (or (equal diff '(nil nil))
-           (equal diff '(nil))
-           (and (eq (length delete-list) 0)
-                (eq (length initial-append-list) 0)))
+        overview number-alist mark-alist
+        curp num i new-msgdb
+        append-list delete-list crossed
+        update-thread update-top-list
+        expunged mes sync-result)
+    (unwind-protect
        (progn
        (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 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 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)
-      ;; 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)))
-      (setq num (length append-list))
-      (if append-list
-         (progn
-           (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
-                            msgdb result))
-             (setq result (cdr crossed))
-             (setq crossed (car crossed)))
-           (setq overview-append (car result))
-           (setq msgdb (elmo-msgdb-append msgdb result t))
-           ;; set these value for append-message-func
-           (setq overview (elmo-msgdb-get-overview msgdb))
-           (setq number-alist (elmo-msgdb-get-number-alist msgdb))
-           (setq mark-alist (elmo-msgdb-get-mark-alist 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 entity (car curp))
-             (when (setq update-thread
-                         (wl-summary-append-message-func-internal
-                          entity overview mark-alist
-                          (not sync-all)))
-               (wl-append update-top-list update-thread))
-             (if elmo-use-database
-                 (elmo-database-msgid-put
-                  (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
-                    'wl-summary-sync-update3 "Updating thread..."
-                    (/ (* i 100) num)))))
-           (when wl-summary-delayed-update
-             (while wl-summary-delayed-update
-               (message "Parent (%d) of message %d is no entity"
-                        (caar wl-summary-delayed-update)
-                        (elmo-msgdb-overview-entity-get-number
-                         (cdar wl-summary-delayed-update)))
-               (when (setq update-thread
-                           (wl-summary-append-message-func-internal
-                            (cdar wl-summary-delayed-update)
-                            overview mark-alist (not sync-all) t))
-                 (wl-append update-top-list update-thread))
-               (setq wl-summary-delayed-update
-                     (cdr wl-summary-delayed-update))))
-           (when (and (eq wl-summary-buffer-view 'thread)
-                      update-top-list)
-             (wl-thread-update-indent-string-thread
-              (elmo-uniq-list update-top-list)))
-           (message "Updating thread...done")
-;;;        (set-buffer cur-buf)
-           ))
-      (wl-summary-set-message-modified)
-      (wl-summary-set-mark-modified)
-      (setq wl-summary-buffer-msgdb msgdb)
-      (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)))
-    ;; 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 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)))
-       (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
-    (wl-folder-set-folder-updated folder (list 0
-                                              (wl-summary-count-unread
-                                               (elmo-msgdb-get-mark-alist
-                                                msgdb))
-                                              (length in-folder)))
-    (wl-summary-update-modeline)
-    (wl-summary-buffer-number-column-detect t)
-    ;;
-    (unless unset-cursor
-      (goto-char (point-min))
-      (if (not (wl-summary-cursor-down t))
-         (progn
-           (goto-char (point-max))
-           (forward-line -1))
-       (if (and wl-summary-highlight
-                (not (get-text-property (point) 'face)))
-           (save-excursion
-             (forward-line (- 0
-                              (or
-                               wl-summary-partial-highlight-above-lines
-                               wl-summary-highlight-partial-threshold)))
-             (wl-highlight-summary (point) (point-max))))))
-    (wl-delete-all-overlays)
-    (set-buffer-modified-p nil)
-    ret-val))
+         (unless wl-summary-buffer-elmo-folder
+           (error "(Internal error) Folder is not set:%s" (buffer-name
+                                                           (current-buffer))))
+         (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))
+         (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 no-check))
+         (setq new-msgdb (nth 0 sync-result))
+         (setq delete-list (nth 1 sync-result))
+         (setq crossed (nth 2 sync-result))
+         (if 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))
+       ;; 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"))
+               (when new-msgdb
+                 (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 i 0)
+                 ;; set these value for append-message-func
+                 (setq overview (elmo-msgdb-get-overview
+                                 (elmo-folder-msgdb folder)))
+                 (setq number-alist (elmo-msgdb-get-number-alist
+                                     (elmo-folder-msgdb folder)))
+                 (setq mark-alist (elmo-msgdb-get-mark-alist
+                                   (elmo-folder-msgdb folder)))
+                 (setq wl-summary-delayed-update nil)
+                 (elmo-kill-buffer wl-summary-search-buf-name)
+                 (while curp
+                   (setq entity (car curp))
+                   (when (setq update-thread
+                               (wl-summary-append-message-func-internal
+                                entity overview mark-alist
+                                (not sync-all)))
+                     (wl-append update-top-list update-thread))
+                   (if elmo-use-database
+                       (elmo-database-msgid-put
+                        (car entity) (elmo-folder-name-internal 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
+                          'wl-summary-sync-update "Updating thread..."
+                          (/ (* i 100) num)))))
+                 (when wl-summary-delayed-update
+                   (while wl-summary-delayed-update
+                     (message "Parent (%d) of message %d is no entity"
+                              (caar wl-summary-delayed-update)
+                              (elmo-msgdb-overview-entity-get-number
+                               (cdar wl-summary-delayed-update)))
+                     (when (setq update-thread
+                                 (wl-summary-append-message-func-internal
+                                  (cdar wl-summary-delayed-update)
+                                  overview mark-alist (not sync-all) t))
+                       (wl-append update-top-list update-thread))
+                     (setq wl-summary-delayed-update
+                           (cdr wl-summary-delayed-update))))
+                 (when (and (eq wl-summary-buffer-view 'thread)
+                            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
+                     (if (and (eq (length delete-list) 0)
+                              (eq num 0))
+                         (format
+                          "No updates for \"%s\"" (elmo-folder-name-internal
+                                                   folder))
+                       (format "Updated (-%d/+%d) message(s)"
+                               (length delete-list) num))))
+           (setq mes "Quit updating.")))
+      ;; synchronize marks.
+      (if (and wl-summary-auto-sync-marks sync-result)
+         (wl-summary-sync-marks))
+      ;; scoring
+      (when wl-use-scoring
+       (setq wl-summary-scored nil)
+       (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)))
+         (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 "."))))
+      ;; Update Folder mode
+      (wl-folder-set-folder-updated
+       (elmo-folder-name-internal folder)
+       (list 0
+            (let ((pair (wl-summary-count-unread
+                         (elmo-msgdb-get-mark-alist
+                          (elmo-folder-msgdb folder)))))
+              (+ (car pair) (cdr pair)))
+            (elmo-folder-messages folder)))
+      (wl-summary-update-modeline)
+      (wl-summary-buffer-number-column-detect t)
+      ;;
+      (unless unset-cursor
+       (goto-char (point-min))
+       (if (not (wl-summary-cursor-down t))
+           (progn
+             (goto-char (point-max))
+             (forward-line -1))
+         (if (and wl-summary-highlight
+                  (not (get-text-property (point) 'face)))
+             (save-excursion
+               (forward-line (- 0
+                                (or
+                                 wl-summary-partial-highlight-above-lines
+                                 wl-summary-highlight-partial-threshold)))
+               (wl-highlight-summary (point) (point-max))))))
+      (setq wl-summary-buffer-msgdb (elmo-folder-msgdb folder))
+      (wl-delete-all-overlays)
+      (set-buffer-modified-p nil)
+      (if mes (message "%s" mes)))))
 
 (defun wl-summary-set-score-mark (mark)
   (save-excursion
 
 (defun wl-summary-set-score-mark (mark)
   (save-excursion
@@ -2388,7 +2223,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 " "
@@ -2424,15 +2259,11 @@ If ARG is non-nil, checking is omitted."
                 (string-to-int
                  (read-from-minibuffer "Jump to Message(No.): ")))))
     (setq num (int-to-string num))
                 (string-to-int
                  (read-from-minibuffer "Jump to Message(No.): ")))))
     (setq num (int-to-string num))
-    (if (re-search-forward (concat "^[ \t]*" num "[^0-9]") nil t)
-       (progn
-         (beginning-of-line)
-         t)
-      (if (re-search-backward (concat "^[ \t]*" num "[^0-9]") nil t)
-         (progn
-           (beginning-of-line)
-           t)
-       nil))))
+    (beginning-of-line)
+    (if (or (re-search-forward (concat "^[ \t]*" num "[^0-9]") nil t)
+           (re-search-backward (concat "^[ \t]*" num "[^0-9]") nil t))
+       (progn (beginning-of-line) t)
+      nil)))
 
 (defun wl-summary-highlight-msgs (msgs)
   (save-excursion
 
 (defun wl-summary-highlight-msgs (msgs)
   (save-excursion
@@ -2455,75 +2286,39 @@ 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
       (setq dsts (cdr dsts)))))
 
 ;;;     result)
         )
     (while dsts
       (setq dsts (cdr dsts)))))
 
-(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-folder-name)
-            elmo-enable-disconnected-operation)
-    (let* ((resumed-list (elmo-dop-append-list-load
-                         wl-summary-buffer-folder-name t))
-          (append-list (elmo-dop-append-list-load
-                        wl-summary-buffer-folder-name))
-          (appends (append resumed-list append-list))
-          (number-alist (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb))
-          dels pair)
-      (when appends
-       (while appends
-         (if (setq pair (rassoc (car appends) number-alist))
-             (setq dels (append dels (list (car pair)))))
-         (setq appends (cdr appends)))
-       (when dels
-         (setq seen-list
-               (elmo-msgdb-add-msgs-to-seen-list-subr
-                dels
-                wl-summary-buffer-msgdb
-                (concat wl-summary-important-mark
-                        wl-summary-read-uncached-mark)
-                seen-list))
-         (message "Resuming summary status...")
-         (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
-       (elmo-dop-append-list-save wl-summary-buffer-folder-name nil t)
-       (when append-list
-         (elmo-dop-flush-pending-append-operations
-          wl-summary-buffer-folder-name append-list)))))
-  seen-list)
-
 (defun wl-summary-delete-all-msgs ()
   (interactive)
   (let ((cur-buf (current-buffer))
 (defun wl-summary-delete-all-msgs ()
   (interactive)
   (let ((cur-buf (current-buffer))
-       (dels (elmo-list-folder wl-summary-buffer-folder-name)))
+       (dels (elmo-folder-list-messages wl-summary-buffer-elmo-folder)))
     (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-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)
+           (elmo-folder-delete-messages
+            wl-summary-buffer-elmo-folder dels)
+           (elmo-msgdb-delete-msgs (wl-summary-buffer-msgdb)
+                                   dels)
+;;;        (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))
@@ -2540,7 +2335,7 @@ If ARG is non-nil, checking is omitted."
        nil))))
 
 (defun wl-summary-toggle-thread (&optional arg)
        nil))))
 
 (defun wl-summary-toggle-thread (&optional arg)
-  "Toggle thread status (T)hread and (S)equencial.
+  "Toggle thread status (T)hread and (S)equential.
 If ARG, without confirm."
   (interactive "P")
   (when (or arg
 If ARG, without confirm."
   (interactive "P")
   (when (or arg
@@ -2574,7 +2369,11 @@ If ARG, without confirm."
 
 (defun wl-summary-goto-folder (&optional arg)
   (interactive "P")
 
 (defun wl-summary-goto-folder (&optional arg)
   (interactive "P")
-  (wl-summary-goto-folder-subr nil nil nil arg t))
+  (wl-summary-goto-folder-subr nil nil nil nil t nil arg))
+
+(defun wl-summary-goto-folder-sticky ()
+  (interactive)
+  (wl-summary-goto-folder-subr nil nil nil t t))
 
 (defun wl-summary-goto-last-visited-folder ()
   (interactive)
 
 (defun wl-summary-goto-last-visited-folder ()
   (interactive)
@@ -2586,14 +2385,17 @@ 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 fld)
-  (if fld
-      (get-buffer (wl-summary-sticky-buffer-name fld))
+(defun wl-summary-sticky-p (&optional folder)
+  (if folder
+      (get-buffer (wl-summary-sticky-buffer-name
+                  (elmo-folder-name-internal folder)))
     (not (string= wl-summary-buffer-name (buffer-name)))))
 
     (not (string= wl-summary-buffer-name (buffer-name)))))
 
-(defun wl-summary-always-sticky-folder-p (fld)
+(defun wl-summary-always-sticky-folder-p (folder)
   (or (eq t wl-summary-always-sticky-folder-list)
   (or (eq t wl-summary-always-sticky-folder-list)
-      (wl-string-match-member fld wl-summary-always-sticky-folder-list)))
+      (wl-string-match-member
+       (elmo-folder-name-internal folder)
+       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."
@@ -2604,29 +2406,32 @@ 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-folder-name)
+       (folder wl-summary-buffer-elmo-folder)
        (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-msgdb
+                  wl-summary-buffer-elmo-folder
                   wl-summary-buffer-number-column
                   wl-summary-buffer-number-regexp
                   wl-summary-buffer-message-modified
                   wl-summary-buffer-mark-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-thread-modified
+                  wl-summary-buffer-number-list
+                  wl-summary-buffer-msgdb
+                  wl-summary-buffer-folder-name)
                 (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
@@ -2635,7 +2440,7 @@ If ARG, without confirm."
                      '(wl-summary-scored
                        wl-summary-default-score
                        wl-summary-important-above
                      '(wl-summary-scored
                        wl-summary-default-score
                        wl-summary-important-above
-                       wl-summary-temp-above
+                       wl-summary-target-above
                        wl-summary-mark-below
                        wl-summary-expunge-below))
                 (and (featurep 'wl-score)
                        wl-summary-mark-below
                        wl-summary-expunge-below))
                 (and (featurep 'wl-score)
@@ -2656,7 +2461,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)
@@ -2670,60 +2475,70 @@ 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 (folder &optional force-sticky)
+(defun wl-summary-get-buffer-create (name &optional force-sticky)
   (if force-sticky
       (get-buffer-create
   (if force-sticky
       (get-buffer-create
-       (wl-summary-sticky-buffer-name folder))
-    (or (get-buffer (wl-summary-sticky-buffer-name folder))
+       (wl-summary-sticky-buffer-name name))
+    (or (get-buffer (wl-summary-sticky-buffer-name name))
        (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-goto-folder-subr (&optional folder scan-type other-window
-                                             sticky interactive scoring)
+(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)))))
+
+(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))))
+
+(defsubst wl-summary-open-folder (folder)
+  ;; Select folder
+  (let ((elmo-mime-charset wl-summary-buffer-mime-charset))
+    (unwind-protect
+       (elmo-folder-open folder 'load-msgdb)
+      ;; For compatibility
+      (setq wl-summary-buffer-msgdb (elmo-folder-msgdb folder))
+      (setq wl-summary-buffer-folder-name (elmo-folder-name-internal
+                                          folder)))))
+
+(defun wl-summary-goto-folder-subr (&optional name scan-type other-window
+                                             sticky interactive scoring
+                                             force-exit)
   "Display target folder on summary."
   (interactive)
   (let* ((keep-cursor (memq this-command
                            wl-summary-keep-cursor-command))
   "Display target folder on summary."
   (interactive)
   (let* ((keep-cursor (memq this-command
                            wl-summary-keep-cursor-command))
-        (fld (or folder (wl-summary-read-folder wl-default-folder)))
-        (cur-fld wl-summary-buffer-folder-name)
-        buf mes hilit reuse-buf
+        (name (or name (wl-summary-read-folder wl-default-folder)))
+        (cur-fld wl-summary-buffer-elmo-folder)
+        folder buf mes hilit reuse-buf
         retval entity)
         retval entity)
-    (if (string= fld "")
-       (setq fld wl-default-folder))
-    (when (and (not (string= cur-fld fld)) ; folder is moved.
+    (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.
               (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)
-      (wl-summary-cleanup-temp-marks (wl-summary-sticky-p))
-      (wl-summary-save-status 'keep)) ;; keep current buffer, anyway.
-    (setq buf (wl-summary-get-buffer-create fld sticky))
+      (setq wl-summary-last-visited-folder (wl-summary-buffer-folder-name))
+      (run-hooks 'wl-summary-exit-pre-hook)
+      (if (or force-exit (not (wl-summary-sticky-p)))
+         (wl-summary-cleanup-temp-marks (wl-summary-sticky-p)))
+      (wl-summary-save-view)
+      (elmo-folder-commit wl-summary-buffer-elmo-folder)
+      (if (and (wl-summary-sticky-p) force-exit)
+         (kill-buffer (current-buffer))))
+    (setq buf (wl-summary-get-buffer-create (elmo-folder-name-internal folder)
+                                           sticky))
     (setq reuse-buf
          (save-excursion
            (set-buffer buf)
     (setq reuse-buf
          (save-excursion
            (set-buffer buf)
-           (string= fld wl-summary-buffer-folder-name)))
+           (string= (elmo-folder-name-internal folder)
+                    (wl-summary-buffer-folder-name))))
     (unwind-protect
        (if reuse-buf
            (if interactive
     (unwind-protect
        (if reuse-buf
            (if interactive
@@ -2734,7 +2549,7 @@ 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 fld)
+         (wl-summary-buffer-set-folder folder)
          (setq wl-summary-buffer-disp-msg nil)
          (setq wl-summary-buffer-last-displayed-msg nil)
          (setq wl-summary-buffer-current-msg nil)
          (setq wl-summary-buffer-disp-msg nil)
          (setq wl-summary-buffer-last-displayed-msg nil)
          (setq wl-summary-buffer-current-msg nil)
@@ -2742,14 +2557,13 @@ If ARG, without confirm."
                (inhibit-read-only t)
                (buffer-read-only nil))
            (erase-buffer)
                (inhibit-read-only t)
                (buffer-read-only nil))
            (erase-buffer)
-           ;; resume summary cache
+           ;; Resume summary view
            (if wl-summary-cache-use
            (if wl-summary-cache-use
-               (let* ((dir (elmo-msgdb-expand-path fld))
+               (let* ((dir (elmo-folder-msgdb-path folder))
                       (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)
-                   (as-binary-input-file
-                    (insert-file-contents cache))
+                   (insert-file-contents-as-binary cache)
                    (elmo-set-buffer-multibyte
                     default-enable-multibyte-characters)
                    (decode-mime-charset-region
                    (elmo-set-buffer-multibyte
                     default-enable-multibyte-characters)
                    (decode-mime-charset-region
@@ -2758,22 +2572,23 @@ If ARG, without confirm."
                  (when (file-exists-p view)
                    (setq wl-summary-buffer-view
                          (wl-summary-load-file-object view)))
                  (when (file-exists-p view)
                    (setq wl-summary-buffer-view
                          (wl-summary-load-file-object view)))
-                 (if (eq wl-summary-buffer-view 'thread)
-                     (wl-thread-resume-entity fld))))
-           ;; 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))))
+                 (wl-thread-resume-entity folder)
+                 (wl-summary-open-folder folder))
+             (setq wl-summary-buffer-view
+                   (wl-summary-load-file-object
+                    (expand-file-name wl-summary-view-file
+                                      (elmo-folder-msgdb-path folder))))
+             (wl-summary-open-folder folder)
+             (wl-summary-rescan))
            (wl-summary-count-unread
            (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-update-modeline)))
+      (unless (eq wl-summary-buffer-view 'thread)
+       (wl-summary-make-number-list))
       (wl-summary-buffer-number-column-detect t)
       (wl-summary-buffer-number-column-detect t)
-      (wl-summary-disp-msg fld (and reuse-buf keep-cursor))
+      (wl-summary-toggle-disp-msg (if wl-summary-buffer-disp-msg 'on 'off))
       (unless (and reuse-buf keep-cursor)
       (unless (and reuse-buf keep-cursor)
-       (setq hilit wl-summary-highlight)
+       ;(setq hilit wl-summary-highlight)
        (unwind-protect
            (let ((wl-summary-highlight (if reuse-buf wl-summary-highlight))
                  (wl-use-scoring
        (unwind-protect
            (let ((wl-summary-highlight (if reuse-buf wl-summary-highlight))
                  (wl-use-scoring
@@ -2781,7 +2596,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 fld)))
+                 (setq scan-type (wl-summary-get-sync-range folder)))
              (cond
               ((eq scan-type nil)
                (wl-summary-sync 'unset-cursor))
              (cond
               ((eq scan-type nil)
                (wl-summary-sync 'unset-cursor))
@@ -2790,32 +2605,42 @@ If ARG, without confirm."
               ((eq scan-type 'no-sync))
               ((or (eq scan-type 'force-update)
                    (eq scan-type 'update))
               ((eq scan-type 'no-sync))
               ((or (eq scan-type 'force-update)
                    (eq scan-type 'update))
-               (setq mes (wl-summary-sync-force-update 'unset-cursor)))))
+               (setq mes (wl-summary-sync-force-update
+                          'unset-cursor 'no-check)))))
          (if interactive
              (switch-to-buffer buf)
            (set-buffer buf))
          ;; stick always-sticky-folder
          (if interactive
              (switch-to-buffer buf)
            (set-buffer buf))
          ;; stick always-sticky-folder
-         (when (wl-summary-always-sticky-folder-p fld)
+         (when (wl-summary-always-sticky-folder-p folder)
            (or (wl-summary-sticky-p) (wl-summary-stick t)))
          (run-hooks 'wl-summary-prepared-pre-hook)
          (set-buffer-modified-p nil)
          (goto-char (point-min))
          (if (wl-summary-cursor-down t)
            (or (wl-summary-sticky-p) (wl-summary-stick t)))
          (run-hooks 'wl-summary-prepared-pre-hook)
          (set-buffer-modified-p nil)
          (goto-char (point-min))
          (if (wl-summary-cursor-down t)
-             (let ((unreadp (wl-thread-next-mark-p
-                             (wl-thread-entity-get-mark
-                              (wl-summary-message-number))
-                             wl-summary-move-order)))
-               (cond ((and wl-auto-select-first unreadp)
+             (let ((unreadp (wl-summary-next-message
+                             (wl-summary-message-number)
+                             '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)
+                     ((and wl-auto-prefetch-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 'prefetch-msg))
+                     ((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)
                (forward-line -1)
              (wl-summary-prev))
            (setq retval 'more-next))
                       (setq retval 'more-next))))
            (goto-char (point-max))
            (if (elmo-folder-plugged-p folder)
                (forward-line -1)
              (wl-summary-prev))
            (setq retval 'more-next))
-         (setq wl-summary-highlight hilit)
+         ;(setq wl-summary-highlight hilit)
          (if (and wl-summary-highlight
          (if (and wl-summary-highlight
+                  (not wl-summary-lazy-highlight)
                   (not reuse-buf))
              (if (and wl-summary-highlight-partial-threshold
                       (> (count-lines (point-min) (point-max))
                   (not reuse-buf))
              (if (and wl-summary-highlight-partial-threshold
                       (> (count-lines (point-min) (point-max))
@@ -2828,18 +2653,23 @@ 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 (eq retval 'disp-msg)
              (wl-summary-redisplay))
+         (if (eq retval 'prefetch-msg)
+             (wl-message-buffer-prefetch
+              folder
+              (wl-summary-message-number)
+              wl-message-buffer-prefetch-depth
+              (current-buffer)
+              wl-summary-buffer-mime-charset))
          (if mes (message "%s" mes))
          (if (and interactive wl-summary-recenter)
              (recenter (/ (- (window-height) 2) 2))))))
     ;; set current entity-id
     (if (and (not folder)
             (setq entity
          (if mes (message "%s" mes))
          (if (and interactive wl-summary-recenter)
              (recenter (/ (- (window-height) 2) 2))))))
     ;; set current entity-id
     (if (and (not folder)
             (setq entity
-                  (wl-folder-search-entity-by-name fld
+                  (wl-folder-search-entity-by-name (elmo-folder-name-internal
+                                                    folder)
                                                    wl-folder-entity
                                                    'folder)))
        ;; entity-id is unknown.
                                                    wl-folder-entity
                                                    'folder)))
        ;; entity-id is unknown.
@@ -2908,7 +2738,7 @@ If ARG, without confirm."
     (error (ding)
           (message "Error in wl-summary-line-inserted-hook"))))
 
     (error (ding)
           (message "Error in wl-summary-line-inserted-hook"))))
 
-(defun wl-summary-insert-summary (entity database mark-alist dummy &optional dummy)
+(defun wl-summary-insert-summary (entity database mark-alist dummy &optional dumm)
   (let ((overview-entity entity)
        summary-line msg)
     (setq msg (elmo-msgdb-overview-entity-get-number entity))
   (let ((overview-entity entity)
        summary-line msg)
     (setq msg (elmo-msgdb-overview-entity-get-number entity))
@@ -2922,7 +2752,7 @@ If ARG, without confirm."
 
 (defun wl-summary-default-subject-filter (subject)
   (let ((case-fold-search t))
 
 (defun wl-summary-default-subject-filter (subject)
   (let ((case-fold-search t))
-    (setq subject (elmo-replace-in-string subject "[ \t]*\\(re\\|was\\):" ""))
+    (setq subject (elmo-replace-in-string subject "[ \t]*\\(re\\|was\\)[:>]" ""))
     (setq subject (elmo-replace-in-string subject "[ \t]" ""))
     (elmo-replace-in-string subject "^\\[.*\\]" "")))
 
     (setq subject (elmo-replace-in-string subject "[ \t]" ""))
     (elmo-replace-in-string subject "^\\[.*\\]" "")))
 
@@ -2967,15 +2797,15 @@ If ARG, without confirm."
     (run-hooks 'wl-summary-insert-headers-hook)))
 
 (defun wl-summary-search-by-subject (entity overview)
     (run-hooks 'wl-summary-insert-headers-hook)))
 
 (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)
+  (let ((summary-buf (current-buffer))
+       (buf (get-buffer-create wl-summary-search-buf-name))
+       (folder-name (wl-summary-buffer-folder-name))
        match founds found-entity)
        match founds found-entity)
-    (save-excursion
-      (set-buffer buf)
+    (with-current-buffer buf
       (let ((case-fold-search t))
       (let ((case-fold-search t))
-       (when (or (not (string= wl-summary-buffer-folder-name folder-name))
+       (when (or (not (string= wl-summary-search-buf-folder-name folder-name))
                  (zerop (buffer-size)))
                  (zerop (buffer-size)))
-         (setq wl-summary-buffer-folder-name folder-name)
+         (setq wl-summary-search-buf-folder-name folder-name)
          (wl-summary-insert-headers
           overview
           (function
          (wl-summary-insert-headers
           overview
           (function
@@ -2987,23 +2817,26 @@ If ARG, without confirm."
                     (elmo-msgdb-overview-entity-get-subject entity)))
        (if (string= match "")
            (setq match "\n"))
                     (elmo-msgdb-overview-entity-get-subject entity)))
        (if (string= match "")
            (setq match "\n"))
-       (goto-char (point-max))
+       (goto-char (point-min))
        (while (and (not founds)
        (while (and (not founds)
-                   (not (= (point) (point-min)))
-                   (search-backward match nil t))
+                   (not (= (point) (point-max)))
+                   (search-forward match nil t))
          ;; check exactly match
          ;; check exactly match
-         (when (and (bolp)
-                    (= (point-at-eol)
-                       (match-end 0)))
+         (when (and (eolp)
+                    (= (point-at-bol)
+                       (match-beginning 0)))
            (setq found-entity (wl-summary-get-alike))
            (if (and found-entity
                     ;; Is founded entity myself or children?
                     (not (string=
                           (elmo-msgdb-overview-entity-get-id entity)
            (setq found-entity (wl-summary-get-alike))
            (if (and found-entity
                     ;; Is founded entity myself or children?
                     (not (string=
                           (elmo-msgdb-overview-entity-get-id entity)
-                          (elmo-msgdb-overview-entity-get-id (car found-entity))))
-                    (not (wl-thread-descendant-p
-                          (elmo-msgdb-overview-entity-get-number entity)
-                          (elmo-msgdb-overview-entity-get-number (car found-entity)))))
+                          (elmo-msgdb-overview-entity-get-id
+                           (car found-entity))))
+                    (with-current-buffer summary-buf
+                      (not (wl-thread-descendant-p
+                            (elmo-msgdb-overview-entity-get-number entity)
+                            (elmo-msgdb-overview-entity-get-number
+                             (car found-entity))))))
                ;; return matching entity
                (setq founds found-entity))))
        (if founds
                ;; return matching entity
                (setq founds found-entity))))
        (if founds
@@ -3032,8 +2865,9 @@ If ARG, without confirm."
          ;; Search parent by subject.
          (when (and (null parent-number)
                     wl-summary-search-parent-by-subject-regexp
          ;; Search parent by subject.
          (when (and (null parent-number)
                     wl-summary-search-parent-by-subject-regexp
-                    (string-match wl-summary-search-parent-by-subject-regexp
-                                  (elmo-msgdb-overview-entity-get-subject entity)))
+                    (string-match
+                     wl-summary-search-parent-by-subject-regexp
+                     (elmo-msgdb-overview-entity-get-subject entity)))
            (let ((found (wl-summary-search-by-subject entity overview)))
              (when (and found
                         (not (member found wl-summary-delayed-update)))
            (let ((found (wl-summary-search-by-subject entity overview)))
              (when (and found
                         (not (member found wl-summary-delayed-update)))
@@ -3106,8 +2940,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-folder-name)
-         (msgdb wl-summary-buffer-msgdb)
+         (folder wl-summary-buffer-elmo-folder)
+         (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)
@@ -3132,7 +2966,7 @@ If ARG, without confirm."
              (re-search-forward
               (format (concat "^ *\\("
                               (if number (int-to-string number)
              (re-search-forward
               (format (concat "^ *\\("
                               (if number (int-to-string number)
-                                "[0-9]+")
+                                "-?[0-9]+")
                               "\\)[^0-9]\\(%s\\|%s\\)")
                       wl-summary-read-uncached-mark
                       " ") eol t))
                               "\\)[^0-9]\\(%s\\|%s\\)")
                       wl-summary-read-uncached-mark
                       " ") eol t))
@@ -3143,14 +2977,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-use-cache-p folder number)
+                              (if (elmo-message-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
-             (unless (elmo-mark-as-unread folder (list number)
-                                          msgdb)
-               (error "Setting mark failed")))
+             (save-match-data
+               (unless (elmo-folder-unmark-read folder (list number))
+                 (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))
@@ -3164,7 +2998,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
-              folder
+              (wl-summary-buffer-folder-name)
               (+ 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)
@@ -3205,8 +3039,8 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
   (save-excursion
     (let ((inhibit-read-only t)
          (buffer-read-only nil)
   (save-excursion
     (let ((inhibit-read-only t)
          (buffer-read-only nil)
-          (buf (current-buffer))
-          sol eol rs re)
+         (buf (current-buffer))
+         sol eol rs re)
       (beginning-of-line)
       (setq sol (point))
       (end-of-line)
       (beginning-of-line)
       (setq sol (point))
       (end-of-line)
@@ -3289,15 +3123,13 @@ 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
                                wl-summary-new-mark))
            (refiles (append moves dels))
            (start (point))
            (unread-marks (list wl-summary-unread-cached-mark
                                wl-summary-unread-uncached-mark
                                wl-summary-new-mark))
            (refiles (append moves dels))
-           (refile-executed 0)
            (refile-failures 0)
            (refile-failures 0)
-           (copy-executed 0)
            (copy-failures 0)
            (copy-len (length copies))
            refile-len
            (copy-failures 0)
            (copy-len (length copies))
            refile-len
@@ -3317,25 +3149,25 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
              (wl-inverse-alist refiles wl-summary-buffer-refile-list))
        (goto-char start)               ; avoid moving cursor to
                                        ; the bottom line.
              (wl-inverse-alist refiles wl-summary-buffer-refile-list))
        (goto-char start)               ; avoid moving cursor to
                                        ; the bottom line.
+       (when (> refile-len elmo-display-progress-threshold)
+         (elmo-progress-set 'elmo-folder-move-messages
+                            refile-len "Moving messages..."))
        (while dst-msgs
        (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-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))
+             (setq result (elmo-folder-move-messages
+                           wl-summary-buffer-elmo-folder
+                           (cdr (car dst-msgs))
+                           (if (eq 'null (car (car dst-msgs)))
+                               'null
+                             (wl-folder-get-elmo-folder
+                              (car (car dst-msgs))))
+                           (wl-summary-buffer-msgdb)
+                           (not (null (cdr dst-msgs)))
+                           nil ; no-delete
+                           nil ; same-number
+                           unread-marks
+                           t))
            (error nil))
          (if result                    ; succeeded.
              (progn
            (error nil))
          (if result                    ; succeeded.
              (progn
@@ -3344,33 +3176,31 @@ 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-failures
                  (+ refile-failures (length (cdr (car dst-msgs))))))
-         (setq refile-executed (+ refile-executed (length (cdr (car dst-msgs)))))
          (setq dst-msgs (cdr dst-msgs)))
          (setq dst-msgs (cdr dst-msgs)))
+       (elmo-progress-clear 'elmo-folder-move-messages)
        ;; end refile
        ;; begin cOpy...
        (setq dst-msgs (wl-inverse-alist copies wl-summary-buffer-copy-list))
        ;; end refile
        ;; begin cOpy...
        (setq dst-msgs (wl-inverse-alist copies wl-summary-buffer-copy-list))
+       (when (> copy-len elmo-display-progress-threshold)
+         (elmo-progress-set 'elmo-folder-move-messages
+                            copy-len "Copying messages..."))
        (while dst-msgs
        (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-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))
+             (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)
+                           (not (null (cdr dst-msgs)))
+                           t ; t is no-delete (copy)
+                           nil ; same number
+                           unread-marks
+                           t))
            (error nil))
          (if result                    ; succeeded.
              (progn
            (error nil))
          (if result                    ; succeeded.
              (progn
@@ -3382,13 +3212,19 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
                                              wl-summary-buffer-copy-list)))
            (setq copy-failures
                  (+ copy-failures (length (cdr (car dst-msgs))))))
                                              wl-summary-buffer-copy-list)))
            (setq copy-failures
                  (+ copy-failures (length (cdr (car dst-msgs))))))
-         (setq copy-executed (+ copy-executed (length (cdr (car dst-msgs)))))
          (setq dst-msgs (cdr dst-msgs)))
          (setq dst-msgs (cdr dst-msgs)))
+       ;; Hide progress bar.
+       (elmo-progress-clear 'elmo-folder-move-messages)
        ;; end cOpy
        (wl-summary-folder-info-update)
        (wl-summary-set-message-modified)
        (wl-summary-set-mark-modified)
        (run-hooks 'wl-summary-exec-hook)
        ;; end cOpy
        (wl-summary-folder-info-update)
        (wl-summary-set-message-modified)
        (wl-summary-set-mark-modified)
        (run-hooks 'wl-summary-exec-hook)
+       (unless (and wl-message-buffer
+                    (eq (wl-summary-message-number)
+                        (with-current-buffer wl-message-buffer
+                          wl-message-buffer-cur-number)))
+         (wl-summary-toggle-disp-msg 'off))
        (set-buffer-modified-p nil)
        (message (concat "Executing ... done"
                         (if (> refile-failures 0)
        (set-buffer-modified-p nil)
        (message (concat "Executing ... done"
                         (if (> refile-failures 0)
@@ -3404,7 +3240,7 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
   (let ((fld (completing-read
              (format "Folder name %s(%s): " (or purpose "")
                      default)
   (let ((fld (completing-read
              (format "Folder name %s(%s): " (or purpose "")
                      default)
-             (or wl-folder-completion-func
+             (or wl-folder-completion-function
                  (if (memq 'read-folder wl-use-folder-petname)
                      (wl-folder-get-entity-with-petname)
                    wl-folder-entity-hashtb))
                  (if (memq 'read-folder wl-use-folder-petname)
                      (wl-folder-get-entity-with-petname)
                    wl-folder-entity-hashtb))
@@ -3415,11 +3251,16 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
        (setq fld default))
     (setq fld (elmo-string (wl-folder-get-realname fld)))
     (if (string-match "\n" fld)
        (setq fld default))
     (setq fld (elmo-string (wl-folder-get-realname fld)))
     (if (string-match "\n" fld)
-       (error "Not supported folder name: %s" fld))    
+       (error "Not supported folder name: %s" fld))
     (unless no-create
       (if ignore-error
     (unless no-create
       (if ignore-error
-         (ignore-errors (wl-folder-confirm-existence fld))
-       (wl-folder-confirm-existence fld)))
+         (condition-case nil
+             (wl-folder-confirm-existence
+              (wl-folder-get-elmo-folder
+               fld))
+           (error))
+       (wl-folder-confirm-existence (wl-folder-get-elmo-folder
+                                     fld))))
     fld))
 
 (defun wl-summary-print-destination (msg-num folder)
     fld))
 
 (defun wl-summary-print-destination (msg-num folder)
@@ -3446,11 +3287,6 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
       (insert folder)
       (set-buffer-modified-p nil))))
 
       (insert folder)
       (set-buffer-modified-p nil))))
 
-;; override.
-(when wl-on-nemacs
-  (defun wl-summary-print-destination (msg-num &optional folder))
-  (defun wl-summary-remove-destination ()))
-
 (defsubst wl-summary-get-mark (number)
   "Return a temporal mark of message specified by NUMBER."
   (or (and (memq number wl-summary-buffer-delete-list) "D")
 (defsubst wl-summary-get-mark (number)
   "Return a temporal mark of message specified by NUMBER."
   (or (and (memq number wl-summary-buffer-delete-list) "D")
@@ -3472,7 +3308,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)
@@ -3489,16 +3325,14 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
   (wl-summary-refile-subr 'copy (interactive-p) dst number))
 
 (defun wl-summary-refile-subr (copy-or-refile interactive &optional dst number)
   (wl-summary-refile-subr 'copy (interactive-p) dst number))
 
 (defun wl-summary-refile-subr (copy-or-refile interactive &optional dst number)
-  (interactive)
   (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
-                    (cdr (assq msg-num
-                               (elmo-msgdb-get-number-alist
-                                wl-summary-buffer-msgdb)))))
+                    (elmo-message-field wl-summary-buffer-elmo-folder
+                                        msg-num 'message-id)))
         (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)
@@ -3522,7 +3356,9 @@ 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 (car (elmo-folder-get-spec folder)) 'cache)
+      (if (and (eq (elmo-folder-type-internal
+                   (wl-folder-get-elmo-folder
+                    (wl-folder-get-realname folder))) 'cache)
               (not (string= folder
                             (setq tmp-folder
                                   (concat "'cache/"
               (not (string= folder
                             (setq tmp-folder
                                   (concat "'cache/"
@@ -3531,14 +3367,8 @@ 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))
@@ -3592,11 +3422,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)
@@ -3609,10 +3439,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 dst)
+           (wl-folder-confirm-existence (wl-folder-get-elmo-folder 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))
@@ -3632,7 +3462,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))
@@ -3660,7 +3490,7 @@ If optional argument NUMBER is specified, unmark message specified by NUMBER."
        (setq visible t))
       ;; Delete mark on buffer.
       (when (and visible
        (setq visible t))
       ;; Delete mark on buffer.
       (when (and visible
-                (looking-at "^ *\\([0-9]+\\)\\([^0-9]\\)"))
+                (looking-at "^ *\\(-?[0-9]+\\)\\([^0-9]\\)"))
        (goto-char (match-end 2))
        (or number
            (setq number (string-to-int (wl-match-buffer 1))))
        (goto-char (match-end 2))
        (or number
            (setq number (string-to-int (wl-match-buffer 1))))
@@ -3742,10 +3572,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)
@@ -3829,12 +3659,12 @@ 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))
   (let ((case-fold-search nil))
 
 (defun wl-summary-delete-all-mark (mark)
   (goto-char (point-min))
   (let ((case-fold-search nil))
-    (while (re-search-forward (format "^ *[0-9]+%s"
+    (while (re-search-forward (format "^ *-?[0-9]+%s"
                                      (regexp-quote mark)) nil t)
       (wl-summary-unmark))
     (cond ((string= mark "*")
                                      (regexp-quote mark)) nil t)
       (wl-summary-unmark))
     (cond ((string= mark "*")
@@ -3872,41 +3702,55 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
     (wl-summary-target-mark-region beg end)))
 
 (defun wl-summary-target-mark-msgs (msgs)
     (wl-summary-target-mark-region beg end)))
 
 (defun wl-summary-target-mark-msgs (msgs)
-  (while msgs
-    (if (eq wl-summary-buffer-view 'thread)
-       (wl-thread-jump-to-msg (car msgs))
-      (wl-summary-jump-to-msg (car msgs)))
-    (wl-summary-target-mark (wl-summary-message-number))
-    (setq msgs (cdr msgs))))
+  "Return the number of marked messages."
+  (let ((i 0) num)
+    (while msgs
+      (if (eq wl-summary-buffer-view 'thread)
+         (wl-thread-jump-to-msg (car msgs))
+       (wl-summary-jump-to-msg (car msgs)))
+      (setq num (wl-summary-message-number))
+      (when (eq num (car msgs))
+       (wl-summary-target-mark num)
+       (setq i (1+ i)))
+      (setq msgs (cdr msgs)))
+    i))
 
 (defun wl-summary-pick (&optional from-list delete-marks)
   (interactive)
 
 (defun wl-summary-pick (&optional from-list delete-marks)
   (interactive)
-  (let ((result (elmo-msgdb-search
-                wl-summary-buffer-folder-name
-                (elmo-read-search-condition wl-summary-pick-field-default)
-                wl-summary-buffer-msgdb)))
-    (if delete-marks
-      (let ((mlist wl-summary-buffer-target-mark-list))
-       (while mlist
-         (when (wl-summary-jump-to-msg (car mlist))
-           (wl-summary-unmark))
-         (setq mlist (cdr mlist)))
-       (setq wl-summary-buffer-target-mark-list nil)))
-    (if from-list
-       (setq result (elmo-list-filter from-list result)))
-    (message "%d message(s) are picked." (length result))
-    (if (null result)
-       (message "No message was picked.")
-      (wl-summary-target-mark-msgs result))))
+  (save-excursion
+    (let* ((condition (car (elmo-parse-search-condition
+                           (elmo-read-search-condition
+                            wl-summary-pick-field-default))))
+          (result (elmo-folder-search wl-summary-buffer-elmo-folder
+                                      condition
+                                      from-list))
+          num)
+      (if delete-marks
+         (let ((mlist wl-summary-buffer-target-mark-list))
+           (while mlist
+             (when (wl-summary-jump-to-msg (car mlist))
+               (wl-summary-unmark))
+             (setq mlist (cdr mlist)))
+           (setq wl-summary-buffer-target-mark-list nil)))
+      (if (and result
+              (setq num (wl-summary-target-mark-msgs result))
+              (> num 0))
+         (if (= num (length result))
+             (message "%d message(s) are picked." num)
+           (message "%d(%d) message(s) are picked." num
+                    (- (length result) num)))
+       (message "No message was picked.")))))
 
 (defun wl-summary-unvirtual ()
   "Exit from current virtual folder."
   (interactive)
   (if (eq 'filter
 
 (defun wl-summary-unvirtual ()
   "Exit from current virtual folder."
   (interactive)
   (if (eq 'filter
-         (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)
+         (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)
     (error "This folder is not filtered")))
 
 (defun wl-summary-virtual (&optional arg)
     (error "This folder is not filtered")))
 
 (defun wl-summary-virtual (&optional arg)
@@ -3919,22 +3763,29 @@ 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)))
 
                                 'update nil nil t)))
 
-(defun wl-summary-delete-all-temp-marks ()
+(defun wl-summary-delete-all-temp-marks (&optional no-msg)
+  "Erase all temp marks from buffer."
   (interactive)
   (interactive)
-  (save-excursion
-    (goto-char (point-min))
-    (message "Unmarking...")
-    (while (not (eobp))
-      (wl-summary-unmark)
-      (forward-line))
-    (message "Unmarking...done")
-    (setq wl-summary-buffer-target-mark-list nil)
-    (setq wl-summary-buffer-delete-list nil)
-    (setq wl-summary-buffer-refile-list nil)
-    (setq wl-summary-buffer-copy-list nil)))
+  (when (or wl-summary-buffer-target-mark-list
+           wl-summary-buffer-delete-list
+           wl-summary-buffer-refile-list
+           wl-summary-buffer-copy-list)
+    (save-excursion
+      (goto-char (point-min))
+      (unless no-msg
+       (message "Unmarking..."))
+      (while (not (eobp))
+       (wl-summary-unmark)
+       (forward-line))
+      (unless no-msg
+       (message "Unmarking...done"))
+      (setq wl-summary-buffer-target-mark-list nil)
+      (setq wl-summary-buffer-delete-list nil)
+      (setq wl-summary-buffer-refile-list nil)
+      (setq wl-summary-buffer-copy-list nil))))
 
 (defun wl-summary-delete-mark (number)
   "Delete temporary mark of the message specified by NUMBER."
 
 (defun wl-summary-delete-mark (number)
   "Delete temporary mark of the message specified by NUMBER."
@@ -3963,7 +3814,7 @@ If ARG, exit virtual folder."
          (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))
        (goto-char (match-end 1))
        (setq msg-num  (string-to-int (wl-match-buffer 1)))
        (setq cur-mark (wl-match-buffer 2))
        (goto-char (match-end 1))
@@ -3994,8 +3845,8 @@ If ARG, exit virtual folder."
              (delq (car mlist) wl-summary-buffer-target-mark-list))
        (setq mlist (cdr mlist))))))
 
              (delq (car mlist) wl-summary-buffer-target-mark-list))
        (setq mlist (cdr mlist))))))
 
-(defun wl-summary-target-mark-prefetch ()
-  (interactive)
+(defun wl-summary-target-mark-prefetch (&optional ignore-cache)
+  (interactive "P")
   (save-excursion
     (let* ((mlist (nreverse wl-summary-buffer-target-mark-list))
           (inhibit-read-only t)
   (save-excursion
     (let* ((mlist (nreverse wl-summary-buffer-target-mark-list))
           (inhibit-read-only t)
@@ -4006,7 +3857,7 @@ If ARG, exit virtual folder."
           skipped
           new-mark)
       (while mlist
           skipped
           new-mark)
       (while mlist
-       (setq new-mark (wl-summary-prefetch-msg (car mlist)))
+       (setq new-mark (wl-summary-prefetch-msg (car mlist) ignore-cache))
        (if new-mark
            (progn
              (message "Prefetching... %d/%d message(s)"
        (if new-mark
            (progn
              (message "Prefetching... %d/%d message(s)"
@@ -4014,7 +3865,7 @@ If ARG, exit virtual folder."
              (when (wl-summary-jump-to-msg (car mlist))
                (wl-summary-unmark)
                (when new-mark
              (when (wl-summary-jump-to-msg (car mlist))
                (wl-summary-unmark)
                (when new-mark
-                 (when (looking-at "^ *[0-9]+[^0-9]\\([^0-9]\\)")
+                 (when (looking-at "^ *-?[0-9]+[^0-9]\\([^0-9]\\)")
                    (delete-region (match-beginning 1) (match-end 1)))
                  (goto-char (match-beginning 1))
                  (insert new-mark)
                    (delete-region (match-beginning 1) (match-end 1)))
                  (goto-char (match-beginning 1))
                  (insert new-mark)
@@ -4042,10 +3893,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
@@ -4072,6 +3923,28 @@ If ARG, exit virtual folder."
                (delq (car mlist) wl-summary-buffer-target-mark-list))
          (setq mlist (cdr mlist)))))))
 
                (delq (car mlist) wl-summary-buffer-target-mark-list))
          (setq mlist (cdr mlist)))))))
 
+(defun wl-summary-next-buffer ()
+  "Switch to next summary buffer."
+  (interactive)
+  (let ((buffers (sort (wl-collect-summary)
+                      (lambda (buffer1 buffer2)
+                        (string-lessp (buffer-name buffer1)
+                                      (buffer-name buffer2))))))
+    (switch-to-buffer
+     (or (cadr (memq (current-buffer) buffers))
+        (car buffers)))))
+
+(defun wl-summary-previous-buffer ()
+  "Switch to previous summary buffer."
+  (interactive)
+  (let ((buffers (sort (wl-collect-summary)
+                      (lambda (buffer1 buffer2)
+                        (not (string-lessp (buffer-name buffer1)
+                                           (buffer-name buffer2)))))))
+    (switch-to-buffer
+     (or (cadr (memq (current-buffer) buffers))
+        (car buffers)))))
+
 (defun wl-summary-target-mark-copy ()
   (interactive)
   (wl-summary-target-mark-refile-subr "copy"))
 (defun wl-summary-target-mark-copy ()
   (interactive)
   (wl-summary-target-mark-refile-subr "copy"))
@@ -4106,7 +3979,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 ()
@@ -4136,7 +4009,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 ()
@@ -4166,7 +4039,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 ()
@@ -4174,7 +4047,8 @@ If ARG, exit virtual folder."
   (save-excursion
     (goto-char (point-min))
     (let ((wl-save-dir
   (save-excursion
     (goto-char (point-min))
     (let ((wl-save-dir
-          (wl-read-directory-name "Save to directory: " wl-tmp-dir))
+          (wl-read-directory-name "Save to directory: "
+                                  wl-temporary-file-directory))
          (regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
          number mlist)
       (if (null (file-exists-p wl-save-dir))
          (regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
          number mlist)
       (if (null (file-exists-p wl-save-dir))
@@ -4201,8 +4075,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-folder-name)
-          (msgdb wl-summary-buffer-msgdb)
+          (folder wl-summary-buffer-elmo-folder)
+          (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)
@@ -4211,11 +4085,12 @@ If ARG, exit virtual folder."
          (progn
            (setq visible (wl-summary-jump-to-msg number))
            (setq mark (cadr (assq number mark-alist))))
          (progn
            (setq visible (wl-summary-jump-to-msg number))
            (setq mark (cadr (assq number mark-alist))))
+       ;; interactive
        (setq visible t))
       (beginning-of-line)
       (if (or (not visible)
              (looking-at
        (setq visible t))
       (beginning-of-line)
       (if (or (not visible)
              (looking-at
-              (format "^ *\\([0-9]+\\)[^0-9]\\(%s\\|%s\\|%s\\|%s\\).*$"
+              (format "^ *\\(-?[0-9]+\\)[^0-9]\\(%s\\|%s\\|%s\\|%s\\).*$"
                       (regexp-quote wl-summary-read-uncached-mark)
                       (regexp-quote wl-summary-unread-uncached-mark)
                       (regexp-quote wl-summary-unread-cached-mark)
                       (regexp-quote wl-summary-read-uncached-mark)
                       (regexp-quote wl-summary-unread-uncached-mark)
                       (regexp-quote wl-summary-unread-cached-mark)
@@ -4238,14 +4113,16 @@ 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-use-cache-p folder number)
+                                   (if (elmo-message-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)
-               (setq marked (elmo-mark-as-read folder
-                                               (list number) msgdb)))
+               (save-match-data
+                 (setq marked (elmo-folder-mark-as-read
+                               folder
+                               (list number)))))
            (if (or leave-server-side-mark-untouched
                    marked)
                (progn
            (if (or leave-server-side-mark-untouched
                    marked)
                (progn
@@ -4257,7 +4134,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
-                  folder
+                  (wl-summary-buffer-folder-name)
                   (+ 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)
@@ -4270,11 +4147,7 @@ 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))
-                 (if (not notcrosses)
-                     (wl-summary-set-crosspost nil
-                                               (and wl-summary-buffer-disp-msg
-                                                    (interactive-p)))))
+                     (wl-highlight-summary-current-line nil nil t)))
              (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
@@ -4286,15 +4159,15 @@ If ARG, exit virtual folder."
                                               mark
                                               no-server-update)
   (interactive)
                                               mark
                                               no-server-update)
   (interactive)
-  (if (eq (elmo-folder-get-type wl-summary-buffer-folder-name)
+  (if (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder)
          '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-folder-name)
-         (msgdb wl-summary-buffer-msgdb)
+         (folder wl-summary-buffer-elmo-folder)
+         (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)
@@ -4304,7 +4177,7 @@ If ARG, exit virtual folder."
            (setq mark (or mark (cadr (assq number mark-alist)))))
        (setq visible t))
       (when visible
            (setq mark (or mark (cadr (assq number mark-alist)))))
        (setq visible t))
       (when visible
-       (if (null (wl-summary-message-number))
+       (if (null (setq number (wl-summary-message-number)))
            (progn
              (message "No message.")
              (setq visible nil))
            (progn
              (message "No message.")
              (setq visible nil))
@@ -4312,19 +4185,30 @@ If ARG, exit virtual folder."
          (setq eol (point))
          (re-search-backward (concat "^" wl-summary-buffer-number-regexp
                                      "..../..") nil t)) ; set cursor line
          (setq eol (point))
          (re-search-backward (concat "^" wl-summary-buffer-number-regexp
                                      "..../..") nil t)) ; set cursor line
-       )
-      (beginning-of-line)
-      (if (re-search-forward "^ *\\([0-9]+\\)[^0-9]\\([^0-9]\\)" eol t)
+       (beginning-of-line))
+      (if (or (and (not visible)
+                  (assq number (elmo-msgdb-get-number-alist msgdb)))
+             (re-search-forward "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9]\\)" eol t))
          (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 (cdr (assq number number-alist)))
+           (setq message-id (elmo-message-field
+                             wl-summary-buffer-elmo-folder
+                             number
+                             'message-id))
            (if (string= mark wl-summary-important-mark)
                (progn
                  ;; server side mark
            (if (string= mark wl-summary-important-mark)
                (progn
                  ;; server side mark
-                 (unless no-server-update
-                   (elmo-unmark-important folder (list number) msgdb)
-                   (elmo-msgdb-global-mark-delete message-id))
+                 (save-match-data
+                   (unless no-server-update
+                     (elmo-folder-unmark-important folder (list number))
+                     (elmo-msgdb-global-mark-delete message-id))
+                   ;; Remove cache if local folder.
+                   (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))))
                  (when visible
                    (delete-region (match-beginning 2) (match-end 2))
                    (insert " "))
                  (when visible
                    (delete-region (match-beginning 2) (match-end 2))
                    (insert " "))
@@ -4333,20 +4217,20 @@ If ARG, exit virtual folder."
                                             number
                                             nil)))
              ;; server side mark
                                             number
                                             nil)))
              ;; server side mark
-             (unless no-server-update
-               (elmo-mark-as-important folder (list number) msgdb))
+             (save-match-data
+               (unless no-server-update
+                 (elmo-folder-mark-as-important folder (list number))))
              (when visible
                (delete-region (match-beginning 2) (match-end 2))
                (insert wl-summary-important-mark))
              (setq mark-alist
                    (elmo-msgdb-mark-set mark-alist
              (when visible
                (delete-region (match-beginning 2) (match-end 2))
                (insert wl-summary-important-mark))
              (setq mark-alist
                    (elmo-msgdb-mark-set mark-alist
-                                        (string-to-int (wl-match-buffer 1))
+                                        number
                                         wl-summary-important-mark))
                                         wl-summary-important-mark))
-             ;; Force cache message!!
-             (save-match-data
-               (unless (elmo-cache-exists-p message-id)
-                 (elmo-force-cache-msg folder number message-id
-                                       (elmo-msgdb-get-location msgdb))))
+             (if (eq (elmo-file-cache-exists-p message-id) 'entire)
+                 (elmo-folder-mark-as-read folder (list number))
+               ;; Force cache message.
+               (elmo-message-encache folder number 'read))
              (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)))
@@ -4394,8 +4278,7 @@ If ARG, exit virtual folder."
       (setq linked (wl-thread-entity-get-linked thr-entity)))
     (if (string= thr-str "")
        (setq no-parent t)) ; no parent
       (setq linked (wl-thread-entity-get-linked thr-entity)))
     (if (string= thr-str "")
        (setq no-parent t)) ; no parent
-    (if (and wl-summary-width
-            wl-summary-indent-length-limit
+    (if (and wl-summary-indent-length-limit
             (< wl-summary-indent-length-limit
                (string-width thr-str)))
        (setq thr-str (wl-set-string-width
             (< wl-summary-indent-length-limit
                (string-width thr-str)))
        (setq thr-str (wl-set-string-width
@@ -4404,8 +4287,8 @@ If ARG, exit virtual folder."
     (setq from
          (wl-set-string-width
           (if children-num
     (setq from
          (wl-set-string-width
           (if children-num
-              (- wl-from-width (length children-num) 2)
-            wl-from-width)
+              (- wl-summary-from-width (length children-num) 2)
+            wl-summary-from-width)
           (elmo-delete-char ?\n
                             (wl-summary-from-func-internal
                              (elmo-msgdb-overview-entity-get-from entity)))))
           (elmo-delete-char ?\n
                             (wl-summary-from-func-internal
                              (elmo-msgdb-overview-entity-get-from entity)))))
@@ -4447,8 +4330,8 @@ If ARG, exit virtual folder."
                                         subject parent-subject)))
                               (wl-summary-subject-func-internal subject) ""))
                     (if (and (not wl-summary-width)
                                         subject parent-subject)))
                               (wl-summary-subject-func-internal subject) ""))
                     (if (and (not wl-summary-width)
-                             wl-subject-length-limit)
-                        (truncate-string subject wl-subject-length-limit)
+                             wl-summary-subject-length-limit)
+                        (truncate-string subject wl-summary-subject-length-limit)
                       subject)))))
     (if wl-summary-width (setq line
                               (wl-set-string-width
                       subject)))))
     (if wl-summary-width (setq line
                               (wl-set-string-width
@@ -4467,11 +4350,12 @@ 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)))))
@@ -4482,116 +4366,97 @@ 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))))
 
-(defmacro wl-summary-cursor-move-regex ()
-  (` (let ((mark-alist
-           (if (elmo-folder-plugged-p wl-summary-buffer-folder-name)
-               (cond ((eq wl-summary-move-order 'new)
-                      (list
-                       (list
-                        wl-summary-new-mark)
-                       (list
-                        wl-summary-unread-uncached-mark
-                        wl-summary-unread-cached-mark
-                        wl-summary-important-mark)))
-                     ((eq wl-summary-move-order 'unread)
-                      (list
-                      (list
-                       wl-summary-unread-uncached-mark
-                       wl-summary-unread-cached-mark
-                       wl-summary-new-mark)
-                      (list
-                       wl-summary-important-mark)))
-                     (t
-                      (list
-                      (list
-                       wl-summary-unread-uncached-mark
-                       wl-summary-unread-cached-mark
-                       wl-summary-new-mark
-                       wl-summary-important-mark))))
-             (cond ((eq wl-summary-move-order 'unread)
-                    (list
-                    (list
-                     wl-summary-unread-cached-mark)
-                    (list
-                     wl-summary-important-mark)))
-                   (t
-                    (list
-                    (list
-                     wl-summary-unread-cached-mark
-                     wl-summary-important-mark)))))))
-       (mapcar
-       (function
-        (lambda (mark-list)
-          (concat wl-summary-message-regexp
-                  ".\\("
-                  (mapconcat 'regexp-quote
-                             mark-list
-                             "\\|")
-                  "\\)\\|"
-                  wl-summary-message-regexp "\\*")))
-       mark-alist))))
-
-;;
-;; Goto unread or important
-;;
-(defun wl-summary-cursor-up (&optional hereto)
-  (interactive "P")
-  (if (and (not wl-summary-buffer-target-mark-list)
-          (eq wl-summary-buffer-view 'thread))
-      (progn
-       (if (eobp)
-           (forward-line -1))
-       (wl-thread-jump-to-prev-unread hereto))
-    (if hereto
-       (end-of-line)
-      (beginning-of-line))
-    (let ((case-fold-search nil)
-         regex-list)
-      (setq regex-list (wl-summary-cursor-move-regex))
-      (catch 'done
-       (while regex-list
-         (when (re-search-backward
-                (car regex-list)
-                nil t nil)
-           (beginning-of-line)
-           (throw 'done t))
-         (setq regex-list (cdr regex-list)))
-       (beginning-of-line)
-       (throw 'done nil)))))
-
+(defvar wl-summary-move-spec-plugged-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-unplugged-alist
+  (` ((new . ((t . nil)
+             (p . (, wl-summary-unread-cached-mark))
+             (p . (, (regexp-quote wl-summary-important-mark)))))
+      (unread . ((t . nil)
+                (p . (, wl-summary-unread-cached-mark))
+                (p . (, (regexp-quote wl-summary-important-mark))))))))
+
+(defsubst wl-summary-next-message (num direction hereto)
+  (if wl-summary-buffer-next-message-function
+      (funcall wl-summary-buffer-next-message-function num direction hereto)
+    (let ((cur-spec (cdr (assq wl-summary-move-order
+                              (if (elmo-folder-plugged-p
+                                   wl-summary-buffer-elmo-folder)
+                                  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-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)
+                    (if wl-summary-buffer-target-mark-list
+                        (while nums
+                          (if (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)
+            (eobp))
+    (forward-line -1)
+    (setq hereto t))
+  (let (num)
+    (when (setq num (wl-summary-next-message (wl-summary-message-number)
+                                            direction hereto))
+      (if (numberp num)
+         (wl-thread-jump-to-msg num))
+      t)))
 ;;
 ;; Goto unread or important
 ;; returns t if next message exists in this folder.
 (defun wl-summary-cursor-down (&optional hereto)
   (interactive "P")
 ;;
 ;; Goto unread or important
 ;; returns t if next message exists in this folder.
 (defun wl-summary-cursor-down (&optional hereto)
   (interactive "P")
-  (if (and (null wl-summary-buffer-target-mark-list)
-          (eq wl-summary-buffer-view 'thread))
-      (wl-thread-jump-to-next-unread hereto)
-    (if hereto
-       (beginning-of-line)
-      (end-of-line))
-    (let ((case-fold-search nil)
-         regex-list)
-      (setq regex-list (wl-summary-cursor-move-regex))
-      (catch 'done
-       (while regex-list
-         (when (re-search-forward
-                (car regex-list)
-                nil t nil)
-           (beginning-of-line)
-           (throw 'done t))
-         (setq regex-list (cdr regex-list)))
-       (beginning-of-line)
-       (throw 'done nil)))))
+  (wl-summary-cursor-move 'down hereto))
+
+(defun wl-summary-cursor-up (&optional hereto)
+  (interactive "P")
+  (wl-summary-cursor-move 'up hereto))
 
 (defun wl-summary-save-view-cache ()
   (save-excursion
 
 (defun wl-summary-save-view-cache ()
   (save-excursion
-    (let* ((dir (elmo-msgdb-expand-path wl-summary-buffer-folder-name))
+    (let* ((dir (elmo-folder-msgdb-path wl-summary-buffer-elmo-folder))
           (cache (expand-file-name wl-summary-cache-file dir))
           (view (expand-file-name wl-summary-view-file dir))
           (cache (expand-file-name wl-summary-cache-file dir))
           (view (expand-file-name wl-summary-view-file dir))
-;;;       (coding-system-for-write wl-cs-cache)
-;;;       (output-coding-system wl-cs-cache)
           (save-view wl-summary-buffer-view)
           (save-view wl-summary-buffer-view)
+          (mark-list (copy-sequence wl-summary-buffer-target-mark-list))
+          (refile-list (copy-sequence wl-summary-buffer-refile-list))
+          (copy-list (copy-sequence wl-summary-buffer-copy-list))
+          (delete-list (copy-sequence wl-summary-buffer-delete-list))
           (tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*"))
           (charset wl-summary-buffer-mime-charset))
       (if (file-directory-p dir)
           (tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*"))
           (charset wl-summary-buffer-mime-charset))
       (if (file-directory-p dir)
@@ -4607,13 +4472,15 @@ If ARG, exit virtual folder."
              (copy-to-buffer tmp-buffer (point-min) (point-max))
              (with-current-buffer tmp-buffer
                (widen)
              (copy-to-buffer tmp-buffer (point-min) (point-max))
              (with-current-buffer tmp-buffer
                (widen)
+               (setq wl-summary-buffer-target-mark-list mark-list
+                     wl-summary-buffer-refile-list refile-list
+                     wl-summary-buffer-copy-list copy-list
+                     wl-summary-buffer-delete-list delete-list)
+               (wl-summary-delete-all-temp-marks 'no-msg)
                (encode-mime-charset-region
                 (point-min) (point-max) charset)
                (encode-mime-charset-region
                 (point-min) (point-max) charset)
-               (as-binary-output-file
-                (write-region (point-min)
-                              (point-max) cache nil 'no-msg))
-               (write-region (point-min) (point-max) cache nil
-                             'no-msg)))
+               (write-region-as-binary (point-min)(point-max)
+                                       cache nil 'no-msg)))
            (when (file-writable-p view) ; 'thread or 'sequence
              (save-excursion
                (set-buffer tmp-buffer)
            (when (file-writable-p view) ; 'thread or 'sequence
              (save-excursion
                (set-buffer tmp-buffer)
@@ -4629,7 +4496,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
-               folder))
+               (elmo-folder-name-internal folder)))
              wl-default-sync-range)))
 
 ;; redefined for wl-summary-sync-update
              wl-default-sync-range)))
 
 ;; redefined for wl-summary-sync-update
@@ -4637,7 +4504,8 @@ If ARG, exit virtual folder."
   "returns update or all or rescan."
   ;; for the case when parts are expanded in the bottom of the folder
   (let ((input-range-list '("update" "all" "rescan" "first:" "last:"
   "returns update or all or rescan."
   ;; for the case when parts are expanded in the bottom of the folder
   (let ((input-range-list '("update" "all" "rescan" "first:" "last:"
-                           "no-sync" "rescan-noscore"))
+                           "cache-status"
+                           "no-sync" "rescan-noscore" "all-visible"))
        (default (or (wl-get-assoc-list-value
                      wl-folder-sync-range-alist
                      folder)
        (default (or (wl-get-assoc-list-value
                      wl-folder-sync-range-alist
                      folder)
@@ -4654,10 +4522,9 @@ If ARG, exit virtual folder."
 
 (defun wl-summary-toggle-disp-folder (&optional arg)
   (interactive)
 
 (defun wl-summary-toggle-disp-folder (&optional arg)
   (interactive)
-  (let (fld-buf fld-win
-       (view-message-buffer (wl-message-get-buffer-create))
-       (cur-buf (current-buffer))
-       (summary-win (get-buffer-window (current-buffer))))
+  (let ((cur-buf (current-buffer))
+       (summary-win (get-buffer-window (current-buffer)))
+       fld-buf fld-win)
     (cond
      ((eq arg 'on)
       (setq wl-summary-buffer-disp-folder t)
     (cond
      ((eq arg 'on)
       (setq wl-summary-buffer-disp-folder t)
@@ -4668,8 +4535,9 @@ 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!
-      (wl-select-buffer view-message-buffer)
-      (delete-window)
+      (when (buffer-live-p wl-message-buffer)
+       (wl-message-select-buffer wl-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))
@@ -4693,7 +4561,8 @@ 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 (get-buffer-window view-message-buffer))
+         (let ((mes-win (and wl-message-buffer
+                             (get-buffer-window wl-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
@@ -4706,62 +4575,63 @@ 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-select-buffer view-message-buffer)
-             (run-hooks 'wl-summary-toggle-disp-folder-message-resumed-hook)
-             (select-window (get-buffer-window cur-buf)))
-           )
-       (save-excursion
-         ;; hide message window
-         (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 (setq fld-buf (get-buffer wl-folder-buffer-name))
-               (if (setq fld-win (get-buffer-window fld-buf))
-                   ;; folder win is already displayed.
-                   (select-window fld-win)
-                 ;; folder win is not displayed...occupy all.
-                 (switch-to-buffer fld-buf))
-             ;; no folder buf
-             (wl-folder))
-           (split-window-horizontally wl-folder-window-width)
-           (other-window 1)
-           (switch-to-buffer cur-buf)
-           ;; resume message window.
-           (run-hooks 'wl-summary-toggle-disp-folder-on-hook)
-           (when mes-win
-             (wl-select-buffer view-message-buffer)
+             (wl-message-select-buffer wl-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))))
-         )))))
+       ;; hide message window
+       (let ((wl-stay-folder-window t)
+             (mes-win (and wl-message-buffer
+                           (get-buffer-window wl-message-buffer))))
+         (if mes-win (delete-window mes-win))
+         (select-window (get-buffer-window cur-buf))
+         ;; display wl-folder window!!
+         (if (setq fld-buf (get-buffer wl-folder-buffer-name))
+             (if (setq fld-win (get-buffer-window fld-buf))
+                 ;; folder win is already displayed.
+                 (select-window fld-win)
+               ;; folder win is not displayed...occupy all.
+               (switch-to-buffer fld-buf))
+           ;; no folder buf
+           (wl-folder))
+         (split-window-horizontally wl-folder-window-width)
+         (other-window 1)
+         (switch-to-buffer cur-buf)
+         ;; resume message window.
+         (run-hooks 'wl-summary-toggle-disp-folder-on-hook)
+         (when mes-win
+           (wl-message-select-buffer wl-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-hook))
 
 (defun wl-summary-toggle-disp-msg (&optional arg)
   (interactive)
   (run-hooks 'wl-summary-toggle-disp-folder-hook))
 
 (defun wl-summary-toggle-disp-msg (&optional arg)
   (interactive)
-  (let (fld-buf fld-win
-       (view-message-buffer (wl-message-get-buffer-create))
-       (cur-buf (current-buffer))
+  (let ((cur-buf (current-buffer))
+       fld-buf fld-win
        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)
-      ;; 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))))
+      (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))))))
      ((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
-        (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)))
+       (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))))
+       (run-hooks 'wl-summary-toggle-disp-off-hook)))
      (t
      (t
-      (if (get-buffer-window view-message-buffer) ; already displayed
+      (if (and wl-message-buffer
+              (get-buffer-window wl-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
@@ -4774,7 +4644,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-select-buffer view-message-buffer)
+         (wl-message-select-buffer wl-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))
@@ -4782,6 +4652,7 @@ 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)
@@ -4799,44 +4670,47 @@ If ARG, exit virtual folder."
 
 (defun wl-summary-next-page ()
   (interactive)
 
 (defun wl-summary-next-page ()
   (interactive)
-  (wl-message-next-page))
+  (let ((cur-buf (current-buffer)))
+    (wl-summary-toggle-disp-msg 'on)
+    (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original)
+      (set-buffer cur-buf)
+      (wl-message-next-page))))
 
 (defun wl-summary-prev-page ()
   (interactive)
 
 (defun wl-summary-prev-page ()
   (interactive)
-  (wl-message-prev-page))
+  (let ((cur-buf (current-buffer)))
+    (wl-summary-toggle-disp-msg 'on)
+    (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original)
+      (set-buffer cur-buf)
+      (wl-message-prev-page))))
 
 (defsubst wl-summary-no-mime-p (folder)
 
 (defsubst wl-summary-no-mime-p (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)
+  (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)
        (number (wl-summary-message-number))
        (number (wl-summary-message-number))
-       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)))))
+       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)))
        (progn
        (progn
-         (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))))
+         (set-buffer wl-message-buffer)
+         t)
+      (if (wl-summary-no-mime-p folder)
+         (wl-summary-redisplay-no-mime-internal folder number)
+       (wl-summary-redisplay-internal folder number))
+      (when (buffer-live-p wl-message-buffer)
+       (set-buffer wl-message-buffer))
+      nil)))
 
 (defun wl-summary-target-mark-forward (&optional arg)
   (interactive "P")
 
 (defun wl-summary-target-mark-forward (&optional arg)
   (interactive "P")
@@ -4878,11 +4752,12 @@ If ARG, exit virtual folder."
     (wl-summary-jump-to-msg (car mlist))
     (wl-summary-reply arg t)
     (goto-char (point-max))
     (wl-summary-jump-to-msg (car mlist))
     (wl-summary-reply arg t)
     (goto-char (point-max))
-    (setq start-point (point))
+    (setq start-point (point-marker))
     (setq draft-buf (current-buffer))
     (save-window-excursion
       (while mlist
        (set-buffer summary-buf)
     (setq draft-buf (current-buffer))
     (save-window-excursion
       (while mlist
        (set-buffer summary-buf)
+       (delete-other-windows)
        (wl-summary-jump-to-msg (car mlist))
        (wl-summary-redisplay)
        (set-buffer draft-buf)
        (wl-summary-jump-to-msg (car mlist))
        (wl-summary-redisplay)
        (set-buffer draft-buf)
@@ -4906,13 +4781,13 @@ If ARG, exit virtual folder."
   (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)
@@ -4927,10 +4802,11 @@ If ARG, exit virtual folder."
              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)
        (cond ((eq wl-summary-search-via-nntp 'confirm)
+              (require 'elmo-nntp)
               (message "Search message in nntp server \"%s\" <y/n/s(elect)>?"
               (message "Search message in nntp server \"%s\" <y/n/s(elect)>?"
-                       elmo-default-nntp-server)
+                       elmo-nntp-default-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))
@@ -4954,19 +4830,19 @@ If ARG, exit virtual folder."
         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 (elmo-nntp-get-spec server-spec)
-                 user (nth 2 spec)
-                 server (nth 3 spec)
-                 port (nth 4 spec)
-                 type (nth 5 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 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-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))
+                    (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))
       (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
@@ -4981,12 +4857,12 @@ If ARG, exit virtual folder."
     (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-default-nntp-server))
+              msgid (or server elmo-nntp-default-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? "
@@ -4999,7 +4875,7 @@ If ARG, exit virtual folder."
                (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))
@@ -5088,98 +4964,101 @@ If ARG, exit virtual folder."
   "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-folder-name)
+  (let ((folder wl-summary-buffer-elmo-folder)
        (number (wl-summary-message-number))
        (summary-buf (current-buffer))
        mes-buf)
        (number (wl-summary-message-number))
        (summary-buf (current-buffer))
        mes-buf)
-    (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 (not arg) summary-buf)
-               (unless without-setup-hook
-                 (run-hooks 'wl-mail-setup-hook)))
-             t)))))
+    (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))
+      (unless 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."
   (interactive)
   (wl-draft nil nil nil nil nil
 
 (defun wl-summary-write ()
   "Write a new draft from Summary."
   (interactive)
   (wl-draft nil nil nil nil nil
-           nil nil nil nil nil nil (current-buffer))
+           (wl-summary-buffer-folder-name))
   (run-hooks 'wl-mail-setup-hook)
   (mail-position-on-field "To"))
 
 (defvar wl-summary-write-current-folder-functions
   '(wl-folder-get-newsgroups
   (run-hooks 'wl-mail-setup-hook)
   (mail-position-on-field "To"))
 
 (defvar wl-summary-write-current-folder-functions
   '(wl-folder-get-newsgroups
-;;; wl-folder-guess-mailing-list-by-refile-rule
-    )
+    wl-folder-guess-mailing-list-by-refile-rule
+    wl-folder-guess-mailing-list-by-folder-name)
   "Newsgroups or Mailing List address guess functions list.
   "Newsgroups or Mailing List address guess functions list.
-Call from `wl-summary-write-current-folder'")
+Call from `wl-summary-write-current-folder'.
+When guess function return nil, challenge next guess-function.")
 
 (defun wl-summary-write-current-folder (&optional folder)
   "Write message to current FOLDER's newsgroup or mailing-list.
 Use function list is `wl-summary-write-current-folder-functions'."
   (interactive)
 
 (defun wl-summary-write-current-folder (&optional folder)
   "Write message to current FOLDER's newsgroup or mailing-list.
 Use function list is `wl-summary-write-current-folder-functions'."
   (interactive)
-  (let (newsgroups to cc)
-    ;; default FOLDER is current buffer folder
-    (setq folder (or folder wl-summary-buffer-folder-name))
-    (let ((flist wl-summary-write-current-folder-functions)
-         guess-list)
-      (while flist
-       (setq guess-list (funcall (car flist) folder))
-       (if (or (nth 0 guess-list)      ; To:
-;;;            (nth 1 guess-list)      ; Cc:
-               (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)))))
+  ;; default FOLDER is current buffer folder
+  (setq folder (or folder (wl-summary-buffer-folder-name)))
+  (let ((func-list wl-summary-write-current-folder-functions)
+       guess-list guess-func)
+    (while func-list
+      (setq guess-list (funcall (car func-list) folder))
+      (if (null guess-list)
+         (setq func-list (cdr func-list))
+       (setq guess-func (car func-list))
+       (setq func-list nil)))
+    (if (null guess-func)
+       (wl-draft)
+      (unless (or (stringp (nth 0 guess-list))
+                 (stringp (nth 1 guess-list))
+                 (stringp (nth 2 guess-list)))
+       (error "Invalid value return guess function `%s'"
+              (symbol-name guess-func)))
+      (wl-draft (list (cons 'To (nth 0 guess-list))
+                     (cons 'Cc (nth 1 guess-list))
+                     (cons 'Newsgroups (nth 2 guess-list)))
+               nil nil nil nil folder)
+      (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-folder-name)
+  (let ((folder wl-summary-buffer-elmo-folder)
        (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 folder number)
-      (wl-select-buffer (get-buffer wl-message-buf-name))
-      (or wl-draft-use-frame
-         (split-window-vertically))
-      (other-window 1)
+      (if (and (elmo-message-use-cache-p folder number)
+              (eq (elmo-file-cache-status
+                   (elmo-file-cache-get
+                    (elmo-message-field folder number 'message-id)))
+                  'section))
+         ;; Reload.
+         (wl-summary-redisplay-internal nil nil 'force-reload)
+       (wl-summary-redisplay-internal folder number))
+      (setq mes-buf wl-message-buffer)
+      (wl-message-select-buffer mes-buf)
+      (unless wl-draft-use-frame
+       (split-window-vertically)
+       (other-window 1))
       ;; get original subject.
       (if summary-buf
          (save-excursion
            (set-buffer summary-buf)
       ;; get original subject.
       (if summary-buf
          (save-excursion
            (set-buffer summary-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)
-                          "")))))
+           (setq subject
+                 (or (elmo-message-field folder number 'subject) ""))))
+      (set-buffer mes-buf)
       (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)))))
@@ -5190,48 +5069,26 @@ 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 ((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))
+  (let ((cur-buf (current-buffer)))
     (wl-summary-toggle-disp-msg 'on)
     (wl-summary-toggle-disp-msg 'on)
-    (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)))))
+    (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original)
+      (set-buffer cur-buf)
+      (if (wl-message-next-page)
+         (wl-summary-down t)))))
 
 (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 ((type (elmo-folder-get-type wl-summary-buffer-folder-name))
-       (skip-mark-regexp (mapconcat
+  (let ((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-folder-name)
+    (if (elmo-folder-plugged-p wl-summary-buffer-elmo-folder)
        (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))
@@ -5248,8 +5105,8 @@ Use function list is `wl-summary-write-current-folder-functions'."
          (if wl-summary-buffer-disp-msg
              (wl-summary-redisplay)))
       (if (or interactive (interactive-p))
          (if wl-summary-buffer-disp-msg
              (wl-summary-redisplay)))
       (if (or interactive (interactive-p))
-         (if wl-summary-buffer-prev-folder-func
-             (funcall wl-summary-buffer-prev-folder-func)
+         (if wl-summary-buffer-prev-folder-function
+             (funcall wl-summary-buffer-prev-folder-function)
            (when wl-auto-select-next
              (setq next-entity (wl-summary-get-prev-folder))
              (if next-entity
            (when wl-auto-select-next
              (setq next-entity (wl-summary-get-prev-folder))
              (if next-entity
@@ -5265,13 +5122,12 @@ 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 ((type (elmo-folder-get-type wl-summary-buffer-folder-name))
-       (skip-mark-regexp (mapconcat
+  (let ((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-folder-name)
+    (if (elmo-folder-plugged-p wl-summary-buffer-elmo-folder)
        (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))
@@ -5288,8 +5144,8 @@ Use function list is `wl-summary-write-current-folder-functions'."
        (if wl-summary-buffer-disp-msg
            (wl-summary-redisplay))
       (if (or interactive (interactive-p))
        (if wl-summary-buffer-disp-msg
            (wl-summary-redisplay))
       (if (or interactive (interactive-p))
-         (if wl-summary-buffer-next-folder-func
-             (funcall wl-summary-buffer-next-folder-func)
+         (if wl-summary-buffer-next-folder-function
+             (funcall wl-summary-buffer-next-folder-function)
            (when wl-auto-select-next
              (setq next-entity (wl-summary-get-next-folder))
              (if next-entity
            (when wl-auto-select-next
              (setq next-entity (wl-summary-get-next-folder))
              (if next-entity
@@ -5310,8 +5166,8 @@ Use function list is `wl-summary-write-current-folder-functions'."
          (wl-summary-redisplay))
     (if (or interactive
            (interactive-p))
          (wl-summary-redisplay))
     (if (or interactive
            (interactive-p))
-       (if wl-summary-buffer-prev-folder-func
-           (funcall wl-summary-buffer-prev-folder-func)
+       (if wl-summary-buffer-prev-folder-function
+           (funcall wl-summary-buffer-prev-folder-function)
          (let (next-entity finfo)
            (when wl-auto-select-next
              (progn
          (let (next-entity finfo)
            (when wl-auto-select-next
              (progn
@@ -5368,8 +5224,8 @@ Use function list is `wl-summary-write-current-folder-functions'."
          (wl-summary-redisplay))
     (if (or interactive
            (interactive-p))
          (wl-summary-redisplay))
     (if (or interactive
            (interactive-p))
-       (if wl-summary-buffer-next-folder-func
-           (funcall wl-summary-buffer-next-folder-func)
+       (if wl-summary-buffer-next-folder-function
+           (funcall wl-summary-buffer-next-folder-function)
          (let (next-entity finfo)
            (when wl-auto-select-next
              (setq next-entity (wl-summary-get-next-unread-folder)))
          (let (next-entity finfo)
            (when wl-auto-select-next
              (setq next-entity (wl-summary-get-next-unread-folder)))
@@ -5399,19 +5255,17 @@ 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-folder-name))
+          (wl-summary-no-mime-p wl-summary-buffer-elmo-folder))
       (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)
-        (fld (or folder wl-summary-buffer-folder-name))
+  (let* ((msgdb (wl-summary-buffer-msgdb))
+        (folder (or folder wl-summary-buffer-elmo-folder))
         (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)
@@ -5430,42 +5284,55 @@ Use function list is `wl-summary-write-current-folder-functions'."
                   (setq fld-buf (get-buffer wl-folder-buffer-name)))
              (if (setq fld-win (get-buffer-window fld-buf))
                  (delete-window fld-win)))
                   (setq fld-buf (get-buffer wl-folder-buffer-name)))
              (if (setq fld-win (get-buffer-window fld-buf))
                  (delete-window fld-win)))
-          (setq wl-current-summary-buffer (current-buffer))
-         (if (wl-message-redisplay fld num 'mime msgdb force-reload)
-             (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-current-summary-buffer (current-buffer))
+         (wl-summary-mark-as-read
+          nil
+          ;; not fetched, then change server-mark.
+          (if (wl-message-redisplay folder num 'mime
+                                    (or force-reload
+                                        (string= (elmo-folder-name-internal
+                                                  folder)
+                                                 wl-draft-folder)))
+              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.
+          )
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
            (recenter (/ (- (window-height) 2) 2))
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
            (recenter (/ (- (window-height) 2) 2))
-           (if (not wl-summary-width)
+           (if (not wl-summary-indent-length-limit)
                (wl-horizontal-recenter)))
          (wl-highlight-summary-displaying)
                (wl-horizontal-recenter)))
          (wl-highlight-summary-displaying)
-         (wl-cache-prefetch-next fld num (current-buffer))
+         (wl-message-buffer-prefetch-next folder num
+                                          wl-message-buffer-prefetch-depth
+                                          (current-buffer)
+                                          wl-summary-buffer-mime-charset)
          (run-hooks 'wl-summary-redisplay-hook))
       (message "No message to display."))))
 
          (run-hooks 'wl-summary-redisplay-hook))
       (message "No message to display."))))
 
-(defun wl-summary-redisplay-no-mime (&optional folder number)
-  (interactive)
-  (let* ((msgdb wl-summary-buffer-msgdb)
-        (fld (or folder wl-summary-buffer-folder-name))
+(defun wl-summary-redisplay-no-mime (&optional ask-coding)
+  "Display message without MIME decoding.
+If ASK-CODING is non-nil, coding-system for the message is asked."
+  (interactive "P")
+  (let ((elmo-mime-display-as-is-coding-system
+        (if ask-coding
+            (or (read-coding-system "Coding system: ")
+                elmo-mime-display-as-is-coding-system)
+          elmo-mime-display-as-is-coding-system)))
+    (wl-summary-redisplay-no-mime-internal)))
+
+(defun wl-summary-redisplay-no-mime-internal (&optional folder number)
+  (let* ((fld (or folder wl-summary-buffer-elmo-folder))
         (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
@@ -5473,12 +5340,14 @@ 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-normal-message-redisplay fld num 'no-mime msgdb)
+         (wl-message-redisplay fld num 'as-is
+                               (string= (elmo-folder-name-internal fld)
+                                        wl-draft-folder))
          (wl-summary-mark-as-read nil nil t)
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
            (recenter (/ (- (window-height) 2) 2))
          (wl-summary-mark-as-read nil nil t)
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
            (recenter (/ (- (window-height) 2) 2))
-           (if (not wl-summary-width)
+           (if (not wl-summary-indent-length-limit)
                (wl-horizontal-recenter)))
          (wl-highlight-summary-displaying)
          (run-hooks 'wl-summary-redisplay-hook))
                (wl-horizontal-recenter)))
          (wl-highlight-summary-displaying)
          (run-hooks 'wl-summary-redisplay-hook))
@@ -5488,24 +5357,24 @@ 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* ((msgdb wl-summary-buffer-msgdb)
-        (fld (or folder wl-summary-buffer-folder-name))
+  (let* ((fld (or folder wl-summary-buffer-elmo-folder))
         (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)
-        (wl-message-redisplay-func wl-summary-buffer-message-redisplay-func))
+        (default-mime-charset wl-summary-buffer-mime-charset))
     (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 msgdb); t if displayed.
+         (if (wl-message-redisplay fld num 'all-header
+                                   (string= (elmo-folder-name-internal fld)
+                                            wl-draft-folder))
              (wl-summary-mark-as-read nil nil t))
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
            (recenter (/ (- (window-height) 2) 2))
              (wl-summary-mark-as-read nil nil t))
          (setq wl-summary-buffer-current-msg num)
          (when wl-summary-recenter
            (recenter (/ (- (window-height) 2) 2))
-           (if (not wl-summary-width)
+           (if (not wl-summary-indent-length-limit)
                (wl-horizontal-recenter)))
          (wl-highlight-summary-displaying)
          (run-hooks 'wl-summary-redisplay-hook))
                (wl-horizontal-recenter)))
          (wl-highlight-summary-displaying)
          (run-hooks 'wl-summary-redisplay-hook))
@@ -5514,13 +5383,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 (get-buffer wl-message-buf-name))
+    (if (setq message-buf wl-message-buffer)
        (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-select-buffer (get-buffer wl-message-buf-name)))
+         (wl-message-select-buffer wl-message-buffer))
       (wl-summary-redisplay)
       (wl-summary-redisplay)
-      (wl-select-buffer (get-buffer wl-message-buf-name)))
-    (goto-char (point-min))))
+      (wl-message-select-buffer wl-message-buffer))))
 
 (defun wl-summary-cancel-message ()
   "Cancel an article on news."
 
 (defun wl-summary-cancel-message ()
   "Cancel an article on news."
@@ -5533,7 +5401,14 @@ Use function list is `wl-summary-write-current-folder-functions'."
       (if (setq message-buf (wl-message-get-original-buffer))
          (set-buffer message-buf))
       (unless (wl-message-news-p)
       (if (setq message-buf (wl-message-get-original-buffer))
          (set-buffer message-buf))
       (unless (wl-message-news-p)
-       (error "This is not a news article; canceling is impossible"))
+       (set-buffer summary-buf)
+       (if (and (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder)
+                    'nntp)
+                (y-or-n-p "Cannot get Newsgroups. Fetch again? "))
+           (progn
+             (wl-summary-redisplay t)
+             (wl-summary-supersedes-message))
+         (error "This is not a news article; supersedes is impossible")))
       (when (yes-or-no-p "Do you really want to cancel this article? ")
        (let (from newsgroups message-id distribution buf)
          (save-excursion
       (when (yes-or-no-p "Do you really want to cancel this article? ")
        (let (from newsgroups message-id distribution buf)
          (save-excursion
@@ -5569,13 +5444,19 @@ Use function list is `wl-summary-write-current-folder-functions'."
   "Supersede current message."
   (interactive)
   (let ((summary-buf (current-buffer))
   "Supersede current message."
   (interactive)
   (let ((summary-buf (current-buffer))
-       (mmelmo-force-fetch-entire-message t)
        message-buf from)
     (wl-summary-set-message-buffer-or-redisplay)
     (if (setq message-buf (wl-message-get-original-buffer))
        (set-buffer message-buf))
     (unless (wl-message-news-p)
        message-buf from)
     (wl-summary-set-message-buffer-or-redisplay)
     (if (setq message-buf (wl-message-get-original-buffer))
        (set-buffer message-buf))
     (unless (wl-message-news-p)
-      (error "This is not a news article; supersedes is impossible"))
+      (set-buffer summary-buf)
+      (if (and (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder)
+                  'nntp)
+              (y-or-n-p "Cannot get Newsgroups. Fetch again? "))
+         (progn
+           (wl-summary-redisplay t)
+           (wl-summary-supersedes-message))
+       (error "This is not a news article; supersedes is impossible")))
     (save-excursion
       (setq from (std11-field-body "from"))
       ;; Make sure that this article was written by the user.
     (save-excursion
       (setq from (std11-field-body "from"))
       ;; Make sure that this article was written by the user.
@@ -5590,16 +5471,15 @@ Use function list is `wl-summary-write-current-folder-functions'."
                      "Supersedes: " message-id "\n"
                      (and followup-to
                           (concat "Followup-To: " followup-to "\n")))))
                      "Supersedes: " message-id "\n"
                      (and followup-to
                           (concat "Followup-To: " followup-to "\n")))))
-       (set-buffer (wl-message-get-original-buffer))
+       (if message-buf (set-buffer message-buf))
        (wl-draft-edit-string (buffer-substring (point-min) (point-max)))))))
 
 (defun wl-summary-save (&optional arg wl-save-dir)
   (interactive)
   (let ((filename)
        (wl-draft-edit-string (buffer-substring (point-min) (point-max)))))))
 
 (defun wl-summary-save (&optional arg wl-save-dir)
   (interactive)
   (let ((filename)
-       (num (wl-summary-message-number))
-       (mmelmo-force-fetch-entire-message t))
+       (num (wl-summary-message-number)))
     (if (null wl-save-dir)
     (if (null wl-save-dir)
-       (setq wl-save-dir wl-tmp-dir))
+       (setq wl-save-dir wl-temporary-file-directory))
     (if num
        (save-excursion
          (setq filename (expand-file-name
     (if num
        (save-excursion
          (setq filename (expand-file-name
@@ -5626,7 +5506,8 @@ Use function list is `wl-summary-write-current-folder-functions'."
       (narrow-to-region beg end)
       (goto-char (point-min))
       (let ((wl-save-dir
       (narrow-to-region beg end)
       (goto-char (point-min))
       (let ((wl-save-dir
-            (wl-read-directory-name "Save to directory: " wl-tmp-dir)))
+            (wl-read-directory-name "Save to directory: "
+                                    wl-temporary-file-directory)))
        (if (null (file-exists-p wl-save-dir))
            (make-directory wl-save-dir))
        (if (eq wl-summary-buffer-view 'thread)
        (if (null (file-exists-p wl-save-dir))
            (make-directory wl-save-dir))
        (if (eq wl-summary-buffer-view 'thread)
@@ -5672,13 +5553,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* ((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)
+           (let ((buffer (generate-new-buffer " *print*")))
              (copy-to-buffer buffer (point-min) (point-max))
              (set-buffer buffer)
              (copy-to-buffer buffer (point-min) (point-max))
              (set-buffer buffer)
-             (funcall wl-print-buffer-func)
+             (funcall wl-print-buffer-function)
              (kill-buffer buffer)))
        (message "")))))
 
              (kill-buffer buffer)))
        (message "")))))
 
@@ -5692,18 +5570,17 @@ 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* ((message-buffer (get-buffer wl-message-buf-name))
-                  (buffer (generate-new-buffer " *print*"))
+           (wl-summary-set-message-buffer-or-redisplay)
+           ;; (wl-summary-redisplay-internal)
+           (let* ((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)
@@ -5715,7 +5592,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 message-buffer)
+             (set-buffer wl-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
@@ -5726,7 +5603,7 @@ Use function list is `wl-summary-write-current-folder-functions'."
                         (list "/pagenumberstring load"
                               (concat "(" wl-ps-date ")"))))
                    (run-hooks 'wl-ps-print-hook)
                         (list "/pagenumberstring load"
                               (concat "(" wl-ps-date ")"))))
                    (run-hooks 'wl-ps-print-hook)
-                   (funcall wl-ps-print-buffer-func filename))
+                   (funcall wl-ps-print-buffer-function filename))
                (kill-buffer buffer)))))
       (message ""))))
 
                (kill-buffer buffer)))))
       (message ""))))
 
@@ -5734,119 +5611,24 @@ 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-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-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-pack-number (&optional arg)
   (interactive "P")
 
 (defun wl-summary-pack-number (&optional arg)
   (interactive "P")
-  (setq wl-summary-buffer-msgdb
-       (elmo-pack-number
-        wl-summary-buffer-folder-name wl-summary-buffer-msgdb arg))
+  (elmo-folder-pack-numbers wl-summary-buffer-elmo-folder)
   (let (wl-use-scoring)
     (wl-summary-rescan)))
 
   (let (wl-use-scoring)
     (wl-summary-rescan)))
 
@@ -5865,7 +5647,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-message-get-original-buffer)))
+       (set-buffer (setq orig-buf (wl-summary-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
@@ -5882,15 +5664,15 @@ Use function list is `wl-summary-write-current-folder-functions'."
       (set-buffer tmp-buf)
       (message "Exec %s..." wl-prog-uudecode)
       (unwind-protect
       (set-buffer tmp-buf)
       (message "Exec %s..." wl-prog-uudecode)
       (unwind-protect
-         (let ((decode-dir wl-tmp-dir))
+         (let ((decode-dir wl-temporary-file-directory))
            (if (not wl-prog-uudecode-no-stdout-option)
                (setq filename (read-file-name "Save to file: "
                                               (expand-file-name
                                                (elmo-safe-filename filename)
            (if (not wl-prog-uudecode-no-stdout-option)
                (setq filename (read-file-name "Save to file: "
                                               (expand-file-name
                                                (elmo-safe-filename filename)
-                                               wl-tmp-dir)))
+                                               wl-temporary-file-directory)))
              (setq decode-dir
                    (wl-read-directory-name "Save to directory: "
              (setq decode-dir
                    (wl-read-directory-name "Save to directory: "
-                                           wl-tmp-dir))
+                                           wl-temporary-file-directory))
              (setq filename (expand-file-name filename decode-dir)))
            (if (file-exists-p filename)
                (or (yes-or-no-p (format "File %s exists. Save anyway? "
              (setq filename (expand-file-name filename decode-dir)))
            (if (file-exists-p filename)
                (or (yes-or-no-p (format "File %s exists. Save anyway? "
@@ -5918,123 +5700,50 @@ 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)))))
 
-(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"))))
+;; 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-default-get-next-msg (msg)
 
 (defun wl-summary-default-get-next-msg (msg)
-  (let (next)
-    (if (and (not wl-summary-buffer-target-mark-list)
-            (eq wl-summary-buffer-view 'thread)
-            (if (eq wl-summary-move-direction-downward nil)
-                (setq next (wl-thread-get-prev-unread msg))
-              (setq next (wl-thread-get-next-unread msg))))
-       next
-      (save-excursion
-       (wl-summary-jump-to-msg msg)
-       (let (wl-summary-buffer-disp-msg)
-         (if (eq wl-summary-move-direction-downward nil)
-             (unless (wl-summary-cursor-up)
-               (wl-summary-prev))
-           (unless (wl-summary-cursor-down)
-             (wl-summary-next)))
-         (wl-summary-message-number))))))
-
-(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 (not 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)
-                 (if wl-cache-prefetch-debug
-                     (message "Reading %d... done" msg))))))))))
+  (or (wl-summary-next-message msg
+                              (if wl-summary-move-direction-downward 'down
+                                'up)
+                              nil)
+      (cadr (memq msg (if wl-summary-move-direction-downward
+                         wl-summary-buffer-number-list
+                       (reverse wl-summary-buffer-number-list))))))
 
 (defun wl-summary-save-current-message ()
   "Save current message for `wl-summary-yank-saved-message'."
 
 (defun wl-summary-save-current-message ()
   "Save current message for `wl-summary-yank-saved-message'."