icicle update
[emacs.git] / .emacs.d / elisp / icicle / icicles-mode.el
index 5f98091..1323a69 100644 (file)
@@ -3,13 +3,12 @@
 ;; Filename: icicles-mode.el
 ;; Description: Icicle Mode definition for Icicles
 ;; Author: Drew Adams
-;; Maintainer: Drew Adams
-;; Copyright (C) 1996-2013, Drew Adams, all rights reserved.
+;; Maintainer: Drew Adams (concat "drew.adams" "@" "oracle" ".com")
+;; Copyright (C) 1996-2014, Drew Adams, all rights reserved.
 ;; Created: Mon Feb 27 10:21:10 2006
-;; Version: 22.0
-;; Last-Updated: Thu Feb 28 10:39:15 2013 (-0800)
+;; Last-Updated: Wed Apr 23 10:56:06 2014 (-0700)
 ;;           By: dradams
-;;     Update #: 9486
+;;     Update #: 10194
 ;; URL: http://www.emacswiki.org/icicles-mode.el
 ;; Doc URL: http://www.emacswiki.org/Icicles
 ;; Keywords: internal, extensions, help, abbrev, local, minibuffer,
 ;; Features that might be required by this library:
 ;;
 ;;   `advice', `advice-preload', `apropos', `apropos+',
-;;   `apropos-fn+var', `avoid', `bookmark', `bookmark+',
-;;   `bookmark+-1', `bookmark+-bmu', `bookmark+-key',
-;;   `bookmark+-lit', `cl', `cus-edit', `cus-face', `cus-load',
-;;   `cus-start', `dired', `dired+', `dired-aux', `dired-x',
-;;   `doremi', `easymenu', `el-swank-fuzzy', `ffap', `ffap-',
-;;   `fit-frame', `frame-cmds', `frame-fns', `fuzzy', `fuzzy-match',
-;;   `help+20', `hexrgb', `icicles-cmd1', `icicles-cmd2',
-;;   `icicles-fn', `icicles-mcmd', `icicles-opt', `icicles-var',
-;;   `image-dired', `info', `info+', `kmacro', `levenshtein',
-;;   `menu-bar', `menu-bar+', `misc-cmds', `misc-fns', `mouse3',
-;;   `mwheel', `naked', `pp', `pp+', `regexp-opt', `ring', `ring+',
+;;   `apropos-fn+var', `autofit-frame', `avoid', `bookmark',
+;;   `bookmark+', `bookmark+-1', `bookmark+-bmu', `bookmark+-key',
+;;   `bookmark+-lit', `cl', `cmds-menu', `cus-edit', `cus-face',
+;;   `cus-load', `cus-start', `cus-theme', `dired', `dired+',
+;;   `dired-aux', `dired-x', `doremi', `easymenu', `el-swank-fuzzy',
+;;   `ffap', `ffap-', `fit-frame', `frame-cmds', `frame-fns',
+;;   `fuzzy', `fuzzy-match', `help+20', `hexrgb', `icicles-cmd1',
+;;   `icicles-cmd2', `icicles-fn', `icicles-mcmd', `icicles-opt',
+;;   `icicles-var', `image-dired', `info', `info+', `kmacro',
+;;   `levenshtein', `menu-bar', `menu-bar+', `misc-cmds', `misc-fns',
+;;   `mouse3', `mwheel', `naked', `pp', `pp+', `regexp-opt', `ring',
 ;;   `second-sel', `strings', `subr-21', `thingatpt', `thingatpt+',
 ;;   `unaccent', `w32-browser', `w32browser-dlgopen', `wid-edit',
 ;;   `wid-edit+', `widget'.
 ;;    `icicle-describe-menu-map', `icicle-dired-multiple-menu-map',
 ;;    `icicle-dired-recursive-marked-menu-map',
 ;;    `icicle-edit-menu-map', `icicle-file-menu-map',
-;;    `icicle-frames-menu-map', `icicle-info-menu-map',
+;;    `icicle-frames-menu-map', `icicle-goto-imenu-menu-map',
+;;    `icicle-goto-menu-map', `icicle-info-menu-map',
 ;;    `icicle-mode-map', `icicle-options-menu-map',
-;;    `icicle-search-menu-map', `icicle-search-tags-menu-map'.
+;;    `icicle-options-choose-menu-map',
+;;    `icicle-options-toggle-menu-map', `icicle-search-menu-map'.
 ;;
 ;;  For descriptions of changes to this file, see `icicles-chg.el'.
  
 ;;
 ;;; Code:
 
-(eval-when-compile (require 'cl)) ;; pushnew, case
+(eval-when-compile (require 'cl)) ;; flet, pushnew, case
                                   ;; plus, for Emacs < 21: push, dolist
-
 (require 'advice)
   ;; ad-activate, ad-copy-advice-info, ad-deactivate, ad-disable-advice, ad-enable-advice,
-  ;; ad-find-some-advice, ad-get-arg, ad-is-active, ad-set-advice-info
-
+  ;; ad-find-some-advice, ad-get-arg, ad-is-active, ad-set-advice-info, defadvice
+
+(eval-when-compile
+ (or (condition-case nil
+         (load-library "icicles-mac")   ; Use load-library to ensure latest .elc.
+       (error nil))
+     (require 'icicles-mac)))           ; Require, so can load separately if not on `load-path'.
+  ;; icicle-menu-bar-make-toggle
 (require 'icicles-opt)                  ; (This is required anyway by `icicles-var.el'.)
-  ;; icicle-buffer-configs, icicle-buffer-extras, icicle-change-region-background-flag,
-  ;; icicle-default-cycling-mode, icicle-incremental-completion, icicle-default-value, icicle-kbd,
-  ;; icicle-kmacro-ring-max, icicle-minibuffer-setup-hook, icicle-modal-cycle-down-keys,
-  ;; icicle-modal-cycle-up-keys, icicle-functions-to-redefine, icicle-regexp-search-ring-max,
-  ;; icicle-region-background, icicle-search-ring-max, icicle-show-Completions-initially-flag,
+  ;; icicle-add-proxy-candidates-flag, icicle-buffer-configs, icicle-buffer-extras,
+  ;; icicle-change-region-background-flag, icicle-current-TAB-method, icicle-default-cycling-mode,
+  ;; icicle-incremental-completion, icicle-default-value, icicle-kbd, icicle-kmacro-ring-max,
+  ;; icicle-minibuffer-setup-hook, icicle-modal-cycle-down-keys, icicle-modal-cycle-up-keys,
+  ;; icicle-functions-to-redefine, icicle-regexp-search-ring-max, icicle-region-background,
+  ;; icicle-search-ring-max, icicle-shell-command-candidates-cache, icicle-show-Completions-initially-flag,
   ;; icicle-top-level-key-bindings, icicle-touche-pas-aux-menus-flag, icicle-word-completion-keys
 (require 'icicles-fn)                   ; (This is required anyway by `icicles-cmd1.el'.)
   ;; icicle-completing-p, icicle-toggle-icicle-mode-twice, icicle-unhighlight-lighter
 (require 'icicles-var)                  ; (This is required anyway by `icicles-fn.el'.)
-  ;; icicle-candidate-action-fn, icicle-candidate-nb, icicle-cmd-calling-for-completion,
-  ;; icicle-completing-p, icicle-completion-candidates, icicle-current-completion-mode,
+  ;; icicle-advice-info-list, icicle-all-candidates-action, icicle-all-candidates-list-action-fn,
+  ;; icicle-all-candidates-list-alt-action-fn, icicle-apropos-complete-match-fn,
+  ;; icicle-auto-no-icomplete-mode-p, icicle-auto-no-sort-p, icicle-candidate-action-fn,
+  ;; icicle-candidate-alt-action-fn, icicle-candidate-nb, icicle-candidates-alist,
+  ;; icicle-cmd-calling-for-completion, icicle-cmd-reading-input, icicle-completing-p,
+  ;; icicle-completing-read+insert-candidates, icicle-completion-candidates,
+  ;; icicle-completion-prompt-overlay, icicle-current-completion-mode, icicle-ess-use-ido,
   ;; icicle-ignored-extensions, icicle-ignored-extensions-regexp, icicle-incremental-completion-p,
