* wl-dnd.el (wl-dnd-drop-func): Fix.
[elisp/wanderlust.git] / wl / wl-summary.el
index 5b0f82f..b815513 100644 (file)
@@ -60,6 +60,7 @@
 (defvar dragdrop-drop-functions)
 (defvar scrollbar-height)
 (defvar mail-reply-buffer)
+(defvar elmo-global-flag-list)
 
 (defvar wl-summary-buffer-name "Summary")
 (defvar wl-summary-mode-map nil)
 (defvar wl-summary-buffer-temp-mark-column nil)
 (defvar wl-summary-buffer-persistent-mark-column nil)
 
+(defvar wl-summary-buffer-unsync-mark-number-list nil)
+
 (defvar wl-summary-buffer-persistent nil)
 (defvar wl-summary-buffer-thread-nodes nil)
 (defvar wl-summary-buffer-target-mark-list 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-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-window-scroll-functions nil)
 (defvar wl-summary-buffer-number-list nil)
 (defvar wl-summary-buffer-folder-name nil)
 (defvar wl-summary-buffer-line-formatter nil)
 (defvar wl-thread-horizontal-str-internal nil)
 (defvar wl-thread-space-str-internal nil)
 (defvar wl-summary-last-visited-folder nil)
-(defvar wl-read-folder-hist nil)
+(defvar wl-read-folder-history nil)
 (defvar wl-summary-scored nil)
 (defvar wl-crosspost-alist-modified nil)
 (defvar wl-summary-alike-hashtb nil)
 (defvar wl-ps-preprint-hook nil)
 (defvar wl-ps-print-hook nil)
 
+(defvar wl-thread-saved-entity-hashtb-internal nil)
+
 (make-variable-buffer-local 'wl-summary-buffer-elmo-folder)
 (make-variable-buffer-local 'wl-summary-search-buf-folder-name)
 (make-variable-buffer-local 'wl-summary-buffer-disp-msg)
 (make-variable-buffer-local 'wl-summary-buffer-number-column)
 (make-variable-buffer-local 'wl-summary-buffer-temp-mark-column)
 (make-variable-buffer-local 'wl-summary-buffer-persistent-mark-column)
+(make-variable-buffer-local 'wl-summary-buffer-unsync-mark-number-list)
 (make-variable-buffer-local 'wl-summary-buffer-persistent)
 (make-variable-buffer-local 'wl-summary-buffer-thread-nodes)
 (make-variable-buffer-local 'wl-summary-buffer-prev-refile-destination)
 (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-window-scroll-functions)
 (make-variable-buffer-local 'wl-summary-buffer-number-list)
 (make-variable-buffer-local 'wl-summary-buffer-folder-name)
 (make-variable-buffer-local 'wl-summary-buffer-line-formatter)
@@ -244,7 +251,7 @@ See also variable `wl-use-petname'."
          string)
     string))
 
-(defvar wl-summary-sort-specs '(number date subject from list-info))
+(defvar wl-summary-sort-specs '(number date subject from list-info size))
 (defvar wl-summary-default-sort-spec 'date)
 
 (defvar wl-summary-mode-menu-spec
@@ -272,6 +279,7 @@ See also variable `wl-use-petname'."
     ["Stick" wl-summary-stick t]
     ("Sort"
      ["By Number" wl-summary-sort-by-number t]
+     ["By Size" wl-summary-sort-by-size t]
      ["By Date" wl-summary-sort-by-date t]
      ["By From" wl-summary-sort-by-from t]
      ["By Subject" wl-summary-sort-by-subject t]
@@ -279,15 +287,16 @@ See also variable `wl-use-petname'."
     "----"
     ("Message Operation"
      ["Mark as read"    wl-summary-mark-as-read t]
-     ["Mark as important" wl-summary-mark-as-important t]
+     ["Set flags"      wl-summary-set-flags t]
      ["Mark as unread"   wl-summary-mark-as-unread t]
+     ["Mark as answered" wl-summary-mark-as-answered t]
      ["Set dispose mark" wl-summary-dispose t]
      ["Set refile mark" wl-summary-refile t]
      ["Set copy mark"   wl-summary-copy t]
      ["Set resend mark" wl-summary-resend t]
-     ["Prefetch"        wl-summary-prefetch t]
+     ["Prefetch"       wl-summary-prefetch t]
      ["Set target mark" wl-summary-target-mark t]
-     ["Unmark"          wl-summary-unmark t]
+     ["Unmark"         wl-summary-unmark t]
      ["Save"           wl-summary-save t]
      ["Cancel posted news" wl-summary-cancel-message t]
      ["Supersedes message" wl-summary-supersedes-message t]
@@ -300,8 +309,9 @@ See also variable `wl-use-petname'."
      ["Open all"     wl-thread-open-all (eq wl-summary-buffer-view 'thread)]
      ["Close all"    wl-thread-close-all (eq wl-summary-buffer-view 'thread)]
      ["Mark as read" wl-thread-mark-as-read (eq wl-summary-buffer-view 'thread)]
-     ["Mark as important"      wl-thread-mark-as-important (eq wl-summary-buffer-view 'thread)]
+     ["Set flags"      wl-thread-set-flags (eq wl-summary-buffer-view 'thread)]
      ["Mark as unread"         wl-thread-mark-as-unread (eq wl-summary-buffer-view 'thread)]
+     ["Mark as answered"       wl-thread-mark-as-answered (eq wl-summary-buffer-view 'thread)]
      ["Set delete mark"  wl-thread-delete (eq wl-summary-buffer-view 'thread)]
      ["Set refile mark"  wl-thread-refile (eq wl-summary-buffer-view 'thread)]
      ["Set copy mark"    wl-thread-copy (eq wl-summary-buffer-view 'thread)]
@@ -312,8 +322,9 @@ See also variable `wl-use-petname'."
      ["Execute"      wl-thread-exec (eq wl-summary-buffer-view 'thread)])
     ("Region Operation"
      ["Mark as read" wl-summary-mark-as-read-region t]
-     ["Mark as important" wl-summary-mark-as-important-region t]
+     ["Set flags" wl-summary-set-flags-region t]
      ["Mark as unread" wl-summary-mark-as-unread-region t]
+     ["Mark as answered" wl-summary-mark-as-answered-region t]
      ["Set dispose mark" wl-summary-dispose-region t]
      ["Set refile mark" wl-summary-refile-region t]
      ["Set copy mark" wl-summary-copy-region t]
@@ -324,7 +335,7 @@ See also variable `wl-use-petname'."
      ["Execute" wl-summary-exec-region t])
     ("Mark Operation"
      ["Mark as read" wl-summary-target-mark-mark-as-read t]
-     ["Mark as important" wl-summary-target-mark-mark-as-important t]
+     ["Set flags" wl-summary-target-mark-set-flags t]
      ["Mark as unread" wl-summary-target-mark-mark-as-unread t]
      ["Set delete mark" wl-summary-target-mark-delete t]
      ["Set refile mark" wl-summary-target-mark-refile t]
@@ -370,6 +381,11 @@ See also variable `wl-use-petname'."
     (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)
+    ;; For Meadow2
+    (define-key wl-summary-mode-map [mouse-wheel1]
+      'wl-summary-wheel-dispatcher)
+    (define-key wl-summary-mode-map [S-mouse-wheel1]
+      'wl-summary-wheel-dispatcher)
     (define-key wl-summary-mode-map [mouse-2] 'wl-summary-click)))
 
 (if wl-summary-mode-map
@@ -398,7 +414,7 @@ See also variable `wl-use-petname'."
   (define-key wl-summary-mode-map "E"    'wl-summary-reedit)
   (define-key wl-summary-mode-map "\eE"  'wl-summary-resend-bounced-mail)
   (define-key wl-summary-mode-map "f"    'wl-summary-forward)
-  (define-key wl-summary-mode-map "$"    'wl-summary-mark-as-important)
+  (define-key wl-summary-mode-map "$"    'wl-summary-set-flags)
   (define-key wl-summary-mode-map "&"    'wl-summary-mark-as-answered)
   (define-key wl-summary-mode-map "@"    'wl-summary-edit-addresses)
 
@@ -471,12 +487,14 @@ See also variable `wl-use-petname'."
   (define-key wl-summary-mode-map "t*" 'wl-thread-target-mark)
   (define-key wl-summary-mode-map "to" 'wl-thread-refile)
   (define-key wl-summary-mode-map "tO" 'wl-thread-copy)
+  (define-key wl-summary-mode-map "t\M-o" 'wl-thread-refile-prev-destination)
   (define-key wl-summary-mode-map "td" 'wl-thread-dispose)
   (define-key wl-summary-mode-map "tD" 'wl-thread-delete)
   (define-key wl-summary-mode-map "t~" 'wl-thread-resend)
   (define-key wl-summary-mode-map "tu" 'wl-thread-unmark)
   (define-key wl-summary-mode-map "t!" 'wl-thread-mark-as-unread)
-  (define-key wl-summary-mode-map "t$" 'wl-thread-mark-as-important)
+  (define-key wl-summary-mode-map "t$" 'wl-thread-set-flags)
+  (define-key wl-summary-mode-map "t&" 'wl-thread-mark-as-answered)
   (define-key wl-summary-mode-map "ty" 'wl-thread-save)
   (define-key wl-summary-mode-map "ts" 'wl-thread-set-parent)
 
@@ -485,6 +503,7 @@ See also variable `wl-use-petname'."
   (define-key wl-summary-mode-map "mi"   'wl-summary-target-mark-prefetch)
   (define-key wl-summary-mode-map "mo"   'wl-summary-target-mark-refile)
   (define-key wl-summary-mode-map "mO"   'wl-summary-target-mark-copy)
+  (define-key wl-summary-mode-map "m\M-o" 'wl-summary-target-mark-refile-prev-destination)
   (define-key wl-summary-mode-map "md"   'wl-summary-target-mark-dispose)
   (define-key wl-summary-mode-map "mD"   'wl-summary-target-mark-delete)
   (define-key wl-summary-mode-map "m~"   'wl-summary-target-mark-resend)
@@ -494,7 +513,7 @@ See also variable `wl-use-petname'."
   (define-key wl-summary-mode-map "my"   'wl-summary-target-mark-save)
   (define-key wl-summary-mode-map "mR"   'wl-summary-target-mark-mark-as-read)
   (define-key wl-summary-mode-map "m!"   'wl-summary-target-mark-mark-as-unread)
-  (define-key wl-summary-mode-map "m$"   'wl-summary-target-mark-mark-as-important)
+  (define-key wl-summary-mode-map "m$"   'wl-summary-target-mark-set-flags)
   (define-key wl-summary-mode-map "mU"   'wl-summary-target-mark-uudecode)
   (define-key wl-summary-mode-map "ma"   'wl-summary-target-mark-all)
   (define-key wl-summary-mode-map "mt"   'wl-summary-target-mark-thread)
@@ -513,12 +532,14 @@ See also variable `wl-use-petname'."
   (define-key wl-summary-mode-map "r*"   'wl-summary-target-mark-region)
   (define-key wl-summary-mode-map "ro"   'wl-summary-refile-region)
   (define-key wl-summary-mode-map "rO"   'wl-summary-copy-region)
+  (define-key wl-summary-mode-map "r\M-o" 'wl-summary-refile-prev-destination-region)
   (define-key wl-summary-mode-map "rd"   'wl-summary-dispose-region)
   (define-key wl-summary-mode-map "rD"   'wl-summary-delete-region)
   (define-key wl-summary-mode-map "r~"   'wl-summary-resend-region)
   (define-key wl-summary-mode-map "ru"   'wl-summary-unmark-region)
   (define-key wl-summary-mode-map "r!"   'wl-summary-mark-as-unread-region)
-  (define-key wl-summary-mode-map "r$"   'wl-summary-mark-as-important-region)
+  (define-key wl-summary-mode-map "r$"   'wl-summary-set-flags-region)
+  (define-key wl-summary-mode-map "r&"   'wl-summary-mark-as-answered-region)
   (define-key wl-summary-mode-map "ry"   'wl-summary-save-region)
 
   ;; score commands
@@ -533,6 +554,8 @@ See also variable `wl-use-petname'."
   (define-key wl-summary-mode-map "hm"  'wl-score-set-mark-below)
   (define-key wl-summary-mode-map "hx"   'wl-score-set-expunge-below)
 
+  ;; misc
+  (define-key wl-summary-mode-map "\C-c\C-f" 'wl-summary-toggle-header-narrowing)
   (define-key wl-summary-mode-map "\M-t" 'wl-toggle-plugged)
   (define-key wl-summary-mode-map "\C-t" 'wl-plugged-change)
   ;;
@@ -550,6 +573,39 @@ See also variable `wl-use-petname'."
       (not (wl-thread-entity-parent-invisible-p
            (wl-thread-get-entity number)))))
 
+(defun wl-summary-update-mark-and-highlight-window (&optional win beg)
+  "A function to be called as window-scroll-functions."
+  (with-current-buffer (window-buffer win)
+    (when (eq major-mode 'wl-summary-mode)
+      (let ((beg (or beg (window-start win)))
+           (end (condition-case nil
+                    (window-end win t) ; old emacsen doesn't support 2nd arg.
+                  (error (window-end win))))
+           number flags
+           wl-summary-highlight)
+       (save-excursion
+         (goto-char beg)
+         (while (and (< (point) end) (not (eobp)))
+           (when (null (get-text-property (point) 'face))
+             (setq number (wl-summary-message-number)
+                   flags (elmo-message-flags wl-summary-buffer-elmo-folder
+                                             number))
+             (setq wl-summary-highlight nil)
+             (wl-summary-update-persistent-mark number flags)
+             (setq wl-summary-highlight t)
+             (wl-highlight-summary-current-line number flags))
+           (forward-line 1)))))
+    (set-buffer-modified-p nil)))
+
+(defun wl-summary-window-scroll-functions ()
+  (cond ((and wl-summary-lazy-highlight
+             wl-summary-lazy-update-mark)
+        (list 'wl-summary-update-mark-and-highlight-window))
+       (wl-summary-lazy-highlight
+        (list 'wl-highlight-summary-window))
+       (wl-summary-lazy-update-mark
+        (list 'wl-summary-update-mark-window))))
+
 (defun wl-status-update ()
   (interactive)
   (wl-address-init))
@@ -557,8 +613,7 @@ See also variable `wl-use-petname'."
 (defun wl-summary-display-top ()
   (interactive)
   (goto-char (point-min))
-  (when wl-summary-lazy-highlight
-    (wl-highlight-summary-window))
+  (run-hooks 'wl-summary-buffer-window-scroll-functions)
   (if wl-summary-buffer-disp-msg
       (wl-summary-redisplay)))
 
@@ -566,8 +621,7 @@ See also variable `wl-use-petname'."
   (interactive)
   (goto-char (point-max))
   (forward-line -1)
-  (when wl-summary-lazy-highlight
-    (wl-highlight-summary-window))
+  (run-hooks 'wl-summary-buffer-window-scroll-functions)
   (if wl-summary-buffer-disp-msg
       (wl-summary-redisplay)))
 
@@ -663,15 +717,20 @@ you."
   (let ((column wl-summary-buffer-number-column)
        (formatter wl-summary-buffer-line-formatter)
        (dummy-temp (char-to-string 200))
-       (wl-summary-new-mark (char-to-string 201)) ; bind only for the check.
-       (wl-summary-flag-priority-list '(new))     ; ditto.
+       ;; bind only for the check.
+       (wl-summary-new-uncached-mark (char-to-string 201))
+       (wl-summary-persistent-mark-priority-list '(new))     ; ditto.
+       (lang wl-summary-buffer-weekday-name-lang)
+       wl-summary-highlight
        temp persistent)
     (with-temp-buffer
       (setq wl-summary-buffer-number-column column
-           wl-summary-buffer-line-formatter formatter)
+           wl-summary-buffer-line-formatter formatter
+           wl-summary-buffer-weekday-name-lang lang)
       (insert
        (wl-summary-create-line
        (elmo-msgdb-make-message-entity
+        (luna-make-entity 'modb-entity-handler)
         :number 10000
         :from "foo"
         :subject "bar"
@@ -684,9 +743,10 @@ you."
       (setq temp (save-excursion
                   (when (search-forward dummy-temp nil t)
                     (current-column)))
-           persistent (save-excursion
-                        (when (search-forward wl-summary-new-mark nil t)
-                          (current-column)))))
+           persistent
+           (save-excursion
+             (when (search-forward wl-summary-new-uncached-mark nil t)
+               (current-column)))))
     (setq wl-summary-buffer-temp-mark-column temp
          wl-summary-buffer-persistent-mark-column persistent)))
 
@@ -724,7 +784,6 @@ you."
    wl-summary-buffer-mode-line-formatter
    wl-summary-mode-line-format
    wl-summary-mode-line-format-spec-alist)
-  (wl-summary-detect-mark-position)
   (setq wl-summary-buffer-persistent
        (wl-folder-persistent-p (elmo-folder-name-internal folder)))
   (elmo-folder-set-persistent-internal folder wl-summary-buffer-persistent)
@@ -777,18 +836,24 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
        selective-display-ellipses nil)
   (wl-mode-line-buffer-identification '(wl-summary-buffer-mode-line))
   (easy-menu-add wl-summary-mode-menu)
-  (when wl-summary-lazy-highlight
-    (if wl-on-xemacs
-       (progn
-         (make-local-variable 'pre-idle-hook)
-         (add-hook 'pre-idle-hook 'wl-highlight-summary-window))
-      (make-local-variable 'window-scroll-functions)
-      (add-hook 'window-scroll-functions 'wl-highlight-summary-window)))
+  (setq wl-summary-buffer-window-scroll-functions
+       (wl-summary-window-scroll-functions))
+  (when wl-summary-buffer-window-scroll-functions
+    (let ((hook (if wl-on-xemacs 'pre-idle-hook 'window-scroll-functions)))
+      (make-local-hook hook)
+      (dolist (function wl-summary-buffer-window-scroll-functions)
+       (add-hook hook function nil t))))
   ;; This hook may contain the function `wl-setup-summary' for reasons
   ;; of system internal to accord facilities for the Emacs variants.
   (run-hooks 'wl-summary-mode-hook))
 
 ;;;
+(defun wl-summary-overview-entity-compare-by-size (x y)
+   "Compare entity X and Y by size."
+   (< (elmo-message-entity-field x 'size)
+      (elmo-message-entity-field y 'size)))
+
+
 (defun wl-summary-overview-entity-compare-by-date (x y)
   "Compare entity X and Y by date."
   (condition-case nil
@@ -809,10 +874,10 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
   "Compare entity X and Y by from."
   (string<
    (wl-address-header-extract-address
-    (or (elmo-message-entity-field x 'from)
+    (or (elmo-message-entity-field x 'from t)
        wl-summary-no-from-message))
    (wl-address-header-extract-address
-    (or (elmo-message-entity-field y 'from)
+    (or (elmo-message-entity-field y 'from t)
        wl-summary-no-from-message))))
 
 (defun wl-summary-overview-entity-compare-by-subject (x y)
@@ -883,7 +948,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
   (interactive)
   (wl-summary-rescan "list-info"))
 
-(defun wl-summary-rescan (&optional sort-by disable-killed)
+(defun wl-summary-rescan (&optional sort-by disable-killed disable-thread)
   "Rescan current folder without updating."
   (interactive)
   (let ((elmo-mime-charset wl-summary-buffer-mime-charset)
@@ -894,6 +959,12 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
        (buffer-read-only nil)
        (numbers (elmo-folder-list-messages wl-summary-buffer-elmo-folder
                                            (not disable-killed) t)) ; in-msgdb
+       (wl-thread-saved-entity-hashtb-internal (and (not disable-thread)
+                                                    wl-thread-entity-hashtb))
+       (wl-summary-search-parent-by-subject-regexp
+        (and disable-thread wl-summary-search-parent-by-subject-regexp))
+       (wl-summary-divide-thread-when-subject-changed
+        (and disable-thread wl-summary-divide-thread-when-subject-changed))
        expunged)
     (erase-buffer)
     (message "Re-scanning...")
@@ -915,6 +986,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
          wl-thread-entities nil
          wl-summary-scored nil
          wl-summary-buffer-number-list nil
+         wl-summary-buffer-unsync-mark-number-list nil
          wl-summary-buffer-target-mark-list nil
          wl-summary-buffer-temp-mark-list nil
          wl-summary-delayed-update nil)
@@ -936,7 +1008,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
       (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
+                (elmo-message-entity-number
                  (cdar wl-summary-delayed-update)))
        (wl-summary-insert-message
         (cdar wl-summary-delayed-update)
@@ -1004,18 +1076,9 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
       "folder mode"))
 
 (defun wl-summary-set-message-modified ()
-  (elmo-folder-set-message-modified
-   wl-summary-buffer-elmo-folder t)
-  (setq wl-summary-buffer-message-modified t)
-  (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))
-(defun wl-summary-mark-modified-p ()
-  (elmo-folder-mark-modified-internal
-   wl-summary-buffer-elmo-folder))
 (defun wl-summary-set-thread-modified ()
   (setq wl-summary-buffer-thread-modified t))
 (defun wl-summary-thread-modified-p ()
@@ -1042,7 +1105,6 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
     ;; save the current summary buffer view.
     (if (and wl-summary-cache-use
             (or (wl-summary-message-modified-p)
-                (wl-summary-mark-modified-p)
                 (wl-summary-thread-modified-p)))
        (wl-summary-save-view-cache))))
 
@@ -1115,6 +1177,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
             wl-folder-buffer-cur-point
             (goto-char wl-folder-buffer-cur-point))
        (setq wl-folder-buffer-cur-path nil)
+       (setq wl-folder-buffer-last-visited-entity-id wl-folder-buffer-cur-entity-id)
        (setq wl-folder-buffer-cur-entity-id nil)
        (wl-delete-all-overlays)
        (if wl-summary-exit-next-move
@@ -1166,7 +1229,8 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
                                     nil
                                   wl-use-scoring)))
             (wl-summary-rescan nil
-                               (string-match "noscore" range))
+                               (string-match "noscore" range)
+                               (string-match "thread" range))
             (and msg (wl-summary-jump-to-msg msg))))
          ((string= range "mark")
           (let ((msg (wl-summary-message-number)))
@@ -1329,53 +1393,67 @@ If ARG is non-nil, checking is omitted."
                                (null wl-prefetch-threshold)
                                (< size wl-prefetch-threshold))))
           mark 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
-                           17
-                           (funcall wl-summary-from-function
-                            (eword-decode-string
-                             (elmo-delete-char
-                              ?\"
-                              (or
-                               (elmo-message-field
-                                wl-summary-buffer-elmo-folder
-                                number 'from)
-                               "??")))))) " ]")
-                       size))))
-             (message ""))             ; flush.
-           (if force-read
-               (save-excursion
-                 (save-match-data
-                   ;; online
-                   (if (or arg (not file-cached))
-                       (elmo-message-encache
-                        wl-summary-buffer-elmo-folder
-                        number))
-                   (elmo-message-set-cached wl-summary-buffer-elmo-folder
-                                            number t)
-                   (when (and (wl-summary-jump-to-msg number)
-                              (wl-summary-update-persistent-mark))
-                     (sit-for 0)
-                     (wl-summary-count-unread)
-                     (wl-summary-update-modeline)
-                     (wl-folder-update-unread
-                      (wl-summary-buffer-folder-name)
-                      (+ wl-summary-buffer-unread-count
-                         wl-summary-buffer-new-count))))
-                 t)
-             nil))))))
+      (ignore-errors
+       (when (and (or arg (not file-cached))
+                  size (not force-read) wl-prefetch-confirm)
+         (let ((wl-message-entity (elmo-message-entity
+                                   wl-summary-buffer-elmo-folder
+                                   number)))
+           (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
+                         17
+                         (funcall
+                          wl-summary-from-function
+                          (elmo-delete-char
+                           ?\"
+                           (or
+                            (elmo-message-entity-field
+                             wl-message-entity
+                             'from t)
+                            "??")))))
+                      " ]")
+                     size))))
+           (message "")))              ; flush.
+       (if force-read
+           (save-excursion
+             (save-match-data
+               ;; online
+               (if (or arg (not file-cached))
+                   (elmo-message-encache
+                    wl-summary-buffer-elmo-folder
+                    number))
+               (elmo-message-set-cached wl-summary-buffer-elmo-folder
+                                        number t)
+               (when (and (wl-summary-jump-to-msg number)
+                          (wl-summary-update-persistent-mark))
+                 (sit-for 0)
+                 (wl-summary-count-unread)
+                 (wl-summary-update-modeline)
+                 (wl-folder-update-unread
+                  (wl-summary-buffer-folder-name)
+                  (+ wl-summary-buffer-unread-count
+                     wl-summary-buffer-new-count))))
+             t)
+         nil)))))
+
+(defsubst wl-summary-narrow-to-region (beg end)
+  (narrow-to-region
+   (save-excursion
+     (goto-char beg)
+     (beginning-of-line)
+     (point))
+   (save-excursion
+     (goto-char end)
+     (if (eq (current-column) 0) (beginning-of-line) (end-of-line))
+     (point))))
 
 (defun wl-summary-prefetch-region-no-mark (beg end &optional prefetch-marks)
   (interactive "r")
@@ -1387,7 +1465,7 @@ If ARG is non-nil, checking is omitted."
     (save-excursion
       (setq start-pos (point))
       (save-restriction
-       (narrow-to-region beg end)
+       (wl-summary-narrow-to-region beg end)
        ;; collect prefetch targets.
        (message "Collecting marks...")
        (goto-char (point-min))
@@ -1443,7 +1521,7 @@ If ARG is non-nil, checking is omitted."
   (interactive "r")
   (save-excursion
     (save-restriction
-      (narrow-to-region beg end)
+      (wl-summary-narrow-to-region beg end)
       (goto-char (point-min))
       (if (eq wl-summary-buffer-view 'thread)
          (let (number-list)
@@ -1468,7 +1546,7 @@ If ARG is non-nil, checking is omitted."
   (interactive "r")
   (save-excursion
     (save-restriction
-      (narrow-to-region beg end)
+      (wl-summary-narrow-to-region beg end)
       (goto-char (point-min))
       (if (eq wl-summary-buffer-view 'thread)
          (let (number-list)
@@ -1489,15 +1567,14 @@ If ARG is non-nil, checking is omitted."
            (forward-line 1))
          (wl-summary-mark-as-unread number-list))))))
 
-(defun wl-summary-mark-as-important-region (beg end)
+(defun wl-summary-set-flags-region (beg end)
   (interactive "r")
   (save-excursion
     (save-restriction
-      (narrow-to-region beg end);(save-excursion (goto-char end)
-                                       ;    (end-of-line) (point)))
+      (wl-summary-narrow-to-region beg end)
       (goto-char (point-min))
-      (if (eq wl-summary-buffer-view 'thread)
-         (progn
+      (let (flags)
+       (if (eq wl-summary-buffer-view 'thread)
            (while (not (eobp))
              (let* ((number (wl-summary-message-number))
                     (entity (wl-thread-get-entity number))
@@ -1505,18 +1582,47 @@ If ARG is non-nil, checking is omitted."
                (if (wl-thread-entity-get-opened entity)
                    ;; opened...mark line.
                    ;; Crossposts are not processed
-                   (wl-summary-mark-as-important)
+                   (setq flags (wl-summary-set-flags-internal
+                               number
+                               flags))
                  ;; closed
-                 (wl-summary-mark-as-important) ; mark itself.
-                 (setq children
-                       (delq number (wl-thread-get-children-msgs number)))
-                 (while children
-                   (wl-summary-mark-as-important (car children))
-                   (setq children (cdr children))))
-               (forward-line 1))))
-       (while (not (eobp))
-         (wl-summary-mark-as-important)
-         (forward-line 1)))))
+                 (setq flags (wl-summary-set-flags-internal
+                             (wl-thread-get-children-msgs number)
+                             flags)))
+               (forward-line 1)))
+         (while (not (eobp))
+           (setq flags (wl-summary-set-flags-internal
+                       (wl-summary-message-number) flags))
+           (forward-line 1))))))
+  (wl-summary-count-unread)
+  (wl-summary-update-modeline))
+
+(defun wl-summary-mark-as-answered-region (beg end)
+  (interactive "r")
+  (save-excursion
+    (save-restriction
+      (wl-summary-narrow-to-region beg end)
+      (goto-char (point-min))
+      (let ((inverse (elmo-message-flagged-p wl-summary-buffer-elmo-folder
+                                            (wl-summary-message-number)
+                                            'answered)))
+       (if (eq wl-summary-buffer-view 'thread)
+           (while (not (eobp))
+             (let* ((number (wl-summary-message-number))
+                    (entity (wl-thread-get-entity number))
+                    children)
+               (if (wl-thread-entity-get-opened entity)
+                   ;; opened...mark line.
+                   ;; Crossposts are not processed
+                   (wl-summary-mark-as-answered-internal inverse)
+                 ;; closed
+                 (wl-summary-mark-as-answered-internal
+                  inverse
+                  (wl-thread-get-children-msgs number)))
+               (forward-line 1)))
+         (while (not (eobp))
+           (wl-summary-mark-as-answered-internal inverse)
+           (forward-line 1))))))
   (wl-summary-count-unread)
   (wl-summary-update-modeline))
 
@@ -1527,9 +1633,10 @@ If ARG is non-nil, checking is omitted."
       (let ((folder wl-summary-buffer-elmo-folder)
            (cur-buf (current-buffer)))
        (message "Setting all msgs as read...")
-       (elmo-folder-mark-as-read folder
-                                 (elmo-folder-list-unreads
-                                  folder))
+       (elmo-folder-set-flag
+        folder
+        (elmo-folder-list-flagged folder 'unread 'in-msgdb)
+        'read)
        (save-excursion
          (goto-char (point-min))
          (while (not (eobp))
@@ -1614,21 +1721,35 @@ If ARG is non-nil, checking is omitted."
       ;;(message (concat deleting-info "done"))
       (wl-summary-count-unread)
       (wl-summary-update-modeline)
-      (wl-folder-set-folder-updated
-       (elmo-folder-name-internal wl-summary-buffer-elmo-folder)
-       (list 0
-            (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count)
-            (elmo-folder-length wl-summary-buffer-elmo-folder))))))
+      (wl-summary-folder-info-update))))
 
-(defun wl-summary-update-status-marks ()
+(defun wl-summary-update-status-marks (beg end &optional check)
   "Synchronize status marks on current buffer to the msgdb."
-  (interactive)
+  (interactive "r")
   (save-excursion
-    (goto-char (point-min))
-    (while (not (eobp))
-      (wl-summary-update-persistent-mark)
+    (goto-char beg)
+    (while (and (< (point) end) (not (eobp)))
+      (when (or (not check)
+               (let ((number (wl-summary-message-number)))
+                 (when (memq number wl-summary-buffer-unsync-mark-number-list)
+                   (setq wl-summary-buffer-unsync-mark-number-list
+                         (delq number
+                               wl-summary-buffer-unsync-mark-number-list))
+                   t)))
+       (wl-summary-update-persistent-mark))
       (forward-line 1))))
 
+(defun wl-summary-update-mark-window (&optional win beg)
+  "Update persistent mark in visible summary window.
+This function is defined for `window-scroll-functions'"
+  (with-current-buffer (window-buffer win)
+    (when (eq major-mode 'wl-summary-mode)
+      (let ((start (window-start win))
+           (end (condition-case nil
+                    (window-end win t) ; old emacsen doesn't support 2nd arg.
+                  (error (window-end win)))))
+       (wl-summary-update-status-marks start end 'check)))))
+
 (defun wl-summary-insert-message (&rest args)
   (if (eq wl-summary-buffer-view 'thread)
       (apply 'wl-summary-insert-thread args)
@@ -1647,70 +1768,65 @@ If ARG is non-nil, checking is omitted."
 (defun wl-summary-sync-marks ()
   "Update persistent marks in summary."
   (interactive)
-  (let ((last-progress 0)
-       (folder wl-summary-buffer-elmo-folder)
-       (i 0)
-       answereds importants unreads diff diffs
-       mes progress)
+  (let ((mes "Updated ")
+       diff diffs)
     ;; synchronize marks.
     (when (not (eq (elmo-folder-type-internal
                    wl-summary-buffer-elmo-folder)
                   'internal))
+
       (message "Updating marks...")
-      (setq importants (elmo-uniq-list
-                       (nconc
-                        (elmo-folder-list-importants
-                         wl-summary-buffer-elmo-folder)
-                        (elmo-folder-list-messages-with-global-mark
-                         wl-summary-buffer-elmo-folder
-                         elmo-msgdb-important-mark)))
-           unreads (elmo-folder-list-unreads
-                    wl-summary-buffer-elmo-folder)
-           answereds (elmo-folder-list-answereds
-                      wl-summary-buffer-elmo-folder))
-      (setq diff (elmo-list-diff importants
-                                (elmo-folder-list-flagged
+      (dolist (flag elmo-global-flag-list)
+       (unless (memq flag '(answered cached new unread))
+         (setq diff (elmo-list-diff (elmo-folder-list-flagged
+                                     wl-summary-buffer-elmo-folder
+                                     flag)
+                                    (elmo-folder-list-flagged
+                                     wl-summary-buffer-elmo-folder
+                                     flag 'in-msgdb)))
+         (setq diffs (cadr diff)) ; deletes
+         (setq mes (concat mes (format "-%d" (length diffs))))
+         (while diffs
+           (wl-summary-remove-flags-internal (car diffs)
+                                            (list flag) 'no-server)
+           (setq diffs (cdr diffs)))
+         (setq diffs (car diff)) ; appends
+         (setq mes (concat mes (format "/+%d %s," (length diffs) flag)))
+         (while diffs
+           (wl-summary-add-flags-internal (car diffs)
+                                         (list flag) 'no-server)
+           (setq diffs (cdr diffs)))))
+
+      (setq diff (elmo-list-diff (elmo-folder-list-flagged
                                  wl-summary-buffer-elmo-folder
-                                 'important 'in-msgdb)))
-      (setq diffs (cadr diff)) ; important-deletes
-      (setq mes (format "Updated (-%d" (length diffs)))
-      (while diffs
-       (wl-summary-mark-as-important (car diffs)
-                                     wl-summary-important-mark
-                                     'no-server)
-       (setq diffs (cdr diffs)))
-      (setq diffs (car diff)) ; important-appends
-      (setq mes (concat mes (format "/+%d) important," (length diffs))))
-      (while diffs
-       (wl-summary-mark-as-important (car diffs) " " 'no-server)
-       (setq diffs (cdr diffs)))
-
-      (setq diff (elmo-list-diff answereds
+                                 'answered)
                                 (elmo-folder-list-flagged
                                  wl-summary-buffer-elmo-folder
                                  'answered 'in-msgdb)))
       (setq diffs (cadr diff))
-      (setq mes (concat mes (format "(-%d" (length diffs))))
+      (setq mes (concat mes (format "-%d" (length diffs))))
       (while diffs
        (wl-summary-mark-as-unanswered (car diffs) 'no-modeline)
        (setq diffs (cdr diffs)))
       (setq diffs (car diff)) ; unread-appends
-      (setq mes (concat mes (format "/+%d) answered mark(s)," (length diffs))))
+      (setq mes (concat mes (format "/+%d answered," (length diffs))))
       (while diffs
        (wl-summary-mark-as-answered (car diffs) 'no-modeline)
        (setq diffs (cdr diffs)))
 
-      (setq diff (elmo-list-diff unreads
+      (setq diff (elmo-list-diff (elmo-folder-list-flagged
+                                 wl-summary-buffer-elmo-folder
+                                 'unread)
                                 (elmo-folder-list-flagged
                                  wl-summary-buffer-elmo-folder
                                  'unread 'in-msgdb)))
       (setq diffs (cadr diff))
-      (setq mes (concat mes (format "(-%d" (length diffs))))
+      (setq mes (concat mes (format "-%d" (length diffs))))
       (while diffs
        (wl-summary-mark-as-read (car diffs) 'no-folder 'no-modeline)
        (setq diffs (cdr diffs)))
       (setq diffs (car diff)) ; unread-appends
-      (setq mes (concat mes (format "/+%d) unread mark(s)." (length diffs))))
+      (setq mes (concat mes (format "/+%d unread." (length diffs))))
       (while diffs
        (wl-summary-mark-as-unread (car diffs) 'no-folder 'no-modeline)
        (setq diffs (cdr diffs)))
@@ -1760,7 +1876,13 @@ If ARG is non-nil, checking is omitted."
 
                (when delete-list
                  (wl-summary-delete-messages-on-buffer delete-list))
-               (wl-summary-update-status-marks)
+               (unless wl-summary-lazy-update-mark
+                 (wl-summary-update-status-marks (point-min) (point-max)))
+               (when (and wl-summary-lazy-highlight
+                          wl-summary-lazy-update-mark)
+                 (let (buffer-read-only)
+                   (put-text-property (point-min) (point-max) 'face nil))
+                 (run-hooks 'wl-summary-buffer-window-scroll-functions))
                (setq num (length append-list))
                (setq i 0)
                (setq wl-summary-delayed-update nil)
@@ -1775,7 +1897,7 @@ If ARG is non-nil, checking is omitted."
                  (if elmo-use-database
                      (elmo-database-msgid-put
                       (car entity) (elmo-folder-name-internal folder)
-                      (elmo-msgdb-overview-entity-get-number entity)))
+                      (elmo-message-entity-number entity)))
                  (when (> num elmo-display-progress-threshold)
                    (setq i (+ i 1))
                    (if (or (zerop (% i 5)) (= i num))
@@ -1789,7 +1911,7 @@ If ARG is non-nil, checking is omitted."
                  (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
+                            (elmo-message-entity-number
                              (cdar wl-summary-delayed-update)))
                    (when (setq update-thread
                                (wl-summary-insert-message
@@ -1950,8 +2072,8 @@ If ARG is non-nil, checking is omitted."
                            (length dels)))
          (progn
            (message "Deleting...")
-           (elmo-folder-delete-messages wl-summary-buffer-elmo-folder dels)
-           (elmo-folder-detach-messages wl-summary-buffer-elmo-folder dels)
+           (elmo-folder-move-messages wl-summary-buffer-elmo-folder dels
+                                      'null)
            (wl-summary-set-message-modified)
            (wl-folder-set-folder-updated (wl-summary-buffer-folder-name)
                                          (list 0 0 0))
@@ -1982,7 +2104,7 @@ If ARG, without confirm."
       (setq wl-summary-buffer-view 'thread))
     (wl-summary-update-modeline)
     (force-mode-line-update)
-    (wl-summary-rescan)))
+    (wl-summary-rescan nil nil t)))
 
 (defun wl-summary-load-file-object (filename)
   "Load lisp object from dir."
@@ -2063,6 +2185,7 @@ If ARG, without confirm."
                   wl-summary-buffer-message-modified
                   wl-summary-buffer-thread-modified
                   wl-summary-buffer-number-list
+                  wl-summary-buffer-unsync-mark-number-list
                   wl-summary-buffer-folder-name
                   wl-summary-buffer-line-formatter)
                 (and (eq wl-summary-buffer-view 'thread)
@@ -2128,9 +2251,8 @@ If ARG, without confirm."
 
 (defun wl-summary-auto-select-msg-p (unread-msg)
   (and unread-msg
-       (not (elmo-message-flagged-p wl-summary-buffer-elmo-folder
-                                   unread-msg
-                                   'important))))
+       (not (elmo-message-has-global-flag-p
+            wl-summary-buffer-elmo-folder unread-msg))))
 
 (defsubst wl-summary-open-folder (folder)
   ;; Select folder
@@ -2212,17 +2334,21 @@ If ARG, without confirm."
                               (elmo-folder-name-internal folder))
                              wl-summary-default-view)))
                  (wl-thread-resume-entity folder)
-                 (wl-summary-open-folder folder))
+                 (wl-summary-open-folder folder)
+                 (wl-summary-detect-mark-position))
              (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-detect-mark-position)
              (wl-summary-rescan))
            (wl-summary-count-unread)
            (wl-summary-update-modeline)))
       (unless (eq wl-summary-buffer-view 'thread)
        (wl-summary-make-number-list))
+      (setq wl-summary-buffer-unsync-mark-number-list
+           (copy-sequence wl-summary-buffer-number-list))
       (when (and wl-summary-cache-use
                 (or (and wl-summary-check-line-format
                          (wl-summary-line-format-changed-p))
@@ -2265,15 +2391,15 @@ If ARG, without confirm."
                (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
+                      ;; unreadp is non-nil but not flagged
                       (setq retval 'disp-msg))
                      ((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
+                      ;; unreadp is non-nil but not flagged
                       (setq retval 'prefetch-msg))
                      ((not (wl-summary-auto-select-msg-p unreadp))
-                      ;; unreadp is nil or important
+                      ;; unreadp is nil or flagged
                       (setq retval 'more-next))))
            (goto-char (point-max))
            (if (elmo-folder-plugged-p folder)
@@ -2316,7 +2442,7 @@ If ARG, without confirm."
       ;; entity-id is unknown.
       (wl-folder-set-current-entity-id
        (wl-folder-get-entity-id entity)))
-    (when (and wl-summary-lazy-highlight
+    (when (and wl-summary-buffer-window-scroll-functions
               wl-on-xemacs)
       (sit-for 0))
     (unwind-protect
@@ -2365,22 +2491,23 @@ If ARG, without confirm."
     (run-hooks 'wl-summary-line-inserted-hook)))
 
 (defun wl-summary-insert-sequential (entity folder &rest args)
-  (let ((inhibit-read-only t)
-       (number (elmo-message-entity-number entity))
-       buffer-read-only)
-    (goto-char (point-max))
-    (wl-summary-insert-line
-     (wl-summary-create-line entity nil nil
-                            (elmo-message-flags
-                             wl-summary-buffer-elmo-folder
-                             number)
-                            (elmo-message-cached-p
-                             wl-summary-buffer-elmo-folder
-                             number)))
-    (setq wl-summary-buffer-number-list
-         (wl-append wl-summary-buffer-number-list
-                    (list (elmo-message-entity-number entity))))
-    nil))
+  (when entity
+    (let ((inhibit-read-only t)
+         (number (elmo-message-entity-number entity))
+         buffer-read-only)
+      (goto-char (point-max))
+      (wl-summary-insert-line
+       (wl-summary-create-line entity nil nil
+                              (elmo-message-flags
+                               wl-summary-buffer-elmo-folder
+                               number)
+                              (elmo-message-cached-p
+                               wl-summary-buffer-elmo-folder
+                               number)))
+      (setq wl-summary-buffer-number-list
+           (wl-append wl-summary-buffer-number-list
+                      (list (elmo-message-entity-number entity))))
+      nil)))
 
 (defun wl-summary-default-subject-filter (subject)
   (setq subject (elmo-replace-in-string subject "[ \t]*\\(re\\|was\\)[:>]" ""))
@@ -2401,7 +2528,7 @@ If ARG, without confirm."
                        wl-summary-alike-hashtb)))
 
 (defun wl-summary-insert-headers (folder func mime-decode)
-  (let ((numbers (elmo-folder-list-messages folder nil t))
+  (let ((numbers (elmo-folder-list-messages folder 'visible t))
        ov this last alike)
     (buffer-disable-undo (current-buffer))
     (make-local-variable 'wl-summary-alike-hashtb)
@@ -2432,7 +2559,7 @@ If ARG, without confirm."
   (let ((summary-buf (current-buffer))
        (buf (get-buffer-create wl-summary-search-buf-name))
        (folder-name (wl-summary-buffer-folder-name))
-       match founds cur result)
+       match founds result)
     (with-current-buffer buf
       (let ((case-fold-search t))
        (when (or (not (string= wl-summary-search-buf-folder-name folder-name))
@@ -2483,27 +2610,37 @@ If ARG, without confirm."
 (defun wl-summary-insert-thread (entity folder update
                                        &optional force-insert)
   (let ((depth 0)
-       this-id parent-entity parent-number relatives anumber
-       cur number cur-entity linked retval delayed-entity
-       update-list entity-stack)
+       this-id parent-entity parent-number
+       number cur-entity linked retval delayed-entity
+       update-list entity-stack thread-entity)
     (while entity
       (setq this-id (elmo-message-entity-field entity 'message-id)
-           parent-entity
-           (elmo-message-entity-parent folder entity)
-           parent-number (elmo-message-entity-number parent-entity))
-      (setq number (elmo-message-entity-number entity))
-      (setq cur entity)
+           number (elmo-message-entity-number entity))
+      (if (and wl-thread-saved-entity-hashtb-internal
+              (setq thread-entity
+                    (elmo-get-hash-val
+                     (format "#%d" (elmo-message-entity-number entity))
+                     wl-thread-saved-entity-hashtb-internal)))
+         (setq parent-entity
+               (elmo-message-entity
+                folder
+                (wl-thread-entity-get-parent thread-entity))
+               linked (wl-thread-entity-get-linked thread-entity))
+       (setq parent-entity (elmo-message-entity-parent folder entity)
+             linked nil))
+      (setq parent-number (and parent-entity
+                              (elmo-message-entity-number parent-entity)))
       ;; If thread loop detected, set parent as nil.
-      (while cur
-       (setq anumber
-             (elmo-message-entity-number
-              (setq cur (elmo-message-entity-parent folder cur))))
-       (if (memq anumber relatives)
-           (setq parent-number nil
-                 cur nil))
-       (setq relatives (cons
-                        (elmo-message-entity-number cur)
-                        relatives)))
+      (let ((cur entity)
+           anumber relatives)
+       (while cur
+         (when (setq anumber
+                     (elmo-message-entity-number
+                      (setq cur (elmo-message-entity-parent folder cur))))
+           (if (memq anumber relatives)
+               (setq parent-number nil
+                     cur nil))
+           (setq relatives (cons anumber relatives)))))
       (if (and parent-number
               (not (wl-thread-get-entity parent-number))
               (not force-insert))
@@ -2517,7 +2654,7 @@ If ARG, without confirm."
                   wl-summary-search-parent-by-subject-regexp
                   (string-match
                    wl-summary-search-parent-by-subject-regexp
-                   (elmo-msgdb-overview-entity-get-subject entity)))
+                   (elmo-message-entity-field entity 'subject)))
          (let ((found (wl-summary-search-by-subject entity folder)))
            (when (and found
                       (not (member found wl-summary-delayed-update)))
@@ -2553,11 +2690,11 @@ If ARG, without confirm."
 (defun wl-summary-update-thread (entity
                                 thr-entity
                                 parent-entity)
-  (let* ((this-id (elmo-msgdb-overview-entity-get-id entity))
+  (let* ((this-id (elmo-message-entity-field entity 'message-id))
         (overview-entity entity)
-        (parent-id (elmo-msgdb-overview-entity-get-id parent-entity))
-        (number (elmo-msgdb-overview-entity-get-number entity))
-        (parent-number (elmo-msgdb-overview-entity-get-number parent-entity))
+        (parent-id (elmo-message-entity-field parent-entity 'message-id))
+        (number (elmo-message-entity-number entity))
+        (parent-number (elmo-message-entity-number parent-entity))
         insert-line)
     (cond
      ((or (not parent-id)
@@ -2660,9 +2797,9 @@ If ARG, exit virtual folder."
       (setq wl-summary-buffer-target-mark-list nil)
       (setq wl-summary-buffer-temp-mark-list nil))))
 
-(defsubst wl-summary-temp-mark ()
+(defsubst wl-summary-temp-mark (&optional number)
   "Return temp-mark string of current line."
-  (let ((number (wl-summary-message-number))
+  (let ((number (or number (wl-summary-message-number)))
        info)
     (or (and (wl-summary-have-target-mark-p number)
             "*")
@@ -2674,42 +2811,47 @@ If ARG, exit virtual folder."
 (defsubst wl-summary-persistent-mark-string (folder flags cached)
   "Return the persistent mark string.
 The mark is decided according to the FOLDER, FLAGS and CACHED."
-  (let ((priorities wl-summary-flag-priority-list)
+  (let ((priorities wl-summary-persistent-mark-priority-list)
        mark)
     (while (and (null mark) priorities)
-      (when (memq (car priorities) flags)
-       (setq mark
-             (case (car priorities)
-               (new
-                wl-summary-new-mark)
-               (important
-                wl-summary-important-mark)
-               (answered
-                (if cached
-                    wl-summary-answered-cached-mark
-                  wl-summary-answered-uncached-mark))
-               (unread
-                (if cached
-                    wl-summary-unread-cached-mark
-                  wl-summary-unread-uncached-mark)))))
+      (if (and (eq (car priorities) 'flag)
+              (elmo-get-global-flags flags 'ignore-preserved))
+         (setq mark wl-summary-flag-mark)
+       (when (memq (car priorities) flags)
+         (setq mark
+               (or (case (car priorities)
+                     (new
+                      (if cached
+                          wl-summary-new-cached-mark
+                        wl-summary-new-uncached-mark))
+                     (answered
+                      (if cached
+                          wl-summary-answered-cached-mark
+                        wl-summary-answered-uncached-mark))
+                     (unread
+                      (if cached
+                          wl-summary-unread-cached-mark
+                        wl-summary-unread-uncached-mark)))))))
       (setq priorities (cdr priorities)))
     (or mark
        (if (or cached (elmo-folder-local-p folder))
            nil
          wl-summary-read-uncached-mark))))
 
-(defsubst wl-summary-message-mark (folder number)
+(defsubst wl-summary-message-mark (folder number &optional flags)
   "Return mark of the message."
   (ignore-errors
     (wl-summary-persistent-mark-string
      folder
-     (elmo-message-flags folder number)
-     (elmo-message-cached-p folder number))))
+     (or flags (setq flags (elmo-message-flags folder number)))
+     (memq 'cached flags) ; XXX for speed-up.
+     )))
 
-(defsubst wl-summary-persistent-mark ()
+(defsubst wl-summary-persistent-mark (&optional number flags)
   "Return persistent-mark string of current line."
   (or (wl-summary-message-mark wl-summary-buffer-elmo-folder
-                              (wl-summary-message-number))
+                              (or number (wl-summary-message-number))
+                              flags)
       " "))
 
 (defun wl-summary-put-temp-mark (mark)
@@ -2751,11 +2893,10 @@ The mark is decided according to the FOLDER, FLAGS and CACHED."
     (goto-char (point-min))
     (let ((inhibit-read-only t)
          (buffer-read-only nil)
-         wl-summary-buffer-disp-msg
-         (mlist wl-summary-buffer-temp-mark-list))
-      (dolist (number mlist)
-       (wl-summary-unset-mark number))
-      (wl-summary-mark-as-read mlist))))
+         wl-summary-buffer-disp-msg)
+      (wl-summary-mark-as-read wl-summary-buffer-target-mark-list)
+      (dolist (number wl-summary-buffer-target-mark-list)
+       (wl-summary-unset-mark number)))))
 
 (defun wl-summary-target-mark-mark-as-unread ()
   (interactive)
@@ -2763,23 +2904,22 @@ The mark is decided according to the FOLDER, FLAGS and CACHED."
     (goto-char (point-min))
     (let ((inhibit-read-only t)
          (buffer-read-only nil)
-         wl-summary-buffer-disp-msg
-         (mlist wl-summary-buffer-target-mark-list))
-      (dolist (number mlist)
-       (wl-summary-unset-mark number))
-      (wl-summary-mark-as-unread mlist))))
+         wl-summary-buffer-disp-msg)
+      (wl-summary-mark-as-unread wl-summary-buffer-target-mark-list)
+      (dolist (number wl-summary-buffer-target-mark-list)
+       (wl-summary-unset-mark number)))))
 
-(defun wl-summary-target-mark-mark-as-important ()
+(defun wl-summary-target-mark-set-flags ()
   (interactive)
   (save-excursion
     (goto-char (point-min))
     (let ((inhibit-read-only t)
          (buffer-read-only nil)
          wl-summary-buffer-disp-msg
-         (mlist wl-summary-buffer-target-mark-list))
-      (dolist (number mlist)
+         flags)
+      (dolist (number wl-summary-buffer-target-mark-list)
        (wl-summary-unset-mark number)
-       (wl-summary-mark-as-important number))
+       (setq flags (wl-summary-set-flags-internal number flags)))
       (wl-summary-count-unread)
       (wl-summary-update-modeline))))
 
@@ -2800,23 +2940,22 @@ The mark is decided according to the FOLDER, FLAGS and CACHED."
   (interactive)
   (wl-summary-pick wl-summary-buffer-target-mark-list 'delete))
 
-(defun wl-summary-update-persistent-mark ()
+(defun wl-summary-update-persistent-mark (&optional number flags)
   "Synch up persistent mark of current line with msgdb's.
 Return non-nil if the mark is updated"
-  (if wl-summary-buffer-persistent-mark-column
-      (save-excursion
-       (move-to-column wl-summary-buffer-persistent-mark-column)
-       (let ((inhibit-read-only t)
-             (buffer-read-only nil)
-             (mark (buffer-substring (- (point) 1) (point)))
-             (new-mark (wl-summary-persistent-mark)))
-         (unless (string= new-mark mark)
-           (delete-backward-char 1)
-           (insert new-mark))
-         (when wl-summary-highlight
-           (wl-highlight-summary-current-line))
-         (set-buffer-modified-p nil)
-         t))
+  (prog1
+      (when wl-summary-buffer-persistent-mark-column
+       (save-excursion
+         (move-to-column wl-summary-buffer-persistent-mark-column)
+         (let ((inhibit-read-only t)
+               (buffer-read-only nil)
+               (mark (buffer-substring (- (point) 1) (point)))
+               (new-mark (wl-summary-persistent-mark number flags)))
+           (unless (string= new-mark mark)
+             (delete-backward-char 1)
+             (insert new-mark)
+             (wl-summary-set-message-modified)
+             t))))
     (when wl-summary-highlight
       (wl-highlight-summary-current-line))
     (set-buffer-modified-p nil)))
@@ -2850,8 +2989,8 @@ Return non-nil if the mark is updated"
       (if (null number-list)
          (message "No message.")
        (if inverse
-           (elmo-folder-unmark-read folder number-list no-folder-mark)
-         (elmo-folder-mark-as-read folder number-list no-folder-mark))
+           (elmo-folder-unset-flag folder number-list 'read no-folder-mark)
+         (elmo-folder-set-flag folder number-list 'read no-folder-mark))
        (dolist (number number-list)
          (setq visible (wl-summary-jump-to-msg number))
          (unless inverse
@@ -2862,7 +3001,6 @@ Return non-nil if the mark is updated"
            (wl-summary-update-persistent-mark)))
        (unless no-modeline-update
          ;; Update unread numbers.
-         ;; should elmo-folder-mark-as-read return unread numbers?
          (wl-summary-count-unread)
          (wl-summary-update-modeline)
          (wl-folder-update-unread
@@ -2889,6 +3027,7 @@ Return non-nil if the mark is updated"
                                    no-modeline-update))
 
 (defsubst wl-summary-mark-as-answered-internal (inverse
+                                               &optional
                                                number-or-numbers
                                                no-modeline-update)
   (save-excursion
@@ -2905,8 +3044,8 @@ Return non-nil if the mark is updated"
       (if (null number-list)
          (message "No message.")
        (if inverse
-           (elmo-folder-unmark-answered folder number-list)
-         (elmo-folder-mark-as-answered folder number-list))
+           (elmo-folder-unset-flag folder number-list 'answered)
+         (elmo-folder-set-flag folder number-list 'answered))
        (dolist (number number-list)
          (setq visible (wl-summary-jump-to-msg number))
          ;; set mark on buffer
@@ -2914,7 +3053,7 @@ Return non-nil if the mark is updated"
            (wl-summary-update-persistent-mark)))
        (unless no-modeline-update
          ;; Update unread numbers.
-         ;; should elmo-folder-mark-as-read return unread numbers?
+         ;; should elmo-flag-mark-as-read return unread numbers?
          (wl-summary-count-unread)
          (wl-summary-update-modeline)
          (wl-folder-update-unread
@@ -2934,67 +3073,132 @@ Return non-nil if the mark is updated"
    no-modeline-update))
 
 (defun wl-summary-mark-as-unanswered (&optional number-or-numbers
-                                             no-modeline-update)
+                                               no-modeline-update)
   (wl-summary-mark-as-answered-internal 'inverse
                                        number-or-numbers
                                        no-modeline-update))
 
-(defun wl-summary-mark-as-important (&optional number
-                                              mark
-                                              no-server-update)
-  (interactive)
-  (if (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder)
-         'internal)
-      (error "Cannot process mark in this folder"))
+(defun wl-summary-decide-flag (folder number)
+  (let ((flags (elmo-get-global-flags (elmo-message-flags
+                                      folder number)))
+       (completion-ignore-case t)
+       new-flags)
+    (setq new-flags
+         (delq nil
+               (mapcar
+                (lambda (flag)
+                  (and (> (length flag) 0)
+                       (intern (downcase flag))))
+                (wl-completing-read-multiple
+                 "Flags: "
+                 (mapcar (lambda (flag)
+                           (list (capitalize (symbol-name flag))))
+                         elmo-global-flag-list)
+                 nil nil (mapconcat (lambda (flag)
+                                      (capitalize (symbol-name flag)))
+                                    (or flags '(important))
+                                    ",")))))
+    (dolist (flag new-flags)
+      (unless (memq flag elmo-global-flag-list)
+       (if (y-or-n-p (format "Flag `%s' does not exist yet. Create?"
+                             (capitalize (symbol-name flag))))
+           (setq elmo-global-flag-list (append
+                                        elmo-global-flag-list
+                                        (list flag)))
+         (error "Stopped"))))
+    new-flags))
+
+(defsubst wl-summary-set-flags-internal (&optional
+                                       number-or-numbers
+                                       flags
+                                       local
+                                       remove-all)
   (save-excursion
-    (let* ((folder wl-summary-buffer-elmo-folder)
-          message-id visible cur-mark)
-      (cond (number
-            (setq visible (wl-summary-jump-to-msg number))
-            (setq cur-mark (or mark
-                               (wl-summary-message-mark
-                                wl-summary-buffer-elmo-folder number)
-                               " ")))
-           ((setq number (wl-summary-message-number))
-            (setq visible t)
-            (setq cur-mark (or mark (wl-summary-persistent-mark))))
-           (t
-            (error "No message")))
-      (when (or visible
-               ;; already exists in msgdb.
-               (elmo-message-entity wl-summary-buffer-elmo-folder
-                                    number))
-       (setq message-id (elmo-message-field
-                         wl-summary-buffer-elmo-folder
-                         number
-                         'message-id))
-       (if (string= cur-mark wl-summary-important-mark)
-           (progn
-             ;; server side mark
-             (save-match-data
-               (elmo-folder-unmark-important folder (list number)
-                                             no-server-update)
-               (unless no-server-update
-                 (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)))))
-         ;; server side mark
-         (elmo-folder-mark-as-important folder (list number)
-                                        no-server-update)
-         (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
-                                       elmo-msgdb-important-mark))))
-      (when visible
-       (wl-summary-update-persistent-mark))))
-  number)
+    (let ((folder wl-summary-buffer-elmo-folder)
+         number number-list visible)
+      (setq number-list (cond ((numberp number-or-numbers)
+                              (list number-or-numbers))
+                             ((and (not (null number-or-numbers))
+                                   (listp number-or-numbers))
+                              number-or-numbers)
+                             ((setq number (wl-summary-message-number))
+                              ;; interactive
+                              (list number))))
+      (if remove-all
+         (setq flags nil)
+       (unless flags
+         (setq flags (wl-summary-decide-flag folder (car number-list)))))
+      (if (null number-list)
+         (message "No message.")
+       (dolist (number number-list)
+         (elmo-message-set-global-flags folder number flags local)
+         (setq visible (wl-summary-jump-to-msg number))
+         ;; set mark on buffer
+         (when visible
+           (wl-summary-update-persistent-mark))))
+      flags)))
+
+(defsubst wl-summary-add-flags-internal (&optional
+                                        number-or-numbers
+                                        flags
+                                        local)
+  (save-excursion
+    (let ((folder wl-summary-buffer-elmo-folder)
+         set-flags msg number-list visible)
+      (setq number-list (cond ((numberp number-or-numbers)
+                              (list number-or-numbers))
+                             ((and (not (null number-or-numbers))
+                                   (listp number-or-numbers))
+                              number-or-numbers)
+                             ((setq msg (wl-summary-message-number))
+                              ;; interactive
+                              (list msg))))
+      (if (null number-list)
+         (message "No message.")
+       (dolist (number number-list)
+         (setq set-flags
+               (elmo-get-global-flags
+                (elmo-message-flags folder number)))
+         (setq set-flags (nconc flags set-flags))
+         (elmo-message-set-global-flags folder number set-flags local)
+         (setq visible (wl-summary-jump-to-msg number))
+         ;; set mark on buffer
+         (when visible
+           (wl-summary-update-persistent-mark)))))))
+
+(defsubst wl-summary-remove-flags-internal (&optional
+                                           number-or-numbers
+                                           flags
+                                           local)
+  (save-excursion
+    (let ((folder wl-summary-buffer-elmo-folder)
+         set-flags msg number-list visible)
+      (setq number-list (cond ((numberp number-or-numbers)
+                              (list number-or-numbers))
+                             ((and (not (null number-or-numbers))
+                                   (listp number-or-numbers))
+                              number-or-numbers)
+                             ((setq msg (wl-summary-message-number))
+                              ;; interactive
+                              (list msg))))
+      (if (null number-list)
+         (message "No message.")
+       (dolist (number number-list)
+         (setq set-flags (elmo-get-global-flags
+                          (elmo-message-flags folder number)))
+         (dolist (flag flags)
+           (setq set-flags (delq flag set-flags)))
+         (elmo-message-set-global-flags folder number set-flags local)
+         (setq visible (wl-summary-jump-to-msg number))
+         ;; set mark on buffer
+         (when visible
+           (wl-summary-update-persistent-mark)))))))
+
+(defun wl-summary-set-flags (&optional remove)
+  (interactive "P")
+  (if (eq 'flag (elmo-folder-type-internal wl-summary-buffer-elmo-folder))
+      (error "Cannot process flags in this folder"))
+  (wl-summary-set-flags-internal nil nil nil remove))
 
 ;;; Summary line.
 (defvar wl-summary-line-formatter nil)
@@ -3030,7 +3234,7 @@ Return non-nil if the mark is updated"
   (wl-set-string-width
    (- wl-summary-buffer-number-column)
    (number-to-string
-    (elmo-msgdb-overview-entity-get-number wl-message-entity))))
+    (elmo-message-entity-number wl-message-entity))))
 
 (defun wl-summary-line-year ()
   (aref wl-datevec 0))
@@ -3050,7 +3254,7 @@ Return non-nil if the mark is updated"
   (format "%02d" (aref wl-datevec 4)))
 
 (defun wl-summary-line-size ()
-  (let ((size (elmo-msgdb-overview-entity-get-size wl-message-entity)))
+  (let ((size (elmo-message-entity-field wl-message-entity 'size)))
     (if size
        (cond
         ((<= 1 (/ size 1048576))
@@ -3066,11 +3270,13 @@ Return non-nil if the mark is updated"
        (setq no-parent t)) ; no parent
     (setq subject
          (elmo-delete-char ?\n
-                           (or (elmo-msgdb-overview-entity-get-subject
-                                wl-message-entity)
+                           (or (elmo-message-entity-field
+                                wl-message-entity
+                                'subject t)
                                wl-summary-no-subject-message)))
     (setq parent-raw-subject
-         (elmo-msgdb-overview-entity-get-subject wl-parent-message-entity))
+         (elmo-message-entity-field wl-parent-message-entity
+                                    'subject t))
     (setq parent-subject
          (if parent-raw-subject
              (elmo-delete-char ?\n parent-raw-subject)))
@@ -3084,8 +3290,9 @@ Return non-nil if the mark is updated"
 (defun wl-summary-line-from ()
   (elmo-delete-char ?\n
                    (funcall wl-summary-from-function
-                            (elmo-msgdb-overview-entity-get-from
-                             wl-message-entity))))
+                            (elmo-message-entity-field
+                             wl-message-entity
+                             'from t))))
 
 (defun wl-summary-line-list-info ()
   (let ((list-info (wl-summary-get-list-info wl-message-entity)))
@@ -3101,14 +3308,21 @@ Return non-nil if the mark is updated"
       "")))
 
 (defun wl-summary-line-attached ()
-  (let ((content-type (elmo-msgdb-overview-entity-get-extra-field
-                      wl-message-entity "content-type"))
+  (let ((content-type (elmo-message-entity-field
+                      wl-message-entity 'content-type))
        (case-fold-search t))
     (if (and content-type
             (string-match "multipart/mixed" content-type))
        "@"
       "")))
 
+;;; For future use.
+;;(defun wl-summary-line-cached ()
+;;  (if (elmo-message-cached-p wl-summary-buffer-elmo-folder
+;;                          (elmo-message-entity-number wl-message-entity))
+;;      " "
+;;    "u"))
+
 (defun wl-summary-create-line (wl-message-entity
                               wl-parent-message-entity
                               wl-temp-mark
@@ -3127,8 +3341,9 @@ Return non-nil if the mark is updated"
        (elmo-mime-charset wl-summary-buffer-mime-charset)
        (elmo-lang wl-summary-buffer-weekday-name-lang)
        (wl-datevec (or (ignore-errors (timezone-fix-time
-                                       (elmo-msgdb-overview-entity-get-date
-                                        wl-message-entity)
+                                       (elmo-message-entity-field
+                                        wl-message-entity
+                                        'date)
                                        nil
                                        wl-summary-fix-timezone))
                        (make-vector 5 0)))
@@ -3149,13 +3364,15 @@ Return non-nil if the mark is updated"
     (setq line (concat line
                       "\r"
                       (number-to-string
-                       (elmo-msgdb-overview-entity-get-number
+                       (elmo-message-entity-number
                         wl-message-entity))))
     (if wl-summary-highlight
-       (wl-highlight-summary-line-string line
-                                         wl-flags
-                                         wl-temp-mark
-                                         wl-thr-indent-string))
+       (wl-highlight-summary-line-string
+        (elmo-message-entity-number wl-message-entity)
+        line
+        wl-flags
+        wl-temp-mark
+        wl-thr-indent-string))
     line))
 
 (defsubst wl-summary-proc-wday (wday-str year month mday)
@@ -3168,10 +3385,10 @@ Return non-nil if the mark is updated"
   '((new . ((t . nil)
            (p . new)
            (p . unread)
-           (p . important)))
+           (p . digest)))
     (unread . ((t . nil)
               (p . unread)
-              (p . important)))))
+              (p . digest)))))
 
 (defsubst wl-summary-next-message (num direction hereto)
   (if wl-summary-buffer-next-message-function
@@ -3192,7 +3409,7 @@ Return non-nil if the mark is updated"
                     (if (setq flagged-list
                               (elmo-folder-list-flagged
                                wl-summary-buffer-elmo-folder
-                               (cdr (car cur-spec))))
+                               (cdr (car cur-spec)) t))
                         (while nums
                           (if (and (memq (car nums) flagged-list)
                                    (elmo-message-accessible-p
@@ -3222,7 +3439,7 @@ Return non-nil if the mark is updated"
          (wl-thread-jump-to-msg num))
       t)))
 ;;
-;; Goto unread or important
+;; Goto unread or global flag message
 ;; returns t if next message exists in this folder.
 (defun wl-summary-cursor-down (&optional hereto)
   (interactive "P")
@@ -3243,52 +3460,54 @@ Return non-nil if the mark is updated"
           (tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*"))
           (temp-column wl-summary-buffer-temp-mark-column)
           (charset wl-summary-buffer-mime-charset))
-      (if (file-directory-p dir)
-         (); ok.
-       (if (file-exists-p dir)
-           (error "File %s already exists" dir)
-         (elmo-make-directory dir)))
-      (if (eq save-view 'thread)
-         (wl-thread-save-entity dir))
-      (when wl-summary-check-line-format
-       (wl-summary-line-format-save))
-      (unwind-protect
-         (progn
-           (when (file-writable-p cache)
-             (copy-to-buffer tmp-buffer (point-min) (point-max))
-             (with-current-buffer tmp-buffer
-               (widen)
-               (make-local-variable 'wl-summary-highlight)
-               (setq wl-summary-highlight nil
-                     wl-summary-buffer-target-mark-list mark-list
-                     wl-summary-buffer-temp-mark-list temp-list
-                     wl-summary-buffer-temp-mark-column temp-column)
-               (wl-summary-delete-all-temp-marks 'no-msg 'force)
-               (encode-coding-region
-                (point-min) (point-max)
-                (or (and wl-on-mule
-                         ;; one in mcs-ltn1(apel<10.4) cannot take 2 arg.
-                         (mime-charset-to-coding-system charset 'LF))
-                    ;; Mule 2 doesn't have `*ctext*unix'.
-                    (mime-charset-to-coding-system charset)))
-               (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)
-               (erase-buffer)
-               (prin1 save-view tmp-buffer)
-               (princ "\n" tmp-buffer)
-               (write-region (point-min) (point-max) view nil 'no-msg))))
-       ;; kill tmp buffer.
-       (kill-buffer tmp-buffer)))))
+      (when dir
+       (if (file-directory-p dir)
+           (); ok.
+         (if (file-exists-p dir)
+             (error "File %s already exists" dir)
+           (elmo-make-directory dir)))
+       (if (eq save-view 'thread)
+           (wl-thread-save-entity dir))
+       (when wl-summary-check-line-format
+         (wl-summary-line-format-save))
+       (unwind-protect
+           (progn
+             (when (file-writable-p cache)
+               (copy-to-buffer tmp-buffer (point-min) (point-max))
+               (with-current-buffer tmp-buffer
+                 (widen)
+                 (make-local-variable 'wl-summary-highlight)
+                 (setq wl-summary-highlight nil
+                       wl-summary-buffer-target-mark-list mark-list
+                       wl-summary-buffer-temp-mark-list temp-list
+                       wl-summary-buffer-temp-mark-column temp-column)
+                 (wl-summary-delete-all-temp-marks 'no-msg 'force)
+                 (encode-coding-region
+                  (point-min) (point-max)
+                  (or (and wl-on-mule
+                           ;; one in mcs-ltn1(apel<10.4) cannot take 2 arg.
+                           (mime-charset-to-coding-system charset 'LF))
+                      ;; Mule 2 doesn't have `*ctext*unix'.
+                      (mime-charset-to-coding-system charset)))
+                 (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)
+                 (erase-buffer)
+                 (prin1 save-view tmp-buffer)
+                 (princ "\n" tmp-buffer)
+                 (write-region (point-min) (point-max) view nil 'no-msg))))
+         ;; kill tmp buffer.
+         (kill-buffer tmp-buffer))))))
 
 (defsubst wl-summary-get-sync-range (folder)
   (intern (or (and
               (elmo-folder-plugged-p folder)
               (wl-get-assoc-list-value
                wl-folder-sync-range-alist
-               (elmo-folder-name-internal folder)))
+               (elmo-folder-name-internal folder)
+               'function))
              wl-default-sync-range)))
 
 ;; redefined for wl-summary-sync-update
@@ -3302,13 +3521,15 @@ Return non-nil if the mark is updated"
                            "mark"
                            "rescan"
                            "rescan-noscore"
+                           "rescan-thread"
                            "update"
                            "update-entirely"
                            "all"
                            "all-entirely"))
        (default (or (wl-get-assoc-list-value
                      wl-folder-sync-range-alist
-                     folder)
+                     folder
+                     'function)
                     wl-default-sync-range))
        range)
     (setq range
@@ -3451,8 +3672,7 @@ Return non-nil if the mark is updated"
          (run-hooks 'wl-summary-toggle-disp-off-hook))
 ;;;    (switch-to-buffer cur-buf)
        )))
-    (when wl-summary-lazy-highlight
-      (wl-highlight-summary-window))))
+    (run-hooks 'wl-summary-buffer-window-scroll-functions)))
 
 (defun wl-summary-next-line-content ()
   "Show next line of the message."
@@ -3780,11 +4000,10 @@ Reply to author if invoked with ARG."
        mes-buf)
     (when number
       (save-excursion
-       (wl-summary-redisplay-internal folder number))
+       (wl-summary-set-message-buffer-or-redisplay))
       (setq mes-buf wl-message-buffer)
       (wl-message-select-buffer wl-message-buffer)
       (set-buffer mes-buf)
-      (goto-char (point-min))
       (condition-case err
          (when (setq mes-buf (wl-message-get-original-buffer))
            (wl-draft-reply mes-buf arg summary-buf number)
@@ -3794,7 +4013,7 @@ Reply to author if invoked with ARG."
        (error (set-window-configuration winconf)
               (signal (car err)(cdr err))))
       (with-current-buffer summary-buf
-       (elmo-folder-mark-as-answered folder (list number))
+       (elmo-folder-set-flag folder (list number) 'answered)
        (wl-summary-update-persistent-mark))
       t)))
 
@@ -3868,7 +4087,9 @@ Use function list is `wl-summary-write-current-folder-functions'."
          (save-excursion
            (set-buffer summary-buf)
            (setq subject
-                 (or (elmo-message-field folder number 'subject) ""))))
+                 (or (elmo-message-entity-field
+                      (elmo-message-entity folder number) 'subject 'decode)
+                     ""))))
       (set-buffer mes-buf)
       (wl-draft-forward subject summary-buf)
       (unless without-setup-hook
@@ -4279,7 +4500,8 @@ If ASK-CODING is non-nil, coding-system for the message is asked."
     (if num
        (save-excursion
          (setq filename (expand-file-name
-                         (int-to-string num)
+                         (concat (int-to-string num)
+                                 wl-summary-save-file-suffix)
                          wl-save-dir))
          (if (null (and arg
                         (null (file-exists-p filename))))
@@ -4299,7 +4521,7 @@ If ASK-CODING is non-nil, coding-system for the message is asked."
   (interactive "r")
   (save-excursion
     (save-restriction
-      (narrow-to-region beg end)
+      (wl-summary-narrow-to-region beg end)
       (goto-char (point-min))
       (let ((wl-save-dir
             (wl-read-directory-name "Save to directory: "
@@ -4394,14 +4616,14 @@ If ASK-CODING is non-nil, coding-system for the message is asked."
                              (wl-summary-message-number))))
                   (wl-ps-subject
                    (and entity
-                        (or (elmo-msgdb-overview-entity-get-subject entity)
+                        (or (elmo-message-entity-field entity 'subject t)
                             "")))
                   (wl-ps-from
                    (and entity
-                        (or (elmo-msgdb-overview-entity-get-from entity) "")))
+                        (or (elmo-message-entity-field entity 'from t) "")))
                   (wl-ps-date
                    (and entity
-                        (or (elmo-msgdb-overview-entity-get-date entity) ""))))
+                        (or (elmo-message-entity-field entity 'date) ""))))
              (run-hooks 'wl-ps-preprint-hook)
              (set-buffer wl-message-buffer)
              (copy-to-buffer buffer (point-min) (point-max))
@@ -4451,7 +4673,7 @@ If ASK-CODING is non-nil, coding-system for the message is asked."
   (interactive "P")
   (elmo-folder-pack-numbers wl-summary-buffer-elmo-folder)
   (let (wl-use-scoring)
-    (wl-summary-rescan)))
+    (wl-summary-rescan nil nil t)))
 
 (defun wl-summary-target-mark-uudecode ()
   (interactive)
@@ -4587,6 +4809,21 @@ If ASK-CODING is non-nil, coding-system for the message is asked."
          (setq  wl-summary-buffer-saved-message nil)))
     (message "There's no saved message.")))
 
+(defun wl-summary-toggle-header-narrowing ()
+  "Toggle message header narrowing."
+  (interactive)
+  (when wl-message-use-header-narrowing
+    (save-selected-window
+      (let* ((mbuf wl-message-buffer)
+            (mwin (when mbuf (get-buffer-window mbuf)))
+            (wpos (when mwin (window-start mwin))))
+       (when mbuf
+         (set-buffer mbuf)
+         (wl-message-header-narrowing-toggle)
+         (and wpos (set-window-start mwin wpos)))))))
+
+(autoload 'elmo-folder-list-global-flag-messages "elmo-flag")
+
 (require 'product)
 (product-provide (provide 'wl-summary) (require 'wl-version))