-  ;; icicle-initial-value, icicle-last-completion-candidate, icicle-last-completion-command,
-  ;; icicle-last-input, icicle-menu-map, icicle-pre-minibuffer-buffer, icicle-minor-mode-map-entry,
-  ;; icicle-saved-completion-candidates, icicle-saved-kmacro-ring-max,
-  ;; icicle-saved-regexp-search-ring-max, icicle-saved-region-background, icicle-saved-search-ring-max,
-  ;; icicle-search-current-overlay, icicle-search-overlays, icicle-search-refined-overlays
+  ;; icicle-inhibit-advice-functions, icicle-inhibit-sort-p, icicle-initial-value,
+  ;; icicle-input-completion-fail-overlay, icicle-input-fail-pos, icicle-last-completion-candidate,
+  ;; icicle-last-completion-command, icicle-last-icomplete-mode-value, icicle-last-input,
+  ;; icicle-last-top-level-command, icicle-multi-completing-p, icicle-menu-map, icicle-minor-mode-map-entry,
+  ;; icicle-orig-read-file-name-fn, icicle-pre-minibuffer-buffer, icicle-previous-raw-file-name-inputs,
+  ;; icicle-previous-raw-non-file-name-inputs, icicle-progressive-completing-p, icicle-proxy-candidates,
+  ;; icicle-saved-candidate-overlays, icicle-saved-completion-candidates, icicle-saved-kmacro-ring-max,
+  ;; icicle-saved-proxy-candidates, icicle-saved-regexp-search-ring-max, icicle-saved-region-background,
+  ;; icicle-saved-search-ring-max, icicle-search-complement-domain-p, icicle-search-current-overlay,
+  ;; icicle-search-map, icicle-search-overlays, icicle-search-refined-overlays
 (require 'icicles-cmd1)                 ; (This is required anyway by `icicles-cmd2.el'.)
   ;; icicle-add-buffer-candidate, icicle-add-buffer-config, icicle-customize-face-other-window,
   ;; icicle-select-bookmarked-region
 (require 'icicles-cmd2)
   ;; icicle-imenu, icicle-imenu-command, icicle-imenu-command-full, icicle-imenu-face,
   ;; icicle-imenu-face-full, icicle-imenu-full, icicle-imenu-key-explicit-map,
-  ;; icicle-imenu-key-explicit-map-full, icicle-imenu-key-implicit-map,
-  ;; icicle-imenu-key-implicit-map-full, icicle-imenu-macro, icicle-imenu-macro-full,
-  ;; icicle-imenu-non-interactive-function, icicle-imenu-non-interactive-function-full,
-  ;; icicle-imenu-user-option, icicle-imenu-user-option-full, icicle-imenu-variable,
-  ;; icicle-imenu-variable-full, icicle-occur, icicle-search, icicle-search-all-tags-bookmark,
+  ;; icicle-imenu-key-explicit-map-full, icicle-imenu-key-implicit-map, icicle-imenu-key-implicit-map-full,
+  ;; icicle-imenu-macro, icicle-imenu-macro-full, icicle-imenu-non-interactive-function,
+  ;; icicle-imenu-non-interactive-function-full, icicle-imenu-user-option, icicle-imenu-user-option-full,
+  ;; icicle-imenu-variable, icicle-imenu-variable-full, icicle-occur, icicle-occur-dired-marked,
+  ;; icicle-occur-dired-marked-recursive, icicle-search, icicle-search-all-tags-bookmark,
   ;; icicle-search-all-tags-regexp-bookmark, icicle-search-autofile-bookmark,
   ;; icicle-search-autonamed-bookmark, icicle-search-bookmark, icicle-search-bookmark-list-bookmark,
   ;; icicle-search-bookmark-list-marked, icicle-search-bookmarks-together, icicle-search-buffer,
   ;; icicle-search-buff-menu-marked, icicle-search-char-property, icicle-search-dired-bookmark,
-  ;; icicle-search-dired-marked-recursive, icicle-search-file, icicle-search-file-bookmark,
-  ;; icicle-search-gnus-bookmark, icicle-search-highlight-cleanup, icicle-search-ibuffer-marked,
-  ;; icicle-search-info-bookmark, icicle-search-keywords, icicle-search-local-file-bookmark,
-  ;; icicle-search-man-bookmark, icicle-search-non-file-bookmark, icicle-search-overlay-property,
-  ;; icicle-search-pages, icicle-search-paragraphs, icicle-search-region-bookmark,
-  ;; icicle-search-remote-file-bookmark, icicle-search-sentences, icicle-search-some-tags-bookmark,
-  ;; icicle-search-some-tags-regexp-bookmark, icicle-search-specific-buffers-bookmark,
-  ;; icicle-search-specific-files-bookmark, icicle-search-temporary-bookmark,
-  ;; icicle-search-text-property, icicle-search-thing, icicle-search-this-buffer-bookmark,
-  ;; icicle-search-url-bookmark, icicle-search-w3m-bookmark, icicle-search-w-isearch-string,
-  ;; icicle-search-word, icicle-search-xml-element, icicle-search-xml-element-text-node
+  ;; icicle-search-dired-marked, icicle-search-dired-marked-recursive, icicle-search-file,
+  ;; icicle-search-file-bookmark, icicle-search-gnus-bookmark, icicle-search-highlight-cleanup,
+  ;; icicle-search-ibuffer-marked, icicle-search-info-bookmark, icicle-searching-p, icicle-search-keywords,
+  ;; icicle-search-local-file-bookmark, icicle-search-man-bookmark, icicle-search-non-file-bookmark,
+  ;; icicle-search-overlay-property, icicle-search-pages, icicle-search-paragraphs,
+  ;; icicle-search-region-bookmark, icicle-search-remote-file-bookmark, icicle-search-sentences,
+  ;; icicle-search-some-tags-bookmark, icicle-search-some-tags-regexp-bookmark,
+  ;; icicle-search-specific-buffers-bookmark, icicle-search-specific-files-bookmark,
+  ;; icicle-search-temporary-bookmark, icicle-search-text-property, icicle-search-thing,
+  ;; icicle-search-this-buffer-bookmark, icicle-search-url-bookmark, icicle-search-w3m-bookmark,
+  ;; icicle-search-w-isearch-string, icicle-search-word, icicle-search-xml-element,
+  ;; icicle-search-xml-element-text-node
 
 ;; Use `condition-case' because if `mb-depth.el' can't be found, `mb-depth+.el' is not provided.
 (when (>= emacs-major-version 22) (condition-case nil (require 'mb-depth+ nil t) (error nil)))
 (defvar inferior-tcl-mode-map)          ; In `tcl.el'.
 (defvar Info-mode-map)                  ; In `info.el'.
 (defvar isearch-mode-map)               ; In `isearch.el'.
+(defvar menu-bar-buffers-menu-command-entries) ; In `menu-bar.el' for Emacs 24+.
 (defvar menu-bar-goto-menu)             ; In `menu-bar.el'.
 (defvar savehist-minibuffer-history-variables) ; In `savehist.el'
 (defvar shell-mode-map)                 ; In `shell.el'.
@@ -273,7 +292,7 @@ bindings in `*Completions*'.")
 
 ;;; Icicle mode command ----------------------------------------------
 
-;; Main command.  Inspired from `icomplete-mode'.
+;; Main command.
 (defalias 'icy-mode 'icicle-mode)
 (when (fboundp 'define-minor-mode)      ; Emacs 21+ ------------
   (when (> emacs-major-version 22)
@@ -290,13 +309,57 @@ bindings in `*Completions*'.")
       (add-hook 'savehist-save-hook
                 (lambda () (setq savehist-minibuffer-history-variables
                                  (delq 'icicle-interactive-history
-                                       savehist-minibuffer-history-variables))))))
+                                       savehist-minibuffer-history-variables)))))
+    
+    ;; Just replace the original ESS definitions so that the new ones use Icicles completion.
+    (defadvice ess-internal-complete-object-name (around icicle-ess-internal-complete-object-name
+                                                         disable activate)
+      "`ess-internal-complete-object-name', but in Icicle mode use Icicles completion."
+      (if (fboundp 'cl-flet)
+          (cl-flet ((comint-dynamic-simple-complete (stub candidates)
+                      (icicle-comint-dynamic-simple-complete stub candidates)))
+            ad-do-it)
+        (flet ((comint-dynamic-simple-complete (stub candidates)
+                 (icicle-comint-dynamic-simple-complete stub candidates)))
+          ad-do-it)))
+
+    (defadvice ess-complete-filename (around icicle-ess-complete-filename disable activate)
+      "`ess-complete-filename', but in Icicle mode use Icicles completion."
+      (if (fboundp 'cl-flet)
+          (cl-flet ((comint-dynamic-complete-filename (&optional replace-to-eol-p)
+                      (icicle-comint-dynamic-complete-filename replace-to-eol-p))
+                    (comint-replace-by-expanded-filename () ; This one is not used for recent ESS versions.
+                      (icicle-comint-replace-by-expanded-filename)))
+            ad-do-it)
+        (flet ((comint-dynamic-complete-filename (&optional replace-to-eol-p)
+                 (icicle-comint-dynamic-complete-filename replace-to-eol-p))
+               (comint-replace-by-expanded-filename () ; This one is not used for recent ESS versions.
+                 (icicle-comint-replace-by-expanded-filename)))
+          ad-do-it)))
+
+    (defadvice ess-R-complete-object-name (around icicle-ess-R-complete-object-name disable activate)
+      "`ess-R-complete-object-name', but in Icicle mode use Icicles completion."
+      (if (fboundp 'cl-flet)
+          (cl-flet ((comint-dynamic-simple-complete (stub candidates)
+                      (icicle-comint-dynamic-simple-complete stub candidates)))
+            ad-do-it)
+        (flet ((comint-dynamic-simple-complete (stub candidates)
+                 (icicle-comint-dynamic-simple-complete stub candidates)))
+          ad-do-it)))
+
+    (defadvice ess-completing-read (around icicle-ess-completing-read disable activate)
+      "Make `ess-completing-read' use Icicles completion in Icicle mode."
+      (let ((ess-use-ido  (or icicle-ess-use-ido  nil)))
+        ad-do-it)))
+
   (when (> emacs-major-version 21)
     (defadvice describe-face (before icicle-respect-WYSIWYG activate)
       "`read-face-name' respects `icicle-WYSIWYG-Completions-flag'.
 If non-nil, then it does not use `completing-read-multiple' (which
 cannot take advantage of WYSIWYG)."
-      (interactive (list (read-face-name "Describe face" "= `default' face"
+      (interactive (list (read-face-name "Describe face" (if (> emacs-major-version 23)
+                                                             (or (face-at-point t)  'default)
+                                                           "= `default' face")
                                          (not icicle-WYSIWYG-Completions-flag))))))
 
   ;; Eval this so that even if the library is byte-compiled with Emacs 20,
@@ -353,7 +416,27 @@ Commentary headers of files `icicles-cmd1.el' and `icicles-cmd2.el'."
                  (icicle-redefine-standard-options)
                  (icicle-redefine-standard-widgets)
                  (when (ad-find-some-advice 'describe-face 'before 'icicle-respect-WYSIWYG)
-                   (ad-enable-advice 'describe-face 'before 'icicle-respect-WYSIWYG))
+                   (ad-enable-advice 'describe-face 'before 'icicle-respect-WYSIWYG)
+                   (unless (ad-is-active 'describe-face) (ad-activate 'describe-face)))
+                 (when (ad-find-some-advice 'ess-internal-complete-object-name 'around
+                                            'icicle-ess-internal-complete-object-name)
+                   (ad-enable-advice 'ess-internal-complete-object-name 'around
+                                     'icicle-ess-internal-complete-object-name)
+                   (unless (ad-is-active 'ess-internal-complete-object-name)
+                     (ad-activate 'ess-internal-complete-object-name)))
+                 (when (ad-find-some-advice 'ess-complete-filename 'around
+                                            'icicle-ess-complete-filename)
+                   (ad-enable-advice 'ess-complete-filename 'around 'icicle-ess-complete-filename)
+                   (unless (ad-is-active 'ess-complete-filename) (ad-activate 'ess-complete-filename)))
+                 (when (ad-find-some-advice 'ess-R-complete-object-name 'around
+                                            'icicle-ess-R-complete-object-name)
+                   (ad-enable-advice 'ess-R-complete-object-name 'around
+                                     'icicle-ess-R-complete-object-name)
+                   (unless (ad-is-active 'ess-R-complete-object-name)
+                     (ad-activate 'ess-R-complete-object-name)))
+                 (when (ad-find-some-advice 'ess-completing-read 'around 'icicle-ess-completing-read)
+                   (ad-enable-advice 'ess-completing-read 'around 'icicle-ess-completing-read)
+                   (unless (ad-is-active 'ess-completing-read) (ad-activate 'ess-completing-read)))
                  (when (fboundp 'minibuffer-depth-indicate-mode) ; In `mb-depth(+).el'
                    (minibuffer-depth-indicate-mode 99))
                  (if icicle-menu-items-to-history-flag
@@ -396,6 +479,19 @@ Commentary headers of files `icicles-cmd1.el' and `icicles-cmd2.el'."
                  (icicle-restore-standard-widgets)
                  (when (ad-find-some-advice 'describe-face 'before 'icicle-respect-WYSIWYG)
                    (ad-disable-advice 'describe-face 'before 'icicle-respect-WYSIWYG))
+                 (when (ad-find-some-advice 'ess-internal-complete-object-name 'around
+                                            'icicle-ess-internal-complete-object-name)
+                   (ad-disable-advice 'ess-internal-complete-object-name 'around
+                                      'icicle-ess-internal-complete-object-name))
+                 (when (ad-find-some-advice 'ess-complete-filename 'around
+                                            'icicle-ess-complete-filename)
+                   (ad-disable-advice 'ess-complete-filename 'around 'icicle-ess-complete-filename))
+                 (when (ad-find-some-advice 'ess-R-complete-object-name 'around
+                                            'icicle-ess-R-complete-object-name)
+                   (ad-disable-advice 'ess-R-complete-object-name 'around
+                                      'icicle-ess-R-complete-object-name))
+                 (when (ad-find-some-advice 'ess-completing-read 'around 'icicle-ess-completing-read)
+                   (ad-disable-advice 'ess-completing-read 'around 'icicle-ess-completing-read))
                  (when (fboundp 'minibuffer-depth-indicate-mode)
                    (minibuffer-depth-indicate-mode -99))
                  (remove-hook 'pre-command-hook 'icicle-add-menu-item-to-cmd-history)
@@ -517,6 +613,225 @@ Commentary headers of files `icicles-cmd1.el' and `icicles-cmd2.el'."
 
     (add-to-list 'minor-mode-alist '(icicle-mode " Icy"))))
 
+
+;; `Minibuf' > `Save/Retrieve Candidates' Menu------------------------
+(defvar icicle-minibuf-save-retrieve-menu-map (make-sparse-keymap)
+  "`Minibuf' > `Save/Retrieve Candidates' submenu.")
+
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-saved-completion-candidates]
+  '(menu-item "Swap Saved and Current Sets" icicle-candidate-set-swap
+    :enable icicle-saved-completion-candidates
+    :help "Swap the saved and current sets of completion candidates"))
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-candidate-set-save-more-selected]
+  '(menu-item "Save More Selected (Region) Candidates"
+    icicle-candidate-set-save-more-selected
+    :help "Add the candidates in the region to the saved candidates"))
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-candidate-set-save-selected]
+  '(menu-item "Save Selected (Region) Candidates"
+    icicle-candidate-set-save-selected
+    :help "Save the candidates in the region, for later recall"))
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-candidate-set-save-more]
+  '(menu-item "Save More Candidates" icicle-candidate-set-save-more
+    :help "Add current completion candidates to saved candidates set"))
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-candidate-set-save-persistently]
+  '(menu-item "    to Cache File..." icicle-candidate-set-save-persistently
+    :help "Save current completion candidates to a cache file, for later recall"))
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-candidate-set-save-to-variable]
+  '(menu-item "    to Variable..." icicle-candidate-set-save-to-variable
+    :help "Save current completion candidates to a variable, for later recall"))
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-candidate-set-save]
+  '(menu-item "Save Candidates" icicle-candidate-set-save
+    :help "Save the set of current completion candidates, for later recall"))
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-candidate-set-retrieve-more]
+  '(menu-item "Retrieve More Saved Candidates" icicle-candidate-set-retrieve-more
+    :help "Add saved candidates to current completion candidates"))
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-candidate-set-retrieve-persistent]
+  '(menu-item "    from Cache File..."
+    icicle-candidate-set-retrieve-persistent
+    :help "Retrieve saved completion candidates from a cache file, making them current"))
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-candidate-set-retrieve-from-variable]
+  '(menu-item "    from Variable..." icicle-candidate-set-retrieve-from-variable
+    :help "Retrieve saved completion candidates from variable, making them current"))
+(define-key icicle-minibuf-save-retrieve-menu-map [icicle-candidate-set-retrieve]
+  '(menu-item "Retrieve Saved Candidates" icicle-candidate-set-retrieve
+    :enable icicle-saved-completion-candidates
+    :help "Retrieve the saved set of completion candidates, making it current"))
+
+
+;; `Minibuf' > `Candidate Set' Menu-----------------------------------
+
+(defvar icicle-minibuf-candidate-set-menu-map (make-sparse-keymap)
+  "`Minibuf' > `Candidate Set' submenu.")
+
+(define-key icicle-minibuf-candidate-set-menu-map [icicle-candidate-set-define]
+  '(menu-item "Define Candidates by Lisp Sexp" icicle-candidate-set-define
+    :help "Define the set of current completion candidates by evaluating a sexp"))
+(define-key icicle-minibuf-candidate-set-menu-map [icicle-keep-only-past-inputs]
+  '(menu-item "Keep Only Previously Entered" icicle-keep-only-past-inputs
+    :enable (and icicle-completion-candidates  (consp (symbol-value minibuffer-history-variable)))
+    :help "Removed candidates that you have not previously chosen and entered"))
+(define-key icicle-minibuf-candidate-set-menu-map [icicle-candidate-set-union]
+  '(menu-item "Add (Union) Saved Candidate Set" icicle-candidate-set-union
+    :enable icicle-saved-completion-candidates
+    :help "Set union between the current and saved completion candidates"))
+(define-key icicle-minibuf-candidate-set-menu-map [icicle-candidate-set-difference]
+  '(menu-item "Subtract Saved Candidate Set" icicle-candidate-set-difference
+    :enable icicle-saved-completion-candidates
+    :help "Set difference between the current and saved completion candidates"))
+(define-key icicle-minibuf-candidate-set-menu-map [icicle-candidate-set-intersection]
+  '(menu-item "Intersect Saved Candidate Set" icicle-candidate-set-intersection
+    :enable icicle-saved-completion-candidates
+    :help "Set intersection between the current and saved candidates"))
+(define-key icicle-minibuf-candidate-set-menu-map [icicle-save-predicate-to-variable]
+  '(menu-item "Save Predicate to Variable" icicle-save-predicate-to-variable
+    :help "Save the current completion predicate to a variable"))
+(define-key icicle-minibuf-candidate-set-menu-map [icicle-narrow-candidates-with-predicate]
+  '(menu-item "Satisfy Also Predicate..." icicle-narrow-candidates-with-predicate
+    :help "Match another input pattern (narrow completions set)"
+    :enable icicle-completion-candidates))
+(define-key icicle-minibuf-candidate-set-menu-map [icicle-narrow-candidates]
+  '(menu-item "Match Also Regexp..." icicle-narrow-candidates
+    :enable icicle-completion-candidates
+    :help "Match another input pattern (narrow completions set)"))
+(define-key icicle-minibuf-candidate-set-menu-map [icicle-widen-candidates]
+  '(menu-item "Match Alternative..." icicle-widen-candidates
+    :enable icicle-completion-candidates
+    :help "Match alternative input pattern (widen completions set)"))
+(define-key icicle-minibuf-candidate-set-menu-map [icicle-candidate-set-complement]
+  '(menu-item "Complement Candidates" icicle-candidate-set-complement
+    :help "Complement the set of current completion candidates"))
+
+
+;; `Minibuf' > `Act on All Candidates' Menu---------------------------
+
+(defvar icicle-minibuf-act-on-all-menu-map (make-sparse-keymap)
+  "`Minibuf' > `Act on All Candidates' submenu.")
+
+(define-key icicle-minibuf-act-on-all-menu-map [icicle-all-candidates-list-alt-action]
+  '(menu-item "Alternate Act on List" icicle-all-candidates-list-alt-action
+    :help "Apply the alternative action to the list of matching completion candidates"
+    :enable icicle-all-candidates-list-alt-action-fn))
+(define-key icicle-minibuf-act-on-all-menu-map [icicle-all-candidates-alt-action]
+  '(menu-item "Alternate Act on Each" icicle-all-candidates-alt-action
+    :help "Apply the alternative action to each matching completion candidates"
+    :enable icicle-candidate-alt-action-fn))
+(define-key icicle-minibuf-act-on-all-menu-map [separator-alt] '("--"))
+(define-key icicle-minibuf-act-on-all-menu-map [icicle-all-candidates-list-action]
+  '(menu-item "Act on List" icicle-all-candidates-list-action
+    :help "Apply the command action to the list of matching completion candidates"
+    :enable icicle-all-candidates-list-action-fn))
+(define-key icicle-minibuf-act-on-all-menu-map [icicle-all-candidates-action]
+  '(menu-item "Act on Each" icicle-all-candidates-action
+    :help "Apply the command action to each matching completion candidates"
+    :enable icicle-candidate-action-fn))
+
+
+;; `Minibuf' > `History' Menu--------------------------------------------
+
+(defvar icicle-minibuf-history-menu-map (make-sparse-keymap)
+  "`Minibuf' > `History' submenu.")
+
+(define-key icicle-minibuf-history-menu-map [icicle-clear-current-history]
+  '(menu-item "Clear History Entries" icicle-clear-current-history
+    :help "Clear current minibuffer history of selected entries"))
+(define-key icicle-minibuf-history-menu-map [icicle-erase-minibuffer]
+  '(menu-item "Delete from History" icicle-erase-minibuffer-or-history-element
+    :visible (memq last-command
+              '(previous-history-element next-history-element
+                icicle-erase-minibuffer-or-history-element
+                previous-matching-history-element next-matching-history-element))
+    :help "Delete current history element (in minibuffer now)" :keys "M-k"))
+(define-key icicle-minibuf-history-menu-map [history-isearch-forward]
+  '(menu-item "Isearch History Forward" isearch-forward
+    :help "Incrementally search minibuffer history forward"))
+(define-key icicle-minibuf-history-menu-map [history-isearch-backward]
+  '(menu-item "Isearch History Backward" isearch-backward
+    :help "Incrementally search minibuffer history backward"))
+(define-key icicle-minibuf-history-menu-map [history-next]
+  '(menu-item "Next History Item" next-history-element
+    :help "Put next minibuffer history element in the minibuffer"))
+(define-key icicle-minibuf-history-menu-map [history-previous]
+  '(menu-item "Previous History Item" previous-history-element
+    :help "Put previous minibuffer history element in the minibuffer"))
+
+
+;; `Minibuf' > `Edit' Menu--------------------------------------------
+
+(defvar icicle-minibuf-edit-menu-map (make-sparse-keymap)
+  "`Minibuf' > `Edit' submenu.")
+
+(define-key icicle-minibuf-edit-menu-map [icicle-delete-history-element]
+  '(menu-item "Clear (Erase) Minibuffer" icicle-erase-minibuffer-or-history-element
+    :visible (not (memq last-command
+                   '(previous-history-element next-history-element
+                     icicle-erase-minibuffer-or-history-element
+                     previous-matching-history-element next-matching-history-element)))
+    :help "Erase the Minibuffer" :keys "M-k"))
+(define-key icicle-minibuf-edit-menu-map [icicle-goto/kill-failed-input]
+  '(menu-item "Cursor to Mismatch (Repeat: Kill)" icicle-goto/kill-failed-input
+    :visible icicle-completing-p
+    :enable (and (overlayp icicle-input-completion-fail-overlay)
+             (overlay-start icicle-input-completion-fail-overlay))
+    :help "Put cursor where input fails to complete - repeat to kill mismatch"))
+(define-key icicle-minibuf-edit-menu-map [icicle-retrieve-next-input]
+  '(menu-item "Restore Next Completion Input" icicle-retrieve-next-input
+    :visible icicle-completing-p
+    :enable (consp (symbol-value (if (icicle-file-name-input-p)
+                                     'icicle-previous-raw-file-name-inputs
+                                   'icicle-previous-raw-non-file-name-inputs)))
+    :help "Cycle forward to insert a previous completion input in the minibuffer (`C-u': \
+complete)"))
+(define-key icicle-minibuf-edit-menu-map [icicle-retrieve-previous-input]
+  '(menu-item "Restore Previous Completion Input" icicle-retrieve-previous-input
+    :visible icicle-completing-p
+    :enable (consp (symbol-value (if (icicle-file-name-input-p)
+                                     'icicle-previous-raw-file-name-inputs
+                                   'icicle-previous-raw-non-file-name-inputs)))
+    :help "Cycle backward to insert a previous completion input in the minibuffer (`C-u': \
+complete)"))
+(define-key icicle-minibuf-edit-menu-map [icicle-regexp-quote-input]
+  '(menu-item "Regexp-Quote Input" icicle-regexp-quote-input
+    :enable (with-current-buffer (window-buffer (minibuffer-window))
+              (goto-char (icicle-minibuffer-prompt-end))  (not (eobp)))
+    :help "Regexp-quote current input or its active region, then apropos-complete" :keys "M-%"))
+(define-key icicle-minibuf-edit-menu-map [icicle-insert-key-description]
+  '(menu-item "Insert Key Description" icicle-insert-key-description
+    :visible (not icicle-searching-p) :keys "M-q"
+    :help "Read key and insert its description - e.g., reading ^F inserts `C-f'"))
+(define-key icicle-minibuf-edit-menu-map [icicle-roundup]
+  '(menu-item "Insert Completion Candidate(s)" icicle-roundup
+    :visible icicle-completing-p
+    :enable icicle-completion-candidates
+    :help "Insert one or more completion candidates in the minibuffer" :keys "M-r"))
+(define-key icicle-minibuf-edit-menu-map [icicle-insert-string-from-a-var]
+  '(menu-item "Insert String from a Variable..." icicle-insert-string-from-variable
+    :visible current-prefix-arg :keys "C-="
+    :help "Read a variable name and insert its string value into the minibuffer"))
+(define-key icicle-minibuf-edit-menu-map [icicle-insert-string-from-std-var]
+  '(menu-item "Insert `icicle-input-string'" icicle-insert-string-from-variable
+    :visible (not current-prefix-arg) :keys "C-="
+    :help "Insert text from variable `icicle-input-string' into the minibuffer"))
+(define-key icicle-minibuf-edit-menu-map [icicle-completing-read+insert]
+  '(menu-item "Insert On-Demand Completion" icicle-completing-read+insert
+    :visible (consp icicle-completing-read+insert-candidates)
+    :help "Read and insert something using (lax) completion"))
+(define-key icicle-minibuf-edit-menu-map [icicle-read+insert-file-name]
+  '(menu-item "Insert File Name" icicle-read+insert-file-name
+    :help "Read and insert a file name using (lax) completion"))
+(define-key icicle-minibuf-edit-menu-map [icicle-insert-history-element]
+  '(menu-item "Insert Past Input(s) using Completion" icicle-insert-history-element
+    :enable (consp (symbol-value minibuffer-history-variable))
+    :help "Use completion to insert a previous input into the minibuffer"))
+(define-key icicle-minibuf-edit-menu-map [icicle-insert-list-join-string]
+  '(menu-item "Insert Join-String" icicle-insert-list-join-string
+    :visible icicle-multi-completing-p
+    :help "Insert `icicle-list-join-string' into the minibuffer" :keys "C-M-j"))
+(define-key icicle-minibuf-edit-menu-map [icicle-insert-string-at-point]
+  '(menu-item "Insert Text from Point" icicle-insert-string-at-point
+    :help "Insert text at or near the cursor into the minibuffer"))
+
+
+
 (defun icicle-add-menu-item-to-cmd-history ()
   "Add `this-command' to command history, if it is a menu item.
 Menu items that are not associated with a command symbol are ignored.
@@ -532,15 +847,17 @@ Used on `pre-command-hook'."
 (defun icicle-top-level-prep ()
   "Do top-level stuff.  Used in `pre-command-hook'."
   ;; Reset `icicle-current-TAB-method' and `icicle-apropos-complete-match-fn' if temporary.
-  ;; Save this top-level command as `icicle-last-top-level-command'
+  ;; Save this top-level command as `icicle-last-top-level-command'.
   ;; Reset `icicle-candidates-alist' to ().
-  (when (= 0 (recursion-depth))
+  (unless (> (minibuffer-depth) 0)
     (let ((TAB-method  (get 'icicle-last-top-level-command 'icicle-current-TAB-method))
           (apropos-fn  (get 'icicle-last-top-level-command 'icicle-apropos-complete-match-fn)))
       (when TAB-method (setq icicle-current-TAB-method  TAB-method))
       (when apropos-fn (setq icicle-apropos-complete-match-fn  apropos-fn)))
-    (setq icicle-last-top-level-command   this-command
-          icicle-candidates-alist         ())))
+    (unless (memq this-command '(minibuffer-complete-and-exit icicle-minibuffer-complete-and-exit
+                                 exit-minibuffer              icicle-exit-minibuffer))
+      (setq icicle-last-top-level-command   this-command))
+    (setq icicle-candidates-alist  ())))
 
 (defun icicle-define-icicle-maps ()
   "Define `icicle-mode-map' and `icicle-menu-map'."
@@ -549,16 +866,22 @@ Used on `pre-command-hook'."
   ;; Define `Icicles' menu-bar menu.  Create it only once: sacrifice any new bindings for speed.
   (unless icicle-menu-map
     (setq icicle-menu-map  (make-sparse-keymap "Icicles"))
-    (define-key icicle-menu-map [icicle-mode] '(menu-item "Turn Off Icicle Mode" icicle-mode))
 
     ;; End of `Icicles' menu -----------------------------------------
     (define-key icicle-menu-map [icicle-report-bug]
       '(menu-item "Send Icicles Bug Report" icicle-send-bug-report))
     (define-key icicle-menu-map [icicle-customize-icicles-group]
       '(menu-item "Customize Icicles" icicle-customize-icicles-group))
+    (when (fboundp 'icicle-complete-keys)
+      (define-key icicle-menu-map [icicle-complete-keys]
+        '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
+          :help "Show available keys (`C-g') or complete prefix key")))
+    (define-key icicle-menu-map [icicle-help]
+      '(menu-item "Icicles Help" icicle-minibuffer-help
+        :help "Display help for minibuffer input and completion" :keys "M-? in minibuf"))
 
 
-    ;; `Options' -----------------------------------------------------
+    ;; `Icicle Options' -----------------------------------------------------
     (cond ((not icicle-touche-pas-aux-menus-flag)
            (defvar icicle-options-menu-map (make-sparse-keymap)
              "`Options' > `Icicles' submenu.")
@@ -579,157 +902,199 @@ Used on `pre-command-hook'."
     (define-key icicle-options-menu-map [icicle-toggle-option]
       '(menu-item "+ Toggle Any Option..." icicle-toggle-option
         :help "Toggle boolean option (C-u: any user option, C--: any var)"))
-    (define-key icicle-options-menu-map [icicle-toggle-C-for-actions]
-      '(menu-item "Toggle Using `C-' for Actions" icicle-toggle-C-for-actions :keys "M-g"
+
+
+    ;; `Icicle Options' > `Toggle' ------------------------------------------
+    (defvar icicle-options-toggle-menu-map (make-sparse-keymap)
+      "`Toggle' submenu of Icicles options menu.")
+    (define-key icicle-options-menu-map [toggle]
+      (list 'menu-item "Toggle" icicle-options-toggle-menu-map :visible 'icicle-mode))
+
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-C-for-actions]
+      '(menu-item "Using `C-' for Actions" icicle-toggle-C-for-actions :keys "M-g"
         :help "Toggle option `icicle-use-C-for-actions-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-~-for-home-dir]
-      '(menu-item "Toggle Using `~' for $HOME" icicle-toggle-~-for-home-dir :keys "M-~"
-        :help "Toggle option `icicle-use-~-for-home-dir-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-WYSIWYG-Completions]
-      '(menu-item "Toggle WYSIWYG For `*Completions*'" icicle-toggle-WYSIWYG-Completions
-        :help "Toggle option `icicle-WYSIWYG-Completions-flag'"))
-    (define-key icicle-options-menu-map [icicle-next-TAB-completion-method]
-      '(menu-item "Next `TAB' Completion Method" icicle-next-TAB-completion-method
-        :keys "C-(" :help "Cycle to the next `TAB' completion method (C-u: ONE-OFF)"))
-    (define-key icicle-options-menu-map [icicle-next-S-TAB-completion-method]
-      '(menu-item "Next `S-TAB' Completion Method" icicle-next-S-TAB-completion-method
-        :keys "M-(" :help "Cycle to the next `S-TAB' completion method (C-u: ONE-OFF)"))
-    (when (fboundp 'icicle-cycle-image-file-thumbnail)
-      (define-key icicle-options-menu-map [icicle-cycle-image-file-thumbnail]
-        '(menu-item "Next Image-File Thumbnail Setting" icicle-cycle-image-file-thumbnail
-          :keys "C-x t" :help "Cycle Thumbnail Image File Setting")))
-    (define-key icicle-options-menu-map [icicle-toggle-search-cleanup]
-      '(menu-item "Toggle Icicle-Search Highlighting Cleanup" icicle-toggle-search-cleanup
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-~-for-home-dir]
+      (icicle-menu-bar-make-toggle icicle-use-~-for-home-dir-flag icicle-use-~-for-home-dir-flag
+                                   "Using `~' for $HOME"
+                                   "Using `~' for home directory is now %s"
+                                   "Toggle option `icicle-use-~-for-home-dir-flag'")) ; :keys "M-~"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-search-cleanup]
+      '(menu-item "Icicle-Search Highlighting Cleanup" icicle-toggle-search-cleanup
         :keys "C-." :help "Toggle option `icicle-search-cleanup-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-search-replace-common-match]
-      '(menu-item "Toggle Replacing Longest Common Match"
-        icicle-toggle-search-replace-common-match :enable icicle-searching-p :keys "M-;"
-        :help "Toggle option `icicle-search-replace-common-match-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-search-replace-whole]
-      '(menu-item "Toggle Replacing Whole Search Hit" icicle-toggle-search-replace-whole
-        :enable icicle-searching-p :keys "M-_"
-        :help "Toggle option `icicle-search-replace-whole-candidate-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-search-whole-word]
-      '(menu-item "Toggle Whole-Word Searching (Icicles Search)"
-        icicle-toggle-search-whole-word
-        :enable icicle-searching-p :keys "M-q"
-        :help "Toggle `icicle-search-whole-word-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-regexp-quote]
-      '(menu-item "Toggle Escaping Special Chars" icicle-toggle-regexp-quote :keys "C-`"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-search-replace-common-match]
+      (icicle-menu-bar-make-toggle icicle-search-replace-common-match-flag
+                                   icicle-search-replace-common-match-flag
+                                   "Replacing Longest Common Match"
+                                   "Removal of Icicles search highlighting is now %s"
+                                   "Toggle option `icicle-search-replace-common-match-flag'")) ; :keys "M-;"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-search-replace-whole]
+      (icicle-menu-bar-make-toggle icicle-search-replace-whole-candidate-flag
+                                   icicle-search-replace-whole-candidate-flag
+                                   "Replacing Whole Search Hit"
+                                   "Replacing whole search context is now %s"
+                                   "Toggle option `icicle-search-replace-whole-candidate-flag'"))
+                                        ; :keys "M-_"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-search-whole-word]
+      (icicle-menu-bar-make-toggle icicle-search-whole-word-flag icicle-search-whole-word-flag
+                                   "Whole-Word Searching (Icicles Search)"
+                                   "Whole-word searching is now %s, starting with next search"
+                                   "Toggle `icicle-search-whole-word-flag'")) ; :keys "M-q"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-regexp-quote]
+      '(menu-item "Escaping Special Chars" icicle-toggle-regexp-quote :keys "C-`"
         :help "Toggle option `icicle-regexp-quote-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-dot]
-      '(menu-item "Toggle `.' Matching Newlines Too" icicle-toggle-dot :keys "C-M-."
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-dot]
+      '(menu-item "Dot (`.') Matching Newlines Too" icicle-toggle-dot :keys "C-M-."
         :help "Toggle `icicle-dot-string' between `.' and `icicle-anychar-regexp'"))
-    (define-key icicle-options-menu-map [icicle-cycle-incremental-completion]
-      '(menu-item "Cycle Incremental Completion" icicle-cycle-incremental-completion
-        :keys "C-#" :help "Cycle option `icicle-incremental-completion'"))
-    (define-key icicle-options-menu-map [icicle-toggle-show-multi-completion]
-      '(menu-item "Toggle Showing Multi-Completions" icicle-toggle-show-multi-completion
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-icomplete-mode]
+      '(menu-item "Icomplete Mode" icicle-toggle-icomplete-mode
+        :help "Toggle Icomplete mode" :enable (featurep 'icomplete-mode) :keys "C-M-#"))
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-show-multi-completion]
+      '(menu-item "Showing Multi-Completions" icicle-toggle-show-multi-completion
         :help "Toggle option `icicle-show-multi-completion-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-completions-format]
-      '(menu-item "Toggle Horizontal/Vertical Layout" icicle-toggle-completions-format
-        :help "Toggle option `icicle-hide-non-matching-lines-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-hiding-non-matching-lines]
-      '(menu-item "Toggle Hiding Non-Matching Lines"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-completions-format]
+      '(menu-item "Horizontal/Vertical Layout" icicle-toggle-completions-format
+        :keys "C-M-^" :help "Toggle `icicle-completions-format' between vertical and horizontal."))
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-hiding-non-matching-lines]
+      '(menu-item "Hiding Non-Matching Lines"
         icicle-toggle-hiding-non-matching-lines
         :keys "C-u C-x ." :help "Toggle option `icicle-hide-non-matching-lines-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-hiding-common-match]
-      '(menu-item "Toggle Hiding Common Match" icicle-toggle-hiding-common-match
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-hiding-common-match]
+      '(menu-item "Hiding Common Match" icicle-toggle-hiding-common-match
         :keys "C-x ." :help "Toggle option `icicle-hide-common-match-in-Completions-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-expand-to-common-match]
-      '(menu-item "Toggle Expansion to Common Match" icicle-toggle-expand-to-common-match
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-expand-to-common-match]
+      '(menu-item "Expansion to Common Match" icicle-toggle-expand-to-common-match
         :keys "C-\"" :help "Toggle option `icicle-expand-input-to-common-match'"))
-    (define-key icicle-options-menu-map [icicle-toggle-ignoring-comments]
-      '(menu-item "Toggle Ignoring Comments" icicle-toggle-ignoring-comments
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-ignoring-comments]
+      '(menu-item "Ignoring Comments" icicle-toggle-ignoring-comments
         :keys "C-M-;" :help "Toggle option `icicle-ignore-comments-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-ignored-space-prefix]
-      '(menu-item "Toggle Ignoring Space Prefix" icicle-toggle-ignored-space-prefix
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-ignored-space-prefix]
+      '(menu-item "Ignoring Space Prefix" icicle-toggle-ignored-space-prefix
         :keys "M-_" :help "Toggle option `icicle-buffer-ignore-space-prefix-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-ignored-extensions]
-      '(menu-item "Toggle Ignored File Extensions" icicle-toggle-ignored-extensions
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-ignored-extensions]
+      '(menu-item "Ignored File Extensions" icicle-toggle-ignored-extensions
         :keys "C-." :help "Toggle respect of `completion-ignored-extensions'"))
-    (define-key icicle-options-menu-map [icicle-toggle-remote-file-testing]
-      '(menu-item "Toggle Remote File Handling" icicle-toggle-remote-file-testing
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-remote-file-testing]
+      '(menu-item "Remote File Handling" icicle-toggle-remote-file-testing
         :enable (not icicle-searching-p) :keys "C-^"
         :help "Toggle option `icicle-test-for-remote-files-flag'"))
     (when (> emacs-major-version 20)
-      (define-key icicle-options-menu-map [icicle-toggle-angle-brackets]
-        '(menu-item "Toggle Angle Brackets" icicle-toggle-angle-brackets
+      (define-key icicle-options-toggle-menu-map [icicle-toggle-angle-brackets]
+        '(menu-item "Angle Brackets" icicle-toggle-angle-brackets
           :help "Toggle option `icicle-key-descriptions-use-<>-flag'")))
-    (define-key icicle-options-menu-map [icicle-toggle-annotation]
-      '(menu-item "Toggle Candidate Annotation"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-annotation]
+      '(menu-item "Candidate Annotation"
         icicle-toggle-annotation :keys "C-x C-a"
         :help "Toggle option `icicle-show-annotations-flag': hide/show annotations"))
-    (define-key icicle-options-menu-map [icicle-toggle-highlight-saved-candidates]
-      '(menu-item "Toggle Highlighting Saved Candidates"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-WYSIWYG-Completions]
+      (icicle-menu-bar-make-toggle icicle-WYSIWYG-Completions-flag icicle-WYSIWYG-Completions-flag
+                                   "WYSIWYG for `*Completions*'"
+                                   "Using WYSIWYG for `*Completions*' display is now %s"
+                                   "Toggle `icicle-WYSIWYG-Completions-flag'")) ; :keys "C-S-pause"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-highlight-saved-candidates]
+      '(menu-item "Highlighting Saved Candidates"
         icicle-toggle-highlight-saved-candidates :keys "S-pause"
         :help "Toggle option `icicle-highlight-saved-candidates-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-highlight-historical-candidates]
-      '(menu-item "Toggle Highlighting Past Inputs"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-highlight-historical-candidates]
+      '(menu-item "Highlighting Past Inputs"
         icicle-toggle-highlight-historical-candidates :keys "C-pause"
         :help "Toggle option `icicle-highlight-historical-candidates-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-case-sensitivity]
-      '(menu-item "Toggle Case Sensitivity" icicle-toggle-case-sensitivity :keys "C-A"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-case-sensitivity]
+      '(menu-item "Case Sensitivity" icicle-toggle-case-sensitivity :keys "C-A"
         :help "Toggle `case-fold-search', `completion-ignore-case' (C-u: file & buffer too)"))
-    (define-key icicle-options-menu-map [icicle-toggle-proxy-candidates]
-      '(menu-item "Toggle Including Proxy Candidates" icicle-toggle-proxy-candidates
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-proxy-candidates]
+      '(menu-item "Including Proxy Candidates" icicle-toggle-proxy-candidates
         :keys "C-M-_" :help "Toggle option `icicle-add-proxy-candidates-flag'"))
-    (define-key icicle-options-menu-map [icicle-toggle-transforming]
-      '(menu-item "Toggle Duplicate Removal" icicle-toggle-transforming :keys "C-$"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-transforming]
+      '(menu-item "Duplicate Removal" icicle-toggle-transforming :keys "C-$"
         :help "Toggle use of `icicle-transform-function' (default: remove dups)"))
-    (define-key icicle-options-menu-map [icicle-toggle-alternative-sorting]
-      '(menu-item "Swap Alternative Sort" icicle-toggle-alternative-sorting :keys "C-M-,"
+    (define-key icicle-options-toggle-menu-map [icicle-toggle-alternative-sorting]
+      '(menu-item "Alternative Sort (Swap)" icicle-toggle-alternative-sorting :keys "C-M-,"
         :help "Swap current sort order for current alternative sort order"))
-    (define-key icicle-options-menu-map [icicle-change-alternative-sort-order]
-      '(menu-item "Change Alternative Sort Order" icicle-change-alternative-sort-order
+
+
+    ;; `Icicle Options' > `Choose' ------------------------------------------
+    (defvar icicle-options-choose-menu-map (make-sparse-keymap)
+      "`Choose' submenu of Icicles options menu.")
+    (define-key icicle-options-menu-map [choose]
+      (list 'menu-item "Choose" icicle-options-choose-menu-map :visible 'icicle-mode))
+
+    (when (fboundp 'doremi)
+      (define-key icicle-options-choose-menu-map [icicle-doremi-increment-swank-prefix-length+]
+        '(menu-item "Swank Min Match Chars - Do Re Mi"
+          icicle-doremi-increment-swank-prefix-length+
+          :enable (eq (icicle-current-TAB-method) 'swank) :keys "C-x 2"
+          :help "Change `icicle-swank-prefix-length' incrementally"))
+      (define-key icicle-options-choose-menu-map [icicle-doremi-increment-swank-timeout+]
+        '(menu-item "Swank Timeout - Do Re Mi"
+          icicle-doremi-increment-swank-timeout+
+          :enable  (eq (icicle-current-TAB-method) 'swank) :keys "C-x 1"
+          :help "Change `icicle-swank-timeout' incrementally")))
+    (define-key icicle-options-choose-menu-map [icicle-next-TAB-completion-method]
+      '(menu-item "`TAB' Completion Method" icicle-next-TAB-completion-method
+        :keys "C-(" :help "Cycle to the next `TAB' completion method (C-u: ONE-OFF)"))
+    (define-key icicle-options-choose-menu-map [icicle-next-S-TAB-completion-method]
+      '(menu-item "`S-TAB' Completion Method" icicle-next-S-TAB-completion-method
+        :keys "M-(" :help "Cycle to the next `S-TAB' completion method (C-u: ONE-OFF)"))
+    (when (fboundp 'icicle-cycle-image-file-thumbnail)
+      (define-key icicle-options-choose-menu-map [icicle-cycle-image-file-thumbnail]
+        '(menu-item "Image-File Thumbnail Setting" icicle-cycle-image-file-thumbnail
+          :keys "C-x t" :help "Cycle Thumbnail Image File Setting")))
+    (define-key icicle-options-choose-menu-map [icicle-change-alternative-sort-order]
+      '(menu-item "Alternative Sort Order" icicle-change-alternative-sort-order
         :keys "M-," :help "Choose alt sort order (C-9: reverse, C-u: cyle/complete)"))
-    (define-key icicle-options-menu-map [icicle-change-sort-order]
-      '(menu-item "Change Sort Order" icicle-change-sort-order
+    (define-key icicle-options-choose-menu-map [icicle-change-sort-order]
+      '(menu-item "Sort Order" icicle-change-sort-order
         :enable (not icicle-inhibit-sort-p) :keys "C-,"
         :help "Choose sort order (C-9: reverse, C-u: cyle/complete)"))
+    (define-key icicle-options-choose-menu-map [icicle-cycle-expand-to-common-match]
+      '(menu-item "Expansion to Common Match" icicle-cycle-expand-to-common-match
+        :keys "C-M-\"" :help "Choose value for option `icicle-expand-input-to-common-match'"))
     (when (fboundp 'doremi)
       (when (fboundp 'text-scale-increase) ; Emacs 23+.
-        (define-key icicle-options-menu-map [icicle-doremi-zoom-Completions+]
+        (define-key icicle-options-choose-menu-map [icicle-doremi-zoom-Completions+]
           '(menu-item "*Completions* Zoom Factor - Do Re Mi"
             icicle-doremi-zoom-Completions+
-            :visible (get-buffer-window "*Completions*" 'visible) :keys "C-x -"
+            :enable (get-buffer-window "*Completions*" 'visible) :keys "C-x -"
             :help "Zoom text in `*Completions*' incrementally")))
-      (define-key icicle-options-menu-map [icicle-doremi-inter-candidates-min-spaces+]
+      (define-key icicle-options-choose-menu-map [icicle-doremi-inter-candidates-min-spaces+]
         '(menu-item "*Completions* Candidate Spacing - Do Re Mi"
           icicle-doremi-inter-candidates-min-spaces+
-          :visible (get-buffer-window "*Completions*" 'visible) :keys "C-x |"
+          :enable (get-buffer-window "*Completions*" 'visible) :keys "C-x |"
           :help "Change `icicle-inter-candidates-min-spaces' incrementally"))
-      (define-key icicle-options-menu-map [icicle-doremi-candidate-width-factor+]
+      (define-key icicle-options-choose-menu-map [icicle-doremi-candidate-width-factor+]
         '(menu-item "*Completions* Column Width - Do Re Mi"
           icicle-doremi-candidate-width-factor+
-          :visible (get-buffer-window "*Completions*" 'visible) :keys "C-x w"
+          :enable (get-buffer-window "*Completions*" 'visible) :keys "C-x w"
           :help "Change `icicle-candidate-width-factor' incrementally"))
-      (define-key icicle-options-menu-map [icicle-doremi-increment-swank-prefix-length+]
-        '(menu-item "Swank Min Match Chars - Do Re Mi"
-          icicle-doremi-increment-swank-prefix-length+
-          :visible (eq (icicle-current-TAB-method) 'swank) :keys "C-x 2"
-          :help "Change `icicle-swank-prefix-length' incrementally"))
-      (define-key icicle-options-menu-map [icicle-doremi-increment-swank-timeout+]
-        '(menu-item "Swank Timeout - Do Re Mi"
-          icicle-doremi-increment-swank-timeout+
-          :visible  (eq (icicle-current-TAB-method) 'swank) :keys "C-x 1"
-          :help "Change `icicle-swank-timeout' incrementally"))
-      (define-key icicle-options-menu-map [icicle-doremi-increment-max-candidates+]
+      (define-key icicle-options-choose-menu-map [icicle-doremi-increment-max-candidates+]
         '(menu-item "Max # of Completions - Do Re Mi"
           icicle-doremi-increment-max-candidates+
-          :visible (active-minibuffer-window) :keys "C-x #"
+          :enable (active-minibuffer-window) :keys "C-x #"
           :help "Change `icicle-max-candidates' incrementally")))
+    (define-key icicle-options-choose-menu-map [icicle-cycle-incremental-completion]
+      '(menu-item "Incremental Completion" icicle-cycle-incremental-completion
+        :keys "C-#" :help "Cycle option `icicle-incremental-completion'"))
+
 
 
     ;; Beginning of non-submenu `Icicles' menu -----------------------
-    (define-key icicle-menu-map [icicle-help]
-      '(menu-item "Icicles Help" icicle-minibuffer-help
-        :help "Display help for minibuffer input and completion" :keys "M-? in minibuf"))
+    (define-key icicle-menu-map [icicle-separator-help] '("--"))
+
+    (define-key icicle-menu-map [icicle-mode]
+      '(menu-item "Turn Off Icicle Mode" icicle-mode))
+    (define-key icicle-menu-map [icicle-top-level]
+      '(menu-item "Top Level (Cancel All Minibuffers)" icicle-top-level
+        :enable (active-minibuffer-window)
+        :help "Cancel all minibuffers and return to the top level" :keys "C-M-T"))
     (define-key icicle-menu-map [icicle-abort]
-      '(menu-item "Cancel Minibuffer" icicle-abort-recursive-edit
+      '(menu-item "Cancel This Minibuffer" icicle-abort-recursive-edit
         :enable (active-minibuffer-window)
-        :help "Cancel minibuffer input and return to higher level"))
-    (define-key icicle-menu-map [icicle-separator-last] '("--"))
+        :help "Cancel this minibuffer and return to the next higher level"))
+    (define-key icicle-menu-map [icicle-recomplete-from-original-domain]
+      '(menu-item "Recompute Completions" icicle-recomplete-from-original-domain
+        :enable (and (active-minibuffer-window)  icicle-completing-p)
+        :help "Recomplete your last typed input, using the original domain."))
+    (define-key icicle-menu-map [icicle-separator-levels] '("--"))
 
     (define-key icicle-menu-map [icicle-apply]
       '(menu-item "+ Apply Function to Alist Items..." icicle-apply
@@ -758,6 +1123,35 @@ Used on `pre-command-hook'."
         :help "Read the name of a keyboard macro, then execute it"))
 
 
+    ;; `Frames' ----------------------------------------------------
+    (cond ((and (not icicle-touche-pas-aux-menus-flag)
+                (boundp 'menu-bar-frames-menu)) ; Use `Frames' menu, defined in `menu-bar+.el'.
+           (defvar icicle-frames-menu-map (make-sparse-keymap)
+             "`Frames' > `Icicles' submenu.")
+           (define-key menu-bar-frames-menu [icicles]
+             (list 'menu-item "Icicles" icicle-frames-menu-map :visible 'icicle-mode)))
+          (t
+           (defvar icicle-frames-menu-map (make-sparse-keymap)
+             "`Icicles' > `Frames' submenu.")
+           (define-key icicle-menu-map [frames]
+             (list 'menu-item "Frames" icicle-frames-menu-map))))
+
+    (define-key icicle-frames-menu-map [icicle-font]
+      '(menu-item "+ Change Font of Frame..." icicle-font
+        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+        :help "Change font of current frame."))
+    (define-key icicle-frames-menu-map [icicle-frame-fg]
+      '(menu-item "+ Change Foreground of Frame..." icicle-frame-fg
+        :visible (fboundp 'icicle-frame-fg) ; Requires `hexrgb.el'
+        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+        :help "Change foreground of current frame."))
+    (define-key icicle-frames-menu-map [icicle-frame-bg]
+      '(menu-item "+ Change Background of Frame..." icicle-frame-bg
+        :visible (fboundp 'icicle-frame-bg) ; Requires `hexrgb.el'
+        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+        :help "Change background of current frame."))
+
+
     ;; `Customize' ---------------------------------------------------
     (cond ((not icicle-touche-pas-aux-menus-flag)
            (defvar icicle-custom-menu-map (make-sparse-keymap)
@@ -780,11 +1174,11 @@ Used on `pre-command-hook'."
       '(menu-item "Faces Matching..." icicle-customize-apropos-faces
         :help "Customize faces that match a regexp"))
     (define-key icicle-custom-menu-map [icicle-customize-apropos-opts-w-val-satisfying]
-      '(menu-item "Options Matching with a Value Satisfying..."
+      '(menu-item "Options Matching with a Value Satisfying..."
         icicle-customize-apropos-opts-w-val-satisfying
         :help "Customize options whose values satisfy a predicate that match a regexp"))
     (define-key icicle-custom-menu-map [icicle-customize-apropos-options-of-type]
-      '(menu-item "Options of Type Matching..."
+      '(menu-item "Options of Type Matching..."
         icicle-customize-apropos-options-of-type
         :help "Customize user options of a given type that match a regexp"))
     (define-key icicle-custom-menu-map [icicle-customize-apropos-options]
@@ -815,16 +1209,16 @@ Used on `pre-command-hook'."
              '(menu-item "Symbols..." icicle-apropos
                :help "Like `apropos', but lets you see the list of matches (with `S-TAB')"))
            (define-key icicle-apropos-menu-map [icicle-apropos-vars-w-val-satisfying]
-             '(menu-item "Variables with a Value Satisfying..." icicle-apropos-vars-w-val-satisfying
+             '(menu-item "Variables with a Value Satisfying..." icicle-apropos-vars-w-val-satisfying
                :help "Show variables whose values satisfy a given predicate"))
            (define-key icicle-apropos-menu-map [icicle-apropos-value]
-             '(menu-item "Variables with Values..." icicle-apropos-value
+             '(menu-item "Variables with Values..." icicle-apropos-value
                :help "Show variables that match by name and/or value"))
            (define-key icicle-apropos-menu-map [icicle-apropos-variable]
              '(menu-item "Variables..." icicle-apropos-variable
                :help "Show variables that match PATTERN"))
            (define-key icicle-apropos-menu-map [icicle-apropos-options-of-type]
-             '(menu-item "Options of Type..." icicle-apropos-options-of-type
+             '(menu-item "Options of Type..." icicle-apropos-options-of-type
                :help "Show user options (variables) of a given `defcustom' type"))
            (define-key icicle-apropos-menu-map [icicle-apropos-option]
              '(menu-item "Options..." icicle-apropos-option
@@ -887,143 +1281,115 @@ Used on `pre-command-hook'."
       (define-key icicle-menu-map [icicle-separator-about] '("--")))
 
 
-    ;; `Search' and `Emacs Tags' (or `Tags') -------------------------
+    ;; `Search' ------------------------------------------------------
     (cond ((not icicle-touche-pas-aux-menus-flag)
            (cond ((boundp 'menu-bar-search-tags-menu) ; `Tags' menu defined in `menu-bar+.el'.
                   (defvar icicle-search-menu-map (make-sparse-keymap)
                     "`Search' > `Icicles' menu.")
                   (define-key menu-bar-search-menu [icicles]
-                    (list 'menu-item "Icicles" icicle-search-menu-map :visible 'icicle-mode))
-                  (defvar icicle-search-tags-menu-map (make-sparse-keymap)
-                    "`Search' >  `Tags' > `Icicles' menu.")
-                  (define-key menu-bar-search-tags-menu [icicles]
-                    (list 'menu-item "Icicles" icicle-search-tags-menu-map :visible 'icicle-mode)))
+                    (list 'menu-item "Icicles" icicle-search-menu-map :visible 'icicle-mode)))
                  (t
                   (defvar icicle-search-menu-map (make-sparse-keymap)
                     "`Search' > `Icicles' menu.")
                   (define-key menu-bar-search-menu [icicles]
-                    (list 'menu-item "Icicles" icicle-search-menu-map :visible 'icicle-mode))
-                  (defvar icicle-search-tags-menu-map (make-sparse-keymap)
-                    "`Search' > `Icicles' > `Emacs Tags' menu.")
-                  (define-key icicle-search-menu-map [emacs-tags]
-                    (list 'menu-item "Emacs Tags" icicle-search-tags-menu-map
-                          :visible 'icicle-mode)))))
+                    (list 'menu-item "Icicles" icicle-search-menu-map :visible 'icicle-mode)))))
           (t
            (defvar icicle-search-menu-map (make-sparse-keymap)
-             "`Icicles' > `Search' menu.")
+             "`Icicles' > `Icicles Search' menu.")
            (define-key icicle-menu-map [search]
-             (list 'menu-item "Search" icicle-search-menu-map))
-           (defvar icicle-search-tags-menu-map (make-sparse-keymap)
-             "`Icicles' > `Search' > `Emacs Tags' menu.")
-           (define-key icicle-search-menu-map [emacs-tags]
-             (list 'menu-item "Emacs Tags" icicle-search-tags-menu-map :visible 'icicle-mode))))
+             (list 'menu-item "Icicles Search" icicle-search-menu-map))))
 
     ;; `Go To' -------------------------------------------------------
     (cond ((not icicle-touche-pas-aux-menus-flag)
            (cond ((boundp 'menu-bar-goto-menu)
-                  (defvar icicle-search-goto-menu-map (make-sparse-keymap)
+                  (defvar icicle-goto-menu-map (make-sparse-keymap)
                     "`Go To' > `Icicles' menu.")
                   (define-key menu-bar-goto-menu [icicles]
-                    (list 'menu-item "Icicles" icicle-search-goto-menu-map)))
+                    (list 'menu-item "Icicles" icicle-goto-menu-map)))
                  (t
-                  (defvar icicle-search-goto-menu-map (make-sparse-keymap)
-                    "Icicles `Go To' submenu of `Search' menu.")
+                  (defvar icicle-goto-menu-map (make-sparse-keymap)
+                    "`Search' > `Icicles' > `Go To' menu.")
                   (define-key icicle-search-menu-map [goto]
-                    (list 'menu-item "Go To" icicle-search-goto-menu-map)))))
+                    (list 'menu-item "Go To" icicle-goto-menu-map)))))
           (t
-           (defvar icicle-search-goto-menu-map (make-sparse-keymap)
+           (defvar icicle-goto-menu-map (make-sparse-keymap)
              "`Icicles' > `Go To' menu.")
-           (define-key icicle-menu-map [search]
-             (list 'menu-item "Go To" icicle-search-menu-map))))
+           (define-key icicle-menu-map [goto]
+             (list 'menu-item "Go To" icicle-goto-menu-map))))
+
+    (define-key icicle-goto-menu-map [icicle-pop-tag-mark]
+      '(menu-item "+ Back (Pop Emacs Tag Mark)" icicle-pop-tag-mark
+        :enable (and (boundp 'find-tag-marker-ring)
+                 (not (ring-empty-p find-tag-marker-ring))
+                 (not (window-minibuffer-p (frame-selected-window menu-updating-frame))))
+        :help "Pop back to where `M-.' was last invoked"))
+    (define-key icicle-goto-menu-map [icicle-find-first-tag-other-window]
+      '(menu-item "+ Find First Emacs Tag ..." icicle-find-first-tag-other-window
+        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+        :help "Find first tag in current Emacs TAGS table whose name matches your input"))
+    (define-key icicle-goto-menu-map [icicle-find-tag]
+      '(menu-item "+ Find Emacs Tag ..." icicle-find-tag
+        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+        :help "Navigate among all Emacs TAGS table tags that match a regexp"))
+    (define-key icicle-goto-menu-map [separator-goto-1] '("--"))
 
-    (define-key icicle-search-goto-menu-map [icicle-goto-global-marker]
+    (define-key icicle-goto-menu-map [icicle-goto-global-marker]
       '(menu-item "+ Global Marker..." icicle-goto-global-marker
         :enable (consp (icicle-markers global-mark-ring)) :keys "C-- C-x C-SPC"
         :help "Go to a global marker, choosing it by the line that includes it"))
-    (define-key icicle-search-goto-menu-map [icicle-goto-marker]
+    (define-key icicle-goto-menu-map [icicle-goto-marker]
       '(menu-item "+ Marker..." icicle-goto-marker
         :enable (mark t) :keys "C-- C-SPC"
         :help "Go to a marker in this buffer, choosing it by the line that includes it"))
-    (define-key icicle-search-goto-menu-map [icicle-select-bookmarked-region]
+    (define-key icicle-goto-menu-map [icicle-select-bookmarked-region]
       '(menu-item "+ Select Bookmarked Region..." icicle-select-bookmarked-region
         :enable (featurep 'bookmark+) :keys "C-u C-x C-x"
         :help "Jump to a bookmarked region in other window, and select (activate) it"))
 
-    ;; `Go To' > `Definition' menu.
-    (defvar icicle-search-goto-imenu-menu-map (make-sparse-keymap)
-      "Icicles `Definition' submenu of `Go To' menu.")
-    (define-key icicle-search-goto-menu-map [imenu]
-      (list 'menu-item "Definition" icicle-search-goto-imenu-menu-map
+    ;; `Go To' > `Definition (Imenu)' menu.
+    (defvar icicle-goto-imenu-menu-map (make-sparse-keymap)
+      "Icicles `Definition (Imenu)' submenu of `Go To' menu.")
+    (define-key icicle-goto-menu-map [imenu]
+      (list 'menu-item "Definition (Imenu)" icicle-goto-imenu-menu-map
             :visible 'imenu-generic-expression))
 
-    (define-key icicle-search-goto-imenu-menu-map [icicle-imenu-key-explicit-map]
+    (define-key icicle-goto-imenu-menu-map [icicle-imenu-key-explicit-map]
       '(menu-item "+ Key in Map..." icicle-imenu-key-explicit-map
         :enable (and imenu-generic-expression  (eq major-mode 'emacs-lisp-mode))
         :help "Go to a key definition in some map, using `icicle-search'"))
-    (define-key icicle-search-goto-imenu-menu-map [icicle-imenu-key-implicit-map]
+    (define-key icicle-goto-imenu-menu-map [icicle-imenu-key-implicit-map]
       '(menu-item "+ Key..." icicle-imenu-key-implicit-map
         :enable (and imenu-generic-expression  (eq major-mode 'emacs-lisp-mode))
         :help "Go to a (global) key definition using `icicle-search'"))
-    (define-key icicle-search-goto-imenu-menu-map [icicle-imenu-variable]
+    (define-key icicle-goto-imenu-menu-map [icicle-imenu-variable]
       '(menu-item "+ Variable..." icicle-imenu-variable
         :enable (and imenu-generic-expression  (eq major-mode 'emacs-lisp-mode))
         :help "Go to a variable definition using `icicle-search'"))
-    (define-key icicle-search-goto-imenu-menu-map [icicle-imenu-user-option]
+    (define-key icicle-goto-imenu-menu-map [icicle-imenu-user-option]
       '(menu-item "+ User Option..." icicle-imenu-user-option
         :enable (and imenu-generic-expression  (eq major-mode 'emacs-lisp-mode))
         :help "Go to an option definition using `icicle-search'"))
-    (define-key icicle-search-goto-imenu-menu-map [icicle-imenu-face]
+    (define-key icicle-goto-imenu-menu-map [icicle-imenu-face]
       '(menu-item "+ Face..." icicle-imenu-face
         :enable (and imenu-generic-expression  (eq major-mode 'emacs-lisp-mode))
         :help "Go to a face definition using `icicle-search'"))
-    (define-key icicle-search-goto-imenu-menu-map [icicle-imenu-macro]
+    (define-key icicle-goto-imenu-menu-map [icicle-imenu-macro]
       '(menu-item "+ Macro..." icicle-imenu-macro
         :enable (and imenu-generic-expression  (eq major-mode 'emacs-lisp-mode))
         :help "Go to a Lisp macro definition using `icicle-search'"))
-    (define-key icicle-search-goto-imenu-menu-map [icicle-imenu-non-interactive-function]
+    (define-key icicle-goto-imenu-menu-map [icicle-imenu-non-interactive-function]
       '(menu-item "+ Non-Interactive Function..." icicle-imenu-non-interactive-function
         :enable (and imenu-generic-expression  (eq major-mode 'emacs-lisp-mode))
         :help "Go to a non-command function definition using `icicle-search'"))
-    (define-key icicle-search-goto-imenu-menu-map [icicle-imenu-command]
+    (define-key icicle-goto-imenu-menu-map [icicle-imenu-command]
       '(menu-item "+ Command..." icicle-imenu-command
         :enable (and imenu-generic-expression  (eq major-mode 'emacs-lisp-mode))
         :help "Go to a command definition using `icicle-search'"))
-    (define-key icicle-search-goto-imenu-menu-map [icicle-imenu]
+    (define-key icicle-goto-imenu-menu-map [icicle-imenu]
       '(menu-item "+ Any..." icicle-imenu
         :enable imenu-generic-expression :help "Go to a definition using `icicle-search'"))
 
-    ;; `Search' > `Emacs Tags' (or `Tags') menu
-    (define-key icicle-search-tags-menu-map [icicle-tags-search]
-      '(menu-item "+ Search Tagged Files ..." icicle-tags-search
-        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-        :help "Search all source files listed in tags tables for matches for a regexp"))
-    (define-key icicle-search-tags-menu-map [icicle-pop-tag-mark]
-      '(menu-item "+ Back (Pop Tag Mark)" icicle-pop-tag-mark
-        :enable (and (boundp 'find-tag-marker-ring)
-                 (not (ring-empty-p find-tag-marker-ring))
-                 (not (window-minibuffer-p (frame-selected-window menu-updating-frame))))
-        :help "Pop back to where `M-.' was last invoked"))
-    (define-key icicle-search-tags-menu-map [icicle-find-first-tag-other-window]
-      '(menu-item "+ Find First Tag ..." icicle-find-first-tag-other-window
-        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-        :help "Find first tag in current tags table whose name matches your input"))
-    (define-key icicle-search-tags-menu-map [icicle-find-tag]
-      '(menu-item "+ Find Tag ..." icicle-find-tag
-        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-        :help "Navigate among all tags that match a regexp"))
-
     ;; `Search' menu
-    (define-key icicle-search-menu-map [icicle-search-highlight-cleanup]
-      '(menu-item "Remove Icicle-Search Highlighting..." icicle-search-highlight-cleanup
-        :enable (or icicle-search-overlays
-                 (overlayp icicle-search-current-overlay)
-                 (overlayp icicle-search-refined-overlays) icicle-search-refined-overlays)
-        :help "Remove all highlighting from the last use of `icicle-search'"))
-    (define-key icicle-search-menu-map [icicle-search-define-replacement]
-      '(menu-item "Define Replacement String..." icicle-search-define-replacement
-        :help "Set the replacement string for use in `icicle-search'"))
-    (define-key icicle-search-menu-map [separator-search-1] '("--"))
-
     (define-key icicle-search-menu-map [icicle-compilation-search]
       '(menu-item "+ Search Compilation/Grep Hits (Regexp)..."
         icicle-compilation-search
@@ -1036,9 +1402,22 @@ Used on `pre-command-hook'."
         icicle-grep-saved-file-candidates
         :enable icicle-saved-completion-candidates
         :help "Run `grep' on the set of completion candidates saved using `C-M->'"))
+    (define-key icicle-search-menu-map [separator-search-0] '("--"))
+
+    (define-key icicle-search-menu-map [icicle-search-highlight-cleanup]
+      '(menu-item "Remove Icicle-Search Highlighting..." icicle-search-highlight-cleanup
+        :enable (or icicle-search-overlays
+                 (overlayp icicle-search-current-overlay)
+                 (overlayp icicle-search-refined-overlays) icicle-search-refined-overlays)
+        :help "Remove all highlighting from the last use of `icicle-search'"))
+    (define-key icicle-search-menu-map [icicle-search-define-replacement]
+      '(menu-item "Define Replacement String..." icicle-search-define-replacement
+        :help "Set the replacement string for use in `icicle-search'"))
+    (define-key icicle-search-menu-map [separator-search-1] '("--"))
+
     (define-key icicle-search-menu-map [icicle-tags-search]
-      '(menu-item "+ Search Tagged Files ..." icicle-tags-search
-        :help "Search all source files listed in tags tables for matches for a regexp"))
+      '(menu-item "+ Search Emacs-Tagged Files ..." icicle-tags-search
+        :help "Search all source files listed in Emacs TAGS tables for matches for a regexp"))
     (define-key icicle-search-menu-map [icicle-search-file]
       '(menu-item "+ Search Files (Regexp)..." icicle-search-file
         :help "Search multiple files completely"))
@@ -1125,7 +1504,7 @@ Used on `pre-command-hook'."
       '(menu-item "+ Search Marked..." icicle-search-buff-menu-marked
         :help "Search the marked files" :visible (eq major-mode 'Buffer-menu-mode)))
 
-    ;; `Search' > `Bookmarks' menu.
+    ;; `Search' > `Bookmarks' menu, for searching bookmarks.
     (defvar icicle-search-bookmarks-menu-map (make-sparse-keymap)
       "Icicles `Bookmarks' submenu of `Search' menu.")
     (define-key icicle-search-menu-map [bookmarks]
@@ -1288,248 +1667,222 @@ Used on `pre-command-hook'."
         :enable imenu-generic-expression :help "Search a definition using `icicle-search'"))
 
 
-    ;; `Frames' ----------------------------------------------------
-    (cond ((and (not icicle-touche-pas-aux-menus-flag)
-                (boundp 'menu-bar-frames-menu)) ; Use `Frames' menu, defined in `menu-bar+.el'.
-           (defvar icicle-frames-menu-map (make-sparse-keymap)
-             "`Frames' > `Icicles' submenu.")
-           (define-key menu-bar-frames-menu [icicles]
-             (list 'menu-item "Icicles" icicle-frames-menu-map :visible 'icicle-mode)))
-          (t
-           (defvar icicle-frames-menu-map (make-sparse-keymap)
-             "`Icicles' > `Frames' submenu.")
-           (define-key icicle-menu-map [frames]
-             (list 'menu-item "Frames" icicle-frames-menu-map))))
-
-    (define-key icicle-frames-menu-map [icicle-font]
-      '(menu-item "+ Change Font of Frame..." icicle-font
-        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-        :help "Change font of current frame."))
-    (define-key icicle-frames-menu-map [icicle-frame-fg]
-      '(menu-item "+ Change Foreground of Frame..." icicle-frame-fg
-        :visible (fboundp 'icicle-frame-fg) ; Requires `hexrgb.el'
-        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-        :help "Change foreground of current frame."))
-    (define-key icicle-frames-menu-map [icicle-frame-bg]
-      '(menu-item "+ Change Background of Frame..." icicle-frame-bg
-        :visible (fboundp 'icicle-frame-bg) ; Requires `hexrgb.el'
-        :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-        :help "Change background of current frame."))
-
-
     ;; `Bookmarks' ---------------------------------------------------
     (require 'bookmark)                 ; `bookmark-buffer-name' is not autoloaded.
-    (cond ((not icicle-touche-pas-aux-menus-flag)
-           (cond ((boundp 'bmkp-jump-menu)
-
-                  ;; Bookmark+: `Bookmarks' > `Jump To'.
-                  ;; Use `copy-keymap' so that turning off Icicle mode restores the ordinary commands.
-                  (defvar icicle-bookmark-menu-map (copy-keymap bmkp-jump-menu)
-                    "`Bookmarks' > `Jump To' > `Icicles' submenu.")
-
-                  ;; Bookmark+: `Bookmarks' > `Jump To' > `With Tags'.
-                  ;; Use `copy-keymap' so that turning off Icicle mode restores the ordinary commands.
-                  (defvar icicle-bookmark-with-tags-menu-map (copy-keymap bmkp-jump-tags-menu)
-                    "`Bookmarks' > `Jump To' > `With Tags' > `Icicles' submenu."))
-                 (t                     ; Vanilla `bookmark.el' only, not Bookmark+.
-                  (defvar icicle-bookmark-menu-map (make-sparse-keymap)
-                    "`Bookmarks' > `Icicles' submenu.")
+
+    ;; Icicles bookmark jump commands.
+    ;;
+    ;; Whether or not `icicle-top-level-key-bindings' remaps `Bookmark+' commands to `Icicles' bookmark
+    ;; commands, we put the latter on menus, prefixing the menu items with `+ ', as usual.
+    ;;
+    (defvar icicle-bookmark-menu-map (make-sparse-keymap)
+      "Menu of Icicles bookmark jump commands.")
+    (cond ((and (not icicle-touche-pas-aux-menus-flag)
+                (boundp 'menu-bar-bookmark-map)) ; Use `Bookmarks' menu, if available.
+           (cond ((boundp 'bmkp-jump-menu) ; Use `Bookmarks' > `Jump To' menu, if `Bookmark+'.
+                  (define-key bmkp-jump-menu [icicles]
+                    (list 'menu-item "Icicles" icicle-bookmark-menu-map :visible 'icicle-mode)))
+                 (t                     ; Use vanilla `Bookmarks' menu.
                   (define-key menu-bar-bookmark-map [icicles]
-                    (list 'menu-item "Icicles" icicle-bookmark-menu-map :visible 'icicle-mode))
-                  (defvar icicle-bookmark-with-tags-menu-map (make-sparse-keymap)
-                    "For tags commands on `icicle-bookmark-menu-map'.")
-                  (setq icicle-bookmark-with-tags-menu-map  icicle-bookmark-menu-map))))
+                    (list 'menu-item "Icicles" icicle-bookmark-menu-map :visible 'icicle-mode)))))
           (t
-           (defvar icicle-bookmark-menu-map (make-sparse-keymap)
-             "`Icicles' > `Bookmarks' submenu.")
            (define-key icicle-menu-map [bookmarks]
-             (list 'menu-item "Bookmarks" icicle-bookmark-menu-map))
-           (defvar icicle-bookmark-with-tags-menu-map (make-sparse-keymap)
-             "For tags commands on `icicle-bookmark-menu-map'.")
-           (setq icicle-bookmark-with-tags-menu-map  icicle-bookmark-menu-map)))
+             (list 'menu-item "Jump to Bookmarks" icicle-bookmark-menu-map))))
 
     (when (featurep 'bookmark+)
-      (define-key icicle-bookmark-with-tags-menu-map
-          [bmkp-file-this-dir-all-tags-regexp-jump-other-window]
-        '(menu-item "File This Dir, All Tags Matching Regexp..."
-          icicle-bookmark-file-this-dir-all-tags-regexp-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a file bookmark for this dir, where each tag matches a regexp"))
-      (define-key icicle-bookmark-with-tags-menu-map
-          [bmkp-file-this-dir-some-tags-regexp-jump-other-window]
-        '(menu-item "File This Dir, Any Tag Matching Regexp..."
-          icicle-bookmark-file-this-dir-some-tags-regexp-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a file bookmark for this dir, where some tag matches a regexp"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-file-this-dir-all-tags-jump-other-window]
-        '(menu-item "File This Dir, All Tags in Set..."
-          icicle-bookmark-file-this-dir-all-tags-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a file bookmark for this dir, which has all of a set of tags"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-file-this-dir-some-tags-jump-other-window]
-        '(menu-item "File This Dir, Any Tag in Set..."
-          icicle-bookmark-file-this-dir-some-tags-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a file bookmark for this dir, which has some of a set of tags"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-file-all-tags-regexp-jump-other-window]
-        '(menu-item "File, All Tags Matching Regexp..."
-          icicle-bookmark-file-all-tags-regexp-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a file or dir bookmark where each tag matches a regexp"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-file-some-tags-regexp-jump-other-window]
-        '(menu-item "File, Any Tag Matching Regexp..."
-          icicle-bookmark-file-some-tags-regexp-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a file or dir bookmark where at least one tag matches a regexp"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-file-all-tags-jump-other-window]
-        '(menu-item "File, All Tags in Set..." icicle-bookmark-file-all-tags-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a file or dir bookmark that has all of a set of tags"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-file-some-tags-jump-other-window]
-        '(menu-item "File, Any Tag in Set..." icicle-bookmark-file-some-tags-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a file or dir bookmark that has some of a set of tags"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-autofile-all-tags-regexp-jump-other-window]
-        '(menu-item "Autofile, All Tags Matching Regexp..."
-          icicle-bookmark-autofile-all-tags-regexp-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to an autofile bookmark where each tag matches a regexp"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-autofile-some-tags-regexp-jump-other-window]
-        '(menu-item "Autofile, Any Tag Matching Regexp..."
-          icicle-bookmark-autofile-some-tags-regexp-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to an autofile bookmark where at least one tag matches a regexp"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-autofile-all-tags-jump-other-window]
-        '(menu-item "Autofile, All Tags in Set..."
-          icicle-bookmark-autofile-all-tags-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to an autofile bookmark that has all of a set of tags"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-autofile-some-tags-jump-other-window]
-        '(menu-item "Autofile, Any Tag in Set..."
-          icicle-bookmark-autofile-some-tags-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to an autofile bookmark that has some of a set of tags"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-all-tags-regexp-jump-other-window]
-        '(menu-item "All Tags Matching Regexp..." icicle-bookmark-all-tags-regexp-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a bookmark that has each tag matching a regexp that you enter"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-some-tags-regexp-jump-other-window]
-        '(menu-item "Any Tag Matching Regexp..." icicle-bookmark-some-tags-regexp-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a bookmark with at least one tag matching a regexp"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-all-tags-jump-other-window]
-        '(menu-item "All Tags in Set..." icicle-bookmark-all-tags-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a bookmark that has all of a set of tags that you enter"))
-      (define-key icicle-bookmark-with-tags-menu-map [bmkp-some-tags-jump-other-window]
-        '(menu-item "Any Tag in Set..." icicle-bookmark-some-tags-other-window
-          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
-          :help "Jump to a bookmark that has some of a set of tags that you enter"))
-      (define-key icicle-bookmark-menu-map [bmkp-temporary-jump-other-window]
-        '(menu-item "+ Jump to Temporary Bookmark..." icicle-bookmark-temporary-other-window
+
+      ;; Icicles `Bookmark+' jump commands not involving tags.
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-temporary-other-window]
+        '(menu-item "+ Temporary Bookmark..." icicle-bookmark-temporary-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a temporary bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-autofile-jump-other-window]
-        '(menu-item "+ Jump to Autofile Bookmark..." icicle-bookmark-autofile-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-autofile-other-window]
+        '(menu-item "+ Autofile Bookmark..." icicle-bookmark-autofile-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to an autofile bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-autonamed-this-buffer-jump]
-        '(menu-item "+ Jump to Autonamed Bookmark for This Buffer..."
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-autonamed-this-buffer-other-window]
+        '(menu-item "+ Autonamed Bookmark for This Buffer..."
           icicle-bookmark-autonamed-this-buffer-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to an autonamed bookmark for this buffer"))
-      (define-key icicle-bookmark-menu-map [bmkp-autonamed-jump-other-window]
-        '(menu-item "+ Jump to Autonamed Bookmark..."
-          icicle-bookmark-autonamed-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-autonamed-other-window]
+        '(menu-item "+ Autonamed Bookmark..." icicle-bookmark-autonamed-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to an autonamed bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-specific-files-jump-other-window]
-        '(menu-item "+ Jump to Bookmark for Specific Files..."
-          icicle-bookmark-specific-files-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-specific-files-other-window]
+        '(menu-item "+ Bookmark for Specific Files..." icicle-bookmark-specific-files-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to bookmarks for specific files that you choose"))
-      (define-key icicle-bookmark-menu-map [bmkp-specific-buffers-jump-other-window]
-        '(menu-item "+ Jump to Bookmark for Specific Buffers..."
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-specific-buffers-other-window]
+        '(menu-item "+ Bookmark for Specific Buffers..."
           icicle-bookmark-specific-buffers-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to bookmarks for specific buffers that you choose"))
-      (define-key icicle-bookmark-menu-map [bmkp-this-buffer-jump]
-        '(menu-item "+ Jump to Bookmark for This Buffer..."
-          icicle-bookmark-this-buffer-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-this-buffer-other-window]
+        '(menu-item "+ Bookmark for This Buffer..." icicle-bookmark-this-buffer-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a bookmark for this buffer"))
-      (define-key icicle-bookmark-menu-map [bmkp-url-jump-other-window]
-        '(menu-item "+ Jump to URL Bookmark..." icicle-bookmark-url-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-url-other-window]
+        '(menu-item "+ URL Bookmark..." icicle-bookmark-url-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a URL bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-gnus-jump-other-window]
-        '(menu-item "+ Jump to Gnus Bookmark..." icicle-bookmark-gnus-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-gnus-other-window]
+        '(menu-item "+ Gnus Bookmark..." icicle-bookmark-gnus-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a Gnus bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-man-jump-other-window]
-        '(menu-item "+ Jump to `man' Bookmark..." icicle-bookmark-man-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-man-other-window]
+        '(menu-item "+ `man' Bookmark..." icicle-bookmark-man-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a `man'-page bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-info-jump-other-window]
-        '(menu-item "+ Jump to Info Bookmark..." icicle-bookmark-info-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-info-other-window]
+        '(menu-item "+ Info Bookmark..." icicle-bookmark-info-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to an Info bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-image-jump-other-window]
-        '(menu-item "+ Jump to Image Bookmark..."
-          icicle-bookmark-image-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-image-other-window]
+        '(menu-item "+ Image Bookmark..." icicle-bookmark-image-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to an image bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-non-file-jump-other-window]
-        '(menu-item "+ Jump to Buffer (Non-File) Bookmark..."
-          icicle-bookmark-non-file-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-non-file-other-window]
+        '(menu-item "+ Buffer (Non-File) Bookmark..." icicle-bookmark-non-file-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a buffer (i.e., a non-file) bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-region-jump-other-window]
-        '(menu-item "+ Jump to Region Bookmark..." icicle-bookmark-region-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-region-other-window]
+        '(menu-item "+ Region Bookmark..." icicle-bookmark-region-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a bookmark and activate its recorded region"))
-      (define-key icicle-bookmark-menu-map [bmkp-remote-file-jump-other-window]
-        '(menu-item "+ Jump to Remote-File Bookmark..."
-          icicle-bookmark-remote-file-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-remote-file-other-window]
+        '(menu-item "+ Remote-File Bookmark..." icicle-bookmark-remote-file-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a remote-file bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-local-file-jump-other-window]
-        '(menu-item "+ Jump to Local-File Bookmark..."
-          icicle-bookmark-local-file-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-local-file-other-window]
+        '(menu-item "+ Local-File Bookmark..." icicle-bookmark-local-file-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a local-file bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-file-jump-other-window]
-        '(menu-item "+ Jump to File Bookmark..." icicle-bookmark-file-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-file-other-window]
+        '(menu-item "+ File Bookmark..." icicle-bookmark-file-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a file bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-dired-jump-other-window]
-        '(menu-item "+ Jump to Dired Bookmark..." icicle-bookmark-dired-other-window
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-dired-other-window]
+        '(menu-item "+ Dired Bookmark..." icicle-bookmark-dired-other-window
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a Dired bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-bookmark-file-jump]
-        '(menu-item "+ Jump to Bookmark-File Bookmark..."
-          icicle-bookmark-bookmark-file
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-bookmark-file]
+        '(menu-item "+ Bookmark-File Bookmark..." icicle-bookmark-bookmark-file
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a bookmark-file bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-bookmark-list-jump]
-        '(menu-item "+ Jump to Bookmark-List Bookmark..."
-          icicle-bookmark-bookmark-list
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-bookmark-list]
+        '(menu-item "+ Bookmark-List Bookmark..." icicle-bookmark-bookmark-list
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to a bookmark-list bookmark"))
-      (define-key icicle-bookmark-menu-map [bmkp-desktop-jump]
-        '(menu-item "+ Jump to Desktop Bookmark..." icicle-bookmark-desktop
+      (define-key icicle-bookmark-menu-map [icicle-bookmark-desktop]
+        '(menu-item "+ Desktop Bookmark..." icicle-bookmark-desktop
           :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
           :help "Jump to an Emacs desktop bookmark")))
 
-    (define-key icicle-bookmark-menu-map [bookmark-jump-other-window]
-      '(menu-item "+ Jump to Bookmark..." icicle-bookmark-other-window
+    ;; Icicles bookmark commands besides `Bookmark+'.
+    (define-key icicle-bookmark-menu-map [icicle-bookmark]
+      '(menu-item "+ Bookmark (Same Window)..." icicle-bookmark
         :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
         :help "Jump to a bookmark (C-u: reverse `icicle-bookmark-refresh-cache-flag')"))
-    (define-key icicle-bookmark-menu-map [bookmark-jump]
-      '(menu-item "+ Jump to Bookmark (Same Window)..." icicle-bookmark
+    (define-key icicle-bookmark-menu-map [icicle-bookmark-other-window]
+      '(menu-item "+ Bookmark..." icicle-bookmark-other-window
         :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
         :help "Jump to a bookmark (C-u: reverse `icicle-bookmark-refresh-cache-flag')"))
 
+    (when (featurep 'bookmark+)
+
+      ;; `With Tags' -------------------------------------------------
+      ;; submenu for Icicles bookmark jump commands that involve `Bookmark+' tags.
+      (defvar icicle-bookmark-with-tags-menu-map (make-sparse-keymap)
+        "Menu of Icicles bookmark commands involving bookmark tags.")
+      (define-key icicle-bookmark-menu-map [with-tags]
+        (list 'menu-item "With Tags" icicle-bookmark-with-tags-menu-map))
+
+      (define-key icicle-bookmark-with-tags-menu-map
+          [icicle-bookmark-file-this-dir-all-tags-regexp-other-window]
+        '(menu-item "+ File This Dir, All Tags Matching Regexp..."
+          icicle-bookmark-file-this-dir-all-tags-regexp-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a file bookmark for this dir, where each tag matches a regexp"))
+      (define-key icicle-bookmark-with-tags-menu-map
+          [icicle-bookmark-file-this-dir-some-tags-regexp-other-window]
+        '(menu-item "+ File This Dir, Any Tag Matching Regexp..."
+          icicle-bookmark-file-this-dir-some-tags-regexp-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a file bookmark for this dir, where some tag matches a regexp"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-file-this-dir-all-tags-other-window]
+        '(menu-item "+ File This Dir, All Tags in Set..."
+          icicle-bookmark-file-this-dir-all-tags-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a file bookmark for this dir, which has all of a set of tags"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-file-this-dir-some-tags-other-window]
+        '(menu-item "+ File This Dir, Any Tag in Set..."
+          icicle-bookmark-file-this-dir-some-tags-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a file bookmark for this dir, which has some of a set of tags"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-file-all-tags-regexp-other-window]
+        '(menu-item "+ File, All Tags Matching Regexp..."
+          icicle-bookmark-file-all-tags-regexp-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a file or dir bookmark where each tag matches a regexp"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-file-some-tags-regexp-other-window]
+        '(menu-item "+ File, Any Tag Matching Regexp..."
+          icicle-bookmark-file-some-tags-regexp-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a file or dir bookmark where at least one tag matches a regexp"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-file-all-tags-other-window]
+        '(menu-item "+ File, All Tags in Set..." icicle-bookmark-file-all-tags-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a file or dir bookmark that has all of a set of tags"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-file-some-tags-other-window]
+        '(menu-item "+ File, Any Tag in Set..." icicle-bookmark-file-some-tags-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a file or dir bookmark that has some of a set of tags"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-find-file-tagged-other-window]
+        '(menu-item "+ File with Tags..." icicle-find-file-tagged-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a file bookmark, matching its name or tags or both"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-autofile-all-tags-regexp-other-window]
+        '(menu-item "+ Autofile, All Tags Matching Regexp..."
+          icicle-bookmark-autofile-all-tags-regexp-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to an autofile bookmark where each tag matches a regexp"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-autofile-some-tags-regexp-other-window]
+        '(menu-item "+ Autofile, Any Tag Matching Regexp..."
+          icicle-bookmark-autofile-some-tags-regexp-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to an autofile bookmark where at least one tag matches a regexp"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-autofile-all-tags-other-window]
+        '(menu-item "+ Autofile, All Tags in Set..."
+          icicle-bookmark-autofile-all-tags-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to an autofile bookmark that has all of a set of tags"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-autofile-some-tags-other-window]
+        '(menu-item "+ Autofile, Any Tag in Set..."
+          icicle-bookmark-autofile-some-tags-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to an autofile bookmark that has some of a set of tags"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-all-tags-regexp-other-window]
+        '(menu-item "+ All Tags Matching Regexp..." icicle-bookmark-all-tags-regexp-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a bookmark that has each tag matching a regexp that you enter"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-some-tags-regexp-other-window]
+        '(menu-item "+ Any Tag Matching Regexp..." icicle-bookmark-some-tags-regexp-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a bookmark with at least one tag matching a regexp"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-all-tags-other-window]
+        '(menu-item "+ All Tags in Set..." icicle-bookmark-all-tags-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a bookmark that has all of a set of tags that you enter"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-some-tags-other-window]
+        '(menu-item "+ Any Tag in Set..." icicle-bookmark-some-tags-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a bookmark that has some of a set of tags that you enter"))
+      (define-key icicle-bookmark-with-tags-menu-map [icicle-bookmark-tagged-other-window]
+        '(menu-item "+ Any Bookmark with Tags..." icicle-bookmark-tagged-other-window
+          :enable (not (window-minibuffer-p (frame-selected-window menu-updating-frame)))
+          :help "Jump to a bookmark, matching its name or tags or both")))
+
 
     ;; `Edit' --------------------------------------------------------
     (cond ((not icicle-touche-pas-aux-menus-flag)
@@ -1620,10 +1973,17 @@ Used on `pre-command-hook'."
 
     ;; `Buffers' -----------------------------------------------------
     (cond ((not icicle-touche-pas-aux-menus-flag)
-           (defvar icicle-buffers-menu-map (make-sparse-keymap)
-             "`File' > `Icicles' > `Buffers' submenu.")
-           (define-key icicle-file-menu-map [buffers]
-             (list 'menu-item "Buffers" icicle-buffers-menu-map)))
+           (cond ((boundp 'menu-bar-buffers-menu-command-entries) ; Emacs 22+.
+                  (defvar icicle-buffers-menu-map (make-sparse-keymap)
+                    "`Buffers' > `Icicles' submenu.")
+                  (setq menu-bar-buffers-menu-command-entries
+                        (cons (list 'Icicles 'menu-item "Icicles" icicle-buffers-menu-map)
+                              menu-bar-buffers-menu-command-entries)))
+                 (t
+                  (defvar icicle-buffers-menu-map (make-sparse-keymap)
+                    "`File' > `Icicles' > `Buffers' submenu.")
+                  (define-key icicle-file-menu-map [buffers]
+                    (list 'menu-item "Buffers" icicle-buffers-menu-map)))))
           (t
            (defvar icicle-buffers-menu-map (make-sparse-keymap)
              "`Icicles' > `Buffers' submenu.")
@@ -1713,6 +2073,18 @@ Used on `pre-command-hook'."
       '(menu-item "Save Names as Completion Candidates" icicle-dired-save-marked
         :help "Save the marked names as a set of completion candidates"))
     (define-key icicle-dired-multiple-menu-map [separator-dired-multiple-1] '(menu-item "--" nil))
+    (define-key icicle-dired-multiple-menu-map [icicle-search-dired-marked]
+      '(menu-item "Icicles Search (and Replace)..." icicle-search-dired-marked
+        :help "Search the marked files"
+        :enable (condition-case nil     ; Avoid an Emacs 22 error with cursor on ./ or ../
+                    (dired-get-marked-files nil nil (lambda (file) (not (file-directory-p file))))
+                  (error nil))))
+    (define-key icicle-dired-multiple-menu-map [icicle-occur-dired-marked]
+      '(menu-item "Icicles Occur..." icicle-occur-dired-marked
+        :help "Search lines of the marked files"
+        :enable (condition-case nil     ; Avoid an Emacs 22 error with cursor on ./ or ../
+                    (dired-get-marked-files nil nil (lambda (file) (not (file-directory-p file))))
+                  (error nil))))
     (define-key icicle-dired-multiple-menu-map [icicle-visit-marked-file-of-content-other-window]
       '(menu-item "Open File of Content (Other Window)"
         icicle-visit-marked-file-of-content-other-window
@@ -1728,9 +2100,6 @@ Used on `pre-command-hook'."
                   (error nil))))
 
     (when (boundp 'diredp-menu-bar-recursive-marked-menu) ; Defined in `dired+.el'
-      (define-key icicle-dired-recursive-marked-menu-map [icicle-search-dired-marked-recursive]
-        '(menu-item "Icicles Search (and Replace)..." icicle-search-dired-marked-recursive
-          :help "Search the marked files, including those in marked subdirs"))
       (define-key icicle-dired-recursive-marked-menu-map
           [icicle-dired-save-marked-to-fileset-recursive]
         '(menu-item "Save Names to Fileset" icicle-dired-save-marked-to-fileset-recursive
@@ -1748,7 +2117,42 @@ Used on `pre-command-hook'."
           :help "Add marked files, including those in marked subdirs, to saved candidates"))
       (define-key icicle-dired-recursive-marked-menu-map [icicle-dired-save-marked-recursive]
         '(menu-item "Save Names as Completion Candidates" icicle-dired-save-marked-recursive
-          :help "Save the marked file names in Dired, including those in marked subdirs")))
+          :help "Save the marked file names in Dired, including those in marked subdirs"))
+      (define-key icicle-dired-recursive-marked-menu-map [separator-dired-recursive-1]
+        '(menu-item "--" nil))
+      (define-key icicle-dired-recursive-marked-menu-map [icicle-search-dired-marked-recursive]
+        '(menu-item "Icicles Search (and Replace)..." icicle-search-dired-marked-recursive
+          :help "Search the marked files, including those in marked subdirs"
+          :enable (condition-case nil   ; Avoid an Emacs 22 error with cursor on ./ or ../
+                      (let ((files   (dired-get-marked-files nil nil nil 'DISTINGUISH-ONE-MARKED)))
+                        (and files  (cdr files))) ; Must have at least one actual mark.
+                    (error nil))))
+      (define-key icicle-dired-recursive-marked-menu-map [icicle-occur-dired-marked-recursive]
+        '(menu-item "Icicles Occur..." icicle-occur-dired-marked-recursive
+          :help "Search lines of the marked files, including those in marked subdirs"
+          :enable (condition-case nil   ; Avoid an Emacs 22 error with cursor on ./ or ../
+                      (let ((files   (dired-get-marked-files nil nil nil 'DISTINGUISH-ONE-MARKED)))
+                        (and files  (cdr files))) ; Must have at least one actual mark.
+                    (error nil))))
+      (define-key icicle-dired-recursive-marked-menu-map
+          [icicle-visit-marked-file-of-content-recursive-other-window]
+        '(menu-item "Open File of Content (Other Window)"
+          icicle-visit-marked-file-of-content-recursive-other-window
+          :help "Visit marked file, including in marked subdir, whose content matches, in other window"
+          ;; Do not test with `diredp-get-files' - no need to, and too slow
+          :enable (condition-case nil   ; Avoid an Emacs 22 error with cursor on ./ or ../
+                      (let ((files   (dired-get-marked-files nil nil nil 'DISTINGUISH-ONE-MARKED)))
+                        (and files  (cdr files))) ; Must have at least one actual mark.
+                    (error nil))))
+      (define-key icicle-dired-recursive-marked-menu-map
+          [icicle-visit-marked-file-of-content-recursive]
+        '(menu-item "Open File of Content" icicle-visit-marked-file-of-content-recursive
+          :help "Visit marked file, including in a marked subdir, whose content matches"
+          ;; Do not test with `diredp-get-files' - no need to, and too slow
+          :enable (condition-case nil   ; Avoid an Emacs 22 error with cursor on ./ or ../
+                      (let ((files   (dired-get-marked-files nil nil nil 'DISTINGUISH-ONE-MARKED)))
+                        (and files  (cdr files))) ; Must have at least one actual mark.
+                    (error nil)))))
 
     ;; `Dired Dirs' ------------------------------------------------
     (cond ((not icicle-touche-pas-aux-menus-flag)
@@ -1861,9 +2265,13 @@ Used on `pre-command-hook'."
 
   ;; Bind keys in Comint mode.
   (when (boundp 'comint-mode-map)
-    (define-key comint-mode-map (icicle-kbd "C-c C-i") 'icicle-comint-command) ; `C-c TAB'
+    (define-key comint-mode-map (icicle-kbd "C-c C-i") 'icicle-comint-command)  ; `C-c TAB'
     (define-key comint-mode-map (icicle-kbd "C-c tab") 'icicle-comint-command)) ; `C-c TAB'
 
+  (when (boundp 'facemenu-keymap)
+    (define-key 'facemenu-keymap "n" 'icicle-next-font-lock-keywords-repeat) ; `M-o n'
+    (define-key 'facemenu-keymap "I" 'icicle-font-lock-keyword))             ; `M-o I'
+
   ;; Bind keys in Shell mode.
   (when (and (boundp 'shell-mode-map)  (memq 'comint-dynamic-complete icicle-functions-to-redefine))
     (define-key shell-mode-map (icicle-kbd "C-i") 'icicle-comint-dynamic-complete))
@@ -1923,20 +2331,39 @@ Used on `pre-command-hook'."
       (define-key dired-mode-map (icicle-kbd "C-}") 'icicle-dired-save-marked-as-project))
     (unless (lookup-key dired-mode-map (icicle-kbd "C-S-f")) ; Dired `C-S-f', aka `C-F'
       (define-key dired-mode-map (icicle-kbd "C-S-f") 'icicle-visit-marked-file-of-content))
+    (unless (lookup-key dired-mode-map (icicle-kbd "C-M-S-f")) ; Dired `C-M-S-f', aka `C-M-F'
+      (define-key dired-mode-map (icicle-kbd "C-M-S-f")
+        'icicle-visit-marked-file-of-content-other-window))
     (unless (lookup-key dired-mode-map (icicle-kbd "C-S-o")) ; Dired `C-S-o', aka `C-O'
-      (define-key dired-mode-map (icicle-kbd "C-S-o")
-        'icicle-visit-marked-file-of-content-other-window)))
+      (define-key dired-mode-map (icicle-kbd "C-S-o") 'icicle-occur-dired-marked))
+    (unless (lookup-key dired-mode-map (icicle-kbd "C-S-s")) ; Dired `C-S-s', aka `C-S'
+      (define-key dired-mode-map (icicle-kbd "C-S-s") 'icicle-search-dired-marked))
+
+
+    )
 
   ;; More Dired keys, but these require `dired+.el'.
   (when (boundp 'diredp-recursive-map)
-    (let* ((key  (apply 'vector         ; `M-s M-s m'
+
+    ;; `dired-mode-map'.
+    (let* ((key  (apply 'vector
                         (append (listify-key-sequence icicle-search-key-prefix)
                                 (listify-key-sequence (icicle-kbd "m")))))
            (def  (lookup-key dired-mode-map key)))
       (unless (and def  (not (integerp def)))
-        (define-key dired-mode-map key 'icicle-search-dired-marked-recursive)))
-    (define-key diredp-recursive-map (icicle-kbd "M-s M-s") ; `M-+ M-s M-s'
-      'icicle-search-dired-marked-recursive)
+        (define-key dired-mode-map key 'icicle-search-dired-marked-recursive))) ; `M-s M-s m'
+    (let* ((key  (apply 'vector
+                        (append (listify-key-sequence icicle-search-key-prefix)
+                                (listify-key-sequence (icicle-kbd "M")))))
+           (def  (lookup-key dired-mode-map key)))
+      (unless (and def  (not (integerp def)))
+        (define-key dired-mode-map key 'icicle-occur-dired-marked-recursive))) ; `M-s M-s M'
+
+    ;; `diredp-recursive-map'.
+    (define-key diredp-recursive-map (icicle-kbd "C-S-s") ; `M-+ C-S-s', aka `M-+ C-S'
+      'icicle-search-dired-marked-recursive) ;     and `C-0 M-s M-s M-s' and `C-0 C-`'
+    (define-key diredp-recursive-map (icicle-kbd "C-S-o") ; `M-+ C-S-o', aka `M-+ C-O'
+      'icicle-occur-dired-marked-recursive)
     (define-key diredp-recursive-map (icicle-kbd "C-{") ; `M-+ C-{'
       'icicle-dired-project-other-window)
     (define-key diredp-recursive-map (icicle-kbd "C-M->") ; `M-+ C-M->'
@@ -1946,7 +2373,11 @@ Used on `pre-command-hook'."
     (define-key diredp-recursive-map (icicle-kbd "C-M-}") ; `M-+ C-M-}'
       'icicle-dired-save-marked-to-variable-recursive)
     (define-key diredp-recursive-map (icicle-kbd "C-}") ; `M-+ C-}'
-      'icicle-dired-save-marked-to-cache-file-recursive))
+      'icicle-dired-save-marked-to-cache-file-recursive)
+    (define-key diredp-recursive-map (icicle-kbd "C-S-f") ; `M-+ C-S-f', aka `M-+ C-F'
+      'icicle-visit-marked-file-of-content-recursive)
+    (define-key diredp-recursive-map (icicle-kbd "C-M-S-f") ; `M-+ C-M-S-f', aka `M-+ C-M-F'
+      'icicle-visit-marked-file-of-content-recursive-other-window))
 
   ;; Bind keys in Ibuffer mode.
   (when (boundp 'ibuffer-mode-map)
@@ -2036,12 +2467,17 @@ is bound in all keymaps accessible from keymap MAP."
     (define-key comint-mode-map (icicle-kbd "C-c C-i") nil)
     (define-key comint-mode-map (icicle-kbd "C-c tab") nil))
 
+  ;; Unbind keys in Facemenu.
+  (when (boundp 'facemenu-keymap)
+    (define-key 'facemenu-keymap "n" nil)  ; `M-o n'
+    (define-key 'facemenu-keymap "I" nil)) ; `M-o I'
+
   ;; Unbind keys in Shell mode.
   (when (and (boundp 'shell-mode-map)  (memq 'icicle-comint-dynamic-complete
                                              icicle-functions-to-redefine))
     (define-key shell-mode-map (icicle-kbd "C-i") (if (> emacs-major-version 23)
-                                                        'completion-at-point
-                                                      'comint-dynamic-complete)))
+                                                      'completion-at-point
+                                                    'comint-dynamic-complete)))
 
   ;; Unbind keys in Shell Script mode.
   (when (and (boundp 'sh-mode-map)  (memq 'icicle-comint-dynamic-complete
@@ -2166,14 +2602,29 @@ is unbound in all keymaps accessible from keymap MAP."
      (let ((map  minibuffer-local-map))
 
        ;; Menu-bar `Minibuf' menu.
+
+       ;; First, remove some standard bindings that are on submenus here.
+       (define-key map [menu-bar minibuf isearch-forward]  nil)
+       (define-key map [menu-bar minibuf isearch-backward] nil)
+       (define-key map [menu-bar minibuf next]             nil)
+       (define-key map [menu-bar minibuf previous]         nil)
+
+       (define-key-after (lookup-key map [menu-bar minibuf]) [icicle-top-level]
+         '(menu-item "Top Level" icicle-top-level
+           :help "Cancel all minibuffers and return to the top level")
+         'quit)
        (define-key map [menu-bar minibuf quit] ; Replace `keyboard-escape-quit'
          '(menu-item "Quit" icicle-abort-recursive-edit
-           :help "Cancel minibuffer input or recursive edit"))
+           :help "Cancel this minibuffer and return to the next higher level"))
        (define-key map [menu-bar minibuf return]
          '(menu-item "Enter" exit-minibuffer
            :help "Terminate input and exit minibuffer" :keys "RET"))
        (define-key map [menu-bar minibuf separator-help] '("--"))
 
+       (when (fboundp 'icicle-complete-keys)
+         (define-key map [menu-bar minibuf icicle-complete-keys]
+             '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
+               :help "Show available keys (`C-g') or complete prefix key")))
        (define-key map [menu-bar minibuf completion-help]
          '(menu-item "Icicles Help" icicle-minibuffer-help
            :help "Display help for minibuffer input and completion" :keys "M-?"))
@@ -2191,66 +2642,15 @@ is unbound in all keymaps accessible from keymap MAP."
          '(menu-item "Save Multiple Inputs for Completion" icicle-multi-inputs-save
            :help "Add inputs in minibuffer to saved candidates set for completion"))
        (define-key map [menu-bar minibuf icicle-multi-inputs-act]
-         '(menu-item "Act on multiple inputs in the minibuffer" icicle-multi-inputs-act
+         '(menu-item "Act on Multiple Inputs" icicle-multi-inputs-act
            :help "Parse minibuffer input into a list of candidates, then act on each"))
-       (define-key map [menu-bar minibuf icicle-regexp-quote-input]
-         '(menu-item "Regexp-Quote Input" icicle-regexp-quote-input
-           :enable (with-current-buffer (window-buffer (minibuffer-window))
-                     (not (zerop (buffer-size))))
-           :help "Regexp-quote current input or its active region, then apropos-complete"
-           :keys "M-%"))
-       (define-key map [menu-bar minibuf separator-set2] '("--"))
-
-       (define-key map [menu-bar minibuf icicle-clear-current-history]
-         '(menu-item "Clear History Entries" icicle-clear-current-history
-           :help "Clear current minibuffer history of selected entries"))
-       (define-key map [menu-bar minibuf icicle-erase-minibuffer]
-         '(menu-item "Delete from History" icicle-erase-minibuffer-or-history-element
-           :visible (memq last-command
-                     '(previous-history-element next-history-element
-                       icicle-erase-minibuffer-or-history-element
-                       previous-matching-history-element next-matching-history-element))
-           :help "Delete current history element (in minibuffer now)" :keys "M-k"))
-       (define-key map [menu-bar minibuf icicle-delete-history-element]
-         '(menu-item "Clear (Erase) Minibuffer" icicle-erase-minibuffer-or-history-element
-           :visible (not (memq last-command
-                          '(previous-history-element next-history-element
-                            icicle-erase-minibuffer-or-history-element
-                            previous-matching-history-element next-matching-history-element)))
-           :help "Erase the Minibuffer" :keys "M-k"))
-       (define-key map [menu-bar minibuf icicle-insert-list-join-string]
-         '(menu-item "Insert Join-String" icicle-insert-list-join-string
-           :help "Insert `icicle-list-join-string' into the minibuffer"))
-       (define-key map [menu-bar minibuf icicle-insert-key-description]
-         '(menu-item "Insert Key Description" icicle-insert-key-description
-           :visible (not icicle-searching-p) :keys "M-q"
-           :help "Read key and insert its description - e.g., reading ^F inserts `C-f'"))
-       (define-key map [menu-bar minibuf icicle-roundup]
-         '(menu-item "Insert Completion Candidate(s)" icicle-roundup
-           :enable (and (icicle-completing-p)  icicle-completion-candidates)
-           :help "Insert one or more completion candidates in the minibuffer"))
-       (define-key map [menu-bar minibuf icicle-insert-history-element]
-         '(menu-item "Insert Past Input(s) using Completion" icicle-insert-history-element
-           :enable (consp (symbol-value minibuffer-history-variable))
-           :help "Use completion to insert a previous input into the minibuffer"))
-       (define-key map [menu-bar minibuf icicle-insert-string-from-a-var]
-         '(menu-item "Insert String from a Variable..." icicle-insert-string-from-variable
-           :visible current-prefix-arg :keys "C-="
-           :help "Read a variable name and insert its string value into the minibuffer"))
-       (define-key map [menu-bar minibuf icicle-insert-string-from-std-var]
-         '(menu-item "Insert `icicle-input-string'" icicle-insert-string-from-variable
-           :visible (not current-prefix-arg) :keys "C-="
-           :help "Insert text from variable `icicle-input-string' into the minibuffer"))
-       (define-key map [menu-bar minibuf icicle-insert-string-at-point]
-         '(menu-item "Insert Text from Point" icicle-insert-string-at-point
-           :help "Insert text at or near the cursor into the minibuffer"))
-       (define-key map [menu-bar minibuf icicle-completing-read+insert]
-         '(menu-item "Insert On-Demand Completion" icicle-completing-read+insert
-           :visible (consp icicle-completing-read+insert-candidates)
-           :help "Read and insert something using (lax) completion"))
-       (define-key map [menu-bar minibuf icicle-read+insert-file-name]
-         '(menu-item "Insert File Name" icicle-read+insert-file-name
-           :help "Read and insert a file name using (lax) completion"))
+       (define-key map [menu-bar minibuf separator-misc] '("--"))
+
+       (define-key map [menu-bar minibuf edit]
+         (list 'menu-item "Edit" icicle-minibuf-edit-menu-map))
+
+       (define-key map [menu-bar minibuf history]
+         (list 'menu-item "History" icicle-minibuf-history-menu-map))
 
          ;; Keyboard keys
        (icicle-bind-custom-minibuffer-keys map icicle-minibuffer-key-bindings)
@@ -2265,14 +2665,22 @@ is unbound in all keymaps accessible from keymap MAP."
      ;; In Emacs 22+, local is parent of local-ns.
      (unless (eq minibuffer-local-map (keymap-parent minibuffer-local-ns-map))
        (let ((map  minibuffer-local-ns-map))
+         (define-key-after (lookup-key map [menu-bar minibuf]) [icicle-top-level]
+           '(menu-item "Top Level" icicle-top-level
+             :help "Cancel all minibuffers and return to the top level")
+           'quit)
          (define-key map [menu-bar minibuf quit] ; Replace `keyboard-escape-quit'
            '(menu-item "Quit" icicle-abort-recursive-edit
-             :help "Cancel minibuffer input or recursive edit"))
+             :help "Cancel this minibuffer and return to the next higher level"))
          (define-key map [menu-bar minibuf return]
            '(menu-item "Enter" exit-minibuffer
              :help "Terminate input and exit minibuffer" :keys "RET"))
          (define-key map [menu-bar minibuf separator-help] '("--"))
 
+         (when (fboundp 'icicle-complete-keys)
+           (define-key map [menu-bar minibuf icicle-complete-keys]
+               '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
+                 :help "Show available keys (`C-g') or complete prefix key")))
          (define-key map [menu-bar minibuf completion-help]
            '(menu-item "Icicles Help" icicle-minibuffer-help
              :help "Display help for minibuffer input and completion" :keys "M-?"))
@@ -2290,66 +2698,15 @@ is unbound in all keymaps accessible from keymap MAP."
            '(menu-item "Save Multiple Inputs for Completion" icicle-multi-inputs-save
              :help "Add inputs in minibuffer to saved candidates set for completion"))
          (define-key map [menu-bar minibuf icicle-multi-inputs-act]
-           '(menu-item "Act on multiple inputs in the minibuffer" icicle-multi-inputs-act
+           '(menu-item "Act on Multiple Inputs" icicle-multi-inputs-act
              :help "Parse minibuffer input into a list of candidates, then act on each"))
-         (define-key map [menu-bar minibuf icicle-regexp-quote-input]
-           '(menu-item "Regexp-Quote Input" icicle-regexp-quote-input
-             :enable (with-current-buffer (window-buffer (minibuffer-window))
-                       (not (zerop (buffer-size))))
-             :help "Regexp-quote current input or its active region, then apropos-complete"
-             :keys "M-%"))
-         (define-key map [menu-bar minibuf separator-set2] '("--"))
-
-         (define-key map [menu-bar minibuf icicle-clear-current-history]
-           '(menu-item "Clear History Entries" icicle-clear-current-history
-             :help "Clear current minibuffer history of selected entries"))
-         (define-key map [menu-bar minibuf icicle-erase-minibuffer]
-           '(menu-item "Delete from History" icicle-erase-minibuffer-or-history-element
-             :visible (memq last-command
-                       '(previous-history-element next-history-element
-                         icicle-erase-minibuffer-or-history-element
-                         previous-matching-history-element next-matching-history-element))
-             :help "Delete current history element (in minibuffer now)" :keys "M-k"))
-         (define-key map [menu-bar minibuf icicle-delete-history-element]
-           '(menu-item "Clear (Erase) Minibuffer" icicle-erase-minibuffer-or-history-element
-             :visible (not (memq last-command
-                            '(previous-history-element next-history-element
-                              icicle-erase-minibuffer-or-history-element
-                              previous-matching-history-element next-matching-history-element)))
-             :help "Erase the Minibuffer" :keys "M-k"))
-         (define-key map [menu-bar minibuf icicle-insert-list-join-string]
-           '(menu-item "Insert Join-String" icicle-insert-list-join-string
-             :help "Insert `icicle-list-join-string' into the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-insert-key-description]
-           '(menu-item "Insert Key Description" icicle-insert-key-description
-             :visible (not icicle-searching-p) :keys "M-q"
-             :help "Read key and insert its description - e.g., reading ^F inserts `C-f'"))
-         (define-key map [menu-bar minibuf icicle-roundup]
-           '(menu-item "Insert Completion Candidate(s)" icicle-roundup
-             :enable (and (icicle-completing-p) icicle-completion-candidates)
-             :help "Insert one or more completion candidates in the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-insert-history-element]
-           '(menu-item "Insert Past Input(s) using Completion" icicle-insert-history-element
-             :enable (consp (symbol-value minibuffer-history-variable))
-             :help "Use completion to insert a previous input into the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-insert-string-from-a-var]
-           '(menu-item "Insert String from a Variable..." icicle-insert-string-from-variable
-             :visible current-prefix-arg :keys "C-="
-             :help "Read a variable name and insert its string value into the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-insert-string-from-std-var]
-           '(menu-item "Insert `icicle-input-string'" icicle-insert-string-from-variable
-             :visible (not current-prefix-arg) :keys "C-="
-             :help "Insert text from variable `icicle-input-string' into the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-insert-string-at-point]
-           '(menu-item "Insert Text from Point" icicle-insert-string-at-point
-             :help "Insert text at or near the cursor into the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-completing-read+insert]
-           '(menu-item "Insert On-Demand Completion" icicle-completing-read+insert
-             :visible (consp icicle-completing-read+insert-candidates)
-             :help "Read and insert something using (lax) completion"))
-         (define-key map [menu-bar minibuf icicle-read+insert-file-name]
-           '(menu-item "Insert File Name" icicle-read+insert-file-name
-             :help "Read and insert a file name using (lax) completion"))
+         (define-key map [menu-bar minibuf separator-misc] '("--"))
+
+         (define-key map [menu-bar minibuf edit]
+           (list 'menu-item "Edit" icicle-minibuf-edit-menu-map))
+
+         (define-key map [menu-bar minibuf history]
+           (list 'menu-item "History" icicle-minibuf-history-menu-map))
 
          ;; Keyboard keys
          (icicle-bind-custom-minibuffer-keys map icicle-minibuffer-key-bindings)
@@ -2363,15 +2720,24 @@ is unbound in all keymaps accessible from keymap MAP."
      ;; `minibuffer-local-isearch-map': minibuffer map for editing isearch strings.
      ;; In Emacs 21+, local is parent of local-isearch.
      (unless (eq minibuffer-local-map (keymap-parent minibuffer-local-isearch-map))
+
        (let ((map  minibuffer-local-isearch-map))
+         (define-key-after (lookup-key map [menu-bar minibuf]) [icicle-top-level]
+           '(menu-item "Top Level" icicle-top-level
+             :help "Cancel all minibuffers and return to the top level")
+           'quit)
          (define-key map [menu-bar minibuf quit] ; Replace `keyboard-escape-quit'
            '(menu-item "Quit" icicle-abort-recursive-edit
-             :help "Cancel minibuffer input or recursive edit"))
+             :help "Cancel this minibuffer and return to the next higher level"))
          (define-key map [menu-bar minibuf return]
            '(menu-item "Enter" exit-minibuffer
              :help "Terminate input and exit minibuffer" :keys "RET"))
          (define-key map [menu-bar minibuf separator-help] '("--"))
 
+         (when (fboundp 'icicle-complete-keys)
+           (define-key map [menu-bar minibuf icicle-complete-keys]
+               '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
+                 :help "Show available keys (`C-g') or complete prefix key")))
          (define-key map [menu-bar minibuf completion-help]
            '(menu-item "Icicles Help" icicle-minibuffer-help
              :help "Display help for minibuffer input and completion" :keys "M-?"))
@@ -2389,66 +2755,15 @@ is unbound in all keymaps accessible from keymap MAP."
            '(menu-item "Save Multiple Inputs for Completion" icicle-multi-inputs-save
              :help "Add inputs in minibuffer to saved candidates set for completion"))
          (define-key map [menu-bar minibuf icicle-multi-inputs-act]
-           '(menu-item "Act on multiple inputs in the minibuffer" icicle-multi-inputs-act
+           '(menu-item "Act on Multiple Inputs" icicle-multi-inputs-act
              :help "Parse minibuffer input into a list of candidates, then act on each"))
-         (define-key map [menu-bar minibuf icicle-regexp-quote-input]
-           '(menu-item "Regexp-Quote Input" icicle-regexp-quote-input
-             :enable (with-current-buffer (window-buffer (minibuffer-window))
-                       (not (zerop (buffer-size))))
-             :help "Regexp-quote current input or its active region, then apropos-complete"
-             :keys "M-%"))
-         (define-key map [menu-bar minibuf separator-set2] '("--"))
-
-         (define-key map [menu-bar minibuf icicle-clear-current-history]
-           '(menu-item "Clear History Entries" icicle-clear-current-history
-             :help "Clear current minibuffer history of selected entries"))
-         (define-key map [menu-bar minibuf icicle-erase-minibuffer]
-           '(menu-item "Delete from History" icicle-erase-minibuffer-or-history-element
-             :visible (memq last-command
-                       '(previous-history-element next-history-element
-                         icicle-erase-minibuffer-or-history-element
-                         previous-matching-history-element next-matching-history-element))
-             :help "Delete current history element (in minibuffer now)" :keys "M-k"))
-         (define-key map [menu-bar minibuf icicle-delete-history-element]
-           '(menu-item "Clear (Erase) Minibuffer" icicle-erase-minibuffer-or-history-element
-             :visible (not (memq last-command
-                            '(previous-history-element next-history-element
-                              icicle-erase-minibuffer-or-history-element
-                              previous-matching-history-element next-matching-history-element)))
-             :help "Erase the Minibuffer" :keys "M-k"))
-         (define-key map [menu-bar minibuf icicle-insert-list-join-string]
-           '(menu-item "Insert Join-String" icicle-insert-list-join-string
-             :help "Insert `icicle-list-join-string' into the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-insert-key-description]
-           '(menu-item "Insert Key Description" icicle-insert-key-description
-             :visible (not icicle-searching-p) :keys "M-q"
-             :help "Read key and insert its description - e.g., reading ^F inserts `C-f'"))
-         (define-key map [menu-bar minibuf icicle-roundup]
-           '(menu-item "Insert Completion Candidate(s)" icicle-roundup
-             :enable (and (icicle-completing-p) icicle-completion-candidates)
-             :help "Insert one or more completion candidates in the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-insert-history-element]
-           '(menu-item "Insert Past Input(s) using Completion" icicle-insert-history-element
-             :enable (consp (symbol-value minibuffer-history-variable))
-             :help "Use completion to insert a previous input into the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-insert-string-from-a-var]
-           '(menu-item "Insert String from a Variable..." icicle-insert-string-from-variable
-             :visible current-prefix-arg :keys "C-="
-             :help "Read a variable name and insert its string value into the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-insert-string-from-std-var]
-           '(menu-item "Insert `icicle-input-string'" icicle-insert-string-from-variable
-             :visible (not current-prefix-arg) :keys "C-="
-             :help "Insert text from variable `icicle-input-string' into the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-insert-string-at-point]
-           '(menu-item "Insert Text from Point" icicle-insert-string-at-point
-             :help "Insert text at or near the cursor into the minibuffer"))
-         (define-key map [menu-bar minibuf icicle-completing-read+insert]
-           '(menu-item "Insert On-Demand Completion" icicle-completing-read+insert
-             :visible (consp icicle-completing-read+insert-candidates)
-             :help "Read and insert something using (lax) completion"))
-         (define-key map [menu-bar minibuf icicle-read+insert-file-name]
-           '(menu-item "Insert File Name" icicle-read+insert-file-name
-             :help "Read and insert a file name using (lax) completion"))
+         (define-key map [menu-bar minibuf separator-misc] '("--"))
+
+         (define-key map [menu-bar minibuf edit]
+           (list 'menu-item "Edit" icicle-minibuf-edit-menu-map))
+
+         (define-key map [menu-bar minibuf history]
+           (list 'menu-item "History" icicle-minibuf-history-menu-map))
 
          ;; Keyboard keys
          (icicle-bind-custom-minibuffer-keys map icicle-minibuffer-key-bindings)
@@ -2470,11 +2785,11 @@ is unbound in all keymaps accessible from keymap MAP."
          ;; Keyboard keys
          (icicle-bind-custom-minibuffer-keys map icicle-minibuffer-key-bindings)
          ;; Need `C-g' anyway, even if `minibuffer-local-must-match-map' inherits completion map.
-         (define-key map (icicle-kbd "C-g") 'icicle-abort-recursive-edit)              ; `C-g'
+         (define-key map (icicle-kbd "C-g") 'icicle-abort-recursive-edit) ; `C-g'
          (dolist (key  icicle-completing-read+insert-keys)
-           (define-key map key 'icicle-completing-read+insert)) ; `C-M-S-c'
+           (define-key map key 'icicle-completing-read+insert))           ; `C-M-S-c'
          (dolist (key  icicle-read+insert-file-name-keys)
-           (define-key map key 'icicle-read+insert-file-name))  ; `C-M-S-f'
+           (define-key map key 'icicle-read+insert-file-name))            ; `C-M-S-f'
          ))                             ; End `minibuffer-local-must-match-map'.
 
      ;; `completion-list-mode-map': map for `*Completions*' buffer.
@@ -2483,8 +2798,9 @@ is unbound in all keymaps accessible from keymap MAP."
        ;; Keyboard keys
        (icicle-bind-custom-minibuffer-keys map icicle-completion-list-key-bindings)
        (dolist (key  icicle-candidate-help-keys) ; `C-M-return', `C-help', `C-M-help', `C-f1',
-         (define-key map key 'icicle-help-on-candidate)) ; `C-M-f1'
+         (define-key map key 'icicle-help-on-candidate))                     ; `C-M-f1'
        (define-key map (icicle-kbd "C-g")      'icicle-abort-recursive-edit) ; `C-g'
+       (define-key map (icicle-kbd "C-M-S-t")  'icicle-top-level)            ; `C-M-S-t' (aka `C-M-T')
        ))                               ; End `completion-list-mode-map'.
 
     (t                                  ; TURN IT OFF *******************************
@@ -2644,6 +2960,7 @@ is unbound in all keymaps accessible from keymap MAP."
        (icicle-restore-custom-minibuffer-keys map icicle-completion-list-key-bindings)
        (dolist (key  icicle-candidate-help-keys)       (define-key map key nil))
        (define-key map (icicle-kbd "C-g")              nil)
+       (define-key map (icicle-kbd "C-M-S-t")          nil)
        ;; Do these last:
        (define-key map (icicle-kbd "right")            'next-completion)
        (define-key map (icicle-kbd "left")             'previous-completion))))
@@ -2672,16 +2989,41 @@ MAP is `minibuffer-local-completion-map' or
 
   ;; Menu-bar `Minibuf' menu.
 
+  (define-key map [menu-bar minibuf separator-complete2] '("--"))
+  (define-key map [menu-bar minibuf word-complete]
+    '(menu-item "Word-Complete" icicle-prefix-word-complete
+      :help "Complete at most one word of prefix"))
+  (define-key map [menu-bar minibuf prefix-complete]
+    '(menu-item "Prefix-Complete" icicle-prefix-complete
+      :help "Complete prefix as far as possible"))
+  (define-key map [menu-bar minibuf apropos-complete]
+    '(menu-item "Apropos-Complete" icicle-apropos-complete :keys "S-TAB"
+      :help "Complete regular expression as far as possible and list completions"))
+  (define-key map [menu-bar minibuf separator-complete1] '("--"))
+
+
   ;; In Emacs 22+, local is parent of local-completion
   (unless (eq minibuffer-local-map (keymap-parent minibuffer-local-completion-map))
+    (define-key-after (lookup-key map [menu-bar minibuf]) [icicle-top-level]
+      '(menu-item "Top Level" icicle-top-level
+        :help "Cancel all minibuffers and return to the top level")
+      'quit)
+    (define-key map [menu-bar minibuf icicle-recomplete-from-original-domain]
+      '(menu-item "Recompute Completions" icicle-recomplete-from-original-domain
+        :enable (and (active-minibuffer-window)  icicle-completing-p)
+        :help "Recomplete your last typed input, using the original domain."))
     (define-key map [menu-bar minibuf quit] ; Replace `keyboard-escape-quit'
       '(menu-item "Quit" icicle-abort-recursive-edit
-        :help "Cancel minibuffer input or recursive edit"))
+        :help "Cancel this minibuffer and return to the next higher level"))
     (define-key map [menu-bar minibuf return]
       '(menu-item "Enter" exit-minibuffer
         :help "Terminate input and exit minibuffer" :keys "RET"))
     (define-key map [menu-bar minibuf separator-help] '("--"))
 
+    (when (fboundp 'icicle-complete-keys)
+      (define-key map [menu-bar minibuf icicle-complete-keys]
+          '(menu-item "Show Available Keys (Complete Key)" icicle-complete-keys
+            :help "Show available keys (`C-g') or complete prefix key")))
     (define-key map [menu-bar minibuf completion-help]
       '(menu-item "Icicles Help" icicle-minibuffer-help
         :help "Display help for minibuffer input and completion" :keys "M-?"))
@@ -2699,196 +3041,30 @@ MAP is `minibuffer-local-completion-map' or
       '(menu-item "Save Multiple Inputs for Completion" icicle-multi-inputs-save
         :help "Add inputs in minibuffer to saved candidates set for completion"))
     (define-key map [menu-bar minibuf icicle-multi-inputs-act]
-      '(menu-item "Act on multiple inputs in the minibuffer" icicle-multi-inputs-act
+      '(menu-item "Act on Multiple Inputs" icicle-multi-inputs-act
         :help "Parse minibuffer input into a list of candidates, then act on each"))
-    (define-key map [menu-bar minibuf icicle-regexp-quote-input]
-      '(menu-item "Regexp-Quote Input" icicle-regexp-quote-input
-        :enable (with-current-buffer (window-buffer (minibuffer-window)) (not (zerop (buffer-size))))
-        :help "Regexp-quote current input or its active region, then apropos-complete"
-        :keys "M-%"))
-    (define-key map [menu-bar minibuf separator-set2] '("--"))
-
-    (define-key map [menu-bar minibuf icicle-clear-current-history]
-      '(menu-item "Clear History Entries" icicle-clear-current-history
-        :help "Clear current minibuffer history of selected entries"))
-    (define-key map [menu-bar minibuf icicle-erase-minibuffer]
-      '(menu-item "Delete from History" icicle-erase-minibuffer-or-history-element
-        :visible (memq last-command
-                  '(previous-history-element next-history-element
-                    icicle-erase-minibuffer-or-history-element
-                    previous-matching-history-element next-matching-history-element))
-        :help "Delete current history element (in minibuffer now)" :keys "M-k"))
-    (define-key map [menu-bar minibuf icicle-delete-history-element]
-      '(menu-item "Clear (Erase) Minibuffer" icicle-erase-minibuffer-or-history-element
-        :visible (not (memq last-command
-                       '(previous-history-element next-history-element
-                         icicle-erase-minibuffer-or-history-element
-                         previous-matching-history-element next-matching-history-element)))
-        :help "Erase the Minibuffer" :keys "M-k"))
-    (define-key map [menu-bar minibuf icicle-insert-list-join-string]
-      '(menu-item "Insert Join-String" icicle-insert-list-join-string
-        :help "Insert `icicle-list-join-string' into the minibuffer"))
-    (define-key map [menu-bar minibuf icicle-insert-key-description]
-      '(menu-item "Insert Key Description" icicle-insert-key-description
-        :visible (not icicle-searching-p) :keys "M-q"
-        :help "Read key and insert its description - e.g., reading ^F inserts `C-f'"))
-    (define-key map [menu-bar minibuf icicle-roundup]
-      '(menu-item "Insert Completion Candidate(s)" icicle-roundup
-        :enable (and (icicle-completing-p) icicle-completion-candidates)
-        :help "Insert one or more completion candidates in the minibuffer"))
-    (define-key map [menu-bar minibuf icicle-insert-history-element]
-      '(menu-item "Insert Past Input(s) using Completion" icicle-insert-history-element
-        :help "Use completion to insert a previous input into the minibuffer"))
-    (define-key map [menu-bar minibuf icicle-insert-string-from-a-var]
-      '(menu-item "Insert String from a Variable..." icicle-insert-string-from-variable
-        :visible current-prefix-arg :keys "C-="
-        :help "Read a variable name and insert its string value into the minibuffer"))
-    (define-key map [menu-bar minibuf icicle-insert-string-from-std-var]
-      '(menu-item "Insert `icicle-input-string'" icicle-insert-string-from-variable
-        :visible (not current-prefix-arg) :keys "C-="
-        :help "Insert text from variable `icicle-input-string' into the minibuffer"))
-    (define-key map [menu-bar minibuf icicle-insert-string-at-point]
-      '(menu-item "Insert Text from Point" icicle-insert-string-at-point
-        :help "Insert text at or near the cursor into the minibuffer"))
-    (define-key map [menu-bar minibuf icicle-completing-read+insert]
-      '(menu-item "Insert On-Demand Completion" icicle-completing-read+insert
-        :visible (consp icicle-completing-read+insert-candidates)
-        :help "Read and insert something using (lax) completion"))
-    (define-key map [menu-bar minibuf icicle-read+insert-file-name]
-      '(menu-item "Insert File Name" icicle-read+insert-file-name
-        :help "Read and insert a file name using (lax) completion"))
+    (define-key map [menu-bar minibuf separator-misc] '("--"))
+
+    ;; Submenus.
+    (define-key map [menu-bar minibuf edit]
+      (list 'menu-item "Edit" icicle-minibuf-edit-menu-map))
+    (define-key map [menu-bar minibuf history]
+      (list 'menu-item "History" icicle-minibuf-history-menu-map))
+
     )
-  (define-key map [menu-bar minibuf icicle-goto/kill-failed-input]
-    '(menu-item "Cursor to Mismatch (Repeat: Kill)" icicle-goto/kill-failed-input
-      :enable (and (overlayp icicle-input-completion-fail-overlay)
-               (overlay-start icicle-input-completion-fail-overlay))
-      :help "Put cursor where input fails to complete - repeat to kill mismatch"))
-  (define-key map [menu-bar minibuf icicle-retrieve-next-input]
-    '(menu-item "Restore Next Completion Input" icicle-retrieve-next-input
-      :enable (consp (symbol-value (if (icicle-file-name-input-p)
-                                       'icicle-previous-raw-file-name-inputs
-                                     'icicle-previous-raw-non-file-name-inputs)))
-      :help "Cycle forward to insert a previous completion input in the minibuffer (`C-u': \
-complete)"))
-  (define-key map [menu-bar minibuf icicle-retrieve-previous-input]
-    '(menu-item "Restore Previous Completion Input" icicle-retrieve-previous-input
-      :enable (consp (symbol-value (if (icicle-file-name-input-p)
-                                       'icicle-previous-raw-file-name-inputs
-                                     'icicle-previous-raw-non-file-name-inputs)))
-      :help "Cycle backward to insert a previous completion input in the minibuffer (`C-u': \
-complete)"))
-  (define-key map [menu-bar minibuf separator-C-l] '("--"))
 
+  ;; Remove some standard menu items.
   (define-key map [menu-bar minibuf ?\?] nil)
   (define-key map [menu-bar minibuf space] nil)
   (define-key map [menu-bar minibuf tab] nil)
-  (define-key map [menu-bar minibuf alt-action-list-all]
-    '(menu-item "Alt Act on List of Candidates" icicle-all-candidates-list-alt-action
-      :help "Apply the alternative action to the list of matching completion candidates"
-      :enable icicle-all-candidates-list-alt-action-fn))
-  (define-key map [menu-bar minibuf alt-action-all]
-    '(menu-item "Alt Act on Each Candidate" icicle-all-candidates-alt-action
-      :help "Apply the alternative action to each matching completion candidates"
-      :enable icicle-candidate-alt-action-fn))
-  (define-key map [menu-bar minibuf action-list-all]
-    '(menu-item "Act on List of Candidates" icicle-all-candidates-list-action
-      :help "Apply the command action to the list of matching completion candidates"
-      :enable icicle-all-candidates-list-action-fn))
-  (define-key map [menu-bar minibuf action-all]
-    '(menu-item "Act on Each Candidate" icicle-all-candidates-action
-      :help "Apply the command action to each matching completion candidates"
-      :enable icicle-candidate-action-fn))
-  (define-key map [menu-bar minibuf separator-actions] '("--"))
-
-  (define-key map [menu-bar minibuf set-define]
-    '(menu-item "Define Candidates by Lisp Sexp" icicle-candidate-set-define
-      :help "Define the set of current completion candidates by evaluating a sexp"))
-  (define-key map [menu-bar minibuf icicle-keep-only-past-inputs]
-    '(menu-item "Keep Only Previously Entered" icicle-keep-only-past-inputs
-      :enable (and icicle-completion-candidates  (consp (symbol-value minibuffer-history-variable)))
-      :help "Removed candidates that you have not previously chosen and entered"))
-  (define-key map [menu-bar minibuf set-union]
-    '(menu-item "Add (Union) Saved Candidate Set" icicle-candidate-set-union
-      :enable icicle-saved-completion-candidates
-      :help "Set union between the current and saved completion candidates"))
-  (define-key map [menu-bar minibuf set-difference]
-    '(menu-item "Subtract Saved Candidate Set" icicle-candidate-set-difference
-      :enable icicle-saved-completion-candidates
-      :help "Set difference between the current and saved completion candidates"))
-  (define-key map [menu-bar minibuf set-intersection]
-    '(menu-item "Intersect Saved Candidate Set" icicle-candidate-set-intersection
-      :enable icicle-saved-completion-candidates
-      :help "Set intersection between the current and saved candidates"))
-  (define-key map [menu-bar minibuf icicle-save-predicate-to-variable]
-    '(menu-item "Save Predicate to Variable" icicle-save-predicate-to-variable
-      :help "Save the current completion predicate to a variable"))
-  (define-key map [menu-bar minibuf icicle-narrow-candidates-with-predicate]
-    '(menu-item "Satisfy Also Predicate..." icicle-narrow-candidates-with-predicate
-      :help "Match another input pattern (narrow completions set)"
-      :enable icicle-completion-candidates))
-  (define-key map [menu-bar minibuf icicle-narrow-candidates]
-    '(menu-item "Match Also Regexp..." icicle-narrow-candidates
-      :enable icicle-completion-candidates
-      :help "Match another input pattern (narrow completions set)"))
-  (define-key map [menu-bar minibuf icicle-widen-candidates]
-    '(menu-item "Match Alternative..." icicle-widen-candidates
-      :enable icicle-completion-candidates
-      :help "Match alternative input pattern (widen completions set)"))
-  (define-key map [menu-bar minibuf set-complement]
-    '(menu-item "Complement Candidates" icicle-candidate-set-complement
-      :help "Complement the set of current completion candidates"))
-  (define-key map [menu-bar minibuf separator-set1] '("--"))
-
-  (define-key map [menu-bar minibuf set-swap]
-    '(menu-item "Swap Saved and Current Sets" icicle-candidate-set-swap
-      :enable icicle-saved-completion-candidates
-      :help "Swap the saved and current sets of completion candidates"))
-  (define-key map [menu-bar minibuf icicle-candidate-set-save-more-selected]
-    '(menu-item "Save More Selected (Region) Candidates"
-      icicle-candidate-set-save-more-selected
-      :help "Add the candidates in the region to the saved candidates"))
-  (define-key map [menu-bar minibuf icicle-candidate-set-save-selected]
-    '(menu-item "Save Selected (Region) Candidates"
-      icicle-candidate-set-save-selected
-      :help "Save the candidates in the region, for later recall"))
-  (define-key map [menu-bar minibuf icicle-candidate-set-save-more]
-    '(menu-item "Save More Candidates" icicle-candidate-set-save-more
-      :help "Add current completion candidates to saved candidates set"))
-  (define-key map [menu-bar minibuf set-save-to-cache-file]
-    '(menu-item "    to Cache File..." icicle-candidate-set-save-persistently
-      :help "Save current completion candidates to a cache file, for later recall"))
-  (define-key map [menu-bar minibuf set-save-to-variable]
-    '(menu-item "    to Variable..." icicle-candidate-set-save-to-variable
-      :help "Save current completion candidates to a variable, for later recall"))
-  (define-key map [menu-bar minibuf set-save]
-    '(menu-item "Save Candidates" icicle-candidate-set-save
-      :help "Save the set of current completion candidates, for later recall"))
-  (define-key map [menu-bar minibuf icicle-candidate-set-retrieve-more]
-    '(menu-item "Retrieve More Saved Candidates"
-      icicle-candidate-set-retrieve-more
-      :help "Add saved candidates to current completion candidates"))
-  (define-key map [menu-bar minibuf set-retrieve-from-cache-file]
-    '(menu-item "    from Cache File..."
-      icicle-candidate-set-retrieve-persistent
-      :help "Retrieve saved completion candidates from a cache file, making them current"))
-  (define-key map [menu-bar minibuf set-retrieve-from-variable]
-    '(menu-item "    from Variable..." icicle-candidate-set-retrieve-from-variable
-      :help "Retrieve saved completion candidates from variable, making them current"))
-  (define-key map [menu-bar minibuf set-retrieve]
-    '(menu-item "Retrieve Saved Candidates" icicle-candidate-set-retrieve
-      :enable icicle-saved-completion-candidates
-      :help "Retrieve the saved set of completion candidates, making it current"))
-  (define-key map [menu-bar minibuf separator-complete] '("--"))
 
-  (define-key map [menu-bar minibuf word-complete]
-    '(menu-item "Word-Complete" icicle-prefix-word-complete
-      :help "Complete at most one word of prefix"))
-  (define-key map [menu-bar minibuf prefix-complete]
-    '(menu-item "Prefix-Complete" icicle-prefix-complete
-      :help "Complete prefix as far as possible"))
-  (define-key map [menu-bar minibuf apropos-complete]
-    '(menu-item "Apropos-Complete" icicle-apropos-complete :keys "S-TAB"
-      :help "Complete regular expression as far as possible and list completions"))
+  ;; Submenus.
+  (define-key map [menu-bar minibuf candidate-action]
+    (list 'menu-item "Act on All Candidates" icicle-minibuf-act-on-all-menu-map))
+  (define-key map [menu-bar minibuf candidate-set]
+    (list 'menu-item "Candidate Set" icicle-minibuf-candidate-set-menu-map))
+  (define-key map [menu-bar minibuf save/retrieve]
+    (list 'menu-item "Save/Retrieve Candidates" icicle-minibuf-save-retrieve-menu-map))
 
   ;; Remap some commands for completion.
   (icicle-remap 'self-insert-command           'icicle-self-insert map (current-global-map))
@@ -3175,6 +3351,8 @@ Usually run by inclusion in `minibuffer-setup-hook'."
           icicle-last-input                      nil
           icicle-input-fail-pos                  nil
           icicle-saved-proxy-candidates          nil
+          icicle-auto-no-icomplete-mode-p        nil
+          icicle-auto-no-sort-p                  nil
           ;; `other-buffer' doesn't work, because it looks for a buffer only from the same frame.
           icicle-pre-minibuffer-buffer           (cadr (buffer-list)) ; $$$$$$ (other-buffer nil t)
           )
@@ -3425,7 +3603,9 @@ if `icicle-change-region-background-flag' is non-nil."
     (when (fboundp 'face-valid-attribute-values)
       (fset 'face-valid-attribute-values 'icicle-face-valid-attribute-values))
     (fset 'minibuffer-complete-and-exit 'icicle-minibuffer-complete-and-exit)
-    (fset 'mouse-choose-completion      'icicle-mouse-choose-completion)
+    (unless (or (> emacs-major-version 23)  (and (= emacs-major-version 23)
+                                                 (> emacs-minor-version 1)))
+      (fset 'mouse-choose-completion    'icicle-mouse-choose-completion)) ; Emacs < 23.2
     (fset 'next-history-element         'icicle-next-history-element)
     (fset 'read-buffer                  'icicle-read-buffer)
     (fset 'read-face-name               'icicle-read-face-name)
@@ -3436,8 +3616,6 @@ if `icicle-change-region-background-flag' is non-nil."
                                                (setq read-file-name-function
                                                      'icicle-read-file-name)))
       (fset 'read-file-name             'icicle-read-file-name)) ; Emacs 20, 21
-    (when (fboundp 'read-file-name-default) ; Emacs 24+
-      (fset 'read-file-name-default       'icicle-read-file-name-default))
     (when (fboundp 'icicle-read-number)
       (fset 'read-number                'icicle-read-number))
     (unless (> emacs-major-version 22)
@@ -3467,7 +3645,9 @@ if `icicle-change-region-background-flag' is non-nil."
     (when (fboundp 'icicle-ORIG-face-valid-attribute-values)
       (fset 'face-valid-attribute-values 'icicle-ORIG-face-valid-attribute-values))
     (fset 'minibuffer-complete-and-exit 'icicle-ORIG-minibuffer-complete-and-exit)
-    (fset 'mouse-choose-completion      'icicle-ORIG-mouse-choose-completion)
+    (unless (or (> emacs-major-version 23)  (and (= emacs-major-version 23)
+                                                 (> emacs-minor-version 1)))
+      (fset 'mouse-choose-completion    'icicle-ORIG-mouse-choose-completion)) ; Emacs < 23.2
     (fset 'next-history-element         'icicle-ORIG-next-history-element)
     (fset 'read-buffer                  'icicle-ORIG-read-buffer)
     (fset 'read-face-name               'icicle-ORIG-read-face-name)
@@ -3476,8 +3656,6 @@ if `icicle-change-region-background-flag' is non-nil."
                                                      'icicle-read-file-name))
                                             icicle-orig-read-file-name-fn))
       (fset 'read-file-name             'icicle-ORIG-read-file-name)) ; Emacs 20, 21
-    (when (fboundp 'icicle-ORIG-read-file-name-default) ; Emacs 24+
-      (fset 'read-file-name-default       'icicle-ORIG-read-file-name-default))
     (when (fboundp 'icicle-ORIG-read-number)
       (fset 'read-number                'icicle-ORIG-read-number))
     (when (fboundp 'icicle-ORIG-shell-command) ; Emacs < 23
@@ -3585,14 +3763,15 @@ if `icicle-change-region-background-flag' is non-nil."
 (let ((form  '(let ((icyp  (and (boundp 'icicle-mode)  icicle-mode)))
                (when icyp (icicle-mode -1))
                (when (and (fboundp 'bbdb-complete-name)
+                          (not (fboundp 'bbdb-complete-mail))
                           (not (fboundp 'icicle-ORIG-bbdb-complete-name)))
                  (fset 'icicle-ORIG-bbdb-complete-name (symbol-function 'bbdb-complete-name)))
                (when icyp (icicle-mode 1)))))
-  (if (and (featurep 'bbdb-com)  (fboundp 'bbdb-complete-name))
+  (if (and (featurep 'bbdb-com)  (fboundp 'bbdb-complete-name)  (not (fboundp 'bbdb-complete-mail)))
       (eval-after-load "icicles-mode" form)
     (eval-after-load "bbdb-com" form)))
 
-;;; `bbdb-com.el' version 3.02 - `bbdb-complete-mail'.
+;;; `bbdb-com.el' version 3.02 and later - `bbdb-complete-mail'.
 (let ((form  '(let ((icyp  (and (boundp 'icicle-mode)  icicle-mode)))
                (when icyp (icicle-mode -1))
                (when (and (fboundp 'bbdb-complete-mail)
@@ -3649,6 +3828,10 @@ if `icicle-change-region-background-flag' is non-nil."
                (when icyp (icicle-mode 1)))))
   (if (featurep 'recentf) (eval-after-load "icicles-mode" form) (eval-after-load "recentf" form)))
 
+;;; `icomplete.el'.  Reset `icicle-last-icomplete-mode-value', so it gets reinitialized properly.
+(eval-after-load "icomplete"
+  (defadvice icomplete-mode (after icicle-reset-last-icomplete-mode activate)
+    (when (interactive-p) (setq icicle-last-icomplete-mode-value  nil))))
 
 ;; Do this last.
 ;;