emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/tree-sitter 98bfb24081 17/26: Merge remote-tracking branch 'sava


From: Yuan Fu
Subject: feature/tree-sitter 98bfb24081 17/26: Merge remote-tracking branch 'savannah/master' into feature/tree-sitter
Date: Thu, 16 Jun 2022 14:53:47 -0400 (EDT)

branch: feature/tree-sitter
commit 98bfb240818bae14cd87a1ffeb8fae7cb7846e05
Merge: 184d212042 787c4ad8b0
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    Merge remote-tracking branch 'savannah/master' into feature/tree-sitter
---
 ChangeLog.3                                        |     2 +-
 Makefile.in                                        |     1 +
 admin/MAINTAINERS                                  |    12 +-
 admin/admin.el                                     |    14 +-
 admin/alloc-colors.c                               |     1 +
 admin/make-tarball.txt                             |     3 +
 admin/unidata/unidata-gen.el                       |    43 +-
 build-aux/config.guess                             |    27 +-
 config.bat                                         |     2 +-
 configure.ac                                       |    91 +-
 doc/emacs/abbrevs.texi                             |     5 +-
 doc/emacs/basic.texi                               |    24 +-
 doc/emacs/building.texi                            |    17 +-
 doc/emacs/cmdargs.texi                             |    54 +-
 doc/emacs/dired.texi                               |    11 +-
 doc/emacs/display.texi                             |     6 +-
 doc/emacs/files.texi                               |    42 +
 doc/emacs/frames.texi                              |    24 +-
 doc/emacs/glossary.texi                            |    16 +-
 doc/emacs/killing.texi                             |    25 +-
 doc/emacs/kmacro.texi                              |     2 +-
 doc/emacs/macos.texi                               |    34 +-
 doc/emacs/maintaining.texi                         |    16 +
 doc/emacs/mark.texi                                |    13 +-
 doc/emacs/mini.texi                                |    46 +-
 doc/emacs/package.texi                             |    14 +-
 doc/emacs/programs.texi                            |    18 +-
 doc/emacs/search.texi                              |    71 +-
 doc/emacs/sending.texi                             |     6 +-
 doc/emacs/vc1-xtra.texi                            |     2 +-
 doc/lispref/buffers.texi                           |    16 +-
 doc/lispref/commands.texi                          |     8 +-
 doc/lispref/control.texi                           |     7 +-
 doc/lispref/customize.texi                         |    16 +-
 doc/lispref/display.texi                           |    26 +-
 doc/lispref/elisp.texi                             |     2 +
 doc/lispref/eval.texi                              |     2 +-
 doc/lispref/files.texi                             |    17 +-
 doc/lispref/frames.texi                            |   220 +-
 doc/lispref/functions.texi                         |    39 +-
 doc/lispref/help.texi                              |    14 +-
 doc/lispref/loading.texi                           |    25 +-
 doc/lispref/minibuf.texi                           |    21 +
 doc/lispref/modes.texi                             |    22 +-
 doc/lispref/nonascii.texi                          |    11 +-
 doc/lispref/objects.texi                           |     6 +
 doc/lispref/os.texi                                |    12 +-
 doc/lispref/processes.texi                         |    75 +-
 doc/lispref/searching.texi                         |    37 +-
 doc/lispref/streams.texi                           |    94 +-
 doc/lispref/strings.texi                           |    50 +-
 doc/lispref/text.texi                              |    20 +
 doc/lispref/tips.texi                              |    30 +-
 doc/lispref/variables.texi                         |     9 +-
 doc/lispref/windows.texi                           |    81 +-
 doc/man/emacs.1.in                                 |     6 +-
 doc/man/etags.1                                    |     6 +-
 doc/misc/dbus.texi                                 |     8 +-
 doc/misc/efaq-w32.texi                             |    17 -
 doc/misc/efaq.texi                                 |   107 +-
 doc/misc/eshell.texi                               |     8 -
 doc/misc/eudc.texi                                 |    24 +
 doc/misc/gnus.texi                                 |     7 +-
 doc/misc/modus-themes.org                          |   294 +-
 doc/misc/org.org                                   |     2 +-
 doc/misc/tramp.texi                                |     5 +
 doc/misc/transient.texi                            |     2 +-
 etc/HELLO                                          |    38 +-
 etc/NEWS                                           |   701 +-
 etc/NEWS.28                                        |    44 +
 etc/PROBLEMS                                       |    60 +
 etc/enriched.txt                                   |    12 +-
 etc/images/tree-widget/default/nohandle-guide.png  |   Bin 0 -> 180 bytes
 etc/images/tree-widget/default/nohandle-guide.xpm  |    26 +
 etc/images/tree-widget/folder/nohandle-guide.png   |   Bin 0 -> 178 bytes
 etc/images/tree-widget/folder/nohandle-guide.xpm   |    27 +
 etc/publicsuffix.txt                               |    24 +-
 etc/refcards/orgcard.tex                           |     2 +-
 etc/themes/leuven-dark-theme.el                    |    10 +-
 etc/themes/manoj-dark-theme.el                     |     2 +-
 etc/themes/modus-operandi-theme.el                 |     4 +-
 etc/themes/modus-themes.el                         |   579 +-
 etc/themes/modus-vivendi-theme.el                  |     4 +-
 etc/tutorials/TUTORIAL.cn                          |     9 +
 etc/tutorials/TUTORIAL.el_GR                       |  1267 ++
 etc/tutorials/TUTORIAL.it                          |     2 +-
 etc/tutorials/TUTORIAL.translators                 |     4 +
 leim/Makefile.in                                   |    12 +-
 lib-src/etags.c                                    |    52 +-
 lib-src/make-docfile.c                             |     2 +-
 lib/gnulib.mk.in                                   |     1 -
 lisp/Makefile.in                                   |   113 +-
 lisp/abbrev.el                                     |   269 +-
 lisp/ansi-color.el                                 |     4 +-
 lisp/apropos.el                                    |    30 +-
 lisp/array.el                                      |    44 +-
 lisp/autoinsert.el                                 |     2 +-
 lisp/avoid.el                                      |    19 +-
 lisp/battery.el                                    |    43 +-
 lisp/bindings.el                                   |     2 +-
 lisp/bookmark.el                                   |   112 +-
 lisp/calc/calc-yank.el                             |     5 +-
 lisp/calendar/calendar.el                          |     2 +-
 lisp/calendar/diary-lib.el                         |    13 +-
 lisp/calendar/holidays.el                          |     2 +-
 lisp/calendar/iso8601.el                           |    12 +-
 lisp/calendar/time-date.el                         |    18 +-
 lisp/cedet/ede/proj-elisp.el                       |     3 +-
 lisp/cedet/mode-local.el                           |     7 +-
 lisp/cedet/semantic/bovine/grammar.el              |    13 +-
 lisp/cedet/semantic/complete.el                    |     3 +-
 lisp/cedet/semantic/fw.el                          |     3 +-
 lisp/cedet/semantic/html.el                        |    12 +-
 lisp/cedet/semantic/imenu.el                       |     3 +-
 lisp/cedet/semantic/senator.el                     |     9 +-
 lisp/cedet/semantic/sort.el                        |     2 +-
 lisp/cedet/semantic/texi.el                        |    12 +-
 lisp/cedet/semantic/wisent/grammar.el              |    11 +-
 lisp/cedet/srecode/texi.el                         |     2 +-
 lisp/cmuscheme.el                                  |     1 +
 lisp/color.el                                      |     4 +
 lisp/comint.el                                     |    16 +-
 lisp/cus-dep.el                                    |     7 +-
 lisp/cus-edit.el                                   |    42 +-
 lisp/cus-start.el                                  |     3 +
 lisp/custom.el                                     |    52 +-
 lisp/dabbrev.el                                    |   103 +-
 lisp/delsel.el                                     |    24 +-
 lisp/desktop.el                                    |     9 +-
 lisp/dframe.el                                     |     4 +-
 lisp/dired-aux.el                                  |    55 +-
 lisp/dired.el                                      |   177 +-
 lisp/display-line-numbers.el                       |    78 +
 lisp/dnd.el                                        |   243 +-
 lisp/doc-view.el                                   |     3 +-
 lisp/edmacro.el                                    |     3 +-
 lisp/electric.el                                   |    12 +-
 lisp/emacs-lisp/autoload.el                        |   374 +-
 lisp/emacs-lisp/bindat.el                          |   213 +-
 lisp/emacs-lisp/byte-opt.el                        |    83 +-
 lisp/emacs-lisp/byte-run.el                        |     2 +-
 lisp/emacs-lisp/bytecomp.el                        |   263 +-
 lisp/emacs-lisp/cconv.el                           |    89 +-
 lisp/emacs-lisp/chart.el                           |     6 +-
 lisp/emacs-lisp/check-declare.el                   |     5 +-
 lisp/emacs-lisp/checkdoc.el                        |    12 +-
 lisp/emacs-lisp/cl-macs.el                         |    28 +-
 lisp/emacs-lisp/cl-preloaded.el                    |     2 +-
 lisp/emacs-lisp/comp-cstr.el                       |     2 +-
 lisp/emacs-lisp/comp.el                            |   164 +-
 lisp/emacs-lisp/debug.el                           |    11 +-
 lisp/emacs-lisp/edebug.el                          |     7 +-
 lisp/emacs-lisp/eieio-core.el                      |     4 +
 lisp/emacs-lisp/eieio.el                           |     3 +-
 lisp/emacs-lisp/eldoc.el                           |    19 +-
 lisp/emacs-lisp/ert-x.el                           |    46 +-
 lisp/emacs-lisp/ert.el                             |    32 +-
 lisp/emacs-lisp/find-func.el                       |    10 +-
 lisp/emacs-lisp/generate-lisp-file.el              |   113 +
 lisp/emacs-lisp/lisp-mode.el                       |    31 +-
 lisp/emacs-lisp/lisp.el                            |    25 +-
 lisp/emacs-lisp/loaddefs-gen.el                    |   704 ++
 lisp/emacs-lisp/macroexp.el                        |    48 +
 lisp/emacs-lisp/memory-report.el                   |     4 +
 lisp/emacs-lisp/oclosure.el                        |     2 +-
 lisp/emacs-lisp/package.el                         |   176 +-
 lisp/emacs-lisp/pp.el                              |     4 +-
 lisp/emacs-lisp/shortdoc.el                        |    15 +-
 lisp/emacs-lisp/syntax.el                          |     3 +-
 lisp/emacs-lisp/tabulated-list.el                  |    74 +-
 lisp/epa-ks.el                                     |     2 +
 lisp/erc/erc-backend.el                            |     7 +-
 lisp/erc/erc-button.el                             |    20 +-
 lisp/erc/erc-dcc.el                                |   137 +-
 lisp/erc/erc-lang.el                               |    12 +-
 lisp/erc/erc.el                                    |    14 +-
 lisp/eshell/em-hist.el                             |     2 +-
 lisp/eshell/em-ls.el                               |     4 +-
 lisp/eshell/esh-cmd.el                             |    19 +-
 lisp/eshell/esh-opt.el                             |     2 +-
 lisp/eshell/esh-var.el                             |    21 +-
 lisp/faces.el                                      |    30 +-
 lisp/ffap.el                                       |     4 +-
 lisp/files-x.el                                    |    38 +-
 lisp/files.el                                      |   250 +-
 lisp/find-dired.el                                 |    20 +-
 lisp/finder.el                                     |     9 +-
 lisp/follow.el                                     |     2 +-
 lisp/forms.el                                      |     2 +-
 lisp/frame.el                                      |    15 +-
 lisp/fringe.el                                     |     4 +-
 lisp/generic-x.el                                  |     4 +
 lisp/gnus/gnus-start.el                            |     6 +-
 lisp/gnus/gnus.el                                  |     2 +-
 lisp/gnus/message.el                               |    16 +-
 lisp/gnus/mm-util.el                               |     3 +-
 lisp/gnus/mm-uu.el                                 |     2 +-
 lisp/gnus/nnmail.el                                |     4 +-
 lisp/gnus/nnrss.el                                 |     3 +-
 lisp/gnus/nnselect.el                              |    10 +-
 lisp/help-fns.el                                   |    74 +-
 lisp/help-mode.el                                  |    63 +-
 lisp/help.el                                       |   146 +-
 lisp/hfy-cmap.el                                   |     4 -
 lisp/hilit-chg.el                                  |     2 +-
 lisp/htmlfontify.el                                |    18 +-
 lisp/icomplete.el                                  |    15 +-
 lisp/ido.el                                        |    46 +-
 lisp/iimage.el                                     |     8 +-
 lisp/image-dired.el                                |    21 +-
 lisp/image-mode.el                                 |    26 +-
 lisp/image/image-converter.el                      |     2 +-
 lisp/imenu.el                                      |     7 +
 lisp/indent.el                                     |    20 +-
 lisp/info.el                                       |     4 +-
 lisp/international/emoji.el                        |    18 +-
 lisp/international/fontset.el                      |    66 +-
 lisp/international/iso-transl.el                   |    45 +-
 lisp/international/ja-dic-cnv.el                   |    44 +-
 lisp/international/mule.el                         |     2 +-
 lisp/international/titdic-cnv.el                   |    28 +-
 lisp/isearch.el                                    |   101 +-
 lisp/jit-lock.el                                   |     5 +
 lisp/kmacro.el                                     |     8 +-
 lisp/language/greek.el                             |     4 +-
 lisp/language/indian.el                            |   391 +-
 lisp/language/indonesian.el                        |   197 +
 lisp/language/misc-lang.el                         |    54 +
 lisp/language/philippine.el                        |    96 +
 lisp/language/thai-util.el                         |    16 +-
 lisp/ldefs-boot.el                                 | 11945 ++++++-------------
 lisp/leim/quail/indian.el                          |  1135 +-
 lisp/leim/quail/indonesian.el                      |   557 +
 lisp/leim/quail/ipa.el                             |     2 +-
 lisp/leim/quail/latin-post.el                      |    75 +-
 lisp/leim/quail/latin-pre.el                       |    42 +-
 lisp/leim/quail/misc-lang.el                       |  1184 ++
 lisp/leim/quail/philippine.el                      |   152 +
 lisp/loadup.el                                     |     2 +
 lisp/lpr.el                                        |     2 +-
 lisp/ls-lisp.el                                    |    18 +-
 lisp/mail/emacsbug.el                              |     1 +
 lisp/mail/feedmail.el                              |     3 +-
 lisp/mail/footnote.el                              |     6 +-
 lisp/mail/rmail.el                                 |     4 +-
 lisp/mail/rmailsum.el                              |     2 +-
 lisp/menu-bar.el                                   |    55 +-
 lisp/minibuffer.el                                 |   196 +-
 lisp/misc.el                                       |    15 +-
 lisp/mouse.el                                      |   813 +-
 lisp/mwheel.el                                     |     4 +-
 lisp/net/browse-url.el                             |    39 +-
 lisp/net/dbus.el                                   |     8 +-
 lisp/net/eudc-bob.el                               |    30 +-
 lisp/net/eudc-capf.el                              |   133 +
 lisp/net/eww.el                                    |     4 +-
 lisp/net/mailcap.el                                |    11 +-
 lisp/net/newst-backend.el                          |    42 +-
 lisp/net/newst-treeview.el                         |    11 +-
 lisp/net/shr.el                                    |    19 +-
 lisp/net/tramp-adb.el                              |     4 +-
 lisp/net/tramp-archive.el                          |     2 +
 lisp/net/tramp-cmds.el                             |     2 +
 lisp/net/tramp-fuse.el                             |    43 +-
 lisp/net/tramp-gvfs.el                             |    36 +-
 lisp/net/tramp-integration.el                      |    29 +
 lisp/net/tramp-sh.el                               |    58 +-
 lisp/net/tramp-smb.el                              |     6 +-
 lisp/net/tramp-sudoedit.el                         |    34 +-
 lisp/net/tramp.el                                  |    71 +-
 lisp/net/trampver.el                               |     2 +
 lisp/newcomment.el                                 |    30 +-
 lisp/obsolete/gs.el                                |     2 +-
 lisp/obsolete/iswitchb.el                          |     3 +-
 lisp/{vc => obsolete}/vc-mtn.el                    |     1 +
 lisp/org/ol-eww.el                                 |     2 +-
 lisp/org/ol-w3m.el                                 |     2 +-
 lisp/org/org-agenda.el                             |     2 +-
 lisp/org/org-clock.el                              |     5 +-
 lisp/org/org-refile.el                             |     2 +-
 lisp/org/org-version.el                            |     4 +-
 lisp/org/org.el                                    |    13 +-
 lisp/pcomplete.el                                  |    43 +-
 lisp/pixel-scroll.el                               |     6 +-
 lisp/play/gamegrid.el                              |    10 +-
 lisp/play/handwrite.el                             |    71 +-
 lisp/play/morse.el                                 |    24 +-
 lisp/progmodes/antlr-mode.el                       |     1 -
 lisp/progmodes/asm-mode.el                         |    30 +-
 lisp/progmodes/bug-reference.el                    |    10 +-
 lisp/progmodes/cc-awk.el                           |   118 +-
 lisp/progmodes/cc-cmds.el                          |  2191 ++--
 lisp/progmodes/cc-defs.el                          |    22 +
 lisp/progmodes/cc-engine.el                        |    13 +-
 lisp/progmodes/cc-guess.el                         |    13 +-
 lisp/progmodes/cc-mode.el                          |   392 +-
 lisp/progmodes/cfengine.el                         |     8 +-
 lisp/progmodes/compile.el                          |   172 +-
 lisp/progmodes/cperl-mode.el                       |    40 +-
 lisp/progmodes/elisp-mode.el                       |    61 +-
 lisp/progmodes/erts-mode.el                        |    16 +-
 lisp/progmodes/f90.el                              |    10 +-
 lisp/progmodes/flymake-proc.el                     |     2 +-
 lisp/progmodes/flymake.el                          |     9 +-
 lisp/progmodes/fortran.el                          |     1 -
 lisp/progmodes/gdb-mi.el                           |   100 +-
 lisp/progmodes/grep.el                             |    25 +-
 lisp/progmodes/gud.el                              |     6 +-
 lisp/progmodes/icon.el                             |    21 +-
 lisp/progmodes/idlwave.el                          |     2 +-
 lisp/progmodes/js.el                               |    10 +-
 lisp/progmodes/m4-mode.el                          |    12 +-
 lisp/progmodes/make-mode.el                        |     2 +-
 lisp/progmodes/mixal-mode.el                       |    17 +-
 lisp/progmodes/pascal.el                           |     6 +-
 lisp/progmodes/project.el                          |    38 +-
 lisp/progmodes/prolog.el                           |     3 +-
 lisp/progmodes/python.el                           |    43 +-
 lisp/progmodes/scheme.el                           |    15 +-
 lisp/progmodes/sh-script.el                        |    39 +-
 lisp/progmodes/sql.el                              |     3 +-
 lisp/progmodes/vhdl-mode.el                        |    23 +-
 lisp/progmodes/which-func.el                       |     2 +-
 lisp/progmodes/xref.el                             |     2 +-
 lisp/rect.el                                       |    27 +-
 lisp/repeat.el                                     |     2 +-
 lisp/replace.el                                    |    88 +-
 lisp/saveplace.el                                  |     6 +-
 lisp/scroll-lock.el                                |    16 +-
 lisp/select.el                                     |   155 +-
 lisp/server.el                                     |     2 +-
 lisp/ses.el                                        |    10 +-
 lisp/shell.el                                      |    98 +-
 lisp/simple.el                                     |   671 +-
 lisp/so-long.el                                    |     4 +-
 lisp/speedbar.el                                   |    22 +-
 lisp/sqlite-mode.el                                |    14 +-
 lisp/startup.el                                    |    50 +-
 lisp/strokes.el                                    |     4 +-
 lisp/subr.el                                       |    71 +-
 lisp/tab-bar.el                                    |     8 +-
 lisp/term.el                                       |    39 +-
 lisp/term/haiku-win.el                             |   123 +-
 lisp/term/linux.el                                 |     4 +
 lisp/term/ns-win.el                                |    51 +-
 lisp/term/pgtk-win.el                              |     3 +-
 lisp/term/x-win.el                                 |     6 +-
 lisp/textmodes/artist.el                           |    18 +-
 lisp/textmodes/bibtex.el                           |     4 +-
 lisp/textmodes/css-mode.el                         |   109 +-
 lisp/textmodes/dns-mode.el                         |     8 +-
 lisp/textmodes/enriched.el                         |    24 +
 lisp/textmodes/flyspell.el                         |     4 +-
 lisp/textmodes/ispell.el                           |    33 +-
 lisp/textmodes/paragraphs.el                       |    18 +-
 lisp/textmodes/pixel-fill.el                       |     4 +-
 lisp/textmodes/reftex-cite.el                      |     6 +-
 lisp/textmodes/reftex-vars.el                      |     2 +-
 lisp/textmodes/reftex.el                           |     3 +-
 lisp/textmodes/remember.el                         |     2 +-
 lisp/textmodes/string-edit.el                      |    63 +-
 lisp/textmodes/table.el                            |    17 +-
 lisp/textmodes/tex-mode.el                         |     7 +-
 lisp/textmodes/texinfo.el                          |     2 +-
 lisp/tooltip.el                                    |    38 +-
 lisp/transient.el                                  |     8 +-
 lisp/tree-widget.el                                |    14 +-
 lisp/tutorial.el                                   |    10 +-
 lisp/url/url-cookie.el                             |    16 +-
 lisp/url/url-dired.el                              |    10 +-
 lisp/url/url-http.el                               |     7 +
 lisp/url/url-util.el                               |     7 +-
 lisp/url/url-vars.el                               |     2 +-
 lisp/vc/diff-mode.el                               |    28 +-
 lisp/vc/diff.el                                    |     2 +-
 lisp/vc/ediff-merg.el                              |     2 +-
 lisp/vc/ediff-util.el                              |     8 +-
 lisp/vc/ediff-wind.el                              |    31 +-
 lisp/vc/log-edit.el                                |    12 +-
 lisp/vc/vc-dir.el                                  |    22 +-
 lisp/vc/vc-git.el                                  |     2 +-
 lisp/vc/vc-hooks.el                                |     4 +-
 lisp/vc/vc-rcs.el                                  |     2 +-
 lisp/vc/vc-src.el                                  |     2 +-
 lisp/vc/vc-svn.el                                  |     2 +-
 lisp/vc/vc.el                                      |     5 +-
 lisp/vcursor.el                                    |    67 +-
 lisp/view.el                                       |     2 +-
 lisp/w32-fns.el                                    |    21 +-
 lisp/whitespace.el                                 |   266 +-
 lisp/window.el                                     |   293 +-
 lisp/woman.el                                      |     3 +-
 lisp/x-dnd.el                                      |   321 +-
 lisp/xwidget.el                                    |     4 +-
 m4/manywarnings.m4                                 |     2 +
 nextstep/Makefile.in                               |     4 +-
 src/alloc.c                                        |     8 +-
 src/atimer.c                                       |    37 +-
 src/buffer.c                                       |    97 +-
 src/bytecode.c                                     |     6 +-
 src/callint.c                                      |    35 +-
 src/ccl.c                                          |     5 +
 src/coding.c                                       |    35 +-
 src/comp.c                                         |    24 +-
 src/composite.c                                    |     2 +-
 src/data.c                                         |    18 +-
 src/dbusbind.c                                     |    41 +-
 src/dispextern.h                                   |     7 +
 src/dispnew.c                                      |    77 +-
 src/doc.c                                          |     2 +
 src/editfns.c                                      |     2 +-
 src/emacs-module.c                                 |     2 +-
 src/emacs.c                                        |   167 +-
 src/eval.c                                         |   106 +-
 src/fileio.c                                       |    60 +-
 src/floatfns.c                                     |    22 +-
 src/fns.c                                          |    28 +-
 src/font.c                                         |     4 +-
 src/frame.c                                        |    45 +-
 src/frame.h                                        |    25 +-
 src/ftcrfont.c                                     |    33 +
 src/ftfont.c                                       |    30 +-
 src/gtkutil.c                                      |   108 +-
 src/haiku_draw_support.cc                          |    83 +-
 src/haiku_io.c                                     |     2 +
 src/haiku_select.cc                                |   219 +-
 src/haiku_support.cc                               |  1068 +-
 src/haiku_support.h                                |   102 +-
 src/haikufns.c                                     |   704 +-
 src/haikufont.c                                    |     4 +-
 src/haikugui.h                                     |   105 +
 src/haikumenu.c                                    |    67 +-
 src/haikuselect.c                                  |   325 +-
 src/haikuselect.h                                  |    28 +-
 src/haikuterm.c                                    |  1050 +-
 src/haikuterm.h                                    |    30 +-
 src/image.c                                        |   174 +-
 src/indent.c                                       |     4 +-
 src/intervals.c                                    |     1 -
 src/intervals.h                                    |     2 +-
 src/json.c                                         |     2 +-
 src/keyboard.c                                     |   127 +-
 src/keyboard.h                                     |    12 +-
 src/keymap.c                                       |    15 +-
 src/lisp.h                                         |    28 +-
 src/lread.c                                        |  2221 ++--
 src/menu.c                                         |     6 +-
 src/minibuf.c                                      |    33 +-
 src/nsfns.m                                        |   752 +-
 src/nsfont.m                                       |     3 -
 src/nsmenu.m                                       |   385 +-
 src/nsselect.m                                     |   237 +-
 src/nsterm.h                                       |   107 +-
 src/nsterm.m                                       |  1050 +-
 src/nsxwidget.m                                    |     3 +
 src/pdumper.c                                      |    11 +-
 src/pgtkfns.c                                      |    53 +-
 src/pgtkmenu.c                                     |    10 -
 src/pgtkselect.c                                   |     2 +-
 src/pgtkterm.c                                     |   109 +-
 src/pgtkterm.h                                     |     2 +-
 src/print.c                                        |   948 +-
 src/process.c                                      |    29 +-
 src/profiler.c                                     |     4 +-
 src/regex-emacs.c                                  |    21 +-
 src/sort.c                                         |     2 +-
 src/sysstdio.h                                     |     3 +-
 src/term.c                                         |     2 +-
 src/termhooks.h                                    |    16 +-
 src/terminal.c                                     |     4 +-
 src/textprop.c                                     |     2 +-
 src/tparam.h                                       |     5 +-
 src/w32.c                                          |     3 +-
 src/w32fns.c                                       |    74 +-
 src/w32font.c                                      |    23 +-
 src/w32menu.c                                      |    13 +-
 src/w32notify.c                                    |    30 +-
 src/w32proc.c                                      |    17 +
 src/w32term.c                                      |    29 +-
 src/window.c                                       |   192 +-
 src/window.h                                       |    12 +-
 src/xdisp.c                                        |    57 +-
 src/xfaces.c                                       |    43 +-
 src/xfns.c                                         |   444 +-
 src/xfont.c                                        |     2 +-
 src/xftfont.c                                      |     9 +
 src/xgselect.c                                     |    23 +
 src/xgselect.h                                     |     7 +-
 src/xmenu.c                                        |    45 +-
 src/xrdb.c                                         |     6 +-
 src/xselect.c                                      |   343 +-
 src/xsettings.c                                    |   202 +
 src/xsettings.h                                    |     5 +
 src/xterm.c                                        |  4116 +++++--
 src/xterm.h                                        |    84 +-
 test/README                                        |    11 +-
 test/lisp/ansi-color-tests.el                      |     2 +-
 test/lisp/autorevert-tests.el                      |    36 +-
 test/lisp/bookmark-tests.el                        |    30 +-
 test/lisp/calendar/iso8601-tests.el                |    20 +-
 test/lisp/dnd-tests.el                             |   375 +
 test/lisp/emacs-lisp/bindat-tests.el               |   140 +-
 .../warn-variable-setq-nonvariable.el              |     3 +
 .../bytecomp-resources/warn-variable-setq-odd.el   |     3 +
 test/lisp/emacs-lisp/bytecomp-tests.el             |    57 +-
 test/lisp/emacs-lisp/find-func-tests.el            |     7 +
 .../lisp/emacs-lisp/pp-resources/code-formats.erts |    12 +
 test/lisp/erc/erc-dcc-tests.el                     |   167 +
 test/lisp/eshell/esh-var-tests.el                  |    28 +-
 test/lisp/eshell/eshell-tests.el                   |    45 +
 test/lisp/ffap-tests.el                            |     2 +-
 test/lisp/filenotify-tests.el                      |    38 +-
 test/lisp/files-resources/compile-utf8.el          |     1 +
 test/lisp/files-tests.el                           |    21 +-
 test/lisp/help-mode-tests.el                       |     7 +-
 test/lisp/htmlfontify-tests.el                     |     9 -
 test/lisp/ls-lisp-tests.el                         |    39 +
 test/lisp/mail/undigest-tests.el                   |   139 +-
 test/lisp/minibuffer-tests.el                      |   136 +
 test/lisp/misc-tests.el                            |     9 +-
 test/lisp/net/browse-url-tests.el                  |     2 +-
 test/lisp/net/tramp-tests.el                       |   431 +-
 test/lisp/progmodes/python-tests.el                |   258 +
 test/lisp/shadowfile-tests.el                      |   116 +-
 test/lisp/simple-tests.el                          |    55 +
 test/lisp/subr-tests.el                            |    30 +-
 .../textmodes/css-mode-resources/css-selectors.txt |    56 +
 .../css-mode-resources/scss-selectors.txt          |    10 +
 test/lisp/textmodes/css-mode-tests.el              |    69 +
 test/lisp/vc/vc-bzr-tests.el                       |     2 +-
 test/lisp/x-dnd-tests.el                           |    82 +
 test/manual/etags/ETAGS.good_1                     |   748 +-
 test/manual/etags/ETAGS.good_2                     |   776 +-
 test/manual/etags/ETAGS.good_3                     |   772 +-
 test/manual/etags/ETAGS.good_4                     |  1028 +-
 test/manual/etags/ETAGS.good_5                     |  1080 +-
 test/manual/etags/ETAGS.good_6                     |  1080 +-
 test/manual/etags/c-src/emacs/src/keyboard.c       |     2 +-
 .../etags/el-src/emacs/lisp/progmodes/etags.el     |     2 +-
 test/src/buffer-tests.el                           |    49 +
 test/src/comp-tests.el                             |     9 +-
 test/src/eval-tests.el                             |    27 +
 test/src/fileio-tests.el                           |    10 +-
 test/src/image-tests.el                            |     7 +
 test/src/lread-tests.el                            |    41 +
 test/src/print-tests.el                            |   105 +
 test/src/process-tests.el                          |     2 +-
 547 files changed, 36989 insertions(+), 22929 deletions(-)

diff --git a/ChangeLog.3 b/ChangeLog.3
index be1a9bfe26..f0297fd1f0 100644
--- a/ChangeLog.3
+++ b/ChangeLog.3
@@ -1293,7 +1293,7 @@
 
        Don't bug out on certain empty elements with ids
 
-       * lisp/net/shr.el (shr-descend): Fix empty-element #id targetting
+       * lisp/net/shr.el (shr-descend): Fix empty-element #id targeting
        (bug#52391).
 
 2021-12-09  Paul Eggert  <eggert@cs.ucla.edu>
diff --git a/Makefile.in b/Makefile.in
index 877802ec11..4b74963665 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -965,6 +965,7 @@ bootstrap-clean: $(distclean_dirs:=_bootstrap-clean)
        [ ! -f config.log ] || mv -f config.log config.log~
        rm -rf ${srcdir}/info
        rm -f ${srcdir}/etc/refcards/emacsver.tex
+       rm -rf native-lisp/ lisp/leim/ja-dic/
        ${top_bootclean}
 
 ### 'maintainer-clean'
diff --git a/admin/MAINTAINERS b/admin/MAINTAINERS
index 092978f6d2..f0239db008 100644
--- a/admin/MAINTAINERS
+++ b/admin/MAINTAINERS
@@ -275,14 +275,6 @@ Vibhav Pant
        lisp/net/browse-url.el
        lisp/erc/*
 
-Alan Third
-        The NS port:
-            nextstep/*
-            src/ns*
-            src/*.m
-            lisp/term/ns-win.el
-            doc/emacs/macos.texi
-
 Amin Bandali
        Eshell
            lisp/eshell/*
@@ -313,7 +305,9 @@ Tramp
 
 Modus themes
         Maintainer: Protesilaos Stavrou
-        Repository and issue tracker: 
https://gitlab.com/protesilaos/modus-themes
+        Repository:  https://git.sr.ht/~protesilaos
+        Mailing list: https://lists.sr.ht/~protesilaos/modus-themes
+        Bug Reports: M-x modus-themes-report-bug
 
         doc/misc/modus-themes.org
         etc/themes/modus*.el
diff --git a/admin/admin.el b/admin/admin.el
index 8c68b18183..6be378b924 100644
--- a/admin/admin.el
+++ b/admin/admin.el
@@ -351,11 +351,13 @@ Optional argument TYPE is type of output (nil means all)."
 \"https://www.w3.org/TR/html4/loose.dtd\";>\n\n")
 
 (defconst manual-meta-string
-  "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">
-<link rev=\"made\" href=\"mailto:bug-gnu-emacs@gnu.org\";>
+  "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n")
+
+(defconst manual-links-string
+  "<link rev=\"made\" href=\"mailto:bug-gnu-emacs@gnu.org\";>
 <link rel=\"icon\" type=\"image/png\" href=\"/graphics/gnu-head-mini.png\">
 <meta name=\"ICBM\" content=\"42.256233,-71.006581\">
-<meta name=\"DC.title\" content=\"gnu.org\">\n\n")
+<meta name=\"DC.title\" content=\"gnu.org\">\n")
 
 (defconst manual-style-string "<style type=\"text/css\">
 @import url('/software/emacs/manual.css');\n</style>\n")
@@ -486,6 +488,12 @@ the @import directive."
       (delete-region opoint (point))
       (search-forward "<meta http-equiv=\"Content-Style")
       (setq opoint (match-beginning 0)))
+    (search-forward "</title>\n")
+    (delete-region opoint (point))
+    (search-forward "<link href=")
+    (goto-char (match-beginning 0))
+    (insert manual-links-string)
+    (setq opoint (point))
     (search-forward "</head>")
     (goto-char (match-beginning 0))
     (delete-region opoint (point))
diff --git a/admin/alloc-colors.c b/admin/alloc-colors.c
index 4db447332b..b78dd42b7e 100644
--- a/admin/alloc-colors.c
+++ b/admin/alloc-colors.c
@@ -23,6 +23,7 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include <stdlib.h>
 #include <stdarg.h>
 #include <unistd.h>
+#include <string.h>
 
 void
 fatal (const char *fmt, ...)
diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt
index c8ee3349cd..02b4f318e2 100644
--- a/admin/make-tarball.txt
+++ b/admin/make-tarball.txt
@@ -334,6 +334,9 @@ looks like this:
        </div>
     </div>
 
+Also, make sure the copyright years at the bottom of emacs.html are
+up-to-date.
+
 The file download.html may need to be updated, for example if the
 MS-Windows binaries will be signed by a different person/key than
 those mentioned there.
diff --git a/admin/unidata/unidata-gen.el b/admin/unidata/unidata-gen.el
index 149f753558..0a9fd5108c 100644
--- a/admin/unidata/unidata-gen.el
+++ b/admin/unidata/unidata-gen.el
@@ -89,6 +89,7 @@
 ;; PROPn: string representing the nth property value
 
 (eval-when-compile (require 'cl-lib))
+(require 'generate-lisp-file)
 
 (defvar unidata-list nil)
 
@@ -1422,13 +1423,13 @@ Property value is a symbol `o' (Open), `c' (Close), or 
`n' (None)."
       (or elt (user-error "Unknown output file: %s" basename))
       (or noninteractive (message "Generating %s..." file))
       (with-temp-file file
-        (insert ";;; " basename "  -*- lexical-binding:t -*-
-;; " copyright "
-;; Generated from Unicode data files by unidata-gen.el.
-;; The sources for this file are found in the admin/unidata/ directory in
-;; the Emacs sources.  The Unicode data files are used under the
-;; Unicode Terms of Use, as contained in the file copyright.html in that
-;; same directory.\n")
+        (generate-lisp-file-heading
+         basename 'unidata-gen-file
+         :commentary (concat copyright "  \
+The sources for this file are found in the admin/unidata/ directory in \
+the Emacs sources.  The Unicode data files are used under the \
+Unicode Terms of Use, as contained in the file copyright.html in that \
+same directory."))
         (dolist (proplist (cdr elt))
           (let ((prop (unidata-prop-prop proplist))
                 (index (unidata-prop-index proplist))
@@ -1446,21 +1447,15 @@ Property value is a symbol `o' (Open), `c' (Close), or 
`n' (None)."
               (set-char-table-extra-slot table 3 describer))
             (insert (format "(define-char-code-property '%S\n  %S\n  %S)\n"
                             prop table docstring))))
-        (insert ";; Local Variables:\n"
-                ";; coding: utf-8\n"
-                ";; version-control: never\n"
-                ";; no-byte-compile: t\n"
-                ";; no-update-autoloads: t\n"
-                ";; End:\n\n"
-                (format ";;; %s ends here\n" basename)))))
+        (generate-lisp-file-trailer basename :inhibit-provide t))))
   (or noninteractive (message "Generating %s...done" file)))
 
 (defun unidata-gen-charprop (&optional charprop-file text)
   (or charprop-file (setq charprop-file (pop command-line-args-left)))
   (with-temp-file charprop-file
-    (insert ";; Automatically generated by unidata-gen.el."
-            "  -*- lexical-binding: t -*-\n"
-            ";; See the admin/unidata/ directory in the Emacs sources.\n")
+    (generate-lisp-file-heading
+     charprop-file 'unidata-gen-charprop
+     :commentary "See the admin/unidata/ directory in the Emacs sources.")
     (if text
         (insert text)
       (dolist (elt unidata-file-alist)
@@ -1469,19 +1464,7 @@ Property value is a symbol `o' (Open), `c' (Close), or 
`n' (None)."
                          (unidata-prop-prop proplist) (car elt)
                          (unidata-prop-docstring proplist))))))
     (or noninteractive (message "Writing %s..." charprop-file))
-    (insert "\n"
-           (format "(provide '%s)\n"
-                    (file-name-sans-extension
-                     (file-name-nondirectory charprop-file)))
-           "\n"
-           ";; Local Variables:\n"
-           ";; coding: utf-8\n"
-           ";; version-control: never\n"
-           ";; no-byte-compile: t\n"
-           ";; no-update-autoloads: t\n"
-           ";; End:\n\n"
-            (format ";;; %s ends here\n"
-                   (file-name-nondirectory charprop-file)))))
+    (generate-lisp-file-trailer charprop-file)))
 
 (defun unidata-gen-scripts (&optional file)
   ;; Running from Makefile.
diff --git a/build-aux/config.guess b/build-aux/config.guess
index 7f76b6228f..160ecf0951 100755
--- a/build-aux/config.guess
+++ b/build-aux/config.guess
@@ -4,7 +4,7 @@
 
 # shellcheck disable=SC2006,SC2268 # see below for rationale
 
-timestamp='2022-01-09'
+timestamp='2022-05-08'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -1151,16 +1151,27 @@ EOF
        ;;
     x86_64:Linux:*:*)
        set_cc_for_build
+       CPU=$UNAME_MACHINE
        LIBCABI=$LIBC
        if test "$CC_FOR_BUILD" != no_compiler_found; then
-           if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
-               (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
-               grep IS_X32 >/dev/null
-           then
-               LIBCABI=${LIBC}x32
-           fi
+           ABI=64
+           sed 's/^        //' << EOF > "$dummy.c"
+           #ifdef __i386__
+           ABI=x86
+           #else
+           #ifdef __ILP32__
+           ABI=x32
+           #endif
+           #endif
+EOF
+           cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | 
sed 's, ,,g'`
+           eval "$cc_set_abi"
+           case $ABI in
+               x86) CPU=i686 ;;
+               x32) LIBCABI=${LIBC}x32 ;;
+           esac
        fi
-       GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI
+       GUESS=$CPU-pc-linux-$LIBCABI
        ;;
     xtensa*:Linux:*:*)
        GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
diff --git a/config.bat b/config.bat
index 758e462138..e9a180c8ee 100644
--- a/config.bat
+++ b/config.bat
@@ -310,7 +310,7 @@ rm -f makefile.tmp
 sed -f ../msdos/sedlibcf.inp < gnulib.mk-in > gnulib.tmp
 sed -f ../msdos/sedlibmk.inp < gnulib.tmp > gnulib.mk
 rm -f gnulib.tmp
-Rem Create directorys in lib/ that MKDIR_P is supposed to create
+Rem Create directories in lib/ that MKDIR_P is supposed to create
 Rem but I have no idea how to do that on MS-DOS.
 mkdir sys
 Rem Create .d files for new files in lib/ and lib/malloc/
diff --git a/configure.ac b/configure.ac
index 5a82d47db3..a2b24e3961 100644
--- a/configure.ac
+++ b/configure.ac
@@ -492,6 +492,7 @@ OPTION_DEFAULT_ON([threads],[don't compile with elisp 
threading support])
 OPTION_DEFAULT_OFF([native-compilation],[compile with Emacs Lisp native 
compiler support])
 OPTION_DEFAULT_OFF([cygwin32-native-compilation],[use native compilation on 
32-bit Cygwin])
 OPTION_DEFAULT_ON([xinput2],[don't use version 2 of the X Input Extension for 
input])
+OPTION_DEFAULT_OFF([small-ja-dic],[generate a smaller-size Japanese 
dictionary])
 
 AC_ARG_WITH([file-notification],[AS_HELP_STRING([--with-file-notification=LIB],
  [use a file notification library (LIB one of: yes, inotify, kqueue, gfile, 
w32, no)])],
@@ -1025,6 +1026,7 @@ AS_IF([test $gl_gcc_warnings = no],
      gl_WARN_ADD([-Wno-pointer-sign])
      gl_WARN_ADD([-Wno-string-plus-int])
      gl_WARN_ADD([-Wno-unknown-attributes])
+     gl_WARN_ADD([-Wno-unknown-pragmas])
    ])
  ],[
   isystem='-isystem '
@@ -1080,8 +1082,12 @@ AS_IF([test $gl_gcc_warnings = no],
   # option problematic.
   nw="$nw -Wsuggest-attribute=pure"
 
+  # Emacs doesn't need this paranoia.
+  nw="$nw -Wbidi-chars=any,ucn"
+
   if test "$emacs_cv_clang" = yes; then
     nw="$nw -Wdouble-promotion"
+    nm="$nm -Wunknown-pragmas"
   fi
 
   # This causes too much noise in the MinGW build.
@@ -1101,6 +1107,7 @@ AS_IF([test $gl_gcc_warnings = no],
   gl_WARN_ADD([-Wno-type-limits])      # Too many warnings for now
   gl_WARN_ADD([-Wno-unused-parameter]) # Too many warnings for now
   gl_WARN_ADD([-Wno-format-nonliteral])
+  gl_WARN_ADD([-Wno-bidi-chars])
 
   # clang is unduly picky about some things.
   if test "$emacs_cv_clang" = yes; then
@@ -1618,16 +1625,63 @@ AC_DEFUN([AC_TYPE_SIZE_T])
 # Likewise for obsolescent test for uid_t, gid_t; Emacs assumes them.
 AC_DEFUN([AC_TYPE_UID_T])
 
-# sqrt and other floating-point functions such as fmod and frexp
-# are found in -lm on many systems.
-OLD_LIBS=$LIBS
-AC_SEARCH_LIBS([sqrt], [m])
-if test "X$LIBS" = "X$OLD_LIBS"; then
-  LIB_MATH=
-else
-  LIB_MATH=$ac_cv_search_sqrt
-fi
-LIBS=$OLD_LIBS
+# Check for all math.h functions that Emacs uses; on some platforms,
+# -lm is needed for some of these functions.
+AC_CACHE_CHECK([for math library],
+  [emacs_cv_lib_math],
+  [OLD_LIBS=$LIBS
+   AC_LINK_IFELSE(
+     [AC_LANG_SOURCE([[
+       #include <math.h>
+       int
+       main (int argc, char **argv)
+       {
+         double d = argc;
+         float f = argc;
+         int i = argc;
+         long l = argc;
+         d = acos (d);
+         d = asin (d);
+         d = atan (d);
+         d = atan2 (d, d);
+         d = ceil (d);
+         d = copysign (d, d);
+         d = cos (d);
+         d = exp (d);
+         d = fabs (d);
+         d = floor (d);
+         d = fmod (d, d);
+         d = frexp (d, &i);
+         d = ldexp (d, i);
+         d = log (d);
+         d = log2 (d);
+         d = log10 (d);
+         d = pow (d, d);
+         d = rint (d);
+         d = scalbn (d, l);
+         d = sin (d);
+         d = sqrt (d);
+         d = tan (d);
+         d = trunc (d);
+         f = fabsf (f);
+         f = powf (f, f);
+         i = ilogb (d);
+         i = signbit (d);
+         l = lrint (d);
+         l = lround (d);
+         return d == f && i == l;
+       }
+     ]])],
+     [emacs_cv_lib_math='none required'],
+     [LIBS="-lm $LIBS"
+      AC_LINK_IFELSE([],
+        [emacs_cv_lib_math=-lm],
+       [AC_MSG_ERROR([Math library (-lm) not found])])])
+   LIBS=$OLD_LIBS])
+case $emacs_cv_lib_math in
+  -*) LIB_MATH=$emacs_cv_lib_math;;
+  *)  LIB_MATH=;;
+esac
 
 dnl Current possibilities handled by sed (aix4-2 -> aix,
 dnl gnu-linux -> gnu/linux, etc.):
@@ -2031,6 +2085,16 @@ Either fix this, or re-configure with the option 
'--without-ns'.])])
     fi
   fi
 
+  AC_CACHE_CHECK([for Mac OS X 12.0 or later],
+                 [emacs_cv_macosx_12_0],
+                 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <AvailabilityMacros.h>
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 120000
+Mac OS X 12.x or later.
+#endif
+                 ]])], [emacs_cv_macosx_12_0=no],
+                 [emacs_cv_macosx_12_0=yes]))
+
   if test "${with_native_image_api}" = yes; then
      AC_DEFINE(HAVE_NATIVE_IMAGE_API, 1, [Define to use native OS APIs for 
images.])
      NATIVE_IMAGE_API="yes (ns)"
@@ -6203,6 +6267,9 @@ case "$opsys" in
      if test "$NS_IMPL_COCOA" = "yes"; then
         libs_nsgui="$libs_nsgui -framework IOKit -framework Carbon \
                     -framework IOSurface -framework QuartzCore"
+        if test "$emacs_cv_macosx_12_0" = "yes"; then
+         libs_nsgui="$libs_nsgui -framework UniformTypeIdentifiers"
+       fi
      fi
    else
      libs_nsgui=
@@ -6465,6 +6532,7 @@ AS_ECHO(["  Does Emacs use -lXaw3d?                       
          ${HAVE_XAW3D
   Which dumping strategy does Emacs use?                  ${with_dumping}
   Does Emacs have native lisp compiler?                   ${HAVE_NATIVE_COMP}
   Does Emacs use version 2 of the the X Input Extension?  ${HAVE_XINPUT2}
+  Does Emacs generate a smaller-size Japanese dictionary? ${with_small_ja_dic}
 "])
 
 if test -n "${EMACSDATA}"; then
@@ -6563,6 +6631,9 @@ SUBDIR_MAKEFILES_IN=`echo " ${SUBDIR_MAKEFILES}" | sed -e 
's| | $(srcdir)/|g' -e
 
 AC_SUBST(SUBDIR_MAKEFILES_IN)
 
+SMALL_JA_DIC=$with_small_ja_dic
+AC_SUBST(SMALL_JA_DIC)
+
 dnl You might wonder (I did) why epaths.h is generated by running make,
 dnl rather than just letting configure generate it from epaths.in.
 dnl One reason is that the various paths are not fully expanded (see above);
diff --git a/doc/emacs/abbrevs.texi b/doc/emacs/abbrevs.texi
index 9f339a0357..07f66ec10a 100644
--- a/doc/emacs/abbrevs.texi
+++ b/doc/emacs/abbrevs.texi
@@ -411,10 +411,13 @@ away in the buffer to search for an expansion.
 
 @vindex dabbrev-check-all-buffers
 @vindex dabbrev-check-other-buffers
+@vindex dabbrev-ignored-buffer-modes
   After scanning the current buffer, @kbd{M-/} normally searches other
 buffers.  The variables @code{dabbrev-check-all-buffers} and
 @code{dabbrev-check-other-buffers} can be used to determine which
-other buffers, if any, are searched.
+other buffers, if any, are searched.  Buffers that have major modes
+derived from any of the modes in @code{dabbrev-ignored-buffer-modes}
+are ignored.
 
 @vindex dabbrev-ignored-buffer-names
 @vindex dabbrev-ignored-buffer-regexps
diff --git a/doc/emacs/basic.texi b/doc/emacs/basic.texi
index 196a28be5a..1a4abdc9ec 100644
--- a/doc/emacs/basic.texi
+++ b/doc/emacs/basic.texi
@@ -347,11 +347,11 @@ move to the column number specified by the argument's 
numeric value.
 @kindex C-x C-n
 @findex set-goal-column
 Use the current column of point as the @dfn{semipermanent goal column}
-for @kbd{C-n} and @kbd{C-p} (@code{set-goal-column}) in the current
-buffer.  When a semipermanent goal column is in effect, those commands
-always try to move to this column, or as close as possible to it,
-after moving vertically.  The goal column remains in effect until
-canceled.
+(@code{set-goal-column}) in the current buffer.  When a semipermanent
+goal column is in effect, @kbd{C-n}, @kbd{C-p}, @kbd{<prior>} and
+@kbd{<next>} always try to move to this column, or as close as
+possible to it, after moving vertically.  The goal column remains in
+effect until canceled.
 
 @item C-u C-x C-n
 Cancel the goal column.  Henceforth, @kbd{C-n} and @kbd{C-p} try to
@@ -653,14 +653,14 @@ Toggle automatic display of the current line number or 
column number.
 displayed before each line, see @ref{Display Custom}.
 
 @item M-=
-Display the number of lines, words, and characters that are present in
-the region (@code{count-words-region}).  @xref{Mark}, for information
-about the region.
+Display the number of lines, sentences, words, and characters that are
+present in the region (@code{count-words-region}).  @xref{Mark}, for
+information about the region.
 
 @item M-x count-words
-Display the number of lines, words, and characters that are present in
-the buffer.  If the region is active (@pxref{Mark}), display the
-numbers for the region instead.
+Display the number of lines, sentences, words, and characters that are
+present in the buffer.  If the region is active (@pxref{Mark}),
+display the numbers for the region instead.
 
 @item C-x =
 Display the character code of character after point, character position of
@@ -689,7 +689,7 @@ narrowed region and the line number relative to the whole 
buffer.
 @kindex M-=
 @findex count-words-region
   @kbd{M-=} (@code{count-words-region}) displays a message reporting
-the number of lines, words, and characters in the region
+the number of lines, sentences, words, and characters in the region
 (@pxref{Mark}, for an explanation of the region).  With a prefix
 argument, @kbd{C-u M-=}, the command displays a count for the entire
 buffer.
diff --git a/doc/emacs/building.texi b/doc/emacs/building.texi
index 994ad46033..b79fa0a755 100644
--- a/doc/emacs/building.texi
+++ b/doc/emacs/building.texi
@@ -178,7 +178,9 @@ list of customization variables and faces.
   If you change the variable
 @code{compilation-auto-jump-to-first-error} to a non-@code{nil} value,
 Emacs automatically visits the locus of the first error message that
-appears in the @file{*compilation*} buffer.
+appears in the @file{*compilation*} buffer.  (This variable can also
+have the values @code{if-location-known} and @code{first-known}, which
+modify the conditions for automatically visiting the error locus.)
 
   Compilation mode provides the following additional commands.  These
 commands can also be used in @file{*grep*} buffers, where the
@@ -287,6 +289,19 @@ window so that the current error message is @var{n} lines 
from the
 top, whether or not there is a fringe; the default value, @code{nil},
 gives the behavior described above.
 
+@vindex compilation-hidden-output
+  Compilation output can sometimes be very verbose, and much of it isn't
+of particular interest to a user.  The
+@code{compilation-hidden-output} user option should either be a regexp
+or a list of regexps, and output that matches will be made invisible.
+For instance, to hide the verbose output from recursive makefiles, you
+can say something like:
+
+@lisp
+(setq compilation-hidden-output
+      '("^make[^\n]+\n"))
+@end lisp
+
 @vindex compilation-error-regexp-alist
 @vindex grep-regexp-alist
   To parse messages from the compiler, Compilation mode uses the
diff --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi
index 946afb6fc1..0f7acd8797 100644
--- a/doc/emacs/cmdargs.texi
+++ b/doc/emacs/cmdargs.texi
@@ -800,29 +800,45 @@ changing any environment or registry settings.
 @pindex addpm, MS-Windows installation program
 @cindex registry, setting environment variables (MS-Windows)
 
-On MS-Windows, the installation program @command{addpm.exe} adds
-values for @env{emacs_dir}, @env{EMACSLOADPATH}, @env{EMACSDATA},
-@env{EMACSPATH}, @env{EMACSDOC}, @env{SHELL} and @env{TERM} to the
-@file{HKEY_LOCAL_MACHINE} section of the system registry, under
-@file{/Software/GNU/Emacs}.  It does this because there is no standard
-place to set environment variables across different versions of
-Windows.  Running @command{addpm.exe} is no longer strictly necessary
-in recent versions of Emacs, but if you are upgrading from an older
-version, running @command{addpm.exe} ensures that you do not have
-older registry entries from a previous installation, which may not be
-compatible with the latest version of Emacs.
-
-When Emacs starts, as well as checking the environment, it also checks
-the System Registry for those variables and for @env{HOME}, @env{LANG}
-and @env{PRELOAD_WINSOCK}.
+On MS-Windows, the environment variables @env{emacs_dir},
+@env{EMACSLOADPATH}, @env{EMACSDATA}, @env{EMACSPATH}, @env{EMACSDOC},
+@env{SHELL}, @env{TERM}, @env{HOME}, @env{LANG}, and
+@env{PRELOAD_WINSOCK} can also be set in the @file{HKEY_CURRENT_USER}
+or the @file{HKEY_LOCAL_MACHINE} section of the system registry, under
+the @file{/Software/GNU/Emacs} key.  When Emacs starts, as well as
+checking the environment, it also checks the system registry for those
+variables.
 
 To determine the value of those variables, Emacs goes through the
-following procedure.  First, the environment is checked.  If the
-variable is not found there, Emacs looks for registry keys by that
-name under @file{/Software/GNU/Emacs}; first in the
+following procedure.  First, it checks the environment.  If the
+variable is not found there, Emacs looks for a registry key by the
+name of the variable under @file{/Software/GNU/Emacs}; first in the
 @file{HKEY_CURRENT_USER} section of the registry, and if not found
 there, in the @file{HKEY_LOCAL_MACHINE} section.  Finally, if Emacs
-still cannot determine the values, compiled-in defaults are used.
+still cannot determine the values, it uses the compiled-in defaults.
+
+Note that the registry settings have global system-wide effect: they
+will affect all Emacs sessions run on the system.  Thus, if you run
+different Emacs versions, or use both installed and un-installed Emacs
+executables, or build newer versions of Emacs, the settings in the
+registry will cause all of them to use the same directories, which is
+probably not what you want.  For this reason, @emph{we recommend
+against setting these variables in the registry}.  If you have such
+settings in the registry, we recommend that you remove them.
+
+If you run the Emacs MS-Windows installation program
+@command{addpm.exe}, it will update any existing registry settings of
+the @env{emacs_dir}, @env{EMACSLOADPATH}, @env{EMACSDATA},
+@env{EMACSPATH}, @env{EMACSDOC}, @env{SHELL}, and @env{TERM} variables
+to have the values suitable for the installed Emacs version with which
+@command{addpm.exe} came.  Note that @command{addpm.exe} will
+@emph{not} create any registry setting that didn't exist, it will only
+update existing settings, which are most probably inherited from an
+old Emacs installation, so that they are compatible with the newly
+installed Emacs version.  Running @command{addpm.exe} is no longer
+necessary when installing recent versions of Emacs, so we only
+recommend doing that if you are upgrading from an older version, and
+cannot remove these settings from the registry for some reason.
 
 In addition to the environment variables above, you can also add
 settings to the @file{/Software/GNU/Emacs} registry key to specify X
diff --git a/doc/emacs/dired.texi b/doc/emacs/dired.texi
index 92106ae1ed..9e14e0f9a9 100644
--- a/doc/emacs/dired.texi
+++ b/doc/emacs/dired.texi
@@ -122,7 +122,7 @@ listing.  As an exception, if you type @kbd{C-x C-j} in a 
Dired
 buffer, Emacs displays the directory listing of the parent directory
 and places point on the line that corresponds to the directory where
 you invoked @code{dired-jump}.  Typing @kbd{C-x 4 C-j}
-(@code{dired-jump-other-window} has the same effect, but displays the
+(@code{dired-jump-other-window}) has the same effect, but displays the
 Dired buffer in a new window.
 
   The variable @code{dired-listing-switches} specifies the options to
@@ -1711,6 +1711,9 @@ the originating program.  Dragging files out of a Dired 
buffer is also
 supported, by enabling the user option @code{dired-mouse-drag-files},
 the mouse can be used to drag files onto other programs.  When set to
 @code{link}, it will make the other program (typically a file manager)
-create a symbolic link to the file, and setting it to any other
-non-@code{nil} value will make the other program open or create a copy
-of the file.
+create a symbolic link to the file; when set to @code{move}, it will
+make the other program move the file to a new location, and setting it
+to any other non-@code{nil} value will make the other program open or
+create a copy of the file.  The keyboard modifiers pressed during the
+drag-and-drop operation can also control what action the other program
+takes towards the file.
diff --git a/doc/emacs/display.texi b/doc/emacs/display.texi
index 7a6c7f391b..16d6d5567e 100644
--- a/doc/emacs/display.texi
+++ b/doc/emacs/display.texi
@@ -1594,7 +1594,9 @@ charge on the mode-line, by using the command
 @code{battery-mode-line-format} determines the way the battery charge
 is displayed; the exact mode-line message depends on the operating
 system, and it usually shows the current battery charge as a
-percentage of the total charge.
+percentage of the total charge.  The functions in
+@code{battery-update-functions} are run after updating the mode line,
+and can be used to trigger actions based on the battery status.
 
 @cindex mode line, 3D appearance
 @cindex attributes of mode line, changing
@@ -1980,7 +1982,7 @@ The command @kbd{M-x display-line-numbers-mode} provides a
 convenient way to turn on display of line numbers.  This mode has a globalized
 variant, @code{global-display-line-numbers-mode}.  The user option
 @code{display-line-numbers-type} controls which sub-mode of
-line-number display, described above, will these modes activate.
+line-number display, described above, these modes will activate.
 
 @noindent
 Note that line numbers are not displayed in the minibuffer and in the
diff --git a/doc/emacs/files.texi b/doc/emacs/files.texi
index ffd8079fc1..062185fb4a 100644
--- a/doc/emacs/files.texi
+++ b/doc/emacs/files.texi
@@ -326,6 +326,48 @@ of @code{require-final-newline} (@pxref{Customize Save}).  
If you have
 already visited the same file in the usual (non-literal) manner, this
 command asks you whether to visit it literally instead.
 
+@findex find-sibling-file
+@vindex find-sibling-rules
+Files are sometimes (loosely) tied to other files, and you could call
+these files @dfn{sibling files}.  For instance, when editing C files,
+if you have a file called @samp{"foo.c"}, you often also have a file
+called @samp{"foo.h"}, and that could be its sibling file.  Or you may
+have different versions of a file, for instance
+@samp{"src/emacs/emacs-27/lisp/allout.el"} and
+@samp{"src/emacs/emacs-28/lisp/allout.el"} might be considered
+siblings.  Emacs provides the @code{find-sibling-file} command to jump
+between sibling files, but it's impossible to guess at which files a
+user might want to be considered siblings, so Emacs lets you configure
+this freely by altering the @code{find-sibling-rules} user option.
+This is a list of match/expansion elements.
+
+For instance, to do the @samp{".c"} to @samp{".h"} mapping, you could
+say:
+
+@lisp
+(setq find-sibling-rules
+      '(("\\([^/]+\\)\\.c\\'" "\\1.h")))
+@end lisp
+
+(@code{ff-find-related-file} offers similar functionality especially
+geared towards C files, @pxref{Other C Commands}.)
+
+Or, if you want to consider all files under
+@samp{"src/emacs/DIR/file-name"} to be siblings of other @var{dir}s,
+you could say:
+
+@lisp
+(setq find-sibling-rules
+      '(("src/emacs/[^/]+/\\(.*\\)\\'" "src/emacs/.*/\\1")))
+@end lisp
+
+As you can see, this is a list of @var{(MATCH EXPANSION...)} elements.
+The @var{match} is a regular expression that matches the visited file
+name, and each @var{expansion} may refer to match groups by using
+@samp{\\1} and so on.  The resulting expansion string is then applied
+to the file system to see if any files match this expansion
+(interpreted as a regexp).
+
 @vindex find-file-hook
 @vindex find-file-not-found-functions
   Two special hook variables allow extensions to modify the operation
diff --git a/doc/emacs/frames.texi b/doc/emacs/frames.texi
index 7c564a8776..fa248c1a58 100644
--- a/doc/emacs/frames.texi
+++ b/doc/emacs/frames.texi
@@ -128,6 +128,12 @@ In addition, the text in the region becomes the primary 
selection
 non-@code{nil} value, dragging the mouse over a stretch of text also
 adds the text to the kill ring.  The default is @code{nil}.
 
+  If this variable is @code{non-empty}, only copy to the kill ring if
+the region is non-empty.  For instance, if you mouse drag an area that
+is less than a half a character, you'd normally get the empty string
+in your kill ring, but with @code{non-empty}, this short mouse drag
+won't affect the kill ring.
+
 @vindex mouse-scroll-min-lines
   If you move the mouse off the top or bottom of the window while
 dragging, the window scrolls at a steady rate until you move the mouse
@@ -136,6 +142,12 @@ entirely on the screen.  The number of lines scrolled per 
step depends
 on how far away from the window edge the mouse has gone; the variable
 @code{mouse-scroll-min-lines} specifies a minimum step size.
 
+@vindex mouse-drag-mode-line-buffer
+  If you enable the option @code{mouse-drag-mode-line-buffer} and
+dragging files is supported by the window system, then dragging the
+mouse on the buffer name portion of the mode line will drag that
+buffer's file to another program or frame.
+
 @findex mouse-yank-primary
 @findex mouse-yank-at-click
   Clicking with the middle mouse button, @kbd{mouse-2}, moves point to
@@ -1651,11 +1663,15 @@ For additional customization options for displaying 
tooltips, use
 @kbd{M-x customize-group @key{RET} tooltip @key{RET}}.
 
 @vindex use-system-tooltips
-  If Emacs is built with the GTK+ toolkit or Haiku windowing support,
-it displays tooltips via the toolkit, using the default appearance of
-the toolkit's tooltips.  To disable this, change the variable
+  If Emacs is built with the GTK+ toolkit, Nextstep windowing, or
+Haiku windowing support, it displays tooltips via the toolkit, using
+the default appearance of the toolkit's tooltips.@footnote{The
+foreground and background colors of toolkit-created tooltips on
+Nextstep can also be customized by setting the @code{foreground} and
+@code{background} frame parameters that are part of
+@code{tooltip-frame-parameters}.} To disable this, change the variable
 @code{use-system-tooltips} to @code{nil}.  If you do this, or if Emacs
-is built without GTK+ or Haiku windowing support, most attributes of
+is built without the appropriate windowing support, most attributes of
 the tooltip text are specified by the @code{tooltip} face, and by X
 resources (@pxref{X Resources}).
 
diff --git a/doc/emacs/glossary.texi b/doc/emacs/glossary.texi
index 7e0c84d723..a78a2c9e2d 100644
--- a/doc/emacs/glossary.texi
+++ b/doc/emacs/glossary.texi
@@ -229,9 +229,11 @@ from a variety of coding systems when reading or writing 
it.
 @item Command
 A command is a Lisp function specially defined to be able to serve as
 a key binding in Emacs or to be invoked by its name
-(@pxref{Glossary---Command Name}).  When you type a key sequence
-(q.v.), its binding (q.v.@:) is looked up in the relevant keymaps
-(q.v.@:) to find the command to run.  @xref{Commands}.
+(@pxref{Glossary---Command Name}).  (Another term for @dfn{command} is
+@dfn{interactive function}---they are used interchangeably.)  When you
+type a key sequence (q.v.), its binding (q.v.@:) is looked up in the
+relevant keymaps (q.v.@:) to find the command to run.
+@xref{Commands}.
 
 @item Command History
 @xref{Glossary---Minibuffer History}.
@@ -775,6 +777,14 @@ typing sequences of @acronym{ASCII} characters (q.v.).  
@xref{Input Methods}.
 Insertion means adding text into the buffer, either from the keyboard
 or from some other place in Emacs.
 
+@item Interactive Function
+A different term for @dfn{command} (q.v.).
+
+@item Interactive Invocation
+A function can be called from Lisp code, or called as a user level
+command (via @kbd{M-x}, a key binding or a menu).  In the latter case,
+the function is said to be @dfn{called interactively}.
+
 @item Interlocking
 @xref{Glossary---File Locking}.
 
diff --git a/doc/emacs/killing.texi b/doc/emacs/killing.texi
index 2fd2d21dd3..4435f6e494 100644
--- a/doc/emacs/killing.texi
+++ b/doc/emacs/killing.texi
@@ -111,24 +111,27 @@ active (@pxref{Using Region}).
 
 @kindex M-\
 @findex delete-horizontal-space
-@kindex M-SPC
-@findex just-one-space
-@findex cycle-spacing
-  The other delete commands are those that delete only whitespace
+The other delete commands are those that delete only whitespace
 characters: spaces, tabs and newlines.  @kbd{M-\}
 (@code{delete-horizontal-space}) deletes all the spaces and tab
 characters before and after point.  With a prefix argument, this only
-deletes spaces and tab characters before point.  @kbd{M-@key{SPC}}
-(@code{just-one-space}) does likewise but leaves a single space before
+deletes spaces and tab characters before point.
+
+@findex just-one-space
+@code{just-one-space} does likewise but leaves a single space before
 point, regardless of the number of spaces that existed previously
 (even if there were none before).  With a numeric argument @var{n}, it
 leaves @var{n} spaces before point if @var{n} is positive; if @var{n}
 is negative, it deletes newlines in addition to spaces and tabs,
-leaving @minus{}@var{n} spaces before point.  The command @code{cycle-spacing}
-acts like a more flexible version of @code{just-one-space}.  It
-does different things if you call it repeatedly in succession.
-The first call acts like @code{just-one-space}, the next removes
-all whitespace, and a third call restores the original whitespace.
+leaving @minus{}@var{n} spaces before point.
+
+@kindex M-SPC
+@findex cycle-spacing
+@vindex cycle-spacing-actions
+The command @code{cycle-spacing} (@kbd{M-@key{SPC}}) acts like a more
+flexible version of @code{just-one-space}.  It performs different
+space cleanup actions defined by @code{cycle-spacing-actions}, in a
+cyclic manner, if you call it repeatedly in succession.
 
   @kbd{C-x C-o} (@code{delete-blank-lines}) deletes all blank lines
 after the current line.  If the current line is blank, it deletes all
diff --git a/doc/emacs/kmacro.texi b/doc/emacs/kmacro.texi
index 60880941db..88df293765 100644
--- a/doc/emacs/kmacro.texi
+++ b/doc/emacs/kmacro.texi
@@ -179,7 +179,7 @@ itself counts as the first repetition, since it is executed 
as you
 define it, so @kbd{C-u 4 C-x )} executes the macro immediately 3
 additional times.
 
-@findex kdb-macro-redisplay
+@findex kmacro-redisplay
 @kindex C-x C-k d
   While executing a long-running keyboard macro, it can sometimes be
 useful to trigger a redisplay (to show how far we've gotten).  The
diff --git a/doc/emacs/macos.texi b/doc/emacs/macos.texi
index 37f48619d1..d7c432d420 100644
--- a/doc/emacs/macos.texi
+++ b/doc/emacs/macos.texi
@@ -223,6 +223,7 @@ keystrokes.  Here is a list of these events.
 
 @table @key
 @item ns-open-file
+@cindex ns-open-file event
 @vindex ns-pop-up-frames
 This event occurs when another Nextstep application requests that
 Emacs open a file.  A typical reason for this would be a user
@@ -239,44 +240,29 @@ means to always visit the file in a new frame.  A value 
of @code{nil}
 means to always visit the file in the selected frame.
 
 @item ns-open-temp-file
+@cindex ns-open-temp-file event
 This event occurs when another application requests that Emacs open a
 temporary file.  By default, this is handled by just generating a
 @code{ns-open-file} event, the results of which are described above.
 
 @item ns-open-file-line
+@cindex ns-open-file-line event
 Some applications, such as ProjectBuilder and gdb, request not only a
 particular file, but also a particular line or sequence of lines in
 the file.  Emacs handles this by visiting that file and highlighting
 the requested line (@code{ns-open-file-select-line}).
 
-@item ns-drag-n-drop
-This event occurs when a user drags an object from another application
-into an Emacs frame.  The default behavior is to open a file in the
-window under the mouse, or to insert text at point of the window under
-the mouse.
-
-The sending application has some limited ability to decide how Emacs
-handles the sent object, but the user may override the default
-behavior by holding one or more modifier key.
-
-@table @kbd
-@item control
-Insert as text in the current buffer.  If the object is a file, this
-will insert the filename.
-@item alt/option
-Attempt to open the object as though it is a file or URL.
-@item super/command
-Perform the default action for the type.  This can be useful when an
-application is overriding the default behavior.
-@end table
-
-The modifier keys listed above are defined by macOS and are unaffected
-by user changes to the modifiers in Emacs.
-
 @item ns-power-off
+@cindex ns-power-off event
 This event occurs when the user logs out and Emacs is still running, or when
 ``Quit Emacs'' is chosen from the application menu.
 The default behavior is to save all file-visiting buffers.
+
+@item ns-show-prefs
+@cindex ns-show-prefs event
+This event occurs when the user selects ``Preferences'' from the
+application menu.  By default, it is bound to the command
+@code{customize}.
 @end table
 
 @cindex using Nextstep services (macOS)
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index cca8441daa..e5b3664a4c 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -1316,6 +1316,12 @@ point is on a directory entry, mark all files in that 
directory tree
 (@code{vc-dir-mark-all-files}).  With a prefix argument, mark all
 listed files and directories.
 
+@findex vc-dir-mark-by-regexp
+@item %
+You can use this command to mark files by regexp
+(@code{vc-dir-mark-by-regexp}).  If given a prefix, unmark files
+instead.
+
 @item G
 Add the file under point to the list of files that the VC should
 ignore (@code{vc-dir-ignore}).  For instance, if the VC is Git, it
@@ -1660,6 +1666,9 @@ support additional types of projects.
   Which files do or don't belong to a project is also determined by
 the project back-end.  For example, the VC back-end doesn't consider
 ``ignored'' files (@pxref{VC Ignore}) to be part of the project.
+Also, the VC Project back-end considers ``untracked'' files by default.
+That behavior is controllable with the variable
+@code{project-vc-include-untracked}.
 
 @menu
 * Project File Commands::   Commands for handling project files.
@@ -2817,6 +2826,13 @@ place of a file name on the command line.  
@command{etags} will read from
 standard input and mark the produced tags as belonging to the file
 @var{file}.
 
+  For C and C++, if the source files don't observe the GNU Coding
+Standards' convention if having braces (@samp{@{} and @samp{@}}) in
+column zero only for top-level definitions, like functions and
+@code{struct} definitions, we advise that you use the
+@samp{--ignore-indentation} option, to prevent @command{etags} from
+incorrectly interpreting closing braces in column zero.
+
   @samp{etags --help} outputs the list of the languages @command{etags}
 knows, and the file name rules for guessing the language.  It also prints
 a list of all the available @command{etags} options, together with a short
diff --git a/doc/emacs/mark.texi b/doc/emacs/mark.texi
index 91c44d527b..ad25ed6a8a 100644
--- a/doc/emacs/mark.texi
+++ b/doc/emacs/mark.texi
@@ -291,12 +291,23 @@ instead signal an error if the mark is inactive.
 @cindex Delete Selection mode
 @cindex mode, Delete Selection
 @findex delete-selection-mode
+@vindex delete-selection-temporary-region
   By default, text insertion occurs normally even if the mark is
 active---for example, typing @kbd{a} inserts the character @samp{a},
 then deactivates the mark.  Delete Selection mode, a minor mode,
 modifies this behavior: if you enable that mode, then inserting text
 while the mark is active causes the text in the region to be deleted
-first.  To toggle Delete Selection mode on or off, type @kbd{M-x
+first.  However, you can tune this behavior by customizing the
+@code{delete-selection-temporary-region} option.  Its default value is
+@code{nil}, but you can set it to @code{t}, in which case only
+temporarily-active regions will be replaced: those which are set by
+dragging the mouse (@pxref{Setting Mark}) or by shift-selection
+(@pxref{Shift Selection}), as well as by @kbd{C-u C-x C-x} when
+Transient Mark Mode is disabled.  You can further tune the behavior by
+setting @code{delete-selection-temporary-region} to @code{selection}:
+then temporary regions by @kbd{C-u C-x C-x} won't be replaced, only
+the ones activated by dragging the mouse or shift-selection.  To
+toggle Delete Selection mode on or off, type @kbd{M-x
 delete-selection-mode}.
 
 @node Mark Ring
diff --git a/doc/emacs/mini.texi b/doc/emacs/mini.texi
index a899fea7e3..4e71793b66 100644
--- a/doc/emacs/mini.texi
+++ b/doc/emacs/mini.texi
@@ -381,16 +381,16 @@ used with the completion list:
 @vindex minibuffer-completion-auto-choose
 @item M-@key{DOWN}
 @itemx M-@key{UP}
-These keys will navigate through the completions displayed in the
-completions buffer.  When @code{minibuffer-completion-auto-choose} is
-non-@code{nil} (which is the default), using these commands will
-automatically insert the current completion candidate in the
-minibuffer.  If this user option is @code{nil}, the keys will navigate
-the same way as before, but won't automatically insert the candidate
-in the minibuffer.  Instead you have to use the @kbd{M-@key{RET}} command to
-do that.  With a prefix argument, @kbd{C-u M-@key{RET}} inserts the
-currently active candidate to the minibuffer, but doesn't exit the
-minibuffer.
+While in the minibuffer, these keys navigate through the completions
+displayed in the completions buffer.  When
+@code{minibuffer-completion-auto-choose} is non-@code{nil} (which is
+the default), using these commands also inserts the current completion
+candidate into the minibuffer.  If
+@code{minibuffer-completion-auto-choose} is @code{nil}, you can use
+the @kbd{M-@key{RET}} command to insert the completion candidates into
+the minibuffer.  By default, that exits the minibuffer, but with a
+prefix argument, @kbd{C-u M-@key{RET}} inserts the currently active
+candidate without exiting the minibuffer.
 
 @findex switch-to-completions
 @item M-v
@@ -407,7 +407,10 @@ ways (@pxref{Windows}).
 @itemx mouse-1
 @itemx mouse-2
 While in the completion list buffer, this chooses the completion at
-point (@code{choose-completion}).
+point (@code{choose-completion}).  With a prefix argument, @kbd{C-u
+@key{RET}} inserts the completion at point into the minibuffer, but
+doesn't exit the minibuffer---thus, you can change your mind and
+choose another candidate.
 
 @findex next-completion
 @item @key{TAB}
@@ -682,17 +685,20 @@ behavior only when there are @var{n} or fewer 
alternatives.
 
 @vindex completions-format
   When displaying completions, Emacs will normally pop up a new buffer
-to display the completions.  The completions will (by default) be
-sorted in columns horizontally in alphabetical order, but this can be
-changed by changing the @code{completions-format} user option.  If
-@code{vertical}, sort the completions vertically in columns instead,
-and if @code{one-column}, just use a single column.
+to display the completions.  The completions will by default be sorted
+horizontally, using as many columns as will fit in the window-width,
+but this can be changed by customizing the @code{completions-format}
+user option.  If its value is @code{vertical}, Emacs will sort the
+completions vertically instead, and if it's @code{one-column}, Emacs
+will use just one column.
 
 @vindex completions-sort
-  This user option controls how completions are sorted in the
-@samp{*Completions*} buffer.  The default is @code{alphabetical}, but
-it can also be a function which will be called with the list of
-completions, and should return the list in the desired order.
+  The @code{completions-sort} user option controls the order in which
+the completions are sorted in the @samp{*Completions*} buffer.  The
+default is @code{alphabetical}, which sorts in alphabetical order.
+The value @code{nil} disables sorting.  The value can also be a
+function, which will be called with the list of completions, and
+should return the list in the desired order.
 
 @vindex completions-max-height
   When @code{completions-max-height} is non-@code{nil}, it limits the
diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index bd3ae2aa6a..eb4f5b0eda 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -89,6 +89,11 @@ list of available packages from package archive servers.  If 
the
 network is unavailable, it falls back on the most recently retrieved
 list.
 
+The main command to use in the package list buffer is the @key{x}
+command.  If the package under point isn't installed already, this
+command will install it.  If the package under point is already
+installed, this command will delete it.
+
 The following commands are available in the package menu:
 
 @table @kbd
@@ -162,7 +167,10 @@ installed versions (marked with status @samp{obsolete}).
 @findex package-menu-execute
 Download and install all packages marked with @kbd{i}, and their
 dependencies; also, delete all packages marked with @kbd{d}
-(@code{package-menu-execute}).  This also removes the marks.
+(@code{package-menu-execute}).  This also removes the marks.  If no
+packages are marked, this command will install the package under point
+(if it isn't installed already), or delete the package under point (if
+it's already installed).
 
 @item g
 @item r
@@ -321,12 +329,14 @@ version of the package, a newer version is also installed.
 
 @findex package-install
 @findex package-update
+@findex package-update-all
   Packages are most conveniently installed using the package menu
 (@pxref{Package Menu}), but you can also use the command @kbd{M-x
 package-install}.  This prompts for the name of a package with the
 @samp{available} status, then downloads and installs it.  Similarly,
 if you want to update a package, you can use the @kbd{M-x
-package-update} command.
+package-update} command, and if you just want to update all the
+packages, you can use the @kbd{M-x package-update-all} command.
 
 @cindex package requirements
   A package may @dfn{require} certain other packages to be installed,
diff --git a/doc/emacs/programs.texi b/doc/emacs/programs.texi
index 45bc4c79b4..795aabee74 100644
--- a/doc/emacs/programs.texi
+++ b/doc/emacs/programs.texi
@@ -250,10 +250,10 @@ where it treats each chapter, section, etc., as a 
definition.
 together.)
 
 @findex imenu
-  If you type @kbd{M-g i}, it reads the name of a definition using the
-minibuffer, then moves point to that definition.  You can use
-completion to specify the name; the command always displays the whole
-list of valid names.
+  If you type @kbd{M-g i} (@code{imenu}), it reads the name of a
+definition using the minibuffer, then moves point to that definition.
+You can use completion to specify the name; the command always
+displays the whole list of valid names.
 
 @findex imenu-add-menubar-index
   Alternatively, you can bind the command @code{imenu} to a mouse
@@ -1439,9 +1439,13 @@ performs completion using the function, variable, or 
property names
 defined in the current Emacs session.
 
   In all other respects, in-buffer symbol completion behaves like
-minibuffer completion.  For instance, if Emacs cannot complete to a
-unique symbol, it displays a list of completion alternatives in
-another window.  @xref{Completion}.
+minibuffer completion.  For instance, if Emacs cannot complete to
+a unique symbol, it displays a list of completion alternatives in
+another window.  Then you can use the keys @kbd{M-@key{DOWN}} and
+@kbd{M-@key{UP}} to navigate through the completions displayed
+in the completions buffer without leaving the original buffer,
+and the key @kbd{M-@key{RET}} to insert the currently highlighted
+completion to the buffer.  @xref{Completion}.
 
   In Text mode and related modes, @kbd{M-@key{TAB}} completes words
 based on the spell-checker's dictionary.  @xref{Spelling}.
diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi
index c990f5d766..f4e12d29e9 100644
--- a/doc/emacs/search.texi
+++ b/doc/emacs/search.texi
@@ -1027,24 +1027,11 @@ you search for @samp{a.*?$} against the text 
@samp{abbab} followed by
 a newline, it matches the whole string.  Since it @emph{can} match
 starting at the first @samp{a}, it does.
 
-@item @kbd{\@{@var{n}\@}}
-is a postfix operator specifying @var{n} repetitions---that is, the
-preceding regular expression must match exactly @var{n} times in a
-row.  For example, @samp{x\@{4\@}} matches the string @samp{xxxx} and
-nothing else.
-
-@item @kbd{\@{@var{n},@var{m}\@}}
-is a postfix operator specifying between @var{n} and @var{m}
-repetitions---that is, the preceding regular expression must match at
-least @var{n} times, but no more than @var{m} times.  If @var{m} is
-omitted, then there is no upper limit, but the preceding regular
-expression must match at least @var{n} times.@* @samp{\@{0,1\@}} is
-equivalent to @samp{?}. @* @samp{\@{0,\@}} is equivalent to
-@samp{*}. @* @samp{\@{1,\@}} is equivalent to @samp{+}.
-
+@cindex set of alternative characters, in regular expressions
+@cindex character set, in regular expressions
 @item @kbd{[ @dots{} ]}
-is a @dfn{character set}, beginning with @samp{[} and terminated by
-@samp{]}.
+is a @dfn{set of alternative characters}, or a @dfn{character set},
+beginning with @samp{[} and terminated by @samp{]}.
 
 In the simplest case, the characters between the two brackets are what
 this set can match.  Thus, @samp{[ad]} matches either one @samp{a} or
@@ -1061,9 +1048,10 @@ which matches any lower-case @acronym{ASCII} letter or 
@samp{$}, @samp{%} or
 period.  As another example, @samp{[α-ωί]} matches all lower-case
 Greek letters.
 
+@cindex character classes, in regular expressions
 You can also include certain special @dfn{character classes} in a
 character set.  A @samp{[:} and balancing @samp{:]} enclose a
-character class inside a character alternative.  For instance,
+character class inside a set of alternative characters.  For instance,
 @samp{[[:alnum:]]} matches any letter or digit.  @xref{Char Classes,,,
 elisp, The Emacs Lisp Reference Manual}, for a list of character
 classes.
@@ -1131,13 +1119,13 @@ no preceding expression on which the @samp{*} can act.  
It is poor practice
 to depend on this behavior; it is better to quote the special character anyway,
 regardless of where it appears.
 
-As a @samp{\} is not special inside a character alternative, it can
-never remove the special meaning of @samp{-} or @samp{]}.  So you
-should not quote these characters when they have no special meaning
-either.  This would not clarify anything, since backslashes can
-legitimately precede these characters where they @emph{have} special
-meaning, as in @samp{[^\]} (@code{"[^\\]"} for Lisp string syntax),
-which matches any single character except a backslash.
+As a @samp{\} is not special inside a set of alternative characters, it can
+never remove the special meaning of @samp{-}, @samp{^} or @samp{]}.
+You should not quote these characters when they have no special
+meaning.  This would not clarify anything, since backslashes
+can legitimately precede these characters where they @emph{have}
+special meaning, as in @samp{[^\]} (@code{"[^\\]"} for Lisp string
+syntax), which matches any single character except a backslash.
 
 @node Regexp Backslash
 @section Backslash in Regular Expressions
@@ -1202,11 +1190,11 @@ matches the same text that matched the @var{d}th 
occurrence of a
 @samp{\( @dots{} \)} construct.  This is called a @dfn{back
 reference}.
 
-After the end of a @samp{\( @dots{} \)} construct, the matcher remembers
-the beginning and end of the text matched by that construct.  Then,
-later on in the regular expression, you can use @samp{\} followed by the
-digit @var{d} to mean ``match the same text matched the @var{d}th time
-by the @samp{\( @dots{} \)} construct''.
+After the end of a @samp{\( @dots{} \)} construct, the matcher
+remembers the beginning and end of the text matched by that construct.
+Then, later on in the regular expression, you can use @samp{\}
+followed by the digit @var{d} to mean ``match the same text matched
+the @var{d}th @samp{\( @dots{} \)} construct''.
 
 The strings matching the first nine @samp{\( @dots{} \)} constructs
 appearing in a regular expression are assigned numbers 1 through 9 in
@@ -1223,6 +1211,21 @@ If a particular @samp{\( @dots{} \)} construct matches 
more than once
 (which can easily happen if it is followed by @samp{*}), only the last
 match is recorded.
 
+@item @kbd{\@{@var{m}\@}}
+is a postfix operator specifying @var{m} repetitions---that is, the
+preceding regular expression must match exactly @var{m} times in a
+row.  For example, @samp{x\@{4\@}} matches the string @samp{xxxx} and
+nothing else.
+
+@item @kbd{\@{@var{m},@var{n}\@}}
+is a postfix operator specifying between @var{m} and @var{n}
+repetitions---that is, the preceding regular expression must match at
+least @var{m} times, but no more than @var{n} times.  If @var{n} is
+omitted, then there is no upper limit, but the preceding regular
+expression must match at least @var{m} times.@* @samp{\@{0,1\@}} is
+equivalent to @samp{?}. @* @samp{\@{0,\@}} is equivalent to
+@samp{*}. @* @samp{\@{1,\@}} is equivalent to @samp{+}.
+
 @item \`
 matches the empty string, but only at the beginning of the string or
 buffer (or its accessible portion) being matched against.
@@ -1824,12 +1827,18 @@ occurrence of @var{string}.  When done, exit the 
recursive editing level
 with @kbd{C-M-c} to proceed to the next occurrence.
 
 @item e
-@itemx E
 to edit the replacement string in the minibuffer.  When you exit the
 minibuffer by typing @key{RET}, the minibuffer contents replace the
 current occurrence of the pattern.  They also become the new
 replacement string for any further occurrences.
 
+@item E
+is like @kbd{e}, but the next replacement will be done with exact
+case.  I.e., if you have a @code{query-replace} from @samp{foo} to
+@samp{bar}, a text like @samp{Foo} will be normally be replaced with
+@samp{Bar}.  Use this command to do the current replacement with exact
+case.
+
 @item C-l
 to redisplay the screen.  Then you must type another character to
 specify what to do with this occurrence.
diff --git a/doc/emacs/sending.texi b/doc/emacs/sending.texi
index ea87e0a77b..cc54224200 100644
--- a/doc/emacs/sending.texi
+++ b/doc/emacs/sending.texi
@@ -659,6 +659,7 @@ such as MIME support.  Another available mode is MH-E
 (@pxref{Top,,MH-E,mh-e, The Emacs Interface to MH}).
 
 @vindex mail-user-agent
+@findex define-mail-user-agent
   You can choose any of these @dfn{mail user agents} as your preferred
 method for editing and sending mail.  The commands @kbd{C-x m},
 @kbd{C-x 4 m} and @kbd{C-x 5 m} use whichever agent you have
@@ -667,7 +668,10 @@ the bug reporter (@pxref{Bugs}).  To specify a mail user 
agent,
 customize the variable @code{mail-user-agent}.  Currently, legitimate
 values include @code{message-user-agent} (Message mode)
 @code{sendmail-user-agent} (Mail mode), @code{gnus-user-agent}, and
-@code{mh-e-user-agent}.
+@code{mh-e-user-agent}.  Additional options may be available; check
+in the manual of your mail user agent package for details.  You may
+also define another mail user agent using
+@code{define-mail-user-agent}.
 
   If you select a different mail-composition method, the information
 in this chapter about the mail buffer and Message mode does not apply;
diff --git a/doc/emacs/vc1-xtra.texi b/doc/emacs/vc1-xtra.texi
index 2d984f4b92..3ccad50715 100644
--- a/doc/emacs/vc1-xtra.texi
+++ b/doc/emacs/vc1-xtra.texi
@@ -269,7 +269,7 @@ with the file's version control type.
 @vindex vc-handled-backends
   The variable @code{vc-handled-backends} determines which version
 control systems VC should handle.  The default value is @code{(RCS CVS
-SVN SCCS SRC Bzr Git Hg Mtn)}, so it contains all the version systems
+SVN SCCS SRC Bzr Git Hg)}, so it contains all the version systems
 that are currently supported.  If you want VC to ignore one or more of
 these systems, exclude its name from the list.  To disable VC
 entirely, set this variable to @code{nil}.
diff --git a/doc/lispref/buffers.texi b/doc/lispref/buffers.texi
index d8cf3d7919..1cbe8bc093 100644
--- a/doc/lispref/buffers.texi
+++ b/doc/lispref/buffers.texi
@@ -541,10 +541,12 @@ file formerly visited.
 @ref{Text}.
 
 @defun buffer-modified-p &optional buffer
-This function returns @code{t} if the buffer @var{buffer} has been modified
-since it was last read in from a file or saved, or @code{nil}
-otherwise.  If @var{buffer} is not supplied, the current buffer
-is tested.
+This function returns non-@code{nil} if @var{buffer} has
+been modified since it was last read in from a file or saved, or
+@code{nil} otherwise.  If @var{buffer} has been auto-saved since the
+time it was last modified, this function returns the symbol
+@code{autosaved}.  If @var{buffer} is @code{nil} or omitted, it
+defaults to the current buffer.
 @end defun
 
 @defun set-buffer-modified-p flag
@@ -563,8 +565,10 @@ function @code{force-mode-line-update} works by doing this:
 @end defun
 
 @defun restore-buffer-modified-p flag
-Like @code{set-buffer-modified-p}, but does not force redisplay
-of mode lines.
+Like @code{set-buffer-modified-p}, but does not force redisplay of
+mode lines.  This function also allows @var{flag}'s value to be
+the symbol @code{autosaved}, which marks the buffer as modified and
+auto-saved after the last modification.
 @end defun
 
 @deffn Command not-modified &optional arg
diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi
index 6c60216796..0a82bba3bc 100644
--- a/doc/lispref/commands.texi
+++ b/doc/lispref/commands.texi
@@ -2615,7 +2615,7 @@ POSITION is assumed to lie in a window text area."
 @end example
 @end defun
 
-@defun posn-col-row position
+@defun posn-col-row position &optional use-window
 This function returns a cons cell @w{@code{(@var{col} .  @var{row})}},
 containing the estimated column and row corresponding to buffer
 position described by @var{position}.  The return value is given in
@@ -2623,7 +2623,11 @@ units of the frame's default character width and default 
line height
 (including spacing), as computed from the @var{x} and @var{y} values
 corresponding to @var{position}.  (So, if the actual characters have
 non-default sizes, the actual row and column may differ from these
-computed values.)
+computed values.)  If the optional @var{window} argument is
+non-@code{nil}, use the default character width in the window
+indicated by @var{position} instead of the frame.  (This makes a
+difference if that window is showing a buffer with a non-default
+zooming level, for instance.)
 
 Note that @var{row} is counted from the top of the text area.  If the
 window given by @var{position} possesses a header line (@pxref{Header
diff --git a/doc/lispref/control.texi b/doc/lispref/control.texi
index 2f1666ba77..d4520ebdee 100644
--- a/doc/lispref/control.texi
+++ b/doc/lispref/control.texi
@@ -525,7 +525,7 @@ core pattern can have the following forms:
 
 @table @code
 
-@item _
+@item _@r{ (underscore)}
 Matches any @var{expval}.
 This is also known as @dfn{don't care} or @dfn{wildcard}.
 
@@ -629,7 +629,10 @@ Attempts to match @var{pattern1}, @var{pattern2}, @dots{}, 
in order,
 until one of them succeeds.  In that case, @code{or} likewise matches,
 and the rest of the sub-patterns are not tested.
 
-To present a consistent environment (@pxref{Intro Eval})
+To present a consistent environment
+@ifnottex
+(@pxref{Intro Eval})
+@end ifnottex
 to @var{body-forms} (thus avoiding an evaluation error on match),
 the set of variables bound by the pattern is the union of the
 variables bound by each sub-pattern.  If a variable is not bound by
diff --git a/doc/lispref/customize.texi b/doc/lispref/customize.texi
index 54059d7b6e..528421bf3b 100644
--- a/doc/lispref/customize.texi
+++ b/doc/lispref/customize.texi
@@ -376,7 +376,7 @@ name) and the new value, and should do whatever is 
necessary to update
 the value properly for this option (which may not mean simply setting
 the option as a Lisp variable); preferably, though, it should not
 modify its value argument destructively.  The default for
-@var{setfunction} is @code{set-default}.
+@var{setfunction} is @code{set-default-toplevel-value}.
 
 If you specify this keyword, the variable's documentation string
 should describe how to do the same job in hand-written Lisp code.
@@ -387,7 +387,7 @@ Specify @var{getfunction} as the way to extract the value 
of this
 option.  The function @var{getfunction} should take one argument, a
 symbol, and should return whatever customize should use as the
 current value for that symbol (which need not be the symbol's Lisp
-value).  The default is @code{default-value}.
+value).  The default is @code{default-toplevel-value}.
 
 You have to really understand the workings of Custom to use
 @code{:get} correctly.  It is meant for values that are treated in
@@ -409,11 +409,11 @@ do not reinitialize it if it is already non-void.
 
 @item custom-initialize-default
 Like @code{custom-initialize-set}, but use the function
-@code{set-default} to set the variable, instead of the variable's
-@code{:set} function.  This is the usual choice for a variable whose
-@code{:set} function enables or disables a minor mode; with this choice,
-defining the variable will not call the minor mode function, but
-customizing the variable will do so.
+@code{set-default-toplevel-value} to set the variable, instead of the
+variable's @code{:set} function.  This is the usual choice for a
+variable whose @code{:set} function enables or disables a minor mode;
+with this choice, defining the variable will not call the minor mode
+function, but customizing the variable will do so.
 
 @item custom-initialize-reset
 Always use the @code{:set} function to initialize the variable.  If
@@ -424,7 +424,7 @@ This is the default @code{:initialize} function.
 @item custom-initialize-changed
 Use the @code{:set} function to initialize the variable, if it is
 already set or has been customized; otherwise, just use
-@code{set-default}.
+@code{set-default-toplevel-value}.
 
 @item custom-initialize-delay
 This function behaves like @code{custom-initialize-set}, but it
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index 9650d22790..b98c2f8fa9 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -2010,6 +2010,11 @@ Tables}).  The width of a tab character is usually 
@code{tab-width}
 (@pxref{Usual Display}).
 @end defun
 
+@defun char-uppercase-p char
+Return non-@code{nil} if @var{char} is an uppercase character
+according to Unicode.
+@end defun
+
 @defun string-width string &optional from to
 This function returns the width in columns of the string @var{string},
 if it were displayed in the current buffer and the selected window.
@@ -2252,20 +2257,6 @@ This is a convenience function that uses 
@code{window-text-pixel-size}
 to compute the width of @var{string} (in pixels).
 @end defun
 
-@defun window-char-pixel-width &optional window face
-Return the average character width for the font used by @var{face} in
-@var{window}.  If @var{face} is @code{nil} or omitted, the
-@code{default} face is used.  If @var{windows} is @code{nil} or
-omitted, the currently selected window is used.
-@end defun
-
-@defun window-char-pixel-height &optional window face
-Return the average character height for the font used by @var{face} in
-@var{window}.  If @var{face} is @code{nil} or omitted, the
-@code{default} face is used.  If @var{windows} is @code{nil} or
-omitted, the currently selected window is used.
-@end defun
-
 @defun line-pixel-height
 This function returns the height in pixels of the line at point in the
 selected window.  The value includes the line spacing of the line
@@ -5066,7 +5057,7 @@ which are evaluated at display time.  This could be 
unsafe in certain
 situations, e.g., when the display specification was generated by some
 external program/agent.  Wrapping a display specification in a list
 that begins with the special symbol @code{disable-eval}, as in
-@w{@code{('disable-eval @var{spec})}}, will disable evaluation of any
+@w{@code{(disable-eval @var{spec})}}, will disable evaluation of any
 Lisp in @var{spec}, while still supporting all the other display
 property features.
 
@@ -8228,7 +8219,10 @@ help buffer.
 The window's display table, if there is one, takes precedence over the
 buffer's display table.  If neither exists, Emacs tries to use the
 standard display table; if that is @code{nil}, Emacs uses the usual
-character display conventions (@pxref{Usual Display}).
+character display conventions (@pxref{Usual Display}).  (Emacs does
+not ``merge'' display tables: For instance, if the window has a
+display table, the buffer's display table and the standard display
+table are completely ignored.)
 
   Note that display tables affect how the mode line is displayed, so
 if you want to force redisplay of the mode line using a new display
diff --git a/doc/lispref/elisp.texi b/doc/lispref/elisp.texi
index 7390352016..09e7aad714 100644
--- a/doc/lispref/elisp.texi
+++ b/doc/lispref/elisp.texi
@@ -593,6 +593,7 @@ Advising Emacs Lisp Functions
 * Advising Named Functions::  Advising named functions.
 * Advice Combinators::        Ways to compose advice.
 * Porting Old Advice::        Adapting code using the old defadvice.
+* Advice and Byte Code::      Not all functions can be advised.
 
 Macros
 
@@ -739,6 +740,7 @@ Reading and Printing Lisp Objects
 * Output Functions::        Functions to print Lisp objects as text.
 * Output Variables::        Variables that control what the printing
                               functions do.
+* Output Overrides::        Overriding output variables.
 
 Minibuffers
 
diff --git a/doc/lispref/eval.texi b/doc/lispref/eval.texi
index e94e222e6a..ed3cf56e09 100644
--- a/doc/lispref/eval.texi
+++ b/doc/lispref/eval.texi
@@ -435,7 +435,7 @@ expansion.
 @cindex forms, special
 @cindex evaluation of special forms
 
-  A @dfn{special form} is a primitive function specially marked so that
+  A @dfn{special form} is a primitive specially marked so that
 its arguments are not all evaluated.  Most special forms define control
 structures or perform variable bindings---things which functions cannot
 do.
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index 75905658e6..ea8683a6d8 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -581,9 +581,12 @@ contents of the file.  This is better than simply deleting 
the buffer
 contents and inserting the whole file, because (1) it preserves some
 marker positions and (2) it puts less data in the undo list.
 
-It is possible to read a special file (such as a FIFO or an I/O device)
-with @code{insert-file-contents}, as long as @var{replace} and
-@var{visit} are @code{nil}.
+It is possible to read a special file (such as a FIFO or an I/O
+device) with @code{insert-file-contents}, as long as @var{replace},
+and @var{visit} and @var{beg} are @code{nil}.  However, you should
+normally use an @var{end} argument for these files to avoid inserting
+(potentially) unlimited data into the buffer (for instance, when
+inserting data from @file{/dev/urandom}).
 @end defun
 
 @defun insert-file-contents-literally filename &optional visit beg end replace
@@ -3112,10 +3115,16 @@ except those two.  It is useful as the 
@var{match-regexp} argument to
 returns @code{nil}, if directory @samp{/foo} is empty.
 @end defvr
 
-@defun file-expand-wildcards pattern &optional full
+@defun file-expand-wildcards pattern &optional full regexp
 This function expands the wildcard pattern @var{pattern}, returning
 a list of file names that match it.
 
+@var{pattern} is, by default, a ``glob''/wildcard string, e.g.,
+@samp{"/tmp/*.png"} or @samp{"/*/*/foo.png"}, but can also be a
+regular expression if the optional @var{regexp} parameter is non-nil.
+In any case, the matches are applied per sub-directory, so a match
+can't span a parent/sub directory.
+
 If @var{pattern} is written as an absolute file name,
 the values are absolute also.
 
diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index 05c6e4b719..16f7ad312a 100644
--- a/doc/lispref/frames.texi
+++ b/doc/lispref/frames.texi
@@ -458,6 +458,18 @@ monitor, the same string as returned by the function
 @var{display} should be the name of an X display (a string).
 @end deffn
 
+@cindex monitor change functions
+@defvar display-monitors-changed-functions
+This variable is an abnormal hook run when the monitor configuration
+changes, which can happen if a monitor is rotated, moved, added or
+removed from a multiple-monitor setup, if the primary monitor changes,
+or if the resolution of a monitor changes.  It is called with a single
+argument consisting of the terminal on which the monitor configuration
+changed.  Programs should call @code{display-monitor-attributes-list}
+with the terminal as the argument to retrieve the new monitor
+configuration on that terminal.
+@end defvar
+
 @node Frame Geometry
 @section Frame Geometry
 @cindex frame geometry
@@ -683,9 +695,9 @@ The position of the top left corner of the native frame 
specifies the
 indicate that position for the various builds:
 
 @itemize @w{}
-@item (1) non-toolkit and terminal frames
+@item (1) non-toolkit, Haiku, and terminal frames
 
-@item (2) Lucid, Motif, MS-Windows, and Haiku frames
+@item (2) Lucid, Motif, and MS-Windows frames
 
 @item (3) GTK+ and NS frames
 @end itemize
@@ -1734,16 +1746,14 @@ fit will be clipped by the window manager.
 @item fullscreen
 This parameter specifies whether to maximize the frame's width, height
 or both.  Its value can be @code{fullwidth}, @code{fullheight},
-@code{fullboth}, or @code{maximized}.@footnote{On Haiku, setting
-@code{fullscreen} to @code{fullwidth} or @code{fullheight} has no
-effect.}  A @dfn{fullwidth} frame is as
+@code{fullboth}, or @code{maximized}.  A @dfn{fullwidth} frame is as
 wide as possible, a @dfn{fullheight} frame is as tall as possible, and
 a @dfn{fullboth} frame is both as wide and as tall as possible.  A
-@dfn{maximized} frame is like a ``fullboth'' frame, except that it usually
-keeps its title bar and the buttons for resizing
-and closing the frame.  Also, maximized frames typically avoid hiding
-any task bar or panels displayed on the desktop.  A ``fullboth'' frame,
-on the other hand, usually omits the title bar and occupies the entire
+@dfn{maximized} frame is like a ``fullboth'' frame, except that it
+usually keeps its title bar and the buttons for resizing and closing
+the frame.  Also, maximized frames typically avoid hiding any task bar
+or panels displayed on the desktop.  A ``fullboth'' frame, on the
+other hand, usually omits the title bar and occupies the entire
 available screen space.
 
 Full-height and full-width frames are more similar to maximized
@@ -3877,8 +3887,9 @@ in the buffer.  The default is to use the @code{arrow} 
(non-text)
 pointer style.
 @end defopt
 
-  When using X, you can specify what the @code{text} pointer style
-really looks like by setting the variable @code{x-pointer-shape}.
+  When using some window systems, you can specify what the @code{text}
+pointer style really looks like by setting the variable
+@code{x-pointer-shape}.
 
 @defvar x-pointer-shape
 This variable specifies the pointer shape to use ordinarily in the
@@ -3932,6 +3943,13 @@ overlay or a pair of markers stands for text in the 
overlay or between
 the markers.  The argument @var{data} may also be a vector of valid
 non-vector selection values.
 
+If @var{data} is a string, then its text properties can specify values
+used for individual data types.  For example, if @var{data} has a
+property named @code{text/uri-list}, then a call to
+@code{gui-get-selection} with the data type @code{text/uri-list} will
+result in the value of that property being used instead of @var{data}
+itself.
+
 This function returns @var{data}.
 @end deffn
 
@@ -4018,16 +4036,46 @@ amount of different data types on the clipboard.
 @section Drag and Drop
 @cindex drag and drop
 
+  When the user drops something from another application over Emacs,
+Emacs will try to insert any text and open any URL that was dropped.
+If text was dropped, then it will always be inserted at the location
+of the mouse pointer when the drop happened, or saved in the kill ring
+if insertion failed (which can happen if the buffer is read-only).  If
+it was an URL, then Emacs tries to call an appropriate handler
+function by first matching the URL against regexps defined in
+@code{dnd-protocol-alist}, and then against @code{browse-url-handlers}
+and @code{browse-url-default-handlers}, and failing that, inserting
+the URL as plain text.
+
+@defvar dnd-protocol-alist
+  This variable is a list of cons cells of the form
+@w{@code{(@var{pattern} . @var{action})}}.  @var{pattern} is a regexp
+that URLs are matched against after being dropped.  @var{action} is a
+function that is called with two arguments should a URL being dropped
+match @var{pattern}: the URL being dropped, and the action being
+performed for the drop (one of the symbols @code{copy}, @code{move},
+@code{link}, @code{private} or @code{ask}).
+@end defvar
+
+@cindex drag and drop, X
+@cindex drag and drop, other formats
+  Emacs implements drag-and-drop for text and URLs individually for
+each window system, and does not by default support the dropping of
+anything else.  Code that wishes to support the dropping of content
+types not supported by Emacs can utilize the X-specific interface
+described below:
+
 @vindex x-dnd-test-function
 @vindex x-dnd-known-types
-  When a user drags something from another application over Emacs, that other
-application expects Emacs to tell it if Emacs can handle the data that is
-dragged.  The variable @code{x-dnd-test-function} is used by Emacs to determine
-what to reply.  The default value is @code{x-dnd-default-test-function}
-which accepts drops if the type of the data to be dropped is present in
-@code{x-dnd-known-types}.  You can customize @code{x-dnd-test-function} and/or
-@code{x-dnd-known-types} if you want Emacs to accept or reject drops based
-on some other criteria.
+  When a user drags something from another application over Emacs on
+the X Window System, that other application expects Emacs to tell it
+if Emacs can handle the data that was dragged.  The variable
+@code{x-dnd-test-function} is used by Emacs to determine what to
+reply.  The default value is @code{x-dnd-default-test-function} which
+accepts drops if the type of the data to be dropped is present in
+@code{x-dnd-known-types}.  You can customize
+@code{x-dnd-test-function} and/or @code{x-dnd-known-types} if you want
+Emacs to accept or reject drops based on some other criteria.
 
 @vindex x-dnd-types-alist
   If you want to change the way Emacs handles drop of different types
@@ -4035,28 +4083,126 @@ or add a new type, customize @code{x-dnd-types-alist}. 
 This requires
 detailed knowledge of what types other applications use for drag and
 drop.
 
-@vindex dnd-protocol-alist
-@vindex browse-url-handlers
-@vindex browse-url-default-handlers
-  When an URL is dropped on Emacs it may be a file, but it may also be
-another URL type (https, etc.).  Emacs first checks
-@code{dnd-protocol-alist} to determine what to do with the URL@.  If
-there is no match there, Emacs looks for a match in
-@code{browse-url-handlers} and @code{browse-url-default-handlers}.  If
-still no match has been found, the text for the URL is inserted.  If
-you want to alter Emacs behavior, you can customize these variables.
+  Those data types are typically implemented as special data types an
+X selection provided by the other application can be converted to.
+They can either be the same data types that are typically accepted by
+@code{gui-set-selection}, or they can be MIME types, depending on the
+specific drag-n-drop protocol being used.  Plain text may be
+@code{"STRING"} or @code{"text/plain"}, for example.
 
 @cindex initiating drag-and-drop
   On capable window systems, Emacs also supports dragging contents
 from its frames to windows of other applications.
 
-@defun x-begin-drag targets &optional action frame return-frame 
allow-current-frame
+@cindex drop target, in drag-and-drop operations
+@defun dnd-begin-text-drag text &optional frame action allow-same-frame
+This function begins dragging text from @var{frame} to another program
+(known as the @dfn{drop target}), and returns the result of
+drag-and-drop operation when the text is dropped or the drag-and-drop
+operation is canceled.  @var{text} is the text that will be inserted
+by the drop target.
+
+@var{action} must be one of the symbols @code{copy} or @code{move},
+where @code{copy} means that @var{text} should be inserted by the drop
+target, and @code{move} means the same as @code{copy}, but in addition
+the caller may have to delete @var{text} from its source as explained
+below.
+
+@var{frame} is the frame where the mouse is currently held down, or
+@code{nil}, which means to use the selected frame.  This function may
+return immediately if no mouse buttons are held down, so it should be
+only called immediately after a @code{down-mouse-1} or similar event
+(@pxref{Mouse Events}), with @var{frame} set to the frame where that
+event was generated (@pxref{Click Events}).
+
+@var{allow-same-frame} specifies whether or not drops on top of
+@var{frame} itself are to be ignored.
+
+The return value specifies the action that the drop target actually
+performed, and optionally what the caller should do.  It can be one of
+the following symbols:
+
+@table @code
+@item copy
+The drop target inserted the dropped text.
+
+@item move
+The drop target inserted the dropped text, but in addition the caller
+should delete @var{text} from wherever it originated, such as its
+buffer.
+
+@item private
+The drop target performed some other unspecified action.
+
+@item nil
+The drag-and-drop operation was canceled.
+@end table
+
+@end defun
+
+@defun dnd-begin-file-drag file &optional frame action allow-same-frame
+This function begins dragging @var{file} from @var{frame} to another
+program, and returns the result of the drag-and-drop operation when
+the file is dropped or the drag-and-drop operation is canceled.
+
+If @var{file} is a remote file, then a temporary copy will be made.
+
+@var{action} must be one of the symbols @code{copy}, @code{move} or
+@code{link}, where @code{copy} means that @var{file} should be opened
+or copied by the drop target, @code{move} means the drop target should
+move the file to another location, and @code{link} means the drop
+target should create a symbolic link to @var{file}.  It is an error to
+specify @code{link} as the action if @var{file} is a remote file.
+
+@var{frame} and @var{allow-same-frame} have the same meaning as in
+@code{dnd-begin-text-drag}.
+
+The return value is the action that the drop target actually
+performed, which can be one of the following symbols:
+
+@table @code
+@item copy
+The drop target opened or copied @var{file} to a different location.
+
+@item move
+The drop target moved @var{file} to a different location.
+
+@item link
+The drop target (usually a file manager) created a symbolic link to
+@var{file}.
+
+@item private
+The drop target performed some other unspecified action.
+
+@item nil
+The drag-and-drop operation was canceled.
+@end table
+
+@end defun
+
+@defun dnd-begin-drag-files files &optional frame action allow-same-frame
+This function is like @code{dnd-begin-file-drag}, except that
+@var{files} is a list of files.  If the drop target doesn't support
+dropping multiple files, then the first file will be used instead.
+@end defun
+
+@cindex initiating drag-and-drop, low-level
+  The high-level interfaces described above are implemented on top of
+a lower-level primitive.  If you need to drag content other than files
+or text, use the low-level interface @code{x-begin-drag}
+instead.  However, using it will require detailed knowledge of the
+data types and actions used by the programs to transfer content via
+drag-and-drop on each platform you want to support.
+
+@defun x-begin-drag targets &optional action frame return-frame 
allow-current-frame follow-tooltip
 This function begins a drag from @var{frame}, and returns when the
 drag-and-drop operation ends, either because the drop was successful,
 or because the drop was rejected.  The drop occurs when all mouse
 buttons are released on top of an X window other than @var{frame} (the
 @dfn{drop target}), or any X window if @var{allow-current-frame} is
-non-@code{nil}.
+non-@code{nil}.  If no mouse buttons are held down when the
+drag-and-drop operation begins, this function may immediately return
+@code{nil}.
 
 @var{targets} is a list of strings describing selection targets, much
 like the @var{data-type} argument to @code{gui-get-selection}, that
@@ -4085,6 +4231,12 @@ want to treat dragging content from one frame to another 
specially,
 while also being able to drag content to other programs, but it is not
 guaranteed to work on all systems and with all window managers.
 
+If @var{follow-tooltip} is non-@code{nil}, the position of any tooltip
+(such as one shown by @code{tooltip-show}) will follow the location of
+the mouse pointer whenever it moves during the drag-and-drop
+operation.  The tooltip will be hidden once all mouse buttons are
+released.
+
 If the drop was rejected or no drop target was found, this function
 returns @code{nil}.  Otherwise, it returns a symbol describing the
 action the target chose to perform, which can differ from @var{action}
@@ -4093,6 +4245,10 @@ is also a valid return value in addition to 
@code{XdndActionCopy} and
 @code{XdndActionMove}; it means that the drop target chose to perform
 an unspecified action, and no further processing is required by the
 caller.
+
+The caller must cooperate with the target to fully perform the action
+chosen by the target.  For example, callers should delete the buffer
+text that was dragged if this function returns @code{XdndActionMove}.
 @end defun
 
 @node Color Names
diff --git a/doc/lispref/functions.texi b/doc/lispref/functions.texi
index 2f386eaa47..e3de6009e9 100644
--- a/doc/lispref/functions.texi
+++ b/doc/lispref/functions.texi
@@ -146,7 +146,12 @@ function:
 This function returns @code{t} if @var{object} is any kind of
 function, i.e., can be passed to @code{funcall}.  Note that
 @code{functionp} returns @code{t} for symbols that are function names,
-and returns @code{nil} for special forms.
+and returns @code{nil} for symbols that are macros or special forms.
+
+If @var{object} is not a function, this function ordinarily returns
+@code{nil}.  However, the representation of function objects is
+complicated, and for efficiency reasons in rare cases this function
+can return @code{t} even when @var{object} is not a function.
 @end defun
 
   It is also possible to find out how many arguments an arbitrary
@@ -1712,6 +1717,7 @@ ways to do it.  The added function is also called a piece 
of @emph{advice}.
 * Advising Named Functions::    Advising named functions.
 * Advice Combinators::          Ways to compose advice.
 * Porting Old Advice::          Adapting code using the old defadvice.
+* Advice and Byte Code::        Not all functions can be advised.
 @end menu
 
 @node Core Advising Primitives
@@ -2133,6 +2139,37 @@ changing @code{ad-return-value}, whereas new 
@code{:after} advice cannot, so
 when porting such old @code{after} advice, you'll need to turn it into new
 @code{:around} or @code{:filter-return} advice instead.
 
+@c This is its own node because we link to it from *Help* buffers.
+@node Advice and Byte Code
+@subsection Advice and Byte Code
+@cindex compiler macros, advising
+@cindex @code{byte-compile} and  @code{byte-optimize}, advising
+
+  Not all functions can be reliably advised.  The byte compiler may
+choose to replace a call to a function with a sequence of instructions
+that doesn't call the function you were interested in altering.
+
+This usually happens due to one of the three following mechanisms:
+
+@table @asis
+@item @code{byte-compile} properties
+If a function's symbol has a @code{byte-compile} property, that
+property will be used instead of the symbol's function definition.
+@xref{Compilation Functions}.
+
+@item @code{byte-optimize} properties
+If a function's symbol has a @code{byte-optimize} property, the byte
+compiler may rewrite the function arguments, or decide to use a
+different function altogether.
+
+@item @code{compiler-macro} declare forms
+A function can have a special @code{compiler-macro} @code{declare}
+form in its definition (@pxref{Declare Form}) that defines an
+@dfn{expander} to call when compiling the function.  The expander
+could then cause the produced byte-code not to call the original
+function.
+@end table
+
 @node Obsolete Functions
 @section Declaring Functions Obsolete
 @cindex obsolete functions
diff --git a/doc/lispref/help.texi b/doc/lispref/help.texi
index d53bfad8e9..463039c5a0 100644
--- a/doc/lispref/help.texi
+++ b/doc/lispref/help.texi
@@ -345,7 +345,10 @@ stands for a key sequence @var{KEYSEQ}, which will use the 
same face
 as a command substitution.  This should be used only when a key
 sequence has no corresponding command, for example when it is read
 directly with @code{read-key-sequence}.  It must be a valid key
-sequence according to @code{key-valid-p}.
+sequence according to @code{key-valid-p}.  It can also be used with
+command names, like @samp{\`M-x foo'}, where you want this to be
+fontified like a keyboard sequence, but you want to inhibit
+translating it into a key sequence like @samp{\[foo]} does.
 
 @item `
 (grave accent) stands for a left quote.
@@ -362,6 +365,10 @@ depending on the value of @code{text-quoting-style}.
 quotes the following character and is discarded; thus, @samp{\=`} puts
 @samp{`} into the output, @samp{\=\[} puts @samp{\[} into the output,
 and @samp{\=\=} puts @samp{\=} into the output.
+
+@item \+
+This indicates that the symbol directly following should not be marked
+as link in the @file{*Help*} buffer.
 @end table
 
 @strong{Please note:} Each @samp{\} must be doubled when written in a
@@ -386,7 +393,7 @@ quotes.  You can customize it freely according to your 
personal
 preference.
 @end defopt
 
-@defun substitute-command-keys string &optional no-face
+@defun substitute-command-keys string &optional no-face include-menus
 @vindex help-key-binding@r{ (face)}
 This function scans @var{string} for the above special sequences and
 replaces them by what they stand for, returning the result as a string.
@@ -436,6 +443,9 @@ RET             minibuffer-complete-and-exit
 C-g             abort-recursive-edit
 "
 
+The keymap description will normally exclude menu items, but if
+@var{include-menus} is non-@code{nil}, include them.
+
 @group
 (substitute-command-keys
    "To abort a recursive edit from the minibuffer, type \
diff --git a/doc/lispref/loading.texi b/doc/lispref/loading.texi
index 68cd74c7d1..8a2bb5fa2d 100644
--- a/doc/lispref/loading.texi
+++ b/doc/lispref/loading.texi
@@ -529,7 +529,7 @@ primitive for autoloading; any Lisp program can call 
@code{autoload} at
 any time.  Magic comments are the most convenient way to make a function
 autoload, for packages installed along with Emacs.  These comments do
 nothing on their own, but they serve as a guide for the command
-@code{update-file-autoloads}, which constructs calls to @code{autoload}
+@code{loaddefs-generate}, which constructs calls to @code{autoload}
 and arranges to execute them when Emacs is built.
 
 @defun autoload function filename &optional docstring interactive type
@@ -627,22 +627,19 @@ subroutines not loaded successfully because they come 
later in the file.
 macro, then an error is signaled with data @code{"Autoloading failed to
 define function @var{function-name}"}.
 
-@findex update-file-autoloads
-@findex make-directory-autoloads
+@findex loaddefs-generate
 @cindex magic autoload comment
 @cindex autoload cookie
 @anchor{autoload cookie}
   A magic autoload comment (often called an @dfn{autoload cookie})
 consists of @samp{;;;###autoload}, on a line by itself,
 just before the real definition of the function in its
-autoloadable source file.  The command @kbd{M-x update-file-autoloads}
+autoloadable source file.  The function @code{loaddefs-generate}
 writes a corresponding @code{autoload} call into @file{loaddefs.el}.
 (The string that serves as the autoload cookie and the name of the
-file generated by @code{update-file-autoloads} can be changed from the
+file generated by @code{loaddefs-generate} can be changed from the
 above defaults, see below.)
 Building Emacs loads @file{loaddefs.el} and thus calls @code{autoload}.
-@kbd{M-x make-directory-autoloads} is even more powerful; it updates
-autoloads for all files in the current directory.
 
   The same magic comment can copy any kind of form into
 @file{loaddefs.el}.  The form following the magic comment is copied
@@ -675,7 +672,7 @@ and @code{define-global-minor-mode}.
 @emph{without} executing it when the file itself is loaded.  To do this,
 write the form @emph{on the same line} as the magic comment.  Since it
 is in a comment, it does nothing when you load the source file; but
-@kbd{M-x update-file-autoloads} copies it to @file{loaddefs.el}, where
+@code{loaddefs-generate} copies it to @file{loaddefs.el}, where
 it is executed while building Emacs.
 
   The following example shows how @code{doctor} is prepared for
@@ -728,11 +725,11 @@ corresponding autoload calls written into a file whose 
name is
 different from the default @file{loaddefs.el}.  Emacs provides two
 variables to control this:
 
-@defvar generate-autoload-cookie
-The value of this variable should be a string whose syntax is a Lisp
-comment.  @kbd{M-x update-file-autoloads} copies the Lisp form that
-follows the cookie into the autoload file it generates.  The default
-value of this variable is @code{";;;###autoload"}.
+@defvar lisp-mode-autoload-regexp
+The value of this constant is a regexp that matches autoload cookies.
+@code{loaddefs-generate} copies the Lisp form that follows the
+cookie into the autoload file it generates.  This will match comments
+like like @samp{;;;###autoload} and @samp{;;;###calc-autoload}.
 @end defvar
 
 @defvar generated-autoload-file
@@ -769,7 +766,7 @@ contain definitions matching the prefix being completed.  
The variable
 @code{definition-prefixes} holds a hashtable which maps a prefix to
 the corresponding list of files to load for it.  Entries to this
 mapping are added by calls to @code{register-definition-prefixes}
-which are generated by @code{update-file-autoloads}
+which are generated by @code{loaddefs-generate}
 (@pxref{Autoload}).  Files which don't contain any definitions worth
 loading (test files, for examples), should set
 @code{autoload-compute-prefixes} to @code{nil} as a file-local
diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi
index be81b5b3fb..f2adc01c8f 100644
--- a/doc/lispref/minibuf.texi
+++ b/doc/lispref/minibuf.texi
@@ -309,6 +309,22 @@ The optional argument @var{history}, if non-@code{nil}, is 
a symbol
 specifying a minibuffer history list to use (@pxref{Minibuffer
 History}).  If it is omitted or @code{nil}, the history list defaults
 to @code{regexp-history}.
+
+@cindex @code{case-fold}, text property
+@findex read-regexp-case-fold-search
+The user can use the @kbd{M-c} command to indicate whether case
+folding should be on or off.  If the user has used this command, the
+returned string will have the text property @code{case-fold} set to
+either @code{fold} or @code{inhibit-fold}.  It is up to the caller of
+@code{read-regexp} to actually use this value, and the convenience
+function @code{read-regexp-case-fold-search} is provided for that.  A
+typical usage pattern here might look like:
+
+@lisp
+(let* ((regexp (read-regexp "Search for: "))
+       (case-fold-search (read-regexp-case-fold-search regexp)))
+  (re-search-forward regexp))
+@end lisp
 @end defun
 
 @defopt read-regexp-defaults-function
@@ -1121,6 +1137,11 @@ completion command (i.e., one of the commands in
 @code{minibuffer-confirm-exit-commands}) and the resulting input is
 not an element of @var{collection}.  @xref{Completion Commands}.
 
+@item
+If a function, it is called with the input as the only argument.  The
+function should return a non-@code{nil} value if the input is
+acceptable.
+
 @item
 Any other value of @var{require-match} behaves like @code{t}, except
 that the exit commands won't exit if it performs completion.
diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi
index c6ea74324b..2e40cb25ef 100644
--- a/doc/lispref/modes.texi
+++ b/doc/lispref/modes.texi
@@ -2575,7 +2575,23 @@ mode line feature, except that it's controlled by
 This variable, local in every buffer, specifies how to display the
 header line, for windows displaying the buffer.  The format of the value
 is the same as for @code{mode-line-format} (@pxref{Mode Line Data}).
-It is normally @code{nil}, so that ordinary buffers have no header line.
+It is normally @code{nil}, so that ordinary buffers have no header
+line.
+
+@findex header-line-indent-mode
+If @code{display-line-numbers-mode} is used, and you want the header
+line to be indented by the same amount as the buffer contents, you can
+use the @code{header-line-indent-mode} minor mode.  This minor mode
+keeps the @code{header-line-indent} variable updated, so that you can
+say something like:
+
+@lisp
+(setq header-line-format
+      `("" header-line-format ,my-header-line))
+@end lisp
+
+This can be useful if you're displaying columnar data, and the header
+line should align with that data in the buffer.
 @end defvar
 
 @defun window-header-line-height &optional window
@@ -3652,6 +3668,10 @@ the value is @code{nil}, Font Lock will call 
@code{jit-lock-register}
 (@pxref{Other Font Lock Variables}) to set up for automatic
 refontification of buffer text following a modified line to reflect
 the new syntactic context due to the change.
+
+To use only syntactic fontification, this variable should
+be non-@code{nil}, while @code{font-lock-keywords} should be set to
+@code{nil} (@pxref{Font Lock Basics}).
 @end defvar
 
 @defvar font-lock-syntax-table
diff --git a/doc/lispref/nonascii.texi b/doc/lispref/nonascii.texi
index d7d25dc36a..6dc23637a7 100644
--- a/doc/lispref/nonascii.texi
+++ b/doc/lispref/nonascii.texi
@@ -280,11 +280,12 @@ to the codepoints @code{#x3FFF80} through 
@code{#x3FFFFF}, inclusive
 
 @defun string-to-unibyte string
 This function returns a unibyte string containing the same sequence of
-characters as @var{string}.  It signals an error if @var{string}
-contains a non-@acronym{ASCII} character.  If @var{string} is a
-unibyte string, it is returned unchanged.  Use this function for
-@var{string} arguments that contain only @acronym{ASCII} and eight-bit
-characters.
+characters as @var{string}.  If @var{string} is a unibyte string, it
+is returned unchanged.  Otherwise, @acronym{ASCII} characters and
+characters in the @code{eight-bit} charset are converted to their
+corresponding byte values.  Use this function for @var{string}
+arguments that contain only @acronym{ASCII} and eight-bit characters;
+the function signals an error if any other characters are encountered.
 @end defun
 
 @defun byte-to-string byte
diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi
index 07caaa2a07..1bae192455 100644
--- a/doc/lispref/objects.texi
+++ b/doc/lispref/objects.texi
@@ -178,6 +178,12 @@ files.
 Skip the next @samp{N} characters (@pxref{Comments}).  This is used in
 byte-compiled files, and is not meant to be used in Emacs Lisp source
 files.
+
+@item #f
+Indicates that the following form isn't readable by the Emacs Lisp
+reader.  This is only in text for display purposes (when that would
+look prettier than alternative ways of indicating an unreadable form)
+and will never appear in any Lisp file.
 @end table
 
 
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 9df708532d..11a0d02338 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -329,10 +329,10 @@ file will not inhibit the message for someone else.
 @end defopt
 
 @defopt initial-scratch-message
-This variable, if non-@code{nil}, should be a string, which is
-treated as documentation to be
-inserted into the @file{*scratch*} buffer when Emacs starts up.  If it
-is @code{nil}, the @file{*scratch*} buffer is empty.
+This variable, if non-@code{nil}, should be a string, which is treated
+as documentation to be inserted into the @file{*scratch*} buffer when
+Emacs starts up or when that buffer is recreated.  If it is
+@code{nil}, the @file{*scratch*} buffer is empty.
 @end defopt
 
 @noindent
@@ -1649,8 +1649,8 @@ this default may change in future Emacs releases, so 
callers requiring
 a particular form should specify @var{form}.
 
 @strong{Common Lisp Note:} Common Lisp has different meanings for
-@var{dow} and @var{utcoff}, and its @var{second} is an integer between
-0 and 59 inclusive.
+@var{dow}, @code{dst} and @var{utcoff}, and its @var{second} is an
+integer between 0 and 59 inclusive.
 
 To access (or alter) the elements in the calendrical information, the
 @code{decoded-time-second}, @code{decoded-time-minute},
diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi
index 18f446735b..8c8f8fd6b2 100644
--- a/doc/lispref/processes.texi
+++ b/doc/lispref/processes.texi
@@ -1011,16 +1011,18 @@ terminated (due to calling @code{exit} or to a signal). 
 If it is
 they exit.
 @end defopt
 
-@defun delete-process process
+@defun delete-process &optional process
 This function deletes a process, killing it with a @code{SIGKILL}
 signal if the process was running a program.  The argument may be a
 process, the name of a process, a buffer, or the name of a buffer.  (A
 buffer or buffer-name stands for the process that
-@code{get-buffer-process} returns.)  Calling @code{delete-process} on
-a running process terminates it, updates the process status, and runs
-the sentinel immediately.  If the process has already terminated,
-calling @code{delete-process} has no effect on its status, or on the
-running of its sentinel (which will happen sooner or later).
+@code{get-buffer-process} returns, and a missing or @code{nil}
+@var{process} means that the current buffer's process should be
+killed.)  Calling @code{delete-process} on a running process
+terminates it, updates the process status, and runs the sentinel
+immediately.  If the process has already terminated, calling
+@code{delete-process} has no effect on its status, or on the running
+of its sentinel (which will happen sooner or later).
 
 If the process object represents a network, serial, or pipe
 connection, its status changes to @code{closed}; otherwise, it changes
@@ -3468,20 +3470,67 @@ type values:
 @itemx byte
 Unsigned byte, with length 1.
 
-@item uint @var{bitlen}
-Unsigned integer in network byte order, with @var{bitlen} bits.
+@item uint @var{bitlen} &optional @var{le}
+Unsigned integer in network byte order (big-endian), with @var{bitlen} bits.
 @var{bitlen} has to be a multiple of 8.
+If @var{le} is non-@code{nil}, then use little-endian byte order.
 
-@item uintr @var{bitlen}
-Unsigned integer in little endian order, with @var{bitlen} bits.
+@item sint @var{bitlen} @var{le}
+Signed integer in network byte order (big-endian), with @var{bitlen} bits.
 @var{bitlen} has to be a multiple of 8.
+If @var{le} is non-@code{nil}, then use little-endian byte order.
 
 @item str @var{len}
-String of bytes of length @var{len}.
+Unibyte string (@pxref{Text Representations}) of length @var{len} bytes.
+When packing, the first @var{len} bytes of the input string are copied
+to the packed output.  If the input string is shorter than @var{len},
+the remaining bytes will be null (zero) unless a pre-allocated string
+was provided to @code{bindat-pack}, in which case the remaining bytes
+are left unmodified.  If the input string is multibyte with only ASCII
+and @code{eight-bit} characters, it is converted to unibyte before it
+is packed; other multibyte strings signal an error.  When unpacking,
+any null bytes in the packed input string will appear in the unpacked
+output.
 
 @item strz &optional @var{len}
-Zero-terminated string of bytes, can be of arbitrary length or in a fixed-size
-field with length @var{len}.
+If @var{len} is not provided: Variable-length null-terminated unibyte
+string (@pxref{Text Representations}).  When packing, the entire input
+string is copied to the packed output.  The following byte will be
+null (zero) unless a pre-allocated string was provided to
+@code{bindat-pack}, in which case that byte is left unmodified.  The
+length of the packed output is the length of the input string plus one
+(for the null terminator).  The input string must not contain any null
+bytes.  If the input string is multibyte with only ASCII and
+@code{eight-bit} characters, it is converted to unibyte before it is
+packed; other multibyte strings signal an error.  When unpacking, the
+resulting string contains all bytes up to (but excluding) the null
+byte.
+
+@quotation Caution
+If a pre-allocated string is provided to @code{bindat-pack}, the
+packed output will not be properly null-terminated unless the
+pre-allocated string already has a null byte at the appropriate
+location.
+@end quotation
+
+If @var{len} is provided: @code{strz} behaves the same as @code{str}
+with one difference: When unpacking, the first null byte encountered
+in the packed string and all subsequent bytes are excluded from the
+unpacked result.
+
+@quotation Caution
+The packed output will not be null-terminated unless one of the
+following is true:
+@itemize
+@item
+The input string is shorter than @var{len} bytes and either no pre-allocated
+string was provided to @code{bindat-pack} or the appropriate byte in
+the pre-allocated string was already null.
+@item
+The input string contains a null byte within the first @var{len}
+bytes.
+@end itemize
+@end quotation
 
 @item vec @var{len} [@var{type}]
 Vector of @var{len} elements.  The type of the elements is given by
diff --git a/doc/lispref/searching.texi b/doc/lispref/searching.texi
index c9828f9c86..21a2c6c51e 100644
--- a/doc/lispref/searching.texi
+++ b/doc/lispref/searching.texi
@@ -549,12 +549,12 @@ can act.  It is poor practice to depend on this behavior; 
quote the
 special character anyway, regardless of where it appears.
 
 As a @samp{\} is not special inside a character alternative, it can
-never remove the special meaning of @samp{-} or @samp{]}.  So you
-should not quote these characters when they have no special meaning
-either.  This would not clarify anything, since backslashes can
-legitimately precede these characters where they @emph{have} special
-meaning, as in @samp{[^\]} (@code{"[^\\]"} for Lisp string syntax),
-which matches any single character except a backslash.
+never remove the special meaning of @samp{-}, @samp{^} or @samp{]}.
+You should not quote these characters when they have no special
+meaning.  This would not clarify anything, since backslashes
+can legitimately precede these characters where they @emph{have}
+special meaning, as in @samp{[^\]} (@code{"[^\\]"} for Lisp string
+syntax), which matches any single character except a backslash.
 
 In practice, most @samp{]} that occur in regular expressions close a
 character alternative and hence are special.  However, occasionally a
@@ -823,21 +823,22 @@ the characters that stand for them.
 matches any character whose syntax is not @var{code}.
 
 @cindex category, regexp search for
-@item \c@var{c}
-matches any character whose category is @var{c}.  Here @var{c} is a
-character that represents a category: thus, @samp{c} for Chinese
-characters or @samp{g} for Greek characters in the standard category
-table.  You can see the list of all the currently defined categories
-with @kbd{M-x describe-categories @key{RET}}.  You can also define
-your own categories in addition to the standard ones using the
-@code{define-category} function (@pxref{Categories}).
-
-@item \C@var{c}
-matches any character whose category is not @var{c}.
+@item \c@var{code}
+matches any character whose category is @var{code}.  Here @var{code}
+is a character that represents a category: for example, in the standard
+category table, @samp{c} stands for Chinese characters and @samp{g}
+stands for Greek characters.  You can see the list of all the
+currently defined categories with @w{@kbd{M-x describe-categories
+@key{RET}}}.  You can also define your own categories in addition to
+the standard ones using the @code{define-category} function
+(@pxref{Categories}).
+
+@item \C@var{code}
+matches any character whose category is not @var{code}.
 @end table
 
   The following regular expression constructs match the empty string---that is,
-they don't use up any characters---but whether they match depends on the
+they don't consume any characters---but whether they match depends on the
 context.  For all, the beginning and end of the accessible portion of
 the buffer are treated as if they were the actual beginning and end of
 the buffer.
diff --git a/doc/lispref/streams.texi b/doc/lispref/streams.texi
index 781a50f5c4..bba1dc2eee 100644
--- a/doc/lispref/streams.texi
+++ b/doc/lispref/streams.texi
@@ -21,6 +21,7 @@ reading) or where to put it (if printing).
 * Output Streams::    Various data types that can be used as output streams.
 * Output Functions::  Functions to print Lisp objects as text.
 * Output Variables::  Variables that control what the printing functions do.
+* Output Overrides::  Overriding output variables.
 @end menu
 
 @node Streams Intro
@@ -634,7 +635,7 @@ characters are used.  @code{print} returns @var{object}.  
For example:
 @end example
 @end defun
 
-@defun prin1 object &optional stream
+@defun prin1 object &optional stream overrides
 This function outputs the printed representation of @var{object} to
 @var{stream}.  It does not print newlines to separate output as
 @code{print} does, but it does use quoting characters just like
@@ -649,6 +650,10 @@ This function outputs the printed representation of 
@var{object} to
      @result{} " came back"
 @end group
 @end example
+
+If @var{overrides} is non-@code{nil}, it should either be @code{t}
+(which tells @code{prin1} to use the defaults for all printer related
+variables), or a list of settings.  @xref{Output Overrides}, for details.
 @end defun
 
 @defun princ object &optional stream
@@ -694,7 +699,7 @@ newline character first, which enables you to display 
incomplete
 lines.
 @end defun
 
-@defun prin1-to-string object &optional noescape
+@defun prin1-to-string object &optional noescape overrides
 @cindex object to string
 This function returns a string containing the text that @code{prin1}
 would have printed for the same argument.
@@ -708,6 +713,10 @@ would have printed for the same argument.
 (prin1-to-string (mark-marker))
      @result{} "#<marker at 2773 in strings.texi>"
 @end group
+
+If @var{overrides} is non-@code{nil}, it should either be @code{t}
+(which tells @code{prin1} to use the defaults for all printer related
+variables), or a list of settings.  @xref{Output Overrides}, for details.
 @end example
 
 If @var{noescape} is non-@code{nil}, that inhibits use of quoting
@@ -971,3 +980,84 @@ Letter, Number, Punctuation, Symbol and Private-use
 (@pxref{Character Properties}), as well as the control characters
 having their own escape syntax such as newline.
 @end defvar
+
+@node Output Overrides
+@section Overriding Output Variables
+@cindex overrides, in output functions
+@cindex output variables, overriding
+
+The previous section (@pxref{Output Functions}) lists the numerous
+variables that control how the Emacs Lisp printer formats data for
+outputs.  These are generally available for users to change, but
+sometimes you want to output data in the default format, or override
+the user settings in some other way.  For instance, if you're storing
+Emacs Lisp data in a file, you don't want that data to be shortened by
+a @code{print-length} setting.
+
+The @code{prin1} and @code{prin1-to-string} functions therefore have
+an optional @var{overrides} argument.  This argument can either be
+@code{t} (which means that all printing variables should be reset to
+the default values), or a list of settings for some of the variables.
+Each element in the list can be either @code{t} (which means ``reset
+to defaults'', and will usually be the first element of the list), or
+a pair whose @code{car} is a symbol that stands for an output variable
+and whose @code{cdr} is the value for that variable.
+
+For instance, this prints using nothing but defaults:
+
+@lisp
+(prin1 object nil t)
+@end lisp
+
+This prints @var{object} using the current printing settings, but
+overrides the value of @code{print-length} to be 5:
+
+@lisp
+(prin1 object nil '((length . 5)))
+@end lisp
+
+And finally, this prints @var{object} using only default settings, but
+with @code{print-length} bound to 5:
+
+@lisp
+(prin1 object nil '(t (length . 5)))
+@end lisp
+
+Below is a list of symbols that can be used, and which variables they
+map to:
+
+@table @code
+@item length
+This overrides @code{print-length}.
+@item level
+This overrides @code{print-level}.
+@item circle
+This overrides @code{print-circle}.
+@item quoted
+This overrides @code{print-quoted}.
+@item escape-newlines
+This overrides @code{print-escape-newlines}.
+@item escape-control-characters
+This overrides @code{print-escape-control-characters}.
+@item escape-nonascii
+This overrides @code{print-escape-nonascii}.
+@item escape-multibyte
+This overrides @code{print-escape-multibyte}.
+@item charset-text-property
+This overrides @code{print-charset-text-property}.
+@item unreadeable-function
+This overrides @code{print-unreadable-function}.
+@item gensym
+This overrides @code{print-gensym}.
+@item continuous-numbering
+This overrides @code{print-continuous-numbering}.
+@item number-table
+This overrides @code{print-number-table}.
+@item float-format
+This overrides @code{float-output-format}.
+@item integers-as-characters
+This overrides @code{print-integers-as-characters}.
+@end table
+
+In the future, more overrides may be offered that do not map directly
+to a variable, but can only be used via this parameter.
diff --git a/doc/lispref/strings.texi b/doc/lispref/strings.texi
index 5e41f8d57b..addf195fad 100644
--- a/doc/lispref/strings.texi
+++ b/doc/lispref/strings.texi
@@ -443,12 +443,12 @@ strings.
 @end defun
 
 @defun string-pad string length &optional padding start
-Pad @var{string} to the be of @var{length} using @var{padding} as the
-padding character (defaulting to the space character).  If
-@var{string} is shorter than @var{length}, no padding is done.  If
-@var{start} is @code{nil} (or not present), the padding is done to the
-end of the string, and if it's non-@code{nil}, to the start of the
-string.
+Pad @var{string} to be of the given @var{length} using @var{padding}
+as the padding character.  @var{padding} defaults to the space
+character.  If @var{string} is longer than @var{length}, no padding is
+done.  If @var{start} is @code{nil} or omitted, the padding is
+appended to the characters of @var{string}, and if it's
+non-@code{nil}, the padding is prepended to @var{string}'s characters.
 @end defun
 
 @defun string-chop-newline string
@@ -464,23 +464,29 @@ Remove the final newline, if any, from @var{string}.
 described in this section.  @xref{Mutability}.
 
   The most basic way to alter the contents of an existing string is with
-@code{aset} (@pxref{Array Functions}).  @code{(aset @var{string}
-@var{idx} @var{char})} stores @var{char} into @var{string} at index
-@var{idx}.  Each character occupies one or more bytes, and if @var{char}
-needs a different number of bytes from the character already present at
-that index, @code{aset} signals an error.
+@code{aset} (@pxref{Array Functions}).  @w{@code{(aset @var{string}
+@var{idx} @var{char})}} stores @var{char} into @var{string} at character
+index @var{idx}.  It will automatically convert a pure-@acronym{ASCII}
+@var{string} to a multibyte string (@pxref{Text Representations}) if
+needed, but we recommend to always make sure @var{string} is multibyte
+(e.g., by using @code{string-to-multibyte}, @pxref{Converting
+Representations}), if @var{char} is a non-@acronym{ASCII} character, not
+a raw byte.
 
   A more powerful function is @code{store-substring}:
 
 @defun store-substring string idx obj
-This function alters part of the contents of the string @var{string}, by
-storing @var{obj} starting at index @var{idx}.  The argument @var{obj}
-may be either a character or a (smaller) string.
-
-Since it is impossible to change the length of an existing string, it is
-an error if @var{obj} doesn't fit within @var{string}'s actual length,
-or if any new character requires a different number of bytes from the
-character currently present at that point in @var{string}.
+This function alters part of the contents of the specified @var{string},
+by storing @var{obj} starting at character index @var{idx}.  The
+argument @var{obj} may be either a character (in which case the function
+behaves exactly as @code{aset}) or a (smaller) string.  If @var{obj}
+is a multibyte string, we recommend to make sure @var{string} is also
+multibyte, even if it's pure-@acronym{ASCII}.
+
+Since it is impossible to change the number of characters in an
+existing string, it is en error if @var{obj} consists of more
+characters than would fit in @var{string} starting at character index
+@var{idx}.
 @end defun
 
   To clear out a string that contained a password, use
@@ -856,9 +862,7 @@ between 2 and 16 (inclusive), and integers are converted in 
that base.
 If @var{base} is @code{nil}, then base ten is used.  Floating-point
 conversion only works in base ten; we have not implemented other
 radices for floating-point numbers, because that would be much more
-work and does not seem useful.  If @var{string} looks like an integer
-but its value is too large to fit into a Lisp integer,
-@code{string-to-number} returns a floating-point result.
+work and does not seem useful.
 
 The parsing skips spaces and tabs at the beginning of @var{string},
 then reads as much of @var{string} as it can interpret as a number in
@@ -1350,7 +1354,7 @@ given width, if specified.
 This flag converts the substituted text to upper case (@pxref{Case
 Conversion}).
 
-@item _
+@item _@r{ (underscore)}
 This flag converts the substituted text to lower case (@pxref{Case
 Conversion}).
 @end table
diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi
index a1db715db6..622f03d2a8 100644
--- a/doc/lispref/text.texi
+++ b/doc/lispref/text.texi
@@ -1034,6 +1034,9 @@ text in @var{string} according to the @code{yank-handler} 
text
 property, as well as the variables @code{yank-handled-properties} and
 @code{yank-excluded-properties} (see below), before inserting the
 result into the current buffer.
+
+@var{string} will be run through @code{yank-transform-functions} (see
+below) before inserting.
 @end defun
 
 @defun insert-buffer-substring-as-yank buf &optional start end
@@ -1108,6 +1111,23 @@ or specifying key bindings.  It takes effect after
 @code{yank-handled-properties}.
 @end defopt
 
+@defvar yank-transform-functions
+This variable is a list of functions.  Each function is called (in
+order) with the string to be yanked as the argument, and should
+return a (possibly transformed) string.  This variable can be set
+globally, but can also be used to create new commands that are
+variations on @code{yank}.  For instance, to create a command that
+works like @code{yank}, but cleans up whitespace before inserting, you
+could say something like:
+
+@lisp
+(defun yank-with-clean-whitespace ()
+  (interactive)
+  (let ((yank-transform-functions
+        '(string-clean-whitespace)))
+    (call-interactively #'yank)))
+@end lisp
+@end defvar
 
 @node Yank Commands
 @subsection Functions for Yanking
diff --git a/doc/lispref/tips.texi b/doc/lispref/tips.texi
index 061a5d672e..30146a89eb 100644
--- a/doc/lispref/tips.texi
+++ b/doc/lispref/tips.texi
@@ -694,26 +694,24 @@ starting double-quote is not part of the string!
 @cindex curly quotes
 @cindex curved quotes
 When a documentation string refers to a Lisp symbol, write it as it
-would be printed (which usually means in lower case), surrounding it
-with curved single quotes (@t{‘..’}).  There are two exceptions: write
-@code{t} and @code{nil} without surrounding punctuation.  For example:
+would be printed (which usually means in lower case), with a grave
+accent @samp{`} before and apostrophe @samp{'} after it.  There are
+two exceptions: write @code{t} and @code{nil} without surrounding
+punctuation.  For example:
 
 @example
- CODE can be ‘lambda’, nil, or t.
+ CODE can be `lambda', nil, or t.
 @end example
 
-@noindent
-@xref{Quotation Marks,,, emacs, The GNU Emacs Manual}, for how to
-enter curved single quotes.
-
-Documentation strings can also use an older single-quoting convention,
-which quotes symbols with grave accent @t{`} and apostrophe
-@t{'}: @t{`like-this'} rather than @t{‘like-this’}.  This
-older convention was designed for now-obsolete displays in which grave
-accent and apostrophe were mirror images.
-Documentation using this convention is converted to the user's
-preferred format when it is copied into a help buffer.  @xref{Keys in
-Documentation}.
+Note that when Emacs displays these doc strings, Emacs will usually
+display @samp{`} (grave accent) as @samp{‘} (left single quotation
+mark) and @samp{'} (apostrophe) as @samp{’} (right single quotation
+mark), if the display supports displaying these characters.
+@xref{Keys in Documentation}.  (Some previous versions of this section
+recommended using the non-@acronym{ASCII} single quotation marks
+directly in doc strings, but this is now discouraged, since that leads
+to broken help string displays on terminals that don't support
+displaying those characters.)
 
 @cindex hyperlinks in documentation strings
 Help mode automatically creates a hyperlink when a documentation string
diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index f0e3f337a6..c29547d00d 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -527,10 +527,11 @@ If @var{symbol} has a buffer-local binding in the current 
buffer,
 rather than the buffer-local binding.  It sets the default value if
 the default value is void.  @xref{Buffer-Local Variables}.
 
-If @var{symbol} is already lexically bound (e.g., if the @code{defvar}
-form occurs in a @code{let} form with lexical binding enabled), then
-@code{defvar} sets the dynamic value.  The lexical binding remains in
-effect until its binding construct exits.  @xref{Variable Scoping}.
+If @var{symbol} is already let bound (e.g., if the @code{defvar}
+form occurs in a @code{let} form), then @code{defvar} sets the toplevel
+default value, like @code{set-default-toplevel-value}.
+The let binding remains in effect until its binding construct exits.
+@xref{Variable Scoping}.
 
 @cindex @code{eval-defun}, and @code{defvar} forms
 @cindex @code{eval-last-sexp}, and @code{defvar} forms
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 97908bea00..704ed30366 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -759,15 +759,6 @@ column and total width (@pxref{Coordinates and Windows}).  
The optional
 argument @var{round} behaves as it does for @code{window-total-height}.
 @end defun
 
-@defun window-max-characters-per-line &optional window face
-The maximum width of a line that can be displayed in a window (without
-breaking the line) depends on many things, like the font used on the
-line, and whether there are fringes around the window.  This
-convenience function can be used to calculate that number.  If
-@var{window} isn't given, this defaults to the currently selected
-window.  if @var{var} isn't given, the @code{default} face is used.
-@end defun
-
 @defun window-total-size &optional window horizontal round
 This function returns either the total height in lines or the total
 width in columns of the window @var{window}.  If @var{horizontal} is
@@ -838,14 +829,18 @@ This function returns the height, in lines, of the body 
of window
 @var{window}.  If @var{window} is omitted or @code{nil}, it defaults to
 the selected window; otherwise it must be a live window.
 
-If the optional argument @var{pixelwise} is non-@code{nil}, this
-function returns the body height of @var{window} counted in pixels.
+The optional argument @var{pixelwise} defines the units to use for the
+height.  If @code{nil}, return the body height of @var{window} in
+characters, rounded down to the nearest integer, if necessary.  This
+means that if a line at the bottom of the text area is only partially
+visible, that line is not counted.  It also means that the height of a
+window's body can never exceed its total height as returned by
+@code{window-total-height}.
 
-If @var{pixelwise} is @code{nil}, the return value is rounded down to
-the nearest integer, if necessary.  This means that if a line at the
-bottom of the text area is only partially visible, that line is not
-counted.  It also means that the height of a window's body can never
-exceed its total height as returned by @code{window-total-height}.
+If @var{pixelwise} is @code{remap} and the default face is remapped
+(@pxref{Face Remapping}), use the remapped face to determine the
+character height.  For any other non-@code{nil} value, return the
+height in pixels.
 @end defun
 
 @cindex window body width
@@ -866,14 +861,18 @@ This function returns the width, in columns, of the body 
of window
 @var{window}.  If @var{window} is omitted or @code{nil}, it defaults to
 the selected window; otherwise it must be a live window.
 
-If the optional argument @var{pixelwise} is non-@code{nil}, this
-function returns the body width of @var{window} in units of pixels.
+The optional argument @var{pixelwise} defines the units to use for the
+width.  If @code{nil}, return the body width of @var{window} in
+characters, rounded down to the nearest integer, if necessary.  This
+means that if a column on the right of the text area is only partially
+visible, that column is not counted.  It also means that the width of
+a window's body can never exceed its total width as returned by
+@code{window-total-width}.
 
-If @var{pixelwise} is @code{nil}, the return value is rounded down to
-the nearest integer, if necessary.  This means that if a column on the
-right of the text area is only partially visible, that column is not
-counted.  It also means that the width of a window's body can never
-exceed its total width as returned by @code{window-total-width}.
+If @var{pixelwise} is @code{remap} and the default face is remapped
+(@pxref{Face Remapping}), use the remapped face to determine the
+character width.  For any other non-@code{nil} value, return the width
+in pixels.
 @end defun
 
 @cindex window body size
@@ -2845,6 +2844,11 @@ the function specified in @code{pop-up-frame-function}
 the newly created frame's parameters.
 @end defun
 
+@defun display-buffer-full-frame buffer alist
+This function displays the buffer on the current frame, deleting all
+other windows so that it takes up the full frame.
+@end defun
+
 @defun display-buffer-in-child-frame buffer alist
 This function tries to display @var{buffer} in a child frame
 (@pxref{Child Frames}) of the selected frame, either reusing an
@@ -3300,6 +3304,13 @@ window has at least that many columns.  If the value is 
@code{nil},
 that means not to split this way.
 @end defopt
 
+@defopt display-buffer-avoid-small-windows
+If non-@code{nil}, this should be a number.  Windows that have fewer
+lines than that will be avoided when choosing an existing window.  The
+value is interpreted in units of the frame's canonical line height,
+like @code{window-total-height} does (@pxref{Window Sizes}).
+@end defopt
+
 @defopt even-window-sizes
 This variable, if non-@code{nil}, causes @code{display-buffer} to even
 window sizes whenever it reuses an existing window, and that window is
@@ -4173,6 +4184,13 @@ ignore this option, for example, when there is only one 
buffer left
 these functions can switch to.
 @end defopt
 
+@defopt switch-to-prev-buffer-skip-regexp
+This user option should be either a regular expression or a list of
+regular expressions.  Buffers whose names match one of those regular
+expressions will be ignored by @code{switch-to-prev-buffer} and
+@code{switch-to-next-buffer} (except when there's no other buffer to
+switch to).
+@end defopt
 
 @node Dedicated Windows
 @section Dedicated Windows
@@ -5508,7 +5526,7 @@ pixels, rather than in units of the normal line height.
 @end example
 @end defun
 
-@defun set-window-vscroll window lines &optional pixels-p
+@defun set-window-vscroll window lines &optional pixels-p preserve-vscroll-p
 This function sets @var{window}'s vertical scroll position to
 @var{lines}.  If @var{window} is @code{nil}, the selected window is
 used.  The argument @var{lines} should be zero or positive; if not, it
@@ -5530,6 +5548,12 @@ The return value is the result of this rounding.
 
 If @var{pixels-p} is non-@code{nil}, @var{lines} specifies a number of
 pixels.  In this case, the return value is @var{lines}.
+
+Normally, the vscroll does not take effect on windows that aren't the
+@code{minibuffer-scroll-window} or the selected window when the
+mini-window is resized (@pxref{Minibuffer Windows}).  This ``frozen''
+behavior is disabled when the @var{preserve-vscroll-p} parameter is
+non-@code{nil}, which means to set the vscroll as usual.
 @end defun
 
 @defvar auto-window-vscroll
@@ -6123,11 +6147,10 @@ configuration on the current frame.
 This function returns @code{t} if @var{object} is a window configuration.
 @end defun
 
-@defun compare-window-configurations config1 config2
-This function compares two window configurations as regards the
-structure of windows, but ignores the values of point and the
-saved scrolling positions---it can return @code{t} even if those
-aspects differ.
+@defun window-configuration-equal-p config1 config2
+This function says whether two window configurations have the same
+window layout, but ignores the values of point and the saved scrolling
+positions---it can return @code{t} even if those aspects differ.
 @end defun
 
 @defun window-configuration-frame config
diff --git a/doc/man/emacs.1.in b/doc/man/emacs.1.in
index 9fdf65e0ff..7b2b553979 100644
--- a/doc/man/emacs.1.in
+++ b/doc/man/emacs.1.in
@@ -1,5 +1,5 @@
 .\" See section COPYING for copyright and redistribution information.
-.TH EMACS 1 "2021-09-28" "GNU Emacs @version@" "GNU"
+.TH EMACS 1 "2022-06-07" "GNU Emacs @version@" "GNU"
 .
 .
 .SH NAME
@@ -117,6 +117,10 @@ Load
 .IR user 's
 init file.
 .TP
+.BI \-\-init\-directory= "directory"
+Start emacs with user-emacs-directory set to
+.IR directory .
+.TP
 .BI \-t " file\fR,\fP " \-\-terminal= "file"
 Use specified
 .I file
diff --git a/doc/man/etags.1 b/doc/man/etags.1
index d345b8bd73..4681a9dadb 100644
--- a/doc/man/etags.1
+++ b/doc/man/etags.1
@@ -1,5 +1,5 @@
 .\" See section COPYING for copyright and redistribution information.
-.TH ETAGS 1 "2021-03-30" "GNU Tools" "GNU"
+.TH ETAGS 1 "2022-06-10" "GNU Tools" "GNU"
 .de BP
 .sp
 .ti -.2i
@@ -122,7 +122,9 @@ current file.  Only \fBetags\fP accepts this option.
 .B \-I, \-\-ignore\-indentation
 Don't rely on indentation as much as we normally do.  Currently, this
 means not to assume that a closing brace in the first column is the
-final brace of a function or structure definition in C and C++.
+final brace of a function or structure definition in C and C++.  This
+is important for code that doesn't observe the GNU Coding conventions
+of placing only top-level braces in column zero.
 .TP
 \fB\-l\fP \fIlanguage\fP, \fB\-\-language=\fIlanguage\fP
 Parse the following files according to the given language.  More than
diff --git a/doc/misc/dbus.texi b/doc/misc/dbus.texi
index 0b4f53ba13..bb97446d12 100644
--- a/doc/misc/dbus.texi
+++ b/doc/misc/dbus.texi
@@ -795,13 +795,7 @@ and interface.  Example:
 (dbus-get-all-managed-objects
  :session "org.gnome.SettingsDaemon" "/")
 
-@result{} (("/org/gnome/SettingsDaemon/MediaKeys"
-     ("org.gnome.SettingsDaemon.MediaKeys")
-     ("org.freedesktop.DBus.Peer")
-     ("org.freedesktop.DBus.Introspectable")
-     ("org.freedesktop.DBus.Properties")
-     ("org.freedesktop.DBus.ObjectManager"))
-    ("/org/gnome/SettingsDaemon/Power"
+@result{} (("/org/gnome/SettingsDaemon/Power"
      ("org.gnome.SettingsDaemon.Power.Keyboard")
      ("org.gnome.SettingsDaemon.Power.Screen")
      ("org.gnome.SettingsDaemon.Power"
diff --git a/doc/misc/efaq-w32.texi b/doc/misc/efaq-w32.texi
index 8dcdb121ab..55175a3b89 100644
--- a/doc/misc/efaq-w32.texi
+++ b/doc/misc/efaq-w32.texi
@@ -1742,23 +1742,6 @@ You will need an implementation of TeX for Windows.
 A number of implementations are listed on the
 @uref{http://www.tug.org/interest.html#free, TeX Users Group} website.
 
-@menu
-* AUCTeX::
-@end menu
-
-@node AUCTeX
-@subsection AUCTeX
-@cindex auctex, precompiled for Windows
-@cindex latex
-@cindex preview-latex
-
-AUCTeX is an Emacs package for writing LaTeX files, which also
-includes preview-latex, an Emacs mode for previewing the formatted
-contents of LaTeX documents.  Pre-compiled versions for Windows are
-available from
-@uref{https://www.gnu.org/software/auctex/download-for-windows.html, the
-AUCTeX site}.
-
 @node Spell check
 @section How do I perform spell checks?
 @cindex spell checking
diff --git a/doc/misc/efaq.texi b/doc/misc/efaq.texi
index 87a70d064e..a98c4b6a61 100644
--- a/doc/misc/efaq.texi
+++ b/doc/misc/efaq.texi
@@ -9,10 +9,9 @@
 
 @copying
 Copyright @copyright{} 2001--2022 Free Software Foundation, Inc.@*
-Copyright @copyright{} 1994, 1995, 1996, 1997, 1998, 1999, 2000
-Reuven M. Lerner@*
-Copyright @copyright{} 1992, 1993 Steven Byrnes@*
-Copyright @copyright{} 1990, 1991, 1992 Joseph Brian Wells@*
+Copyright @copyright{} 1994--2000 Reuven M. Lerner@*
+Copyright @copyright{} 1992--1993 Steven Byrnes@*
+Copyright @copyright{} 1990--1992 Joseph Brian Wells@*
 
 @quotation
 This list of frequently asked questions about GNU Emacs with answers
@@ -882,10 +881,11 @@ divergent TECO command sets and key bindings at MIT, and 
completed by
 RMS.
 
 Many people have said that TECO code looks a lot like line noise; you
-can read more at @uref{news:alt.lang.teco}.  Someone has written a TECO
-implementation in Emacs Lisp (to find it, see @ref{Packages that do not
-come with Emacs}); it would be an interesting project to run the
-original TECO Emacs inside of Emacs.
+can read more on
+@uref{https://en.wikipedia.org/wiki/TECO_(text_editor), Wikipedia}.
+Someone has written a TECO implementation in Emacs Lisp (to find it,
+see @ref{Packages that do not come with Emacs}); it would be an
+interesting project to run the original TECO Emacs inside of Emacs.
 
 @cindex Why Emacs?
 For some not-so-serious alternative reasons for Emacs to have that
@@ -3712,7 +3712,6 @@ information is available from
 * Compose Character::
 * Binding combinations of modifiers and function keys::
 * Meta key does not work in xterm::
-* SPC no longer completes file names::
 @end menu
 
 @node Binding keys to commands
@@ -4157,10 +4156,6 @@ If there is an @code{rlogin} connection between 
@code{xterm} and Emacs, the
 @samp{-8} argument may need to be given to rlogin to make it pass all 8 bits
 of every character.
 
-@item
-If Emacs is running on Ultrix, it is reported that evaluating
-@code{(set-input-mode t nil)} helps.
-
 @item
 If all else fails, you can make @code{xterm} generate @kbd{@key{ESC} W} when
 you type @kbd{M-W}, which is the same conversion Emacs would make if it
@@ -4186,22 +4181,6 @@ You might have to replace @samp{Meta} with @samp{Alt}.
 
 @end itemize
 
-@node SPC no longer completes file names
-@section Why doesn't @key{SPC} complete file names anymore?
-@cindex @kbd{SPC} file name completion
-
-Starting with Emacs 22.1, @kbd{SPC} no longer completes file names in
-the minibuffer, so that file names with embedded spaces could be typed
-without the need to quote the spaces.
-
-You can get the old behavior by binding @kbd{SPC} to
-@code{minibuffer-complete-word} in the minibuffer, as follows:
-
-@lisp
-(define-key minibuffer-local-filename-completion-map (kbd "SPC")
-  'minibuffer-complete-word)
-@end lisp
-
 @c ------------------------------------------------------------
 @node Alternate character sets
 @chapter Alternate character sets
@@ -4295,75 +4274,6 @@ add the following line to your @file{~/.emacs}:
   (setq ps-multibyte-buffer 'bdf-font-except-latin)
 @end lisp
 
-A few additional steps are necessary for MS-Windows; they are listed
-below.
-
-First, make sure @emph{all} the directories with BDF font files are
-mentioned in @code{bdf-directory-list}.  On Unix and GNU/Linux
-systems, one normally runs @kbd{make install} to install the BDF fonts
-in the same directory.  By contrast, Windows users typically don't run
-the Intlfonts installation command, but unpack the distribution in
-some directory, which leaves the BDF fonts in its subdirectories.  For
-example, assume that you unpacked Intlfonts in @file{C:/Intlfonts};
-then you should set @code{bdf-directory-list} as follows:
-
-@lisp
-  (setq bdf-directory-list
-    '("C:/Intlfonts/Asian"
-      "C:/Intlfonts/Chinese" "C:/Intlfonts/Chinese.X"
-      "C:/Intlfonts/Chinese.BIG" "C:/Intlfonts/Ethiopic"
-      "C:/Intlfonts/European" "C:/Intlfonts/European.BIG"
-      "C:/Intlfonts/Japanese" "C:/Intlfonts/Japanese.X"
-      "C:/Intlfonts/Japanese.BIG" "C:/Intlfonts/Korean.X"
-      "C:/Intlfonts/Misc"))
-@end lisp
-
-@cindex @code{w32-bdf-filename-alist}
-@cindex @code{w32-find-bdf-fonts}
-Next, you need to set up the variable @code{w32-bdf-filename-alist} to
-an alist of the BDF fonts and their corresponding file names.
-Assuming you have set @code{bdf-directory-list} to name all the
-directories with the BDF font files, the following Lisp snippet will
-set up @code{w32-bdf-filename-alist}:
-
-@lisp
-  (setq w32-bdf-filename-alist
-     (w32-find-bdf-fonts bdf-directory-list))
-@end lisp
-
-Now, create fontsets for the BDF fonts:
-
-@smallexample
-  (create-fontset-from-fontset-spec
-   "-*-fixed-medium-r-normal-*-16-*-*-*-c-*-fontset-bdf,
-   japanese-jisx0208:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0208.1983-*,
-   katakana-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*,
-   latin-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*,
-   japanese-jisx0208-1978:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0208.1978-*,
-   thai-tis620:-misc-fixed-medium-r-normal--16-160-72-72-m-80-tis620.2529-1,
-   lao:-misc-fixed-medium-r-normal--16-160-72-72-m-80-MuleLao-1,
-   
tibetan-1-column:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-80-MuleTibetan-1,
-   
ethiopic:-Admas-Ethiomx16f-Medium-R-Normal--16-150-100-100-M-160-Ethiopic-Unicode,
-   tibetan:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-160-MuleTibetan-0")
-@end smallexample
-
-Many of the international bdf fonts from Intlfonts are type 0, and
-therefore need to be added to font-encoding-alist:
-
-@lisp
-  (setq font-encoding-alist
-        (append '(("MuleTibetan-0" (tibetan . 0))
-                  ("GB2312"        (chinese-gb2312 . 0))
-                  ("JISX0208"      (japanese-jisx0208 . 0))
-                  ("JISX0212"      (japanese-jisx0212 . 0))
-                  ("VISCII"        (vietnamese-viscii-lower . 0))
-                  ("KSC5601"       (korean-ksc5601 . 0))
-                  ("MuleArabic-0"  (arabic-digit . 0))
-                  ("MuleArabic-1"  (arabic-1-column . 0))
-                  ("MuleArabic-2"  (arabic-2-column . 0)))
-                font-encoding-alist))
-@end lisp
-
 You can now use the Emacs font menu to select the @samp{bdf: 16-dot medium}
 fontset, or you can select it by setting the default font in your
 @file{~/.emacs}:
@@ -4372,7 +4282,6 @@ fontset, or you can select it by setting the default font 
in your
   (set-frame-font "fontset-bdf")
 @end lisp
 
-
 @c ------------------------------------------------------------
 @node Mail and news
 @chapter Mail and news
diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi
index d35a642b62..85e5a4933f 100644
--- a/doc/misc/eshell.texi
+++ b/doc/misc/eshell.texi
@@ -1758,14 +1758,6 @@ alias arg=blah
 function arg () @{ blah $* @}
 @end example
 
-@item @samp{for i in 1 2 3 @{ grep -q a b && *echo has it @} | wc -l} outputs 
result after prompt
-
-In fact, piping to a process from a looping construct doesn't work in
-general.  If I change the call to @code{eshell-copy-handles} in
-@code{eshell-rewrite-for-command} to use @code{eshell-protect}, it seems
-to work, but the output occurs after the prompt is displayed.  The whole
-structured command thing is too complicated at present.
-
 @item Pcomplete sometimes gets stuck
 
 You press @key{TAB}, but no completions appear, even though the
diff --git a/doc/misc/eudc.texi b/doc/misc/eudc.texi
index d2850282fe..7fd5add67e 100644
--- a/doc/misc/eudc.texi
+++ b/doc/misc/eudc.texi
@@ -713,6 +713,7 @@ be passed to the program.
 
 @node Inline Query Expansion
 @section Inline Query Expansion
+@subsection Inline Query Expansion Using a Key Binding
 
 Inline query expansion is a powerful method to get completion from
 your directory servers.  The most common usage is for expanding names
@@ -885,6 +886,29 @@ An error is signaled.  The expansion aborts.
 Default is @code{select}
 @end defvar
 
+@subsection Inline Query Expansion Using completion-at-point
+
+In addition to providing a dedicated EUDC function for binding to a
+key shortcut (@pxref{Inline Query Expansion}), EUDC also provides a
+function to contribute search results to the Emacs in-buffer
+completion system available via the function
+@code{completion-at-point} (@pxref{Identifier
+Inquiries,,,maintaining}) in @code{message-mode} buffers
+(@pxref{Top,Message,, message, Message}).  When using this mechanism,
+queries are made in the multi-server query mode of operation
+(@pxref{Multi-server Queries}).
+
+When a buffer in @code{message-mode} is created, EUDC's inline
+expansion function is automatically added to the variable
+@code{completion-at-point-functions}.  As a result, whenever
+@code{completion-at-point} is invoked in a @code{message-mode} buffer,
+EUDC will be queried for email addresses matching the words before
+point.  Since this will be useful only when editing specific message
+header fields that require specifying one or more email addresses, an
+additional check is performed whether point is actually in one of
+those header fields.  Thus, any matching email addresses will be
+offered for completion in suitable message header fields only, and not
+in other places, like for example the body of the message.
 
 
 @node The Server Hotlist
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index e51ae7d424..a0be13dac8 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -29685,10 +29685,9 @@ Gnus not to use @acronym{NOV}.
 
 As the variables for the other back ends, there are
 @code{nndiary-nov-is-evil}, @code{nndir-nov-is-evil},
-@code{nnfolder-nov-is-evil}, @code{nnimap-nov-is-evil},
-@code{nnml-nov-is-evil}, and @code{nnspool-nov-is-evil}.  Note that a
-non-@code{nil} value for @code{gnus-nov-is-evil} overrides all those
-variables.
+@code{nnfolder-nov-is-evil}, @code{nnml-nov-is-evil}, and
+@code{nnspool-nov-is-evil}.  Note that a non-@code{nil} value for
+@code{gnus-nov-is-evil} overrides all those variables.
 @end table
 
 
diff --git a/doc/misc/modus-themes.org b/doc/misc/modus-themes.org
index 42ad3ee35f..7b566f51c2 100644
--- a/doc/misc/modus-themes.org
+++ b/doc/misc/modus-themes.org
@@ -5,9 +5,9 @@
 #+options: ':t toc:nil author:t email:t num:t
 #+startup: content
 
-#+macro: stable-version 2.3.0
-#+macro: release-date 2022-04-01
-#+macro: development-version 2.4.0-dev
+#+macro: stable-version 2.4.0
+#+macro: release-date 2022-06-01
+#+macro: development-version 2.5.0-dev
 #+macro: file @@texinfo:@file{@@$1@@texinfo:}@@
 #+macro: space @@texinfo:@: @@
 #+macro: kbd @@texinfo:@kbd{@@$1@@texinfo:}@@
@@ -34,6 +34,10 @@ explicitly marked as such.
 
 Current development target is {{{development-version}}}.
 
++ Homepage: https://protesilaos.com/emacs/modus-themes.
++ Git repository: https://git.sr.ht/~protesilaos/modus-themes.
++ Mailing list: https://lists.sr.ht/~protesilaos/modus-themes.
+
 #+toc: headlines 8 insert TOC here, with eight headline levels
 
 * COPYING
@@ -165,14 +169,10 @@ The themes are now ready to be used: 
[[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][
 The ~modus-themes~ package is available from the GNU ELPA archive, which
 is configured by default.
 
-Prior to querying any package archive, make sure to have updated the
-index, with {{{kbd(M-x package-refresh-contents)}}}.  Then all you need to do
+Prior to querying any package archive, make sure to update the index,
+with {{{kbd(M-x package-refresh-contents)}}}.  Then all you need to do
 is type {{{kbd(M-x package-install)}}} and specify the ~modus-themes~.
 
-Note that older versions of the themes used to be distributed as
-standalone packages.  This practice has been discontinued starting with
-version 1.0.0 of this project.
-
 Once installed, the themes are ready to be used: 
[[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]].
 
 ** Install on GNU/Linux
@@ -211,6 +211,34 @@ guix package -i emacs-modus-themes
 
 They are now ready to be used: 
[[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]].
 
+** Dealing with byte compilation errors
+:properties:
+:custom_id: h:e6268471-e847-4c9d-998f-49a83257b7f1
+:end:
+
+From time to time, we receive bug reports pertaining to errors with byte
+compilation.  These seldom have to do with faulty code in the themes: it
+might be a shortcoming of =package.el=, some regression in the current
+development target of Emacs, a misconfiguration in an otherwise exotic
+setup, and the like.
+
+The common solution with a stable version of Emacs is to:
+
+1. Delete the =modus-themes= package.
+2. Close the current Emacs session.
+3. Install the =modus-themes= again.
+
+For those building Emacs directly from source, the solution may involve
+reverting to an earlier commit in emacs.git.
+
+At any rate, if you encounter such an issue please report it: we will
+either fix the bug on our end if it is truly ours, or help forward it to
+the relevant upstream maintainer.  Whatever you do, please understand
+that a build failure does not mean we are necessarily doing something
+wrong.
+
+[[#h:6536c8d5-3f98-43ab-a787-b94120e735e8][Issues you can help with]].
+
 * Enable and load
 :properties:
 :custom_id: h:3f3c3728-1b34-437d-9d0c-b110f5b161a9
@@ -4053,6 +4081,44 @@ comments are gray.  Regexp constructs are adapted 
accordingly.
     (set-face-attribute 'font-lock-warning-face nil :inherit 
'modus-themes-bold :foreground red-nuanced-fg)))
 #+end_src
 
+** Custom hl-todo colors
+:PROPERTIES:
+:CUSTOM_ID: h:2ef83a21-2f0a-441e-9634-473feb940743
+:END:
+
+The =hl-todo= package provides the user option ~hl-todo-keyword-faces~:
+it specifies a pair of keyword and corresponding color value.  The Modus
+themes configure that option in the interest of legibility.  While this
+works for our purposes, users may still prefer to apply their custom
+values, in which case the following approach is necessary:
+
+#+begin_src emacs-lisp
+(defun my-modus-themes-hl-todo-faces ()
+  (setq hl-todo-keyword-faces '(("TODO" . "#ff0000")
+                                ("HACK" . "#ffff00")
+                                ("XXX" . "#00ffff")
+                                ("NOTE" . "#ff00ff"))))
+
+(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces)
+#+end_src
+
+Or include a ~let~ form, if needed:
+
+#+begin_src emacs-lisp
+(defun my-modus-themes-hl-todo-faces ()
+  (let ((red "#ff0000")
+        (blue "#0000ff"))
+    (setq hl-todo-keyword-faces `(("TODO" . ,blue)
+                                  ("HACK" . ,red)
+                                  ("XXX" . ,red)
+                                  ("NOTE" . ,blue)))))
+
+(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces)
+#+end_src
+
+Normally, we do not touch user options, though this is an exception:
+otherwise the defaults are not always legible.
+
 * Face coverage
 :properties:
 :custom_id: h:a9c8f29d-7f72-4b54-b74b-ddefe15d6a19
@@ -4098,6 +4164,7 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + breakpoint (provided by the built-in {{{file(gdb-mi.el)}}} library)
 + calendar and diary
 + calfw
++ calibredb
 + centaur-tabs
 + cfrs
 + change-log and log-view (such as ~vc-print-log~, ~vc-print-root-log~)
@@ -4112,6 +4179,7 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + completions
 + consult
 + corfu
++ corfu-quick
 + counsel*
 + counsel-css
 + cov
@@ -4146,6 +4214,7 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + easy-jekyll
 + ebdb
 + ediff
++ ein (Emacs IPython Notebook)
 + eglot
 + el-search
 + eldoc-box
@@ -4344,6 +4413,7 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + tomatinho
 + transient (pop-up windows such as Magit's)
 + trashed
++ tree-sitter
 + treemacs
 + tty-menu
 + tuareg
@@ -4357,6 +4427,7 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + visible-mark
 + visual-regexp
 + vterm
++ vundo
 + wcheck-mode
 + web-mode
 + wgrep
@@ -4398,6 +4469,7 @@ supported by the themes.
 + dtache
 + easy-kill
 + edit-indirect
++ egerrit
 + elfeed-summary
 + evil-owl
 + flyspell-correct
@@ -4432,40 +4504,6 @@ supported by the themes.
 This section covers information that may be of interest to users of
 individual packages.
 
-** Note on avy hints
-:properties:
-:custom_id: h:2fdce705-6de7-44e6-ab7f-18f59af99e01
-:end:
-
-Hints can appear everywhere, in wildly varying contexts, hence, their
-appearance, by necessity, is a compromise.  However, there are various
-options for making them stand out. First is dimming the surroundings:
-
-#+begin_src emacs-lisp
-(setq avy-background t)
-#+end_src
-
-Dimming works well when you find it difficult to spot hints, any hint.
-Second is limiting the number of faces used by hints:
-
-#+begin_src emacs-lisp
-(setq avy-lead-faces
-      '(avy-lead-face
-        avy-lead-face-1
-        avy-lead-face-1
-        avy-lead-face-1
-        avy-lead-face-1))
-#+end_src
-
-Limiting the number of faces works well with longer hints when you find
-it difficult to identify individual hints, especially with hints
-touching each other.  The first character of the hint will have an
-intense color, the remaining ones the same neutral color.
-
-Third is preferring commands that produce fewer candidates.  Fewer hints
-is less noise: ~avy-goto-char-timer~ is an excellent alternative to
-~avy-goto-char~.
-
 ** Note on calendar.el weekday and weekend colors
 :properties:
 :custom_id: h:b2db46fb-32f4-44fd-8e11-d2b261cf51ae
@@ -4495,6 +4533,72 @@ weekends uniformly.
 For changes to take effect, the Calendar buffer needs to be generated
 anew.
 
+** Note on git-gutter in Doom Emacs
+:PROPERTIES:
+:CUSTOM_ID: h:a195e37c-e58c-4148-b254-8ba1ed8a731a
+:END:
+
+The =git-gutter= and =git-gutter-fr= packages default to drawing bitmaps
+for the indicators they display (e.g. bitmap of a plus sign for added
+lines).  In Doom Emacs, these bitmaps are replaced with contiguous lines
+which may look nicer, but require a change to the foreground of the
+relevant faces to yield the desired colour combinations.
+
+Since this is Doom-specific, we urge users to apply changes in their
+local setup.  Below is some sample code, based on what we cover at
+length elsewhere in this manual:
+
+[[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]].
+
+[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Face specs at scale using the 
themes' palette]].
+
+#+begin_src emacs-lisp
+(defun my-modus-themes-custom-faces ()
+  (modus-themes-with-colors
+    (custom-set-faces
+     ;; Replace green with blue if you use `modus-themes-deuteranopia'.
+     `(git-gutter-fr:added ((,class :foreground ,green-fringe-bg)))
+     `(git-gutter-fr:deleted ((,class :foreground ,red-fringe-bg)))
+     `(git-gutter-fr:modified ((,class :foreground ,yellow-fringe-bg))))))
+
+(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces)
+#+end_src
+
+If the above does not work, try this instead:
+
+#+begin_src emacs-lisp
+(after! modus-themes
+  (modus-themes-with-colors
+    (custom-set-faces
+     ;; Replace green with blue if you use `modus-themes-deuteranopia'.
+     `(git-gutter-fr:added ((,class :foreground ,green-fringe-bg)))
+     `(git-gutter-fr:deleted ((,class :foreground ,red-fringe-bg)))
+     `(git-gutter-fr:modified ((,class :foreground ,yellow-fringe-bg))))))
+#+end_src
+
+Replace ~green-fringe-bg~ with ~blue-fringe-bg~ if you want to optimize
+for red-green color deficiency.
+
+[[#h:3ed03a48-20d8-4ce7-b214-0eb7e4c79abe][Option for red-green color 
deficiency or deuteranopia]].
+
+** Note on php-mode multiline comments
+:PROPERTIES:
+:CUSTOM_ID: h:d0a3157b-9c04-46e8-8742-5fb2a7ae8798
+:END:
+
+Depending on your build of Emacs and/or the environment it runs in,
+multiline comments in PHP with the =php-mode= package use the
+~font-lock-doc-face~ instead of ~font-lock-comment-face~.
+
+This seems to make all comments use the appropriate face:
+
+#+begin_src emacs-lisp
+(defun my-multine-comments ()
+  (setq-local c-doc-face-name 'font-lock-comment-face))
+
+(add-hook 'php-mode-hook #'my-multine-comments)
+#+end_src
+
 ** Note on underlines in compilation buffers
 :properties:
 :custom_id: h:420f5a33-c7a9-4112-9b04-eaf2cbad96bd
@@ -4594,6 +4698,17 @@ elsewhere in this document.  For example:
 
 [[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Face specs at scale using the 
themes' palette]].
 
+To make the line thicker, set the height to be equal to the base font
+size instead of the one pixel we use.  This is done by specifying a rate
+instead of an absolute number, as in =:height 1.0= versus =:height 1=.
+For example:
+
+#+begin_src emacs-lisp
+(modus-themes-with-colors
+  (custom-set-faces
+   `(fill-column-indicator ((,class :height 1.0 :background ,bg-inactive 
:foreground ,bg-inactive)))))
+#+end_src
+
 ** Note on highlight-parentheses.el
 :PROPERTIES:
 :CUSTOM_ID: h:24bab397-dcb2-421d-aa6e-ec5bd622b913
@@ -5271,8 +5386,8 @@ and hints of green give us suitable shades of purple.
 
 Due to the need of maintaining some difference in hueness between
 adjacent colors, it is not possible to make red, green, and yellow the
-primary colors, because blue could not be used to control their
-luminance and, thus the relevant space would shrink considerably.
+main colors, because blue cannot be used to control their luminance and,
+thus the relevant space will shrink considerably.
 
 [[#h:5ce7ae2e-9348-4e55-b4cf-9302345b1826][Is the contrast ratio about 
adjacent colors?]]
 
@@ -5508,8 +5623,8 @@ in which you can contribute to their ongoing development.
 
 The ~modus-operandi~ and ~modus-vivendi~ themes are built into Emacs 28.
 
-The source code of the themes is 
[[https://gitlab.com/protesilaos/modus-themes/][available on GitLab]], for the 
time
-being.  A [[https://github.com/protesilaos/modus-themes/][mirror on GitHub]] 
is also on offer.
+The source code of the themes is 
[[https://git.sr.ht/~protesilaos/modus-themes][available on SourceHut]].  Or 
check the
+[[https://gitlab.com/protesilaos/modus-themes/][GitLab mirror (former main 
source)]] and the [[https://github.com/protesilaos/modus-themes/][GitHub 
mirror]].
 
 An HTML version of this manual is provided as an extension of the
 [[https://protesilaos.com/emacs/modus-themes/][author's personal website]] 
(does not rely on any non-free code).
@@ -5520,7 +5635,10 @@ An HTML version of this manual is provided as an 
extension of the
 :end:
 #+cindex: Contributing
 
-A few tasks you can help with:
+#+findex: modus-themes-report-bug
+A few tasks you can help with by sending an email to the general
+[[https://lists.sr.ht/~protesilaos/modus-themes][modus-themes public mailing 
list]] (or use the command
+~modus-themes-report-bug~).
 
 + Suggest refinements to packages that are covered.
 + Report packages not covered thus far.
@@ -5528,7 +5646,8 @@ A few tasks you can help with:
 + Help expand the documentation of covered-but-not-styled packages.
 + Suggest refinements to the color palette.
 + Help expand this document or any other piece of documentation.
-+ Merge requests for code refinements.
++ Send patches for code refinements (if you need, ask me for help with
+  Git---we all start out as beginners).
 
 [[#h:111773e2-f26f-4b68-8c4f-9794ca6b9633][Patches require copyright 
assignment to the FSF]].
 
@@ -5536,6 +5655,10 @@ It is preferable that your feedback includes some 
screenshots, GIFs, or
 short videos, as well as further instructions to reproduce a given
 setup.  Though this is not a requirement.
 
+#+findex: modus-themes-version
+Also consider mentioning the version of the themes you are using, such
+as by invoking the command ~modus-themes-version~.
+
 Whatever you do, bear in mind the overarching objective of the Modus
 themes: to keep a contrast ratio that is greater or equal to 7:1 between
 background and foreground colors.  If a compromise is ever necessary
@@ -5567,7 +5690,7 @@ will send you the assignment form for your past and 
future changes.
 
 Please use your full legal name (in ASCII characters) as the subject
 line of the message.
-----------------------------------------------------------------------
+
 REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES
 
 [What is the name of the program or package you're contributing to?]
@@ -5619,41 +5742,44 @@ The Modus themes are a collective effort.  Every bit of 
work matters.
   Johansson, Basil L.{{{space()}}} Contovounesios, Björn Lindström,
   Carlo Zancanaro, Christian Tietze, Daniel Mendler, Eli Zaretskii,
   Fritz Grabo, Illia Ostapyshyn, Kévin Le Gouguec, Kostadin Ninev,
-  Madhavan Krishnan, Markus Beppler, Matthew Stevenson, Mauro Aranda,
-  Nicolas De Jaeghere, Philip Kaludercic, Pierre Téchoueyres, Rudolf
-  Adamkovič, Stephen Gildea, Shreyas Ragavan, Stefan Kangas, Utkarsh
-  Singh, Vincent Murphy, Xinglu Chen, Yuanchen Xie.
+  Madhavan Krishnan, Manuel Giraud, Markus Beppler, Matthew Stevenson,
+  Mauro Aranda, Nicolas De Jaeghere, Philip Kaludercic, Pierre
+  Téchoueyres, Rudolf Adamkovič, Stephen Gildea, Shreyas Ragavan, Stefan
+  Kangas, Utkarsh Singh, Vincent Murphy, Xinglu Chen, Yuanchen Xie.
 
 + Ideas and user feedback :: Aaron Jensen, Adam Porter, Adam Spiers,
   Adrian Manea, Alex Griffin, Alex Koen, Alex Peitsinis, Alexey Shmalko,
-  Alok Singh, Anders Johansson, André Alexandre Gomes, Antonio Hernández
-  Blas, Arif Rezai, Augusto Stoffel, Basil L.{{{space()}}}
-  Contovounesios, Burgess Chang, Christian Tietze, Christopher Dimech,
-  Damien Cassou, Daniel Mendler, Dario Gjorgjevski, David Edmondson,
-  Davor Rotim, Divan Santana, Eliraz Kedmi, Emanuele Michele Alberto
-  Monterosso, Farasha Euker, Feng Shu, Gautier Ponsinet, Gerry Agbobada,
-  Gianluca Recchia, Guilherme Semente, Gustavo Barros, Hörmetjan Yiltiz,
-  Ilja Kocken, Iris Garcia, Jeremy Friesen, Jerry Zhang, Johannes
-  Grødem, John Haman, Jorge Morais, Joshua O'Connor, Julio
-  C. Villasante, Kenta Usami, Kevin Fleming, Kévin Le Gouguec, Kostadin
-  Ninev, Len Trigg, Lennart C. Karssen, Magne Hov, Manuel Uberti, Mark
-  Bestley, Mark Burton, Markus Beppler, Mauro Aranda, Michael
+  Alok Singh, Anders Johansson, André Alexandre Gomes, Andrew Tropin,
+  Antonio Hernández Blas, Arif Rezai, Augusto Stoffel, Basil
+  L.{{{space()}}} Contovounesios, Burgess Chang, Christian Tietze,
+  Christopher Dimech, Christopher League, Damien Cassou, Daniel Mendler,
+  Dario Gjorgjevski, David Edmondson, Davor Rotim, Divan Santana, Eliraz
+  Kedmi, Emanuele Michele Alberto Monterosso, Farasha Euker, Feng Shu,
+  Gautier Ponsinet, Gerry Agbobada, Gianluca Recchia, Gonçalo Marrafa,
+  Guilherme Semente, Gustavo Barros, Hörmetjan Yiltiz, Ilja Kocken, Iris
+  Garcia, Ivan Popovych, Jeremy Friesen, Jerry Zhang, Johannes Grødem,
+  John Haman, Jorge Morais, Joshua O'Connor, Julio C. Villasante, Kenta
+  Usami, Kevin Fleming, Kévin Le Gouguec, Kostadin Ninev, Len Trigg,
+  Lennart C. Karssen, Magne Hov, Manuel Uberti, Mark Bestley, Mark
+  Burton, Markus Beppler, Mauro Aranda, Maxime Tréca, Michael
   Goldenberg, Morgan Smith, Morgan Willcock, Murilo Pereira, Nicky van
   Foreest, Nicolas De Jaeghere, Paul Poloskov, Pengji Zhang, Pete
-  Kazmier, Peter Wu, Philip Kaludercic, Pierre Téchoueyres, Robert
-  Hepple, Roman Rudakov, Ryan Phillips, Rytis Paškauskas, Rudolf
-  Adamkovič, Sam Kleinman, Samuel Culpepper, Saša Janiška, Shreyas
-  Ragavan, Simon Pugnet, Tassilo Horn, Thibaut Verron, Thomas Heartman,
-  Togan Muftuoglu, Tony Zorman, Trey Merkley, Tomasz Hołubowicz, Toon
-  Claes, Uri Sharf, Utkarsh Singh, Vincent Foley.  As well as users:
-  Ben, CsBigDataHub1, Emacs Contrib, Eugene, Fourchaux, Fredrik,
-  Moesasji, Nick, TheBlob42, Trey, bepolymathe, bit9tream, derek-upham,
-  doolio, fleimgruber, gitrj95, iSeeU, jixiuf, okamsn, pRot0ta1p.
-
-+ Packaging :: Basil L.{{{space()}}} Contovounesios, Eli Zaretskii, Glenn
-  Morris, Mauro Aranda, Richard Stallman, Stefan Kangas (core Emacs),
-  Stefan Monnier (GNU Elpa), André Alexandre Gomes, Dimakakos Dimos,
-  Morgan Smith, Nicolas Goaziou (Guix), Dhavan Vaidya (Debian).
+  Kazmier, Peter Wu, Philip Kaludercic, Pierre Téchoueyres, Przemysław
+  Kryger, Robert Hepple, Roman Rudakov, Ryan Phillips, Rytis Paškauskas,
+  Rudolf Adamkovič, Sam Kleinman, Samuel Culpepper, Saša Janiška,
+  Shreyas Ragavan, Simon Pugnet, Tassilo Horn, Thibaut Verron, Thomas
+  Heartman, Togan Muftuoglu, Tony Zorman, Trey Merkley, Tomasz
+  Hołubowicz, Toon Claes, Uri Sharf, Utkarsh Singh, Vincent Foley.  As
+  well as users: Ben, CsBigDataHub1, Emacs Contrib, Eugene, Fourchaux,
+  Fredrik, Moesasji, Nick, TheBlob42, Trey, bepolymathe, bit9tream,
+  derek-upham, doolio, fleimgruber, gitrj95, iSeeU, jixiuf, okamsn,
+  pRot0ta1p.
+
++ Packaging :: Basil L.{{{space()}}} Contovounesios, Eli Zaretskii,
+  Glenn Morris, Mauro Aranda, Richard Stallman, Stefan Kangas (core
+  Emacs), Stefan Monnier (GNU Elpa), André Alexandre Gomes, Andrew
+  Tropin, Dimakakos Dimos, Morgan Smith, Nicolas Goaziou (Guix), Dhavan
+  Vaidya (Debian).
 
 + Inspiration for certain features :: Bozhidar Batsov (zenburn-theme),
   Fabrice Niessen (leuven-theme).
@@ -5663,7 +5789,7 @@ Jaeghere, and Omar Antolín Camarena for their long time 
contributions
 and insightful commentary on key aspects of the themes' design and/or
 aspects of their functionality.
 
-* Meta
+* Other notes about the project
 :properties:
 :custom_id: h:13752581-4378-478c-af17-165b6e76bc1b
 :end:
@@ -5688,12 +5814,16 @@ of this sort):
 + 
[[https://protesilaos.com/codelog/2021-06-02-modus-themes-org-agenda/][Introducing
 the variable modus-themes-org-agenda]] (2021-06-02)
 + 
[[https://protesilaos.com/codelog/2022-01-02-review-modus-themes-org-habit-colours/][Modus
 themes: review of the org-habit graph colours]] (2022-01-02)
 + [[https://protesilaos.com/codelog/2022-01-03-modus-themes-port-faq/][Re: 
VSCode or Vim ports of the Emacs modus-themes?]] (2022-01-03)
++ 
[[https://protesilaos.com/codelog/2022-04-20-modus-themes-case-study-avy/][Modus
 themes: case study on Avy faces and colour combinations]] (2022-04-20)
++ 
[[https://protesilaos.com/codelog/2022-04-21-modus-themes-colour-theory/][Emacs:
 colour theory and techniques used in the Modus themes]] (2022-04-21)
 
-And here are the canonical sources of this project's documentation:
+And here are the canonical sources of this project:
 
 + Manual :: <https://protesilaos.com/emacs/modus-themes>
 + Change Log :: <https://protesilaos.com/emacs/modus-themes-changelog>
 + Screenshots :: <https://protesilaos.com/emacs/modus-themes-pictures>
++ Git repository :: https://git.sr.ht/~protesilaos/modus-themes
++ Mailing list :: https://lists.sr.ht/~protesilaos/modus-themes
 
 * GNU Free Documentation License
 :properties:
diff --git a/doc/misc/org.org b/doc/misc/org.org
index 3dce83c936..baab2efeda 100644
--- a/doc/misc/org.org
+++ b/doc/misc/org.org
@@ -12442,7 +12442,7 @@ should in principle be exportable as a Beamer 
presentation.
   When =ignoreheading= is set, Org export ignores the entry's headline
   but not its content.  This is useful for inserting content between
   frames.  It is also useful for properly closing a =column=
-  environment.  @end itemize
+  environment.
 
   #+cindex: @samp{BEAMER_ACT}, property
   #+cindex: @samp{BEAMER_OPT}, property
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index bb91aec0cc..12d4987726 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -4478,6 +4478,11 @@ HP-UX SD depots
 @cindex @file{depot} file archive suffix
 @cindex file archive suffix @file{depot}
 
+@item @samp{.epub} ---
+Electronic publications
+@cindex @file{epub} file archive suffix
+@cindex file archive suffix @file{epub}
+
 @item @samp{.exe} ---
 Self extracting Microsoft Windows EXE files
 @cindex @file{exe} file archive suffix
diff --git a/doc/misc/transient.texi b/doc/misc/transient.texi
index 191fe8cd85..d634ad5197 100644
--- a/doc/misc/transient.texi
+++ b/doc/misc/transient.texi
@@ -2025,7 +2025,7 @@ They are defined here anyway to allow sharing certain 
methods.
 @code{value} The value.  Should not be accessed directly.
 
 @item
-@code{init-value} Function that is responsable for setting the object's
+@code{init-value} Function that is responsible for setting the object's
 value.  If bound, then this is called with the object as the only
 argument.  Usually this is not bound, in which case the object's
 primary @code{transient-init-value} method is called instead.
diff --git a/etc/HELLO b/etc/HELLO
index dbbcc0493b..d73465318c 100644
--- a/etc/HELLO
+++ b/etc/HELLO
@@ -1,9 +1,11 @@
 Content-Type: text/enriched
 Text-Width: 70
 
-This is a list of ways to say hello in various languages.
-It is not intended to be comprehensive, but to demonstrate
-some of the character sets that Emacs supports.
+This is a list of ways to write a <x-color><param>orange 
red</param>"hello"</x-color> greeting using
+various scripts.  It is not intended to be comprehensive,
+but to demonstrate some of the character sets and writing
+systems that Emacs supports.  Look for the script used to
+write your language, to see if it is supported.
 
 
 Non-ASCII examples:
@@ -11,7 +13,7 @@ Non-ASCII examples:
           Cześć!,</x-charset><x-charset><param>latin-iso8859-2</param> Dobrý 
den,</x-charset><x-charset><param>cyrillic-iso8859-5</param> 
Здравствуйте!,</x-charset><x-charset><param>greek-iso8859-7</param> Γειά 
σας,</x-charset> გამარჯობა
   Africa: <x-charset><param>ethiopic</param>ሠላም</x-charset>
   Middle/Near East:<x-charset><param>hebrew-iso8859-8</param> 
שָׁלוֹם,</x-charset> السّلام عليكم
-  South Asia: નમસ્તે, नमस्ते, ನಮಸ್ಕಾರ, നമസ്കാരം, ଶୁଣିବେ,
+  South Asia: નમસ્તે, नमस्ते, ನಮಸ್ಕಾರ, നമസ്കാരം, ନମସ୍କାର,
               ආයුබෝවන්, வணக்கம், నమస్కారం,<x-charset><param>tibetan</param> 
བཀྲ་ཤིས་བདེ་ལེགས༎</x-charset>
   South East Asia: ជំរាបសួរ,<x-charset><param>lao</param> ສະບາຍດີ,</x-charset> 
မင်္ဂလာပါ,<x-charset><param>thai-tis620</param> 
สวัสดีครับ,</x-charset><x-charset><param>vietnamese-viscii-lower</param> 
</x-charset><x-charset><param>vietnamese-viscii-upper</param>C</x-charset><x-charset><param>vietnamese-viscii-lower</param>hào
 bạn</x-charset>
   East Asia:<x-charset><param>chinese-gb2312</param> 
你好,</x-charset><x-charset><param>chinese-big5-1</param> 
早晨,</x-charset><x-charset><param>japanese-jisx0208</param> 
こんにちは,</x-charset><x-charset><param>korean-ksc5601</param> 안녕하세요</x-charset>
@@ -25,11 +27,14 @@ LANGUAGE (NATIVE NAME)      HELLO
 Amharic (አማርኛ) ሠላም
 Arabic (العربيّة)      السّلام عليكم
 Armenian (հայերեն)     Բարև ձեզ
+Balinese (ᬅᬓ᭄ᬱᬭᬩᬮᬶ)    ᬒᬁᬲ᭄ᬯᬲ᭄ᬢ᭄ᬬᬲ᭄ᬢᬸ
+Batak (ᯘᯮᯒᯗ᯲ᯅᯗᯂ᯲)      ᯂᯬᯒᯘ᯲ / ᯔᯧᯐᯬᯀᯱᯐᯬᯀᯱ
 Belarusian (беларуская)        Прывітанне
 Bengali (বাংলা)        নমস্কার
 Brahmi (𑀩𑁆𑀭𑀸𑀳𑁆𑀫𑀻)      𑀦𑀫𑀲𑁆𑀢𑁂
 
 Braille        ⠓⠑⠇⠇⠕
+Buginese (ᨒᨚᨈᨑ)        ᨖᨒᨚ
 Burmese (မြန်မာ)       မင်္ဂလာပါ
 C      printf (<x-color><param>orange red</param>"Hello, world!\n"</x-color>);
 Cham (ꨌꩌ)      ꨦꨤꩌ ꨦꨁꨰ
@@ -38,6 +43,7 @@ Comanche /kəˈmæntʃiː/ Haa marʉ́awe
 Cree (ᓀᐦᐃᔭᐍᐏᐣ) ᑕᓂᓯ / ᐙᒋᔮ
 Czech (čeština)        Dobrý den
 Danish (dansk) Hej / Goddag / Halløj
+Devanagari (देवनागरी)  नमस्ते / नमस्कार
 Dutch (Nederlands)     Hallo / Dag
 Efik  /ˈɛfɪk/  Mɔkɔm
 Egyptian Hieroglyphs (𓂋𓏤𓈖𓆎𓅓‌𓏏𓊖)        𓅓𓊵𓏏𓊪, 𓇍𓇋𓂻𓍘𓇋
@@ -50,40 +56,60 @@ Finnish (suomi)     Hei / Hyvää päivää
 French (français)      Bonjour / Salut
 Georgian (ქართული)     გამარჯობა
 German (Deutsch)       Guten Tag / Grüß Gott
+Grantha (𑌗𑍍𑌰𑌨𑍍𑌥)       𑌨𑌮𑌸𑍍𑌤𑍇 / 𑌨𑌮𑌸𑍍𑌕𑌾𑌰𑌃
 Greek (ελληνικά)       Γειά σας
 Greek, ancient (ἑλληνική)      Οὖλέ τε καὶ μέγα χαῖρε
 Gujarati (ગુજરાતી)     નમસ્તે
+Gurmukhi (ਗੁਰਮੁਖੀ)     ਸਤ ਸ੍ਰੀ ਅਕਾਲ
+Hanifi Rohingya (𐴌𐴟𐴇𐴥𐴝𐴚𐴒𐴙𐴝 𐴇𐴝𐴕𐴞𐴉𐴞 𐴓𐴠𐴑𐴤𐴝)       𐴀𐴝𐴏𐴓𐴝𐴀𐴡𐴤𐴛𐴝𐴓𐴝𐴙𐴑𐴟𐴔
+Hanunoo (ᜱᜨᜳᜨᜳᜢ)       ᜫᜬᜧ᜴ ᜣᜭᜯᜥ᜴ ᜰᜲᜭᜥ᜴
 Hebrew (עִבְרִית)      שָׁלוֹם
+Hindi (हिन्दी) प्रणाम / पाय लागू
 Hungarian (magyar)     Szép jó napot!
-Hindi (हिंदी)  नमस्ते / नमस्कार ।
 Inuktitut (ᐃᓄᒃᑎᑐᑦ)     ᐊᐃ
 Italian (italiano)     Ciao / Buon giorno
 Javanese (ꦧꦱꦗꦮꦶ)       console.log("ꦲꦭꦺꦴ");
+
+Kaithi (𑂍𑂶𑂟𑂲)  𑂩𑂰𑂧𑂩𑂰𑂧
 Kannada (ಕನ್ನಡ)        ನಮಸ್ಕಾರ
+Kharoṣṭhī (𐨑𐨪𐨆𐨛𐨁)      𐨣𐨨𐨲𐨪𐨆 𐨐𐨪𐨅𐨨𐨁
 Khmer (ភាសាខ្មែរ)      ជំរាបសួរ
 Lakota (Lakȟotiyapi)   Taŋyáŋ yahí!
 Lao (ພາສາລາວ)  ສະບາຍດີ / ຂໍໃຫ້ໂຊກດີ
+Lepcha (ᰛᰩᰵᰛᰧᰵᰶ)       ᰂᰦᰕᰥᰬ
+Limbu (ᤕᤰᤌᤢᤱ ᤐᤠᤴ)      ᤛᤣᤘᤠᤖᤥ
+Makasar (𑻪𑻢𑻪𑻢) 𑻦𑻤𑻵𑻱
 Malayalam (മലയാളം)     നമസ്കാരം
 Maldivian (ދިވެހި)     އައްސަލާމު ޢަލައިކުމް / ކިހިނެހް؟
 Maltese (il-Malti)     Bonġu / Saħħa
 Mathematics    ∀ p ∈ world • hello p  □
+Meetei Mayek (ꯃꯤꯇꯩ ꯃꯌꯦꯛ)       ꯈꯨꯔꯨꯝꯖꯔꯤ
+Modi (𑘦𑘻𑘚𑘲)    𑘡𑘦𑘭𑘿𑘎𑘰𑘨
 Mongolian (монгол хэл) Сайн байна уу?
 Northern Thai (ᨣᩣᩴᨾᩮᩬᩥᨦ / ᨽᩣᩈᩣᩃ᩶ᩣ᩠ᨶᨶᩣ) ᩈ᩠ᩅᩢᩔ᩠ᨯᩦᨣᩕᩢ᩠ᨸ
 Norwegian (norsk)      Hei / God dag
-Oriya (ଓଡ଼ିଆ)   ଶୁଣିବେ
+Odia (ଓଡ଼ିଆ)    ନମସ୍କାର
 Polish  (język polski) Dzień dobry! / Cześć!
+Rejang (ꥆꤰ꥓ꤼꤽ ꤽꥍꤺꥏ)    ꤸꥉꥐꤺꥉꥂꥎ
 Russian (русский)      Здра́вствуйте!
+Sharada (𑆯𑆳𑆫𑆢𑆳)        𑆤𑆩𑆱𑇀𑆑𑆳𑆫
+Siddham (𑖭𑖰𑖟𑖿𑖠𑖽)       𑖡𑖦𑖫𑖿𑖝𑖸
 Sinhala (සිංහල)        ආයුබෝවන්
 Slovak (slovenčina)    Dobrý deň
 Slovenian (slovenščina)        Pozdravljeni!
 Spanish (español)      ¡Hola!
+Sundanese (ᮃᮊ᮪ᮟᮛᮞᮥᮔ᮪ᮓ) ᮞᮙ᮪ᮕᮥᮛᮞᮥᮔ᮪
 Swedish (svenska)      Hej / Goddag / Hallå
+Syloti Nagri (ꠍꠤꠟꠐꠤ ꠘꠣꠉꠞꠤ)     ꠀꠌ꠆ꠍꠣꠟꠣꠝꠥ ꠀꠟꠣꠁꠇꠥꠝ / ꠘꠝꠡ꠆ꠇꠣꠞ
 Tamil (தமிழ்)  வணக்கம்
 Telugu (తెలుగు)        నమస్కారం
+Tagalog (ᜊᜌ᜔ᜊᜌᜒᜈ᜔)     ᜃᜓᜋᜓᜐ᜔ᜆ
+Tagbanwa (ᝦᝪᝯ) ᝫᝩᝬᝥ ᝣᝮᝧᝯ
 TaiViet (ꪁꪫꪱꪣ ꪼꪕ)      ꪅꪰꪙꫂ ꪨꪮꫂ ꪁꪫꪱ / ꪅꪽ ꪨꪷ ꪁꪫꪱ
 Thai (ภาษาไทย) สวัสดีครับ / สวัสดีค่ะ
 Tibetan (བོད་སྐད་)     བཀྲ་ཤིས་བདེ་ལེགས༎
 Tigrigna (ትግርኛ)        ሰላማት
+Tirhuta (𑒞𑒱𑒩𑒯𑒳𑒞𑒰)      𑒣𑓂𑒩𑒢𑒰𑒧 / 𑒮𑒲𑒞𑒰𑒩𑒰𑒧
 Turkish (Türkçe)       Merhaba
 Ukrainian (українська) Вітаю
 Vietnamese (tiếng Việt)        Chào bạn
diff --git a/etc/NEWS b/etc/NEWS
index f7dddd36de..19ca21f666 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -65,9 +65,24 @@ headers installed, Emacs will use the X Input Extension for 
handling
 input.  If this causes problems, you can configure Emacs with the
 option '--without-xinput2' to disable this support.
 
-(featurep 'xinput2) can be used to test for the presence of XInput 2
+'(featurep 'xinput2)' can be used to test for the presence of XInput 2
 support from Lisp programs.
 
+---
+** Emacs no longer reduces the size of the Japanese dictionary.
+Building Emacs includes generation of a Japanese dictionary, which is
+used by Japanese input methods.  Previously, the build included a step
+of reducing the size of this dictionary's vocabulary.  This vocabulary
+reduction is now optional, by default off.  If you need the Emacs
+build to include the vocabulary reduction, configure Emacs with the
+option '--with-small-ja-dic'.  In an Emacs source tree already
+configured without that option, you can force the vocabulary reduction
+by saying
+
+    make -C leim generate-ja-dic JA_DIC_NO_REDUCTION_OPTION=''
+
+after deleting lisp/leim/ja-dic/ja-dic.el.
+
 +++
 ** Emacs now supports being built with pure GTK.
 To use this option, make sure the GTK 3 (version 3.20 or later) and
@@ -121,7 +136,7 @@ This will output a string identifying the current Emacs 
build.
 
 +++
 ** New hook 'after-pdump-load-hook'.
-This is run at the end of the Emacs startup process, and it meant to
+This is run at the end of the Emacs startup process, and is meant to
 be used to reinitialize structures that would normally be done at load
 time.
 
@@ -136,8 +151,28 @@ of 'user-emacs-directory'.
 
 * Incompatible changes in Emacs 29.1
 
++++
+** 'E' in 'query-replace' now edits the replacement with exact case.
+Previously, this command did the same as 'e'.
+
 ---
-** Isearch in *Help* and *info* now char-folds quote characters by default.
+** '/ a' in *Packages* now limits by package name(s) instead of regexp.
+
++++
+** Setting the goal columns now also affects '<prior>' and '<next>'.
+Previously, 'C-x C-n' only affected 'next-line' and 'previous-line',
+but it now also affects 'scroll-up-command' and 'scroll-down-command'.
+
+---
+** The 'd' command in Dired now more consistently skip dot files.
+In previous Emacs versions, commands like `C-u 10 d' would put the "D"
+mark on the next ten files, no matter whether they were dot files
+(i.e., "." and "..") or not, while marking the next ten lines with the
+mouse (in 'transient-mark-mode') and then hitting 'd' would skip dot
+files.  These now work equivalently.
+
+---
+** Isearch in "*Help*" and "*info*" now char-folds quote characters by default.
 This means that you can say 'C-s `foo' (GRAVE ACCENT) if the buffer
 contains "‘foo" (LEFT SINGLE QUOTATION MARK) and the like.  These
 quotation characters look somewhat similar in some fonts.  To switch
@@ -158,10 +193,10 @@ newline.
 
 ---
 ** 'TAB' and '<backtab>' are now bound in 'button-map'.
-This means that if your cursor is on a button, 'TAB' will take you to
-the next button, even if the mode has bound it to something else.
-This also means that 'TAB' on a button in an 'outline-minor-mode'
-heading will move point instead of collapsing the outline.
+This means that if point is on a button, 'TAB' will take you to the
+next button, even if the mode has bound it to something else.  This
+also means that 'TAB' on a button in an 'outline-minor-mode' heading
+will move point instead of collapsing the outline.
 
 ---
 ** 'Info-default-directory-list' is no longer populated at Emacs startup.
@@ -171,7 +206,7 @@ If you have code in your init file that removes directories 
from
 ---
 ** 'C-k' no longer deletes files in 'ido-mode'.
 To get the previous action back, put something like the following in
-your init file:
+your Init file:
 
     (require 'ido)
     (keymap-set ido-file-completion-map "C-k" #'ido-delete-file-at-head)
@@ -195,6 +230,13 @@ files that were compiled with an old EIEIO (Emacs<25).
 ** 'C-x 8 .' has been moved to 'C-x 8 . .'.
 This is to open up the 'C-x 8 .' map to bind further characters there.
 
+---
+** 'C-x 8 =' moved to 'C-x 8 = ='.
+You can now use 'C-x 8 =' to insert several characters with macron;
+for example, 'C-x 8 = a' will insert U+0101 LATIN SMALL LETTER A WITH
+MACRON.  To insert a lone macron, type 'C-x 8 = =' instead of the
+previous 'C-x ='.
+
 ** Eshell
 
 ---
@@ -235,19 +277,60 @@ use the new 'tamil-itrans-digits' and 
'tamil-inscript-digits' input
 methods instead.
 
 +++
-** New variable current-time-list governing default timestamp form.
-Functions like current-time now yield (TICKS . HZ) timestamps if this
-new variable is nil.  The variable defaults to t, which means these
-functions default to timestamps of the forms (HI LO US PS), (HI LO US)
-or (HI LO), which are less regular and less efficient.  This is part
-of a long-planned change first documented in Emacs 27.  Developers are
-encouraged to test timestamp-related code with this variable set to
-nil, as it will default to nil in a future Emacs version and will be
-removed some time after that.
+** New variable 'current-time-list' governing default timestamp form.
+Functions like 'current-time' now yield '(TICKS . HZ)' timestamps if
+this new variable is nil.  The variable defaults to t, which means
+these functions default to timestamps of the forms '(HI LO US PS)',
+'(HI LO US)' or '(HI LO)', which are less regular and less efficient.
+This is part of a long-planned change first documented in Emacs 27.
+Developers are encouraged to test timestamp-related code with this
+variable set to nil, as it will default to nil in a future Emacs
+version and will be removed some time after that.
+
++++
+** Functions which recreate the "*scratch*" buffer now also initialize it.
+When functions like 'other-buffer' and 'server-execute' recreate
+"*scratch*", they now also insert 'initial-scratch-message' and set
+the major mode according to 'initial-major-mode', like at Emacs
+startup.  Previously, these functions ignored
+'initial-scratch-message' and left "*scratch*" in 'fundamental-mode'.
 
 
 * Changes in Emacs 29.1
 
+---
+** Files with the '.eld' extension are now visited in 'lisp-data-mode'.
+
++++
+** New command 'find-sibling-file'.
+This command jumps to a file considered a "sibling file", which is
+determined according to the new user option 'find-sibling-rules'.
+
++++
+** New user option 'delete-selection-temporary-region'.
+When non-nil, 'delete-selection-mode' will only delete the temporary
+regions (usually set by mouse-dragging or shift-selection).
+
++++
+** New user option 'switch-to-prev-buffer-skip-regexp'.
+This should be a regexp or a list of regexps; buffers whose names
+match those regexps will be ignored by 'switch-to-prev-buffer' and
+'switch-to-next-buffer'.
+
+** Menus
+
+---
+*** The entries following the buffers in the "Buffers" menu can now be altered.
+Change the 'menu-bar-buffers-menu-command-entries' variable to alter
+the entries that follow the buffer list.
+
+---
+** 'delete-process' is now a command.
+When called interactively, it will kill the process running in the
+current buffer (if any).  This can be useful if you have runaway
+output in the current buffer (from a process or a network connection),
+and want to stop it.
+
 +++
 ** New command 'restart-emacs'.
 This is like 'save-buffers-kill-emacs', but instead of just killing
@@ -257,6 +340,12 @@ the current Emacs process at the end, it starts a new 
Emacs process
 optional parameters to restart instead of just killing the current
 process.
 
++++
+** New user option 'mouse-drag-mode-line-buffer'.
+If non-nil, dragging on the buffer name part of the mode-line will
+drag the buffer's associated file to other programs.  This option is
+currently only available on X, Haiku and Nextstep (GNUstep or macOS).
+
 +++
 ** New user option 'mouse-drag-and-drop-region-cross-program'.
 If non-nil, this option allows dragging text in the region from Emacs
@@ -267,6 +356,10 @@ to another program.
 If non-nil, this option allows scrolling a window while dragging text
 around without a scroll wheel.
 
++++
+*** 'mouse-drag-copy-region' can now be 'non-empty'.
+This inhibits putting empty strings onto the kill ring.
+
 +++
 ** New user options 'dnd-indicate-insertion-point' and 'dnd-scroll-margin'.
 These options allow adjusting point and scrolling a window when
@@ -287,6 +380,9 @@ a convenient method of making commands disabled in this way.
 ---
 ** 'count-lines' will now report buffer totals if given a prefix.
 
++++
+** 'count-words' will now report sentence count when used interactively.
+
 ---
 ** New user option 'find-library-include-other-files'.
 If set to nil, commands like 'find-library' will only include library
@@ -363,10 +459,16 @@ instead of XIM input methods.
 ** New user option 'use-system-tooltips'.
 This controls whether to use the toolkit tooltips, or Emacs's own
 native implementation of tooltips as small frames.  This option is
-only meaningful if Emacs was built with GTK+ or Haiku support, and
-defaults to t, which makes Emacs use the toolkit tooltips.  The
-existing GTK-specific option 'x-gtk-use-system-tooltips' is now an
-alias of this new option.
+only meaningful if Emacs was built with GTK+, Nextstep, or Haiku
+support, and defaults to t, which makes Emacs use the toolkit
+tooltips.  The existing GTK-specific option
+'x-gtk-use-system-tooltips' is now an alias of this new option.
+
++++
+** Non-native tooltips are now supported on Nextstep.
+This means Emacs built with GNUstep or built on macOS is now able to
+display different faces and images inside tooltips when the
+'use-system-tooltips' user option is nil.
 
 ** Connection-local variables
 
@@ -381,8 +483,8 @@ make it more convenient to inspect and modify them.
 Running 'with-connection-local-variables' defaults to application
 'tramp'.  This can be changed by let-binding
 'connection-local-default-application' to another symbol.  This is
-useful when running code in a buffer, where Tramp has already set some
-connection local variables.
+useful when running code in a buffer where Tramp has already set some
+connection-local variables.
 
 ---
 ** New minor mode 'pixel-scroll-precision-mode'.
@@ -456,27 +558,39 @@ command also works for non-Emoji characters.)
 
 ---
 *** New input method 'emoji'.
-This allows you to enter emoji using short strings, eg :face_palm: or
-:scream:.
+This allows you to enter emoji using short strings, eg ':face_palm:'
+or ':scream:'.
 
 ** Help
 
+---
+*** 'M-x apropos-variable' output now includes values of variables.
+
++++
+*** New doc string syntax to indicate that symbols shouldn't be links.
+When displaying doc strings in "*Help*" buffers, strings that are
+"`like-this'" are made into links (if they point to a bound
+function/variable).  This can lead to false positives when talking
+about values that are symbols that happen to have the same names as
+functions/variables.  To inhibit this buttonification, the new
+"\\+`like-this'" syntax can be used.
+
 +++
 *** New user option 'help-window-keep-selected'.
 If non-nil, commands to show the info manual and the source will reuse
-the same window the *Help* buffer is shown in.
+the same window the "*Help*" buffer is shown in.
 
 ---
 *** Commands like 'C-h f' have changed how they describe menu bindings.
 For instance, previously a command might be described as having the
 following bindings:
 
-  It is bound to <open>, C-x C-f, <menu-bar> <file> <new-file>.
+    It is bound to <open>, C-x C-f, <menu-bar> <file> <new-file>.
 
 This has been changed to:
 
-  It is bound to <open> and C-x C-f.
-  It can also be invoked from the menu: File → Visit New File...
+    It is bound to <open> and C-x C-f.
+    It can also be invoked from the menu: File → Visit New File...
 
 +++
 *** The 'C-h .' command now accepts a prefix argument.
@@ -487,7 +601,7 @@ instead.
 
 ---
 *** New user option 'help-enable-variable-value-editing'.
-If enabled, 'e' on a value in *Help* will pop you to a new buffer
+If enabled, 'e' on a value in "*Help*" will pop you to a new buffer
 where you can edit the value.  This is not enabled by default, because
 it's easy to make an edit that yields an invalid result.
 
@@ -522,6 +636,11 @@ minor modes are listed after the major mode.
 The apropos commands will now select the apropos window if
 'help-window-select' is non-nil.
 
+---
+*** 'describe-keymap' now considers the symbol at point.
+If the symbol at point is a keymap, 'describe-keymap' suggests it as
+the default candidate.
+
 ** Outline Mode
 
 +++
@@ -539,7 +658,7 @@ or is itself too long.
 +++
 *** New user option 'outline-minor-mode-use-buttons'.
 If non-nil, Outline Minor Mode will use buttons to hide/show outlines
-in addition to the ellipsis.  Default nil.
+in addition to the ellipsis.  The default is nil.
 
 ---
 *** New user option 'outline-minor-mode-buttons'.
@@ -548,12 +667,21 @@ This is a list of pairs of open/close strings used to 
display buttons.
 +++
 ** Support for the WebP image format.
 This support is built by default when the libwebp library is
-available.  (This also includes support for animated WebP images.)  To
-disable WebP support, use the '--without-webp' configure flag.  Image
+available, and includes support for animated WebP images.  To disable
+WebP support, use the '--without-webp' configure flag.  Image
 specifiers can now use ':type webp'.
 
 ** Windows
 
+*** New user option 'display-buffer-avoid-small-windows'.
+If non-nil, this should be a window height, a number.  Windows smaller
+than this will be avoided by 'display-buffer', if possible.
+
++++
+*** New display action 'display-buffer-full-frame'.
+This action removes other windows on the frame when displaying a
+buffer.
+
 +++
 *** 'display-buffer' now can set up the body size of the chosen window.
 For example, a 'display-buffer-alist' entry of
@@ -620,13 +748,32 @@ Rcirc will use the default 'completion-at-point' 
mechanism.  The
 conventional IRC behaviour of completing by cycling through the
 available options can be restored by enabling this option.
 
+** Imenu
+
 +++
-** 'imenu' is now bound to 'M-g i' globally.
+*** 'imenu' is now bound to 'M-g i' globally.
+
+---
+*** New function 'imenu-flush-cache'.
+Use it if you want Imenu to forget the buffer's index alist and
+recreate it anew next time 'imenu' is invoked.
 
 * Editing Changes in Emacs 29.1
 
++++
+** 'M-SPC' is now bound to 'cycle-spacing'.
+Formerly it invoked 'just-one-space'.  The actions performed by
+'cycle-spacing' and their order can now be customized via the user
+option 'cycle-spacing-actions'.
+
+---
+** 'zap-to-char' and 'zap-up-to-char' are case-sensitive for upper-case chars.
+These commands now behave as case-sensitive for interactive calls when
+they are invoked with an uppercase character, regardless of the
+`case-fold-search' value.
+
 ---
-** 'scroll-other-window' and 'scroll-other-window-down' now respects remapping.
+** 'scroll-other-window' and 'scroll-other-window-down' now respect remapping.
 These commands (bound to 'C-M-v' and 'C-M-V') used to scroll the other
 windows without looking a customizations in that other window.  These
 functions now check whether they have been rebound in the buffer in
@@ -647,7 +794,7 @@ This change also affects 'cl-macrolet', 'cl-flet*' and
 
 +++
 ** New user option 'translate-upper-case-key-bindings'.
-This can be set to nil to inhibit translating upper case keys to lower
+Set this option to nil to inhibit translating upper case keys to lower
 case keys.
 
 +++
@@ -657,8 +804,8 @@ point.
 
 ---
 ** Improved mouse behavior with auto-scrolling modes.
-When clicking inside the 'scroll-margin' or 'hscroll-margin' region
-the point is now moved only when releasing the mouse button.  This no
+When clicking inside the 'scroll-margin' or 'hscroll-margin' region,
+point is now moved only when releasing the mouse button.  This no
 longer results in a bogus selection, unless the mouse has been
 effectively dragged.
 
@@ -679,9 +826,9 @@ Customize this option to limit the number of entries in the 
menu
 *** New user option 'show-paren-context-when-offscreen'.
 When non-nil, if the point is in a closing delimiter and the opening
 delimiter is offscreen, shows some context around the opening
-delimiter in the echo area.  Default nil.
+delimiter in the echo area.  The default is nil.
 
-May also be set to the symbols 'overlay' or 'child-frame' in which
+May also be set to the symbols 'overlay' or 'child-frame', in which
 case the context is shown in an overlay or child-frame at the top-left
 of the current window.  The latter option requires a graphical frame.
 On non-graphical frames, the context is shown in the echo area.
@@ -690,7 +837,7 @@ On non-graphical frames, the context is shown in the echo 
area.
 
 +++
 *** 'comint-term-environment' is now aware of connection-local variables.
-The user option 'comint-terminfo-terminal' and variable
+The user option 'comint-terminfo-terminal' and the variable
 'system-uses-terminfo' can now be set as connection-local variables to
 change the terminal used on a remote host.
 
@@ -703,7 +850,7 @@ The options 'mouse-wheel-down-alternate-event',
 and 'mouse-wheel-right-alternate-event' have been added to better
 support systems where two kinds of wheel events can be received.
 
-** Editing complex text layout (CTL) scripts
+** Internationalization changes
 
 *** The <Delete> function key now allows deleting the entire composed sequence.
 For the details, see the item about the 'delete-forward-char' command
@@ -714,17 +861,116 @@ Setting it to a non-nil value temporarily disables 
automatic
 composition of character sequences at point, and thus makes it easier
 to edit such sequences by allowing point to "enter" the sequence.
 
-*** New language environment "Northern Thai".
-This uses the Tai Tham script, whose support has been enhanced.
-
-*** New language environment "Brahmi".
-This language environment supports Brahmi, which is a historical
-script that was used in ancient South Asia.  A new input method,
-'brahmi', is provided to type text in this script.
+---
+*** Support for many old scripts and writing systems.
+Emacs now supports and has language-environments and input methods for
+several dozens of old scripts that were used in the past for various
+languages in South and South-East Asia.  For each such script Emacs
+now has font-selection and character composition rules, a language
+environment, and an input method.  The newly-added scripts and the
+corresponding language environments are:
+
+**** Tai Tham script and the Northern Thai language environment
+**** Brahmi script and language environment
+**** Kaithi script and language environment
+**** Tirhuta script and language environment
+**** Sharada script and language environment
+**** Siddham script and language environment
+**** Syloti Nagri script and language environment
+**** Modi script and language environment
+**** Baybayin script and Tagalog language environment
+**** Hanunoo script and language environment
+**** Buhid script and language environment
+**** Tagbanwa script and language environment
+**** Limbu script and language environment
+**** Balinese script and language environment
+**** Javanese script and language environment
+**** Sundanese script and language environment
+**** Batak script and language environment
+**** Rejang script and language environment
+**** Makasar script and language environment
+**** Lontara script and language environment
+**** Hanifi Rohingya script and language environment
+**** Grantha script and language environment
+**** Kharoshthi script and language environment
+**** Lepcha script and language environment
+**** Meetei Mayek script and language environment
+
+---
+*** The "Oriya" language environment was renamed to "Odia".
+This is to follow the change in the official name of the script.  The
+'oriya' input method was also renamed to 'odia'.  However, the old
+name of the language environment and the input method are still
+supported.
+
+---
+*** New Greek translation of the Emacs tutorial.
+Type 'C-u C-h t' to select it in case your language setup does not do
+so automatically.
 
 
 * Changes in Specialized Modes and Packages in Emacs 29.1
 
+** Battery
+
++++
+*** New user option 'battery-update-functions'.
+This can be used to trigger actions based on the battery status.
+
+** Enriched Mode
+
++++
+*** New command 'enriched-toggle-markup'.
+This allows you to see the markup in 'enriched-mode' buffers (e.g.,
+the HELLO file).
+
+** Shell Script Mode
+
+---
+*** New user option 'sh-indent-statement-after-and'.
+This controls how statements like the following are indented:
+
+    foo &&
+        bar
+
+** Cperl Mode
+---
+*** New user option 'cperl-file-style'.
+This option determines the indentation style to be used.  It can also
+be used as a file-local variable.
+
+** Gud
+
+---
+*** 'gud-go' is now bound to 'C-c C-v'.
+If given a prefix, it will query the user for an argument to use for
+the run/continue command.
+
+** Customize
+
+---
+*** New command 'custom-toggle-hide-all-widgets'.
+This is bound to 'H' and toggles whether to hide or show the widget
+contents.
+
+** Ispell
+
+---
+*** 'ispell-region' and 'ispell-buffer' now push the mark.
+These commands push onto the mark ring the location of the last
+misspelled word where corrections were offered, so that you can then
+skip back to that location with 'C-x C-x'.
+
+** Dabbrev
+
+---
+*** New function 'dabbrev-capf' for use on 'completion-at-point-functions'.
+
++++
+*** New user option 'dabbrev-ignored-buffer-modes'.
+Buffers with major modes in this list will be ignored.  By default,
+this includes "binary" buffers like 'archive-mode' and 'image-mode'.
+
 ** Package
 
 +++
@@ -732,24 +978,51 @@ script that was used in ancient South Asia.  A new input 
method,
 This command allows you to upgrade packages without using 'M-x
 list-packages'.
 
++++
+*** New command 'package-update-all'.
+This command allows updating all packages without any queries.
+
++++
+*** New DWIM action on 'x' in "*Packages*" buffer.
+If no packages are marked, 'x' will install the package under point if
+it isn't already, and remove it if it is installed.
+
 ** Miscellaneous
 
 +++
 *** New command 'scratch-buffer'.
-This command switches to the *scratch* buffer.  If *scratch* doesn't
+This command switches to the "*scratch*" buffer.  If "*scratch*" doesn't
 exist, the command creates it first.  You can use this command if you
-inadvertently delete the *scratch* buffer.
+inadvertently delete the "*scratch*" buffer.
 
 ** Debugging
 
+---
+*** 'q' in a *Backtrace* buffer no longer clears the buffer.
+Instead it just buries the buffer and switches the mode from
+'debugger-mode' to 'backtrace-mode', since commands like 'e' are no
+longer available after exiting the recursive edit.
+
++++
 *** New user option 'debug-allow-recursive-debug'.
-This user option controls whether the 'e' (in a *Backtrace*
+This user option controls whether the 'e' (in a "*Backtrace*"
 buffer or while edebugging) and 'C-x C-e' (while edebugging) commands
 lead to a (further) backtrace.  By default, this variable is nil,
 which is a change in behaviour from previous Emacs versions.
 
 ** Compile
 
++++
+*** New user option 'compilation-hidden-output'.
+This can be used to make specific parts of compilation output
+invisible.
+
++++
+*** The 'compilation-auto-jump-to-first-error' user option has been extended.
+It can now have the additional values 'if-location-known' (which will
+only jump if the location of the first error is known), and
+'first-known' (which will jump to the first known error location).
+
 +++
 *** New user option 'compilation-max-output-line-length'.
 Lines longer than this will have the ends hidden, with a button to
@@ -772,7 +1045,7 @@ This mode adds some highlighting, fixes the 'M-q' command, 
and has
 commands for doing maintenance.
 
 ---
-** kmacro
+** Kmacro
 Kmacros are now OClosures and have a new constructor 'kmacro' which
 uses the 'key-parse' syntax.  It replaces the old 'kmacro-lambda-form'
 (which is now declared obsolete).
@@ -797,7 +1070,9 @@ a completion candidate to the minibuffer, then 'M-RET' can 
be used
 to choose the currently active candidate from the "*Completions*"
 buffer and exit the minibuffer.  With a prefix argument, 'C-u M-RET'
 inserts the currently active candidate to the minibuffer, but doesn't
-exit the minibuffer.
+exit the minibuffer.  These keys are also available for in-buffer
+completion, but they don't insert candidates automatically, you need
+to type 'M-RET' to insert the selected candidate to the buffer.
 
 +++
 *** The "*Completions*" buffer can now be automatically selected.
@@ -808,17 +1083,11 @@ To enable this behavior, customize the user option
 the second one will switch to the "*Completions*" buffer.
 
 ---
-*** New user option 'completion-wrap-movement'.
+*** New user option 'completion-auto-wrap'.
 When non-nil, the commands 'next-completion' and 'previous-completion'
 automatically wrap around on reaching the beginning or the end of
 the "*Completions*" buffer.
 
-+++
-*** New user option 'completions-sort'.
-This option controls the sorting of the completion candidates in
-the "*Completions*" buffer.  Available styles are no sorting,
-alphabetical (the default), or a custom sort function.
-
 +++
 *** New values for the 'completion-auto-help' user option.
 There are two new values to control the way the "*Completions*" buffer
@@ -828,6 +1097,18 @@ to complete.  The value 'visual' is like 'always', but 
only updates
 the completions if they are already visible.  The default value 't'
 always hides the completion buffer after some completion is made.
 
+*** New commands to complete the minibuffer history.
+'minibuffer-complete-history' ('C-x up') is like 'minibuffer-complete'
+but completes on the history items instead of the default completion
+table.  'minibuffer-complete-defaults' ('C-x down') completes
+on the list of default items.
+
++++
+*** New user option 'completions-sort'.
+This option controls the sorting of the completion candidates in
+the "*Completions*" buffer.  Available styles are no sorting,
+alphabetical (the default), or a custom sort function.
+
 +++
 *** New user option 'completions-max-height'.
 This option limits the height of the "*Completions*" buffer.
@@ -845,7 +1126,7 @@ When this user option names a face, the current
 candidate in the "*Completions*" buffer is highlighted with that face.
 The nil value disables this highlighting.
 
----
++++
 *** Choosing a completion with a prefix argument doesn't exit the minibuffer.
 This means that typing 'C-u RET' on a completion candidate in the
 "*Completions*" buffer inserts the completion to the minibuffer,
@@ -886,7 +1167,7 @@ For instance, to enable jumping to the "*Messages*" buffer 
with
 
     (set-register ?m '(buffer . "*Messages*"))
 
-** pixel-fill
+** Pixel-fill
 
 +++
 *** This is a new package that deals with filling variable-pitch text.
@@ -905,7 +1186,12 @@ This fills the region to be no wider than a specified 
pixel width.
 This will take you to the gnu.org web server's version of the current
 info node.  This command only works for the Emacs and Emacs Lisp manuals.
 
-** vc
+** VC
+
++++
+*** New command '%' ('vc-dir-mark-by-regexp').
+This command marks files based on a regexp.  If given a prefix
+argument, unmark instead.
 
 ---
 *** 'C-x v v' on an unregistered file will now use the most specific backend.
@@ -976,7 +1262,13 @@ is called, and the returned values are used to populate 
the phrase and
 comment parts (see RFC 5322 for definitions).  In both cases, the
 phrase part will be automatically quoted if necessary.
 
-** eww/shr
++++
+*** New function 'eudc-capf-complete' with 'message-mode' integration.
+EUDC can now contribute email addresses to 'completion-at-point' by
+adding the new function 'eudc-capf-complete' to
+'completion-at-point-functions' in 'message-mode'.
+
+** EWW/SHR
 
 +++
 *** New user option to automatically rename EWW buffers.
@@ -995,7 +1287,7 @@ allowed images.
 *** New user option 'shr-use-xwidgets-for-media'.
 If non-nil (and Emacs has been built with support for xwidgets),
 display <video> elements with an xwidget.  Note that this is
-experimental, and is known to crash Emacs on some systems, and just
+experimental; it is known to crash Emacs on some systems, and just
 doesn't work on other systems.  Also see etc/PROBLEMS.
 
 +++
@@ -1032,7 +1324,7 @@ All other 'gnus-header-*' faces inherit from this face 
now.
 +++
 *** New user option 'gnus-treat-emojize-symbols'.
 If non-nil, symbols that have an emoji representation will be
-displayed as emojis.  Default nil.
+displayed as emojis.  The default is nil.
 
 +++
 *** New command 'gnus-article-emojize-symbols'.
@@ -1045,8 +1337,8 @@ Configuration is very similar to the notmuch and namazu 
backends.  It
 supports the unified search syntax.
 
 ---
-*** gnus-html-image-cache-ttl is now a seconds count.
-Formerly it was a pair of numbers (A B) that represented 65536*A + B,
+*** 'gnus-html-image-cache-ttl' is now a seconds count.
+Formerly it was a pair of numbers '(A B)' that represented 65536*A + B,
 to cater to older Emacs implementations that lacked bignums.
 The older form still works but is undocumented.
 
@@ -1055,7 +1347,7 @@ The older form still works but is undocumented.
 +++
 *** 'slot-value' can now be used to access slots of 'cl-defstruct' objects.
 
-** align
+** Align
 
 ---
 *** Alignment in 'text-mode' has changed.
@@ -1078,7 +1370,7 @@ displayed in the "*Help*" buffer will be linked to the 
documentation
 for the command they are bound to.  This does not affect listings of
 key bindings and functions (such as 'C-h b').
 
-** info-look
+** Info-look
 
 ---
 *** info-look specs can now be expanded at run time instead of a load time.
@@ -1086,23 +1378,28 @@ The new ':doc-spec-function' element can be used to 
compute the
 ':doc-spec' element when the user asks for info on that particular
 mode (instead of at load time).
 
-** subr-x
+** Subr-x
 
 +++
 *** New macro 'with-memoization' provides a very primitive form of memoization.
 
-** ansi-color
+** Ansi-color
 
 ---
 *** Support for ANSI 256-color and 24-bit colors.
 256-color and 24-bit color codes are now handled by ANSI color
 filters and displayed with the specified color.
 
-** term-mode
+** Term-mode
+
+---
+*** New user option 'term-bind-function-keys'.
+If non-nil, 'term-mode' will pass the function keys on to the
+underlying shell instead of using the normal Emacs bindings.
 
 ---
 *** Support for ANSI 256-color and 24-bit colors, italic and other fonts.
-Term-mode can now display 256-color and 24-bit color codes.  It can
+'term-mode' can now display 256-color and 24-bit color codes.  It can
 also handle ANSI codes for faint, italic and blinking text, displaying
 it with new 'term-{faint,italic,slow-blink,fast-blink}' faces.
 
@@ -1200,11 +1497,11 @@ user options that are no longer needed are now obsolete:
 *** Navigation and marking commands now work in image display buffer.
 The following new bindings have been added:
 
-  n or SPC  image-dired-display-next-thumbnail-original
-  p or DEL  image-dired-display-previous-thumbnail-original
-  m         image-dired-mark-thumb-original-file
-  d         image-dired-flag-thumb-original-file
-  u         image-dired-unmark-thumb-original-file
+    n or SPC  image-dired-display-next-thumbnail-original
+    p or DEL  image-dired-display-previous-thumbnail-original
+    m         image-dired-mark-thumb-original-file
+    d         image-dired-flag-thumb-original-file
+    u         image-dired-unmark-thumb-original-file
 
 ---
 *** Reduce dependency on external "exiftool" command.
@@ -1275,7 +1572,7 @@ Emacs for tens of seconds.  In addition, you can now 
customize this
 option to nil to disable this confirmation completely.
 
 ---
-*** Make 'image-dired-rotate-thumbnail-(left|right)' obsolete.
+*** 'image-dired-rotate-thumbnail-(left|right)' is now obsolete.
 Instead, use commands 'image-dired-refresh-thumb' to generate a new
 thumbnail, or 'image-rotate' to rotate the thumbnail without updating
 the thumbnail file.
@@ -1302,6 +1599,12 @@ If non-nil (which is the default), hitting 'RET' or 
'mouse-1' on
 the directory components at the directory displayed at the start of
 the buffer will take you to that directory.
 
+---
+*** Search and replace in Dired/Wdired supports more regexps.
+For example, the regexp ".*" will match only characters that are part
+of the file name.  Also "^.*$" can be used to match at the beginning
+of the file name and at the end of the file name.
+
 ** Exif
 
 ---
@@ -1313,13 +1616,12 @@ This is a convenience function to extract the field 
data from
 
 ---
 *** New user option 'xwidget-webkit-buffer-name-format'.
-Using this option you can control how the xwidget-webkit buffers are
-named.
+This option controls how xwidget-webkit buffers are named.
 
 ---
 *** New user option 'xwidget-webkit-cookie-file'.
-Using this option you can control whether the xwidget-webkit buffers
-save cookies set by web pages, and if so, in which file to save them.
+This option controls whether the xwidget-webkit buffers save cookies
+set by web pages, and if so, in which file to save them.
 
 +++
 *** New minor mode 'xwidget-webkit-edit-mode'.
@@ -1436,11 +1738,18 @@ values passed as a single token, such as '-oVALUE' or
 'eshell-eval-using-options' macro.  See "Defining new built-in
 commands" in the "(eshell) Built-ins" node of the Eshell manual.
 
+** Shell
+
+---
+*** New user option 'shell-kill-buffer-on-exit'.
+Enabling this will automatically kill a *shell* buffer as soon as the
+shell session terminates.
+
 ** Calc
 
 +++
 *** New user option 'calc-kill-line-numbering'.
-This can be set to nil to exclude line numbering from kills and copies.
+Set it to nil to exclude line numbering from kills and copies.
 
 ** Miscellaneous
 
@@ -1461,12 +1770,22 @@ manual for more details.
 Types are registered via a 'bookmark-handler-type' symbol property on
 the jumping function.
 
++++
+*** 'bookmark-sort-flag' can now be set to 'last-modified'.
+This will display bookmark list from most recently set to least
+recently set.
+
 ---
 *** New minor mode 'elide-head-mode'.
 Enabling this minor mode turns on hiding header material, like
 'elide-head' does; disabling it shows the header.  The commands
 'elide-head' and 'elide-head-show' are now obsolete.
 
++++
+*** New user option 'project-vc-include-untracked'.
+If non-nil, files untracked by a VCS are considered to be part of
+the project by a VC project based on that VCS.
+
 ---
 ** The autoarg.el library is now marked obsolete.
 This library provides the 'autoarg-mode' and 'autoarg-kp-mode' minor
@@ -1507,6 +1826,38 @@ Emacs buffers, like indentation and the like.  The new 
ert function
 
 * Incompatible Lisp Changes in Emacs 29.1
 
++++
+** loaddefs.el generation has been reimplemented.
+The various loaddefs.el files in the Emacs tree (which contain
+information about autoloads, built-in packages and package prefixes)
+used to be generated by functions in autoloads.el.  These are now
+generated by loaddefs-gen.el instead.  This leads to functionally
+equivalent loaddef files, but they do not use exactly the same syntax,
+so using 'M-x update-file-autoloads' no longer works.  (This didn't
+work well in most files in the past, either, but it will now signal an
+error in any file.)
+
+In addition, files are scanned in a slightly different way.
+Previously ;;;### specs inside a top-level form (i.e., something like
+(when ... ;;;### ...) would be ignored.  They are now parsed as
+normal.
+
++++
+** 'buffer-modified-p' has been extended.
+This function was previously documented to return only nil or t.  This
+has been changed to nil/'autosaved'/non-nil.  The new 'autosaved'
+value means that the buffer is modified, but that it hasn't been
+modified since the time of last auto-save.
+
+---
+** 'with-silent-modifications' also restores buffer autosave status.
+'with-silent-modifications' is a macro meant to be used by the font
+locking machinery to allow applying text properties without changing
+the modification status of the buffer.  However, it didn't restore the
+buffer autosave status, so applying font locking to a modified buffer
+that had already been auto-saved would trigger another auto-saving.
+This is no longer the case.
+
 ---
 ** 'prin1' doesn't always escape "." and "?" in symbols any more.
 Previously, symbols like 'foo.bar' would be printed by 'prin1' as
@@ -1640,14 +1991,113 @@ It was previously only run by 'clone-indirect-buffer' 
and
 called by both of these, the hook is now run by all 3 of these
 functions.
 
+---
+** '?\' at the end of a line now signals an error.
+Previously it produced a nonsense value, -1, that was never intended.
 
 * Lisp Changes in Emacs 29.1
 
++++
+** 'read-regexp' now allows the user to indicate whether to use case folding.
+
++++
+** 'completing-read' now allows a function as its REQUIRE-MATCH argument.
+This function is called to see whether what the user has typed in is a
+match.  This is also available from functions that call
+'completing-read', like 'read-file-name'.
+
++++
+** 'posn-col-row' can now give position data based on windows.
+Previously, it reported data only based on the frame.
+
++++
+** 'file-expand-wildcards' can now also take a regexp as PATTERN argument.
+
+---
+** vc-mtn (the backend for Monotone) has been made obsolete.
+
++++
+** 'gui-set-selection' can now specify different values for different data 
types.
+If DATA is a string, then its text properties are searched for values
+for each specific data type while the selection is being converted.
+
+---
+** New eldoc function: 'elisp-eldoc-var-docstring-with-value'.
+This function includes the current value of the variable in eldoc display
+and can be used as a more detailed alternative to 'elisp-eldoc-var-docstring'.
+
+** 'save-some-buffers' can now be extended to save other things.
+Traditionally, 'save-some-buffers' saved buffers, and also saved
+abbrevs.  This has been generalized via the
+'save-some-buffers-functions', and packages can now register things to
+be saved.
+
+** Themes
+
+---
+*** New hooks 'enable-theme-functions' and 'disable-theme-functions'.
+These are run after enabling and disabling a theme, respectively.
+
+---
+*** Themes can now be made obsolete.
+Using 'make-obsolete' on a theme is now supported.  This will make
+'load-theme' issue a warning when loading the theme.
+
++++
+** New hook 'display-monitors-changed-functions'.
+It is called whenever the configuration of different monitors on a
+display changes.
+
++++
+** 'prin1' and 'prin1-to-string' now take an optional OVERRIDES parameter.
+This parameter can be used to override values of print-related settings.
+
++++
+** New minor mode 'header-line-indent-mode'.
+This is meant to be used in modes that have a header line that should
+be kept aligned with the buffer contents when the user switches
+'display-line-numbers-mode' on or off.
+
++++
+** New predicate 'char-uppercase-p'.
+This returns non-nil if its argument its an uppercase character.
+
+** Byte compilation
+
+---
+*** Byte compilation will now warn about some quoting mistakes in doc strings.
+When writing code snippets that contains the ' character (APOSTROPHE),
+that quote character has to be escaped to avoid Emacs displaying it as
+’ (LEFT SINGLE QUOTATION MARK), which would make code examples like
+
+    (setq foo '(1 2 3))
+
+invalid.  Emacs will now warn during byte compilation if it seems
+something like that, and also warn about when using RIGHT/LEFT SINGLE
+QUOTATION MARK directly.  In both these cases, if these characters
+should really be present in the doc string, they should be quoted with
+\=.
+
+---
+*** Byte compilation will now warn about some malformed 'defcustom' types.
+It's very common to write 'defcustom' types on the form:
+
+    :type '(choice (const :tag "foo" 'bar))
+
+I.e., double-quoting the 'bar', which is almost never the correct
+value.  The byte compiler will now issue a warning if it encounters
+these forms.
+
++++
+*** 'restore-buffer-modified-p' can now alter buffer auto-save state.
+With a FLAG value of 'autosaved', it will mark the buffer as having
+been auto-saved since the time of last modification.
+
 ---
 *** New minor mode 'isearch-fold-quotes-mode'.
 This sets up 'search-default-mode' so that quote characters are
-char-folded into each other.  It is used, by default, in *Help* and
-*info* buffers.
+char-folded into each other.  It is used, by default, in "*Help*" and
+"*info*" buffers.
 
 +++
 ** New macro 'buffer-local-set-state'.
@@ -1670,18 +2120,9 @@ available only when Emacs was built with glibc as the C 
library.
 ---
 ** 'x-show-tip' no longer hard-codes a timeout default.
 The new 'x-show-tooltip-timeout' variable allows the user to alter
-this for packages that don't use 'tooltip-show', but instead calls the
+this for packages that don't use 'tooltip-show', but instead call the
 lower level function directly.
 
-+++
-** New function 'window-max-characters-per-line'.
-
-+++
-** New function 'window-char-pixel-width'.
-
-+++
-** New function 'window-char-pixel-width'.
-
 ---
 ** New function 'current-cpu-time'.
 It gives access to the CPU time used by the Emacs process, for
@@ -1710,7 +2151,7 @@ putting the modes on the first line of a file).
 
 +++
 ** New function 'flush-standard-output'.
-This enables you do display incomplete lines from batch-based Emacs
+This enables you to display incomplete lines from batch-based Emacs
 scripts.
 
 +++
@@ -1737,9 +2178,9 @@ list in reported motion events if there is no frame 
underneath the
 mouse pointer.
 
 +++
-** New function 'x-begin-drag'.
-This function initiates a drag-and-drop request with the contents of
-the selection 'XdndSelection', and returns when a drop occurs.
+** New functions 'x-begin-drag', 'dnd-begin-text-drag' and 
'dnd-begin-file-drag'.
+These functions allow dragging contents (such as files and text) from
+Emacs to other programs.
 
 ---
 ** New function 'ietf-drums-parse-date-string'.
@@ -1848,6 +2289,11 @@ where 'major-mode' is 'shell-mode' or a combined with a 
condition like
 Use 'buffer-match-p' to gather a list of buffers that match a
 condition.
 
+---
+** New optional arguments 'text-face' and 'default-face' for 'tooltip-show'.
+They allow changing the faces used for the tooltip text and frame
+colors of the resulting tooltip frame from the default 'tooltip' face.
+
 ** Text security and suspiciousness
 
 +++
@@ -1968,6 +2414,14 @@ platforms.
 This command lets you examine all data in the current selection and
 the clipboard, and insert it into the buffer.
 
++++
+** New variable 'yank-transform-functions'.
+This variable allows the user to alter the string to be inserted.
+
+---
+** New command 'yank-in-context'.
+This command tries to preserve string/comment syntax when yanking.
+
 ---
 ** New function 'minibuffer-lazy-highlight-setup'.
 This function allows setting up the minibuffer so that lazy
@@ -2039,6 +2493,17 @@ dimensions.
 Specifying a cons as the FROM argument allows to start measuring text
 from a specified amount of pixels above or below a position.
 
++++
+** 'window-body-width' and 'window-body-height' can use remapped faces.
+Specifying 'remap' as the PIXELWISE argument now checks if the default
+face was remapped, and if so, uses the remapped face to determine the
+character width/height.
+
++++
+** 'set-window-vscroll' now accepts a new argument PRESERVE-VSCROLL-P.
+This means the vscroll will not be reset when set on a window that is
+"frozen" due to a mini-window being resized.
+
 ** XDG support
 
 ---
@@ -2069,6 +2534,12 @@ This holds the value of the previous call to 
'set-locale-environment'.
 This macro can be used to change the locale temporarily while
 executing code.
 
+** table.el
+
+---
+*** New user option 'table-latex-environment'.
+This allows switching between "table" and "tabular".
+
 ** Tabulated List Mode
 
 +++
@@ -2078,7 +2549,7 @@ descriptor, which means to insert an image in that column 
instead of
 text.  See the documentation string of that variable for details.
 
 +++
-** :keys in 'menu-item' can now be a function.
+** ':keys' in 'menu-item' can now be a function.
 If so, it is called whenever the menu is computed, and can be used to
 calculate the keys dynamically.
 
@@ -2096,11 +2567,6 @@ local variables.
 ** Third 'mapconcat' argument SEPARATOR is now optional.
 An explicit nil always meant the empty string, now it can be left out.
 
----
-** Themes can now be made obsolete.
-Using 'make-obsolete' on a theme is now supported.  This will make
-'load-theme' issue a warning when loading the theme.
-
 +++
 ** New function 'define-keymap'.
 This function allows defining a number of keystrokes with one form.
@@ -2172,18 +2638,17 @@ for performing searches on WebKit xwidgets.
 
 +++
 *** New function 'xwidget-webkit-back-forward-list'.
-This function is used to obtain the history of page-loads in a given
-WebKit xwidget.
+This function returns the history of page-loads in a WebKit xwidget.
 
 +++
 *** New function 'xwidget-webkit-estimated-load-progress'.
-This function is used to obtain the estimated progress of page loading
-in a given WebKit xwidget.
+This function returns the estimated progress of page loading in a
+WebKit xwidget.
 
 +++
 *** New function 'xwidget-webkit-stop-loading'.
-This function is used to terminate all data transfer during page loads
-in a given WebKit xwidget.
+This function terminates all data transfer during page loads in a
+WebKit xwidget.
 
 +++
 *** 'load-changed' xwidget events are now more detailed.
@@ -2216,8 +2681,8 @@ temporary transition aid for Emacs 27, has served its 
purpose.
 
 +++
 ** 'encode-time' now also accepts a 6-element list with just time and date.
-(encode-time (list SECOND MINUTE HOUR DAY MONTH YEAR)) is now short for
-(encode-time (list SECOND MINUTE HOUR DAY MONTH YEAR nil -1 nil)).
+'(encode-time (list SECOND MINUTE HOUR DAY MONTH YEAR))' is now short for
+'(encode-time (list SECOND MINUTE HOUR DAY MONTH YEAR nil -1 nil))'.
 
 +++
 ** 'date-to-time' now assumes earliest values if its argument lacks
@@ -2303,12 +2768,12 @@ To disable double-buffering (e.g., if it causes display 
problems), set
 the frame parameter 'inhibit-double-buffering' to a non-nil value.
 You can do that either by adding
 
-   '(inhibit-double-buffering . t)
+    '(inhibit-double-buffering . t)
 
 to 'default-frame-alist', or by modifying the frame parameters of the
 selected frame by evaluating
 
-   (modify-frame-parameters nil '((inhibit-double-buffering . t)))
+    (modify-frame-parameters nil '((inhibit-double-buffering . t)))
 
 +++
 *** Emacs now supports system dark mode.
diff --git a/etc/NEWS.28 b/etc/NEWS.28
index 995de8d317..2efa881b2f 100644
--- a/etc/NEWS.28
+++ b/etc/NEWS.28
@@ -16,6 +16,50 @@ You can narrow news to a specific version by calling 
'view-emacs-news'
 with a prefix argument or by typing 'C-u C-h C-n'.
 
 
+* Installation Changes in Emacs 28.2
+
+
+* Startup Changes in Emacs 28.2
+
+
+* Changes in Emacs 28.2
+
+This is a bug-fix release with no new features.
+
+
+* Editing Changes in Emacs 28.2
+
+
+* Changes in Specialized Modes and Packages in Emacs 28.2
+
+** The command 'kdb-macro-redisplay' was renamed to 'kmacro-redisplay'.
+This is to fix an embarrassing typo in the original name.
+
+** 'desktop-save-mode' now saves the desktop in 'save-buffers-kill-emacs'.
+Previously, the desktop was saved in 'kill-emacs' via
+'kill-emacs-hook'.  However, that violated the convention that
+functions in 'kill-emacs-hook' cannot interact with the user, and in
+particular didn't play well with ending daemon sessions of Emacs.  So
+we moved the saving of the desktop to 'save-buffers-kill-emacs', via
+'kill-emacs-query-functions'.  To make sure the desktop is saved,
+terminate Emacs with 'save-buffers-kill-emacs', not with 'kill-emacs'.
+
+(This change was done in Emacs 28.1, but we didn't announce it in NEWS
+back then.)
+
+
+* New Modes and Packages in Emacs 28.2
+
+
+* Incompatible Lisp Changes in Emacs 28.2
+
+
+* Lisp Changes in Emacs 28.2
+
+
+* Changes in Emacs 28.2 on Non-Free Operating Systems
+
+
 * Installation Changes in Emacs 28.1
 
 ** Emacs now optionally supports native compilation of Lisp files.
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index 270de600d6..018efcf302 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -805,6 +805,22 @@ to take advantage of.
 
 * Runtime problems related to font handling
 
+** Some fonts are detected but not usable under Xft.
+
+Some fonts might not be usable under Emacs even though they show up in
+the font family list when Emacs is built with Xft.  This is because
+Emacs prevents fonts that have color glyphs (such as color Emoji) from
+being used, since they typically cause Xft crashes.
+
+On some GNU/Linux systems, fonts (such as Source Code Pro) that do not
+have color glyphs are reported as color fonts, causing them to be
+unavailable when using Xft.  This is known to happen under Fedora
+GNU/Linux 36 or later, and possibly other distributions as well.
+
+If you encounter a such a font, you can enable it while ignoring other
+fonts that actually have color glyphs by adding its family name to the
+list `xft-color-font-whitelist'.
+
 ** Characters are displayed as empty boxes or with wrong font under X.
 
 *** This may be due to your local fontconfig customization.
@@ -1874,6 +1890,33 @@ this, you can remove the X resource or put this in your 
init file:
 
   (xterm-remove-modify-other-keys)
 
+** The shift TAB key combination works as meta TAB on a Linux console.
+
+This happens because on your keyboard layout, S-TAB produces the same
+keycodes as typing ESC TAB individually.  The best way to solve this
+is to modify your keyboard layout to produce different codes, and tell
+Emacs what these new codes mean.
+
+The current keyboard layout will probably be a .map.gz file somewhere
+under /usr/share/keymaps.  Identify this file, possibly from a system
+initialization file such as /etc/conf.d/keymaps.  Run gunzip on it to
+decompress it, and amend the entries for keycode 15 to look something
+like this:
+
+keycode  15 = Tab
+        alt     keycode  15 = Meta_Tab
+        shift keycode 15 = F219
+string F219 = "\033[4}\011"      # Shift+<tab>
+
+After possibly saving this file under a different name, compress it
+again using gzip.  Amend /etc/conf.d/keyamps, etc., if needed.
+Further details can be found in the man page for loadkeys.
+
+Then add the following line near the start of your site-start.el or
+.emacs or init.el file:
+
+(define-key input-decode-map "\e[4}\t" 'backtab)
+
 ** Emacs spontaneously displays "I-search: " at the bottom of the screen.
 
 This means that Control-S/Control-Q (XON/XOFF) "flow control" is being
@@ -2982,6 +3025,23 @@ GTK_IM_MODULE.
 GTK does not allow programs to warp the pointer anymore.  There is
 nothing that can be done about this problem.
 
+** Certain keys such as 'C-S-u' are not reported correctly.
+
+Some keys with modifiers such as Shift and Control might not be
+reported correctly due to incorrectly written GTK input method
+modules.  This is known to happen to 'C-S-u' and 'C->', which are
+misreported as 'C-u' and '>'.
+
+To disable the use of GTK input methods, evaluate:
+
+  (pgtk-use-im-context nil)
+
+This will also cause system input methods and features such as the
+Compose key to stop working.
+
+On X Windows, users should not use Emacs configured with PGTK, since
+this and many other problems do not exist on the regular X builds.
+
 * Build-time problems
 
 ** Configuration
diff --git a/etc/enriched.txt b/etc/enriched.txt
index 5c74c610ae..2d970d197b 100644
--- a/etc/enriched.txt
+++ b/etc/enriched.txt
@@ -137,7 +137,7 @@ Unfortunately this does not look as nice with a fixed-width 
font
 as it does in a proportionally-spaced printed document; the extra
 spaces that are needed on the screen can make it hard to read.</flushboth>
 
-<center>
+    <center>
 
     <bold>Center</bold>
 
@@ -149,7 +149,6 @@ spaces that are needed on the screen can make it hard to 
read.</flushboth>
     justification.
 
 
-
 </center><flushboth>Note that justification can only change at hard newlines, 
because
 that is the unit over which filling gets done.</flushboth></indent>
 
@@ -189,7 +188,14 @@ as possible.
 
 
 The text/enriched standard is defined in </indent>Internet<indent> RFC 1896
-(<<http://www.ietf.org/rfc/rfc1896.txt>).</indent>
+(<<http://www.ietf.org/rfc/rfc1896.txt>).
+
+
+To make format annotations visible and possibly edit them, tell
+Emacs to display the markup:
+
+
+<fixed><indent>M-x enriched-toggle-markup RET</indent></fixed></indent>
 
 
 
<x-bg-color><param>blue</param><x-color><param>white</param><bold>CUSTOMIZATION</bold></x-color></x-bg-color><bold>
diff --git a/etc/images/tree-widget/default/nohandle-guide.png 
b/etc/images/tree-widget/default/nohandle-guide.png
new file mode 100644
index 0000000000..85fa0c87b7
Binary files /dev/null and b/etc/images/tree-widget/default/nohandle-guide.png 
differ
diff --git a/etc/images/tree-widget/default/nohandle-guide.xpm 
b/etc/images/tree-widget/default/nohandle-guide.xpm
new file mode 100644
index 0000000000..85b3cec00c
--- /dev/null
+++ b/etc/images/tree-widget/default/nohandle-guide.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * guide_xpm[] = {
+"6 21 2 1",
+"      c None",
+".     c #ADA5C6",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     .",
+"     ."};
diff --git a/etc/images/tree-widget/folder/nohandle-guide.png 
b/etc/images/tree-widget/folder/nohandle-guide.png
new file mode 100644
index 0000000000..8535f86f3b
Binary files /dev/null and b/etc/images/tree-widget/folder/nohandle-guide.png 
differ
diff --git a/etc/images/tree-widget/folder/nohandle-guide.xpm 
b/etc/images/tree-widget/folder/nohandle-guide.xpm
new file mode 100644
index 0000000000..647d059017
--- /dev/null
+++ b/etc/images/tree-widget/folder/nohandle-guide.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * guide_xpm[] = {
+"6 22 2 1",
+"      c None",
+".     c #ADA5C6",
+"      ",
+"     .",
+"      ",
+"     .",
+"      ",
+"     .",
+"      ",
+"     .",
+"      ",
+"     .",
+"      ",
+"     .",
+"      ",
+"     .",
+"      ",
+"     .",
+"      ",
+"     .",
+"      ",
+"     .",
+"      ",
+"     ."};
diff --git a/etc/publicsuffix.txt b/etc/publicsuffix.txt
index 220ad30e48..f52169116e 100644
--- a/etc/publicsuffix.txt
+++ b/etc/publicsuffix.txt
@@ -7130,7 +7130,7 @@ org.zw
 
 // newGTLDs
 
-// List of new gTLDs imported from 
https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 
2022-04-30T15:14:46Z
+// List of new gTLDs imported from 
https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 
2022-05-18T15:16:02Z
 // This list is auto-generated, don't edit it manually.
 // aaa : 2015-02-26 American Automobile Association, Inc.
 aaa
@@ -8851,7 +8851,7 @@ lincoln
 // linde : 2014-12-04 Linde Aktiengesellschaft
 linde
 
-// link : 2013-11-14 UNR Corp.
+// link : 2013-11-14 Nova Registry Ltd
 link
 
 // lipsy : 2015-06-25 Lipsy Ltd
@@ -12281,6 +12281,10 @@ blogspot.vn
 // Submitted by Niels Martignene <hello@goupile.fr>
 goupile.fr
 
+// Government of the Netherlands: https://www.government.nl
+// Submitted by <domeinnaam@minaz.nl>
+gov.nl
+
 // Group 53, LLC : https://www.group53.com
 // Submitted by Tyler Todd <noc@nova53.net>
 awsmppl.com
@@ -12357,7 +12361,6 @@ ltd.ng
 ngo.ng
 edu.scot
 sch.so
-org.yt
 
 // HostyHosting (hostyhosting.com)
 hostyhosting.io
@@ -13389,6 +13392,12 @@ rocky.page
 спб.рус
 я.рус
 
+// Salesforce.com, Inc. https://salesforce.com/
+// Submitted by Michael Biven <mbiven@salesforce.com>
+builder.code.com
+dev-builder.code.com
+stg-builder.code.com
+
 // Sandstorm Development Group, Inc. : https://sandcats.io/
 // Submitted by Asheesh Laroia <asheesh@sandstorm.io>
 sandcats.io
@@ -13812,6 +13821,15 @@ hk.org
 ltd.hk
 inc.hk
 
+// UNIVERSAL DOMAIN REGISTRY : https://www.udr.org.yt/
+// see also: whois -h whois.udr.org.yt help
+// Submitted by Atanunu Igbunuroghene <publicsuffixlist@udr.org.yt>
+name.pm
+sch.tf
+biz.wf
+sch.wf
+org.yt
+
 // United Gameserver GmbH : https://united-gameserver.de
 // Submitted by Stefan Schwarz <sysadm@united-gameserver.de>
 virtualuser.de
diff --git a/etc/refcards/orgcard.tex b/etc/refcards/orgcard.tex
index 2b4718805a..bb4bc5b25d 100644
--- a/etc/refcards/orgcard.tex
+++ b/etc/refcards/orgcard.tex
@@ -1,5 +1,5 @@
 % Reference Card for Org Mode
-\def\orgversionnumber{9.5.3}
+\def\orgversionnumber{9.5.4}
 \def\versionyear{2021}          % latest update
 \input emacsver.tex
 
diff --git a/etc/themes/leuven-dark-theme.el b/etc/themes/leuven-dark-theme.el
index d85f8f1aa9..3fbb9d6c99 100644
--- a/etc/themes/leuven-dark-theme.el
+++ b/etc/themes/leuven-dark-theme.el
@@ -1,4 +1,4 @@
-;;; leuven-dark-theme.el --- Awesome Emacs color theme on dark background
+;;; leuven-dark-theme.el --- Awesome Emacs color theme on dark background  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 2003-2022 Free Software Foundation, Inc.
 
@@ -103,7 +103,7 @@ more...")
 
       ;; Leuven generic colors.
       (cancel '(:slant italic :strike-through t :foreground "#5b5660"))
-      (clock-line '(:box (:line-width 1 :color "#cfa161") :foreground 
"#ffffff" :background "#1636ff"))
+      ;; (clock-line '(:box (:line-width 1 :color "#cfa161") :foreground 
"#ffffff" :background "#1636ff"))
       (code-block '(:foreground "#ffff7f" :background "#252046"))
       (code-inline '(:foreground "#ff9bff" :background "#262031"))
       (column '(:height 1.0 :weight normal :slant normal :underline nil 
:strike-through nil :foreground "#1e52b8" :background "#252c48"))
@@ -124,10 +124,10 @@ more...")
       (grep-file-name '(:weight bold :foreground "#d8b76b")) ; Used for grep 
hits.
       (grep-line-number '(:weight bold :foreground "#5fca5b"))
       (highlight-blue '(:background "#3c312a"))
-      (highlight-blue2 '(:background "#3e2d2f"))
+      ;; (highlight-blue2 '(:background "#3e2d2f"))
       (highlight-gray '(:background "#3e3944"))
-      (highlight-green '(:background "#2f0e3a"))
-      (highlight-red '(:background "#063741"))
+      ;; (highlight-green '(:background "#2f0e3a"))
+      ;; (highlight-red '(:background "#063741"))
       (highlight-yellow '(:background "#2d2058"))
       (link '(:weight normal :underline t :foreground "#ff925a"))
       (link-no-underline '(:weight normal :foreground "#ff925a"))
diff --git a/etc/themes/manoj-dark-theme.el b/etc/themes/manoj-dark-theme.el
index b70620fe21..c7d2d3fee5 100644
--- a/etc/themes/manoj-dark-theme.el
+++ b/etc/themes/manoj-dark-theme.el
@@ -400,7 +400,7 @@ jarring angry fruit salad look to reduce eye fatigue.")
  '(compilation-warning-face ((t (:bold t :foreground "Orange" :weight bold))))
  '(completions-common-part ((t (:width normal :weight normal
                                 :slant normal :foreground "WhiteSmoke"
-                               :background "black" :height 81))))
+                               :background "black" :height 0.9))))
  '(completions-first-difference ((t (:bold t :weight bold))))
 
  '(css-selector ((t (:foreground "LightSteelBlue"))))
diff --git a/etc/themes/modus-operandi-theme.el 
b/etc/themes/modus-operandi-theme.el
index be80b39410..646504636f 100644
--- a/etc/themes/modus-operandi-theme.el
+++ b/etc/themes/modus-operandi-theme.el
@@ -3,8 +3,8 @@
 ;; Copyright (C) 2019-2022  Free Software Foundation, Inc.
 
 ;; Author: Protesilaos Stavrou <info@protesilaos.com>
-;; URL: https://gitlab.com/protesilaos/modus-themes
-;; Version: 2.3.0
+;; URL: https://git.sr.ht/~protesilaos/modus-themes
+;; Version: 2.4.1
 ;; Package-Requires: ((emacs "27.1"))
 ;; Keywords: faces, theme, accessibility
 
diff --git a/etc/themes/modus-themes.el b/etc/themes/modus-themes.el
index 1c52223950..f068e4a214 100644
--- a/etc/themes/modus-themes.el
+++ b/etc/themes/modus-themes.el
@@ -3,9 +3,9 @@
 ;; Copyright (C) 2019-2022  Free Software Foundation, Inc.
 
 ;; Author: Protesilaos Stavrou <info@protesilaos.com>
-;; URL: https://gitlab.com/protesilaos/modus-themes
-;; Version: 2.3.0
-;; Last-Modified: <2022-04-01 12:33:34 +0300>
+;; URL: https://git.sr.ht/~protesilaos/modus-themes
+;; Mailing list: https://lists.sr.ht/~protesilaos/modus-themes
+;; Version: 2.4.1
 ;; Package-Requires: ((emacs "27.1"))
 ;; Keywords: faces, theme, accessibility
 
@@ -68,306 +68,8 @@
 ;;     modus-themes-operandi-color-overrides       (alist)
 ;;     modus-themes-vivendi-color-overrides        (alist)
 ;;
-;; Below is the list of explicitly supported packages or face groups
-;; (there are implicitly supported packages as well, which inherit from
-;; font-lock or some basic group).  You are encouraged to report any
-;; missing package or change you would like to see.
-;;
-;;     ace-window
-;;     alert
-;;     all-the-icons
-;;     all-the-icons-dired
-;;     all-the-icons-ibuffer
-;;     annotate
-;;     ansi-color
-;;     anzu
-;;     apropos
-;;     artbollocks-mode
-;;     auctex and TeX
-;;     auto-dim-other-buffers
-;;     avy
-;;     awesome-tray
-;;     bbdb
-;;     binder
-;;     bm
-;;     bongo
-;;     boon
-;;     bookmark
-;;     breakpoint (provided by built-in gdb-mi.el)
-;;     calendar and diary
-;;     calfw
-;;     centaur-tabs
-;;     cfrs
-;;     change-log and log-view (`vc-print-log' and `vc-print-root-log')
-;;     cider
-;;     circe
-;;     citar
-;;     color-rg
-;;     column-enforce-mode
-;;     company-mode
-;;     company-posframe
-;;     compilation-mode
-;;     completions
-;;     consult
-;;     corfu
-;;     counsel
-;;     counsel-css
-;;     cov
-;;     cperl-mode
-;;     css-mode
-;;     csv-mode
-;;     ctrlf
-;;     cursor-flash
-;;     custom (M-x customize)
-;;     dap-mode
-;;     dashboard (emacs-dashboard)
-;;     deadgrep
-;;     debbugs
-;;     deft
-;;     devdocs
-;;     dictionary
-;;     diff-hl
-;;     diff-mode
-;;     dim-autoload
-;;     dir-treeview
-;;     Dired
-;;     dired-async
-;;     dired-git
-;;     dired-git-info
-;;     dired-narrow
-;;     dired-subtree
-;;     diredfl
-;;     diredp (dired+)
-;;     display-fill-column-indicator-mode
-;;     doom-modeline
-;;     dynamic-ruler
-;;     easy-jekyll
-;;     ebdb
-;;     ediff
-;;     eglot
-;;     el-search
-;;     eldoc
-;;     eldoc-box
-;;     elfeed
-;;     elfeed-score
-;;     elpher
-;;     embark
-;;     ement (ement.el)
-;;     emms
-;;     enh-ruby-mode (enhanced-ruby-mode)
-;;     epa
-;;     equake
-;;     erc
-;;     eros
-;;     ert
-;;     eshell
-;;     eshell-fringe-status
-;;     eshell-git-prompt
-;;     eshell-prompt-extras (epe)
-;;     eshell-syntax-highlighting
-;;     evil (evil-mode)
-;;     evil-goggles
-;;     evil-snipe
-;;     evil-visual-mark-mode
-;;     eww
-;;     exwm
-;;     eyebrowse
-;;     fancy-dabbrev
-;;     flycheck
-;;     flycheck-color-mode-line
-;;     flycheck-indicator
-;;     flycheck-posframe
-;;     flymake
-;;     flyspell
-;;     flx
-;;     freeze-it
-;;     frog-menu
-;;     focus
-;;     fold-this
-;;     font-lock (generic syntax highlighting)
-;;     forge
-;;     fountain (fountain-mode)
-;;     geiser
-;;     git-commit
-;;     git-gutter (and variants)
-;;     git-rebase
-;;     git-timemachine
-;;     gnus
-;;     gotest
-;;     golden-ratio-scroll-screen
-;;     helm
-;;     helm-ls-git
-;;     helm-switch-shell
-;;     helm-xref
-;;     helpful
-;;     highlight-indentation
-;;     highlight-numbers
-;;     highlight-thing
-;;     hl-defined
-;;     hl-fill-column
-;;     hl-line-mode
-;;     hl-todo
-;;     hydra
-;;     ibuffer
-;;     icomplete
-;;     ido-mode
-;;     iedit
-;;     iflipb
-;;     image-dired
-;;     imenu-list
-;;     indium
-;;     info
-;;     info-colors
-;;     interaction-log
-;;     ioccur
-;;     isearch, occur, etc.
-;;     ivy
-;;     ivy-posframe
-;;     jira (org-jira)
-;;     journalctl-mode
-;;     js2-mode
-;;     julia
-;;     jupyter
-;;     kaocha-runner
-;;     keycast
-;;     ledger-mode
-;;     line numbers (`display-line-numbers-mode' and global variant)
-;;     lsp-mode
-;;     lsp-ui
-;;     macrostep
-;;     magit
-;;     magit-imerge
-;;     make-mode
-;;     man
-;;     marginalia
-;;     markdown-mode
-;;     markup-faces (`adoc-mode')
-;;     mct
-;;     mentor
-;;     messages
-;;     mini-modeline
-;;     minimap
-;;     mmm-mode
-;;     mode-line
-;;     mood-line
-;;     mpdel
-;;     mu4e
-;;     multiple-cursors
-;;     nano-modeline
-;;     neotree
-;;     notmuch
-;;     num3-mode
-;;     nxml-mode
-;;     orderless
-;;     org
-;;     org-journal
-;;     org-noter
-;;     org-pomodoro
-;;     org-recur
-;;     org-roam
-;;     org-superstar
-;;     org-table-sticky-header
-;;     org-tree-slide
-;;     org-treescope
-;;     origami
-;;     outline-mode
-;;     outline-minor-faces
-;;     package (M-x list-packages)
-;;     page-break-lines
-;;     pandoc-mode
-;;     paradox
-;;     paren-face
-;;     pass
-;;     pdf-tools
-;;     persp-mode
-;;     perspective
-;;     phi-grep
-;;     pomidor
-;;     popup
-;;     powerline
-;;     powerline-evil
-;;     prism (see "Note for prism.el" in the manual)
-;;     proced
-;;     prodigy
-;;     pulse
-;;     pyim
-;;     quick-peek
-;;     racket-mode
-;;     rainbow-blocks
-;;     rainbow-delimiters
-;;     rcirc
-;;     recursion-indicator
-;;     regexp-builder (also known as `re-builder')
-;;     rg
-;;     ripgrep
-;;     rmail
-;;     ruler-mode
-;;     selectrum
-;;     selectrum-prescient
-;;     semantic
-;;     sesman
-;;     shell-script-mode
-;;     shortdoc
-;;     show-paren-mode
-;;     shr
-;;     side-notes
-;;     sieve-mode
-;;     skewer-mode
-;;     slime (sldb)
-;;     sly
-;;     smart-mode-line
-;;     smartparens
-;;     smerge
-;;     spaceline
-;;     speedbar
-;;     stripes
-;;     suggest
-;;     switch-window
-;;     swiper
-;;     sx
-;;     symbol-overlay
-;;     syslog-mode
-;;     tab-bar-groups
-;;     tab-bar-mode
-;;     tab-line-mode
-;;     table (built-in table.el)
-;;     telega
-;;     telephone-line
-;;     terraform-mode
-;;     term
-;;     textsec
-;;     tomatinho
-;;     transient (pop-up windows like Magit's)
-;;     trashed
-;;     treemacs
-;;     tty-menu
-;;     tuareg
-;;     typescript
-;;     undo-tree
-;;     vc (vc-dir.el, vc-hooks.el)
-;;     vc-annotate (C-x v g)
-;;     vertico
-;;     vertico-quick
-;;     vimish-fold
-;;     visible-mark
-;;     visual-regexp
-;;     vterm
-;;     wcheck-mode
-;;     web-mode
-;;     wgrep
-;;     which-function-mode
-;;     which-key
-;;     whitespace-mode
-;;     window-divider-mode
-;;     winum
-;;     writegood-mode
-;;     woman
-;;     xah-elisp-mode
-;;     xref
-;;     xterm-color (and ansi-colors)
-;;     yaml-mode
-;;     yasnippet
-;;     ztree
+;; Check the manual for all supported packages (there are hundreds of
+;; them).
 ;;
 ;; For a complete view of the project, also refer to the following files
 ;; (should be distributed in the same repository/directory as the
@@ -383,7 +85,6 @@
 (eval-when-compile
   (require 'cl-lib)
   (require 'subr-x))
-(require 'seq)
 
 (defgroup modus-themes ()
   "Options for `modus-operandi', `modus-vivendi'.
@@ -407,6 +108,36 @@ cover the blue-cyan-magenta side of the spectrum."
   :prefix "modus-themes-"
   :tag "Modus Themes Faces")
 
+(defvar modus-themes--version "2.5.0-dev"
+  "Current version of the Modus themes.
+
+The version either is the last tagged release, such as '2.4.0',
+or an in-development version like '2.5.0-dev'.  As we use
+semantic versioning, tags of the '2.4.1' sort are not reported:
+those would count as part of '2.5.0-dev'.")
+
+;;;###autoload
+(defun modus-themes-version (&optional insert)
+  "Print `modus-themes--version' in the echo area.
+If optional INSERT argument is provided from Lisp or as a prefix
+argument, insert the `modus-themes--version' at point."
+  (interactive "P")
+  (if-let ((version modus-themes--version)
+           ((or insert current-prefix-arg)))
+      (insert version)
+    (message version)))
+
+;;;###autoload
+(defun modus-themes-report-bug ()
+  "Submit a bug report or issue to the Modus themes developers."
+  (interactive)
+  (reporter-submit-bug-report
+   "~protesilaos/modus-themes@lists.sr.ht"
+   (format "modus-themes (%s)\n" modus-themes--version)
+   ;; I am just getting started with this.  Let's first see what people
+   ;; think about it.
+   nil nil nil nil))
+
 ;;; Variables for each theme variant
 
 ;;;; Modus Operandi
@@ -561,7 +292,8 @@ cover the blue-cyan-magenta side of the spectrum."
     ;; while bg-tab-inactive should be combined with fg-dim, whereas
     ;; bg-tab-inactive-alt goes together with fg-main
     ;;
-    ;; bg-completion-* variants are meant to be combined with fg-main
+    ;; bg-completion-* and bg-char-* variants are meant to be combined
+    ;; with fg-main
     ;;
     ;; fg-escape-char-construct and fg-escape-char-backslash can
     ;; be combined bg-main, bg-dim, bg-alt
@@ -595,6 +327,10 @@ cover the blue-cyan-magenta side of the spectrum."
     (bg-completion . "#b7dbff")
     (bg-completion-subtle . "#def3ff")
 
+    (bg-char-0 . "#7feaff")
+    (bg-char-1 . "#ffaaff")
+    (bg-char-2 . "#dff000")
+
     (bg-tab-active . "#f6f6f6")
     (bg-tab-inactive . "#b7b7b7")
     (bg-tab-inactive-accent . "#a9b4f6")
@@ -807,7 +543,8 @@ symbol and the latter as a string.")
     ;; while bg-tab-inactive should be combined with fg-dim, whereas
     ;; bg-tab-inactive-alt goes together with fg-main
     ;;
-    ;; bg-completion-* variants are meant to be combined with fg-main
+    ;; bg-completion-* and bg-char-* variants are meant to be combined
+    ;; with fg-main
     ;;
     ;; fg-escape-char-construct and fg-escape-char-backslash can
     ;; be combined bg-main, bg-dim, bg-alt
@@ -841,6 +578,10 @@ symbol and the latter as a string.")
     (bg-completion . "#142f69")
     (bg-completion-subtle . "#0e194b")
 
+    (bg-char-0 . "#0050af")
+    (bg-char-1 . "#7f1f7f")
+    (bg-char-2 . "#625a00")
+
     (bg-tab-active . "#0e0e0e")
     (bg-tab-inactive . "#424242")
     (bg-tab-inactive-accent . "#35398f")
@@ -1449,9 +1190,8 @@ The actual styling of the face is done by 
`modus-themes-faces'."
 
 (defface modus-themes-variable-pitch nil
   "Generic face for applying a conditional `variable-pitch'.
-This behaves in accordance with `modus-themes-mixed-fonts',
-`modus-themes-variable-pitch-headings' for all heading levels,
-and `modus-themes-variable-pitch-ui'.
+This behaves in accordance with `modus-themes-mixed-fonts' and/or
+`modus-themes-variable-pitch-ui'.
 
 The actual styling of the face is done by `modus-themes-faces'."
   :group 'modus-themes-faces)
@@ -3142,13 +2882,15 @@ In user configuration files the form may look like this:
         value
       (modus-themes--warn option))))
 
-(defun modus-themes--alist-or-seq (properties alist-key seq-pred seq-default)
-  "Return value from alist or sequence.
+(defun modus-themes--property-lookup (properties alist-key list-pred default)
+  "Return value from property alist or list.
 Check PROPERTIES for an alist value that corresponds to
 ALIST-KEY.  If no alist is present, search the PROPERTIES
-sequence given SEQ-PRED, using SEQ-DEFAULT as a fallback."
+list given LIST-PRED, using DEFAULT as a fallback."
   (if-let* ((val (or (alist-get alist-key properties)
-                     (seq-find seq-pred properties seq-default)))
+                     (cl-loop for x in properties
+                              if (funcall list-pred x) return x)
+                     default))
             ((listp val)))
       (car val)
     val))
@@ -3192,8 +2934,11 @@ Those are stored in `modus-themes-faces' and
 
 (defun modus-themes--current-theme ()
   "Return current modus theme."
-  (car (seq-filter (lambda (arg) (string-match-p "^modus" (symbol-name arg)))
-                   custom-enabled-themes)))
+  (car
+   (seq-filter
+    (lambda (theme)
+      (string-match-p "^modus" (symbol-name theme)))
+    custom-enabled-themes)))
 
 ;; Helper functions that are meant to ease the implementation of the
 ;; above customization variables.
@@ -3245,11 +2990,11 @@ foreground.  INTENSEFG is an alternative to the 
default."
      (cond
       ((and (memq 'bold properties)
             (memq 'italic properties))
-       (list 'modus-themes-fixed-pitch 'bold-italic))
+       (list 'bold-italic 'modus-themes-fixed-pitch))
       ((memq 'italic properties)
-       (list 'modus-themes-fixed-pitch 'italic))
+       (list 'italic 'modus-themes-fixed-pitch))
       ((memq 'bold properties)
-       (list 'modus-themes-fixed-pitch 'bold))
+       (list 'bold 'modus-themes-fixed-pitch))
       (t 'modus-themes-fixed-pitch))
      :background
      (cond
@@ -3368,10 +3113,10 @@ theme's fallback text color."
 
 (defun modus-themes--paren (normalbg intensebg)
   "Conditional use of intense colors for matching parentheses.
-NORMALBG should be the special palette color `bg-paren-match' or
+NORMALBG should be the special palette color 'bg-paren-match' or
 something similar.  INTENSEBG must be easier to discern next to
 other backgrounds, such as the special palette color
-`bg-paren-match-intense'."
+'bg-paren-match-intense'."
   (let ((properties (modus-themes--list-or-warn 'modus-themes-paren-match)))
     (list :inherit
           (if (memq 'bold properties)
@@ -3521,7 +3266,7 @@ that combines well with the background and foreground."
             fg-alt)
            (fg))
           :height
-          (modus-themes--alist-or-seq properties 'height #'floatp 'unspecified)
+          (modus-themes--property-lookup properties 'height #'floatp 
'unspecified)
           :weight
           (or weight 'unspecified)
           :overline
@@ -3546,7 +3291,7 @@ FG is the foreground color to use."
           (or weight 'unspecified)
           :height
           (cond ((memq 'no-scale properties) 'unspecified)
-                ((modus-themes--alist-or-seq properties 'height #'floatp 
1.15)))
+                ((modus-themes--property-lookup properties 'height #'floatp 
1.15)))
           :foreground fg)))
 
 (defun modus-themes--agenda-date (defaultfg grayscalefg &optional workaholicfg 
grayscaleworkaholicfg bg bold ul)
@@ -3581,7 +3326,7 @@ weight.  Optional UL applies an underline."
            (t
             defaultfg))
           :height
-          (modus-themes--alist-or-seq properties 'height #'floatp 'unspecified)
+          (modus-themes--property-lookup properties 'height #'floatp 
'unspecified)
           :underline
           (if (and ul (memq 'underline-today properties))
               t
@@ -3637,8 +3382,8 @@ clearly distinguishes past, present, future tasks."
 (defun modus-themes--agenda-habit (default traffic simple &optional default-d 
traffic-d simple-d)
   "Specify background values for `modus-themes-org-agenda' habits.
 DEFAULT is the original foregrounc color.  TRAFFIC is to be used
-when the `traffic-light' style is applied, while SIMPLE
-corresponds to the \"simplified style\".
+when the 'traffic-light' style is applied, while SIMPLE
+corresponds to the 'simplified style'.
 
 Optional DEFAULT-D, TRAFFIC-D, SIMPLE-D are alternatives to the
 main colors, meant for dopia when `modus-themes-deuteranopia' is
@@ -3712,8 +3457,8 @@ Optional FG-DISTANT should be close to the main background
 values.  It is intended to be used as a distant-foreground
 property."
   (let* ((properties (modus-themes--list-or-warn 'modus-themes-mode-line))
-         (padding (modus-themes--alist-or-seq properties 'padding #'natnump 1))
-         (height (modus-themes--alist-or-seq properties 'height #'floatp 
'unspecified))
+         (padding (modus-themes--property-lookup properties 'padding #'natnump 
1))
+         (height (modus-themes--property-lookup properties 'height #'floatp 
'unspecified))
          (padded (> padding 1))
          (base (cond ((memq 'accented properties)
                       (cons fg-accent bg-accent))
@@ -3778,10 +3523,14 @@ property."
 ;; Basically this is just for the keycast key indicator.
 (defun modus-themes--mode-line-padded-box (color)
   "Set padding of mode line box attribute with given COLOR."
-  (let ((padding (seq-find #'natnump modus-themes-mode-line 1)))
-    (list :box (list :line-width padding :color color))))
-
-(defun modus-themes--diff (mainbg mainfg altbg altfg &optional deuteranbg 
deuteranfg  bg-only-fg)
+  (list :box (list :color color
+                   :line-width
+                   (or (cl-loop
+                        for x in modus-themes-mode-line
+                        if (natnump x) return x)
+                       1))))
+
+(defun modus-themes--diff (mainbg mainfg altbg altfg &optional deubg deufg 
deualtbg deualtfg bg-only-fg)
   "Color combinations for `modus-themes-diffs'.
 
 MAINBG must be one of the dedicated backgrounds for diffs while
@@ -3791,13 +3540,20 @@ ALTBG needs to be a slightly accented background that 
is meant to
 be combined with ALTFG.  Both must be less intense than MAINBG
 and MAINFG respectively.
 
-DEUTERANBG and DEUTERANFG must be combinations of colors that account
-for red-green color defficiency (deuteranopia).
+DEUBG and DEUFG must be combinations of colors that account for
+red-green color defficiency (deuteranopia).  They are the
+equivalent of MAINBG and MAINFG.
+
+DEUALTBG and DEUALTFG are the equivalent of ALTBG and ALTFG for
+deuteranopia.
 
-Optional BG-ONLY-FG applies ALTFG else leaves the foreground
-unspecified."
+Optional non-nil BG-ONLY-FG applies ALTFG else leaves the
+foreground unspecified."
   (if modus-themes-deuteranopia
-      (list :background (or deuteranbg mainbg) :foreground (or deuteranfg 
mainfg))
+      (pcase modus-themes-diffs
+        ('desaturated (list :background (or deualtbg altbg) :foreground (or 
deualtfg altfg)))
+        ('bg-only (list :background (or deualtbg altbg) :foreground (if 
bg-only-fg (or deualtfg altfg) 'unspecified)))
+        (_ (list :background (or deubg mainbg) :foreground (or deufg mainfg))))
     (pcase modus-themes-diffs
       ('desaturated (list :background altbg :foreground altfg))
       ('bg-only (list :background altbg :foreground (if bg-only-fg altfg 
'unspecified)))
@@ -4114,7 +3870,7 @@ pressed button style, else the released button."
            (weight weight)
            ('unspecified))
           :height
-          (modus-themes--alist-or-seq properties 'height #'floatp 'unspecified)
+          (modus-themes--property-lookup properties 'height #'floatp 
'unspecified)
           :underline
           (if (memq 'underline properties)
               t
@@ -4379,7 +4135,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
       ((,class ,@(modus-themes--diff
                   bg-diff-focus-added fg-diff-focus-added
                   green-nuanced-bg fg-diff-added
-                  bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran))))
+                  bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran
+                  blue-nuanced-bg fg-diff-added-deuteran))))
     `(modus-themes-diff-changed
       ((,class ,@(modus-themes--diff
                   bg-diff-focus-changed fg-diff-focus-changed
@@ -4392,7 +4149,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
       ((,class ,@(modus-themes--diff
                   bg-diff-refine-added fg-diff-refine-added
                   bg-diff-focus-added fg-diff-focus-added
-                  bg-diff-refine-added-deuteran 
fg-diff-refine-added-deuteran))))
+                  bg-diff-refine-added-deuteran fg-diff-refine-added-deuteran
+                  bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran))))
     `(modus-themes-diff-refine-changed
       ((,class ,@(modus-themes--diff
                   bg-diff-refine-changed fg-diff-refine-changed
@@ -4405,7 +4163,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
       ((,class ,@(modus-themes--diff
                   bg-diff-focus-added fg-diff-focus-added
                   bg-diff-added fg-diff-added
-                  bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran))))
+                  bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran
+                  bg-diff-added-deuteran fg-diff-added-deuteran))))
     `(modus-themes-diff-focus-changed
       ((,class ,@(modus-themes--diff
                   bg-diff-focus-changed fg-diff-focus-changed
@@ -4419,6 +4178,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                   bg-diff-heading fg-diff-heading
                   cyan-nuanced-bg cyan-nuanced-fg
                   bg-header fg-main
+                  bg-header fg-main
                   t))))
 ;;;;; deuteranopia-specific
     `(modus-themes-grue ((,class :foreground ,@(modus-themes--deuteran blue 
green))))
@@ -4564,7 +4324,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                        bg-region blue-intense-bg
                                        fg-alt blue-intense)
                                     :extend t)))
-    `(modus-themes-key-binding ((,class :inherit bold :foreground 
,blue-alt-other)))
+    `(modus-themes-key-binding ((,class :inherit (bold 
modus-themes-fixed-pitch)
+                                        :foreground ,blue-alt-other)))
     `(modus-themes-prompt ((,class ,@(modus-themes--prompt
                                       cyan-alt-other blue-alt-other fg-alt
                                       cyan-nuanced-bg blue-refine-bg fg-main
@@ -4592,7 +4353,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(elisp-shorthand-font-lock-face ((,class :inherit 
font-lock-variable-name-face)))
     `(error ((,class :inherit bold :foreground ,red)))
     `(escape-glyph ((,class :foreground ,fg-escape-char-construct)))
-    `(file-name-shadow ((,class :inherit (shadow italic))))
+    `(file-name-shadow ((,class :inherit shadow)))
     `(header-line ((,class :inherit modus-themes-ui-variable-pitch
                            :background ,bg-header :foreground ,fg-header)))
     `(header-line-highlight ((,class :inherit highlight)))
@@ -4759,10 +4520,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; avy
     `(avy-background-face ((,class :background ,bg-dim :foreground ,fg-dim 
:extend t)))
     `(avy-goto-char-timer-face ((,class :inherit (modus-themes-intense-neutral 
bold))))
-    `(avy-lead-face ((,class :inherit (modus-themes-intense-blue bold 
modus-themes-reset-soft))))
-    `(avy-lead-face-0 ((,class :inherit (modus-themes-refine-magenta bold 
modus-themes-reset-soft))))
+    `(avy-lead-face ((,class :inherit (bold modus-themes-reset-soft) 
:background ,bg-char-0)))
+    `(avy-lead-face-0 ((,class :inherit (bold modus-themes-reset-soft) 
:background ,bg-char-1)))
     `(avy-lead-face-1 ((,class :inherit (modus-themes-special-warm 
modus-themes-reset-soft))))
-    `(avy-lead-face-2 ((,class :inherit (modus-themes-refine-green bold 
modus-themes-reset-soft))))
+    `(avy-lead-face-2 ((,class :inherit (bold modus-themes-reset-soft) 
:background ,bg-char-2)))
 ;;;;; aw (ace-window)
     `(aw-background-face ((,class :foreground ,fg-unfocused)))
     `(aw-key-face ((,class :inherit modus-themes-key-binding)))
@@ -4849,6 +4610,27 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(cfw:face-toolbar-button-off ((,class :inherit shadow)))
     `(cfw:face-toolbar-button-on ((,class :inherit bold :background 
,blue-nuanced-bg
                                           :foreground ,blue-alt)))
+;;;;; calibredb
+    `(calibredb-archive-face ((,class :foreground ,magenta-alt-faint)))
+    `(calibredb-author-face ((,class :foreground ,blue-faint)))
+    `(calibredb-comment-face ((,class :inherit shadow)))
+    `(calibredb-date-face ((,class :foreground ,cyan)))
+    `(calibredb-edit-annotation-header-title-face ((,class :inherit bold)))
+    `(calibredb-favorite-face ((,class :foreground ,red-alt)))
+    `(calibredb-file-face (( )))
+    `(calibredb-format-face ((,class :foreground ,cyan-faint)))
+    `(calibredb-highlight-face ((,class :inherit success)))
+    `(calibredb-id-face (( )))
+    `(calibredb-ids-face (( )))
+    `(calibredb-search-header-highlight-face ((,class :inherit 
modus-themes-hl-line)))
+    `(calibredb-search-header-library-name-face ((,class :foreground 
,blue-active)))
+    `(calibredb-search-header-library-path-face ((,class :inherit bold)))
+    `(calibredb-search-header-sort-face ((,class :inherit bold :foreground 
,magenta-active)))
+    `(calibredb-search-header-total-face ((,class :inherit bold :foreground 
,cyan-active)))
+    `(calibredb-search-header-filter-face ((,class :inherit bold)))
+    `(calibredb-mark-face ((,class :inherit modus-themes-mark-sel)))
+    `(calibredb-size-face (( )))
+    `(calibredb-tag-face ((,class :foreground ,magenta-alt-faint)))
 ;;;;; centaur-tabs
     `(centaur-tabs-active-bar-face ((,class :background ,blue-active)))
     `(centaur-tabs-close-mouse-face ((,class :inherit bold :foreground 
,red-active :underline t)))
@@ -4992,6 +4774,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(corfu-bar ((,class :background ,fg-alt)))
     `(corfu-border ((,class :background ,bg-active)))
     `(corfu-default ((,class :background ,bg-alt)))
+;;;;; corfu-quick
+    `(corfu-quick1 ((,class :inherit bold :background ,bg-char-0)))
+    `(corfu-quick2 ((,class :inherit bold :background ,bg-char-1)))
 ;;;;; counsel
     `(counsel-active-mode ((,class :foreground ,magenta-alt-other)))
     `(counsel-application-name ((,class :foreground ,red-alt-other)))
@@ -5323,6 +5108,13 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(ediff-odd-diff-Ancestor ((,class :inherit ediff-even-diff-Ancestor)))
     `(ediff-odd-diff-B ((,class :inherit ediff-even-diff-B)))
     `(ediff-odd-diff-C ((,class :inherit ediff-even-diff-C)))
+;;;;; ein (Emacs IPython Notebook)
+    `(ein:basecell-input-area-face ((,class :background ,bg-dim :extend t)))
+    `(ein:cell-output-area (( )))
+    `(ein:cell-output-area-error ((,class :background ,red-nuanced-bg :extend 
t)))
+    `(ein:cell-output-stderr ((,class :background ,red-nuanced-bg :extend t)))
+    `(ein:markdowncell-input-area-face (( )))
+    `(ein:notification-tab-normal ((,class :underline t)))
 ;;;;; eglot
     `(eglot-mode-line ((,class :inherit modus-themes-bold :foreground 
,magenta-active)))
 ;;;;; el-search
@@ -5637,7 +5429,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(font-lock-doc-face ((,class :inherit modus-themes-slant
                                   ,@(modus-themes--syntax-string
                                      fg-docstring fg-special-cold
-                                     fg-special-mild magenta-nuanced-fg
+                                     fg-special-mild fg-special-calm
                                      fg-special-mild magenta-nuanced-fg))))
     `(font-lock-function-name-face ((,class ,@(modus-themes--syntax-extra
                                                magenta magenta-faint
@@ -5651,30 +5443,31 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                                yellow yellow-faint))))
     `(font-lock-preprocessor-face ((,class ,@(modus-themes--syntax-extra
                                               red-alt-other red-alt-other-faint
-                                              blue-alt blue-alt-faint))))
-    `(font-lock-regexp-grouping-backslash ((,class :inherit bold
+                                              cyan-alt-other cyan-alt-faint))))
+    `(font-lock-regexp-grouping-backslash ((,class :inherit modus-themes-bold
                                                    
,@(modus-themes--syntax-string
                                                       fg-escape-char-backslash 
yellow-alt-faint
                                                       yellow-alt magenta-alt
                                                       red-faint 
green-alt-other-faint))))
-    `(font-lock-regexp-grouping-construct ((,class :inherit bold
+    `(font-lock-regexp-grouping-construct ((,class :inherit modus-themes-bold
                                                    
,@(modus-themes--syntax-string
                                                       fg-escape-char-construct 
red-alt-other-faint
                                                       red-alt-other 
blue-alt-other
                                                       blue-faint 
blue-alt-other-faint))))
     `(font-lock-string-face ((,class ,@(modus-themes--syntax-string
                                         blue-alt blue-alt-faint
-                                        green-alt-other red-alt
+                                        green-alt-other red-alt-other
                                         green-alt-faint red-alt-faint))))
     `(font-lock-type-face ((,class :inherit modus-themes-bold
-                                   ,@(modus-themes--syntax-foreground
-                                      cyan-alt-other cyan-alt-faint))))
+                                   ,@(modus-themes--syntax-extra
+                                      cyan-alt-other cyan-alt-faint
+                                      magenta-alt-other 
magenta-alt-other-faint))))
     `(font-lock-variable-name-face ((,class ,@(modus-themes--syntax-extra
                                                cyan cyan-faint
-                                               blue-alt-other 
blue-alt-other-faint))))
+                                               blue-alt blue-alt-faint))))
     `(font-lock-warning-face ((,class :inherit modus-themes-bold
-                                      ,@(modus-themes--syntax-comment
-                                         yellow-active red-active red-faint 
yellow-faint))))
+                                      ,@(modus-themes--syntax-foreground
+                                         yellow-active yellow-alt-faint))))
 ;;;;; forge
     `(forge-post-author ((,class :inherit bold :foreground ,fg-main)))
     `(forge-post-date ((,class :foreground ,fg-special-cold)))
@@ -5685,7 +5478,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(forge-topic-unread ((,class :inherit bold :foreground ,fg-main)))
 ;;;;; fountain-mode
     `(fountain-character ((,class :foreground ,blue-alt-other)))
-    `(fountain-comment ((,class :inherit modus-themes-slant :foreground 
,fg-alt)))
+    `(fountain-comment ((,class :inherit font-lock-comment-face)))
     `(fountain-dialog ((,class :foreground ,blue-alt)))
     `(fountain-metadata-key ((,class :foreground ,green-alt-other)))
     `(fountain-metadata-value ((,class :foreground ,blue)))
@@ -5719,11 +5512,11 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(geiser-font-lock-xref-link ((,class :inherit button)))
 ;;;;; git-commit
     `(git-commit-comment-action ((,class :inherit font-lock-comment-face)))
-    `(git-commit-comment-branch-local ((,class :inherit modus-themes-slant 
:foreground ,blue-alt)))
-    `(git-commit-comment-branch-remote ((,class :inherit modus-themes-slant 
:foreground ,magenta-alt)))
-    `(git-commit-comment-detached ((,class :inherit modus-themes-slant 
:foreground ,cyan-alt)))
-    `(git-commit-comment-file ((,class :inherit modus-themes-slant :foreground 
,cyan)))
-    `(git-commit-comment-heading ((,class :inherit (bold modus-themes-slant))))
+    `(git-commit-comment-branch-local ((,class :inherit font-lock-comment-face 
:foreground ,blue-alt)))
+    `(git-commit-comment-branch-remote ((,class :inherit 
font-lock-comment-face :foreground ,magenta-alt)))
+    `(git-commit-comment-detached ((,class :inherit font-lock-comment-face 
:foreground ,cyan-alt)))
+    `(git-commit-comment-file ((,class :inherit font-lock-comment-face 
:foreground ,cyan)))
+    `(git-commit-comment-heading ((,class :inherit (bold 
font-lock-comment-face))))
     `(git-commit-keyword ((,class :foreground ,magenta)))
     `(git-commit-known-pseudo-header ((,class :foreground ,cyan-alt-other)))
     `(git-commit-nonempty-second-line ((,class :inherit error)))
@@ -5741,8 +5534,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(git-gutter-fr:deleted ((,class :inherit modus-themes-fringe-red)))
     `(git-gutter-fr:modified ((,class :inherit modus-themes-fringe-yellow)))
 ;;;;; git-rebase
-    `(git-rebase-comment-hash ((,class :inherit modus-themes-slant :foreground 
,cyan)))
-    `(git-rebase-comment-heading  ((,class :inherit (bold 
modus-themes-slant))))
+    `(git-rebase-comment-hash ((,class :inherit font-lock-comment-face 
:foreground ,cyan)))
+    `(git-rebase-comment-heading  ((,class :inherit (bold 
font-lock-comment-face))))
     `(git-rebase-description ((,class :foreground ,fg-main)))
     `(git-rebase-hash ((,class :foreground ,cyan-alt-other)))
 ;;;;; git-timemachine
@@ -6114,7 +5907,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(kaocha-runner-warning-face ((,class :inherit warning)))
 ;;;;; keycast
     `(keycast-command ((,class :inherit bold :foreground ,blue-active)))
-    `(keycast-key ((,class ,@(modus-themes--mode-line-padded-box blue-active)
+    ;; FIXME 2022-05-03: The padding breaks `keycast-tab-bar-mode'
+    `(keycast-key ((,class ;; ,@(modus-themes--mode-line-padded-box 
blue-active)
                            :background ,blue-active :foreground ,bg-main)))
 ;;;;; ledger-mode
     `(ledger-font-auto-xact-face ((,class :foreground ,magenta)))
@@ -6128,23 +5922,26 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(ledger-font-payee-uncleared-face ((,class :foreground ,red-alt-other)))
     `(ledger-font-xact-highlight-face ((,class :background ,bg-hl-alt)))
 ;;;;; line numbers (display-line-numbers-mode and global variant)
+    ;; Here we cannot inherit `modus-themes-fixed-pitch'.  We need to
+    ;; fall back to `default' otherwise line numbers do not scale when
+    ;; using `text-scale-adjust'.
     `(line-number
-      ((,class :inherit default
+      ((,class :inherit ,(if modus-themes-mixed-fonts 'fixed-pitch 'default)
                ,@(modus-themes--line-numbers
                   fg-alt bg-dim
                   fg-unfocused))))
     `(line-number-current-line
-      ((,class :inherit (bold default)
+      ((,class :inherit (bold line-number)
                ,@(modus-themes--line-numbers
                   fg-main bg-active
                   blue-alt-other))))
     `(line-number-major-tick
-      ((,class :inherit (bold default)
+      ((,class :inherit (bold line-number)
                ,@(modus-themes--line-numbers
                   yellow-nuanced-fg yellow-nuanced-bg
                   red-alt))))
     `(line-number-minor-tick
-      ((,class :inherit (bold default)
+      ((,class :inherit (bold line-number)
                ,@(modus-themes--line-numbers
                   fg-alt bg-inactive
                   fg-inactive))))
@@ -6228,7 +6025,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(magit-diff-added ((,class ,@(modus-themes--diff
                                    bg-diff-added fg-diff-added
                                    green-nuanced-bg fg-diff-added
-                                   bg-diff-added-deuteran 
fg-diff-added-deuteran))))
+                                   bg-diff-added-deuteran 
fg-diff-added-deuteran
+                                   blue-nuanced-bg fg-diff-added-deuteran))))
     `(magit-diff-added-highlight ((,class :inherit 
modus-themes-diff-focus-added)))
     `(magit-diff-base ((,class ,@(modus-themes--diff
                                   bg-diff-changed fg-diff-changed
@@ -6249,6 +6047,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                           bg-active fg-inactive
                                           bg-inactive fg-inactive
                                           bg-inactive fg-inactive
+                                          nil nil
                                           t))))
     ;; NOTE: we do not follow the pattern of inheriting from
     ;; modus-themes-grue-* faces, as this is a special case.
@@ -6687,9 +6486,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                           :background ,bg-alt)))
     `(org-column-title ((,class :inherit (bold modus-themes-fixed-pitch 
default)
                                 :underline t :background ,bg-alt)))
-    `(org-date ((,class :inherit ,(if modus-themes-mixed-fonts
-                                      '(fixed-pitch modus-themes-link-symlink)
-                                    'modus-themes-link-symlink))))
+    `(org-date ((,class :inherit (modus-themes-link-symlink 
modus-themes-fixed-pitch))))
     `(org-date-selected ((,class :foreground ,blue-alt :inverse-video t)))
     `(org-dispatcher-highlight ((,class :inherit (bold 
modus-themes-mark-alt))))
     `(org-document-info ((,class :foreground ,fg-special-cold)))
@@ -6906,7 +6703,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(popup-summary-face ((,class :background ,bg-active :foreground 
,fg-inactive)))
     `(popup-tip-face ((,class :inherit modus-themes-refine-yellow)))
 ;;;;; powerline
-    `(powerline-active0 ((,class :background ,bg-main :foreground ,blue-faint 
:inverse-video t)))
+    `(powerline-active0 ((,class :background ,blue-faint :foreground 
,bg-main)))
     `(powerline-active1 ((,class :background ,blue-nuanced-bg :foreground 
,blue-nuanced-fg)))
     `(powerline-active2 ((,class :background ,bg-active :foreground 
,fg-active)))
     `(powerline-inactive0 ((,class :background ,bg-special-cold :foreground 
,fg-special-cold)))
@@ -7355,7 +7152,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; transient
     `(transient-active-infix ((,class :inherit modus-themes-special-mild)))
     `(transient-amaranth ((,class :inherit bold :foreground ,yellow-alt)))
-    `(transient-argument ((,class :inherit bold :background ,cyan-nuanced-bg 
:foreground ,cyan)))
+    ;; Placate the compiler for what is a spurious warning.  We also
+    ;; have to do this with `eldoc-highlight-function-argument'.
+    (list 'transient-argument `((,class :inherit bold :background 
,cyan-nuanced-bg :foreground ,cyan)))
     `(transient-blue ((,class :inherit bold :foreground ,blue)))
     `(transient-disabled-suffix ((,class :inherit modus-themes-intense-red)))
     `(transient-enabled-suffix ((,class :inherit 
modus-themes-grue-background-subtle)))
@@ -7379,6 +7178,24 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(trashed-marked ((,class :inherit modus-themes-mark-alt)))
     `(trashed-restored ((,class :inherit modus-themes-mark-sel)))
     `(trashed-symlink ((,class :inherit modus-themes-link-symlink)))
+;;;;; tree-sitter
+    `(tree-sitter-hl-face:attribute ((,class :inherit 
font-lock-variable-name-face)))
+    `(tree-sitter-hl-face:constant.builtin ((,class :inherit 
tree-sitter-hl-face:constant)))
+    `(tree-sitter-hl-face:escape ((,class :inherit 
font-lock-regexp-grouping-backslash)))
+    `(tree-sitter-hl-face:function ((,class :inherit 
font-lock-function-name-face)))
+    `(tree-sitter-hl-face:function.call ((,class :inherit 
tree-sitter-hl-face:function)))
+    `(tree-sitter-hl-face:label (( )))
+    `(tree-sitter-hl-face:method.call (( )))
+    `(tree-sitter-hl-face:operator ((,class :inherit modus-themes-bold)))
+    `(tree-sitter-hl-face:property (( )))
+    `(tree-sitter-hl-face:property.definition ((,class :inherit 
font-lock-variable-name-face)))
+    `(tree-sitter-hl-face:punctuation (( )))
+    `(tree-sitter-hl-face:punctuation.bracket (( )))
+    `(tree-sitter-hl-face:punctuation.delimiter (( )))
+    `(tree-sitter-hl-face:punctuation.special ((,class :inherit 
font-lock-regexp-grouping-construct)))
+    `(tree-sitter-hl-face:string.special ((,class :inherit 
tree-sitter-hl-face:string)))
+    `(tree-sitter-hl-face:tag ((,class :inherit font-lock-function-name-face)))
+    `(tree-sitter-hl-face:type.argument (( )))
 ;;;;; treemacs
     `(treemacs-directory-collapsed-face ((,class :foreground ,magenta-alt)))
     `(treemacs-directory-face ((,class :inherit dired-directory)))
@@ -7460,8 +7277,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; vertico
     `(vertico-current ((,class :inherit modus-themes-completion-selected)))
 ;;;;; vertico-quick
-    `(vertico-quick1 ((,class :inherit (modus-themes-intense-blue bold))))
-    `(vertico-quick2 ((,class :inherit (modus-themes-refine-magenta bold))))
+    `(vertico-quick1 ((,class :inherit bold :background ,bg-char-0)))
+    `(vertico-quick2 ((,class :inherit bold :background ,bg-char-1)))
 ;;;;; vimish-fold
     `(vimish-fold-fringe ((,class :foreground ,cyan-active)))
     `(vimish-fold-mouse-face ((,class :inherit modus-themes-intense-blue)))
@@ -7491,6 +7308,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(vterm-color-underline ((,class :foreground ,fg-special-warm :underline 
t)))
     `(vterm-color-white ((,class :background "gray65" :foreground "gray65")))
     `(vterm-color-yellow ((,class :background ,yellow :foreground ,yellow)))
+;;;;; vundo
+    `(vundo-highlight ((,class :inherit (bold vundo-node) :foreground 
,red-intense)))
 ;;;;; wcheck-mode
     `(wcheck-default-face ((,class :foreground ,red :underline t)))
 ;;;;; web-mode
@@ -7652,6 +7471,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(flymake-error-bitmap '(flymake-double-exclamation-mark 
modus-themes-fringe-red))
     `(flymake-warning-bitmap '(exclamation-mark modus-themes-fringe-yellow))
     `(flymake-note-bitmap '(exclamation-mark modus-themes-fringe-cyan))
+;;;; highlight-changes
+    `(highlight-changes-colors nil)
+    `(highlight-changes-face-list '(success warning error bold bold-italic))
 ;;;; ibuffer
     `(ibuffer-deletion-face 'modus-themes-mark-del)
     `(ibuffer-filter-group-name-face 'modus-themes-pseudo-header)
@@ -7753,9 +7575,4 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
       (add-to-list 'custom-theme-load-path dir))))
 
 (provide 'modus-themes)
-
-;; Local Variables:
-;; time-stamp-pattern: "Last-Modified: <%Y-%02m-%02d %02H:%02M:%02S %5z>"
-;; End:
-
 ;;; modus-themes.el ends here
diff --git a/etc/themes/modus-vivendi-theme.el 
b/etc/themes/modus-vivendi-theme.el
index fb95772654..fe52aefc84 100644
--- a/etc/themes/modus-vivendi-theme.el
+++ b/etc/themes/modus-vivendi-theme.el
@@ -3,8 +3,8 @@
 ;; Copyright (C) 2019-2022  Free Software Foundation, Inc.
 
 ;; Author: Protesilaos Stavrou <info@protesilaos.com>
-;; URL: https://gitlab.com/protesilaos/modus-themes
-;; Version: 2.3.0
+;; URL: https://git.sr.ht/~protesilaos/modus-themes
+;; Version: 2.4.1
 ;; Package-Requires: ((emacs "27.1"))
 ;; Keywords: faces, theme, accessibility
 
diff --git a/etc/tutorials/TUTORIAL.cn b/etc/tutorials/TUTORIAL.cn
index 5d03014e41..770d9a83be 100644
--- a/etc/tutorials/TUTORIAL.cn
+++ b/etc/tutorials/TUTORIAL.cn
@@ -905,6 +905,15 @@ Dired 能够在一个缓冲区里列出一个目录下的所有文件(可以
 
 Emacs 使用手册里还有许许多多的精彩功能等着你来了解。
 
+* 安装包裹(INSTALLING PACKAGES)
+---------------------------
+
+Emacs 社区著作了许多持有扩展性的包裹(packages),其中包括对各种语言的
+支持、色彩鲜艳的主题、用于集成外部程序的包裹,等等。
+
+使用 M-x list-packages 便可浏览存在的包裹。这个命令显示的界面中可以安
+装和卸载包裹,以及查看包裹的简介。Emacs 使用手册中有对包裹管理更详细的
+介绍。
 
 * 总结(CONCLUSION)
 --------------------
diff --git a/etc/tutorials/TUTORIAL.el_GR b/etc/tutorials/TUTORIAL.el_GR
new file mode 100644
index 0000000000..88d9712b8e
--- /dev/null
+++ b/etc/tutorials/TUTORIAL.el_GR
@@ -0,0 +1,1267 @@
+Εκμάθηση του Emacs.  Δες το τέλος για όρους αντιγραφής.
+
+Στο Emacs οι εντολές γενικά περιλαμβάνουν το πλήκτρο CONTROL (συχνά
+αναγράφεται ως Ctrl) ή το πλήκτρο META (συνήθως επισημαίνεται ως ALT).
+Αντί να γράφουμε το πλήρες όνομα κάθε φορά, θα χρησιμοποιούμε τις εξής
+συντομογραφίες:
+
+ C-<χαρ>  σημαίνει κράτα πατημένο το πλήκτρο CONTROL καθώς
+         πληκτρολογείς τον χαρακτήρα <χάρ>.  Συνεπώς, C-f είναι:
+         κράτα πατημένο το CONTROL και πληκτρολόγησε το f.
+ M-<χαρ>  σημαίνει κράτα πατημένο το πλήκτρο META ή ALT καθώς
+         πληκτρολογείς τον χαρακτήρα <χάρ>.  Σε περίπτωση που δεν
+         υπάρχει πλήκτρο META ή ALT, πληκτρολόγησε και απελευθέρωσε
+         το πλήκτρο ESC και κατόπιν πληκτρολόγησε τον <χάρ>.
+         Γράφουμε <ESC> για το πλήκτρο ESC.
+
+Σημαντική σημείωση: για να τερματίσεις το Emacs, πληκτρολόγησε C-x
+C-c.  (Δύο χαρακτήρες.)  Για να ακυρώσεις μια μερικώς πληκτρολογημένη
+εντολή, πληκτρολόγησε C-g.
+Για να σταματήσεις την εκμάθηση, πληκτρολόγησε C-x k, κατόπιν <Return>
+στην προτροπή.
+Οι χαρακτήρες ">>" στο αριστερό περιθώριο δείχνουν οδηγίες για να
+δοκιμάσεις μια εντολή.  Για παράδειγμα:
+<<Blank lines inserted around following line by help-with-tutorial>>
+[Κενό για διδακτικούς σκοπούς.  Το κείμενο συνεχίζεται παρακάτω.]
+
+>> Τώρα πληκτρολόγησε C-v (δες επόμενη οθόνη) ώστε να κυλήσεις πιο
+   κάτω στην παρούσα εκμάθηση.  (Κάνε το, κρατώντας πατημένο το
+   πλήκτρο CONTROL και πληκτρολογώντας v.)  Από εδώ και στο εξής,
+   παρακαλώ κάνε αυτό όποτε φτάνεις στο τέλος της οθόνης.
+
+Σημείωσε πως υπάρχει επικάλυψη δύο γραμμών όταν κυλάς μια πλήρη οθόνη:
+αυτή σου προσφέρει κάποια συνέχεια ώστε να συνεχίσεις να διαβάζεις το
+κείμενο.
+
+Αυτό είναι αντίγραφο του κειμένου εκμάθησης του Emacs, ελαφρά
+τροποποιημένο για εσένα.  Παρακάτω θα σου αναθέσουμε να δοκιμάσεις
+μερικές εντολές που τροποποιούν το εν λόγω κείμενο.  Μην ανησυχείς αν
+τροποποιήσεις αυτό το κείμενο πριν σου το ζητήσουμε· η πράξη αυτή
+αναφέρεται ως «επεξεργασία» και το Emacs χρησιμοποιείται για αυτόν τον
+σκοπό.
+
+Το πρώτο πράγμα που πρέπει να γνωρίζεις είναι πως να κινείσαι από το
+ένα σημείο σε άλλο σημείο του κειμένου.  Ήδη ξέρεις πως να πηγαίνεις
+μια οθόνη προς τα κάτω με το C-v.  Για να κινηθείς αντίστροφα,
+πληκτρολόγησε M-v (κράτα πατημένο το META και πληκτρολόγησε το v, ή
+πληκτρολόγησε <ESC>v εάν δεν έχει πλήκτρο META ή ALT).
+
+>> Δοκίμασε να πληκτρολογήσεις M-v και μετά C-v μερικές φορές.
+
+Είναι αποδεκτό να κυλήσεις το κείμενο με άλλους τρόπους, αν τους
+ξέρεις.
+
+* ΣΥΝΟΨΗ
+--------
+
+Οι εξής εντολές είναι χρήσιμες για να βλέπεις πλήρης οθόνες:
+
+       C-v     Κινήσου μπροστά/κάτω μια πλήρη οθόνη
+       M-v     Κινήσου πίσω/πάνω μια πλήρη οθόνη
+
+       C-l     Καθάρισε την οθόνη επανεμφανίζοντας το κείμενο της και
+               μεταφέροντας τον δείκτη (κέρσορα) στο κέντρο της.
+               (Αυτό είναι CONTROL-L, όχι CONTROL-1.)
+
+>> Εντόπισε τον δείκτη και σημείωσε το κείμενο πέριξ του.  Μετά
+   πληκτρολόγησε C-l.  Ξαναβρές τον δείκτη και παρατήρησε το κείμενο
+   δίπλα του, αλλά τώρα πρόσεξε πως βρίσκεται στο κέντρο της οθόνης.
+   Εάν πατήσεις C-l πάλι, το κείμενο αυτό θα μετατοπιστεί στο πάνω
+   μέρος της οθόνης.  Πάτα το C-l ξανά και θα πάει στο κάτω μέρος.
+
+Μπορείς επίσης να χρησιμοποιήσεις τα πλήκτρα PageUp και PageDn για να
+κινηθείς ανά πλήρη οθόνη, εάν ο ακροδέκτης (τερματικό) σου τα έχει,
+ωστόσο είναι πιο αποτελεσματικό να χρησιμοποιείς τα C-v και M-v.
+
+
+* ΒΑΣΙΚΟΣ ΕΛΕΓΧΟΣ ΤΟΥ ΔΕΙΚΤΗ
+----------------------------
+
+Η κίνηση ανά πλήρη οθόνη είναι χρήσιμη, αλλά πως θα πας σε
+συγκεκριμένο σημείο εντός του κειμένου της οθόνης;
+
+Υπάρχουν πολλοί τρόποι να το επιτύχεις αυτό.  Μπορείς να
+χρησιμοποιήσεις τα πλήκτρα με τα βέλη, αλλά είναι πιο αποτελεσματικό
+να κρατήσεις τα χέρια σου στην κανονική θέση και να χρησιμοποιήσεις
+τις εντολές C-p, C-b, C-f, και C-n.  Οι χαρακτήρες αυτοί είναι το
+αντίστοιχο των τεσσάρων πλήκτρων με τα βέλη, κατά αυτόν τον τρόπο:
+
+                         Προηγούμενη γραμμή, C-p
+                                 :
+                                 :
+   Πίσω, C-b .... Παρούσα θέση του δείκτη .... Εμπρός, C-f
+                                 :
+                                 :
+                           Επόμενη γραμμή, C-n
+
+>> Μετακίνησε τον δείκτη στη μέση του διαγράμματος αυτού
+   χρησιμοποιώντας C-n ή C-p.  Μετά πληκτρολόγησε C-l για να δεις το
+   όλο διάγραμμα στο κέντρο της οθόνης.
+
+Θα σου είναι ευκολότερο να θυμάσαι αυτά τα γράμματα από τις λέξεις τις
+οποίες αναφέρουν στην Αγγλική: P για προηγούμενο (previous), N για
+επόμενο (next), B για πίσω (backward), και F για εμπρός (forward).  Θα
+χρησιμοποιείς διαρκώς αυτές τις βασικές εντολές για την τοποθέτηση του
+δείκτη.
+
+>> Κάνε μερικά C-n μέχρι να φέρεις τον δείκτη σε αυτή την γραμμή.
+
+>> Κινήσου εντός της γραμμής με μερικά C-f και μετά πάνω με κάποια
+   C-p.  Δες τι κάνει το C-p όταν βρίσκεται στην μέση της γραμμής.
+
+Κάθε γραμμή κειμένου τελειώνει με τον χαρακτήρα νέας γραμμής, που
+επιτελεί τον σκοπό του διαχωρισμού της μίας γραμμής από την άλλη.
+(Συνήθως η τελευταία γραμμή σε ένα αρχείο τελειώνει με τον χαρακτήρα
+νέας γραμμής, ωστόσο το Emacs δεν απαιτεί κάτι τέτοιο.)
+
+>> Δοκίμασε το C-b στην αρχή της γραμμής.  Θα μετακινήσει τον δείκτη
+   στο τέλος της προηγούμενης γραμμής.  Διότι κινείται προς τα πίσω
+   προσπερνώντας τον χαρακτήρα νέας γραμμής.
+
+Το C-f έχει την ίδια συμπεριφορά με το C-b.
+
+>> Κάνε μερικά ακόμα C-b, ώστε να εντοπίσεις τον δείκτη.  Κατόπιν
+   κάνε C-f για να γυρίσεις στο τέλος της γραμμής.  Μετά ένα ακόμα C-f
+   για να κινηθείς στην αρχή της επόμενης γραμμής.
+
+Όταν κινείσαι πέρα από το πάνω ή κάτω μέρος της οθόνης, το κείμενο
+πέραν της άκρης μετατοπίζεται εντός της οθόνης.  Αυτό ονομάζεται
+«κύλιση».  Επιτρέπει στο Emacs να φέρει τον δείκτη στο ορισμένο
+σημείο του κειμένου χωρίς να κινηθεί εκτός της οθόνης.
+
+>> Δοκίμασε να κινήσεις τον δείκτη πέρα από το κάτω μέρος της οθόνης
+   με το C-n και δες τι συμβαίνει.
+
+Εάν η κίνηση ανά χαρακτήρα είναι πολύ αργή, μπορείς να κινηθείς ανά
+λέξη.  Το M-f (META-f) πάει μπροστά μια λέξη και M-b πίσω μια λέξη.
+
+>> Πληκτρολόγησε μερικά M-f και M-b.
+
+Όταν βρίσκεσαι στο μέσο μιας λέξης, το M-f πηγαίνει στο τέλος της.
+Όταν βρίσκεσαι σε κενό μεταξύ λέξεων, το M-f κινείται στο τέλος της
+ακόλουθης λέξης.  Το M-b λειτουργεί αναλόγως προς την αντίθετη
+κατεύθυνση.
+
+>> Πληκτρολόγησε M-f και M-b μερικές φορές, με C-f και C-b μεταξύ τους
+   ώστε να παρατηρήσεις την δράση των M-f και M-b σε διάφορα σημεία
+   εντός και μεταξύ λέξεων.
+
+Παρατήρησε την παράλληλο μεταξύ C-f και C-b από την μία, και M-f και
+M-b από την άλλη.  Πολύ συχνά οι Meta χαρακτήρες χρησιμοποιούνται για
+πράξεις που σχετίζονται με μονάδες που ορίζει η εκάστοτε γλώσσα
+(λέξεις, προτάσεις, παραγράφους), ενώ οι Control χαρακτήρες επιδρούν
+σε βασικά στοιχεία που είναι ανεξάρτητα του τι επεξεργάζεσαι
+(χαρακτήρες, γραμμές, κτλ.).
+
+Αυτή η παράλληλος ισχύει μεταξύ γραμμών και προτάσεων.  C-a και C-e
+πηγαίνουν στην αρχή και το τέλος της γραμμής, ενώ M-a και M-e
+πηγαίνουν στην αρχή και το τέλος της πρότασης.
+
+>> Δοκίμασε δύο C-a και ύστερα δύο C-e.
+   Δοκίμασε δύο M-a και ύστερα δύο M-e.
+
+Παρατήρησε πως αλλεπάλληλα C-a δεν κάνουν τίποτα, ενώ επανειλημμένα
+M-a συνεχίζουν να κινούνται ανά μία πρόταση.  Παρότι δεν είναι
+ανάλογα, το καθένα φαντάζει φυσικό.
+
+Η θέση του δείκτη εντός του κειμένου ονομάζεται «σημείο» (point).  Με
+άλλα λόγια, ο δείκτης δείχνει που βρίσκεται το σημείο εντός του
+κειμένου στην οθόνη.
+
+Ιδού μία σύνοψη των απλών κινήσεων του δείκτη, συμπεριλαμβανομένων
+των εντολών για κίνηση ανά λέξη και πρόταση:
+
+       C-f     Κινήσου εμπρός ένα χαρακτήρα
+       C-b     Κινήσου πίσω ένα χαρακτήρα
+
+       M-f     Κινήσου εμπρός μία λέξη
+       M-b     Κινήσου πίσω μία λέξη
+
+       C-n     Κινήσου στην επόμενη γραμμή
+       C-p     Κινήσου στην προηγούμενη γραμμή
+
+       C-a     Κινήσου στην αρχή της γραμμής
+       C-e     Κινήσου στο τέλος της γραμμής
+
+       M-a     Κινήσου πίσω στην αρχή της πρότασης
+       M-e     Κινήσου εμπρός στο τέλος της πρότασης
+
+>> Δοκίμασε όλες αυτές τις εντολές μερικές φορές για εξάσκηση.  Αυτές
+   είναι οι πιο συνηθισμένες εντολές.
+
+Δύο άλλες σημαντικές κινήσεις του δείκτη είναι το M-< (META
+Μικρότερο), που κινείται στην αρχή ολόκληρου του κειμένου, και M->
+(META Μεγαλύτερο) που κινείται στο τέλος ολόκληρου του κειμένου.
+
+Στους πλείστους ακροδέκτες (τερματικά), το '<' είναι στο ίδιο πλήκτρο
+με το κόμμα, οπότε πρέπει να κρατάς πατημένο το shift για να το
+πληκτρολογήσεις.  Σε αυτούς τους ακροδέκτες πρέπει να χρησιμοποιήσεις
+το shift και για το M-<, αλλιώς θα πατάς M-κόμμα.
+
+>> Δοκίμασε το M-< τώρα για να κινηθείς στην αρχή αυτής της εκμάθησης.
+   Κατόπιν χρησιμοποίησε το C-v επανειλημμένα για να επιστρέψεις εδώ.
+
+>> Τώρα δοκίμασε το M-> για να κινηθείς στο τέλος αυτής της εκμάθησης.
+   Κατόπιν χρησιμοποίησε το M-v επανειλημμένα για να επιστρέψεις εδώ.
+
+Μπορείς επίσης να χρησιμοποιήσεις τα πλήκτρα με τα βέλη, εάν ο
+ακροδέκτης σου τα υποστηρίζει.  Προτείνουμε να μάθεις τα C-b, C-f, C-n
+και C-p για τρεις λόγους.  Πρώτον, δουλεύουν σε όλων των ειδών τους
+ακροδέκτες.  Δεύτερον, όταν αποκτήσεις εμπειρία στην χρήση του Emacs,
+θα διαπιστώσεις πως αυτοί οι χαρακτήρες του Control είναι πιο γρήγοροι
+στην χρήση παρά τα βέλη (διότι δεν απομακρύνεις τα χέρια σου από την
+θέση πληκτρολόγησης δια αφής).  Τρίτον, εφόσον διαμορφώσεις την
+συνήθεια να χρησιμοποιείς τις εντολές με τους Control χαρακτήρες,
+μπορείς πιο εύκολα να μάθεις πιο προηγμένες εντολές κίνησης.
+
+Οι πλείστες εντολές του Emacs δέχονται αριθμητική παράμετρο: για τις
+περισσότερες εντολές αυτή λειτουργεί ως μετρητής επανάληψης.  Ο τρόπος
+που δίνεις σε μια εντολή αριθμητική παράμετρο γίνεται πληκτρολογώντας
+το C-u και μετά τα ψηφία προτού πληκτρολογήσεις την εντολή.  Εάν έχεις
+το πλήκτρο META (ή ALT), υπάρχει άλλος εναλλακτικός τρόπος εισαγωγής
+αριθμητικής παραμέτρου: πληκτρολόγησε τα ψηφία κρατώντας πατημένο το
+πλήκτρο META.  Συνιστούμε να μάθεις την μέθοδο του C-u γιατί ισχύει σε
+όλους τους ακροδέκτες.  Η αριθμητική παράμετρος ονομάζεται επίσης
+«προθεματική παράμετρος», καθώς πληκτρολογείς την παράμετρο πριν την
+εντολή στην οποία δίνεται.
+
+Για παράδειγμα, C-u 8 C-f κινείται εμπρός οκτώ χαρακτήρες.
+
+>> Δοκίμασε να χρησιμοποιήσεις το C-n ή C-p με αριθμητική παράμετρο
+   για να κινήσεις τον δείκτη σε μια γραμμή κοντά σε αυτή με μόνο μία
+   εντολή.
+
+Οι πλείστες εντολές χρησιμοποιούν την αριθμητική παράμετρο ως μετρητή
+επανάληψης, αλλά μερικές εντολές την χρησιμοποιούν με διαφορετικό
+τρόπο.  Αρκετές εντολές (αλλά καμία από αυτές που έμαθες έως τώρα) την
+χρησιμοποιούν ως ένδειξη--η παρουσία προθεματικής παραμέτρου,
+ανεξαρτήτως της αξίας της, κάνει την εντολή να εκτελέσει κάτι
+διαφορετικό.
+
+Τα C-v και M-v συνιστούν άλλο ένα είδος εξαίρεσης.  Όταν τους δοθεί
+παράμετρος, κυλούν το κείμενο πάνω ή κάτω κατά τόσες γραμμές, αντί για
+πλήρη οθόνη.  Για παράδειγμα, C-u 8 C-v κυλάει πάνω κατά 8 γραμμές.
+
+>> Δοκίμασε να πληκτρολογήσεις C-u 8 C-v τώρα.
+
+Αυτό πρέπει να κύλησε το κείμενο πάνω κατά 8 γραμμές.  Αν θέλεις να το
+φέρεις κάτω πάλι δοκίμασε την ίδια αριθμητική παράμετρο με το M-v.
+
+Εάν χρησιμοποιείς γραφική προβολή, όπως το X ή MS-Windows, θα πρέπει
+να υπάρχει μια ψηλή, ορθογώνια επιφάνεια σε πλευρά του παραθύρου του
+Emacs που είναι γνωστή και ως η μπάρα κύλισης (scroll bar).  Μπορείς
+να κυλήσεις το κείμενο πατώντας με το ποντίκι πάνω στην μπάρα κύλισης.
+
+Αν το ποντίκι σου έχει ροδέλα, μπορείς να την χρησιμοποιήσεις για
+κύλιση.
+
+
+* ΑΝ ΤΟ EMACS ΠΑΨΕΙ ΝΑ ΑΝΤΑΠΟΚΡΙΝΕΤΑΙ
+-------------------------------------
+
+Αν το Emacs πάψει να ανταποκρίνεται στις εντολές σου, μπορείς να το
+σταματήσεις με ασφάλεια πληκτρολογώντας C-g.  Μπορείς να
+χρησιμοποιήσεις το C-g για να σταματήσεις μια εντολή που παίρνει πολύ
+χρόνο να εκτελεστεί.
+
+Μπορείς επίσης να χρησιμοποιήσεις το C-g για να καταργήσεις μια
+αριθμητική παράμετρο ή την αρχή μιας εντολής που δεν θέλεις να
+ολοκληρώσεις.
+
+>> Πληκτρολόγησε C-u 100 για να φτιάξεις μια αριθμητική παράμετρο του
+   100, μετά πληκτρολόγησε C-g.  Τώρα πληκτρολόγησε C-f.  Θα πρέπει να
+   κινηθεί μόνο ένα χαρακτήρα, διότι ακύρωσες την παράμετρο με το C-g.
+
+Σε περίπτωση που έχεις πληκτρολογήσει το <ESC> κατά λάθος, μπορείς να
+το ξεφορτωθείς με το C-g.
+
+
+* ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΕΣ ΕΝΤΟΛΕΣ
+---------------------------
+
+Κάποιες εντολές του Emacs είναι «απενεργοποιημένες» ώστε νέοι χρήστες
+να μην τις χρησιμοποιήσουν κατά λάθος.
+
+Αν πληκτρολογήσεις μία από αυτές τις απενεργοποιημένες εντολές, το
+Emacs παρουσιάζει μήνυμα που αναφέρει ποια είναι η εντολή και σου ζητά
+αν θέλεις να την εκτελέσεις.
+
+Εάν πράγματι θες να δοκιμάσεις την εντολή, πληκτρολόγησε <SPC> (το
+κενό) ως απάντηση στην ερώτηση.  Κανονικά, αν δεν θέλεις να εκτελέσεις
+την απενεργοποιημένη εντολή απαντάς με το «n».
+
+>> Πληκτρολόγησε C-x C-l (που είναι απενεργοποιημένη εντολή) και μετά
+   πληκτρολόγησε n ως απάντηση.
+
+
+* ΠΑΡΑΘΥΡΑ
+----------
+
+Το Emacs μπορεί να έχει πολλά «παράθυρα», με το καθένα να δείχνει το
+δικό του κείμενο.  Θα εξηγήσουμε παρακάτω πως να χρησιμοποιείς πολλά
+παράθυρα.  Για την ώρα θέλουμε να εξηγήσουμε πως θα ξεφορτωθείς
+πλεονάζοντα παράθυρα για να επιστρέψεις στην βασική επεξεργασία εντός
+ενός παραθύρου.  Είναι απλό:
+
+       C-x 1   Ένα παράθυρο (δηλαδή εξαφάνισε όλα τα άλλα παράθυρα)
+
+Αυτό πρόκειται για το CONTROL-x που ακολουθείται από το ψηφίο 1.  Το
+C-x 1 μεγιστοποιεί το παράθυρο που περιέχει τον δείκτη.  Διαγράφει τα
+άλλα παράθυρα.
+
+>> Φέρε τον δείκτη σε αυτή την γραμμή και πληκτρολόγησε C-u 0 C-l.
+>> Πληκτρολόγησε C-h k C-f.
+   Δες πως το παράθυρο συρρικνώνεται, καθώς ένα νέο εμφανίζεται για να
+   παρουσιάσει την καταγραφή της εντολής C-f.
+
+>> Πληκτρολόγησε C-x 1 και δες πως το παράθυρο της καταγραφής
+   εξαφανίζεται.
+
+Υπάρχει σειρά εντολών που ξεκινούν με το CONTROL-x· πολλές εξ αυτών
+έχουν να κάνουν με παράθυρα (windows), αρχεία (files), ενταμιευτές
+(buffers), και τα σχετικά.  Αυτές οι εντολές είναι δύο, τρία ή τέσσερα
+γράμματα μάκρος.
+
+
+* ΕΙΣΑΓΟΝΤΑΣ ΚΑΙ ΔΙΑΓΡΑΦΟΝΤΑΣ
+-----------------------------
+
+Αν θέλεις να εισάγεις κείμενο, απλά πληκτρολόγησε το.  Κοινοί
+χαρακτήρες, όπως το Α, 7, *, κτλ. εισάγονται καθώς τους πληκτρολογείς.
+Για να εισάγεις τον χαρακτήρα νέας γραμμής, πληκτρολόγησε <Return>
+(αυτό είναι το πλήκτρο που μερικές φορές αναγράφεται ως «Enter»).
+
+Για να διαγράψεις τον χαρακτήρα ακριβώς πριν από το τωρινό σημείο του
+δείκτη, πληκτρολόγησε <DEL>.  Αυτό είναι το πλήκτρο που συνήθως
+αναγράφεται στο πληκτρολόγιο ως «Backspace»--το ίδιο θα
+χρησιμοποιούσες κανονικά κι εκτός Emacs για να διαγράψεις τον
+τελευταίο χαρακτήρα που εισήγαγες.
+
+Συνήθως υπάρχει άλλο ένα πλήκτρο που αναγράφεται ως <Delete>, αλλά
+αυτό είναι διαφορετικό από αυτό που προαναφέραμε και που εννοούμε με
+το <DEL> του Emacs.
+
+>> Κάνε αυτό τώρα--πληκτρολόγησε μερικούς χαρακτήρες, μετά διάγραψε
+   τους πατώντας το <DEL> μερικές φορές.  Μην ανησυχείς για την
+   τροποποίηση αυτού του αρχείου: δεν τροποποιείς το κύριο κείμενο
+   εκμάθησης.  Αυτό είναι το προσωπικό σου αντίγραφο.
+
+Όταν η γραμμή του κειμένου γίνεται πολύ μεγάλη για μια γραμμή της
+οθόνης, η γραμμή του κειμένου «συνεχίζεται» σε δεύτερη γραμμή οθόνης.
+Εάν χρησιμοποιείς γραφική προβολή, καμπυλωτά βελάκια θα εμφανιστούν
+στα στενά πλαίσια που βρίσκονται στα άκρα της επιφάνειας του κειμένου
+(οι «παρυφές» αριστερά και δεξιά), για να επισημάνουν που συνεχίζεται
+η γραμμή.  Εάν χρησιμοποιείται προβολή κειμένου, η συνεχιζόμενη γραμμή
+παρουσιάζεται με την αντίστροφη κάθετο ('\') στην δεξιότερη στήλη της
+οθόνης.
+
+>> Εισήγαγε κείμενο μέχρις ότου φτάσεις στο δεξί περιθώριο και
+   συνέχισε να προσθέτεις.  Θα δεις να εμφανίζεται η γραμμή συνέχειας.
+
+>> Πάτα <DEL> επανειλημμένα για να διαγράψεις το κείμενο μέχρι που η
+   γραμμή να χωράει ξανά στην οθόνη.  Η γραμμή συνέχειας θα χαθεί.
+
+Μπορείς να διαγράψεις τον χαρακτήρα νέας γραμμής όπως κάθε άλλο
+χαρακτήρα.  Διαγράφοντας τον χαρακτήρα νέας γραμμής μεταξύ δύο γραμμών
+έχει σαν αποτέλεσμα την συνένωση τους σε μία γραμμή.  Εάν σαν
+αποτέλεσμα η γραμμή είναι πολύ μεγάλη, θα παρουσιαστεί με την γραμμή
+συνέχειας.
+
+>> Μετακίνησε τον δείκτη στην αρχή της γραμμής και πληκτρολόγησε
+   <DEL>.  Αυτό θα συνενώσει την γραμμή με την από πάνω της.
+
+>> Πληκτρολόγησε <Return> για να επανεισάγεις τον χαρακτήρα νέας
+   γραμμής που μόλις διέγραψες.
+
+Το πλήκτρο <Return> είναι ειδικό, καθώς πληκτρολογώντας το μπορεί να
+κάνει περισσότερα πράγματα πέραν της εισαγωγής του χαρακτήρα νέας
+γραμμής.  Ανάλογα με το περιβάλλων κείμενο, μπορεί να προσθέσει κενό
+μετά τον χαρακτήρα νέας γραμμής, ώστε όταν αρχίσεις να γράφεις στην
+νέα γραμμή, το κείμενο να στοιχίζεται με την προηγούμενη γραμμή.
+Ονομάζουμε αυτή την συμπεριφορά (όπου το πάτημα ενός πλήκτρου κάνει
+κάτι παραπάνω από την εισαγωγή του σχετικού χαρακτήρα) «ηλεκτρική».
+
+>> Ιδού ένα παράδειγμα της ηλεκτρικότητας του <Return>.
+   Πληκτρολόγησε <Return> στο τέλος αυτής της γραμμής.
+
+Κανονικά θα δεις πως μετά την εισαγωγή του χαρακτήρα νέας γραμμής, το
+Emacs εισάγει κενά ώστε ο δείκτης να βρίσκεται ακριβώς κάτω από το
+«Π» του «Πληκτρολόγησε».
+
+Θυμήσου πως οι πλείστες εντολές του Emacs δέχονται μετρητή επανάληψης·
+αυτό περιλαμβάνει την εισαγωγή κειμένου.  Επαναλαμβάνοντας ένα
+χαρακτήρα κειμένου τον εισάγει πολλές φορές.
+
+>> Δοκίμασε το τώρα -- πληκτρολόγησε C-u 8 * για να εισάγεις ********.
+
+Έχεις ήδη μάθει τους πιο βασικούς τρόπους για την πληκτρολόγηση
+κειμένου στο Emacs και την διόρθωση των λαθών.  Μπορείς επίσης να
+διαγράψεις λέξεις και γραμμές.  Ιδού η σύνοψη των πράξεων διαγραφής:
+
+       <DEL>        Διάγραψε τον χαρακτήρα ακριβώς πριν τον δείκτη
+       C-d          Διάγραψε τον χαρακτήρα ακριβώς μετά τον δείκτη
+
+       M-<DEL>      Εξαφάνισε την λέξη ακριβώς πριν τον δείκτη
+       M-d          Εξαφάνισε την λέξη μετά τον δείκτη
+
+       C-k          Εξαφάνισε από το σημείο του δείκτη ως το τέλος της γραμμής
+       M-k          Εξαφάνισε ως το τέλος της παρούσας πρότασης
+
+Πρόσεξε πως το <DEL> και C-d σε σύγκριση με M-<DEL> και M-d
+προεκτείνουν την παράλληλο που άρχισε με το C-f και M-f (κατ'ακρίβεια,
+το <DEL> δεν είναι χαρακτήρας control, αλλά ας μην ανησυχούμε για
+αυτό).  Τα C-k και M-k είναι κατά τρόπο όπως το C-e και M-e καθώς οι
+γραμμές ταιριάζουν με τις προτάσεις.
+
+Μπορείς επίσης να εξαφανίσεις ένα μέρος κειμένου με ενιαίο τρόπο.
+Κινήσου σε μία άκρη του και πληκτρολόγησε C-<SPC>.  (<SPC> είναι το
+πλήκτρο του κενού.)  Κατόπιν, μετακίνησε τον δείκτη στην άλλη άκρη του
+κειμένου που θέλεις να εξαφανίσεις.  Καθώς το κάνεις αυτό, το Emacs
+επισημαίνει το κείμενο μεταξύ των δύο άκρων του δείκτη και του σημείου
+όπου πληκτρολόγησες C-<SPC>.  Τέλος, πληκτρολόγησε C-w.  Αυτό
+εξαφανίζει το κείμενο μεταξύ των δύο σημείων.
+
+>> Μετακίνησε τον δείκτη στο γράμμα Μ στην αρχή της προηγούμενης
+   παραγράφου.
+>> Πληκτρολόγησε C-<SPC>.  Το Emacs θα σου γράψει μήνυμα στο κάτω
+   μέρος της οθόνης πως τέθηκε σημάδι («Mark set»).
+>> Μετακίνησε τον δείκτη στο κ της λέξης «άκρη» στην δεύτερη γραμμή
+   της παραγράφου.
+>> Πληκτρολόγησε C-w.  Αυτό θα εξαφανίσει το κείμενο που άρχιζε με Μ
+   και τελειώνει ακριβώς πριν το κ.
+
+Η διαφορά μεταξύ της «εξαφάνισης» και της «διαγραφής» είναι πως το
+«εξαφανισμένο» κείμενο μπορεί να επανεισαχθεί (σε οποιαδήποτε θέση),
+ενώ τα «διαγραμμένα» πράγματα δεν μπορούν να επανεισαχθούν κατά αυτόν
+τον τρόπο (μπορείς, ωστόσο, να αναιρέσεις την διαγραφή--δες παρακάτω).
+Επανεισαγωγή εξαφανισμένου κειμένου ονομάζεται «τράβηγμα» («yanking»).
+(Φαντάσου πως τραβάς κάτι πίσω το οποίο είχε αφαιρεθεί.)  Γενικά, οι
+εντολές που αφαιρούν πολύ κείμενο το εξαφανίζουν, ενώ οι εντολές που
+αφαιρούν απλά ένα χαρακτήρα, ή μόνο κενές γραμμές ή κενά, κάνουν
+διαγραφή (οπότε δεν μπορείς να τα τραβήξεις πίσω).  <DEL> και C-d
+κάνουν διαγραφή στην απλή περίπτωση, χωρίς παράμετρο.  Αν τους δοθεί
+παράμετρος, τότε κάνουν εξαφάνιση.
+
+>> Μετακίνησε τον δείκτη στην αρχή μιας γραμμής που δεν είναι κενή.
+   Κατόπιν πληκτρολόγησε C-k για να εξαφανίσεις το κείμενο ως το τέλος
+   της γραμμής.
+>> Πληκτρολόγησε C-k δεύτερη φορά.  Θα δεις πως εξαφανίζει τον
+   χαρακτήρα νέας γραμμής που ακολουθεί εκείνη την γραμμή.
+
+Σημείωσε πως ένα C-k εξαφανίζει το περιεχόμενο της γραμμής, ενώ
+δεύτερο C-k εξαφανίζει την ίδια την γραμμή και κάνει όλες τις
+ακόλουθες γραμμές να μετατοπιστούν προς τα πάνω.  Το C-k ερμηνεύει την
+αριθμητική παράμετρο με ειδικό τρόπο: εξαφανίζει τις γραμμές ΚΑΙ το
+περιεχόμενο τους.  Αυτό δεν πρόκειται για απλή επανάληψη.  C-u 2 C-k
+εξαφανίζει δύο γραμμές και τους αντίστοιχους χαρακτήρες νέας γραμμής·
+ενώ πληκτρολογώντας το C-k δύο φορές δεν θα το έκανε αυτό.
+
+Μπορείς να τραβήξεις εξαφανισμένο κείμενο στο ίδιο σημείο από όπου
+εξαφανίστηκε, ή σε κάποιο άλλο σημείο που επεξεργάζεσαι, ή ακόμα σε
+άλλο αρχείο.  Μπορείς να τραβήξεις το ίδιο κείμενο πολλές φορές· αυτό
+δημιουργεί πολλαπλά αντίγραφα του.  Άλλοι κειμενογράφοι ονομάζουν την
+εξαφάνιση και το τράβηγμα «αποκοπή» και «επικόλληση» (δες το γλωσσάριο
+στο εγχειρίδιο του Emacs).
+
+Η εντολή για τράβηγμα είναι C-y.  Εισάγει το τελευταίο εξαφανισμένο
+κείμενο στην τρέχουσα θέση του δείκτη.
+
+>> Δοκίμασε το· πληκτρολόγησε C-y για τα τραβήξεις το κείμενο πίσω.
+
+Εάν κάνεις πολλά C-k στην σειρά, όλο το εξαφανισμένο κείμενο
+αποθηκεύεται μαζί, ώστε ένα C-y τραβάει όλες τις γραμμές συλλήβδην.
+
+>> Κάνε το τώρα· πληκτρολόγησε C-k αρκετές φορές.
+
+Τώρα ανάκτησε το εξαφανισμένο κείμενο:
+
+>> Πληκτρολόγησε C-y.  Κατόπιν μετακίνησε τον δείκτη κάτω μερικές
+   γραμμές και πληκτρολόγησε C-y ξανά.  Τώρα βλέπεις πως να
+   αντιγράψεις ορισμένο κείμενο.
+
+Τι κάνει εάν έχεις κείμενο που θέλεις να τραβήξεις πίσω και μετά να
+εξαφανίσεις κάτι άλλο; Το C-y θα τραβήξει την πιο πρόσφατη εξαφάνιση.
+Αλλά η προηγούμενη της δεν έχει χαθεί.  Μπορείς να επιστρέψεις σε αυτή
+χρησιμοποιώντας την εντολή M-y.  Αφού έχεις κάνει C-y για να πάρεις
+την πιο πρόσφατη εξαφάνιση, πληκτρολογώντας το M-y αντικαθιστά το
+τραβηγμένο κείμενο με το λιγότερο πρόσφατο εξαφανισμένο κείμενο.
+Πληκτρολογώντας M-y ξανά και ξανά επαναφέρει ολοένα και παλαιότερες
+εξαφανίσεις.  Όταν βρεις το κείμενο που ψάχνεις, δεν χρειάζεται να
+κάνεις κάτι άλλο για να το κρατήσεις.  Απλά συνέχισε την επεξεργασία,
+αφήνοντας το τραβηγμένο κείμενο εκεί που είναι.
+
+Εάν χρησιμοποιήσεις το M-y αρκετές φορές, θα επιστρέψεις στο αρχικό
+σημείο (την πιο πρόσφατη εξαφάνιση).
+
+>> Εξαφάνισε μια γραμμή, κινήσου κάπου αλλού, εξαφάνισε άλλη γραμμή.
+   Μετά πάτα C-y για να επαναφέρεις την δεύτερη εξαφανισμένη γραμμή.
+   Μετά κάνε M-y κι αυτή θα αντικατασταθεί με την πρώτη εξαφανισμένη
+   γραμμή.  Κάνε κι άλλα M-y να δεις τι θα σου βγάλει.  Συνέχισε ώσπου
+   να σου δώσει πάλι την δεύτερη εξαφανισμένη γραμμή.  Αν θέλεις
+   μπορείς να περάσεις στο M-y θετικές ή αρνητικές παραμέτρους.
+
+
+* ΑΝΑΙΡΕΣΗ
+----------
+
+Εάν κάνεις αλλαγή στο κείμενο κι ύστερα κρίνεις πως ήταν λάθος,
+μπορείς να την αναιρέσεις με την εντολή αναίρεσης C-/.
+
+Κανονικά, το C-/ αναιρεί τις αλλαγές που επέφερε μία εντολή.  Αν
+επαναλάβεις το C-/ πολλές φορές στη σειρά, κάθε επανάληψη αναιρεί
+ακόμα μία εντολή.
+
+Ωστόσο υπάρχουν δύο εξαιρέσεις: εντολές που δεν τροποποιούν κείμενο
+δεν μετρούν (όπως εντολές που κινούν τον δείκτη ή κυλούν το κείμενο)
+και χαρακτήρες που αυτό-εισάγονται συνήθως κρίνονται ως ομάδες έως 20
+μέλη.  (Αυτό είναι για να περιορίσει τον αριθμό των C-/ που
+απαιτούνται για την αναίρεση εισαγωγής κειμένου.)
+
+>> Εξαφάνισε αυτή την γραμμή με C-k και πληκτρολόγησε C-/ ώστε να
+   επανεμφανιστεί.
+
+Το C-_ είναι εναλλακτική εντολή αναίρεσης που λειτουργεί το ίδιο με το
+C-/.  Σε ορισμένους ακροδέκτες κειμένου, ενδέχεται να μην χρειάζεται
+το shift για να εισάγεις το C-_.  Σε ορισμένους ακροδέκτες κειμένου,
+το C-/ στέλνει το σήμα του C-_ στο Emacs.  Εναλλακτικά, το C-x u
+λειτουργεί ακριβώς όπως το C-/, αλλά είναι λίγο πιο δύσκολο να το
+πληκτρολογήσεις.
+
+Η αριθμητική παράμετρος στα C-/, C-_, C-x u δρα ως μετρητής
+επανάληψης.
+
+Μπορείς να αναιρέσεις την διαγραφή κειμένου κατά τον ίδιο τρόπο που
+αναιρείς την εξαφάνιση κειμένου.  Ο διαχωρισμός μεταξύ εξαφάνισης και
+διαγραφής έχει σημασία μόνο όταν θες να τραβήξεις κάτι πίσω με το C-y:
+δεν έχει καμιά διαφορά για τους σκοπούς της αναίρεσης.
+
+
+* ΑΡΧΕΙΑ
+--------
+
+Για να καταστήσεις μόνιμο το κείμενο που επεξεργάζεσαι, πρέπει να το
+βάλεις σε αρχείο.  Αλλιώς θα χαθεί όταν κλείσεις το Emacs.  Για να
+βάλεις κείμενο σε αρχείο, πρέπει να το «βρεις» πριν εισάγεις το
+κείμενο.  (Η πράξη αυτή ονομάζεται επίσης ως «επίσκεψη» στην τοποθεσία
+του αρχείου.)
+
+Εξεύρεση του αρχείο σημαίνει πως βλέπεις το περιεχόμενο του εντός του
+Emacs.  Κατά πολλούς τρόπους, είναι σαν να επεξεργάζεσαι το αρχείο
+απευθείας.  Ωστόσο, οι αλλαγές που κάνεις καθίστανται μόνιμες μόνο
+αφού «αποθηκεύσεις» το αρχείο.  Αυτό γίνεται ώστε να μην μένουν
+μισοτελειωμένα αρχεία στο σύστημα ενάντια στην θέληση σου.  Ακόμα κι
+αν αποθηκεύσεις τις αλλαγές, το Emacs διατηρεί αντίγραφο του γνησίου
+αρχείου υπό ελαφρώς τροποποιημένο όνομα, ώστε να μπορείς να το
+επαναφέρεις σε περίπτωση που συνέβη κάποιο λάθος.
+
+Αν κοιτάξεις προς το κάτω μέρος της οθόνης θα δεις μια γραμμή που
+αρχίζει με παύλες και αναφέρει « -:--- TUTORIAL.el_GR» ή κάπως έτσι.
+Αυτό το μέρος της οθόνης συνήθως δείχνει το όνομα του αρχείου που
+επισκέπτεσαι.  Τώρα επισκέπτεσαι το προσωπικό σου αντίγραφο του
+κειμένου εκμάθησης του Emacs, που ονομάζεται «TUTORIAL.el_GR».  Όταν
+βρίσκεις ένα αρχείο με το Emacs, το όνομα του θα εμφανιστεί σε εκείνο
+ακριβώς το σημείο.
+
+Μια ειδική πτυχή της εντολής για εξεύρεση αρχείου είναι πως πρέπει να
+προσδιορίσεις ποιο αρχείο θέλεις.  Λέμε πως η εντολή «διαβάζει την
+παράμετρο» (στην προκειμένη περίπτωση αυτή είναι το όνομα του
+αρχείου).  Αφού πληκτρολογήσεις την εντολή
+
+       C-x C-f   Βρες ένα αρχείο
+
+το Emacs θα σου ζητήσει να πληκτρολογήσεις το όνομα του.  Το όνομα
+του αρχείου που εισάγεις εμφανίζεται στο κάτω μέρος της οθόνης.  Η
+τελευταία γραμμή ονομάζεται μικροενταμιευτής (minibuffer) όταν
+χρησιμοποιείται για τέτοιους σκοπούς εισαγωγής εντολής.  Μπορείς να
+χρησιμοποιήσεις τις κοινές εντολές του Emacs για επεξεργασία κειμένου
+καθώς γράφεις το όνομα του αρχείου.
+
+Ενόσω δακτυλογραφείς το όνομα του αρχείο (ή κάθε άλλο κείμενο στον
+μικροενταμιευτή), μπορείς να ακυρώσεις την εντολή με το C-g.
+
+>> Πληκτρολόγησε C-x C-f και μετά C-g.  Αυτό ακυρώνει τον
+   μικροενταμιευτή και την εντολή C-x C-f που τον χρησιμοποιούσε.
+   Συνεπώς δεν θα βρεις κανένα αρχείο.
+
+Όταν ολοκληρώσεις την εισαγωγή του ονόματος ενός αρχείου, πάτα
+<Return> για να την επικυρώσεις.  Ο μικροενταμιευτής εξαφανίζεται
+καθώς το C-x C-f αναλαμβάνει δράση για να βρει το αρχείο που του
+όρισες.
+
+Το περιεχόμενο του αρχείου τώρα εμφανίζεται στην οθόνη και μπορείς να
+το επεξεργαστείς.  Όταν θέλεις να μονιμοποιήσεις τις αλλαγές που
+έκανες, χρησιμοποίησε την εντολή
+
+       C-x C-s   Αποθήκευσε το αρχείο
+
+Αυτή αντιγράφει το κείμενο που βρίσκεται στο Emacs στο εν λόγω αρχείο.
+Την πρώτη φορά που το κάνεις αυτό, το Emacs μετονομάζει το γνήσιο ώστε
+να μην χαθεί.  Το νέο όνομα περιέχει το σύμβολο «~» ως κατάληξη του
+αρχικού ονόματος.  Όταν ολοκληρωθεί η αποθήκευση, το Emacs παρουσιάζει
+το όνομα του αρχείου όπου γράφτηκαν οι αλλαγές.
+
+>> Πληκτρολόγησε C-x C-s TUTORIAL.el_GR <Return>.
+   Αυτό θα αποθηκεύσει αυτό το κείμενο σε αρχείο με το όνομα
+   TUTORIAL.el_GR και θα αναφέρει πως έγραψε σε αυτό στο κάτω μέρος
+   της οθόνης.
+
+Μπορείς να βρεις υφιστάμενο αρχείο είτε για να το δεις ή να το
+επεξεργαστείς.  Μπορείς επίσης να βρεις αρχείο το οποίο δεν
+προϋπάρχει.  Έτσι το Emacs θα δημιουργήσει το αρχείο: θα βρεις το νέο
+αρχείο, το οποίο είναι κενό, και κατόπιν θα εισάγεις κείμενο σε αυτό.
+Όταν επιχειρήσεις να το αποθηκεύσεις, το Emacs θα δημιουργήσει το
+αρχείο αυτό με το περιεχόμενο που του έδωσες.  Από εκεί και πέρα
+θεώρησε πως επεξεργάζεσαι ένα υφιστάμενο αρχείο.
+
+
+* ΕΝΤΑΜΙΕΥΤΕΣ
+-------------
+
+Εάν βρεις δεύτερο αρχείο με το C-x C-f, το πρώτο παραμένει εντός του
+Emacs.  Μπορείς να επανέλθεις σε αυτό αν το ξαναβρείς με το C-x C-f.
+Έτσι δύναται να έχεις πολλά αρχεία ανοιχτά εντός του Emacs.
+
+Το Emacs αποθηκεύει το περιεχόμενο του κάθε αρχείου σε αντικείμενο το
+οποίο ονομάζεται «ενταμιευτής» (buffer).  Η εξεύρεση αρχείου
+δημιουργεί νέο ενταμιευτή εντός του Emacs.  Για να δεις την λίστα με
+όλους τους υφιστάμενους ενταμιευτές, πληκτρολόγησε
+
+       C-x C-b   Παράθεσε ενταμιευτές
+
+>> Δοκίμασε το C-x C-b τώρα.
+
+Παρατήρησε πως κάθε ενταμιευτής έχει όνομα ενώ δύναται να έχει επίσης
+κι όνομα αρχείου του οποίο το περιεχόμενο κρατεί.  ΟΤΙΔΗΠΟΤΕ βλέπεις
+σε παράθυρο Emacs πάντα είναι μέρος ενός ενταμιευτή.
+
+>> Πληκτρολόγησε C-x 1 για να εξαφανίσεις το παράθυρο που παραθέτει
+   τους ενταμιευτές.
+
+Όταν έχεις πολλούς ενταμιευτές, μόνο ένας είναι ο «τρέχον» σε κάθε
+στιγμή.  Πρόκειται για τον ενταμιευτή που επεξεργάζεσαι.  Εάν θες να
+επεξεργαστείς κάποιον άλλο ενταμιευτή, πρέπει να «μεταβείς» σε αυτόν.
+Αν θα μεταβείς σε ενταμιευτής που επισκέπτεται αρχείο, μπορείς να το
+κάνεις με το C-x C-f προσδιορίζοντας το όνομα του αρχείου.  Αλλά
+υπάρχει ευκολότερος τρόπος: χρησιμοποίησε την εντολή C-x b.  Σε αυτή
+την εντολή, πρέπει να εισάγεις το όνομα του ενταμιευτή.
+
+>> Δημιούργησε αρχείο ονόματι «foo»: γράψε C-x C-f foo <Return>.
+   Μετά πληκτρολόγησε C-x b TUTORIAL.el_GR <Return> για να επιστρέψεις
+   σε αυτό το κείμενο εκμάθησης του Emacs.
+
+Συνήθως, το όνομα του ενταμιευτή αντιστοιχεί σε αυτό του αρχείου
+(χωρίς το μέρος του αρχείου που αναφέρει τον κατάλογο/φάκελο στον
+οποίο βρίσκεται).  Ωστόσο αυτό δεν ισχύει πάντοτε.  Η παράθεση
+ενταμιευτών που φτιάχνει το C-x C-b δείχνει τόσο το όνομα του
+ενταμιευτή όσο κι αυτό του αρχείου.
+
+Κάποιοι ενταμιευτές δεν ανταποκρίνονται σε αρχεία.  Ο ενταμιευτής
+ονόματι «*Buffer List*», που περιέχει τα στοιχεία του C-x C-b, δεν
+έχει κάποιο υποκείμενο αρχείο.  Ο ενταμιευτής αυτού του
+TUTORIAL.el_GR αρχικά δεν είχε κάποιο αρχείο, αλλά τώρα έχει, καθώς
+στην προηγούμενη ενότητα χρησιμοποίησες το C-x C-s για να τον
+αποθηκεύσεις σε αρχείο.
+
+Ο ενταμιευτής με το όνομα «*Messages*» επίσης δεν έχει αρχείο.  Αυτός
+περιέχει όλα τα μηνύματα που εμφανίζονται στο κάτω μέρος της οθόνης
+κατά την λειτουργία του Emacs.
+
+>> Πληκτρολόγησε C-x b *Messages* <Return> για να δεις τον ενταμιευτή
+   με τα μηνύματα.  Μετά πληκτρολόγησε C-x b TUTORIAL.el_GR <Return>
+   για να επανέλθεις εδώ.
+
+Εάν κάνεις αλλαγές στο κείμενο ενός αρχείου, μετά βρεις κάποιο άλλο
+αρχείο, η πράξη αυτή δεν αποθηκεύει τις αλλαγές που έκανες στο πρώτο
+αρχείο.  Οι αλλαγές παραμένουν εντός του Emacs, στον ενταμιευτή που
+ανταποκρίνεται σε εκείνο το αρχείο.  Η δημιουργία ή επεξεργασία του
+δεύτερου αρχείου δεν επηρεάζει το πρώτο.  Αυτό είναι πολύ χρήσιμο,
+ωστόσο σημαίνει πως χρειάζεσαι έναν βολικό τρόπο να αποθηκεύεις
+αλλαγές σε πολλούς ενταμιευτές.  Το να πρέπει να επιστρέψεις στο
+πρώτο αρχείο απλά και μόνο για να το αποθηκεύσεις είναι ενοχλητικό.
+Οπότε έχουμε
+
+       C-x s     Αποθήκευσε ορισμένους ενταμιευτές στα αρχεία τους
+
+Το C-x s ρωτά για κάθε ενταμιευτή που επισκέπτεται αρχείο και που
+κρατά αλλαγές οι οποίες δεν έχουν αποθηκευτεί.  Σε ρωτά για κάθε
+ενταμιευτή κατά πόσον να αποθηκευτούν οι αλλαγές του στο αρχείο.
+
+>> Εισήγαγε μια γραμμή κειμένου και πληκτρολόγησε C-x s.
+   Θα σε ρωτήσει κατά πόσον θες να αποθηκεύσεις τον ενταμιευτή με
+   όνομα TUTORIAL.el_GR.  Απάντα καταφατικά με το «y» (yes).
+
+
+* ΕΠΕΚΤΕΙΝΟΝΤΑΣ ΤΟ ΣΥΝΟΛΟ ΕΝΤΟΛΩΝ
+---------------------------------
+
+Υπάρχουν πάρα πολλές εντολές του Emacs που δεν μπορούν να χωρέσουν σε
+όλους τους control και meta χαρακτήρες.  Το Emacs ξεπερνά αυτό το
+εμπόδιο με την εντολή επέκτασης (eXtend).  Αυτή έχει δύο μορφές:
+
+       C-x     Χαρακτήρος επέκταση.  Ακολουθείται από τον χαρακτήρα.
+       M-x     Ονόματος επέκταση.  Ακολουθείται από όνομα.
+
+Αυτές είναι εντολές που είναι χρήσιμες εν γένει αλλά χρησιμοποιούνται
+σχετικά λιγότερο από αυτές που έμαθες έως τώρα.  Έχεις ήδη δει εντολές
+επέκτασης, όπως το C-x C-f και το C-x C-s.  Άλλο παράδειγμα είναι η
+εντολή που κλείνει το Emacs--αυτή είναι C-x C-c.  (Μην ανησυχείς για
+απώλεια αλλαγών που έκανες· το C-x C-c ρωτά να αποθηκεύσει αλλαγές σε
+κάθε αρχείο πριν τερματίσει το Emacs.)
+
+Εάν χρησιμοποιείς γραφική προβολή, δεν χρειάζεσαι κάποια ειδική εντολή
+για να μεταβείς από το Emacs σε κάποια άλλη εφαρμογή.  Μπορείς να το
+κάνεις με το ποντίκι ή τις εντολές του διαχειριστή παραθύρων.  Αν όμως
+χρησιμοποιείς ακροδέκτη κειμένου ο οποίος προβάλει μόνο μία εφαρμογή,
+τότε πρέπει να «αναστείλεις» το Emacs για να επιλέξεις οποιαδήποτε
+άλλη εφαρμογή.
+
+C-z είναι η εντολή της *προσωρινής* εξόδου από το Emacs--μπορείς να
+επιστρέψεις στην ίδια συνεδρία υστερότερα.  Όταν το Emacs λειτουργεί
+εντός ακροδέκτη κειμένου, το C-z «αναστέλλει» το Emacs· δηλαδή
+επιστρέφει στο περίβλημα (shell) χωρίς να καταστρέψει την εργασία του
+Emacs.  Στα πλείστα περιβλήματα, μπορείς να επαναφέρεις το Emacs με
+την εντολή «fg» ή την «%emacs».
+
+Χρησιμοποιείς το C-x C-c όταν θες να αποσυνδεθείς πλήρως.  Είναι η
+σωστή πράξη για έξοδο από το Emacs, παράδειγμα για περιπτώσεις ταχείας
+επεξεργασίας κειμένου όπως στην διαχείριση ηλεκτρονικού ταχυδρομείου.
+
+Υπάρχουν πολλές εντολές του τύπου C-x.  Παραθέτουμε αυτές που έμαθες:
+
+       C-x C-f         Εξεύρεση αρχείου
+       C-x C-s         Αποθήκευση ενταμιευτή σε αρχείο
+       C-x s           Αποθήκευση μερικών ενταμιευτών στα αρχεία τους
+       C-x C-b         Παράθεση ενταμιευτών
+       C-x b           Μετάβαση σε ενταμιευτή
+       C-x C-c         Έξοδος από το Emacs
+       C-x 1           Διαγραφή όλων πλην ενός παραθύρου
+       C-x u           Αναίρεση
+
+Επώνυμες εκτεταμένες εντολές είναι αυτές που χρησιμοποιούνται με
+λιγότερη συχνότητα, ή εντολές που χρησιμοποιούνται μόνο σε
+συγκεκριμένες λειτουργίες.  Ως παράδειγμα έχουμε την εντολή
+replace-string, η οποία αντικαθιστά μια σειρά (αλληλουχία) χαρακτήρων
+με μια άλλη εντός του ενταμιευτή.  Όταν πληκτρολογείς M-x, το Emacs
+σε προτρέπει στο κάτω μέρος της οθόνης για το όνομα της εντολής·
+«replace-string» σε αυτή την περίπτωση.  Απλά να πληκτρολογήσεις το
+«repl s<TAB>» και το Emacs θα ολοκληρώσει το όνομα.  (<TAB> αναφέρεται
+στο πλήκτρο Tab, που συνήθως βρίσκεται πάνω από το Caps Lock ή το
+Shift στην αριστερή πλευρά του πληκτρολογίου.)  Κατάθεσε το όνομα της
+εντολής με το <Return>.
+
+Η εντολή replace-string απαιτεί δύο παραμέτρους--την σειρά χαρακτήρων
+προς αντικατάσταση και αυτή που θα την αντικαταστήσει.  Κάθε
+παράμετρος τελειώνει με το <Return>.
+
+>> Μετακίνησε τον δείκτη στην κενή γραμμή δύο γραμμές κάτω από αυτήν.
+   Πληκτρολόγησε M-x repl s<Return>αλλάξει<Return>μετατραπεί<Return>
+
+   Πρόσεξε πως αυτή η γραμμή έχει αλλάξει: αντικατέστησες την λέξη
+   «αλλάξει» με την «μετατραπεί» όπου αυτή υπήρχε μετά την αρχική θέση
+   του δείκτη.
+
+
+* ΑΥΤΟΜΑΤΗ ΑΠΟΘΗΚΕΥΣΗ
+---------------------
+
+Όταν έχεις κάνει αλλαγές σε ένα αρχείο, αλλά δεν τις έχεις αποθηκεύσει
+ακόμα, ενδέχεται να χαθούν αν ο υπολογιστής κλείσει.  Για να σε
+προστατέψει από αυτό το ενδεχόμενο, το Emacs κατά διαστήματα γράφει σε
+ένα αρχείο «αυτόματης αποθήκευσης» κάθε αρχείο που επεξεργάζεσαι.  Το
+όνομα αυτού του αρχείου έχει ένα # στην αρχή κι ένα στο τέλος· για
+παράδειγμα, αν το αρχείο σου ονομάζεται «hello.c», η αυτόματη
+αποθήκευση γίνεται στο «#hello.c#».  Όταν αποθηκεύσεις το αρχείο με
+τον φυσιολογικό τρόπο, το Emacs διαγράφει το αρχείο αυτόματης
+αποθήκευσης.
+
+Εάν ο υπολογιστής κλείσει αναπάντεχα μπορείς να ανακτήσεις αυτό που
+επεξεργαζόσουν με το να βρεις το αρχείο (το κανονικό αρχείο, όχι αυτό
+της αυτόματης αντιγραφής του) και να πληκτρολογήσεις M-x
+recover-this-file <Return>.  Όταν σου ζητηθεί επιβεβαίωση,
+πληκτρολόγησε yes<Return> για την ανάκτηση των δεδομένων.
+
+
+* ΤΟΠΟΣ ΑΝΤΗΧΗΣΗΣ
+-----------------
+
+Αν το Emacs διακρίνει πως πληκτρολογείς τους χαρακτήρες μιας
+μακροσκελούς εντολής με σχετικά αργό ρυθμό, θα σου τους δείξει στο
+κάτω μέρος της οθόνης σε αυτό που ονομάζεται «τόπος αντήχησης».  Ο
+τόπος αντήχησης περιλαμβάνει την τελευταία γραμμή της οθόνης.
+
+
+* ΓΡΑΜΜΗ ΚΑΤΑΣΤΑΣΗΣ
+-------------------
+
+Η γραμμή ακριβώς πάνω από τον τόπο αντήχησης ονομάζεται «γραμμή
+κατάστασης».  Αυτή αναφέρει πληροφορίες όπως:
+
+ -:**-  TUTORIAL.el_GR       63% L800    (Fundamental)
+
+Αυτή η γραμμή έχει χρήσιμες πληροφορίες για την κατάσταση του Emacs
+και του κειμένου που επεξεργάζεσαι.
+
+Ήδη γνωρίζεις τι σημαίνει το πεδίο ονόματος του αρχείου--αναφέρει το
+αρχείο που έχεις επισκεφθεί.  Το ΝΝ% δείχνει την τρέχουσα θέση σου
+στον ενταμιευτή του κειμένου: σημαίνει πως ΝΝ επί τις εκατό του
+ενταμιευτή βρίσκεται πέρα από το πάνω μέρος της οθόνης.  Εάν το πάνω
+μέρος περιέχει όλο το προηγούμενο κείμενο, τότε θα γράφει «Top» αντί
+για «0%».  Αν είναι στο κάτω μέρος του ενταμιευτή, τότε θα αναγράφει
+«Bot».  Αν ο ενταμιευτής είναι μικρός ώστε όλο το περιεχόμενο του να
+χωράει στην οθόνη, τότε η γραμμή κατάστασης θα γράφει «All».
+
+Το L και τα ψηφία δείχνουν την θέση με άλλο τρόπο: τον αριθμό της
+γραμμής όπου βρίσκεται το σημείο.
+
+Οι αστερίσκοι κοντά στην αρχή δείχνουν πως έχουν υπάρξει τροποποιήσεις
+στο κείμενο.  Μόλις επισκεφθείς ή αποθηκεύσεις ένα αρχείο, εκείνο το
+τμήμα δεν δείχνει αστερίσκους παρά μόνο παύλες.
+
+Το τμήμα της γραμμής κατάστασης εντός παρενθέσεων αναφέρει τις
+λειτουργίες επεξεργασίας που ισχύουν.  Η βασική λειτουργία ονομάζεται
+Fundamental κι είναι αυτή που χρησιμοποιείς τώρα.  Πρόκειται για
+παράδειγμα «αξιωματικής λειτουργίας» (major mode).
+
+Το Emacs έχει πολλές αξιωματικές λειτουργίες.  Κάποιες αφορούν την
+επεξεργασία κειμένου σε διάφορες γλώσσες προγραμματισμού ή για διάφορα
+ήδη κειμένου, όπως Lisp mode, Text mode, κτλ.  Μόνο μια αξιωματική
+λειτουργία γίνεται να είναι σε ισχύ, και το όνομα της βρίσκεται στην
+γραμμή κατάστασης όπου τώρα υπάρχει το «Fundamental».
+
+Κάθε αξιωματική λειτουργία κάνει κάποιες εντολές να συμπεριφέρονται με
+διαφορετικό τρόπο.  Για παράδειγμα, υπάρχουν εντολές για την
+δημιουργία σχολίων σε ένα πρόγραμμα, και καθώς κάθε γλώσσα έχει τις
+δικές τις ιδέες για το τι συνιστά σχόλιο, η εκάστοτε αξιωματική
+λειτουργία εισάγει σχόλια ιδιοτρόπως.
+
+Κάθε αξιωματική λειτουργία φέρει το όνομα μιας εκτεταμένης εντολής,
+που είναι ένας τρόπος να αλλάξεις σε αυτή.  Για παράδειγμα, M-x
+fundamental-mode είναι η εντολή που θέτει σε ισχύ το Fundamental mode.
+
+Αν θα επεξεργάζεσαι κείμενο σε ανθρώπινη γλώσσα, όπως αυτό το αρχείο,
+μάλλον θες να χρησιμοποιήσεις το Text mode.
+
+>> Πληκτρολόγησε M-x text-mode <Return>.
+
+Μην ανησυχείς, καθώς καμία από τις εντολές που έχεις μάθει δεν αλλάζει
+με ουσιαστικό τρόπο.  Ωστόσο θα διαπιστώσεις πως M-f και M-b τώρα
+θεωρούν τα εισαγωγικά ως μέρος της λέξης.  Πριν, στο Fundamental mode,
+M-f και M-b διάβαζαν τα εισαγωγικά ως διαχωριστικά λέξεων.
+
+Αξιωματικές λειτουργίες κάνουν τέτοιες εκλεπτυσμένες αλλαγές: οι
+πλείστες εντολές «διεκπεραιώνουν το ίδιο έργο» σε κάθε αξιωματική
+λειτουργία, αλλά ίσως το επιτυγχάνουν με ελαφρώς διαφορετικό τρόπο.
+
+Για να μάθεις περισσότερα σχετικά με την τρέχουσα αξιωματική
+λειτουργία, πληκτρολόγησε C-h m.
+
+>> Μετακίνησε τον δείκτη στην γραμμή μετά από αυτήν.
+>> Πληκτρολόγησε C-l C-l ώστε να έρθει αυτή η γραμμή στο πάνω μέρος
+   της οθόνης.
+>> Πληκτρολόγησε C-h m για να διαβάσεις πως διαφέρει το Text mode από
+   το Fundamental mode.
+>> Πληκτρολόγησε C-x 1 για να αφαιρέσεις την καταγραφή από την οθόνη.
+
+Οι αξιωματικές λειτουργίες ονομάζονται έτσι διότι υπάρχουν και οι
+ελάσσονες λειτουργίες (minor modes).  Ελάσσονες λειτουργίες δεν
+υποκαθιστούν τις αξιωματικές λειτουργίες, παρά μόνο επί μέρους πτυχές
+τους.  Κάθε ελάσσων λειτουργία μπορεί να ενεργοποιηθεί ή
+απενεργοποιηθεί αυτοτελώς, ανεξάρτητα από άλλες ελάσσονες λειτουργίες
+ή οποιονδήποτε συνδυασμό τους.
+
+Μια ελάσσων λειτουργία που είναι πολύ χρήσιμη, ειδικά για την
+επεξεργασία κειμένου ανθρώπινης γλώσσας, είναι η Auto Fill mode.  Όταν
+αυτή η λειτουργία ενεργοποιηθεί, το Emacs αυτόματα διαχωρίζει τις
+γραμμές μεταξύ των λέξεων όταν αυτές γίνονται πολύ πλατιές.
+
+Το Auto Fill mode ενεργοποιείται με M-x auto-fill-mode <Return>.  Όταν
+η λειτουργία είναι σε ισχύ, μπορεί να απενεργοποιηθεί πάλι με M-x
+auto-fill-mode <Return>.  Αν είναι απενεργοποιημένη, τότε η εντολή
+αυτή την ενεργοποιεί, και το αντίστροφο.  Λέμε πως η εντολή
+«εναλλάσσει την λειτουργία».
+
+>> Πληκτρολόγησε M-x auto-fill-mode <Return> τώρα.  Κατόπιν
+   πληκτρολόγησε μια γραμμή με «ασδφ » πολλές φορές ως που να δεις ότι
+   διαιρείται σε δύο γραμμές.  Πρέπει να έχει κενά μεταξύ των
+   χαρακτήρων, διότι μόνο με βάση αυτά λειτουργεί το Auto Fill (δεν
+   κόβει λέξεις).
+
+Το μήκος συνήθως ορίζεται στους 70 χαρακτήρες, αλλά μπορείς να το
+αλλάξεις με την εντολή C-x f.  Όρισε τον αριθμό που επιθυμείς ως
+αριθμητική παράμετρο.
+
+>> Πληκτρολόγησε C-x f με παράμετρο το 20.  (C-u 2 0 C-x f).  Κατόπιν
+   πληκτρολόγησε τυχαίο κείμενο με κενά και πρόσεξε πως το Emacs
+   συμπληρώνει τις γραμμές έως τους 20 χαρακτήρες.  Μετά θέσε πάλι το
+   μήκος τους 70 χαρακτήρες χρησιμοποιώντας C-x f με αριθμητική
+   παράμετρο.
+
+Αν κάνεις αλλαγές στην μέση της παραγράφου, το Auto Fill mode δεν
+επανασυμπληρώνει για χάρη σου.
+Για να επανασυμπληρώσεις μια παράγραφο χειροκίνητα, πληκτρολόγησε M-q
+(META-q) με τον δείκτη εντός της παραγράφου εκείνης.
+
+>> Μετακίνησε τον δείκτη στην προηγούμενη παράγραφο και πληκτρολόγησε
+   M-q.
+
+
+* ΑΝΑΖΗΤΗΣΗ
+-----------
+
+Το Emacs μπορεί να αναζητήσει σειρές (σειρά (string) είναι αλληλουχία
+χαρακτήρων) είτε προς τα εμπρός είτε ανάποδα.  Αναζήτηση σειράς
+συνιστά κίνηση του δείκτη· μετακινεί τον δείκτη όπου εμφανίζεται η
+σειρά.
+
+Η εντολή αναζήτησης του Emacs είναι «τμηματική».  Αυτό σημαίνει πως η
+αναζήτηση γίνεται ενόσω δακτυλογραφείς τους χαρακτήρες της σειράς που
+αναζητείς.
+
+Η εντολή προς εκκίνηση αναζήτησης είναι C-s για κίνηση προς τα εμπρός
+και C-r και κίνηση όπισθεν.  ΑΛΛΑ ΠΕΡΙΜΕΝΕ!  Μην τις δοκιμάσεις ακόμα.
+
+Όταν πληκτρολογείς C-s θα δεις πως η σειρά «I-search» εμφανίζεται ως
+προτροπή στον τόπο αντήχησης.  Αυτό σου λέει πως το Emacs βρίσκεται σε
+αυτό που ονομάζεται «τμηματική αναζήτηση» και περιμένει να
+πληκτρολογήσεις αυτό το οποίο ψάχνεις.  <Return> ολοκληρώνει την
+αναζήτηση.
+
+>> Τώρα πληκτρολόγησε C-s για να αρχίσεις την αναζήτηση.  ΑΡΓΑ, ένα
+   γράμμα τη φορά, γράψε «δείκτη», κάνοντας παύση αφού εισάγεις τον
+   κάθε χαρακτήρα για να δεις τι συμβαίνει με τον δείκτη.
+   Τώρα έχεις αναζητήσει για «δείκτη» μία φορά.
+>> Πάτα πάλι C-s για να ψάξεις την επόμενη εμφάνιση του «δείκτη».
+>> Τώρα πληκτρολόγησε <DEL> τέσσερις φορές και δες πως κινείται ο
+   δείκτης.
+>> Πληκτρολόγησε <Return> για να τερματίσεις την αναζήτηση.
+
+Είδες τι έγινε; Το Emacs, σε τμηματική αναζήτηση, προσπαθεί να
+εντοπίσει την επόμενη εμφάνιση της σειράς χαρακτήρων που έγραψες.  Για
+να μεταφερθείς στην επόμενη εμφάνιση, πάτα C-s ξανά.  Εάν δεν υπάρχει
+άλλη, το Emacs θα σηματοδοτήσει «αποτυχία» (failing).  Το C-g μπορεί
+να τερματίσει την αναζήτηση.
+
+Κατά την διάρκεια μιας τμηματικής αναζήτησης εάν πατήσεις <DEL>, η
+αναζήτηση «υποχωρεί» σε πρότερο σημείο.  Αν πατήσεις <DEL> αμέσως
+αφότου έχεις πληκτρολογήσει C-s για μετακίνηση στην επόμενη εμφάνιση
+μιας σειράς χαρακτήρων, θα μεταβείς πίσω στην προηγούμενη εμφάνιση.
+Εάν δεν υπάρχει προηγούμενη εμφάνιση, το <DEL> διαγράφει τον τελευταίο
+χαρακτήρα στην σειρά.  Για παράδειγμα, φαντάσου πως έγραψες «δ» για να
+βρεις την πρώτη εμφάνιση του.  Τώρα αν προσθέσεις το «ε» θα πας στην
+πρώτη εμφάνιση του «δε».  Τώρα πάτα <DEL>.  Διαγράφει το «ε» από την
+σειρά και μετακινεί τον δείκτη πίσω στην πρώτη εμφάνιση του «δ».
+
+Αν είσαι στο μέσον μιας αναζήτησης και πληκτρολογήσεις ένα χαρακτήρα
+control ή meta (με κάποιες εξαιρέσεις--όπως C-s και C-r που έχουν
+ειδική σημασία στην αναζήτηση), η αναζήτηση θα τερματιστεί.
+
+Το C-s ξεκινά αναζήτηση που ψάχνει για κάθε εμφάνιση της αναζητούμενης
+σειράς ΑΠΟ την τρέχουσα θέση του δείκτη.  Εάν θες να βρεις
+προηγούμενες εμφανίσεις, χρησιμοποίησε το C-r.  Όσα είπαμε για το C-s
+ισχύουν για το C-r, με μόνη διαφορά την κατεύθυνση της αναζήτησης.
+
+
+* ΠΟΛΛΑΠΛΑ ΠΑΡΑΘΥΡΑ
+-------------------
+
+Ένα από τα καλά του Emacs είναι πως μπορείς να παρουσιάσεις πέραν του
+ενός παραθύρου στην οθόνη.  (Σημείωσε πως το Emacs χρησιμοποιεί τον
+όρο «πλαίσιο» (frame)--επεξηγείται στην επόμενη ενότητα--για αυτό που
+ορισμένες εφαρμογές αποκαλούν «παράθυρο» (window).  Το εγχειρίδιο του
+Emacs περιέχει γλωσσάριο με όλους τους όρους.)
+
+>> Φέρε τον δείκτη σε αυτή την γραμμή και πληκτρολόγησε C-l C-l.
+
+>> Τώρα πάτα C-x 2, που μοιράζει την οθόνη σε δύο παράθυρα.
+   Και τα δύο παράθυρα παρουσιάζουν αυτή την εκμάθηση.  Ο δείκτης
+   επεξεργασίας παραμένει στο πάνω παράθυρο.
+
+>> Πληκτρολόγησε C-M-v για να κυλήσεις το κάτω παράθυρο.  (Εάν δεν
+   έχεις META ή ALT πλήκτρο, τότε πληκτρολόγησε <ESC> C-v.)
+
+>> Πληκτρολόγησε C-x o («o» είναι για το «άλλο» στην αγγλική (other))
+   ώστε να επιλέξεις το έτερο παράθυρο.
+
+>> Χρησιμοποίησε C-v και M-v στο κάτω παράθυρο για να το κυλήσεις.
+   Συνέχισε να διαβάζεις αυτές τις οδηγίες στο πάνω παράθυρο.
+
+>> Πάτα C-x o και πάλι ώστε να φέρεις τον δείκτη πίσω στο πάνω
+   παράθυρο.  Ο δείκτης στο πάνω παράθυρο είναι εκεί που ήταν και
+   πριν.
+
+Μπορείς να συνεχίσεις να χρησιμοποιείς C-x o για εναλλαγή μεταξύ των
+παραθύρων.  Το «επιλεγμένο παράθυρο», όπου γίνεται η επεξεργασία,
+είναι αυτό που έχει ένα φανερό δείκτη που αναβοσβήνει καθώς γράφεις.
+Τα άλλα παράθυρα έχουν τις δικές τους θέσεις για τον δείκτη· αν
+χρησιμοποιείς γραφική προβολή του Emacs, αυτοί οι δείκτες
+παρουσιάζονται ως άδεια κουτιά που δεν αναβοσβήνουν.
+
+Η εντολή C-M-v είναι πολύ χρήσιμη όταν επεξεργάζεται κείμενο σε ένα
+παράθυρο και χρησιμοποιείς το έτερο παράθυρο για αναφορά.  Χωρίς να
+φύγεις από το επιλεγμένο παράθυρο, μπορείς να κυλήσεις το παράθυρο με
+C-M-v.
+
+Το C-M-v αποτελεί παράδειγμα CONTROL-META χαρακτήρα.  Αν έχεις META (ή
+ALT) πλήκτρο, πληκτρολογείς C-M-v κρατώντας πατημένα τόσο το CONTROL
+όσο και το META και πληκτρολογώντας v.  Δεν έχει σημασία αν το CONTROL
+ή το META «έρχεται πρώτο», καθώς αμφότερα μεταβάλουν τον χαρακτήρα που
+εισάγεις.
+
+Αν δεν έχεις το πλήκτρο META (ή ALT), και χρησιμοποιείς το <ESC>, τότε
+η σειρά έχει σημασία: πρώτα πατάς κι αφήνεις το <ESC> κι ακολουθείς με
+CONTROL-v, διότι CONTROL-<ESC>-v δεν θα δουλέψει.  Αυτό γιατί το <ESC>
+είναι χαρακτήρας από μόνο του, κι όχι πλήκτρο μετατροπής χαρακτήρων.
+
+>> Πληκτρολόγησε C-x 1 στο πάνω παράθυρο για να κλείσεις το κάτω
+   παράθυρο.
+
+(Άν πατούσες C-x 1 στο κάτω παράθυρο, θα έκλεινες το πάνω.  Φαντάσου
+πως αυτή η εντολή λέει «κράτα ένα παράθυρο--αυτό που έχω επιλεγμένο.»)
+
+Δεν είναι απαραίτητο να παρουσιάζεις τον ίδιο ενταμιευτή σε πολλά
+παράθυρα.  Αν χρησιμοποιήσεις το C-x C-f για να βρεις ένα αρχείο στο
+ένα παράθυρο, το έτερο παράθυρο δεν αλλάζει.  Μπορείς να βρεις ένα
+αρχείο σε κάθε παράθυρο ανεξάρτητα από τα άλλα.
+
+Ιδού άλλος ένα τρόπος για να χρησιμοποιείς δύο παράθυρα που δείχνουν
+διαφορετικά πράγματα:
+
+>> Πληκτρολόγησε C-x 4 C-f και δώσε όνομα αρχείου στην σχετική
+   προτροπή που εμφανίζεται στο κάτω μέρος της οθόνης.  Επικύρωσε την
+   επιλογή σου με το <Return>.  Δες πως το επιλεγμένο αρχείο
+   εμφανίζεται στο κάτω παράθυρο.  Ο δείκτης πάει κι αυτός εκεί.
+
+>> Πληκτρολόγησε C-x o για να επιστρέψεις στο πάνω παράθυρο και μετά
+   C-x 1 για να κλείσεις το κάτω παράθυρο.
+
+
+* ΠΟΛΛΑΠΛΑ ΠΛΑΙΣΙΑ
+------------------
+
+Το Emacs μπορεί επίσης να δημιουργήσει πολλά «πλαίσια».  Πλαίσιο
+ονομάζουμε αυτό που περιέχει ένα ή περισσότερα παράθυρα, μαζί με τα
+μενού, μπάρες κύλισης, τόπο αντήχησης, κτλ.  Σε γραφικές προβολές,
+αυτό που το Emacs αποκαλεί «πλαίσιο» είναι το ίδιο που άλλες εφαρμογές
+ονομάζουν «παράθυρο».  Πολλά γραφικά πλαίσια μπορούν να εμφανίζονται
+στην οθόνη ταυτόχρονα.  Σε ακροδέκτη κειμένου, μόνο ένα πλαίσιο μπορεί
+να παρουσιάζεται κάθε φορά.
+
+>> Πληκτρολόγησε C-x 5 2.
+   Δες ένα νέο πλαίσιο που εμφανίστηκε στην οθόνη.
+
+Μπορείς να κάνεις όσα έκανες στο αρχικό πλαίσιο και στο νέο πλαίσιο.
+Δεν υπάρχει τίποτα το ειδικό για το ένα ή το άλλο.
+
+>> Πληκτρολόγησε C-x 5 0.
+   Αυτό αφαιρεί το επιλεγμένο πλαίσιο.
+
+Μπορείς πάντοτε να αφαιρέσεις ένα πλαίσιο με τον κοινό τρόπο που
+προσφέρει το σύστημα γραφικών (συνήθως πατάς με το ποντίκι πάνω σε ένα
+εικονίδιο «X» σε ένα από τα πάνω άκρα του πλαισίου).  Αν αφαιρέσεις το
+τελευταίο πλαίσιο της λειτουργίας του Emacs κατά αυτόν τον τρόπο, τότε
+κλείνει το Emacs.
+
+
+* ΕΠΙΠΕΔΑ ΑΝΑΔΡΟΜΙΚΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ
+----------------------------------
+
+Κάποιες φορές θα βρεθείς σε αυτό που ονομάζουμε «επίπεδο αναδρομικής
+επεξεργασίας».  Αυτό επισημαίνεται από αγκύλες στην γραμμή κατάστασης
+που περιβάλλουν τις παρενθέσεις γύρω από την αξιωματική λειτουργία.
+Για παράδειγμα, ίσως δεις [(Fundamental)] αντί για (Fundamental).
+
+Για να βγεις από επίπεδο αναδρομικής επεξεργασίας, πληκτρολόγησε <ESC>
+<ESC> <ESC>.  Αυτή είναι η γενική εντολή εξόδου.  Μπορείς να την
+χρησιμοποιήσεις για να κλείσεις όλα τα έτερα παράθυρα και για να βγεις
+από τον μικροενταμιευτή.
+
+>> Πληκτρολόγησε M-x για να μπεις στον μικροενταμιευτή· κατόπιν πάτα
+   <ESC> <ESC> <ESC> για να εξέλθεις.
+
+Δεν μπορείς να χρησιμοποιήσεις C-g για να βγεις από επίπεδο
+αναδρομικής επεξεργασίας.  Αυτό είναι έτσι γιατί το C-g ακυρώνει
+εντολές ή τις παραμέτρους αυτών ΕΝΤΟΣ του τρέχοντος επιπέδου
+αναδρομικής επεξεργασίας.
+
+
+* ΠΕΡΙΣΣΟΤΕΡΗ ΒΟΗΘΕΙΑ
+---------------------
+
+Σε αυτό τον οδηγό προσπαθήσαμε να προσφέρουμε βασικές γνώσεις για να
+αρχίσεις να χρησιμοποιείς το Emacs.  Υπάρχουν τόσα πολλά στο Emacs που
+θα ήταν αδύνατο να τα εξηγήσουμε όλα εδώ.  Ωστόσο, μάλλον θα θέλεις να
+μάθεις περισσότερα για τις διάφορες δυνατότητες που παρέχει το Emacs.
+Προς αυτόν τον σκοπό, το Emacs προσφέρει εντολές για την εξεύρεση κι
+ανάγνωση οδηγιών.  Αυτές οι εντολές «βοήθειας» (help) όλες αρχίζουν με
+τον χαρακτήρα CONTROL-h, που αποκαλείται «ο χαρακτήρας βοηθείας».
+
+Για να χρησιμοποιήσεις τις υπηρεσίες βοηθείας, πληκτρολόγησε C-h, και
+μετά ένα χαρακτήρα που ανταποκρίνεται στο είδος της βοήθειας που
+επιζητείς.  Αν είσαι σε ΠΡΑΓΜΑΤΙΚΑ δύσκολη θέση, πάτα C-h ? και το
+Emacs θα σου πει τι είδη βοηθείας υπάρχουν.  Αν έχεις ήδη πατήσει C-h
+και αποφάσισες πως δεν θέλεις καμία βοήθεια, απλά ακύρωσε το με C-g.
+
+(Αν το C-h δεν προβάλει μήνυμα για βοήθεια στο κάτω μέρος της οθόνης,
+δοκίμασε το πλήκτρο F1, αλλιώς M-x help <Return>.)
+
+Η πιο βασική βοήθεια προσφέρεται από το C-h c.  Πληκτρολόγησε C-h,
+ύστερα το c, και μετά τον χαρακτήρα ή αλληλουχία χαρακτήρων
+οποιασδήποτε εντολής: το Emacs θα εμφανίσει μια σύντομη περιγραφή της
+εντολής.
+
+>> Πληκτρολόγησε C-h c C-p
+
+Το μήνυμα θα είναι κάπως έτσι:
+
+       C-p εκτελεί την εντολή previous-line
+
+Αυτό σου λέει το «όνομα της συνάρτησης».  Καθώς οι συναρτήσεις έχουν
+ονόματα που φανερώνουν την λειτουργία τους, μπορούν να ερμηνευθούν κι
+ως πολύ σύντομες περιγραφές--επαρκείς για να σου υπενθυμίσουν κάτι που
+ήδη έχεις μάθει.
+
+Εντολές με πολλούς χαρακτήρες, όπως C-x C-s ή <ESC>v (αντί του M-v για
+όσους δεν έχουν πλήκτρο META ή ALT) μπορούν κι αυτές να δοθούν μετά το
+C-h c.
+
+Για περισσότερες πληροφορίες αναφορικά με μια εντολή, χρησιμοποίησε το
+C-h k αντί του C-h c.
+
+>> Πληκτρολόγησε C-h k C-p.
+
+Αυτό δείχνει την πλήρη καταγραφή της συνάρτησης, καθώς και το όνομα
+της, σε νέο παράθυρο του Emacs.  Όταν το διαβάσεις, πάτα C-x 1 για να
+κλείσεις εκείνο το παράθυρο.  Δεν χρειάζεται να το κάνεις αυτό αμέσως.
+Ίσως θες πρώτα να επεξεργαστείς κάτι καθώς αναφέρεσαι στο κείμενο
+βοηθείας και μετά να πληκτρολογήσεις C-x 1.
+
+Ιδού άλλες χρήσιμες επιλογές με το C-h:
+
+   C-h x       Περιέγραψε μια εντολή.  Ζητά το όνομα της εντολής.
+
+>> Προσπάθησε C-h x previous-line <Return>.
+   Δείχνει όλες τις πληροφορίες που έχει το Emacs σχετικά με την
+   συνάρτηση που δίνει την εντολή C-p.
+
+Παρόμοια εντολή είναι αυτή του C-h v που δείχνει την καταγραφή μιας
+μεταβλητής, συμπεριλαμβανομένων αυτών που μπορείς να τροποποιήσεις για
+να αλλάξεις την συμπεριφορά του Emacs.  Πρέπει να γράψεις το όνομα της
+μεταβλητής στην σχετική προτροπή.
+
+   C-h a        Συναφή εντολών (command apropos).  Γράψε μια
+                λέξη-κλειδί και το Emacs θα παραθέσει όλες τις εντολές
+                των οποίων το όνομα περιέχει αυτήν την λέξη.  Όλες
+                αυτές οι εντολές μπορούν να κληθούν με το META-x.  Για
+                ορισμένες εντολές, τα συναφή εντολών περιέχουν και την
+                σχετική αλληλουχία χαρακτήρων που εκτελεί την εντολή.
+
+>> Πληκτρολόγησε C-h a file <Return>.
+
+Αυτό παραθέτει σε έτερο παράθυρο όλες τις εντολές M-x που περιέχουν
+τον όρο «file» στο όνομα τους.  Θα δεις εντολές χαρακτήρος μεταξύ των
+επονομαζομένων (όπως C-x C-f πέριξ του find-file).
+
+>> Πληκτρολόγησε C-M-v για να κυλήσεις το παράθυρο βοηθείας.  Κάνε το
+   μερικές φορές.
+
+>> Πληκτρολόγησε C-x 1 για να κλείσεις το παράθυρο βοηθείας.
+
+   C-h i        Διάβασε τα εγχειρίδια (Info manuals).  Αυτή η εντολή
+                σε βάζει σε ειδικό ενταμιευτή που ονομάζεται «*info*»
+                όπου μπορείς να διαβάσεις εγχειρίδια για τις
+                συσκευασίες που είναι εγκατεστημένες στο σύστημα σου.
+                Πληκτρολόγησε m emacs <Return> για να διαβάσεις το
+                εγχειρίδιο του Emacs.  Αν δεν έχεις χρησιμοποιήσει το
+                Info ποτέ, πληκτρολόγησε h και το Emacs θα σου δείξει
+                τις σχετικές λειτουργίες.  Αφού ολοκληρώσεις αυτή την
+                εκμάθηση, να αναφέρεσε στο εγχειρίδιο του Emacs ως την
+                κύρια πηγή όλων των καταγραφών.
+
+
+* ΑΛΛΕΣ ΛΕΙΤΟΥΡΓΙΕΣ
+-------------------
+
+Μπορείς να μάθεις περισσότερα για το Emacs διαβάζοντας το εγχειρίδιο
+του, είτε ως έντυπο βιβλίο, είτε εντός του Emacs (χρησιμοποίησε τον
+κατάλογο βοηθείας ή πληκτρολόγησε C-h r).  Δύο λειτουργίες που ίσως να
+σου φανούν χρήσιμες είναι η «ολοκλήρωση», που εξοικονομεί στην
+δακτυλογράφηση, και το Dired, που απλοποιεί την διαχείριση αρχείων.
+
+Η ολοκλήρωση είναι τρόπος αποφυγής αχρείαστης πληκτρολόγησης.  Για
+παράδειγμα, αν θες να μεταβείς στον ενταμιευτή *Messages*,
+πληκτρολογείς C-x b *M<Tab> και το Emacs θα συμπληρώσει το υπόλοιπο
+του ονόματος ως εκεί που μπορεί να κρίνει αντιστοιχία με αυτό που
+έχεις ήδη γράψει.  Η ολοκλήρωση δουλεύει επίσης για ονόματα εντολών κι
+αρχείων.  Στο εγχειρίδιο καταγράφεται στην ενότητα «Completion».
+
+Το Dired σου επιτρέπει να παραθέτεις κατάλογο αρχείων (και προαιρετικά
+υποκαταλόγους), να επιλέγεις, επισκέπτεσαι, μετονομάζεις, διαγράφεις,
+ή γενικά να επιδράς πάνω σε αρχεία.  Το Dired καταγράφεται στο
+εγχειρίδιο στην ενότητα «Dired».
+
+Το εγχειρίδιο καταγράφει πολλές άλλες λειτουργίες του Emacs.
+
+
+* ΕΓΚΑΤΑΣΤΑΣΗ ΣΥΣΚΕΥΑΣΙΩΝ
+-------------------------
+
+Υπάρχει πλούσιος όγκος συσκευασιών (packages) του Emacs που έχουν
+παρασκευαστεί από την κοινότητα των χρηστών του, που επεκτείνουν τις
+δυνατότητες του Emacs.  Αυτές οι συσκευασίες περιλαμβάνουν υποστήριξη
+για νέες γλώσσες, πρόσθετα θέματα χρωμάτων, προεκτάσεις για εξωτερικές
+εφαρμογές, και άλλα πολλά.
+
+Για παράθεση των διαθέσιμων συσκευασιών, πληκτρολόγησε M-x
+list-packages.  Στη σχετική λίστα, μπορείς να εγκαταστήσεις ή
+απεγκαταστήσεις συσκευασίες, καθώς και να διαβάσεις τις περιγραφές
+τους.  Για περισσότερες πληροφορίες περί διαχείρισης συσκευασιών, δες
+το εγχειρίδιο του Emacs.
+
+
+* ΚΑΤΑΛΗΚΤΙΚΑ
+-------------
+
+Για έξοδο από το Emacs, χρησιμοποίησε C-x C-c.
+
+Αυτή η εκμάθηση γράφτηκε για να είναι κατανοητή σε όλους τους νέους
+χρήστες.  Αν λοιπόν κάτι παραμένει ασαφές, μην κάτσεις εκεί να
+κατηγορείς τον εαυτό σου - πες μας για το πρόβλημα σου!
+
+
+* ΑΝΤΙΓΡΑΦΗ
+-----------
+
+Αυτό το κείμενο εκμάθησης είναι συνέχεια μιας μακράς γραμμής κειμένων
+εκμάθησης του Emacs, αρχής γενομένης αυτού του Stuart Cracraft για το
+αρχικό Emacs.
+
+Αυτή η έκδοση της εκμάθησης είναι μέρος του GNU Emacs.  Έχει
+πνευματικά δικαιώματα και δίνεται με την άδεια διανομής αντιγράφων υπό
+κάποιους όρους.
+
+  Πνευματικά Δικαιώματα (C) 1985, 1996, 1998, 2001-2022 Free Software
+  Foundation, Inc.
+
+  Αυτό το αρχείο είναι μέρος του GNU Emacs.
+
+  Το GNU Emacs είναι ελεύθερο λογισμικό: μπορείτε να το αναδιανέμετε
+  ή/και να το τροποποιήσετε σύμφωνα με τους όρους της GNU Γενική
+  Δημόσια Άδεια (GNU General Public License) όπως δημοσιεύθηκε από το
+  Ίδρυμα Ελεύθερου Λογισμικού (Free Software Foundation), είτε την
+  έκδοση 3 της άδειας, είτε (κατά την επιλογή σας) οποιαδήποτε
+  μεταγενέστερη έκδοση.
+
+  Το GNU Emacs διανέμεται με την ελπίδα πως θα είναι χρήσιμο, αλλά
+  ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ· χωρίς καν την συνεπαγόμενη εγγύηση της
+  ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ. Δείτε την
+  GNU Γενική Δημόσια Άδεια (GNU General Public License) για
+  περισσότερες λεπτομέρειες.
+
+  Οφείλατε να λάβετε αντίγραφο της GNU Γενικής Δημόσιας Άδειας (GNU
+  General Public License) μαζί με το GNU Emacs.  Εάν όχι, δείτε
+  <https://www.gnu.org/licenses/>.
+
+Παρακαλώ όπως διαβάσετε το αρχείο COPYING και δώσετε αντίγραφα του GNU
+Emacs στους φίλους σας.  Βοηθήστε στην καταπολέμηση του περιορισμού
+(«ιδιοκτησία») του λογισμικού δια της χρήσης, γραφής, και κοινοποίησης
+ελεύθερου λογισμικού!
diff --git a/etc/tutorials/TUTORIAL.it b/etc/tutorials/TUTORIAL.it
index dba941cfd5..d7682a4a62 100644
--- a/etc/tutorials/TUTORIAL.it
+++ b/etc/tutorials/TUTORIAL.it
@@ -1110,7 +1110,7 @@ mentre fai riferimento al testo di aiuto e poi usare un 
C-x 1.
 
 Ecco altre utili opzioni di C-h:
 
-       C-h x   Descrive un comando.  Inserisci il nome della comando.
+       C-h x   Descrive un comando.  Inserisci il nome del comando.
 
 >> Prova con C-h x previous-line <Invio>.
    Questo mostrerà tutte le informazioni che Emacs possiede sulla
diff --git a/etc/tutorials/TUTORIAL.translators 
b/etc/tutorials/TUTORIAL.translators
index b6b9578706..891b6a1682 100644
--- a/etc/tutorials/TUTORIAL.translators
+++ b/etc/tutorials/TUTORIAL.translators
@@ -26,6 +26,10 @@ Maintainer: Dale Gulledge <dsplat@rochester.rr.com>
 Author:     Rafael Sepúlveda <drs@gnulinux.org.mx>
 Maintainer: Rafael Sepúlveda <drs@gnulinux.org.mx>
 
+* TUTORIAL.el_GR:
+Author:     Protesilaos Stavrou <info@protesilaos.com>
+Maintainer: Protesilaos Stavrou <info@protesilaos.com>
+
 * TUTORIAL.fr:
 Author:     Éric Jacoboni <jaco@teaser.fr>
 Maintainer: Éric Jacoboni <jaco@teaser.fr>
diff --git a/leim/Makefile.in b/leim/Makefile.in
index 4e70e8b7e9..29b9f3b2f8 100644
--- a/leim/Makefile.in
+++ b/leim/Makefile.in
@@ -32,6 +32,12 @@ leimdir = ${srcdir}/../lisp/leim
 
 EXEEXT = @EXEEXT@
 
+SMALL_JA_DIC = @SMALL_JA_DIC@
+JA_DIC_NO_REDUCTION_OPTION = --no-reduction
+ifeq ($(SMALL_JA_DIC), yes)
+       JA_DIC_NO_REDUCTION_OPTION =
+endif
+
 -include ${top_builddir}/src/verbose.mk
 
 # Prevent any settings in the user environment causing problems.
@@ -80,7 +86,7 @@ MISC= \
 TIT_MISC = ${TIT_GB} ${TIT_BIG5} ${MISC}
 
 
-all: ${leimdir}/leim-list.el ${leimdir}/ja-dic/ja-dic.el
+all: ${leimdir}/leim-list.el
 .PHONY: all
 
 
@@ -129,10 +135,12 @@ ${leimdir}/leim-list.el: ${srcdir}/leim-ext.el ${TIT_MISC}
 
 ${leimdir}/ja-dic/ja-dic.el: | $(leimdir)/ja-dic
 
+.PHONY: generate-ja-dic
+generate-ja-dic: ${leimdir}/ja-dic/ja-dic.el
 ${leimdir}/ja-dic/ja-dic.el: $(srcdir)/SKK-DIC/SKK-JISYO.L
        $(AM_V_GEN)$(RUN_EMACS) -batch -l ja-dic-cnv \
          --eval "(setq max-specpdl-size 5000)" \
-         -f batch-skkdic-convert -dir "$(leimdir)/ja-dic" "$<"
+         -f batch-skkdic-convert -dir "$(leimdir)/ja-dic" 
$(JA_DIC_NO_REDUCTION_OPTION) "$<"
 
 ${srcdir}/../lisp/language/pinyin.el: ${srcdir}/MISC-DIC/pinyin.map
        $(AM_V_GEN)${RUN_EMACS} -l titdic-cnv -f pinyin-convert $< $@
diff --git a/lib-src/etags.c b/lib-src/etags.c
index 65b9fae8d5..9a60714eca 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -1427,14 +1427,19 @@ main (int argc, char **argv)
   if (CTAGS)
     if (append_to_tagfile || update)
       {
-       char *cmd = xmalloc (2 * strlen (tagfile) + sizeof "sort -u -o..");
        /* Maybe these should be used:
           setenv ("LC_COLLATE", "C", 1);
           setenv ("LC_ALL", "C", 1); */
-       char *z = stpcpy (cmd, "sort -u -o ");
-       z = stpcpy (z, tagfile);
-       *z++ = ' ';
-       strcpy (z, tagfile);
+       char *cmd = xmalloc (8 * strlen (tagfile) + sizeof "sort -u -o '' ''");
+       char *z = stpcpy (cmd, "sort -u -o '");
+       char *escaped_tagfile = z;
+       for (; *tagfile; *z++ = *tagfile++)
+         if (*tagfile == '\'')
+           z = stpcpy (z, "'\\'");
+       ptrdiff_t escaped_tagfile_len = z - escaped_tagfile;
+       z = stpcpy (z, "' '");
+       z = mempcpy (z, escaped_tagfile, escaped_tagfile_len);
+       strcpy (z, "'");
        return system (cmd);
       }
   return EXIT_SUCCESS;
@@ -4161,6 +4166,9 @@ C_entries (int c_ext,             /* extension of C */
          if (definedef != dnone)
            break;
          bracelev -= 1;
+         /* If we see a closing brace in column zero, and we weren't told to
+            ignore indentation, we assume this the final brace of a function
+            or struct definition, and reset bracelev to zero.  */
          if (!ignoreindent && lp == newlb.buffer + 1)
            {
              if (bracelev != 0)
@@ -6396,7 +6404,8 @@ mercury_decl (char *s, size_t pos)
   size_t origpos;
   origpos = pos;
 
-  while (s + pos != NULL && (c_isalnum (s[pos]) || s[pos] == '_')) ++pos;
+  while (c_isalnum (s[pos]) || s[pos] == '_')
+    pos++;
 
   unsigned char decl_type_length = pos - origpos;
   char buf[decl_type_length + 1];
@@ -6440,9 +6449,9 @@ mercury_decl (char *s, size_t pos)
               so this is the hard case.  */
            if (strcmp (buf, "solver") == 0)
              {
-               ++pos;
-               while (s + pos != NULL && (c_isalnum (s[pos]) || s[pos] == '_'))
-                 ++pos;
+               do
+                 pos++;
+               while (c_isalnum (s[pos]) || s[pos] == '_');
 
                decl_type_length = pos - origpos;
                char buf2[decl_type_length + 1];
@@ -6492,7 +6501,6 @@ mercury_decl (char *s, size_t pos)
       while (c_isalnum (s[pos])
              || s[pos] == '_'
              || (s[pos] == '.' /* A module dot.  */
-                 && s + pos + 1 != NULL
                  && (c_isalnum (s[pos + 1]) || s[pos + 1] == '_')
                 && (module_dot_pos = pos)))  /* Record module dot position.
                                                 Erase module from name.  */
@@ -6536,10 +6544,10 @@ mercury_decl (char *s, size_t pos)
     }
   else if (is_mercury_quantifier && s[pos] == '[')   /* :- some [T] pred/func. 
 */
     {
-      for (++pos; s + pos != NULL && s[pos] != ']'; ++pos) {}
-      if (s + pos == NULL) return null_pos;
-      ++pos;
-      pos = skip_spaces (s + pos) - s;
+      char *close_bracket = strchr (s + pos + 1, ']');
+      if (!close_bracket)
+       return null_pos;
+      pos = skip_spaces (close_bracket + 1) - s;
       mercury_pos_t position = mercury_decl (s, pos);
       position.totlength += pos - origpos;
       return position;
@@ -7243,8 +7251,8 @@ readline_internal (linebuffer *lbp, FILE *stream, char 
const *filename)
        {
          /* We're at the end of linebuffer: expand it. */
          xrnew (buffer, lbp->size, 2);
+         p = buffer + lbp->size;
          lbp->size *= 2;
-         p += buffer - lbp->buffer;
          pend = buffer + lbp->size;
          lbp->buffer = buffer;
        }
@@ -7665,21 +7673,21 @@ relative_filename (char *file, char *dir)
 {
   char *fp, *dp, *afn, *res;
   ptrdiff_t i;
+  char *dir_last_slash UNINIT;
 
   /* Find the common root of file and dir (with a trailing slash). */
   afn = absolute_filename (file, cwd);
   fp = afn;
   dp = dir;
   while (*fp++ == *dp++)
-    continue;
-  fp--, dp--;                  /* back to the first differing char */
+    if (dp[-1] == '/')
+      dir_last_slash = dp - 1;
 #ifdef DOS_NT
-  if (fp == afn && afn[0] != '/') /* cannot build a relative name */
-    return afn;
+  if (fp - 1 == afn && afn[0] != '/')
+    return afn; /* Cannot build a relative name.  */
 #endif
-  do                           /* look at the equal chars until '/' */
-    fp--, dp--;
-  while (*fp != '/');
+  fp -= dp - dir_last_slash;
+  dp = dir_last_slash;
 
   /* Build a sequence of "../" strings for the resulting relative file name. */
   i = 0;
diff --git a/lib-src/make-docfile.c b/lib-src/make-docfile.c
index d2d4b1d277..908d73f525 100644
--- a/lib-src/make-docfile.c
+++ b/lib-src/make-docfile.c
@@ -1068,7 +1068,7 @@ scan_c_stream (FILE *infile)
                   attributes: attribute1 attribute2 ...)
               (Lisp_Object arg...)
 
-            Now only ’const’, ’noinline’ and 'noreturn' attributes
+            Now only `const', `noinline' and `noreturn' attributes
             are used.  */
 
          /* Advance to the end of docstring.  */
diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in
index bbb05fdba5..bf0df878a5 100644
--- a/lib/gnulib.mk.in
+++ b/lib/gnulib.mk.in
@@ -208,7 +208,6 @@ CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CRYPTOLIB = @CRYPTOLIB@
 CXX = @CXX@
-CXXCPP = @CXXCPP@
 CXXFLAGS = @CXXFLAGS@
 CYGWIN_OBJ = @CYGWIN_OBJ@
 C_SWITCH_MACHINE = @C_SWITCH_MACHINE@
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index fabf6ed55e..8728467977 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -59,15 +59,6 @@ BYTE_COMPILE_EXTRA_FLAGS =
 # BYTE_COMPILE_EXTRA_FLAGS = --eval '(setq byte-compile-warnings (quote (not 
unresolved)))'
 # The example above is just for developers, it should not be used by default.
 
-# Those automatically generated autoload files that need special rules
-# to build; i.e. not including things created via generated-autoload-file
-# (eg calc/calc-loaddefs.el).
-LOADDEFS = $(lisp)/calendar/cal-loaddefs.el \
-       $(lisp)/calendar/diary-loaddefs.el \
-       $(lisp)/calendar/hol-loaddefs.el \
-       $(lisp)/mh-e/mh-loaddefs.el \
-       $(lisp)/net/tramp-loaddefs.el
-
 # All generated autoload files.
 loaddefs = $(shell find ${srcdir} -name '*loaddefs.el' ! -name '.*')
 # Elisp files auto-generated.
@@ -84,10 +75,11 @@ compile-first: BYTE_COMPILE_FLAGS = \
 
 # Files to compile before others during a bootstrap.  This is done to
 # speed up the bootstrap process.  They're ordered by size, so we use
-# the slowest-compiler on the smallest file and move to larger files as the
-# compiler gets faster.  'autoload.elc' comes last because it is not used by
-# the compiler (so its compilation does not speed up subsequent compilations),
-# it's only placed here so as to speed up generation of the loaddefs.el file.
+# the slowest-compiler on the smallest file and move to larger files
+# as the compiler gets faster.  'loaddefs-gen.elc'/'radix-tree.el'
+# comes last because they're not used by the compiler (so its
+# compilation does not speed up subsequent compilations), it's only
+# placed here so as to speed up generation of the loaddefs.el files.
 
 COMPILE_FIRST = \
        $(lisp)/emacs-lisp/macroexp.elc \
@@ -98,11 +90,18 @@ ifeq ($(HAVE_NATIVE_COMP),yes)
 COMPILE_FIRST += $(lisp)/emacs-lisp/comp.elc
 COMPILE_FIRST += $(lisp)/emacs-lisp/comp-cstr.elc
 endif
-COMPILE_FIRST += $(lisp)/emacs-lisp/autoload.elc
+COMPILE_FIRST += $(lisp)/emacs-lisp/loaddefs-gen.elc
+COMPILE_FIRST += $(lisp)/emacs-lisp/radix-tree.elc
 
 # Files to compile early in compile-main.  Works around bug#25556.
+# Also compile the ja-dic file used to convert the Japanese dictionary
+# to speed things up.  The org files are used to convert org files to
+# texi files.
 MAIN_FIRST = ./emacs-lisp/eieio.el ./emacs-lisp/eieio-base.el \
-  ./cedet/semantic/db.el ./emacs-lisp/cconv.el
+  ./cedet/semantic/db.el ./emacs-lisp/cconv.el \
+  ./international/ja-dic-cnv.el \
+  ./org/ox.el ./org/ox-texinfo.el ./org/org-macro.el ./org/org-element.el \
+  ./org/oc.el ./org/ol.el ./emacs-lisp/cl-lib.el
 
 # Prevent any settings in the user environment causing problems.
 unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH
@@ -125,10 +124,12 @@ SUBDIRS_SUBDIRS = $(filter-out ${srcdir}/cedet% 
${srcdir}/leim%,${SUBDIRS})
 
 # cus-load and finder-inf are not explicitly requested by anything, so
 # we add them here to make sure they get built.
-all: compile-main $(lisp)/cus-load.el $(lisp)/finder-inf.el
+all: compile-main $(lisp)/cus-load.el $(lisp)/finder-inf.el generate-ja-dic \
+       org-manuals
 
 PHONY_EXTRAS =
-.PHONY: all custom-deps finder-data autoloads update-subdirs $(PHONY_EXTRAS)
+.PHONY: all custom-deps finder-data autoloads update-subdirs $(PHONY_EXTRAS) \
+       generate-ja-dic org-manuals
 
 # custom-deps and finder-data both used to scan _all_ the *.el files.
 # This could lead to problems in parallel builds if automatically
@@ -159,6 +160,14 @@ $(lisp)/finder-inf.el:
          --eval '(setq generated-finder-keywords-file (unmsys--file-name 
"$(srcdir)/finder-inf.el"))' \
          -f finder-compile-keywords-make-dist ${SUBDIRS_FINDER}
 
+# This is the OKURO-NASI compilation trigger.
+generate-ja-dic: main-first
+       $(AM_V_at)$(MAKE) -C ../leim generate-ja-dic EMACS="$(EMACS)"
+       $(AM_V_at)$(MAKE) compile-targets TARGETS="./leim/ja-dic/ja-dic.elc"
+
+org-manuals: main-first
+       $(AM_V_at)$(MAKE) -C ../doc/misc org.texi modus-themes.texi
+
 ## Comments on loaddefs generation:
 
 # loaddefs depends on gen-lisp for two reasons:
@@ -167,6 +176,9 @@ $(lisp)/finder-inf.el:
 # gets created before the final emacs is dumped.  Having leim
 # dependencies in ../src as well would create a parallel race condition.
 #
+# FIXME: 2) is no longer correct, so perhaps we could add unidata to
+# gen-lisp now?
+#
 # 2) Files that are marked no-update-autoloads still get recorded in loaddefs.
 # So those files should be generated before we make autoloads, if we
 # don't want a successive make autoloads to change the output file.
@@ -186,19 +198,13 @@ $(lisp)/finder-inf.el:
 # We make $(lisp)/loaddefs.el a dependency of .PHONY to cause Make to
 # ignore its time stamp.  That's because the real dependencies of
 # loaddefs.el aren't known to Make, they are implemented in
-# batch-update-autoloads, which only updates the autoloads whose
-# sources have changed.
-
-# Use expand-file-name rather than $abs_scrdir so that Emacs does not
-# get confused when it compares file-names for equality.
+# loaddefs-generate--emacs-batch.
 
 autoloads .PHONY: $(lisp)/loaddefs.el
-$(lisp)/loaddefs.el: gen-lisp $(LOADDEFS)
-       $(AM_V_GEN)$(emacs) -l autoload \
-           --eval '(setq autoload-ensure-writable t)' \
-           --eval '(setq autoload-builtin-package-versions t)' \
-           --eval '(setq generated-autoload-file (expand-file-name 
(unmsys--file-name "$@")))' \
-           -f batch-update-autoloads ${SUBDIRS_ALMOST}
+$(lisp)/loaddefs.el: gen-lisp $(LOADDEFS) $(lisp)/emacs-lisp/loaddefs-gen.elc
+       $(AM_V_GEN)$(emacs) \
+            -l $(lisp)/emacs-lisp/loaddefs-gen.elc \
+           -f loaddefs-generate--emacs-batch ${SUBDIRS_ALMOST}
 
 # autoloads only runs when loaddefs.el is nonexistent, although it
 # generates a number of different files. Provide a force option to enable
@@ -456,57 +462,6 @@ compile-one-process: $(LOADDEFS) compile-first
        $(emacs) $(BYTE_COMPILE_FLAGS) \
            --eval "(batch-byte-recompile-directory 0)" $(lisp)
 
-# Update MH-E internal autoloads. These are not to be confused with
-# the autoloads for the MH-E entry points, which are already in loaddefs.el.
-MH_E_DIR = $(lisp)/mh-e
-MH_E_SRC = $(sort $(wildcard ${MH_E_DIR}/mh*.el))
-MH_E_SRC := $(filter-out ${MH_E_DIR}/mh-loaddefs.el,${MH_E_SRC})
-
-.PHONY: mh-autoloads
-mh-autoloads: $(MH_E_DIR)/mh-loaddefs.el
-$(MH_E_DIR)/mh-loaddefs.el: $(MH_E_SRC)
-       $(AM_V_GEN)$(emacs) -l autoload \
-          --eval "(setq generate-autoload-cookie \";;;###mh-autoload\")" \
-          --eval "(setq generated-autoload-file (expand-file-name 
(unmsys--file-name \"$@\")))" \
-          -f batch-update-autoloads $(MH_E_DIR)
-
-# Update TRAMP internal autoloads. Maybe we could move tramp*.el into
-# an own subdirectory. OTOH, it does not hurt to keep them in
-# lisp/net.
-TRAMP_DIR = $(lisp)/net
-TRAMP_SRC = $(sort $(wildcard ${TRAMP_DIR}/tramp*.el))
-TRAMP_SRC := $(filter-out ${TRAMP_DIR}/tramp-loaddefs.el,${TRAMP_SRC})
-
-$(TRAMP_DIR)/tramp-loaddefs.el: $(TRAMP_SRC)
-       $(AM_V_GEN)$(emacs) -l autoload \
-          --eval "(setq generate-autoload-cookie \";;;###tramp-autoload\")" \
-          --eval "(setq generated-autoload-file (expand-file-name 
(unmsys--file-name \"$@\")))" \
-          -f batch-update-autoloads $(TRAMP_DIR)
-
-CAL_DIR = $(lisp)/calendar
-## Those files that may contain internal calendar autoload cookies.
-CAL_SRC = $(addprefix ${CAL_DIR}/,diary-lib.el holidays.el lunar.el solar.el)
-CAL_SRC := $(sort ${CAL_SRC} $(wildcard ${CAL_DIR}/cal-*.el))
-CAL_SRC := $(filter-out ${CAL_DIR}/cal-loaddefs.el,${CAL_SRC})
-
-$(CAL_DIR)/cal-loaddefs.el: $(CAL_SRC)
-       $(AM_V_GEN)$(emacs) -l autoload \
-          --eval "(setq generate-autoload-cookie \";;;###cal-autoload\")" \
-          --eval "(setq generated-autoload-file (expand-file-name 
(unmsys--file-name \"$@\")))" \
-          -f batch-update-autoloads $(CAL_DIR)
-
-$(CAL_DIR)/diary-loaddefs.el: $(CAL_SRC) $(CAL_DIR)/cal-loaddefs.el
-       $(AM_V_GEN)$(emacs) -l autoload \
-          --eval "(setq generate-autoload-cookie \";;;###diary-autoload\")" \
-          --eval "(setq generated-autoload-file (expand-file-name 
(unmsys--file-name \"$@\")))" \
-          -f batch-update-autoloads $(CAL_DIR)
-
-$(CAL_DIR)/hol-loaddefs.el: $(CAL_SRC) $(CAL_DIR)/diary-loaddefs.el
-       $(AM_V_GEN)$(emacs) -l autoload \
-          --eval "(setq generate-autoload-cookie \";;;###holiday-autoload\")" \
-          --eval "(setq generated-autoload-file (expand-file-name 
(unmsys--file-name \"$@\")))" \
-          -f batch-update-autoloads $(CAL_DIR)
-
 .PHONY: bootstrap-clean distclean maintainer-clean
 
 bootstrap-clean:
diff --git a/lisp/abbrev.el b/lisp/abbrev.el
index 214f7435d9..e875d77faa 100644
--- a/lisp/abbrev.el
+++ b/lisp/abbrev.el
@@ -42,12 +42,12 @@
 
 (defcustom abbrev-file-name
   (locate-user-emacs-file "abbrev_defs" ".abbrev_defs")
-  "Default name of file from which to read abbrevs."
+  "Default name of file from which to read and where to save abbrevs."
   :initialize 'custom-initialize-delay
   :type 'file)
 
 (defcustom only-global-abbrevs nil
-  "Non-nil means user plans to use global abbrevs only.
+  "Non-nil means user plans to use only global abbrevs.
 This makes the commands that normally define mode-specific abbrevs
 define global abbrevs instead."
   :type 'boolean
@@ -59,7 +59,8 @@ define global abbrevs instead."
 
 In Abbrev mode, inserting an abbreviation causes it to expand and
 be replaced by its expansion."
-  ;; It's defined in C, this stops the d-m-m macro defining it again.
+  ;; It's defined in C, this stops the 'define-minor-mode' macro from
+  ;; defining it again.
   :variable abbrev-mode)
 
 (put 'abbrev-mode 'safe-local-variable 'booleanp)
@@ -81,7 +82,8 @@ be replaced by its expansion."
 
 (defun copy-abbrev-table (table)
   "Make a new abbrev-table with the same abbrevs as TABLE.
-Does not copy property lists."
+This function does not copy property lists of the abbrevs.
+See `define-abbrev' for the documentation of abbrev properties."
   (let ((new-table (make-abbrev-table)))
     (obarray-map
      (lambda (symbol)
@@ -93,8 +95,8 @@ Does not copy property lists."
     new-table))
 
 (defun insert-abbrevs ()
-  "Insert after point a description of all defined abbrevs.
-Mark is set after the inserted text."
+  "Insert the description of all defined abbrevs after point.
+Set mark after the inserted text."
   (interactive)
   (push-mark
    (save-excursion
@@ -103,15 +105,15 @@ Mark is set after the inserted text."
      (point))))
 
 (defun list-abbrevs (&optional local)
-  "Display a list of defined abbrevs.
-If LOCAL is non-nil, interactively when invoked with a
-prefix arg, display only local, i.e. mode-specific, abbrevs.
-Otherwise display all abbrevs."
+  "Display a list of the defined abbrevs.
+If LOCAL is non-nil (interactively, when invoked with a
+prefix arg), display only local, i.e. mode-specific, abbrevs.
+Otherwise display all the abbrevs."
   (interactive "P")
   (display-buffer (prepare-abbrev-list-buffer local)))
 
 (defun abbrev-table-name (table)
-  "Value is the name of abbrev table TABLE."
+  "Return the name of the specified abbrev TABLE."
   (let ((tables abbrev-table-name-list)
        found)
     (while (and (not found) tables)
@@ -135,33 +137,33 @@ Otherwise display all abbrevs."
          (dolist (table (nreverse empty-tables))
            (insert-abbrev-table-description table t)))
         ;; Note: `list-abbrevs' can display only local abbrevs, in
-        ;; which case editing could lose abbrevs of other tables. Thus
-        ;; enter `edit-abbrevs-mode' only if LOCAL is nil.
+        ;; which case editing could lose abbrevs of other tables.
+        ;; Thus enter `edit-abbrevs-mode' only if LOCAL is nil.
         (edit-abbrevs-mode))
       (goto-char (point-min))
       (set-buffer-modified-p nil)
       (current-buffer))))
 
 (defun edit-abbrevs ()
-  "Alter abbrev definitions by editing a list of them.
-Selects a buffer containing a list of abbrev definitions with
-point located in the abbrev table for the current buffer, and
-turns on `edit-abbrevs-mode' in that buffer.
+  "Alter abbrev definitions by editing the list of abbrevs.
+This selects a buffer containing the list of abbrev definitions
+with point located in the abbrev table for the current buffer, and
+turns on `edit-abbrevs-mode' in the buffer with the list of abbrevs.
 
-You can edit them and type \\<edit-abbrevs-mode-map>\\[edit-abbrevs-redefine] \
+You can edit the abbrevs and type 
\\<edit-abbrevs-mode-map>\\[edit-abbrevs-redefine] \
 to redefine abbrevs
 according to your editing.
 
 The abbrevs editing buffer contains a header line for each
 abbrev table, which is the abbrev table name in parentheses.
 
-This is followed by one line per abbrev in that table:
+The header line is followed by one line per abbrev in that table:
 
     NAME   USECOUNT   EXPANSION   HOOK
 
 where NAME and EXPANSION are strings with quotes,
 USECOUNT is an integer, and HOOK is any valid function
-or may be omitted (it is usually omitted)."
+that may be omitted (it is usually omitted)."
   (interactive)
   (let ((table-name (abbrev-table-name local-abbrev-table)))
     (switch-to-buffer (prepare-abbrev-list-buffer))
@@ -182,8 +184,9 @@ or may be omitted (it is usually omitted)."
   "Define abbrevs according to current visible buffer contents.
 See documentation of `edit-abbrevs' for info on the format of the
 text you must have in the buffer.
-With argument, eliminate all abbrev definitions except
-the ones defined from the buffer now."
+If ARG is non-nil (interactively, when invoked with a prefix
+argument), eliminate all abbrev definitions except the ones
+defined by the current buffer contents."
   (interactive "P")
   (if arg (kill-all-abbrevs))
   (save-excursion
@@ -214,7 +217,8 @@ the ones defined from the buffer now."
   "Read abbrev definitions from file written with `write-abbrev-file'.
 Optional argument FILE is the name of the file to read;
 it defaults to the value of `abbrev-file-name'.
-Optional second argument QUIETLY non-nil means don't display a message."
+Optional second argument QUIETLY non-nil means don't display a message
+about loading the abbrevs."
   (interactive
    (list
     (read-file-name (format-prompt "Read abbrev file" abbrev-file-name)
@@ -223,22 +227,22 @@ Optional second argument QUIETLY non-nil means don't 
display a message."
   (setq abbrevs-changed nil))
 
 (defun quietly-read-abbrev-file (&optional file)
-  "Read abbrev definitions from file written with `write-abbrev-file'.
+  "Quietly read abbrev definitions from file written with `write-abbrev-file'.
 Optional argument FILE is the name of the file to read;
 it defaults to the value of `abbrev-file-name'.
-Does not display any message."
+Do not display any messages about loading the abbrevs."
                                        ;(interactive "fRead abbrev file: ")
   (read-abbrev-file file t))
 
 (defun write-abbrev-file (&optional file verbose)
   "Write all user-level abbrev definitions to a file of Lisp code.
 This does not include system abbrevs; it includes only the abbrev tables
-listed in listed in `abbrev-table-name-list'.
+listed in `abbrev-table-name-list'.
 The file written can be loaded in another session to define the same abbrevs.
-The argument FILE is the file name to write.  If omitted or nil, the file
-specified in `abbrev-file-name' is used.
-If VERBOSE is non-nil, display a message indicating where abbrevs
-have been saved."
+The argument FILE is the file name to write.  If omitted or nil, it defaults
+to the value of `abbrev-file-name'.
+If VERBOSE is non-nil, display a message indicating the file where the
+abbrevs have been saved."
   (interactive
    (list
     (read-file-name "Write abbrev file: "
@@ -251,10 +255,10 @@ have been saved."
       (dolist (table
               ;; We sort the table in order to ease the automatic
               ;; merging of different versions of the user's abbrevs
-              ;; file.  This is useful, for example, for when the
+              ;; file.  This is useful, for example, when the
               ;; user keeps their home directory in a revision
-              ;; control system, and is therefore keeping multiple
-              ;; slightly-differing copies loosely synchronized.
+              ;; control system, and therefore keeps multiple
+              ;; slightly-differing loosely synchronized copies.
               (sort (copy-sequence abbrev-table-name-list)
                     (lambda (s1 s2)
                       (string< (symbol-name s1)
@@ -268,7 +272,7 @@ have been saved."
       (write-region nil nil file nil (and (not verbose) 0)))))
 
 (defun abbrev-edit-save-to-file (file)
-  "Save all user-level abbrev definitions in current buffer to FILE."
+  "Save to FILE all the user-level abbrev definitions in current buffer."
   (interactive
    (list (read-file-name "Save abbrevs to file: "
                         (file-name-directory
@@ -279,7 +283,7 @@ have been saved."
   (write-abbrev-file file t))
 
 (defun abbrev-edit-save-buffer ()
-  "Save all user-level abbrev definitions in current buffer.
+  "Save all the user-level abbrev definitions in current buffer.
 The saved abbrevs are written to the file specified by
 `abbrev-file-name'."
   (interactive nil edit-abbrevs-mode)
@@ -287,15 +291,16 @@ The saved abbrevs are written to the file specified by
 
 
 (defun add-mode-abbrev (arg)
-  "Define mode-specific abbrev for last word(s) before point.
-Argument is how many words before point form the expansion;
-or zero means the region is the expansion.
-A negative argument means to undefine the specified abbrev.
-Reads the abbreviation in the minibuffer.
+  "Define a mode-specific abbrev whose expansion is the last word before point.
+Prefix argument ARG says how many words before point to use for the expansion;
+zero means the entire region is the expansion.
+A negative ARG means to undefine the specified abbrev.
+
+This command reads the abbreviation from the minibuffer.
 
 See also `inverse-add-mode-abbrev', which performs the opposite task:
-if the abbrev text is already in the buffer, use this command to
-define an abbrev by specifying the expansion in the minibuffer.
+if the abbreviation is already in the buffer, use that command to define
+a mode-specific abbrev by specifying its expansion in the minibuffer.
 
 Don't use this function in a Lisp program; use `define-abbrev' instead."
   (interactive "p")
@@ -307,15 +312,16 @@ Don't use this function in a Lisp program; use 
`define-abbrev' instead."
    "Mode" arg))
 
 (defun add-global-abbrev (arg)
-  "Define global (all modes) abbrev for last word(s) before point.
-The prefix argument specifies the number of words before point that form the
-expansion; or zero means the region is the expansion.
-A negative argument means to undefine the specified abbrev.
-This command uses the minibuffer to read the abbreviation.
+  "Define a global (all modes) abbrev whose expansion is last word before 
point.
+Prefix argument ARG says how many words before point to use for the expansion;
+zero means the entire region is the expansion.
+A negative ARG means to undefine the specified abbrev.
+
+This command reads the abbreviation from the minibuffer.
 
 See also `inverse-add-global-abbrev', which performs the opposite task:
-if the abbrev text is already in the buffer, use this command to
-define an abbrev by specifying the expansion in the minibuffer.
+if the abbreviation is already in the buffer, use that command to define
+a global abbrev by specifying its expansion in the minibuffer.
 
 Don't use this function in a Lisp program; use `define-abbrev' instead."
   (interactive "p")
@@ -329,25 +335,30 @@ Don't use this function in a Lisp program; use 
`define-abbrev' instead."
                     (save-excursion (forward-word (- arg)) (point))))))
        name)
     (setq name
-         (read-string (format (if exp "%s abbrev for \"%s\": "
+         (read-string (format (if exp "%s abbrev that expands into \"%s\": "
                                 "Undefine %s abbrev: ")
                               type exp)))
     (set-text-properties 0 (length name) nil name)
     (if (or (null exp)
            (not (abbrev-expansion name table))
-           (y-or-n-p (format "%s expands to \"%s\"; redefine? "
+           (y-or-n-p (format "%s expands into \"%s\"; redefine? "
                              name (abbrev-expansion name table))))
        (define-abbrev table (downcase name) exp))))
 
 (defun inverse-add-mode-abbrev (n)
-  "Define last word before point as a mode-specific abbrev.
-With prefix argument N, defines the Nth word before point.
-This command uses the minibuffer to read the expansion.
-Expands the abbreviation after defining it.
+  "Define the word before point as a mode-specific abbreviation.
+With prefix argument N, define the Nth word before point as the
+abbreviation.  Negative N means use the Nth word after point.
+
+If `only-global-abbrevs' is non-nil, this command defines a
+global (mode-independent) abbrev instead of a mode-specific one.
+
+This command reads the expansion from the minibuffer, defines the
+abbrev, and then expands the abbreviation in the current buffer.
 
 See also `add-mode-abbrev', which performs the opposite task:
-if the expansion is already in the buffer, use this command
-to define an abbrev by specifying the abbrev in the minibuffer."
+if the expansion is already in the buffer, use that command
+to define an abbrev by specifying the abbreviation in the minibuffer."
   (interactive "p")
   (inverse-add-abbrev
    (if only-global-abbrevs
@@ -357,14 +368,16 @@ to define an abbrev by specifying the abbrev in the 
minibuffer."
    "Mode" n))
 
 (defun inverse-add-global-abbrev (n)
-  "Define last word before point as a global (mode-independent) abbrev.
-With prefix argument N, defines the Nth word before point.
-This command uses the minibuffer to read the expansion.
-Expands the abbreviation after defining it.
+  "Define the word before point as a global (mode-independent) abbreviation.
+With prefix argument N, define the Nth word before point as the
+abbreviation.  Negative N means use the Nth word after point.
+
+This command reads the expansion from the minibuffer, defines the
+abbrev, and then expands the abbreviation in the current buffer.
 
 See also `add-global-abbrev', which performs the opposite task:
-if the expansion is already in the buffer, use this command
-to define an abbrev by specifying the abbrev in the minibuffer."
+if the expansion is already in the buffer, use that command
+to define an abbrev by specifying the abbreviation in the minibuffer."
   (interactive "p")
   (inverse-add-abbrev global-abbrev-table "Global" n))
 
@@ -378,10 +391,10 @@ to define an abbrev by specifying the abbrev in the 
minibuffer."
       (setq start (point)
            name (buffer-substring-no-properties start end)))
 
-    (setq exp (read-string (format "%s expansion for \"%s\": " type name)
+    (setq exp (read-string (format "Expansion for %s abbrev \"%s\": " type 
name)
                           nil nil nil t))
     (when (or (not (abbrev-expansion name table))
-             (y-or-n-p (format "%s expands to \"%s\"; redefine? "
+             (y-or-n-p (format "%s expands into \"%s\"; redefine? "
                                name (abbrev-expansion name table))))
       (define-abbrev table (downcase name) exp)
       (save-excursion
@@ -389,10 +402,11 @@ to define an abbrev by specifying the abbrev in the 
minibuffer."
        (expand-abbrev)))))
 
 (defun abbrev-prefix-mark (&optional arg)
-  "Mark current point as the beginning of an abbrev.
-The abbrev to be expanded starts here rather than at beginning of
-word.  This way, you can expand an abbrev with a prefix: insert
-the prefix, use this command, then insert the abbrev.
+  "Mark point as the beginning of an abbreviation.
+The abbrev to be expanded starts at point rather than at the
+beginning of a word.  This way, you can expand an abbrev with
+a prefix: insert the prefix, use this command, then insert the
+abbrev.
 
 This command inserts a hyphen after the prefix, and if the abbrev
 is subsequently expanded, this hyphen will be removed.
@@ -407,8 +421,8 @@ argument."
   (insert "-"))
 
 (defun expand-region-abbrevs (start end &optional noquery)
-  "For abbrev occurrence in the region, offer to expand it.
-The user is asked to type \\`y' or \\`n' for each occurrence.
+  "For each abbrev occurrence in the region, offer to expand it.
+Ask the user to type `y' or `n' for each occurrence.
 A prefix argument means don't query; expand all abbrevs."
   (interactive "r\nP")
   (save-excursion
@@ -429,18 +443,19 @@ A prefix argument means don't query; expand all abbrevs."
 ;;; Abbrev properties.
 
 (defun abbrev-table-get (table prop)
-  "Get the PROP property of abbrev table TABLE."
+  "Get the property PROP of abbrev table TABLE."
   (let ((sym (obarray-get table "")))
     (if sym (get sym prop))))
 
 (defun abbrev-table-put (table prop val)
-  "Set the PROP property of abbrev table TABLE to VAL."
+  "Set the property PROP of abbrev table TABLE to VAL."
   (let ((sym (obarray-put table "")))
     (set sym nil)           ; Make sure it won't be confused for an abbrev.
     (put sym prop val)))
 
 (defalias 'abbrev-get 'get
   "Get the property PROP of abbrev ABBREV
+See `define-abbrev' for the effect of some special properties.
 
 \(fn ABBREV PROP)")
 
@@ -500,7 +515,8 @@ for any particular abbrev defined in both.")
 (defvar abbrev-minor-mode-table-alist nil
   "Alist of abbrev tables to use for minor modes.
 Each element looks like (VARIABLE . ABBREV-TABLE);
-ABBREV-TABLE is active whenever VARIABLE's value is non-nil.
+ABBREV-TABLE is active whenever VARIABLE's value is non-nil;
+VARIABLE is supposed to be a minor-mode variable.
 ABBREV-TABLE can also be a list of abbrev tables.")
 
 (defvar fundamental-mode-abbrev-table
@@ -511,11 +527,11 @@ ABBREV-TABLE can also be a list of abbrev tables.")
   "The abbrev table of mode-specific abbrevs for Fundamental Mode.")
 
 (defvar abbrevs-changed nil
-  "Set non-nil by defining or altering any word abbrevs.
+  "Non-nil if any word abbrevs were defined or altered.
 This causes `save-some-buffers' to offer to save the abbrevs.")
 
 (defcustom abbrev-all-caps nil
-  "Non-nil means expand multi-word abbrevs all caps if abbrev was so."
+  "Non-nil means expand multi-word abbrevs in all caps if the abbrev was so."
   :type 'boolean
   :group 'abbrev-mode)
 
@@ -532,17 +548,17 @@ Trying to expand an abbrev in any other buffer clears 
`abbrev-start-location'.")
   "The abbrev-symbol of the last abbrev expanded.  See `abbrev-symbol'.")
 
 (defvar last-abbrev-text nil
-  "The exact text of the last abbrev expanded.
+  "The exact text of the last abbrev that was expanded.
 It is nil if the abbrev has already been unexpanded.")
 
 (defvar last-abbrev-location 0
-  "The location of the start of the last abbrev expanded.")
+  "The location of the start of the last abbrev that was expanded.")
 
 ;; (defvar-local local-abbrev-table fundamental-mode-abbrev-table
 ;;   "Local (mode-specific) abbrev table of current buffer.")
 
 (defun clear-abbrev-table (table)
-  "Undefine all abbrevs in abbrev table TABLE, leaving it empty."
+  "Undefine all abbrevs in abbrev table TABLE, leaving TABLE empty."
   (setq abbrevs-changed t)
   (let* ((sym (obarray-get table "")))
     (dotimes (i (length table))
@@ -557,9 +573,9 @@ It is nil if the abbrev has already been unexpanded.")
   ;; For backward compatibility, always return nil.
   nil)
 
-(defun define-abbrev (table name expansion &optional hook &rest props)
-  "Define an abbrev in TABLE named NAME, to expand to EXPANSION and call HOOK.
-NAME must be a string, and should be lower-case.
+(defun define-abbrev (table abbrev expansion &optional hook &rest props)
+  "Define ABBREV in TABLE, to expand into EXPANSION and optionally call HOOK.
+ABBREV must be a string, and should be lower-case.
 EXPANSION should usually be a string.
 To undefine an abbrev, define it with EXPANSION = nil.
 If HOOK is non-nil, it should be a function of no arguments;
@@ -583,8 +599,8 @@ PROPS is a property list.  The following properties are 
special:
   overwrite a non-system abbreviation of the same name.
 - `:case-fixed': non-nil means that abbreviations are looked up without
   case-folding, and the expansion is not capitalized/upcased.
-- `:enable-function': a function of no argument which returns non-nil if the
-  abbrev should be used for a particular call of `expand-abbrev'.
+- `:enable-function': a function of no arguments which returns non-nil
+  if the abbrev should be used for a particular call of `expand-abbrev'.
 
 An obsolete but still supported calling form is:
 
@@ -599,7 +615,7 @@ An obsolete but still supported calling form is:
   (setq props (plist-put props :abbrev-table-modiff
                          (abbrev-table-get table :abbrev-table-modiff)))
   (let ((system-flag (plist-get props :system))
-        (sym (obarray-put table name)))
+        (sym (obarray-put table abbrev)))
     ;; Don't override a prior user-defined abbrev with a system abbrev,
     ;; unless system-flag is `force'.
     (unless (and (not (memq system-flag '(nil force)))
@@ -619,7 +635,7 @@ An obsolete but still supported calling form is:
                 (if (eq 'force system-flag) (plist-put props :system t) props))
       (abbrev-table-put table :abbrev-table-modiff
                         (1+ (abbrev-table-get table :abbrev-table-modiff))))
-    name))
+    abbrev))
 
 (defun abbrev--check-chars (abbrev global)
   "Check if the characters in ABBREV have word syntax in either the
@@ -639,7 +655,7 @@ current (if global is nil) or standard syntax table."
                (if global "in the standard syntax" "in this mode"))))))
 
 (defun define-global-abbrev (abbrev expansion)
-  "Define ABBREV as a global abbreviation for EXPANSION.
+  "Define ABBREV as a global abbreviation that expands into EXPANSION.
 The characters in ABBREV must all be word constituents in the standard
 syntax table."
   (interactive "sDefine global abbrev: \nsExpansion for %s: ")
@@ -647,7 +663,7 @@ syntax table."
   (define-abbrev global-abbrev-table (downcase abbrev) expansion))
 
 (defun define-mode-abbrev (abbrev expansion)
-  "Define ABBREV as a mode-specific abbreviation for EXPANSION.
+  "Define ABBREV as a mode-specific abbreviation that expands into EXPANSION.
 The characters in ABBREV must all be word-constituents in the current mode."
   (interactive "sDefine mode abbrev: \nsExpansion for %s: ")
   (unless local-abbrev-table
@@ -656,8 +672,8 @@ The characters in ABBREV must all be word-constituents in 
the current mode."
   (define-abbrev local-abbrev-table (downcase abbrev) expansion))
 
 (defun abbrev--active-tables (&optional tables)
-  "Return the list of abbrev tables currently active.
-TABLES if non-nil overrides the usual rules.  It can hold
+  "Return the list of abbrev tables that are currently active.
+TABLES, if non-nil, overrides the usual rules.  It can hold
 either a single abbrev table or a list of abbrev tables."
   ;; We could just remove the `tables' arg and let callers use
   ;; (or table (abbrev--active-tables)) but then they'd have to be careful
@@ -683,7 +699,7 @@ either a single abbrev table or a list of abbrev tables."
   "Return the symbol representing abbrev named ABBREV in TABLE.
 This symbol's name is ABBREV, but it is not the canonical symbol of that name;
 it is interned in the abbrev-table TABLE rather than the normal obarray.
-The value is nil if that abbrev is not defined."
+The value is nil if such an abbrev is not defined."
   (let* ((case-fold (not (abbrev-table-get table :case-fixed)))
          ;; In case the table doesn't set :case-fixed but some of the
          ;; abbrevs do, we have to be careful.
@@ -700,11 +716,11 @@ The value is nil if that abbrev is not defined."
         sym)))
 
 (defun abbrev-symbol (abbrev &optional table)
-  "Return the symbol representing abbrev named ABBREV.
+  "Return the symbol representing the abbrev named ABBREV in TABLE.
 This symbol's name is ABBREV, but it is not the canonical symbol of that name;
 it is interned in an abbrev-table rather than the normal obarray.
-The value is nil if that abbrev is not defined.
-Optional second arg TABLE is abbrev table to look it up in.
+The value is nil if such an abbrev is not defined.
+Optional second arg TABLE is the abbrev table to look it up in.
 The default is to try buffer's mode-specific abbrev table, then global table."
   (let ((tables (abbrev--active-tables table))
         sym)
@@ -717,7 +733,7 @@ The default is to try buffer's mode-specific abbrev table, 
then global table."
 
 (defun abbrev-expansion (abbrev &optional table)
   "Return the string that ABBREV expands into in the current buffer.
-Optionally specify an abbrev table as second arg;
+Optionally specify an abbrev TABLE as second arg;
 then ABBREV is looked up in that table only."
   (symbol-value (abbrev-symbol abbrev table)))
 
@@ -781,9 +797,9 @@ then ABBREV is looked up in that table only."
 (defun abbrev-insert (abbrev &optional name wordstart wordend)
   "Insert abbrev ABBREV at point.
 If non-nil, NAME is the name by which this abbrev was found.
-If non-nil, WORDSTART is the place where to insert the abbrev.
-If WORDEND is non-nil, the abbrev replaces the previous text between
-WORDSTART and WORDEND.
+If non-nil, WORDSTART is the buffer position where to insert the abbrev.
+If WORDEND is non-nil, it is a buffer position; the abbrev replaces the
+previous text between WORDSTART and WORDEND.
 Return ABBREV if the expansion should be considered as having taken place.
 The return value can be influenced by a `no-self-insert' property;
 see `define-abbrev' for details."
@@ -848,7 +864,8 @@ see `define-abbrev' for details."
 
 (defvar abbrev-expand-function #'abbrev--default-expand
   "Function that `expand-abbrev' uses to perform abbrev expansion.
-Takes no argument and should return the abbrev symbol if expansion took 
place.")
+Takes no arguments, and should return the abbrev symbol if expansion
+took place.")
 
 (defcustom abbrev-suggest nil
   "Non-nil means suggest using abbrevs to save typing.
@@ -907,15 +924,17 @@ Expansion is a string of one or more words."
 
 (defun abbrev--suggest-above-threshold (expansion)
   "Return non-nil if the abbrev in EXPANSION provides significant savings.
-A significant saving, here, is the difference in length between
-the abbrev and the abbrev expansion.  EXPANSION is a cons cell
-where the car is the expansion and the cdr is the abbrev."
+A significant saving, here, means the difference in length between
+the abbrev and its expansion is not below the threshold specified
+by the value of `abbrev-suggest-hint-threshold'.
+EXPANSION is a cons cell where the car is the expansion and the cdr is
+the abbrev."
     (>= (- (length (car expansion))
           (length (cdr expansion)))
        abbrev-suggest-hint-threshold))
 
 (defvar abbrev--suggest-saved-recommendations nil
-    "Keeps a list of expansions that have abbrevs defined.
+    "Keeps the list of expansions that have abbrevs defined.
 The user can show this list by calling
 `abbrev-suggest-show-report'.")
 
@@ -931,7 +950,7 @@ EXPANSION is a cons cell where the `car' is the expansion 
and the
     (push expansion abbrev--suggest-saved-recommendations))
 
 (defun abbrev--suggest-shortest-abbrev (new current)
-    "Return the shortest abbrev of NEW and CURRENT.
+    "Return the shortest of the two abbrevs given by NEW and CURRENT.
 NEW and CURRENT are cons cells where the `car' is the expansion
 and the `cdr' is the abbrev."
     (if (not current)
@@ -960,8 +979,8 @@ informed about the existing abbrev."
 
 (defun abbrev--suggest-get-totals ()
     "Return a list of all expansions and how many times they were used.
-Each expansion is a cons cell where the `car' is the expansion
-and the `cdr' is the number of times the expansion has been
+Each expansion in the returned list is a cons cell where the `car' is the
+expansion text and the `cdr' is the number of times the expansion has been
 typed."
     (let (total cell)
       (dolist (expansion abbrev--suggest-saved-recommendations)
@@ -1089,11 +1108,11 @@ Presumes that `standard-output' points to 
`current-buffer'."
 (defun insert-abbrev-table-description (name &optional readable)
   "Insert before point a full description of abbrev table named NAME.
 NAME is a symbol whose value is an abbrev table.
-If optional 2nd arg READABLE is non-nil, a human-readable description
-is inserted.
+If optional 2nd arg READABLE is non-nil, insert a human-readable
+description.
 
-If READABLE is nil, an expression is inserted.  The expression is
-a call to `define-abbrev-table' that when evaluated will define
+If READABLE is nil, insert an expression.  The expression is
+a call to `define-abbrev-table' that, when evaluated, will define
 the abbrev table NAME exactly as it is currently defined.
 Abbrevs marked as \"system abbrevs\" are ignored."
   (let ((symbols (abbrev--table-symbols name readable)))
@@ -1140,10 +1159,10 @@ Properties with special meaning:
   case-folding, and the expansion is not capitalized/upcased.
 - `:regexp' is a regular expression that specifies how to extract the
   name of the abbrev before point.  The submatch 1 is treated
-  as the potential name of an abbrev.  If :regexp is nil, the default
+  as the potential name of an abbrev.  If `:regexp' is nil, the default
   behavior uses `backward-word' and `forward-word' to extract the name
-  of the abbrev, which can therefore only be a single word.
-- `:enable-function' can be set to a function of no argument which returns
+  of the abbrev, which can therefore by default only be a single word.
+- `:enable-function' can be set to a function of no arguments which returns
   non-nil if and only if the abbrevs in this table should be used for this
   instance of `expand-abbrev'."
   (declare (doc-string 3) (indent defun))
@@ -1172,7 +1191,7 @@ Properties with special meaning:
 
 (defun abbrev-table-menu (table &optional prompt sortfun)
   "Return a menu that shows all abbrevs in TABLE.
-Selecting an entry runs `abbrev-insert'.
+Selecting an entry runs `abbrev-insert' for that entry's abbrev.
 PROMPT is the prompt to use for the keymap.
 SORTFUN is passed to `sort' to change the default ordering."
   (unless sortfun (setq sortfun 'string-lessp))
@@ -1197,6 +1216,28 @@ This mode is for editing abbrevs in a buffer prepared by 
`edit-abbrevs',
 which see."
   :interactive nil)
 
+(defun abbrev--possibly-save (query &optional arg)
+  ;; Query mode.
+  (if (eq query 'query)
+      (and save-abbrevs abbrevs-changed)
+    ;; Maybe save abbrevs, and record whether we either saved them or
+    ;; asked to.
+    (and save-abbrevs
+         abbrevs-changed
+         (progn
+          (if (or arg
+                  (eq save-abbrevs 'silently)
+                  (y-or-n-p (format "Save abbrevs in %s? " abbrev-file-name)))
+              (progn
+                 (write-abbrev-file nil)
+                 nil)
+            ;; Don't keep bothering user if they say no.
+            (setq abbrevs-changed nil)
+             ;; Inhibit message in `save-some-buffers'.
+            t)))))
+
+(add-hook 'save-some-buffers-functions #'abbrev--possibly-save)
+
 (provide 'abbrev)
 
 ;;; abbrev.el ends here
diff --git a/lisp/ansi-color.el b/lisp/ansi-color.el
index b273e1f634..d5db9ecfed 100644
--- a/lisp/ansi-color.el
+++ b/lisp/ansi-color.el
@@ -234,7 +234,7 @@ This vector holds the faces used for SGR control sequence 
parameters 0
 to 7.
 
 This variable is obsolete.  To customize the display of faces used by
-ansi-color, change 'ansi-color-FACE', e.g. `ansi-color-bold'.  To
+ansi-color, change `ansi-color-FACE', e.g. `ansi-color-bold'.  To
 customize the actual faces used (e.g. to temporarily display SGR
 control sequences differently), use `ansi-color-basic-faces-vector'."
   :type '(vector face face face face face face face face)
@@ -249,7 +249,7 @@ This vector holds the colors used for SGR control sequence 
parameters
 30 to 37 (foreground colors) and 40 to 47 (background colors).
 
 This variable is obsolete.  To customize the display of colors used by
-ansi-color, change 'ansi-color-COLOR', e.g. `ansi-color-red'.  To
+ansi-color, change `ansi-color-COLOR', e.g. `ansi-color-red'.  To
 customize the actual faces used (e.g. to temporarily display SGR
 control sequences differently), use `ansi-color-normal-colors-vector'."
   :type '(vector (choice color (cons color color))
diff --git a/lisp/apropos.el b/lisp/apropos.el
index 79c4df10d2..0b84f9fa63 100644
--- a/lisp/apropos.el
+++ b/lisp/apropos.el
@@ -518,7 +518,7 @@ variables, not just user options."
                      (if (or current-prefix-arg apropos-do-all)
                          "variable" "user option"))
                      current-prefix-arg))
-  (apropos-command pattern nil
+  (apropos-command pattern (or do-all apropos-do-all)
                   (if (or do-all apropos-do-all)
                        (lambda (symbol)
                          (and (boundp symbol)
@@ -874,7 +874,7 @@ Optional arg BUFFER (default: current buffer) is the buffer 
to check."
                             apropos-all-words apropos-accumulator))
          (setq var  (apropos-value-internal #'local-variable-if-set-p symb
                                             #'symbol-value)))
-       (when (and (fboundp 'apropos-false-hit-str)  (apropos-false-hit-str 
var))
+       (when (apropos-false-hit-str var)
          (setq var nil))
        (when var
          (setq apropos-accumulator (cons (list symb (apropos-score-str var) 
nil var)
@@ -1055,7 +1055,13 @@ non-nil."
       (setq sepa (goto-char sepb)))))
 
 (defun apropos-documentation-check-elc-file (file)
-  (if (member file apropos-files-scanned)
+  ;; .elc files have the location of the file specified as #$, but for
+  ;; built-in files, that's a relative name (while for the rest, it's
+  ;; absolute).  So expand the name in the former case.
+  (unless (file-name-absolute-p file)
+    (setq file (expand-file-name file lisp-directory)))
+  (if (or (member file apropos-files-scanned)
+          (not (file-exists-p file)))
       nil
     (let (symbol doc beg end this-is-a-variable)
       (setq apropos-files-scanned (cons file apropos-files-scanned))
@@ -1247,6 +1253,19 @@ as a heading."
                                 'apropos-user-option
                               'apropos-variable)
                             (not nosubst))
+          ;; Insert an excerpt of variable values.
+          (when (boundp symbol)
+            (insert "  Value: ")
+            (let* ((print-escape-newlines t)
+                   (value (prin1-to-string (symbol-value symbol)))
+                   (truncated (truncate-string-to-width
+                               value (- (window-width) 20) nil nil t)))
+              (insert truncated)
+              (unless (equal value truncated)
+                (buttonize-region (1- (point)) (point)
+                                  (lambda (_)
+                                    (message "Value: %s" value))))
+              (insert "\n")))
          (apropos-print-doc 7 'apropos-group t)
          (apropos-print-doc 6 'apropos-face t)
          (apropos-print-doc 5 'apropos-widget t)
@@ -1262,12 +1281,13 @@ as a heading."
   (let ((doc (nth i apropos-item)))
     (when (stringp doc)
       (if apropos-compact-layout
-         (insert (propertize "\t" 'display '(space :align-to 32)) " ")
-       (insert "  "))
+          (insert (propertize "\t" 'display '(space :align-to 32)))
+        (insert " "))
       (if apropos-multi-type
          (let ((button-face (button-type-get type 'face)))
            (unless (consp button-face)
              (setq button-face (list button-face)))
+            (insert " ")
            (insert-text-button
             (if apropos-compact-layout
                 (format "<%s>" (button-type-get type 'apropos-short-label))
diff --git a/lisp/array.el b/lisp/array.el
index 31cf9cf302..08c5ff45dd 100644
--- a/lisp/array.el
+++ b/lisp/array.el
@@ -767,29 +767,27 @@ Return COLUMN."
 
 ;;; Array mode.
 
-(defvar array-mode-map
-  (let ((map (make-keymap)))
-    (define-key map "\M-ad"   #'array-display-local-variables)
-    (define-key map "\M-am"   #'array-make-template)
-    (define-key map "\M-ae"   #'array-expand-rows)
-    (define-key map "\M-ar"   #'array-reconfigure-rows)
-    (define-key map "\M-a="   #'array-what-position)
-    (define-key map "\M-ag"   #'array-goto-cell)
-    (define-key map "\M-af"   #'array-fill-rectangle)
-    (define-key map "\C-n"    #'array-next-row)
-    (define-key map "\C-p"    #'array-previous-row)
-    (define-key map "\C-f"    #'array-forward-column)
-    (define-key map "\C-b"    #'array-backward-column)
-    (define-key map "\M-n"    #'array-copy-down)
-    (define-key map "\M-p"    #'array-copy-up)
-    (define-key map "\M-f"    #'array-copy-forward)
-    (define-key map "\M-b"    #'array-copy-backward)
-    (define-key map "\M-\C-n" #'array-copy-row-down)
-    (define-key map "\M-\C-p" #'array-copy-row-up)
-    (define-key map "\M-\C-f" #'array-copy-column-forward)
-    (define-key map "\M-\C-b" #'array-copy-column-backward)
-    map)
-  "Keymap used in array mode.")
+(defvar-keymap array-mode-map
+  :doc "Keymap used in array mode."
+  "M-a d"  #'array-display-local-variables
+  "M-a m"  #'array-make-template
+  "M-a e"  #'array-expand-rows
+  "M-a r"  #'array-reconfigure-rows
+  "M-a ="  #'array-what-position
+  "M-a g"  #'array-goto-cell
+  "M-a f"  #'array-fill-rectangle
+  "C-n"    #'array-next-row
+  "C-p"    #'array-previous-row
+  "C-f"    #'array-forward-column
+  "C-b"    #'array-backward-column
+  "M-n"    #'array-copy-down
+  "M-p"    #'array-copy-up
+  "M-f"    #'array-copy-forward
+  "M-b"    #'array-copy-backward
+  "C-M-n"  #'array-copy-row-down
+  "C-M-p"  #'array-copy-row-up
+  "C-M-f"  #'array-copy-column-forward
+  "C-M-b"  #'array-copy-column-backward)
 
 
 (put 'array-mode 'mode-class 'special)
diff --git a/lisp/autoinsert.el b/lisp/autoinsert.el
index d25275e3ec..c12c554498 100644
--- a/lisp/autoinsert.el
+++ b/lisp/autoinsert.el
@@ -89,7 +89,7 @@ If this contains a %s, that will be replaced by the matching 
rule."
   :type 'string
   :version "28.1")
 
-(declare-function sgml-tag "sgml-mode" (&optional str arg))
+(declare-function sgml-tag "textmodes/sgml-mode" (&optional str arg))
 
 (defcustom auto-insert-alist
   `((("\\.\\([Hh]\\|hh\\|hpp\\|hxx\\|h\\+\\+\\)\\'" . "C / C++ header")
diff --git a/lisp/avoid.el b/lisp/avoid.el
index b53d84d2e8..2e77c8feff 100644
--- a/lisp/avoid.el
+++ b/lisp/avoid.el
@@ -293,6 +293,8 @@ accumulated, and tries to keep it close to zero."
       (mouse-avoidance-set-mouse-position (cons (+ (car (cdr cur)) deltax)
                                                (+ (cdr (cdr cur)) deltay))))))
 
+(defvar x-pointer-invisible) ; silence byte-compiler
+
 (defun mouse-avoidance-random-shape ()
   "Return a random cursor shape.
 This assumes that any variable whose name begins with x-pointer- and
@@ -300,12 +302,14 @@ has an integer value is a valid cursor shape.  You might 
want to
 redefine this function to suit your own tastes."
   (if (null mouse-avoidance-pointer-shapes)
       (progn
-       (setq mouse-avoidance-pointer-shapes
-             (mapcar (lambda (x) (symbol-value (intern x)))
-                     (all-completions "x-pointer-" obarray
-                                      (lambda (x)
-                                         (and (boundp x)
-                                               (integerp (symbol-value 
x)))))))))
+       (dolist (i (all-completions "x-pointer-" obarray
+                                   (lambda (x)
+                                     (and (boundp x)
+                                           (integerp (symbol-value x))))))
+          (ignore-errors
+            (let ((value (symbol-value (intern i))))
+              (when (< value x-pointer-invisible)
+                (push value mouse-avoidance-pointer-shapes)))))))
   (seq-random-elt mouse-avoidance-pointer-shapes))
 
 (defun mouse-avoidance-ignore-p ()
@@ -317,7 +321,8 @@ redefine this function to suit your own tastes."
        (not (eq (car mp) (selected-frame)))
         ;; Don't interfere with ongoing `mouse-drag-and-drop-region'
         ;; (Bug#36269).
-        (eq track-mouse 'dropping)
+        (or (eq track-mouse 'dropping)
+            (eq track-mouse 'drag-source))
        ;; Don't do anything if last event was a mouse event.
        ;; FIXME: this code fails in the case where the mouse was moved
        ;; since the last key-press but without generating any event.
diff --git a/lisp/battery.el b/lisp/battery.el
index b7b81a11a1..3cff3167a6 100644
--- a/lisp/battery.el
+++ b/lisp/battery.el
@@ -232,6 +232,40 @@ The text being displayed in the echo area is controlled by 
the variables
                                    (funcall battery-status-function))
                  "Battery status not available")))
 
+(defcustom battery-update-functions nil
+  "Functions run by `display-battery-mode' after updating the status.
+These functions will be called with one parameter, an alist that
+contains data about the current battery status.  The keys in the
+alist are single characters and the values are strings.
+Different battery backends deliver different information, so some
+of the following information may or may not be available:
+
+    v: driver-version
+    V: bios-version
+    I: bios-interface
+    L: line-status
+    B: battery-status
+    b: battery-status-symbol
+    p: load-percentage
+    s: seconds
+    m: minutes
+    h: hours
+    t: remaining-time
+
+For instance, to play an alarm when the battery power dips below
+10%, you could use a function like the following:
+
+(defvar my-prev-battery nil)
+(defun my-battery-alarm (data)
+  (when (and my-prev-battery
+             (equal (alist-get ?L data) \"off-line\")
+             (< (string-to-number (alist-get ?p data)) 10)
+             (>= (string-to-number (alist-get ?p my-prev-battery)) 10))
+    (play-sound-file \"~/alarm.wav\" 5))
+  (setq my-prev-battery data))"
+  :version "29.1"
+  :type '(repeat function))
+
 ;;;###autoload
 (define-minor-mode display-battery-mode
   "Toggle battery status display in mode line (Display Battery mode).
@@ -239,7 +273,11 @@ The text being displayed in the echo area is controlled by 
the variables
 The text displayed in the mode line is controlled by
 `battery-mode-line-format' and `battery-status-function'.
 The mode line is be updated every `battery-update-interval'
-seconds."
+seconds.
+
+The function which updates the mode-line display will call the
+functions in `battery-update-functions', which can be used to
+trigger actions based on battery-related events."
   :global t
   (setq battery-mode-line-string "")
   (or global-mode-string (setq global-mode-string '("")))
@@ -279,7 +317,8 @@ seconds."
             ((< percentage battery-load-low)
              (add-face-text-property 0 len 'battery-load-low t res)))
       (put-text-property 0 len 'help-echo "Battery status information" res))
-    (setq battery-mode-line-string (or res "")))
+    (setq battery-mode-line-string (or res ""))
+    (run-hook-with-args 'battery-update-functions data))
   (force-mode-line-update t))
 
 
diff --git a/lisp/bindings.el b/lisp/bindings.el
index bfe5ba8623..ed1325e326 100644
--- a/lisp/bindings.el
+++ b/lisp/bindings.el
@@ -990,7 +990,7 @@ if `inhibit-field-text-motion' is non-nil."
 (define-key esc-map "\\" 'delete-horizontal-space)
 (define-key esc-map "m" 'back-to-indentation)
 (define-key ctl-x-map "\C-o" 'delete-blank-lines)
-(define-key esc-map " " 'just-one-space)
+(define-key esc-map " " 'cycle-spacing)
 (define-key esc-map "z" 'zap-to-char)
 (define-key esc-map "=" 'count-words-region)
 (define-key ctl-x-map "=" 'what-cursor-position)
diff --git a/lisp/bookmark.el b/lisp/bookmark.el
index c604395dd7..b0b54e52d8 100644
--- a/lisp/bookmark.el
+++ b/lisp/bookmark.el
@@ -115,10 +115,18 @@ just use the value of `version-control'."
 
 
 (defcustom bookmark-sort-flag t
-  "Non-nil means that bookmarks will be displayed sorted by bookmark name.
-Otherwise they will be displayed in LIFO order (that is, most
-recently set ones come first, oldest ones come last)."
-  :type 'boolean)
+  "This controls the bookmark display sorting.
+nil means they will be displayed in LIFO order (that is, most
+recently created ones come first, oldest ones come last).
+
+`last-modified' means that bookmarks will be displayed sorted
+from most recently modified to least recently modified.
+
+Other values means that bookmarks will be displayed sorted by
+bookmark name."
+  :type '(choice (const :tag "By name" t)
+                 (const :tag "By modified time" last-modified)
+                 (const :tag "By creation time" nil)))
 
 
 (defcustom bookmark-menu-confirm-deletion nil
@@ -460,6 +468,17 @@ In other words, return all information but the name."
   "Return the handler function for BOOKMARK-NAME-OR-RECORD, or nil if none."
   (bookmark-prop-get bookmark-name-or-record 'handler))
 
+
+(defun bookmark-get-last-modified (bookmark-name-or-record)
+  "Return the last-modified for BOOKMARK-NAME-OR-RECORD, or nil if none."
+  (bookmark-prop-get bookmark-name-or-record 'last-modified))
+
+
+(defun bookmark-update-last-modified (bookmark-name-or-record)
+  "Update the last-modified date of BOOKMARK-NAME-OR-RECORD to the current 
time."
+  (bookmark-prop-set bookmark-name-or-record 'last-modified (current-time)))
+
+
 (defvar bookmark-history nil
   "The history list for bookmark functions.")
 
@@ -497,6 +516,24 @@ See user option `bookmark-set-fringe'."
               (when (eq 'bookmark (overlay-get temp 'category))
                 (delete-overlay (setq found temp))))))))))
 
+(defun bookmark-maybe-sort-alist ()
+  "Return `bookmark-alist' for display.
+If `bookmark-sort-flag' is T, then return a sorted by name copy of the alist.
+If `bookmark-sort-flag' is LAST-MODIFIED, then return a sorted by last modified
+copy of the alist.  Otherwise, just return `bookmark-alist', which by default
+is ordered from most recently created to least recently created bookmark."
+  (let ((copy (copy-alist bookmark-alist)))
+    (cond ((eq bookmark-sort-flag t)
+           (sort copy (lambda (x y) (string-lessp (car x) (car y)))))
+          ((eq bookmark-sort-flag 'last-modified)
+           (sort copy (lambda (x y)
+                        (let ((tx (bookmark-get-last-modified x))
+                              (ty (bookmark-get-last-modified y)))
+                          (cond ((null tx) nil)
+                                ((null ty) t)
+                                (t (time-less-p ty tx)))))))
+          (t copy))))
+
 (defun bookmark-completing-read (prompt &optional default)
   "Prompting with PROMPT, read a bookmark name in completion.
 PROMPT will get a \": \" stuck on the end no matter what, so you
@@ -506,10 +543,8 @@ If DEFAULT is nil then return empty string for empty 
input."
   (bookmark-maybe-load-default-file) ; paranoia
   (if (listp last-nonmenu-event)
       (bookmark-menu-popup-paned-menu t prompt
-                                     (if bookmark-sort-flag
-                                         (sort (bookmark-all-names)
-                                               'string-lessp)
-                                       (bookmark-all-names)))
+                                      (mapcar 'bookmark-name-from-full-record
+                                              (bookmark-maybe-sort-alist)))
     (let* ((completion-ignore-case bookmark-completion-ignore-case)
            (default (unless (equal "" default) default)))
       (completing-read (format-prompt prompt default)
@@ -630,7 +665,8 @@ If POSN is non-nil, record POSN as the point instead of 
`(point)'."
                                    (point)
                                    (- (point) bookmark-search-size))
                                   nil))))
-    (position . ,(or posn (point)))))
+    (position . ,(or posn (point)))
+    (last-modified . ,(current-time))))
 
 
 ;;; File format stuff
@@ -1040,6 +1076,7 @@ Lines beginning with `#' are ignored."
         (from-bookmark-list bookmark--annotation-from-bookmark-list)
         (old-buffer (current-buffer)))
     (bookmark-set-annotation bookmark-name annotation)
+    (bookmark-update-last-modified bookmark-name)
     (setq bookmark-alist-modification-count
           (1+ bookmark-alist-modification-count))
     (message "Annotation updated for \"%s\"" bookmark-name)
@@ -1140,15 +1177,6 @@ it to the name of the bookmark currently being set, 
advancing
                                   (car bookmark-bookmarks-timestamp)))))))
          (bookmark-load (car bookmark-bookmarks-timestamp) t t))))
 
-(defun bookmark-maybe-sort-alist ()
-  "Return `bookmark-alist' for display.
-If `bookmark-sort-flag' is non-nil, then return a sorted copy of the alist.
-Otherwise, just return `bookmark-alist', which by default is ordered
-from most recently created to least recently created bookmark."
-  (if bookmark-sort-flag
-      (sort (copy-alist bookmark-alist)
-            (lambda (x y) (string-lessp (car x) (car y))))
-    bookmark-alist))
 
 
 (defvar bookmark-after-jump-hook nil
@@ -1335,6 +1363,7 @@ after a bookmark was set in it."
                     (format "Relocate %s to: " bookmark-name)
                     (file-name-directory bmrk-filename))))))
     (bookmark-set-filename bookmark-name newloc)
+    (bookmark-update-last-modified bookmark-name)
     (setq bookmark-alist-modification-count
           (1+ bookmark-alist-modification-count))
     (if (bookmark-time-to-save-p)
@@ -1397,6 +1426,7 @@ name."
               nil
               'bookmark-history))))
     (bookmark-set-name old-name final-new-name)
+    (bookmark-update-last-modified final-new-name)
     (setq bookmark-current-bookmark final-new-name)
     (bookmark-bmenu-surreptitiously-rebuild-list)
     (setq bookmark-alist-modification-count
@@ -1825,27 +1855,28 @@ Don't affect the buffer ring order."
               entries)))
     ;; The value of `bookmark-sort-flag' might have changed since the
     ;; last time the buffer contents were generated, so re-check it.
-    (if bookmark-sort-flag
-        (progn
-          (setq tabulated-list-sort-key '("Bookmark Name" . nil))
-          (setq tabulated-list-entries entries))
-      (setq tabulated-list-sort-key nil)
-      ;; And since we're not sorting by bookmark name, show bookmarks
-      ;; according to order of creation, with the most recently
-      ;; created bookmarks at the top and the least recently created
-      ;; at the bottom.
-      ;;
-      ;; Note that clicking the column sort toggle for the bookmark
-      ;; name column will invoke the `tabulated-list-mode' sort, which
-      ;; uses `bookmark-bmenu--name-predicate' to sort lexically by
-      ;; bookmark name instead of by (reverse) creation order.
-      ;; Clicking the toggle again will reverse the lexical sort, but
-      ;; the sort will still be lexical not creation-order.  However,
-      ;; if the user reverts the buffer, then the above check of
-      ;; `bookmark-sort-flag' will happen again and the buffer will
-      ;; go back to a creation-order sort.  This is all expected
-      ;; behavior, as documented in `bookmark-bmenu-mode'.
-      (setq tabulated-list-entries (reverse entries)))
+    (cond ((eq bookmark-sort-flag t)
+           (setq tabulated-list-sort-key '("Bookmark Name" . nil)
+                 tabulated-list-entries entries))
+          ((or (null bookmark-sort-flag)
+               (eq bookmark-sort-flag 'last-modified))
+           (setq tabulated-list-sort-key nil)
+           ;; And since we're not sorting by bookmark name, show bookmarks
+           ;; according to order of creation, with the most recently
+           ;; created bookmarks at the top and the least recently created
+           ;; at the bottom.
+           ;;
+           ;; Note that clicking the column sort toggle for the bookmark
+           ;; name column will invoke the `tabulated-list-mode' sort, which
+           ;; uses `bookmark-bmenu--name-predicate' to sort lexically by
+           ;; bookmark name instead of by (reverse) creation order.
+           ;; Clicking the toggle again will reverse the lexical sort, but
+           ;; the sort will still be lexical not creation-order.  However,
+           ;; if the user reverts the buffer, then the above check of
+           ;; `bookmark-sort-flag' will happen again and the buffer will
+           ;; go back to a creation-order sort.  This is all expected
+           ;; behavior, as documented in `bookmark-bmenu-mode'.
+           (setq tabulated-list-entries (reverse entries))))
     ;; Generate the header only after `tabulated-list-sort-key' is
     ;; settled, because if that's non-nil then the sort-direction
     ;; indicator will be shown in the named column, but if it's
@@ -1953,7 +1984,8 @@ At any time you may use \\[revert-buffer] to go back to 
sorting by creation orde
           ,@(if bookmark-bmenu-toggle-filenames
                 '(("File" 0 bookmark-bmenu--file-predicate)))])
   (setq tabulated-list-padding bookmark-bmenu-marks-width)
-  (when bookmark-sort-flag
+  (when (and bookmark-sort-flag
+             (not (eq bookmark-sort-flag 'last-modified)))
     (setq tabulated-list-sort-key '("Bookmark Name" . nil)))
   (add-hook 'tabulated-list-revert-hook #'bookmark-bmenu--revert nil t)'
   (setq revert-buffer-function 'bookmark-bmenu--revert)
diff --git a/lisp/calc/calc-yank.el b/lisp/calc/calc-yank.el
index 172ccf1adc..e0ed098b70 100644
--- a/lisp/calc/calc-yank.el
+++ b/lisp/calc/calc-yank.el
@@ -303,7 +303,10 @@ Interactively, reads the register using 
`register-read-with-preview'."
 (defun calc-insert-register (register)
   "Insert the contents of register REGISTER.
 
-Interactively, reads the register using `register-read-with-preview'."
+Interactively, reads the register using `register-read-with-preview'.
+
+Note that this command only works with Calc registers, and they
+have nothing to do with the Emacs-wide register mechanism."
   (interactive (list (register-read-with-preview "Insert register: ")))
   (if (eq major-mode 'calc-mode)
       (let ((val (calc-get-register register)))
diff --git a/lisp/calendar/calendar.el b/lisp/calendar/calendar.el
index 7804ce0ee9..9a77ae72d0 100644
--- a/lisp/calendar/calendar.el
+++ b/lisp/calendar/calendar.el
@@ -1066,7 +1066,7 @@ calendar."
 ;; fixme should have a :set that changes calendar-standard-time-zone-name etc.
 (defcustom calendar-time-zone-style 'symbolic
   "Your preferred style for time zones.
-If 'numeric, use numeric time zones like \"+0100\".
+If `numeric', use numeric time zones like \"+0100\".
 Otherwise, use symbolic time zones like \"CET\"."
   :type '(choice (const numeric) (other symbolic))
   :version "28.1"
diff --git a/lisp/calendar/diary-lib.el b/lisp/calendar/diary-lib.el
index 45df0c6259..48dbf33adf 100644
--- a/lisp/calendar/diary-lib.el
+++ b/lisp/calendar/diary-lib.el
@@ -1,7 +1,6 @@
 ;;; diary-lib.el --- diary functions  -*- lexical-binding:t -*-
 
-;; Copyright (C) 1989-1990, 1992-1995, 2001-2022 Free Software
-;; Foundation, Inc.
+;; Copyright (C) 1989-2022 Free Software Foundation, Inc.
 
 ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
 ;; Maintainer: emacs-devel@gnu.org
@@ -2246,12 +2245,10 @@ Prefix argument ARG makes the entry nonmarking."
   ;; Return value suitable for `write-contents-functions'.
   nil)
 
-(defvar diary-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "\C-c\C-s" 'diary-show-all-entries)
-    (define-key map "\C-c\C-q" 'quit-window)
-    map)
-  "Keymap for `diary-mode'.")
+(defvar-keymap diary-mode-map
+  :doc "Keymap for `diary-mode'."
+  "C-c C-s" #'diary-show-all-entries
+  "C-c C-q" #'quit-window)
 
 (defun diary-font-lock-sexps (limit)
   "Recognize sexp diary entry up to LIMIT for font-locking."
diff --git a/lisp/calendar/holidays.el b/lisp/calendar/holidays.el
index 7e11044dbc..5aa0d26d19 100644
--- a/lisp/calendar/holidays.el
+++ b/lisp/calendar/holidays.el
@@ -30,7 +30,7 @@
 ;;; Code:
 
 (require 'calendar)
-(load "hol-loaddefs" nil t)
+(load "holiday-loaddefs" nil t)
 
 (defgroup holidays nil
   "Holidays support in calendar."
diff --git a/lisp/calendar/iso8601.el b/lisp/calendar/iso8601.el
index e31120f52f..6827a957a6 100644
--- a/lisp/calendar/iso8601.el
+++ b/lisp/calendar/iso8601.el
@@ -114,6 +114,11 @@
          iso8601--duration-week-match
          iso8601--duration-combined-match)))
 
+;; "Z" dnd "z" are standard time; nil and [-+][0-9][0-9]... are local time
+;; with unknown DST.
+(defun iso8601--zone-dst (zone)
+  (if (= (length zone) 1) nil -1))
+
 (defun iso8601-parse (string &optional form)
   "Parse an ISO 8601 date/time string and return a `decode-time' structure.
 
@@ -140,7 +145,7 @@ See `decode-time' for the meaning of FORM."
         (setf (decoded-time-zone date)
               ;; The time zone in decoded times are in seconds.
              (* (iso8601-parse-zone zone-string) 60))
-       (setf (decoded-time-dst date) nil))
+       (setf (decoded-time-dst date) (iso8601--zone-dst zone-string)))
       date)))
 
 (defun iso8601-parse-date (string)
@@ -256,6 +261,7 @@ See `decode-time' for the meaning of FORM."
           (iso8601--decoded-time :hour hour
                                  :minute (or minute 0)
                                  :second (or second 0)
+                                :dst (iso8601--zone-dst zone)
                                  :zone (and zone
                                             (* 60 (iso8601-parse-zone
                                                    zone)))))))))
@@ -364,7 +370,7 @@ Return the number of minutes."
 
 (cl-defun iso8601--decoded-time (&key second minute hour
                                       day month year
-                                      dst zone)
+                                     (dst -1) zone)
   (list (iso8601--value second)
         (iso8601--value minute)
         (iso8601--value hour)
@@ -372,7 +378,7 @@ Return the number of minutes."
         (iso8601--value month)
         (iso8601--value year)
         nil
-       (if (or dst zone) dst -1)
+       dst
         zone))
 
 (defun iso8601--encode-time (time)
diff --git a/lisp/calendar/time-date.el b/lisp/calendar/time-date.el
index ba7c48b290..d19134db83 100644
--- a/lisp/calendar/time-date.el
+++ b/lisp/calendar/time-date.el
@@ -552,16 +552,20 @@ changes in daylight saving time are not taken into 
account."
 
 (cl-defun make-decoded-time (&key second minute hour
                                   day month year
-                                  dst zone)
+                                  (dst -1) zone)
   "Return a `decoded-time' structure with only the keywords given filled out."
   (list second minute hour day month year nil dst zone))
 
 (defun decoded-time-set-defaults (time &optional default-zone)
-  "Set any nil values in `decoded-time' TIME to default values.
+  "Set most nil values in `decoded-time' TIME to default values.
+This can set TIME's year, month, day, hour, minute and second.
 The default value is based on January 1st, 1970 at midnight.
 This year is used to guarantee portability; see Info
 node `(elisp) Time of Day'.
 
+Optional argument DEFAULT-ZONE specifies what time zone to
+default to when TIME's time zone is nil (meaning local time).
+
 TIME is modified and returned."
   (unless (decoded-time-second time)
     (setf (decoded-time-second time) 0))
@@ -577,13 +581,11 @@ TIME is modified and returned."
   (unless (decoded-time-year time)
     (setf (decoded-time-year time) 1970))
 
-  ;; When we don't have a time zone, default to DEFAULT-ZONE without
-  ;; DST if DEFAULT-ZONE if given, and to unknown DST otherwise.
   (unless (decoded-time-zone time)
-    (if default-zone
-       (progn (setf (decoded-time-zone time) default-zone)
-              (setf (decoded-time-dst time) nil))
-      (setf (decoded-time-dst time) -1)))
+    (setf (decoded-time-zone time) default-zone))
+
+  ;; Do not set decoded-time-weekday or decoded-time-dst,
+  ;; as encode-time can infer them well enough when unknown.
 
   time)
 
diff --git a/lisp/cedet/ede/proj-elisp.el b/lisp/cedet/ede/proj-elisp.el
index 0c65af15c4..7c56ca1993 100644
--- a/lisp/cedet/ede/proj-elisp.el
+++ b/lisp/cedet/ede/proj-elisp.el
@@ -319,8 +319,7 @@ Lays claim to all .elc files that match .el files in this 
target."
                ("require" . "$(foreach r,$(1),(require (quote $(r))))"))
    :commands
    '("$(EMACS) $(EMACSFLAGS) $(addprefix -L ,$(LOADPATH)) \
---eval '(setq generated-autoload-file \"$(abspath $(LOADDEFS))\")' \
--f batch-update-autoloads $(abspath $(LOADDIRS))")
+-f loaddefs-generate-batch $(abspath $(LOADDEFS)) $(abspath $(LOADDIRS))")
    :rules (list (ede-makefile-rule :target "clean-autoloads" :phony t :rules 
'("rm -f $(LOADDEFS)")))
    :sourcetype '(ede-source-emacs)
    )
diff --git a/lisp/cedet/mode-local.el b/lisp/cedet/mode-local.el
index b1a4fe4d54..ce37a28c35 100644
--- a/lisp/cedet/mode-local.el
+++ b/lisp/cedet/mode-local.el
@@ -877,10 +877,9 @@ META-NAME is a cons (OVERLOADABLE-SYMBOL . MAJOR-MODE)."
   "Display mode local bindings active in BUFFER-OR-MODE.
 Optional argument INTERACTIVE-P is non-nil if the calling command was
 invoked interactively."
-  (when (fboundp 'help-setup-xref)
-    (help-setup-xref
-     (list 'mode-local-describe-bindings-1 buffer-or-mode)
-     interactive-p))
+  (help-setup-xref
+   (list 'mode-local-describe-bindings-1 buffer-or-mode)
+   interactive-p)
   (with-output-to-temp-buffer (help-buffer) ; "*Help*"
     (with-current-buffer standard-output
       (mode-local-describe-bindings-2 buffer-or-mode))))
diff --git a/lisp/cedet/semantic/bovine/grammar.el 
b/lisp/cedet/semantic/bovine/grammar.el
index d478b12f64..67366ad445 100644
--- a/lisp/cedet/semantic/bovine/grammar.el
+++ b/lisp/cedet/semantic/bovine/grammar.el
@@ -260,7 +260,8 @@ QUOTEMODE is the mode in which quoted symbols are slurred."
       (insert ")\n")))
 )
 
-(defun bovine-grammar-parsetable-builder ()
+(define-mode-local-override semantic-grammar-parsetable-builder
+  bovine-grammar-mode ()
   "Return the parser table expression as a string value.
 The format of a bovine parser table is:
 
@@ -409,7 +410,8 @@ The source directory is relative to some root in the load 
path."
          newdir))
       (error (buffer-name))))
 
-(defun bovine-grammar-setupcode-builder ()
+(define-mode-local-override semantic-grammar-setupcode-builder
+  bovine-grammar-mode ()
   "Return the text of the setup code."
   (format
    "(setq semantic--parse-table %s\n\
@@ -435,10 +437,7 @@ Menu items are appended to the common grammar menu.")
 ;;;###autoload
 (define-derived-mode bovine-grammar-mode semantic-grammar-mode "BY"
   "Major mode for editing Bovine grammars."
-  (semantic-grammar-setup-menu bovine-grammar-menu)
-  (semantic-install-function-overrides
-   '((semantic-grammar-parsetable-builder . bovine-grammar-parsetable-builder)
-     (semantic-grammar-setupcode-builder  . 
bovine-grammar-setupcode-builder))))
+  (semantic-grammar-setup-menu bovine-grammar-menu))
 
 (add-to-list 'auto-mode-alist '("\\.by\\'" . bovine-grammar-mode))
 
@@ -461,7 +460,7 @@ Menu items are appended to the common grammar menu.")
 (defun bovine--make-parser-1 (infile &optional outdir)
   (if outdir (setq outdir (file-name-directory (expand-file-name outdir))))
   ;; It would be nicer to use a temp-buffer rather than find-file-noselect.
-  ;; The only thing stopping us is bovine-grammar-setupcode-builder's
+  ;; The only thing stopping us is bovine's 
semantic-grammar-setupcode-builder's
   ;; use of (buffer-name).  Perhaps that could be changed to
   ;; (file-name-nondirectory (buffer-file-name)) ?
 ;;  (with-temp-buffer
diff --git a/lisp/cedet/semantic/complete.el b/lisp/cedet/semantic/complete.el
index 2c608fca38..6a09adca32 100644
--- a/lisp/cedet/semantic/complete.el
+++ b/lisp/cedet/semantic/complete.el
@@ -1761,7 +1761,8 @@ Return a cons cell (X . Y)."
 
 
 (defvar tooltip-frame-parameters)
-(declare-function tooltip-show "tooltip" (text &optional use-echo-area))
+(declare-function tooltip-show "tooltip" (text &optional use-echo-area
+                                               text-face default-face))
 
 (defun semantic-displayer-tooltip-show (text)
   "Display a tooltip with TEXT near cursor."
diff --git a/lisp/cedet/semantic/fw.el b/lisp/cedet/semantic/fw.el
index b7c3461a4d..113323cb33 100644
--- a/lisp/cedet/semantic/fw.el
+++ b/lisp/cedet/semantic/fw.el
@@ -287,7 +287,8 @@ later installation should be done in MODE hook."
           (cons (intern (format "semantic-%s" name)) (cdr e)))))
     overrides)
    (list 'constant-flag (not transient)
-         'override-flag t)))
+         'override-flag t)
+   nil))
 
 ;;; User Interrupt handling
 ;;
diff --git a/lisp/cedet/semantic/html.el b/lisp/cedet/semantic/html.el
index 718ce3c4c7..00e19dbc89 100644
--- a/lisp/cedet/semantic/html.el
+++ b/lisp/cedet/semantic/html.el
@@ -82,6 +82,11 @@ or
          tag :members (mapcar #'semantic-html-expand-tag chil)))
     (car (semantic--tag-expand tag))))
 
+(define-mode-local-override semantic-tag-components html-mode (tag)
+  "Return components belonging to TAG."
+  ;; Keep this η-regexp because `semantic-html-components' is called
+  ;; from elsewhere.
+  (semantic-html-components tag))
 (defun semantic-html-components (tag)
   "Return components belonging to TAG."
   (semantic-tag-get-attribute tag :members))
@@ -245,12 +250,7 @@ tag with greater section value than LEVEL is found."
        senator-step-at-start-end-tag-classes '(section)
        senator-step-at-tag-classes '(section)
        semantic-stickyfunc-sticky-classes '(section)
-       )
-  (semantic-install-function-overrides
-   '((semantic-tag-components . semantic-html-components)
-     )
-   t)
-  )
+       ))
 
 ;; `html-helper-mode' hasn't been updated since 2004, so it's not very
 ;; relevant nowadays.
diff --git a/lisp/cedet/semantic/imenu.el b/lisp/cedet/semantic/imenu.el
index 235965a995..37dc963272 100644
--- a/lisp/cedet/semantic/imenu.el
+++ b/lisp/cedet/semantic/imenu.el
@@ -39,7 +39,8 @@
 (require 'semantic/sort)
 (require 'imenu)
 
-(declare-function pulse-momentary-highlight-one-line "pulse" (o &optional 
face))
+(declare-function pulse-momentary-highlight-one-line "pulse"
+                  (&optional point face))
 (declare-function semanticdb-semantic-init-hook-fcn "db-mode")
 
 ;; Because semantic imenu tags will hose the current imenu handling
diff --git a/lisp/cedet/semantic/senator.el b/lisp/cedet/semantic/senator.el
index ebc4159a4c..1d16b024a5 100644
--- a/lisp/cedet/semantic/senator.el
+++ b/lisp/cedet/semantic/senator.el
@@ -735,12 +735,9 @@ yanked to."
 Optional argument KILL-FLAG will delete the text of the tag to the
 kill ring.
 
-Interactively, reads the register using `register-read-with-preview',
-if available."
-  (interactive (list (if (fboundp 'register-read-with-preview)
-                        (register-read-with-preview "Tag to register: ")
-                      (read-char "Tag to register: "))
-                    current-prefix-arg))
+Interactively, reads the register using `register-read-with-preview'."
+  (interactive (list (register-read-with-preview "Tag to register: ")
+                     current-prefix-arg))
   (semantic-fetch-tags)
   (let ((ft (semantic-obtain-foreign-tag)))
     (when ft
diff --git a/lisp/cedet/semantic/sort.el b/lisp/cedet/semantic/sort.el
index 1503a766dc..756b949c0d 100644
--- a/lisp/cedet/semantic/sort.el
+++ b/lisp/cedet/semantic/sort.el
@@ -310,7 +310,7 @@ may re-organize the list with side-effects."
 ;; class tag.
 ;;
 (defvar-local semantic-orphaned-member-metaparent-type "class"
-  "In `semantic-adopt-external-members', the type of 'type for metaparents.
+  "In `semantic-adopt-external-members', the type of `type' for metaparents.
 A metaparent is a made-up type semantic token used to hold the child list
 of orphaned members of a named type.")
 
diff --git a/lisp/cedet/semantic/texi.el b/lisp/cedet/semantic/texi.el
index 1917bcb40a..d005b7a854 100644
--- a/lisp/cedet/semantic/texi.el
+++ b/lisp/cedet/semantic/texi.el
@@ -55,20 +55,17 @@ The field position is the field number (based at 1) where 
the
 name of this section is.")
 
 ;;; Code:
-(defun semantic-texi-parse-region (&rest _ignore)
+(define-mode-local-override semantic-parse-region texinfo-mode (&rest _ignore)
   "Parse the current texinfo buffer for semantic tags.
 IGNORE any arguments, always parse the whole buffer.
 Each tag returned is of the form:
  (\"NAME\" section (:members CHILDREN))
 or
- (\"NAME\" def)
-
-It is an override of `semantic-parse-region' and must be installed by the
-function `semantic-install-function-overrides'."
+ (\"NAME\" def)"
   (mapcar #'semantic-texi-expand-tag
           (semantic-texi-parse-headings)))
 
-(defun semantic-texi-parse-changes ()
+(define-mode-local-override semantic-parse-changes texinfo-mode ()
   "Parse changes in the current texinfo buffer."
   ;; NOTE: For now, just schedule a full reparse.
   ;;       To be implemented later.
@@ -445,9 +442,6 @@ that start with that symbol."
 (defun semantic-default-texi-setup ()
   "Set up a buffer for parsing of Texinfo files."
   ;; This will use our parser.
-  (semantic-install-function-overrides
-   '((semantic-parse-region . semantic-texi-parse-region)
-     (semantic-parse-changes . semantic-texi-parse-changes)))
   (setq semantic-parser-name "TEXI"
         ;; Setup a dummy parser table to enable parsing!
         semantic--parse-table t
diff --git a/lisp/cedet/semantic/wisent/grammar.el 
b/lisp/cedet/semantic/wisent/grammar.el
index 5ca22bac86..a4104e333d 100644
--- a/lisp/cedet/semantic/wisent/grammar.el
+++ b/lisp/cedet/semantic/wisent/grammar.el
@@ -284,13 +284,15 @@ Return the expanded expression."
          (assocs       (wisent-grammar-assocs)))
     (cons terminals (cons assocs nonterminals))))
 
-(defun wisent-grammar-parsetable-builder ()
+(define-mode-local-override semantic-grammar-parsetable-builder
+  wisent-grammar-mode ()
   "Return the value of the parser table."
   `(wisent-compiled-grammar
     ,(wisent-grammar-grammar)
     ,(semantic-grammar-start)))
 
-(defun wisent-grammar-setupcode-builder ()
+(define-mode-local-override semantic-grammar-setupcode-builder
+  wisent-grammar-mode ()
   "Return the parser setup code."
   (format
    "(semantic-install-function-overrides\n\
@@ -322,10 +324,7 @@ Menu items are appended to the common grammar menu.")
 (define-derived-mode wisent-grammar-mode semantic-grammar-mode "WY"
   "Major mode for editing Wisent grammars."
   (semantic-grammar-setup-menu wisent-grammar-menu)
-  (setq-local semantic-grammar-require-form '(require 'semantic/wisent))
-  (semantic-install-function-overrides
-   '((semantic-grammar-parsetable-builder . wisent-grammar-parsetable-builder)
-     (semantic-grammar-setupcode-builder  . 
wisent-grammar-setupcode-builder))))
+  (setq-local semantic-grammar-require-form '(require 'semantic/wisent)))
 
 (defvar-mode-local wisent-grammar-mode semantic-grammar-macros
   '(
diff --git a/lisp/cedet/srecode/texi.el b/lisp/cedet/srecode/texi.el
index 50b0e150ff..c297429e40 100644
--- a/lisp/cedet/srecode/texi.el
+++ b/lisp/cedet/srecode/texi.el
@@ -246,7 +246,7 @@ that class.
  class      => @code{class} @xref{class}
  unknown    => @code{unknown}
  \"text\"     => \\=`\\=`text\\='\\='
- 'quoteme   => @code{quoteme}
+ \\='quoteme   => @code{quoteme}
  non-nil    => non-@code{nil}
  t          => @code{t}
  :tag       => @code{:tag}
diff --git a/lisp/cmuscheme.el b/lisp/cmuscheme.el
index e64d9d28dd..22a465f5b6 100644
--- a/lisp/cmuscheme.el
+++ b/lisp/cmuscheme.el
@@ -195,6 +195,7 @@ to continue it."
   (scheme-mode-variables)
   (setq mode-line-process '(":%s"))
   (setq comint-input-filter (function scheme-input-filter))
+  (setq-local comint-prompt-read-only t)
   (setq comint-get-old-input (function scheme-get-old-input)))
 
 (defcustom inferior-scheme-filter-regexp "\\`\\s *\\S ?\\S ?\\s *\\'"
diff --git a/lisp/color.el b/lisp/color.el
index fe629f4f98..410659869a 100644
--- a/lisp/color.el
+++ b/lisp/color.el
@@ -39,6 +39,10 @@
 COLOR should be a color name (e.g. \"white\") or an RGB triplet
 string (e.g. \"#ffff1122eecc\").
 
+COLOR can also be the symbol `unspecified' or one of the strings
+\"unspecified-fg\" or \"unspecified-bg\", in which case the
+return value is nil.
+
 Normally the return value is a list of three floating-point
 numbers, (RED GREEN BLUE), each between 0.0 and 1.0 inclusive.
 
diff --git a/lisp/comint.el b/lisp/comint.el
index 88eaf1120e..3da61fb992 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -3978,10 +3978,12 @@ REGEXP-GROUP is the regular expression group in REGEXP 
to use."
 
 ;;; OSC escape sequences (Operating System Commands)
 ;;============================================================================
-;; Adding `comint-osc-process-output' to `comint-output-filter-functions'
-;; enables the interpretation of OSC escape sequences.  By default, only
-;; OSC 8, for hyperlinks, is acted upon.  Adding more entries to
-;; `comint-osc-handlers' allows a customized treatment of further sequences.
+;; Adding `comint-osc-process-output' to
+;; `comint-output-filter-functions' enables the interpretation of OSC
+;; escape sequences.  By default, OSC 7 and 8 (for current directory
+;; and hyperlinks respectively) are acted upon.  Adding more entries
+;; to `comint-osc-handlers' allows a customized treatment of further
+;; sequences.
 
 (defvar-local comint-osc-handlers '(("7" . comint-osc-directory-tracker)
                                     ("8" . comint-osc-hyperlink-handler))
@@ -4026,9 +4028,9 @@ arguments, with point where the escape sequence was 
located."
 
 ;; Current directory tracking (OSC 7)
 
-(declare-function url-host "url-parse.el")
-(declare-function url-type "url-parse.el")
-(declare-function url-filename "url-parse.el")
+(declare-function url-host "url/url-parse.el")
+(declare-function url-type "url/url-parse.el")
+(declare-function url-filename "url/url-parse.el")
 (defun comint-osc-directory-tracker (_ text)
   "Update `default-directory' from OSC 7 escape sequences.
 
diff --git a/lisp/cus-dep.el b/lisp/cus-dep.el
index 87dcbbb004..47d2cac3be 100644
--- a/lisp/cus-dep.el
+++ b/lisp/cus-dep.el
@@ -156,9 +156,9 @@ Usage: emacs -batch -l ./cus-dep.el -f 
custom-make-dependencies DIRS"
   (set-buffer (find-file-noselect generated-custom-dependencies-file))
   (setq buffer-undo-list t)
   (erase-buffer)
-  (insert (autoload-rubric generated-custom-dependencies-file
-                           "custom dependencies" t))
-  (search-backward "")
+  (generate-lisp-file-heading
+   generated-custom-dependencies-file 'custom-make-dependencies
+   :title "custom dependencies")
   (let (alist)
     (mapatoms (lambda (symbol)
                (let ((members (get symbol 'custom-group))
@@ -241,6 +241,7 @@ This is an alist whose members have as car a version 
string, and as
 elements the files that have variables or faces that contain that
 version.  These files should be loaded before showing the customization
 buffer that `customize-changed' generates.\")\n\n"))
+  (generate-lisp-file-trailer generated-custom-dependencies-file)
   (save-buffer)
   (byte-compile-info
    (format "Generating %s...done" generated-custom-dependencies-file) t))
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index dae97b0230..6dff9ec97a 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -441,6 +441,7 @@ Use group `text' for this instead.  This group is 
deprecated."
     (define-key map "u" 'Custom-goto-parent)
     (define-key map "n" 'widget-forward)
     (define-key map "p" 'widget-backward)
+    (define-key map "H" 'custom-toggle-hide-all-widgets)
     map)
   "Keymap for `Custom-mode'.")
 
@@ -745,6 +746,9 @@ groups after non-groups, if nil do not order groups at all."
      (or custom-file user-init-file)
      "Un-customize settings in this and future sessions." "delete" 
"Uncustomize"
      (modified set changed rogue saved))
+    (" Toggle hiding all values " custom-toggle-hide-all-widgets
+     t "Toggle hiding all values."
+     "hide" "Hide" t)
     (" Help for Customize " Custom-help t "Get help for using Customize."
      "help" "Help" t)
     (" Exit " Custom-buffer-done t "Exit Customize." "exit" "Exit" t))
@@ -1494,7 +1498,7 @@ symbols `custom-face' or `custom-variable'."
       (custom-buffer-create (custom-sort-items found t nil)
                            "*Customize Saved*"))))
 
-(declare-function apropos-parse-pattern "apropos" (pattern))
+(declare-function apropos-parse-pattern "apropos" (pattern &optional di-all))
 (defvar apropos-regexp)
 
 ;;;###autoload
@@ -2834,6 +2838,39 @@ try matching its doc string against 
`custom-guess-doc-alist'."
          (custom-add-parent-links widget))
        (custom-add-see-also widget)))))
 
+(defvar custom--hidden-state)
+
+(defun custom-toggle-hide-all-widgets ()
+  "Hide or show details of all customizable settings in a Custom buffer.
+This command is for use in a Custom buffer that shows many
+customizable settings, like \"*Customize Group*\" or \"*Customize Faces*\".
+It toggles the display of each of the customizable settings in the buffer
+between the expanded view, where the values of the settings and the value
+menus to change them are visible; and the concise view, where only the
+minimal details are shown, usually the name, the doc string and little
+else."
+  (interactive)
+  (save-excursion
+    (goto-char (point-min))
+    ;; Surely there's a better way to find all the "top level" widgets
+    ;; in a buffer, but I couldn't find it.
+    (while (not (eobp))
+      (when-let* ((widget (widget-at (point)))
+                  (parent (widget-get widget :parent))
+                  (state (widget-get parent :custom-state)))
+        (when (eq state 'changed)
+          (setq state 'standard))
+        (when (and (eq (widget-type widget) 'custom-visibility)
+                   (eq state custom--hidden-state))
+          (custom-toggle-parent widget)))
+      (forward-line 1)))
+  (setq custom--hidden-state (if (eq custom--hidden-state 'hidden)
+                                 'standard
+                               'hidden))
+  (if (eq custom--hidden-state 'hidden)
+      (message "All variables hidden")
+    (message "All variables shown")))
+
 (defun custom-toggle-hide-variable (visibility-widget &rest _ignore)
   "Toggle the visibility of a `custom-variable' parent widget.
 By default, this signals an error if the parent has unsaved
@@ -5230,7 +5267,8 @@ if that value is non-nil."
                        :label (nth 5 arg)))
                     custom-commands)
                    (setq custom-tool-bar-map map))))
-  (setq-local custom--invocation-options nil)
+  (setq-local custom--invocation-options nil
+              custom--hidden-state 'hidden)
   (setq-local revert-buffer-function #'custom--revert-buffer)
   (make-local-variable 'custom-options)
   (make-local-variable 'custom-local-buffer)
diff --git a/lisp/cus-start.el b/lisp/cus-start.el
index 83ab61b28b..d8c4b48035 100644
--- a/lisp/cus-start.el
+++ b/lisp/cus-start.el
@@ -832,6 +832,7 @@ since it could result in memory overflow and make Emacs 
crash."
             (scroll-bar-adjust-thumb-portion windows boolean "24.4")
              (x-scroll-event-delta-factor mouse float "29.1")
              (x-gtk-use-native-input keyboard boolean "29.1")
+             (x-dnd-disable-motif-drag dnd boolean "29.1")
             ;; xselect.c
             (x-select-enable-clipboard-manager killing boolean "24.1")
             ;; xsettings.c
@@ -870,6 +871,8 @@ since it could result in memory overflow and make Emacs 
crash."
                       ((or (equal "scroll-bar-adjust-thumb-portion"
                                  (symbol-name symbol))
                            (equal "x-scroll-event-delta-factor"
+                                  (symbol-name symbol))
+                           (equal "x-dnd-disable-motif-drag"
                                   (symbol-name symbol)))
                       (featurep 'x))
                      ((string-match "\\`x-" (symbol-name symbol))
diff --git a/lisp/custom.el b/lisp/custom.el
index 76c14831ca..2b7621229d 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -67,8 +67,10 @@ symbol."
 
 (defun custom-initialize-set (symbol exp)
   "Initialize SYMBOL based on EXP.
-If the symbol doesn't have a default binding already,
-then set it using its `:set' function (or `set-default' if it has none).
+If the symbol doesn't have a default binding already, then set it
+using its `:set' function (or `set-default-toplevel-value' if it
+has none).
+
 The value is either the value in the symbol's `saved-value' property,
 if any, or the value of EXP."
   (condition-case nil
@@ -81,7 +83,9 @@ if any, or the value of EXP."
 
 (defun custom-initialize-reset (symbol exp)
   "Initialize SYMBOL based on EXP.
-Set the symbol, using its `:set' function (or `set-default' if it has none).
+Set the symbol, using its `:set' function (or `set-default-toplevel-value'
+if it has none).
+
 The value is either the symbol's current value
  (as obtained using the `:get' function), if any,
 or the value in the symbol's `saved-value' property if any,
@@ -100,7 +104,7 @@ or (last of all) the value of EXP."
   "Initialize SYMBOL with EXP.
 Like `custom-initialize-reset', but only use the `:set' function if
 not using the standard setting.
-For the standard setting, use `set-default'."
+For the standard setting, use `set-default-toplevel-value'."
   (condition-case nil
       (let ((def (default-toplevel-value symbol)))
         (funcall (or (get symbol 'custom-set) #'set-default-toplevel-value)
@@ -114,7 +118,7 @@ For the standard setting, use `set-default'."
                 symbol
                 (eval (car (get symbol 'saved-value)))))
       (t
-       (set-default symbol (eval exp)))))))
+       (set-default-toplevel-value symbol (eval exp)))))))
 
 (defvar custom-delayed-init-variables nil
   "List of variables whose initialization is pending until startup.
@@ -262,11 +266,11 @@ The following keywords are meaningful:
        when using the Customize user interface.  It takes two arguments,
        the symbol to set and the value to give it.  The function should
        not modify its value argument destructively.  The default choice
-       of function is `set-default'.
+       of function is `set-default-toplevel-value'.
 :get   VALUE should be a function to extract the value of symbol.
        The function takes one argument, a symbol, and should return
        the current value for that symbol.  The default choice of function
-       is `default-value'.
+       is `default-toplevel-value'.
 :require
        VALUE should be a feature symbol.  If you save a value
        for this option, then when your init file loads the value,
@@ -717,7 +721,7 @@ this sets the local binding in that buffer instead."
   (if custom-local-buffer
       (with-current-buffer custom-local-buffer
        (set variable value))
-    (set-default variable value)))
+    (set-default-toplevel-value variable value)))
 
 (defun custom-set-minor-mode (variable value)
   ":set function for minor mode variables.
@@ -1422,6 +1426,22 @@ are not directories are omitted from the expansion."
 
 ;;; Enabling and disabling loaded themes.
 
+(defcustom enable-theme-functions nil
+  "Abnormal hook that is run after a theme has been enabled.
+The functions in the hook are called with one parameter -- the
+ name of the theme that's been enabled (as a symbol)."
+  :type 'hook
+  :group 'customize
+  :version "29.1")
+
+(defcustom disable-theme-functions nil
+  "Abnormal hook that is run after a theme has been disabled.
+The functions in the hook are called with one parameter -- the
+ name of the theme that's been disabled (as a symbol)."
+  :type 'hook
+  :group 'customize
+  :version "29.1")
+
 (defun enable-theme (theme)
   "Reenable all variable and face settings defined by THEME.
 THEME should be either `user', or a theme loaded via `load-theme'.
@@ -1430,7 +1450,9 @@ After this function completes, THEME will have the highest
 precedence (after `user') among enabled themes.
 
 Note that any already-enabled themes remain enabled after this
-function runs.  To disable other themes, use `disable-theme'."
+function runs.  To disable other themes, use `disable-theme'.
+
+After THEME has been enabled, runs `enable-theme-functions'."
   (interactive (list (intern
                      (completing-read
                       "Enable custom theme: "
@@ -1478,7 +1500,9 @@ function runs.  To disable other themes, use 
`disable-theme'."
     (setq custom-enabled-themes
          (cons theme (remq theme custom-enabled-themes)))
     ;; Give the `user' theme the highest priority.
-    (enable-theme 'user)))
+    (enable-theme 'user))
+  ;; Allow callers to react to the enabling.
+  (run-hook-with-args 'enable-theme-functions theme))
 
 (defcustom custom-enabled-themes nil
   "List of enabled Custom Themes, highest precedence first.
@@ -1523,7 +1547,9 @@ Setting this variable through Customize calls 
`enable-theme' or
 
 (defun disable-theme (theme)
   "Disable all variable and face settings defined by THEME.
-See `custom-enabled-themes' for a list of enabled themes."
+See `custom-enabled-themes' for a list of enabled themes.
+
+After THEME has been disabled, runs `disable-theme-functions'."
   (interactive (list (intern
                      (completing-read
                       "Disable custom theme: "
@@ -1567,7 +1593,9 @@ See `custom-enabled-themes' for a list of enabled themes."
                             "unspecified-fg" "black"))
       (face-set-after-frame-default frame))
     (setq custom-enabled-themes
-          (delq theme custom-enabled-themes))))
+          (delq theme custom-enabled-themes))
+    ;; Allow callers to react to the disabling.
+    (run-hook-with-args 'disable-theme-functions theme)))
 
 ;; Only used if window-system not null.
 (declare-function x-get-resource "frame.c"
diff --git a/lisp/dabbrev.el b/lisp/dabbrev.el
index 220a2f52e9..215425f136 100644
--- a/lisp/dabbrev.el
+++ b/lisp/dabbrev.el
@@ -225,18 +225,27 @@ or matched by `dabbrev-ignored-buffer-regexps'."
 
 (defcustom dabbrev-ignored-buffer-names '("*Messages*" "*Buffer List*")
   "List of buffer names that dabbrev should not check.
-See also `dabbrev-ignored-buffer-regexps'."
+See also `dabbrev-ignored-buffer-regexps' and
+`dabbrev-ignored-buffer-modes'."
   :type '(repeat (string :tag "Buffer name"))
   :group 'dabbrev
   :version "20.3")
 
 (defcustom dabbrev-ignored-buffer-regexps nil
   "List of regexps matching names of buffers that dabbrev should not check.
-See also `dabbrev-ignored-buffer-names'."
+See also `dabbrev-ignored-buffer-names' and
+`dabbrev-ignored-buffer-modes'."
   :type '(repeat regexp)
   :group 'dabbrev
   :version "21.1")
 
+(defcustom dabbrev-ignored-buffer-modes '(archive-mode image-mode)
+  "Inhibit looking for abbreviations in buffers derived from these modes.
+See also `dabbrev-ignored-buffer-names' and
+`dabbrev-ignored-buffer-regexps'."
+  :type '(repeat symbol)
+  :version "29.1")
+
 (defcustom dabbrev-check-other-buffers t
   "Should \\[dabbrev-expand] look in other buffers?
 nil: Don't look in other buffers.
@@ -383,6 +392,14 @@ If the prefix argument is 16 (which comes from 
\\[universal-argument] \\[univers
 then it searches *all* buffers."
   (interactive "*P")
   (dabbrev--reset-global-variables)
+  (setq dabbrev--check-other-buffers (and arg t))
+  (setq dabbrev--check-all-buffers
+        (and arg (= (prefix-numeric-value arg) 16)))
+  (let ((completion-at-point-functions '(dabbrev-capf)))
+    (completion-at-point)))
+
+(defun dabbrev-capf ()
+  "Dabbrev completion function for `completion-at-point-functions'."
   (let* ((abbrev (dabbrev--abbrev-at-point))
          (beg (progn (search-backward abbrev) (point)))
          (end (progn (search-forward abbrev) (point)))
@@ -420,10 +437,7 @@ then it searches *all* buffers."
                            (t
                             (mapcar #'downcase completion-list)))))))
               (complete-with-action a list s p)))))
-    (setq dabbrev--check-other-buffers (and arg t))
-    (setq dabbrev--check-all-buffers
-          (and arg (= (prefix-numeric-value arg) 16)))
-    (completion-in-region beg end table)))
+    (list beg end table)))
 
 ;;;###autoload
 (defun dabbrev-expand (arg)
@@ -537,8 +551,9 @@ See also `dabbrev-abbrev-char-regexp' and 
\\[dabbrev-completion]."
       (if (not (or (eq dabbrev--last-buffer dabbrev--last-buffer-found)
                   (minibuffer-window-active-p (selected-window))))
          (progn
-           (message "Expansion found in `%s'"
-                    (buffer-name dabbrev--last-buffer))
+            (when (buffer-name dabbrev--last-buffer)
+             (message "Expansion found in `%s'"
+                      (buffer-name dabbrev--last-buffer)))
            (setq dabbrev--last-buffer-found dabbrev--last-buffer))
        (message nil))
       (if (and (or (eq (current-buffer) dabbrev--last-buffer)
@@ -632,19 +647,29 @@ See also `dabbrev-abbrev-char-regexp' and 
\\[dabbrev-completion]."
   "Return a list of other buffers to search for a possible abbrev.
 The current buffer is not included in the list.
 
-This function makes a list of all the buffers returned by `buffer-list',
-then discards buffers whose names match `dabbrev-ignored-buffer-names'
-or `dabbrev-ignored-buffer-regexps'.  It also discards buffers for which
-`dabbrev-friend-buffer-function', if it is bound, returns nil when called
-with the buffer as argument.
-It returns the list of the buffers that are not discarded."
+This function makes a list of all the buffers returned by
+`buffer-list', then discards buffers whose names match
+`dabbrev-ignored-buffer-names' or
+`dabbrev-ignored-buffer-regexps', and major modes that match
+`dabbrev-ignored-buffer-modes'.  It also discards buffers for
+which `dabbrev-friend-buffer-function', if it is bound, returns
+nil when called with the buffer as argument.  It returns the list
+of the buffers that are not discarded."
   (dabbrev-filter-elements
-   buffer (buffer-list)
+   buffer (dabbrev--filter-buffer-modes)
    (and (not (eq (current-buffer) buffer))
        (not (dabbrev--ignore-buffer-p buffer))
        (boundp 'dabbrev-friend-buffer-function)
        (funcall dabbrev-friend-buffer-function buffer))))
 
+(defun dabbrev--filter-buffer-modes ()
+  (seq-filter (lambda (buffer)
+                (not (apply
+                      #'provided-mode-derived-p
+                      (buffer-local-value 'major-mode buffer)
+                      dabbrev-ignored-buffer-modes)))
+              (buffer-list)))
+
 (defun dabbrev--try-find (abbrev reverse n ignore-case)
   "Search for ABBREV, backwards if REVERSE, N times.
 If IGNORE-CASE is non-nil, ignore case while searching.
@@ -746,17 +771,41 @@ of the start of the occurrence."
                  (make-progress-reporter
                   "Scanning for dabbrevs..."
                   (- (length dabbrev--friend-buffer-list)) 0 0 1 1.5))))
-       ;; Walk through the buffers till we find a match.
-       (let (expansion)
-        (while (and (not expansion) dabbrev--friend-buffer-list)
-          (setq dabbrev--last-buffer (pop dabbrev--friend-buffer-list))
-          (set-buffer dabbrev--last-buffer)
-           (progress-reporter-update dabbrev--progress-reporter
-                                     (- (length dabbrev--friend-buffer-list)))
-          (setq dabbrev--last-expansion-location (point-min))
-          (setq expansion (dabbrev--try-find abbrev nil 1 ignore-case)))
-        (progress-reporter-done dabbrev--progress-reporter)
-        expansion)))))
+       (let ((file-name (buffer-file-name))
+             file-name-buffer)
+         (unwind-protect
+             (progn
+               ;; Include the file name components into the abbrev
+               ;; list (because if you have a file name "foobar", it's
+               ;; somewhat likely that you'll be talking about foobar
+               ;; stuff in the file itself).
+               (when file-name
+                 (setq file-name-buffer (generate-new-buffer " *abbrev-file*"))
+                 (with-current-buffer file-name-buffer
+                   (dolist (part (file-name-split file-name))
+                     (insert part "\n")))
+                 (setq dabbrev--friend-buffer-list
+                       (append dabbrev--friend-buffer-list
+                               (list file-name-buffer))))
+               ;; Walk through the buffers till we find a match.
+               (let (expansion)
+                (while (and (not expansion) dabbrev--friend-buffer-list)
+                  (setq dabbrev--last-buffer
+                         (pop dabbrev--friend-buffer-list))
+                  (set-buffer dabbrev--last-buffer)
+                   (progress-reporter-update
+                    dabbrev--progress-reporter
+                    (- (length dabbrev--friend-buffer-list)))
+                  (setq dabbrev--last-expansion-location (point-min))
+                  (setq expansion (dabbrev--try-find
+                                    abbrev nil 1 ignore-case)))
+                (progress-reporter-done dabbrev--progress-reporter)
+                expansion))
+           (when (buffer-live-p file-name-buffer)
+             (kill-buffer file-name-buffer))
+           (setq dabbrev--friend-buffer-list
+                 (seq-filter #'buffer-live-p
+                             dabbrev--friend-buffer-list))))))))
 
 ;; Compute the list of buffers to scan.
 ;; If dabbrev-search-these-buffers-only, then the current buffer
@@ -779,7 +828,7 @@ of the start of the occurrence."
          (setq list
                (append list
                        (dabbrev-filter-elements
-                        buffer (buffer-list)
+                        buffer (dabbrev--filter-buffer-modes)
                         (and (not (memq buffer list))
                              (not (dabbrev--ignore-buffer-p buffer)))))))
       ;; Remove the current buffer.
diff --git a/lisp/delsel.el b/lisp/delsel.el
index f5fe7cf793..5310328e5f 100644
--- a/lisp/delsel.el
+++ b/lisp/delsel.el
@@ -64,6 +64,19 @@
   "If non-nil, deleted region text is stored in this register.
 Value must be the register (key) to use.")
 
+(defcustom delete-selection-temporary-region nil
+  "Whether to delete only temporary regions.
+When non-nil, typed text replaces only the regions set by
+mouse-dragging, shift-selection, and \"\\[universal-argument] 
\\[exchange-point-and-mark]\" when
+`transient-mark-mode' is turned off.  If the value is the symbol
+`selection', then replace only the regions set by mouse-dragging
+and shift-selection."
+  :version "29.1"
+  :group 'editing-basics
+  :type '(choice (const :tag "Replace all regions" nil)
+                 (const :tag "Replace region from mouse, shift-selection, and 
\"C-u C-x C-x\"" t)
+                 (const :tag "Replace region from mouse and shift-selection" 
selection)))
+
 ;;;###autoload
 (defalias 'pending-delete-mode 'delete-selection-mode)
 
@@ -108,7 +121,8 @@ the active region is killed instead of deleted."
   "Repeat replacing text of highlighted region with typed text.
 Search for the next stretch of text identical to the region last replaced
 by typing text over it and replaces it with the same stretch of text.
-With ARG, repeat that many times.  `\\[universal-argument]' means until end of 
buffer."
+With ARG (interactively, prefix numeric argument), repeat that many times.
+Just `\\[universal-argument]' means repeat until the end of the buffer's 
accessible portion."
   (interactive "P")
   (let ((old-text (and delete-selection-save-to-register
                        (get-register delete-selection-save-to-register)))
@@ -251,7 +265,13 @@ property on their symbol; commands which insert text but 
don't
 have this property won't delete the selection.
 See `delete-selection-helper'."
   (when (and delete-selection-mode (use-region-p)
-            (not buffer-read-only))
+            (not buffer-read-only)
+             (or (null delete-selection-temporary-region)
+                 (and delete-selection-temporary-region
+                      (consp transient-mark-mode)
+                      (eq (car transient-mark-mode) 'only))
+                 (and (not (eq delete-selection-temporary-region 'selection))
+                      (eq transient-mark-mode 'lambda))))
     (delete-selection-helper (and (symbolp this-command)
                                   (get this-command 'delete-selection)))))
 
diff --git a/lisp/desktop.el b/lisp/desktop.el
index 1a4103e209..947f7cff5c 100644
--- a/lisp/desktop.el
+++ b/lisp/desktop.el
@@ -44,10 +44,11 @@
 ;; (info "(emacs)Saving Emacs Sessions") in the GNU Emacs Manual.
 
 ;; When the desktop module is loaded, the function `desktop-kill' is
-;; added to the `kill-emacs-hook'.  This function is responsible for
-;; saving the desktop when Emacs is killed.  Furthermore an anonymous
-;; function is added to the `after-init-hook'.  This function is
-;; responsible for loading the desktop when Emacs is started.
+;; added to the `kill-emacs-query-functions'.  This function is
+;; responsible for saving the desktop and deleting the desktop lock
+;; file when Emacs is killed.  In addition, an anonymous function is
+;; added to the `after-init-hook'.  This function is responsible for
+;; loading the desktop when Emacs is started.
 
 ;; Special handling.
 ;; -----------------
diff --git a/lisp/dframe.el b/lisp/dframe.el
index 6593708a13..9580a3187f 100644
--- a/lisp/dframe.el
+++ b/lisp/dframe.el
@@ -120,9 +120,7 @@
   :prefix "dframe-"
   :group 'dframe)
 
-(defvar dframe-have-timer-flag (if (fboundp 'display-graphic-p)
-                                  (display-graphic-p)
-                                window-system)
+(defvar dframe-have-timer-flag (display-graphic-p)
   "Non-nil means that timers are available for this Emacs.
 This is nil for terminals, since updating a frame in a terminal
 is not useful to the user.")
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 64cdab28f9..d16aee0fa8 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -797,7 +797,7 @@ offer a smarter default choice of shell command."
 
 ;;;###autoload
 (defcustom dired-confirm-shell-command t
-  "Whether to prompt for confirmation for ‘dired-do-shell-command’.
+  "Whether to prompt for confirmation for `dired-do-shell-command'.
 If non-nil, prompt for confirmation if the command contains potentially
 dangerous characters.  If nil, never prompt for confirmation."
   :type 'boolean
@@ -819,7 +819,9 @@ are executed in the background on each file sequentially 
waiting
 for each command to terminate before running the next command.
 In shell syntax this means separating the individual commands with `;'.
 
-The output appears in the buffer named by `shell-command-buffer-name-async'."
+The output appears in the buffer named by `shell-command-buffer-name-async'.
+
+Commands that are run asynchronously do not accept user input."
   (interactive
    (let ((files (dired-get-marked-files t current-prefix-arg nil nil t)))
      (list
@@ -996,8 +998,15 @@ Also see the `dired-confirm-shell-command' variable."
                                file-list dired-mark-separator)))
          (when (cdr file-list)
            (setq files (concat dired-mark-prefix files dired-mark-postfix)))
-         (funcall stuff-it files))))
-     (or (and in-background "&") ""))))
+         (concat
+          (funcall stuff-it files)
+          ;; Be consistent in how we treat inputs to commands -- do
+          ;; the same here as in the `on-each' case.
+          (if (and in-background (not w32-shell))
+              "&wait"
+            "")))))
+     (or (and in-background "&")
+         ""))))
 
 ;; This is an extra function so that it can be redefined by ange-ftp.
 ;;;###autoload
@@ -3199,41 +3208,7 @@ Intended to be added to `isearch-mode-hook'."
 The returned function narrows the search to match the search string
 only as part of a file name enclosed by the text property `dired-filename'.
 It's intended to override the default search function."
-  (let ((search-fun (funcall orig-fun))
-        (property 'dired-filename))
-    (lambda (string &optional bound noerror count)
-      (let* ((old (point))
-             ;; Check if point is already on the property.
-             (beg (when (get-text-property
-                         (if isearch-forward old (max (1- old) (point-min)))
-                         property)
-                    old))
-             end found)
-        ;; Otherwise, try to search for the next property.
-        (unless beg
-          (setq beg (if isearch-forward
-                        (next-single-property-change old property)
-                      (previous-single-property-change old property)))
-          (when beg (goto-char beg)))
-        ;; Non-nil `beg' means there are more properties.
-        (while (and beg (not found))
-          ;; Search for the end of the current property.
-          (setq end (if isearch-forward
-                        (next-single-property-change beg property)
-                      (previous-single-property-change beg property)))
-          (setq found (funcall
-                       search-fun string (if bound (if isearch-forward
-                                                       (min bound end)
-                                                     (max bound end))
-                                           end)
-                       noerror count))
-          (unless found
-            (setq beg (if isearch-forward
-                          (next-single-property-change end property)
-                        (previous-single-property-change end property)))
-            (when beg (goto-char beg))))
-        (unless found (goto-char old))
-        found))))
+  (isearch-search-fun-in-text-property 'dired-filename (funcall orig-fun)))
 
 ;;;###autoload
 (defun dired-isearch-filenames ()
@@ -3293,7 +3268,7 @@ type \\[help-command] at that time.
 
 Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
 If you exit the query-replace loop (\\[keyboard-quit], RET or q), you can
-resume the query replace with the command \\[tags-loop-continue]."
+resume the query replace with the command \\[fileloop-continue]."
   (interactive
    (let ((common
          (query-replace-read-args
diff --git a/lisp/dired.el b/lisp/dired.el
index 89fbd52aa6..55e150e9e0 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -38,6 +38,7 @@
 (eval-when-compile (require 'cl-lib))
 ;; When bootstrapping dired-loaddefs has not been generated.
 (require 'dired-loaddefs nil t)
+(require 'dnd)
 
 (declare-function dired-buffer-more-recently-used-p
                  "dired-x" (buffer1 buffer2))
@@ -252,12 +253,27 @@ The target is used in the prompt for file copy, rename 
etc."
 (defcustom dired-mouse-drag-files nil
   "If non-nil, allow the mouse to drag files from inside a Dired buffer.
 Dragging the mouse and then releasing it over the window of
-another program will result in that program opening the file, or
-creating a copy of it.  This feature is supported only on X
-Windows and Haiku.
+another program will result in that program opening or creating a
+copy of the file underneath the mouse pointer (or all marked
+files if it was marked).  This feature is supported only on X
+Windows, Haiku, and Nextstep (macOS or GNUstep).
 
 If the value is `link', then a symbolic link will be created to
-the file instead by the other program (usually a file manager)."
+the file instead by the other program (usually a file manager).
+
+If the value is `move', then the default action will be for the
+other program to move the file to a different location.  For this
+to work optimally, `auto-revert-mode' should be enabled in the
+Dired buffer.
+
+If the Meta key is held down when the mouse button is pressed,
+then this will always be equivalent to `link'.
+
+If the Control key is held down when the mouse button is pressed,
+then dragging the file will always copy it to the new location.
+
+If the Shift key is held down when the mouse button is pressed,
+then this will always be equivalent to `move'."
   :set (lambda (option value)
          (set-default option value)
          (dolist (buffer (buffer-list))
@@ -265,7 +281,8 @@ the file instead by the other program (usually a file 
manager)."
              (when (derived-mode-p 'dired-mode)
                (revert-buffer nil t)))))
   :type '(choice (const :tag "Don't allow dragging" nil)
-                 (const :tag "Copy file to other window" t)
+                 (const :tag "Copy file to new location" t)
+                 (const :tag "Move file to new location" t)
                  (const :tag "Create symbolic link to file" link))
   :group 'dired
   :version "29.1")
@@ -808,6 +825,9 @@ that commands on the next ARG (instead of the marked) files 
can
 be chained easily.
 For any other non-nil value of ARG, use the current file.
 
+If ARG is `marked', don't return the current file if nothing else
+is marked.
+
 If optional third arg SHOW-PROGRESS evaluates to non-nil,
 redisplay the dired buffer after each file is processed.
 
@@ -829,7 +849,7 @@ marked file, return (t FILENAME) instead of (FILENAME)."
   ;;This warning should not apply any longer, sk  2-Sep-1991 14:10.
   `(prog1
        (let ((inhibit-read-only t) case-fold-search found results)
-        (if ,arg
+        (if (and ,arg (not (eq ,arg 'marked)))
             (if (integerp ,arg)
                 (progn ;; no save-excursion, want to move point.
                   (dired-repeat-over-lines
@@ -840,8 +860,8 @@ marked file, return (t FILENAME) instead of (FILENAME)."
                   (if (< ,arg 0)
                       (nreverse results)
                     results))
-              ;; non-nil, non-integer ARG means use current file:
-              (list ,body))
+              ;; non-nil, non-integer, non-marked ARG means use current file:
+               (list ,body))
           (let ((regexp (dired-marker-regexp)) next-position)
             (save-excursion
               (goto-char (point-min))
@@ -866,7 +886,8 @@ marked file, return (t FILENAME) instead of (FILENAME)."
                 (setq results (cons t results)))
             (if found
                 results
-              (list ,body)))))
+               (unless (eq ,arg 'marked)
+                (list ,body))))))
      ;; save-excursion loses, again
      (dired-move-to-filename)))
 
@@ -1702,80 +1723,82 @@ see `dired-use-ls-dired' for more details.")
           beg))
         beg))))
 
-(defvar dired-last-dragged-remote-file nil
-  "If non-nil, the name of a local copy of the last remote file that was 
dragged.
-It can't be removed immediately after the drag-and-drop operation
-completes, since there is no way to determine when the drop
-target has finished opening it.  So instead, this file is removed
-when Emacs exits or the user drags another file.")
-
 (declare-function x-begin-drag "xfns.c")
 
-(defun dired-remove-last-dragged-local-file ()
-  "Remove the local copy of the last remote file to be dragged."
-  (when dired-last-dragged-remote-file
-    (unwind-protect
-        (delete-file dired-last-dragged-remote-file)
-      (setq dired-last-dragged-remote-file nil)))
-  (remove-hook 'kill-emacs-hook #'dired-remove-last-dragged-local-file))
-
 (defun dired-mouse-drag (event)
-  "Begin a drag-and-drop operation for the file at EVENT."
+  "Begin a drag-and-drop operation for the file at EVENT.
+If there are marked files and that file is marked, drag every
+other marked file as well.  Otherwise, unmark all files."
   (interactive "e")
   (when mark-active
     (deactivate-mark))
-  (dired-remove-last-dragged-local-file)
-  (save-excursion
-    (with-selected-window (posn-window (event-end event))
-      (goto-char (posn-point (event-end event))))
-    (track-mouse
-      (let ((beginning-position (mouse-pixel-position))
-            new-event)
-        (catch 'track-again
-          (setq new-event (read-event))
-          (if (not (eq (event-basic-type new-event) 'mouse-movement))
-              (when (eq (event-basic-type new-event) 'mouse-1)
-                (push new-event unread-command-events))
-            (let ((current-position (mouse-pixel-position)))
-              ;; If the mouse didn't move far enough, don't
-              ;; inadvertently trigger a drag.
-              (when (and (eq (car current-position) (car beginning-position))
-                         (ignore-errors
-                           (and (> 3 (abs (- (cadr beginning-position)
-                                             (cadr current-position))))
-                                (> 3 (abs (- (caddr beginning-position)
-                                             (caddr current-position)))))))
-                (throw 'track-again nil)))
-            ;; We can get an error if there's by some chance no file
-            ;; name at point.
-            (condition-case nil
-                (let ((filename (with-selected-window (posn-window
-                                                       (event-end event))
-                                  (dired-file-name-at-point))))
-                  (when filename
-                    ;; In theory x-dnd-username combined with a proper
-                    ;; file URI containing the hostname of the remote
-                    ;; server could be used here instead of creating a
-                    ;; local copy of the remote file, but no program
-                    ;; actually implements file DND according to the
-                    ;; spec.
-                    (when (file-remote-p filename)
-                      (setq filename (file-local-copy filename))
-                      (setq dired-last-dragged-remote-file filename)
-                      (add-hook 'kill-emacs-hook
-                                #'dired-remove-last-dragged-local-file))
-                    (gui-backend-set-selection 'XdndSelection filename)
-                    (x-begin-drag '("text/uri-list" "text/x-dnd-username"
-                                    "FILE_NAME" "FILE" "HOST_NAME")
-                                  (if (eq 'dired-mouse-drag-files 'link)
-                                      'XdndActionLink
-                                    'XdndActionCopy)
-                                  nil nil t)))
-              (error (when (eq (event-basic-type new-event) 'mouse-1)
-                       (push new-event unread-command-events))))))))))
+  (let* ((modifiers (event-modifiers event))
+         (action (cond ((memq 'control modifiers) 'copy)
+                       ((memq 'shift modifiers) 'move)
+                       ((memq 'meta modifiers) 'link)
+                       (t (if (memq dired-mouse-drag-files
+                                    '(copy move link))
+                              dired-mouse-drag-files
+                            'copy)))))
+    (save-excursion
+      (with-selected-window (posn-window (event-end event))
+        (goto-char (posn-point (event-end event))))
+      (track-mouse
+        (let ((beginning-position (mouse-pixel-position))
+              new-event)
+          (catch 'track-again
+            (setq new-event (read-event))
+            (if (not (eq (event-basic-type new-event) 'mouse-movement))
+                (when (eq (event-basic-type new-event) 'mouse-1)
+                  (push new-event unread-command-events))
+              (let ((current-position (mouse-pixel-position)))
+                ;; If the mouse didn't move far enough, don't
+                ;; inadvertently trigger a drag.
+                (when (and (eq (car current-position) (car beginning-position))
+                           (ignore-errors
+                             (and (> 3 (abs (- (cadr beginning-position)
+                                               (cadr current-position))))
+                                  (> 3 (abs (- (caddr beginning-position)
+                                               (caddr current-position)))))))
+                  (throw 'track-again nil)))
+              ;; We can get an error if there's by some chance no file
+              ;; name at point.
+              (condition-case error
+                  (let ((filename (with-selected-window (posn-window
+                                                         (event-end event))
+                                    (let ((marked-files (dired-map-over-marks 
(dired-get-filename
+                                                                               
nil 'no-error-if-not-filep)
+                                                                              
'marked))
+                                          (file-name (dired-get-filename nil 
'no-error-if-not-filep)))
+                                      (if (and marked-files
+                                               (member file-name marked-files))
+                                          marked-files
+                                        (when marked-files
+                                          (dired-map-over-marks (dired-unmark 
nil)
+                                                                'marked))
+                                        file-name)))))
+                    (when filename
+                      (if (and (consp filename)
+                               (cdr filename))
+                          (dnd-begin-drag-files filename nil action t)
+                        (dnd-begin-file-drag (if (stringp filename)
+                                                 filename
+                                               (car filename))
+                                             nil action t))))
+                (error (when (eq (event-basic-type new-event) 'mouse-1)
+                         (push new-event unread-command-events))
+                       ;; Errors from `dnd-begin-drag-files' should be
+                       ;; treated as user errors, since they should
+                       ;; only occur when the user performs an invalid
+                       ;; action, such as trying to create a link to
+                       ;; a remote file.
+                       (user-error (cadr error)))))))))))
 
 (defvar dired-mouse-drag-files-map (let ((keymap (make-sparse-keymap)))
                                      (define-key keymap [down-mouse-1] 
#'dired-mouse-drag)
+                                     (define-key keymap [C-down-mouse-1] 
#'dired-mouse-drag)
+                                     (define-key keymap [S-down-mouse-1] 
#'dired-mouse-drag)
+                                     (define-key keymap [M-down-mouse-1] 
#'dired-mouse-drag)
                                      keymap)
   "Keymap applied to file names when `dired-mouse-drag-files' is enabled.")
 
@@ -3957,7 +3980,11 @@ this subdir."
     (let ((inhibit-read-only t))
       (dired-repeat-over-lines
        (prefix-numeric-value arg)
-       (lambda () (delete-char 1) (insert dired-marker-char)))))))
+       (lambda ()
+         (when (or (not (looking-at-p dired-re-dot))
+                   (not (equal dired-marker-char dired-del-marker)))
+           (delete-char 1)
+           (insert dired-marker-char))))))))
 
 (defun dired-unmark (arg &optional interactive)
   "Unmark the file at point in the Dired buffer.
diff --git a/lisp/display-line-numbers.el b/lisp/display-line-numbers.el
index 860aa758bc..897a88398f 100644
--- a/lisp/display-line-numbers.el
+++ b/lisp/display-line-numbers.el
@@ -108,6 +108,84 @@ the mode is on, set `display-line-numbers' directly."
 (define-globalized-minor-mode global-display-line-numbers-mode
   display-line-numbers-mode display-line-numbers--turn-on)
 
+
+
+;;;###autoload
+(defvar header-line-indent ""
+  "String to indent at the start if the header line.
+This is used in `header-line-indent-mode', and buffers that have
+this switched on should have a `header-line-format' that look like:
+
+  (\"\" header-line-indent THE-REST...)
+
+Also see `header-line-indent-width'.")
+
+;;;###autoload
+(defvar header-line-indent-width 0
+  "The width of the current line numbers displayed.
+This is updated when `header-line-indent-mode' is switched on.
+
+Also see `header-line-indent'.")
+
+(defun header-line-indent--line-number-width ()
+  "Return the width taken by `display-line-numbers' in the current buffer."
+  ;; line-number-display-width returns the value for the selected
+  ;; window, which might not be the window in which the current buffer
+  ;; is displayed.
+  (if (not display-line-numbers)
+      0
+    (let ((cbuf-window (get-buffer-window (current-buffer) t)))
+      (if (window-live-p cbuf-window)
+          (with-selected-window cbuf-window
+            (truncate (line-number-display-width 'columns)))
+        4))))
+
+(defun header-line-indent--watch-line-number-width (_window)
+  (let ((width (header-line-indent--line-number-width)))
+    (setq header-line-indent-width width)
+    (unless (= (length header-line-indent) width)
+      (setq header-line-indent (make-string width ?\s)))))
+
+(defun header-line-indent--window-scroll-function (window _start)
+  (let ((width (with-selected-window window
+                 (truncate (line-number-display-width 'columns)))))
+    (setq header-line-indent-width width)
+    (unless (= (length header-line-indent) width)
+      (setq header-line-indent (make-string width ?\s)))))
+
+;;;###autoload
+(define-minor-mode header-line-indent-mode
+  "Mode to indent the header line in `display-line-numbers-mode' buffers.
+This means that the header line will be kept indented so that it
+has blank space that's as wide as the displayed line numbers in
+the buffer.
+
+Buffers that have this switched on should have a
+`header-line-format' that look like:
+
+  (\"\" header-line-indent THE-REST...)
+
+The `header-line-indent-width' variable is also kept updated, and
+has the width of `header-line-format'.  This can be used, for
+instance, in `:align-to' specs, like:
+
+  (space :align-to (+ header-line-indent-width 10))"
+  :lighter nil
+  (if header-line-indent-mode
+      (progn
+        (setq-local header-line-indent ""
+                    header-line-indent-width 0)
+        (add-hook 'pre-redisplay-functions
+                  #'header-line-indent--watch-line-number-width nil t)
+        (add-hook 'window-scroll-functions
+                  #'header-line-indent--window-scroll-function nil t))
+    (setq-local header-line-indent ""
+                header-line-indent-width 0)
+    (remove-hook 'pre-redisplay-functions
+                 #'header-line-indent--watch-line-number-width t)
+    (remove-hook 'window-scroll-functions
+                 #'header-line-indent--window-scroll-function t)))
+
 (provide 'display-line-numbers)
 
 ;;; display-line-numbers.el ends here
diff --git a/lisp/dnd.el b/lisp/dnd.el
index 4f71edf1aa..9d72a4b595 100644
--- a/lisp/dnd.el
+++ b/lisp/dnd.el
@@ -33,6 +33,9 @@
 
 ;;; Customizable variables
 
+(eval-when-compile
+  (require 'cl-lib))
+
 (defgroup dnd nil
   "Handling data from drag and drop."
   :group 'environment)
@@ -109,7 +112,9 @@ program."
   "Handle mouse movement to POSN when receiving a drop from another program."
   (when (windowp (posn-window posn))
     (with-selected-window (posn-window posn)
-      (when dnd-scroll-margin
+      (when (and dnd-scroll-margin
+                 ;; TODO: handle scroll bars reasonably.
+                 (not (posn-area posn)))
         (ignore-errors
           (let* ((row (cdr (posn-col-row posn)))
                  (window (when (windowp (posn-window posn))
@@ -278,6 +283,242 @@ TEXT is the text as a string, WINDOW is the window where 
the drop happened."
     (insert text))
   action)
 
+
+;;; Functions for dragging stuff to other programs.  These build upon
+;;; the lower-level `x-begin-drag' interface, but take care of data
+;;; types and abstracting around the different return values.
+
+(defvar dnd-last-dragged-remote-file nil
+  "If non-nil, the name of a local copy of the last remote file that was 
dragged.
+This may also be a list of files, if multiple files were dragged.
+It can't be removed immediately after the drag-and-drop operation
+completes, since there is no way to determine when the drop
+target has finished opening it.  So instead, this file is removed
+when Emacs exits or the user drags another file.")
+
+(defun dnd-remove-last-dragged-remote-file ()
+  "Remove the local copy of the last remote file to be dragged.
+If `dnd-last-dragged-remote-file' is a list, remove all the files
+in that list instead."
+  (when dnd-last-dragged-remote-file
+    (unwind-protect
+        (if (consp dnd-last-dragged-remote-file)
+            (mapc #'delete-file dnd-last-dragged-remote-file)
+          (delete-file dnd-last-dragged-remote-file))
+      (setq dnd-last-dragged-remote-file nil)))
+  (remove-hook 'kill-emacs-hook
+               #'dnd-remove-last-dragged-remote-file))
+
+(declare-function x-begin-drag "xfns.c")
+
+(defun dnd-begin-text-drag (text &optional frame action allow-same-frame)
+  "Begin dragging TEXT from FRAME.
+Initate a drag-and-drop operation allowing the user to drag text
+from Emacs to another program (the drop target), then block until
+the drop is completed or is cancelled.
+
+If the drop completed, return the action that the drop target
+actually performed, which can be one of the following symbols:
+
+  - `copy', which means TEXT was inserted by the drop target.
+
+  - `move', which means TEXT was inserted, and the caller should
+    additionally delete TEXT from its source (such as the buffer
+    where it originated).
+
+  - `private', which means the drop target chose to perform an
+    unspecified action.
+
+Return nil if the drop was cancelled.
+
+TEXT is a string containing text that will be inserted by the
+program where the drop happened.  FRAME is the frame where the
+mouse is currently held down, or nil, which stands for the
+current frame.  ACTION is one of the symbols `copy' or `move',
+where `copy' means that the text should be inserted by the drop
+target, and `move' means the the same as `copy', but in addition
+the caller might have to delete TEXT from its source after this
+function returns.  If ALLOW-SAME-FRAME is nil, ignore any drops
+on FRAME itself.
+
+This function might return immediately if no mouse buttons are
+currently being held down.  It should only be called upon a
+`down-mouse-1' (or similar) event."
+  (unless (fboundp 'x-begin-drag)
+    (error "Dragging text from Emacs is not supported by this window system"))
+  (gui-set-selection 'XdndSelection text)
+  (unless action
+    (setq action 'copy))
+  (let ((return-value
+         (x-begin-drag '(;; Traditional X selection targets used by GTK, the
+                         ;; Motif drag-and-drop protocols, and programs like
+                         ;; Xterm.  `STRING' is also used on NS and Haiku.
+                         "STRING" "TEXT" "COMPOUND_TEXT" "UTF8_STRING"
+                         ;; Used by Xdnd clients that strictly comply with
+                         ;; the standard (i.e. Qt programs).
+                         "text/plain" "text/plain;charset=utf-8")
+                       (cl-ecase action
+                         ('copy 'XdndActionCopy)
+                         ('move 'XdndActionMove))
+                       frame nil allow-same-frame)))
+    (cond
+     ((eq return-value 'XdndActionCopy) 'copy)
+     ((eq return-value 'XdndActionMove) 'move)
+     ((not return-value) nil)
+     (t 'private))))
+
+(defun dnd-begin-file-drag (file &optional frame action allow-same-frame)
+  "Begin dragging FILE from FRAME.
+Initate a drag-and-drop operation allowing the user to drag a file
+from Emacs to another program (the drop target), then block until
+the drop happens or is cancelled.
+
+Return the action that the drop target actually performed, which
+can be one of the following symbols:
+
+  - `copy', which means FILE was opened by the drop target.
+
+  - `move', which means FILE was moved to another location by the
+    drop target.
+
+  - `link', which means a symbolic link was created to FILE by
+    the drop target, usually a file manager.
+
+  - `private', which means the drop target chose to perform an
+    unspecified action.
+
+Return nil if the drop was cancelled.
+
+FILE is the file name that will be sent to the program where the
+drop happened.  If it is a remote file, Emacs will make a
+temporary copy and pass that.  FRAME is the frame where the mouse
+is currently held down, or nil (which means to use the current
+frame).  ACTION is one of the symbols `copy', `move' or `link',
+where `copy' means that the file should be opened or copied by
+the drop target, `move' means the drop target should move the
+file to another location, and `link' means the drop target should
+create a symbolic link to FILE.  It is an error to specify `link'
+as the action if FILE is a remote file.  If ALLOW-SAME-FRAME is
+nil, any drops on FRAME itself will be ignored.
+
+This function might return immediately if no mouse buttons are
+currently being held down.  It should only be called upon a
+`down-mouse-1' (or similar) event."
+  (unless (fboundp 'x-begin-drag)
+    (error "Dragging files from Emacs is not supported by this window system"))
+  (dnd-remove-last-dragged-remote-file)
+  (unless action
+    (setq action 'copy))
+  (let ((original-file file))
+    (when (file-remote-p file)
+      (if (eq action 'link)
+          (error "Cannot create symbolic link to remote file")
+        (setq file (file-local-copy file))
+        (setq dnd-last-dragged-remote-file file)
+        (add-hook 'kill-emacs-hook
+                  #'dnd-remove-last-dragged-remote-file)))
+    (gui-set-selection 'XdndSelection
+                       (propertize (expand-file-name file) 'text/uri-list
+                                   (concat "file://"
+                                           (expand-file-name file))))
+    (let ((return-value
+           (x-begin-drag '(;; Xdnd types used by GTK, Qt, and most other
+                           ;; modern programs that expect filenames to
+                           ;; be supplied as URIs.
+                           "text/uri-list" "text/x-xdnd-username"
+                           ;; Traditional X selection targets used by
+                           ;; programs supporting the Motif
+                           ;; drag-and-drop protocols.  Also used by NS
+                           ;; and Haiku.
+                           "FILE_NAME" "FILE" "HOST_NAME"
+                           ;; ToolTalk filename.  Mostly used by CDE
+                           ;; programs.
+                           "_DT_NETFILE")
+                         (cl-ecase action
+                           ('copy 'XdndActionCopy)
+                           ('move 'XdndActionMove)
+                           ('link 'XdndActionLink))
+                         frame nil allow-same-frame)))
+      (cond
+       ((eq return-value 'XdndActionCopy) 'copy)
+       ((eq return-value 'XdndActionMove)
+        (prog1 'move
+          ;; If original-file is a remote file, delete it from the
+          ;; remote as well.
+          (when (file-remote-p original-file)
+            (ignore-errors
+              (delete-file original-file)))))
+       ((eq return-value 'XdndActionLink) 'link)
+       ((not return-value) nil)
+       (t 'private)))))
+
+(defun dnd-begin-drag-files (files &optional frame action allow-same-frame)
+  "Begin dragging FILES from FRAME.
+This is like `dnd-begin-file-drag', except with multiple files.
+FRAME, ACTION and ALLOW-SAME-FRAME mean the same as in
+`dnd-begin-file-drag'.
+
+FILES is a list of files that will be dragged.  If the drop
+target doesn't support dropping multiple files, the first file in
+FILES will be dragged."
+  (unless (fboundp 'x-begin-drag)
+    (error "Dragging files from Emacs is not supported by this window system"))
+  (dnd-remove-last-dragged-remote-file)
+  (let* ((new-files (copy-sequence files))
+         (tem new-files))
+    (while tem
+      (setcar tem (expand-file-name (car tem)))
+      (when (file-remote-p (car tem))
+        (when (eq action 'link)
+          (error "Cannot create symbolic link to remote file"))
+        (condition-case error
+            (progn (setcar tem (file-local-copy (car tem)))
+                   (push (car tem) dnd-last-dragged-remote-file))
+          (error (message "Failed to download file: %s" error)
+                 (setcar tem nil))))
+      (setq tem (cdr tem)))
+    ;; Remove any files that failed to download from a remote host.
+    (setq new-files (delq nil new-files))
+    (unless new-files
+      (error "No files were specified or no remote file could be downloaded"))
+    (unless action
+      (setq action 'copy))
+    (gui-set-selection 'XdndSelection
+                       (propertize (car new-files)
+                                   'text/uri-list
+                                   (cl-loop for file in new-files
+                                            collect (concat "file://" file)
+                                            into targets finally return
+                                            (apply #'vector targets))
+                                   'FILE_NAME (apply #'vector new-files)))
+    (let ((return-value
+           (x-begin-drag '(;; Xdnd types used by GTK, Qt, and most other
+                           ;; modern programs that expect filenames to
+                           ;; be supplied as URIs.
+                           "text/uri-list" "text/x-xdnd-username"
+                           ;; Traditional X selection targets used by
+                           ;; programs supporting the Motif
+                           ;; drag-and-drop protocols.  Also used by NS
+                           ;; and Haiku.
+                           "FILE_NAME" "HOST_NAME")
+                         (cl-ecase action
+                           ('copy 'XdndActionCopy)
+                           ('move 'XdndActionMove)
+                           ('link 'XdndActionLink))
+                         frame nil allow-same-frame)))
+      (cond
+       ((eq return-value 'XdndActionCopy) 'copy)
+       ((eq return-value 'XdndActionMove)
+        (prog1 'move
+          ;; If original-file is a remote file, delete it from the
+          ;; remote as well.
+          (dolist (original-file files)
+            (when (file-remote-p original-file)
+              (ignore-errors
+                (delete-file original-file))))))
+       ((eq return-value 'XdndActionLink) 'link)
+       ((not return-value) nil)
+       (t 'private)))))
 
 (provide 'dnd)
 
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index 22570dd510..9d27347360 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -1641,7 +1641,8 @@ For now these keys are useful:
 \\[image-kill-buffer] : Kill the conversion process and this buffer.
 \\[doc-view-kill-proc] : Kill the conversion process.\n")))))
 
-(declare-function tooltip-show "tooltip" (text &optional use-echo-area))
+(declare-function tooltip-show "tooltip" (text &optional use-echo-area
+                                               text-face default-face))
 
 (defun doc-view-show-tooltip ()
   (interactive)
diff --git a/lisp/edmacro.el b/lisp/edmacro.el
index 179fea786d..26f3ae02ab 100644
--- a/lisp/edmacro.el
+++ b/lisp/edmacro.el
@@ -251,8 +251,7 @@ or nil, use a compact 80-column format."
                   ((looking-at "Key:\\(.*\\)$")
                    (when edmacro-store-hook
                      (error "\"Key\" line not allowed in this context"))
-                   (let ((key (edmacro-parse-keys
-                               (match-string 1))))
+                   (let ((key (kbd (match-string 1))))
                      (unless (equal key "")
                        (if (equal key "none")
                            (setq no-keys t)
diff --git a/lisp/electric.el b/lisp/electric.el
index 905d4a87c7..0cf3a299cf 100644
--- a/lisp/electric.el
+++ b/lisp/electric.el
@@ -310,10 +310,16 @@ column specified by the function `current-left-margin'."
 
 ;;;###autoload
 (define-minor-mode electric-indent-mode
-  "Toggle on-the-fly reindentation (Electric Indent mode).
+  "Toggle on-the-fly reindentation of text lines (Electric Indent mode).
 
 When enabled, this reindents whenever the hook `electric-indent-functions'
-returns non-nil, or if you insert a character from `electric-indent-chars'.
+returns non-nil, or if you insert one of the \"electric characters\".
+The electric characters normally include the newline, but can
+also include other characters as needed by the major mode; see
+`electric-indent-chars' for the actual list.
+
+By \"reindent\" we mean remove any existing indentation, and then
+indent the line according to context and rules of the major mode.
 
 This is a global minor mode.  To toggle the mode in a single buffer,
 use `electric-indent-local-mode'."
@@ -614,7 +620,7 @@ This requotes when a quoting key is typed."
 (define-minor-mode electric-quote-mode
   "Toggle on-the-fly requoting (Electric Quote mode).
 
-When enabled, as you type this replaces \\=` with ‘, \\=' with ’,
+When enabled, as you type this replaces \\=` with \\=‘, \\=' with \\=’,
 \\=`\\=` with “, and \\='\\=' with ”.  This occurs only in comments, strings,
 and text paragraphs, and these are selectively controlled with
 `electric-quote-comment', `electric-quote-string', and
diff --git a/lisp/emacs-lisp/autoload.el b/lisp/emacs-lisp/autoload.el
index 1e4b2c14a0..eed88b6faf 100644
--- a/lisp/emacs-lisp/autoload.el
+++ b/lisp/emacs-lisp/autoload.el
@@ -28,36 +28,15 @@
 ;; Lisp source files in various useful ways.  To learn more, read the
 ;; source; if you're going to use this, you'd better be able to.
 
+;; The functions in this file have been largely superseded by
+;; loaddefs-gen.el.
+
 ;;; Code:
 
 (require 'lisp-mode)                   ;for `doc-string-elt' properties.
 (require 'lisp-mnt)
 (require 'cl-lib)
-
-(defvar generated-autoload-file nil
-  "File into which to write autoload definitions.
-A Lisp file can set this in its local variables section to make
-its autoloads go somewhere else.
-
-If this is a relative file name, the directory is determined as
-follows:
- - If a Lisp file defined `generated-autoload-file' as a
-   file-local variable, use its containing directory.
- - Otherwise use the \"lisp\" subdirectory of `source-directory'.
-
-The autoload file is assumed to contain a trailer starting with a
-FormFeed character.")
-;;;###autoload
-(put 'generated-autoload-file 'safe-local-variable 'stringp)
-
-(defvar generated-autoload-load-name nil
-  "Load name for `autoload' statements generated from autoload cookies.
-If nil, this defaults to the file name, sans extension.
-Typically, you need to set this when the directory containing the file
-is not in `load-path'.
-This also affects the generated cus-load.el file.")
-;;;###autoload
-(put 'generated-autoload-load-name 'safe-local-variable 'stringp)
+(require 'loaddefs-gen)
 
 ;; This feels like it should be a defconst, but MH-E sets it to
 ;; ";;;###mh-autoload" for the autoloads that are to go into mh-loaddefs.el.
@@ -112,165 +91,7 @@ then we use the timestamp of the output file instead.  As 
a result:
 
 (defvar autoload-modified-buffers)      ;Dynamically scoped var.
 
-(defun make-autoload (form file &optional expansion)
-  "Turn FORM into an autoload or defvar for source file FILE.
-Returns nil if FORM is not a special autoload form (i.e. a function definition
-or macro definition or a defcustom).
-If EXPANSION is non-nil, we're processing the macro expansion of an
-expression, in which case we want to handle forms differently."
-  (let ((car (car-safe form)) expand)
-    (cond
-     ((and expansion (eq car 'defalias))
-      (pcase-let*
-          ((`(,_ ,_ ,arg . ,rest) form)
-           ;; `type' is non-nil if it defines a macro.
-           ;; `fun' is the function part of `arg' (defaults to `arg').
-           ((or (and (or `(cons 'macro ,fun) `'(macro . ,fun)) (let type t))
-                (and (let fun arg) (let type nil)))
-            arg)
-           ;; `lam' is the lambda expression in `fun' (or nil if not
-           ;; recognized).
-           (lam (if (memq (car-safe fun) '(quote function)) (cadr fun)))
-           ;; `args' is the list of arguments (or t if not recognized).
-           ;; `body' is the body of `lam' (or t if not recognized).
-           ((or `(lambda ,args . ,body)
-                (and (let args t) (let body t)))
-            lam)
-           ;; Get the `doc' from `body' or `rest'.
-           (doc (cond ((stringp (car-safe body)) (car body))
-                      ((stringp (car-safe rest)) (car rest))))
-           ;; Look for an interactive spec.
-           (interactive (pcase body
-                          ((or `((interactive . ,iargs) . ,_)
-                               `(,_ (interactive . ,iargs) . ,_))
-                           ;; List of modes or just t.
-                           (if (nthcdr 1 iargs)
-                               (list 'quote (nthcdr 1 iargs))
-                             t)))))
-        ;; Add the usage form at the end where describe-function-1
-        ;; can recover it.
-        (when (consp args) (setq doc (help-add-fundoc-usage doc args)))
-        ;; (message "autoload of %S" (nth 1 form))
-        `(autoload ,(nth 1 form) ,file ,doc ,interactive ,type)))
-
-     ((and expansion (memq car '(progn prog1)))
-      (let ((end (memq :autoload-end form)))
-       (when end             ;Cut-off anything after the :autoload-end marker.
-          (setq form (copy-sequence form))
-          (setcdr (memq :autoload-end form) nil))
-        (let ((exps (delq nil (mapcar (lambda (form)
-                                        (make-autoload form file expansion))
-                                      (cdr form)))))
-          (when exps (cons 'progn exps)))))
-
-     ;; For complex cases, try again on the macro-expansion.
-     ((and (memq car '(easy-mmode-define-global-mode define-global-minor-mode
-                       define-globalized-minor-mode defun defmacro
-                      easy-mmode-define-minor-mode define-minor-mode
-                       define-inline cl-defun cl-defmacro cl-defgeneric
-                       cl-defstruct pcase-defmacro))
-           (macrop car)
-          (setq expand (let ((load-true-file-name file)
-                              (load-file-name file))
-                          (macroexpand form)))
-          (memq (car expand) '(progn prog1 defalias)))
-      (make-autoload expand file 'expansion)) ;Recurse on the expansion.
-
-     ;; For special function-like operators, use the `autoload' function.
-     ((memq car '(define-skeleton define-derived-mode
-                   define-compilation-mode define-generic-mode
-                  easy-mmode-define-global-mode define-global-minor-mode
-                  define-globalized-minor-mode
-                  easy-mmode-define-minor-mode define-minor-mode
-                  cl-defun defun* cl-defmacro defmacro*
-                   define-overloadable-function))
-      (let* ((macrop (memq car '(defmacro cl-defmacro defmacro*)))
-            (name (nth 1 form))
-            (args (pcase car
-                     ((or 'defun 'defmacro
-                          'defun* 'defmacro* 'cl-defun 'cl-defmacro
-                          'define-overloadable-function)
-                      (nth 2 form))
-                     ('define-skeleton '(&optional str arg))
-                     ((or 'define-generic-mode 'define-derived-mode
-                          'define-compilation-mode)
-                      nil)
-                     (_ t)))
-            (body (nthcdr (or (function-get car 'doc-string-elt) 3) form))
-            (doc (if (stringp (car body)) (pop body))))
-        ;; Add the usage form at the end where describe-function-1
-        ;; can recover it.
-       (when (listp args) (setq doc (help-add-fundoc-usage doc args)))
-        ;; `define-generic-mode' quotes the name, so take care of that
-        `(autoload ,(if (listp name) name (list 'quote name))
-           ,file ,doc
-           ,(or (and (memq car '(define-skeleton define-derived-mode
-                                  define-generic-mode
-                                  easy-mmode-define-global-mode
-                                  define-global-minor-mode
-                                  define-globalized-minor-mode
-                                  easy-mmode-define-minor-mode
-                                  define-minor-mode))
-                     t)
-                (and (eq (car-safe (car body)) 'interactive)
-                     ;; List of modes or just t.
-                     (or (if (nthcdr 1 (car body))
-                             (list 'quote (nthcdr 1 (car body)))
-                           t))))
-           ,(if macrop ''macro nil))))
-
-     ;; For defclass forms, use `eieio-defclass-autoload'.
-     ((eq car 'defclass)
-      (let ((name (nth 1 form))
-           (superclasses (nth 2 form))
-           (doc (nth 4 form)))
-       (list 'eieio-defclass-autoload (list 'quote name)
-             (list 'quote superclasses) file doc)))
-
-     ;; Convert defcustom to less space-consuming data.
-     ((eq car 'defcustom)
-      (let* ((varname (car-safe (cdr-safe form)))
-            (props (nthcdr 4 form))
-            (initializer (plist-get props :initialize))
-            (init (car-safe (cdr-safe (cdr-safe form))))
-            (doc (car-safe (cdr-safe (cdr-safe (cdr-safe form)))))
-            ;; (rest (cdr-safe (cdr-safe (cdr-safe (cdr-safe form)))))
-            )
-       `(progn
-          ,(if (not (member initializer '(nil 'custom-initialize-default
-                                          #'custom-initialize-default
-                                          'custom-initialize-reset
-                                          #'custom-initialize-reset)))
-               form
-             `(defvar ,varname ,init ,doc))
-          ;; When we include the complete `form', this `custom-autoload'
-           ;; is not indispensable, but it still helps in case the `defcustom'
-           ;; doesn't specify its group explicitly, and probably in a few other
-           ;; corner cases.
-          (custom-autoload ',varname ,file
-                            ,(condition-case nil
-                                 (null (plist-get props :set))
-                               (error nil)))
-           ;; Propagate the :safe property to the loaddefs file.
-           ,@(when-let ((safe (plist-get props :safe)))
-               `((put ',varname 'safe-local-variable ,safe))))))
-
-     ((eq car 'defgroup)
-      ;; In Emacs this is normally handled separately by cus-dep.el, but for
-      ;; third party packages, it can be convenient to explicitly autoload
-      ;; a group.
-      (let ((groupname (nth 1 form)))
-        `(let ((loads (get ',groupname 'custom-loads)))
-           (if (member ',file loads) nil
-             (put ',groupname 'custom-loads (cons ',file loads))))))
-
-     ;; When processing a macro expansion, any expression
-     ;; before a :autoload-end should be included.  These are typically (put
-     ;; 'fun 'prop val) and things like that.
-     ((and expansion (consp form)) form)
-
-     ;; nil here indicates that this is not a special autoload form.
-     (t nil))))
+(defalias 'make-autoload #'loaddefs-generate--make-autoload)
 
 ;; Forms which have doc-strings which should be printed specially.
 ;; A doc-string-elt property of ELT says that (nth ELT FORM) is
@@ -379,41 +200,7 @@ put the output in."
              (print-escape-nonascii t))
          (print form outbuf)))))))
 
-(defun autoload-rubric (file &optional type feature)
-  "Return a string giving the appropriate autoload rubric for FILE.
-TYPE (default \"autoloads\") is a string stating the type of
-information contained in FILE.  TYPE \"package\" acts like the default,
-but adds an extra line to the output to modify `load-path'.
-
-If FEATURE is non-nil, FILE will provide a feature.  FEATURE may
-be a string naming the feature, otherwise it will be based on
-FILE's name."
-  (let ((basename (file-name-nondirectory file))
-       (lp (if (equal type "package") (setq type "autoloads"))))
-    (concat ";;; " basename
-            " --- automatically extracted " (or type "autoloads")
-            "  -*- lexical-binding: t -*-\n"
-            (when (string-match "/lisp/loaddefs\\.el\\'" file)
-              ";; This file will be copied to ldefs-boot.el and checked in 
periodically.\n")
-           ";;\n"
-           ";;; Code:\n\n"
-           (if lp
-               "(add-to-list 'load-path (directory-file-name
-                         (or (file-name-directory #$) (car load-path))))\n\n")
-           "\n"
-           ;; This is used outside of autoload.el, eg cus-dep, finder.
-           (if feature
-               (format "(provide '%s)\n"
-                       (if (stringp feature) feature
-                         (file-name-sans-extension basename))))
-           ";; Local Variables:\n"
-           ";; version-control: never\n"
-            ";; no-byte-compile: t\n" ;; #$ is byte-compiled into nil.
-           ";; no-update-autoloads: t\n"
-           ";; coding: utf-8-emacs-unix\n"
-           ";; End:\n"
-           ";;; " basename
-           " ends here\n")))
+(defalias 'autoload-rubric #'loaddefs-generate--rubric)
 
 (defvar autoload-ensure-writable nil
   "Non-nil means `autoload-find-generated-file' makes existing file writable.")
@@ -480,35 +267,13 @@ if `autoload-timestamps' is non-nil, otherwise a fixed 
fake time is inserted)."
       (hack-local-variables))
     (current-buffer)))
 
+(defalias 'autoload-insert-section-header
+  #'loaddefs-generate--insert-section-header)
+
 (defvar no-update-autoloads nil
   "File local variable to prevent scanning this file for autoload cookies.")
 
-(defun autoload-file-load-name (file outfile)
-  "Compute the name that will be used to load FILE.
-OUTFILE should be the name of the global loaddefs.el file, which
-is expected to be at the root directory of the files we are
-scanning for autoloads and will be in the `load-path'."
-  (let* ((name (file-relative-name file (file-name-directory outfile)))
-         (names '())
-         (dir (file-name-directory outfile)))
-    ;; If `name' has directory components, only keep the
-    ;; last few that are really needed.
-    (while name
-      (setq name (directory-file-name name))
-      (push (file-name-nondirectory name) names)
-      (setq name (file-name-directory name)))
-    (while (not name)
-      (cond
-       ((null (cdr names)) (setq name (car names)))
-       ((file-exists-p (expand-file-name "subdirs.el" dir))
-        ;; FIXME: here we only check the existence of subdirs.el,
-        ;; without checking its content.  This makes it generate wrong load
-        ;; names for cases like lisp/term which is not added to load-path.
-        (setq dir (expand-file-name (pop names) dir)))
-       (t (setq name (mapconcat #'identity names "/")))))
-    (if (string-match "\\.elc?\\(\\.\\|\\'\\)" name)
-        (substring name 0 (match-beginning 0))
-      name)))
+(defalias 'autoload-file-load-name #'loaddefs-generate--file-load-name)
 
 (defun generate-file-autoloads (file)
   "Insert at point a loaddefs autoload section for FILE.
@@ -522,13 +287,6 @@ Return non-nil in the case where no autoloads were added 
at point."
     (autoload-generate-file-autoloads file (current-buffer) buffer-file-name)
     autoload-modified-buffers))
 
-(defvar autoload-compute-prefixes t
-  "If non-nil, autoload will add code to register the prefixes used in a file.
-Standard prefixes won't be registered anyway.  I.e. if a file \"foo.el\" 
defines
-variables or functions that use \"foo-\" as prefix, that will not be 
registered.
-But all other prefixes will be included.")
-(put 'autoload-compute-prefixes 'safe #'booleanp)
-
 (defconst autoload-def-prefixes-max-entries 5
   "Target length of the list of definition prefixes per file.
 If set too small, the prefixes will be too generic (i.e. they'll use little
@@ -540,102 +298,7 @@ cost more memory use).")
   "Target size of definition prefixes.
 Don't try to split prefixes that are already longer than that.")
 
-(require 'radix-tree)
-
-(defun autoload--make-defs-autoload (defs file)
-
-  ;; Remove the defs that obey the rule that file foo.el (or
-  ;; foo-mode.el) uses "foo-" as prefix.
-  ;; FIXME: help--symbol-completion-table still doesn't know how to use
-  ;; the rule that file foo.el (or foo-mode.el) uses "foo-" as prefix.
-  ;;(let ((prefix
-  ;;       (concat (substring file 0 (string-match "-mode\\'" file)) "-")))
-  ;;  (dolist (def (prog1 defs (setq defs nil)))
-  ;;    (unless (string-prefix-p prefix def)
-  ;;      (push def defs))))
-
-  ;; Then compute a small set of prefixes that cover all the
-  ;; remaining definitions.
-  (let* ((tree (let ((tree radix-tree-empty))
-                 (dolist (def defs)
-                   (setq tree (radix-tree-insert tree def t)))
-                 tree))
-         (prefixes nil))
-    ;; Get the root prefixes, that we should include in any case.
-    (radix-tree-iter-subtrees
-     tree (lambda (prefix subtree)
-            (push (cons prefix subtree) prefixes)))
-    ;; In some cases, the root prefixes are too short, e.g. if you define
-    ;; "cc-helper" and "c-mode", you'll get "c" in the root prefixes.
-    (dolist (pair (prog1 prefixes (setq prefixes nil)))
-      (let ((s (car pair)))
-        (if (or (and (> (length s) 2)   ; Long enough!
-                     ;; But don't use "def" from deffoo-pkg-thing.
-                     (not (string= "def" s)))
-                (string-match ".[[:punct:]]\\'" s) ;A real (tho short) prefix?
-                (radix-tree-lookup (cdr pair) "")) ;Nothing to expand!
-            (push pair prefixes) ;Keep it as is.
-          (radix-tree-iter-subtrees
-           (cdr pair) (lambda (prefix subtree)
-                        (push (cons (concat s prefix) subtree) prefixes))))))
-    ;; FIXME: The expansions done below are mostly pointless, such as
-    ;; for `yenc', where we replace "yenc-" with an exhaustive list (5
-    ;; elements).
-    ;; (while
-    ;;     (let ((newprefixes nil)
-    ;;           (changes nil))
-    ;;       (dolist (pair prefixes)
-    ;;         (let ((prefix (car pair)))
-    ;;           (if (or (> (length prefix) autoload-def-prefixes-max-length)
-    ;;                   (radix-tree-lookup (cdr pair) ""))
-    ;;               ;; No point splitting it any further.
-    ;;               (push pair newprefixes)
-    ;;             (setq changes t)
-    ;;             (radix-tree-iter-subtrees
-    ;;              (cdr pair) (lambda (sprefix subtree)
-    ;;                           (push (cons (concat prefix sprefix) subtree)
-    ;;                                 newprefixes))))))
-    ;;       (and changes
-    ;;            (<= (length newprefixes)
-    ;;                autoload-def-prefixes-max-entries)
-    ;;            (let ((new nil)
-    ;;                  (old nil))
-    ;;              (dolist (pair prefixes)
-    ;;                (unless (memq pair newprefixes) ;Not old
-    ;;                  (push pair old)))
-    ;;              (dolist (pair newprefixes)
-    ;;                (unless (memq pair prefixes) ;Not new
-    ;;                  (push pair new)))
-    ;;              (cl-assert new)
-    ;;              (message "Expanding %S to %S"
-    ;;                       (mapcar #'car old) (mapcar #'car new))
-    ;;              t)
-    ;;            (setq prefixes newprefixes)
-    ;;            (< (length prefixes) autoload-def-prefixes-max-entries))))
-
-    ;; (message "Final prefixes %s : %S" file (mapcar #'car prefixes))
-    (when prefixes
-      (let ((strings
-             (mapcar
-              (lambda (x)
-                (let ((prefix (car x)))
-                  (if (or (> (length prefix) 2) ;Long enough!
-                          (and (eq (length prefix) 2)
-                               (string-match "[[:punct:]]" prefix)))
-                      prefix
-                    ;; Some packages really don't follow the rules.
-                    ;; Drop the most egregious cases such as the
-                    ;; one-letter prefixes.
-                    (let ((dropped ()))
-                      (radix-tree-iter-mappings
-                       (cdr x) (lambda (s _)
-                                 (push (concat prefix s) dropped)))
-                      (message "%s:0: Warning: Not registering prefix \"%s\".  
Affects: %S"
-                               file prefix dropped)
-                      nil))))
-              prefixes)))
-        `(register-definition-prefixes ,file ',(sort (delq nil strings)
-                                                    'string<))))))
+(defalias 'autoload--make-defs-autoload #'loaddefs-generate--make-prefixes)
 
 (defun autoload--setup-output (otherbuf outbuf absfile load-name output-file)
   (let ((outbuf
@@ -687,21 +350,6 @@ Don't try to split prefixes that are already longer than 
that.")
 
 (defvar autoload-builtin-package-versions nil)
 
-(defvar autoload-ignored-definitions
-  '("define-obsolete-function-alias"
-    "define-obsolete-variable-alias"
-    "define-category" "define-key"
-    "defgroup" "defface" "defadvice"
-    "def-edebug-spec"
-    ;; Hmm... this is getting ugly:
-    "define-widget"
-    "define-erc-module"
-    "define-erc-response-handler"
-    "defun-rcirc-command")
-  "List of strings naming definitions to ignore for prefixes.
-More specifically those definitions will not be considered for the
-`register-definition-prefixes' call.")
-
 (defun autoload-generate-file-autoloads (file &optional outbuf outfile)
   "Insert an autoload section for FILE in the appropriate buffer.
 Autoloads are generated for defuns and defmacros in FILE
diff --git a/lisp/emacs-lisp/bindat.el b/lisp/emacs-lisp/bindat.el
index c6d64975ec..9ba89a5e3f 100644
--- a/lisp/emacs-lisp/bindat.el
+++ b/lisp/emacs-lisp/bindat.el
@@ -77,7 +77,7 @@
 ;;    (bindat-type
 ;;      (type      u8)
 ;;     (opcode    u8)
-;;     (length    uintr 32)  ;; little endian order
+;;     (length    uint 32 t)  ;; little endian order
 ;;     (id        strz 8)
 ;;     (data      vec length)
 ;;     (_         align 4)))
@@ -165,12 +165,12 @@
     (if (stringp s) s
       (apply #'unibyte-string s))))
 
-(defun bindat--unpack-strz (len)
+(defun bindat--unpack-strz (&optional len)
   (let ((i 0) s)
     (while (and (if len (< i len) t) (/= (aref bindat-raw (+ bindat-idx i)) 0))
       (setq i (1+ i)))
     (setq s (substring bindat-raw bindat-idx (+ bindat-idx i)))
-    (setq bindat-idx (+ bindat-idx len))
+    (setq bindat-idx (+ bindat-idx (or len (1+ i))))
     (if (stringp s) s
       (apply #'unibyte-string s))))
 
@@ -320,72 +320,72 @@ e.g. corresponding to STRUCT.FIELD1[INDEX2].FIELD3..."
 (defun bindat--length-group (struct spec)
   (if (cl-typep spec 'bindat--type)
       (funcall (bindat--type-le spec) struct)
-  (with-suppressed-warnings ((lexical struct last))
-    (defvar struct) (defvar last))
-  (let ((struct struct) last)
-    (dolist (item spec)
-      (let* ((field (car item))
-            (type (nth 1 item))
-            (len (nth 2 item))
-            (vectype (and (eq type 'vec) (nth 3 item)))
-            (tail 3))
-       (if (and type (consp type) (eq (car type) 'eval))
-           (setq type (eval (car (cdr type)) t)))
-       (if (and len (consp len) (eq (car len) 'eval))
-           (setq len (eval (car (cdr len)) t)))
-       (if (memq field '(eval fill align struct union))
-           (setq tail 2
-                 len type
-                 type field
-                 field nil))
-       (if (and (consp field) (eq (car field) 'eval))
-           (setq field (eval (car (cdr field)) t)))
-       (if (and (consp len) (not (eq type 'eval)))
-           (setq len (apply #'bindat-get-field struct len)))
-       (if (not len)
-           (setq len 1))
-       (while (eq type 'vec)
-         (if (consp vectype)
-             (setq len (* len (nth 1 vectype))
-                   type (nth 2 vectype))
-           (setq type (or vectype 'u8)
-                 vectype nil)))
-       (pcase type
-        ('eval
-         (if field
-             (setq struct (cons (cons field (eval len t)) struct))
-           (eval len t)))
-        ('fill
-         (setq bindat-idx (+ bindat-idx len)))
-        ('align
-         (setq bindat-idx (bindat--align bindat-idx len)))
-        ('struct
-         (bindat--length-group
-          (if field (bindat-get-field struct field) struct) (eval len t)))
-        ('repeat
-         (dotimes (index len)
-           (bindat--length-group
-             (nth index (bindat-get-field struct field))
-             (nthcdr tail item))))
-        ('union
-         (with-suppressed-warnings ((lexical tag))
-           (defvar tag))
-         (let ((tag len) (cases (nthcdr tail item)) case cc)
-           (while cases
-             (setq case (car cases)
-                   cases (cdr cases)
-                   cc (car case))
-             (if (or (equal cc tag) (equal cc t)
-                     (and (consp cc) (eval cc t)))
-                 (progn
-                   (bindat--length-group struct (cdr case))
-                   (setq cases nil))))))
-        (_
-         (if (setq type (assq type bindat--fixed-length-alist))
-             (setq len (* len (cdr type))))
-         (if field
-             (setq last (bindat-get-field struct field)))
-         (setq bindat-idx (+ bindat-idx len)))))))))
+    (with-suppressed-warnings ((lexical struct last))
+      (defvar struct) (defvar last))
+    (let ((struct struct) last)
+      (dolist (item spec)
+        (let* ((field (car item))
+               (type (nth 1 item))
+               (len (nth 2 item))
+               (vectype (and (eq type 'vec) (nth 3 item)))
+               (tail 3))
+          (if (and type (consp type) (eq (car type) 'eval))
+              (setq type (eval (car (cdr type)) t)))
+          (if (and len (consp len) (eq (car len) 'eval))
+              (setq len (eval (car (cdr len)) t)))
+          (if (memq field '(eval fill align struct union))
+              (setq tail 2
+                    len type
+                    type field
+                    field nil))
+          (if (and (consp field) (eq (car field) 'eval))
+              (setq field (eval (car (cdr field)) t)))
+          (if (and (consp len) (not (eq type 'eval)))
+              (setq len (apply #'bindat-get-field struct len)))
+          (if (not len)
+              (setq len 1))
+          (while (eq type 'vec)
+            (if (consp vectype)
+                (setq len (* len (nth 1 vectype))
+                      type (nth 2 vectype))
+              (setq type (or vectype 'u8)
+                    vectype nil)))
+          (pcase type
+            ('eval
+             (if field
+                 (setq struct (cons (cons field (eval len t)) struct))
+               (eval len t)))
+            ('fill
+             (setq bindat-idx (+ bindat-idx len)))
+            ('align
+             (setq bindat-idx (bindat--align bindat-idx len)))
+            ('struct
+             (bindat--length-group
+              (if field (bindat-get-field struct field) struct) (eval len t)))
+            ('repeat
+             (dotimes (index len)
+               (bindat--length-group
+                (nth index (bindat-get-field struct field))
+                (nthcdr tail item))))
+            ('union
+             (with-suppressed-warnings ((lexical tag))
+               (defvar tag))
+             (let ((tag len) (cases (nthcdr tail item)) case cc)
+               (while cases
+                 (setq case (car cases)
+                       cases (cdr cases)
+                       cc (car case))
+                 (if (or (equal cc tag) (equal cc t)
+                         (and (consp cc) (eval cc t)))
+                     (progn
+                       (bindat--length-group struct (cdr case))
+                       (setq cases nil))))))
+            (_
+             (if (setq type (assq type bindat--fixed-length-alist))
+                 (setq len (* len (cdr type))))
+             (if field
+                 (setq last (bindat-get-field struct field)))
+             (setq bindat-idx (+ bindat-idx len)))))))))
 
 (defun bindat-length (spec struct)
   "Calculate `bindat-raw' length for STRUCT according to bindat SPEC."
@@ -435,13 +435,20 @@ e.g. corresponding to STRUCT.FIELD1[INDEX2].FIELD3..."
   (bindat--pack-u32r (ash v -32)))
 
 (defun bindat--pack-str (len v)
-  (dotimes (i (min len (length v)))
-    (aset bindat-raw (+ bindat-idx i) (aref v i)))
-  (setq bindat-idx (+ bindat-idx len)))
+  (let ((v (string-to-unibyte v)))
+    (dotimes (i (min len (length v)))
+      (aset bindat-raw (+ bindat-idx i) (aref v i)))
+    (setq bindat-idx (+ bindat-idx len))))
 
 (defun bindat--pack-strz (v)
-  (let ((len (length v)))
+  (let* ((v (string-to-unibyte v))
+         (len (length v)))
     (dotimes (i len)
+      (when (= (aref v i) 0)
+        ;; Alternatively we could pretend that this was the end of
+        ;; the string and stop packing, but then bindat-length would
+        ;; need to scan the input string looking for a null byte.
+        (error "Null byte encountered in input strz string"))
       (aset bindat-raw (+ bindat-idx i) (aref v i)))
     (setq bindat-idx (+ bindat-idx len 1))))
 
@@ -663,19 +670,15 @@ is the name of a variable that will hold the value we 
need to pack.")
     (`(length . ,_) `(cl-incf bindat-idx 1))
     (`(pack . ,args) `(bindat--pack-u8 . ,args))))
 
-(cl-defmethod bindat--type (op (_ (eql 'uint))  n)
+(cl-defmethod bindat--type (op (_ (eql 'uint))  n &optional le)
   (if (eq n 8) (bindat--type op 'byte)
     (bindat--pcase op
-      ('unpack `(bindat--unpack-uint ,n))
-      (`(length . ,_) `(cl-incf bindat-idx (/ ,n 8)))
-      (`(pack . ,args) `(bindat--pack-uint ,n . ,args)))))
-
-(cl-defmethod bindat--type (op (_ (eql 'uintr)) n)
-  (if (eq n 8) (bindat--type op 'byte)
-    (bindat--pcase op
-      ('unpack `(bindat--unpack-uintr ,n))
+      ('unpack
+       `(if ,le (bindat--unpack-uintr ,n) (bindat--unpack-uint ,n)))
       (`(length . ,_) `(cl-incf bindat-idx (/ ,n 8)))
-      (`(pack . ,args) `(bindat--pack-uintr ,n . ,args)))))
+      (`(pack . ,args)
+       `(if ,le (bindat--pack-uintr ,n . ,args)
+          (bindat--pack-uint ,n . ,args))))))
 
 (cl-defmethod bindat--type (op (_ (eql 'str))   len)
   (bindat--pcase op
@@ -688,18 +691,23 @@ is the name of a variable that will hold the value we 
need to pack.")
     ('unpack `(bindat--unpack-strz ,len))
     (`(length ,val)
      `(cl-incf bindat-idx ,(cond
-                            ((null len) `(length ,val))
+                            ;; Optimizations if len is a literal number or nil.
+                            ((null len) `(1+ (length ,val)))
                             ((numberp len) len)
-                            (t `(or ,len (length ,val))))))
+                            ;; General expression support.
+                            (t `(or ,len (1+ (length ,val)))))))
     (`(pack . ,args)
-     (macroexp-let2 nil len len
-       `(if ,len
-            ;; Same as non-zero terminated strings since we don't actually add
-            ;; the terminating zero anyway (because we rely on the fact that
-            ;; `bindat-raw' was presumably initialized with all-zeroes before
-            ;; we started).
-            (bindat--pack-str ,len . ,args)
-          (bindat--pack-strz . ,args))))))
+     ;; When len is specified, behave the same as the str type since we don't
+     ;; actually add the terminating zero anyway (because we rely on the fact
+     ;; that `bindat-raw' was presumably initialized with all-zeroes before we
+     ;; started).
+     (cond ; Same optimizations as 'length above.
+      ((null len) `(bindat--pack-strz . ,args))
+      ((numberp len) `(bindat--pack-str ,len . ,args))
+      (t (macroexp-let2 nil len len
+           `(if ,len
+                (bindat--pack-str ,len . ,args)
+              (bindat--pack-strz . ,args))))))))
 
 (cl-defmethod bindat--type (op (_ (eql 'bits))  len)
   (bindat--pcase op
@@ -824,7 +832,7 @@ is the name of a variable that will hold the value we need 
to pack.")
     &optional ":unpack-val" def-form))
 
 (def-edebug-elem-spec 'bindat-type
-  '(&or ["uint" def-form]
+  '(&or ["uint" def-form &optional def-form]
         ["uintr" def-form]
         ["str" def-form]
         ["strz" &optional def-form]
@@ -844,8 +852,7 @@ is the name of a variable that will hold the value we need 
to pack.")
   "Return the Bindat type value to pack&unpack TYPE.
 TYPE is a Bindat type expression.  It can take the following forms:
 
-  uint BITLEN          - Big-endian unsigned integer
-  uintr BITLEN         - Little-endian unsigned integer
+  uint BITLEN [LE]     - unsigned integer (big-endian if LE is nil)
   str LEN              - Byte string
   strz [LEN]           - Zero-terminated byte-string
   bits LEN             - Bit vector (LEN is counted in bytes)
@@ -872,7 +879,7 @@ controlled in the following way:
 - If the list of fields is preceded with `:pack-var VAR' then the object to
   be packed is bound to VAR when evaluating the EXPs of `:pack-val'.
 
-All the above BITLEN, LEN, COUNT, and EXP are ELisp expressions evaluated
+All the above BITLEN, LEN, LE, COUNT, and EXP are ELisp expressions evaluated
 in the current lexical context extended with the previous fields.
 
 TYPE can additionally be one of the Bindat type macros defined with
@@ -886,7 +893,7 @@ a bindat type expression."
                    :pe ,(bindat--toplevel 'pack   type))))
 
 (eval-and-compile
-  (defconst bindat--primitives '(byte uint uintr str strz bits fill align
+  (defconst bindat--primitives '(byte uint str strz bits fill align
                                  struct type vec unit)))
 
 (eval-and-compile
@@ -930,9 +937,9 @@ a bindat type expression."
         (if ud (help-add-fundoc-usage combined-doc (car ud)) combined-doc)))))
 
 (bindat-defmacro u8 () "Unsigned 8bit integer." '(byte))
-(bindat-defmacro sint (bitlen r)
+(bindat-defmacro sint (bitlen le)
   "Signed integer of size BITLEN.
-Bigendian if R is nil and little endian if not."
+Big-endian if LE is nil and little-endian if not."
   (let ((bl (make-symbol "bitlen"))
         (max (make-symbol "max"))
         (wrap (make-symbol "wrap")))
@@ -940,10 +947,14 @@ Bigendian if R is nil and little endian if not."
             (,max (ash 1 (1- ,bl)))
             (,wrap (+ ,max ,max)))
        (struct :pack-var v
-               (n if ,r (uintr ,bl) (uint ,bl)
+               (n uint ,bl ,le
                   :pack-val (if (< v 0) (+ v ,wrap) v))
                :unpack-val (if (>= n ,max) (- n ,wrap) n)))))
 
+(bindat-defmacro uintr (bitlen)
+  "(deprecated since Emacs-29) Little-endian unsigned integer."
+  `(uint ,bitlen t))
+
 (bindat-defmacro repeat (count &rest type)
   "Like `vec', but unpacks to a list rather than a vector."
   `(:pack-var v
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index d3d8405d06..fc49e88f8e 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -422,7 +422,7 @@ for speeding up processing.")
                               (byte-optimize-body (cdr clause) for-effect))))
                     clauses)))
 
-      (`(unwind-protect ,exp . ,exps)
+      (`(unwind-protect ,exp :fun-body ,f)
        ;; The unwinding part of an unwind-protect is compiled (and thus
        ;; optimized) as a top-level form, but run the optimizer for it here
        ;; anyway for lexical variable usage and substitution.  But the
@@ -430,13 +430,7 @@ for speeding up processing.")
        ;; unwind-protect itself.  (The unwinding part is always for effect,
        ;; but that isn't handled properly yet.)
        (let ((bodyform (byte-optimize-form exp for-effect)))
-         (pcase exps
-           (`(:fun-body ,f)
-            `(,fn ,bodyform
-               :fun-body ,(byte-optimize-form f nil)))
-           (_
-            `(,fn ,bodyform
-               . ,(byte-optimize-body exps t))))))
+         `(,fn ,bodyform :fun-body ,(byte-optimize-form f nil))))
 
       (`(catch ,tag . ,exps)
        `(,fn ,(byte-optimize-form tag nil)
@@ -463,32 +457,21 @@ for speeding up processing.")
       ;; is a *value* and shouldn't appear in the car.
       (`((closure . ,_) . ,_) form)
 
-      (`(setq . ,args)
-       (let ((var-expr-list nil))
-         (while args
-           (unless (and (consp args)
-                        (symbolp (car args)) (consp (cdr args)))
-             (byte-compile-warn-x form "malformed setq form: %S" form))
-           (let* ((var (car args))
-                  (expr (cadr args))
-                  (lexvar (assq var byte-optimize--lexvars))
-                  (value (byte-optimize-form expr nil)))
-             (when lexvar
-               (setcar (cdr lexvar) t)    ; Mark variable to be kept.
-               (setcdr (cdr lexvar) nil)  ; Inhibit further substitution.
-
-               (when (memq var byte-optimize--aliased-vars)
-                 ;; Cancel aliasing of variables aliased to this one.
-                 (dolist (v byte-optimize--lexvars)
-                   (when (eq (nth 2 v) var)
-                     ;; V is bound to VAR but VAR is now mutated:
-                     ;; cancel aliasing.
-                     (setcdr (cdr v) nil)))))
-
-             (push var var-expr-list)
-             (push value var-expr-list))
-           (setq args (cddr args)))
-         (cons fn (nreverse var-expr-list))))
+      (`(setq ,var ,expr)
+       (let ((lexvar (assq var byte-optimize--lexvars))
+             (value (byte-optimize-form expr nil)))
+         (when lexvar
+           (setcar (cdr lexvar) t)    ; Mark variable to be kept.
+           (setcdr (cdr lexvar) nil)  ; Inhibit further substitution.
+
+           (when (memq var byte-optimize--aliased-vars)
+             ;; Cancel aliasing of variables aliased to this one.
+             (dolist (v byte-optimize--lexvars)
+               (when (eq (nth 2 v) var)
+                 ;; V is bound to VAR but VAR is now mutated:
+                 ;; cancel aliasing.
+                 (setcdr (cdr v) nil)))))
+         `(,fn ,var ,value)))
 
       (`(defvar ,(and (pred symbolp) name) . ,rest)
        (let ((optimized-rest (and rest
@@ -706,13 +689,8 @@ for speeding up processing.")
     (let ((byte-optimize--lexvars nil))
       (cons
        (mapcar (lambda (binding)
-                (if (symbolp binding)
-                    binding
-                  (when (or (atom binding) (cddr binding))
-                    (byte-compile-warn-x
-                      binding "malformed let binding: `%S'" binding))
-                  (list (car binding)
-                        (byte-optimize-form (nth 1 binding) nil))))
+                (list (car binding)
+                      (byte-optimize-form (nth 1 binding) nil)))
               (car form))
        (byte-optimize-body (cdr form) for-effect)))))
 
@@ -1264,28 +1242,17 @@ See Info node `(elisp) Integer Basics'."
     ;; Body is empty or just contains a constant.
     (`(,head ,bindings . ,(or '() `(,(and const (pred macroexp-const-p)))))
      (if (eq head 'let)
-         `(progn ,@(mapcar (lambda (binding)
-                             (and (consp binding) (cadr binding)))
-                           bindings)
-                 ,const)
-       `(,head ,(butlast bindings)
-          ,@(and (consp (car (last bindings)))
-                 (cdar (last bindings)))
-          ,const)))
+         `(progn ,@(mapcar #'cadr bindings) ,const)
+       `(,head ,(butlast bindings) ,(cadar (last bindings)) ,const)))
 
     ;; Body is last variable.
     (`(,head ,(and bindings
-                   (let last-var (let ((last (car (last bindings))))
-                                   (if (consp last) (car last) last))))
+                   (let last-var (caar (last bindings))))
              ,(and last-var             ; non-linear pattern
                    (pred symbolp) (pred (not keywordp)) (pred (not booleanp))))
      (if (eq head 'let)
-         `(progn ,@(mapcar (lambda (binding)
-                             (and (consp binding) (cadr binding)))
-                           bindings))
-       `(,head ,(butlast bindings)
-          ,@(and (consp (car (last bindings)))
-                 (cdar (last bindings))))))
+         `(progn ,@(mapcar #'cadr bindings))
+       `(,head ,(butlast bindings) ,(cadar (last bindings)))))
 
     (_ form)))
 
@@ -1368,7 +1335,7 @@ See Info node `(elisp) Integer Basics'."
         buffer-substring byte-code-function-p
         capitalize car-less-than-car car cdr ceiling char-after char-before
         char-equal char-to-string char-width compare-strings
-        compare-window-configurations concat coordinates-in-window-p
+        window-configuration-equal-p concat coordinates-in-window-p
         copy-alist copy-sequence copy-marker copysign cos count-lines
         current-time-string current-time-zone
         decode-char
diff --git a/lisp/emacs-lisp/byte-run.el b/lisp/emacs-lisp/byte-run.el
index 0113051c8e..92c2699c6e 100644
--- a/lisp/emacs-lisp/byte-run.el
+++ b/lisp/emacs-lisp/byte-run.el
@@ -534,7 +534,7 @@ made obsolete, for example a date or a release number.
 This macro evaluates all its parameters, and both OBSOLETE-NAME
 and CURRENT-NAME should be symbols, so a typical usage would look like:
 
-  (define-obsolete-variable-alias 'foo-thing 'bar-thing \"28.1\")
+  (define-obsolete-variable-alias \\='foo-thing \\='bar-thing \"28.1\")
 
 This macro uses `defvaralias' and `make-obsolete-variable' (which see).
 See the Info node `(elisp)Variable Aliases' for more details.
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index c0dffe544c..d28ec0be16 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -325,7 +325,8 @@ Elements of the list may be:
   constants   let-binding of, or assignment to, constants/nonvariables.
   docstrings  docstrings that are too wide (longer than
               `byte-compile-docstring-max-column' or
-              `fill-column' characters, whichever is bigger).
+              `fill-column' characters, whichever is bigger) or
+              have other stylistic issues.
   suspicious  constructs that usually don't do what the coder wanted.
 
 If the list begins with `not', then the remaining elements specify warnings to
@@ -1056,8 +1057,14 @@ Each function's symbol gets added to 
`byte-compile-noruntime-functions'."
                (dolist (s xs)
                  (pcase s
                    (`(defun . ,f)
-                    (unless (seq-some #'autoloadp
-                                      (get (cdr s) 'function-history))
+                    ;; If `f' has a history, it's presumably because
+                    ;; it was already defined beforehand (typically
+                    ;; as an autoload).  It could also be because it
+                    ;; was defined twice during `form', in which case
+                    ;; we arguably should add it to b-c-noruntime-functions,
+                     ;; but it's not clear it's worth the trouble
+                    ;; trying to recognize that case.
+                    (unless (get f 'function-history)
                        (push f byte-compile-noruntime-functions)))))))))))))
 
 (defun byte-compile-eval-before-compile (form)
@@ -1174,39 +1181,34 @@ message buffer `default-directory'."
     (if (< (length f2) (length f1)) f2 f1)))
 
 (defun byte-compile--first-symbol-with-pos (form)
-  "Return the \"first\" symbol with position found in form, or 0 if none.
-Here, \"first\" is by a depth first search."
-  (let (sym)
-    (cond
-     ((symbol-with-pos-p form) form)
-     ((consp form)
-      (or (and (symbol-with-pos-p (setq sym 
(byte-compile--first-symbol-with-pos (car form))))
-               sym)
-          (and (symbolp (setq sym (byte-compile--first-symbol-with-pos (cdr 
form))))
-               sym)
-          0))
-     ((and (or (vectorp form) (recordp form))
-           (> (length form) 0))
-      (let ((i 0)
-            (len (length form))
-            elt)
-        (catch 'sym
-          (while (< i len)
-            (when (symbol-with-pos-p
-                   (setq elt (byte-compile--first-symbol-with-pos (aref form 
i))))
-              (throw 'sym elt))
-            (setq i (1+ i)))
-          0)))
-     (t 0))))
+  "Return the first symbol with position in form, or nil if none.
+Order is by depth-first search."
+  (cond
+   ((symbol-with-pos-p form) form)
+   ((consp form)
+    (or (byte-compile--first-symbol-with-pos (car form))
+        (let ((sym nil))
+          (setq form (cdr form))
+          (while (and (consp form)
+                      (not (setq sym (byte-compile--first-symbol-with-pos
+                                      (car form)))))
+            (setq form (cdr form)))
+          (or sym
+              (and form (byte-compile--first-symbol-with-pos form))))))
+   ((or (vectorp form) (recordp form))
+    (let ((len (length form))
+          (i 0)
+          (sym nil))
+      (while (and (< i len)
+                  (not (setq sym (byte-compile--first-symbol-with-pos
+                                  (aref form i)))))
+        (setq i (1+ i)))
+      sym))))
 
 (defun byte-compile--warning-source-offset ()
-  "Return a source offset from `byte-compile-form-stack'.
-Return nil if such is not found."
-  (catch 'offset
-    (dolist (form byte-compile-form-stack)
-      (let ((s (byte-compile--first-symbol-with-pos form)))
-        (if (symbol-with-pos-p s)
-            (throw 'offset (symbol-with-pos-pos s)))))))
+  "Return a source offset from `byte-compile-form-stack' or nil if none."
+  (let ((sym (byte-compile--first-symbol-with-pos byte-compile-form-stack)))
+    (and sym (symbol-with-pos-pos sym))))
 
 ;; This is used as warning-prefix for the compiler.
 ;; It is always called with the warnings buffer current.
@@ -1488,15 +1490,16 @@ when printing the error message."
                 byte-compile-unresolved-functions)))))
 
 (defun byte-compile-emit-callargs-warn (name actual-args min-args max-args)
-  (byte-compile-warn-x
-   name
-   "%s called with %d argument%s, but %s %s"
-   name actual-args
-   (if (= 1 actual-args) "" "s")
-   (if (< actual-args min-args)
-       "requires"
-     "accepts only")
-   (byte-compile-arglist-signature-string (cons min-args max-args))))
+  (when (byte-compile-warning-enabled-p 'callargs name)
+    (byte-compile-warn-x
+     name
+     "`%s' called with %d argument%s, but %s %s"
+     name actual-args
+     (if (= 1 actual-args) "" "s")
+     (if (< actual-args min-args)
+         "requires"
+       "accepts only")
+     (byte-compile-arglist-signature-string (cons min-args max-args)))))
 
 (defun byte-compile--check-arity-bytecode (form bytecode)
   "Check that the call in FORM matches that allowed by BYTECODE."
@@ -1562,15 +1565,39 @@ extra args."
 (dolist (elt '(format message error))
   (put elt 'byte-compile-format-like t))
 
+(defun byte-compile--suspicious-defcustom-choice (type)
+  "Say whether defcustom TYPE looks odd."
+  ;; Check whether there's anything like (choice (const :tag "foo" ;; 'bar)).
+  ;; We don't actually follow the syntax for defcustom types, but this
+  ;; should be good enough.
+  (catch 'found
+    (if (and (consp type)
+             (proper-list-p type))
+        (if (memq (car type) '(const other))
+            (when (assq 'quote type)
+              (throw 'found t))
+          (when (memq t (mapcar #'byte-compile--suspicious-defcustom-choice
+                                type))
+            (throw 'found t)))
+      nil)))
+
 ;; Warn if a custom definition fails to specify :group, or :type.
 (defun byte-compile-nogroup-warn (form)
   (let ((keyword-args (cdr (cdr (cdr (cdr form)))))
        (name (cadr form)))
     (when (eq (car-safe name) 'quote)
-      (or (not (eq (car form) 'custom-declare-variable))
-         (plist-get keyword-args :type)
-         (byte-compile-warn-x (cadr name)
-          "defcustom for `%s' fails to specify type" (cadr name)))
+      (when (eq (car form) 'custom-declare-variable)
+        (let ((type (plist-get keyword-args :type)))
+         (cond
+           ((not type)
+           (byte-compile-warn-x (cadr name)
+                                "defcustom for `%s' fails to specify type"
+                                 (cadr name)))
+           ((byte-compile--suspicious-defcustom-choice type)
+           (byte-compile-warn-x
+             (cadr name)
+            "defcustom for `%s' has syntactically odd type `%s'"
+             (cadr name) type)))))
       (if (and (memq (car form) '(custom-declare-face custom-declare-variable))
               byte-compile-current-group)
          ;; The group will be provided implicitly.
@@ -1698,8 +1725,12 @@ value, it will override this variable."
   :safe #'integerp
   :version "28.1")
 
-(defun byte-compile-docstring-length-warn (form)
-  "Warn if documentation string of FORM is too wide.
+(define-obsolete-function-alias 'byte-compile-docstring-length-warn
+  'byte-compile-docstring-style-warn "29.1")
+
+(defun byte-compile-docstring-style-warn (form)
+  "Warn if there are stylistic problems with the docstring in FORM.
+Warn if documentation string of FORM is too wide.
 It is too wide if it has any lines longer than the largest of
 `fill-column' and `byte-compile-docstring-max-column'."
   (when (byte-compile-warning-enabled-p 'docstrings)
@@ -1719,12 +1750,18 @@ It is too wide if it has any lines longer than the 
largest of
       (when (and (consp name) (eq (car name) 'quote))
         (setq name (cadr name)))
       (setq name (if name (format " `%s' " name) ""))
-      (when (and kind docs (stringp docs)
-                 (byte-compile--wide-docstring-p docs col))
-        (byte-compile-warn-x
-         name
-         "%s%sdocstring wider than %s characters"
-         kind name col))))
+      (when (and kind docs (stringp docs))
+        (when (byte-compile--wide-docstring-p docs col)
+          (byte-compile-warn-x
+           name
+           "%s%sdocstring wider than %s characters"
+           kind name col))
+        ;; There's a "naked" ' character before a symbol/list, so it
+        ;; should probably be quoted with \=.
+        (when (string-match-p "\\( \"\\|[ \t]\\|^\\)'[a-z(]" docs)
+          (byte-compile-warn-x
+           name "%s%sdocstring has wrong usage of unescaped single quotes (use 
\\= or different quoting)"
+           kind name)))))
   form)
 
 ;; If we have compiled any calls to functions which are not known to be
@@ -2520,9 +2557,7 @@ list that represents a doc string reference.
   ;; macroexpand-all.
   ;; (if (memq byte-optimize '(t source))
   ;;     (setq form (byte-optimize-form form for-effect)))
-  (cond
-   (lexical-binding (cconv-closure-convert form))
-   (t form)))
+  (cconv-closure-convert form))
 
 ;; byte-hunk-handlers cannot call this!
 (defun byte-compile-toplevel-file-form (top-level-form)
@@ -2586,7 +2621,7 @@ list that represents a doc string reference.
   (if (stringp (nth 3 form))
       (prog1
           form
-        (byte-compile-docstring-length-warn form))
+        (byte-compile-docstring-style-warn form))
     ;; No doc string, so we can compile this as a normal form.
     (byte-compile-keep-pending form 'byte-compile-normal-call)))
 
@@ -2618,7 +2653,7 @@ list that represents a doc string reference.
   (if (and (null (cddr form))          ;No `value' provided.
            (eq (car form) 'defvar))     ;Just a declaration.
       nil
-    (byte-compile-docstring-length-warn form)
+    (byte-compile-docstring-style-warn form)
     (setq form (copy-sequence form))
     (when (consp (nth 2 form))
       (setcar (cdr (cdr form))
@@ -2643,7 +2678,7 @@ list that represents a doc string reference.
            (byte-compile-warn-x
             newname
             "Alias for `%S' should be declared before its referent" 
newname)))))
-  (byte-compile-docstring-length-warn form)
+  (byte-compile-docstring-style-warn form)
   (byte-compile-keep-pending form))
 
 (put 'custom-declare-variable 'byte-hunk-handler
@@ -2889,6 +2924,7 @@ FUN should be either a `lambda' value or a `closure' 
value."
       (push (pop body) preamble))
     (when (eq (car-safe (car body)) 'interactive)
       (push (pop body) preamble))
+    (setq preamble (nreverse preamble))
     ;; Turn the function's closed vars (if any) into local let bindings.
     (dolist (binding env)
       (cond
@@ -3035,7 +3071,7 @@ lambda-expression."
       (setq fun (cons 'lambda fun))
     (unless (eq 'lambda (car-safe fun))
       (error "Not a lambda list: %S" fun)))
-  (byte-compile-docstring-length-warn fun)
+  (byte-compile-docstring-style-warn fun)
   (byte-compile-check-lambda-list (nth 1 fun))
   (let* ((arglist (nth 1 fun))
          (arglistvars (byte-run-strip-symbol-positions
@@ -3084,7 +3120,8 @@ lambda-expression."
                        ;; which may include "calls" to
                        ;; internal-make-closure (Bug#29988).
                        lexical-binding)
-                   (setq int `(,(car int) ,newform)))))
+                   (setq int `(,(car int) ,newform))
+                 (setq int (byte-run-strip-symbol-positions int))))) ; for 
compile-defun.
             ((cdr int)                  ; Invalid (interactive . something).
             (byte-compile-warn-x int "malformed interactive spec: %s"
                                  int))))
@@ -3099,7 +3136,7 @@ lambda-expression."
                                         (byte-compile-make-lambda-lexenv
                                          arglistvars))
                                    reserved-csts))
-          (bare-arglist arglist))
+          (bare-arglist (byte-run-strip-symbol-positions arglist))) ; for 
compile-defun.
       ;; Build the actual byte-coded function.
       (cl-assert (eq 'byte-code (car-safe compiled)))
       (let ((out
@@ -3807,12 +3844,13 @@ If it is nil, then the handler is 
\"byte-compile-SYMBOL.\""
 
 
 (defun byte-compile-subr-wrong-args (form n)
-  (byte-compile-warn-x (car form)
-                        "`%s' called with %d arg%s, but requires %s"
-                        (car form) (length (cdr form))
-                        (if (= 1 (length (cdr form))) "" "s") n)
-  ;; Get run-time wrong-number-of-args error.
-  (byte-compile-normal-call form))
+  (when (byte-compile-warning-enabled-p 'callargs (car form))
+    (byte-compile-warn-x (car form)
+                         "`%s' called with %d arg%s, but requires %s"
+                         (car form) (length (cdr form))
+                         (if (= 1 (length (cdr form))) "" "s") n)
+    ;; Get run-time wrong-number-of-args error.
+    (byte-compile-normal-call form)))
 
 (defun byte-compile-no-args (form)
   (if (not (= (length form) 1))
@@ -3921,7 +3959,9 @@ discarding."
 (byte-defop-compiler-1 internal-get-closed-var byte-compile-get-closed-var)
 
 (defun byte-compile-make-closure (form)
-  "Byte-compile the special `internal-make-closure' form."
+  "Byte-compile the special `internal-make-closure' form.
+
+This function is never called when `lexical-binding' is nil."
   (if byte-compile--for-effect (setq byte-compile--for-effect nil)
     (let* ((vars (nth 1 form))
            (env (nth 2 form))
@@ -3943,24 +3983,33 @@ discarding."
                                     (number-sequence 4 (1- (length fun)))))
                   (proto-fun
                    (apply #'make-byte-code
-                          (aref fun 0) (aref fun 1)
+                          (aref fun 0)  ; The arglist is always the 15-bit
+                                        ; form, never the list of symbols.
+                          (aref fun 1)  ; The byte-code.
                           ;; Prepend dummy cells to the constant vector,
                           ;; to get the indices right when disassembling.
                           (vconcat dummy-vars (aref fun 2))
-                          (aref fun 3)
+                          (aref fun 3)  ; Stack depth of function
                           (if docstring-exp
-                              (cons (eval docstring-exp t) (cdr opt-args))
+                              (cons
+                               (eval (byte-run-strip-symbol-positions
+                                      docstring-exp)
+                                     t)
+                               (cdr opt-args)) ; The interactive spec will
+                                               ; have been stripped in
+                                               ; `byte-compile-lambda'.
                             opt-args))))
              `(make-closure ,proto-fun ,@env))
          ;; Nontrivial doc string expression: create a bytecode object
          ;; from small pieces at run time.
          `(make-byte-code
-           ',(aref fun 0) ',(aref fun 1)
-           (vconcat (vector . ,env) ',(aref fun 2))
+           ',(aref fun 0)         ; 15-bit form of arglist descriptor.
+           ',(aref fun 1)         ; The byte-code.
+           (vconcat (vector . ,env) ',(aref fun 2)) ; constant vector.
            ,@(let ((rest (nthcdr 3 (mapcar (lambda (x) `',x) fun))))
                (if docstring-exp
                    `(,(car rest)
-                     ,docstring-exp
+                     ,(byte-run-strip-symbol-positions docstring-exp)
                      ,@(cddr rest))
                  rest))))
          ))))
@@ -4174,25 +4223,13 @@ discarding."
 (byte-defop-compiler-1 quote)
 
 (defun byte-compile-setq (form)
-  (let* ((args (cdr form))
-         (len (length args)))
-    (if (= (logand len 1) 1)
-        (progn
-          (byte-compile-report-error
-           (format-message
-            "missing value for `%S' at end of setq" (car (last args))))
-          (byte-compile-form
-           `(signal 'wrong-number-of-arguments '(setq ,len))
-           byte-compile--for-effect))
-      (if args
-          (while args
-            (byte-compile-form (car (cdr args)))
-            (or byte-compile--for-effect (cdr (cdr args))
-                (byte-compile-out 'byte-dup 0))
-            (byte-compile-variable-set (car args))
-            (setq args (cdr (cdr args))))
-        ;; (setq), with no arguments.
-        (byte-compile-form nil byte-compile--for-effect)))
+  (cl-assert (= (length form) 3))       ; normalised in macroexp
+  (let ((var (nth 1 form))
+        (expr (nth 2 form)))
+    (byte-compile-form expr)
+    (unless byte-compile--for-effect
+      (byte-compile-out 'byte-dup 0))
+    (byte-compile-variable-set var)
     (setq byte-compile--for-effect nil)))
 
 (byte-defop-compiler-1 set-default)
@@ -4769,11 +4806,8 @@ binding slots have been popped."
     (byte-compile-out-tag endtag)))
 
 (defun byte-compile-unwind-protect (form)
-  (pcase (cddr form)
-    (`(:fun-body ,f)
-     (byte-compile-form f))
-    (handlers
-     (byte-compile-form `#'(lambda () ,@handlers))))
+  (cl-assert (eq (caddr form) :fun-body))
+  (byte-compile-form (nth 3 form))
   (byte-compile-out 'byte-unwind-protect 0)
   (byte-compile-form-do-effect (car (cdr form)))
   (byte-compile-out 'byte-unbind 1))
@@ -4887,8 +4921,6 @@ binding slots have been popped."
     (push (nth 1 (nth 1 form)) byte-compile-global-not-obsolete-vars))
   (byte-compile-normal-call form))
 
-(defconst byte-compile-tmp-var (make-symbol "def-tmp-var"))
-
 (defun byte-compile-defvar (form)
   ;; This is not used for file-level defvar/consts.
   (when (and (symbolp (nth 1 form))
@@ -4898,7 +4930,7 @@ binding slots have been popped."
      (nth 1 form)
      "global/dynamic var `%s' lacks a prefix"
      (nth 1 form)))
-  (byte-compile-docstring-length-warn form)
+  (byte-compile-docstring-style-warn form)
   (let ((fun (nth 0 form))
        (var (nth 1 form))
        (value (nth 2 form))
@@ -4921,18 +4953,17 @@ binding slots have been popped."
        string
        "third arg to `%s %s' is not a string: %s"
        fun var string))
+    ;; Delegate the actual work to the function version of the
+    ;; special form, named with a "-1" suffix.
     (byte-compile-form-do-effect
-     (if (cddr form)  ; `value' provided
-         ;; Quote with `quote' to prevent byte-compiling the body,
-         ;; which would lead to an inf-loop.
-         `(funcall '(lambda (,byte-compile-tmp-var)
-                      (,fun ,var ,byte-compile-tmp-var ,@(nthcdr 3 form)))
-                   ,value)
-        (if (eq fun 'defconst)
-            ;; This will signal an appropriate error at runtime.
-            `(eval ',form)
-          ;; A simple (defvar foo) just returns foo.
-          `',var)))))
+     (cond
+      ((eq fun 'defconst) `(defconst-1 ',var ,@(nthcdr 2 form)))
+      ((not (cddr form)) `',var) ; A simple (defvar foo) just returns foo.
+      (t `(defvar-1 ',var
+                    ;; Don't eval `value' if `defvar' wouldn't eval it either.
+                    ,(if (macroexp-const-p value) value
+                       `(if (boundp ',var) nil ,value))
+                    ,@(nthcdr 3 form)))))))
 
 (defun byte-compile-autoload (form)
   (and (macroexp-const-p (nth 1 form))
@@ -4974,7 +5005,7 @@ binding slots have been popped."
       ;; - `arg' is the expression to which it is defined.
       ;; - `rest' is the rest of the arguments.
       (`(,_ ',name ,arg . ,rest)
-       (byte-compile-docstring-length-warn form)
+       (byte-compile-docstring-style-warn form)
        (pcase-let*
            ;; `macro' is non-nil if it defines a macro.
            ;; `fun' is the function part of `arg' (defaults to `arg').
diff --git a/lisp/emacs-lisp/cconv.el b/lisp/emacs-lisp/cconv.el
index 4535f1aa6e..eca1123899 100644
--- a/lisp/emacs-lisp/cconv.el
+++ b/lisp/emacs-lisp/cconv.el
@@ -25,21 +25,20 @@
 ;;; Commentary:
 
 ;; This takes a piece of Elisp code, and eliminates all free variables from
-;; lambda expressions.  The user entry points are cconv-closure-convert and
-;; cconv-closure-convert-toplevel (for toplevel forms).
+;; lambda expressions.  The user entry point is `cconv-closure-convert'.
 ;; All macros should be expanded beforehand.
 ;;
 ;; Here is a brief explanation how this code works.
-;; Firstly, we analyze the tree by calling cconv-analyze-form.
+;; Firstly, we analyze the tree by calling `cconv-analyze-form'.
 ;; This function finds all mutated variables, all functions that are suitable
 ;; for lambda lifting and all variables captured by closure.  It passes the 
tree
 ;; once, returning a list of three lists.
 ;;
 ;; Then we calculate the intersection of the first and third lists returned by
-;; cconv-analyze form to find all mutated variables that are captured by
+;; `cconv-analyze-form' to find all mutated variables that are captured by
 ;; closure.
 
-;; Armed with this data, we call cconv-closure-convert-rec, that rewrites the
+;; Armed with this data, we call `cconv-convert', that rewrites the
 ;; tree recursively, lifting lambdas where possible, building closures where it
 ;; is needed and eliminating mutable variables used in closure.
 ;;
@@ -141,11 +140,9 @@ is less than this number.")
 ;;;###autoload
 (defun cconv-closure-convert (form)
   "Main entry point for closure conversion.
--- FORM is a piece of Elisp code after macroexpansion.
--- TOPLEVEL(optional) is a boolean variable, true if we are at the root of AST
+FORM is a piece of Elisp code after macroexpansion.
 
 Returns a form where all lambdas don't have any free variables."
-  ;; (message "Entering cconv-closure-convert...")
   (let ((cconv-freevars-alist '())
        (cconv-var-classification '()))
     ;; Analyze form - fill these variables with new information.
@@ -558,29 +555,19 @@ places where they originally did not directly appear."
      `(,(car form) ,(cconv-convert form1 env extend)
         :fun-body ,(cconv--convert-function () body env form1)))
 
-    (`(setq . ,forms)                   ; setq special form
-     (if (= (logand (length forms) 1) 1)
-         ;; With an odd number of args, let bytecomp.el handle the error.
-         form
-       (let ((prognlist ()))
-         (while forms
-           (let* ((sym (pop forms))
-                  (sym-new (or (cdr (assq sym env)) sym))
-                  (value (cconv-convert (pop forms) env extend)))
-             (push (pcase sym-new
-                     ((pred symbolp) `(,(car form) ,sym-new ,value))
-                     (`(car-safe ,iexp) `(setcar ,iexp ,value))
-                     ;; This "should never happen", but for variables which are
-                     ;; mutated+captured+unused, we may end up trying to `setq'
-                     ;; on a closed-over variable, so just drop the setq.
-                     (_ ;; (byte-compile-report-error
-                      ;;  (format "Internal error in cconv of (setq %s ..)"
-                      ;;          sym-new))
-                      value))
-                   prognlist)))
-         (if (cdr prognlist)
-             `(progn . ,(nreverse prognlist))
-           (car prognlist)))))
+    (`(setq ,var ,expr)
+     (let ((var-new (or (cdr (assq var env)) var))
+           (value (cconv-convert expr env extend)))
+       (pcase var-new
+         ((pred symbolp) `(,(car form) ,var-new ,value))
+         (`(car-safe ,iexp) `(setcar ,iexp ,value))
+         ;; This "should never happen", but for variables which are
+         ;; mutated+captured+unused, we may end up trying to `setq'
+         ;; on a closed-over variable, so just drop the setq.
+         (_ ;; (byte-compile-report-error
+          ;;  (format "Internal error in cconv of (setq %s ..)"
+          ;;          sym-new))
+          value))))
 
     (`(,(and (or 'funcall 'apply) callsym) ,fun . ,args)
      ;; These are not special forms but we treat them separately for the needs
@@ -677,18 +664,19 @@ FORM is the parent form that binds this var."
     ;; Push it before recursing, so cconv-freevars-alist contains entries in
     ;; the order they'll be used by closure-convert-rec.
     (push freevars cconv-freevars-alist)
-    (dolist (arg args)
-      (cond
-       ((byte-compile-not-lexical-var-p arg)
-        (byte-compile-warn-x
-         arg
-         "Lexical argument shadows the dynamic variable %S"
-         arg))
-       ((eq ?& (aref (symbol-name arg) 0)) nil) ;Ignore &rest, &optional, ...
-       (t (let ((varstruct (list arg nil nil nil nil)))
-            (cl-pushnew arg byte-compile-lexical-variables)
-            (push (cons (list arg) (cdr varstruct)) newvars)
-            (push varstruct newenv)))))
+    (when lexical-binding
+      (dolist (arg args)
+        (cond
+         ((byte-compile-not-lexical-var-p arg)
+          (byte-compile-warn-x
+           arg
+           "Lexical argument shadows the dynamic variable %S"
+           arg))
+         ((eq ?& (aref (symbol-name arg) 0)) nil) ;Ignore &rest, &optional, ...
+         (t (let ((varstruct (list arg nil nil nil nil)))
+              (cl-pushnew arg byte-compile-lexical-variables)
+              (push (cons (list arg) (cdr varstruct)) newvars)
+              (push varstruct newenv))))))
     (dolist (form body)                   ;Analyze body forms.
       (cconv-analyze-form form newenv))
     ;; Summarize resulting data about arguments.
@@ -737,7 +725,7 @@ This function does not return anything but instead fills the
 
            (cconv-analyze-form value (if (eq letsym 'let*) env orig-env)))
 
-         (unless (byte-compile-not-lexical-var-p var)
+         (unless (or (byte-compile-not-lexical-var-p var) (not 
lexical-binding))
            (cl-pushnew var byte-compile-lexical-variables)
            (let ((varstruct (list var nil nil nil nil)))
              (push (cons binder (cdr varstruct)) newvars)
@@ -754,14 +742,13 @@ This function does not return anything but instead fills 
the
        (cconv-analyze-form (cadr (pop body-forms)) env))
      (cconv--analyze-function vrs body-forms env form))
 
-    (`(setq . ,forms)
+    (`(setq ,var ,expr)
      ;; If a local variable (member of env) is modified by setq then
      ;; it is a mutated variable.
-     (while forms
-       (let ((v (assq (car forms) env))) ; v = non nil if visible
-         (when v (setf (nth 2 v) t)))
-       (cconv-analyze-form (cadr forms) env)
-       (setq forms (cddr forms))))
+     (let ((v (assq var env))) ; v = non nil if visible
+       (when v
+         (setf (nth 2 v) t)))
+     (cconv-analyze-form expr env))
 
     (`((lambda . ,_) . ,_)             ; First element is lambda expression.
      (byte-compile-warn-x
@@ -783,6 +770,8 @@ This function does not return anything but instead fills the
 
     (`(condition-case ,var ,protected-form . ,handlers)
      (cconv-analyze-form protected-form env)
+     (unless lexical-binding
+       (setq var nil))
      (when (and var (symbolp var) (byte-compile-not-lexical-var-p var))
        (byte-compile-warn-x
         var "Lexical variable shadows the dynamic variable %S" var))
diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
index 4186a541f8..29fbcce773 100644
--- a/lisp/emacs-lisp/chart.el
+++ b/lisp/emacs-lisp/chart.el
@@ -1,7 +1,6 @@
 ;;; chart.el --- Draw charts (bar charts, etc)  -*- lexical-binding: t -*-
 
-;; Copyright (C) 1996, 1998-1999, 2001, 2004-2005, 2007-2022 Free
-;; Software Foundation, Inc.
+;; Copyright (C) 1996-2022 Free Software Foundation, Inc.
 
 ;; Author: Eric M. Ludlam <zappo@gnu.org>
 ;; Old-Version: 0.2
@@ -76,8 +75,7 @@
 Colors will be the background color.")
 
 (defvar chart-face-pixmap-list
-  (if (and (fboundp 'display-graphic-p)
-          (display-graphic-p))
+  (if (display-graphic-p)
       '("dimple1" "scales" "dot" "cross_weave" "boxes" "dimple3"))
   "If pixmaps are allowed, display these background pixmaps.
 Useful if new Emacs is used on B&W display.")
diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el
index eeefb3de10..83187acf71 100644
--- a/lisp/emacs-lisp/check-declare.el
+++ b/lisp/emacs-lisp/check-declare.el
@@ -319,10 +319,7 @@ Returns non-nil if any false statements are found."
   (setq root (directory-file-name (file-relative-name root)))
   (or (file-directory-p root)
       (error "Directory `%s' not found" root))
-  (let ((files (process-lines find-program root
-                              "-name" "*.el"
-                              "-exec" grep-program
-                              "-l" "^[ \t]*(declare-function" "{}" "+")))
+  (let ((files (directory-files-recursively root "\\.el\\'")))
     (when files
       (apply #'check-declare-files files))))
 
diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el
index 72eb776b99..5700afbb03 100644
--- a/lisp/emacs-lisp/checkdoc.el
+++ b/lisp/emacs-lisp/checkdoc.el
@@ -327,7 +327,7 @@ This should be set in an Emacs Lisp file's local variables."
 ;;;###autoload(put 'checkdoc-symbol-words 'safe-local-variable 
#'checkdoc-list-of-strings-p)
 
 (defcustom checkdoc-column-zero-backslash-before-paren t
-  "Non-nil means to warn if there is no '\\' before '(' in column zero.
+  "Non-nil means to warn if there is no \"\\\" before \"(\" in column zero.
 This backslash is no longer needed on Emacs 27.1 or later.
 
 See Info node `(elisp) Documentation Tips' for background."
@@ -1127,7 +1127,7 @@ When called from Lisp, FILES is a list of filenames."
    (progn
      ;; These Dired functions must be defined since we're in a Dired buffer.
      (declare-function dired-get-filename "dired"
-                       (&optional localp no-error-if-not-filep bof))
+                       (&optional localp no-error-if-not-filep))
      ;; These functions are used by the expansion of `dired-map-over-marks'.
      (declare-function dired-move-to-filename "dired"
                        (&optional raise-error eol))
@@ -2234,7 +2234,7 @@ If the offending word is in a piece of quoted text, then 
it is skipped."
 ;;
 (defvar ispell-process)
 (declare-function ispell-buffer-local-words "ispell" ())
-(declare-function ispell-correct-p "ispell" ())
+(declare-function ispell-correct-p "ispell" (&optional following))
 (declare-function ispell-set-spellchecker-params "ispell" ())
 (declare-function ispell-accept-buffer-local-defs "ispell" ())
 (declare-function ispell-error-checking-word "ispell" (word))
@@ -2464,11 +2464,9 @@ Code:, and others referenced in the style guide."
                  pos)
              (goto-char (point-min))
              ;; match ";;;###autoload" cookie to keep it with the form
-             (require 'autoload)
              (while (and cont (re-search-forward
-                               (concat "^\\("
-                                       (regexp-quote generate-autoload-cookie)
-                                       "\n\\)?"
+                               (concat "^\\(" lisp-mode-autoload-regexp
+                                        "\n\\)?"
                                        "(")
                                nil t))
                (setq pos (match-beginning 0)
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index a9d422929f..10043ba280 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -3412,19 +3412,24 @@ Of course, we really can't know that for sure, so it's 
just a heuristic."
                  (cons         . consp)
                  (fixnum       . fixnump)
                  (float                . floatp)
+                 (frame                . framep)
                  (function     . functionp)
                  (integer      . integerp)
                  (keyword      . keywordp)
                  (list         . listp)
+                 (marker       . markerp)
                  (natnum       . natnump)
                  (number       . numberp)
                  (null         . null)
+                 (overlay      . overlayp)
+                 (process      . processp)
                  (real         . numberp)
                  (sequence     . sequencep)
                  (subr         . subrp)
                  (string       . stringp)
                  (symbol       . symbolp)
                  (vector       . vectorp)
+                 (window       . windowp)
                  ;; FIXME: Do we really want to consider this a type?
                  (integer-or-marker . integer-or-marker-p)
                  ))
@@ -3475,16 +3480,19 @@ Of course, we really can't know that for sure, so it's 
just a heuristic."
        (inline-quote (funcall #',(get type 'cl-deftype-satisfies) ,val)))
       ((and (or 'nil 't) type) (inline-quote ',type))
       ((and (pred symbolp) type)
-       (let* ((name (symbol-name type))
-              (namep (intern (concat name "p"))))
-         (cond
-          ((cl--macroexp-fboundp namep) (inline-quote (funcall #',namep ,val)))
-          ((cl--macroexp-fboundp
-            (setq namep (intern (concat name "-p"))))
-           (inline-quote (funcall #',namep ,val)))
-          ((cl--macroexp-fboundp type) (inline-quote (funcall #',type ,val)))
-          (t (error "Unknown type %S" type)))))
-      (type (error "Bad type spec: %s" type)))))
+       (macroexp-warn-and-return
+        (format-message "Unknown type: %S" type)
+        (let* ((name (symbol-name type))
+               (namep (intern (concat name "p"))))
+          (cond
+           ((cl--macroexp-fboundp namep) (inline-quote (funcall #',namep 
,val)))
+           ((cl--macroexp-fboundp
+             (setq namep (intern (concat name "-p"))))
+            (inline-quote (funcall #',namep ,val)))
+           ((cl--macroexp-fboundp type) (inline-quote (funcall #',type ,val)))
+           (t (error "Unknown type %S" type))))
+        nil nil type))
+      (type (error "Bad type spec: %S" type)))))
 
 
 ;;;###autoload
diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el
index 812d0af86b..627bfc8516 100644
--- a/lisp/emacs-lisp/cl-preloaded.el
+++ b/lisp/emacs-lisp/cl-preloaded.el
@@ -155,7 +155,7 @@ supertypes from the most specific to least specific.")
 ;;;###autoload
 (defun cl-struct-define (name docstring parent type named slots children-sym
                               tag print)
-  (cl-check-type name cl--struct-name)
+  (cl-check-type name (satisfies cl--struct-name-p))
   (unless type
     ;; Legacy defstruct, using tagged vectors.  Enable backward compatibility.
     (cl-old-struct-compat-mode 1))
diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el
index 9eaf38067f..6451e34c42 100644
--- a/lisp/emacs-lisp/comp-cstr.el
+++ b/lisp/emacs-lisp/comp-cstr.el
@@ -2,7 +2,7 @@
 
 ;; Copyright (C) 2020-2022 Free Software Foundation, Inc.
 
-;; Author: Andrea Corallo <akrl@sdf.com>
+;; Author: Andrea Corallo <akrl@sdf.org>
 ;; Keywords: lisp
 ;; Package: emacs
 
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 237de52884..53803b3818 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -2,7 +2,7 @@
 
 ;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
 
-;; Author: Andrea Corallo <akrl@sdf.com>
+;; Author: Andrea Corallo <akrl@sdf.org>
 ;; Keywords: lisp
 ;; Package: emacs
 
@@ -483,7 +483,7 @@ Useful to hook into pass checkers.")
     (point-min (function () integer))
     (preceding-char (function () fixnum))
     (previous-window (function (&optional window t t) window))
-    (prin1-to-string (function (t &optional t) string))
+    (prin1-to-string (function (t &optional t t) string))
     (processp (function (t) boolean))
     (proper-list-p (function (t) integer))
     (propertize (function (string &rest t) string))
@@ -944,7 +944,7 @@ CFG is mutated by a pass.")
       :documentation "Unique id when in SSA form.")
   (slot nil :type (or fixnum symbol)
         :documentation "Slot number in the array if a number or
-        'scratch' for scratch slot."))
+        `scratch' for scratch slot."))
 
 (defun comp-mvar-type-hint-match-p (mvar type-hint)
   "Match MVAR against TYPE-HINT.
@@ -3926,22 +3926,36 @@ display a message."
                   (file-newer-than-file-p
                    source-file (comp-el-to-eln-filename source-file)))
          do (let* ((expr `((require 'comp)
-                           ,(when (boundp 'backtrace-line-length)
-                              `(setf backtrace-line-length 
,backtrace-line-length))
-                           (setf comp-file-preloaded-p ,comp-file-preloaded-p
-                                 native-compile-target-directory 
,native-compile-target-directory
-                                 native-comp-speed ,native-comp-speed
-                                 native-comp-debug ,native-comp-debug
-                                 native-comp-verbose ,native-comp-verbose
-                                 comp-libgccjit-reproducer 
,comp-libgccjit-reproducer
-                                 comp-async-compilation t
-                                 native-comp-eln-load-path 
',native-comp-eln-load-path
-                                 native-comp-compiler-options
-                                 ',native-comp-compiler-options
-                                 native-comp-driver-options
-                                 ',native-comp-driver-options
-                                 load-path ',load-path
-                                 warning-fill-column most-positive-fixnum)
+                           (setq comp-async-compilation t)
+                           (setq warning-fill-column most-positive-fixnum)
+                           ,(let ((set (list 'setq)))
+                              (dolist (var '(comp-file-preloaded-p
+                                             native-compile-target-directory
+                                             native-comp-speed
+                                             native-comp-debug
+                                             native-comp-verbose
+                                             comp-libgccjit-reproducer
+                                             native-comp-eln-load-path
+                                             native-comp-compiler-options
+                                             native-comp-driver-options
+                                             load-path
+                                             backtrace-line-length
+                                             ;; package-load-list
+                                             ;; package-user-dir
+                                             ;; package-directory-list
+                                             ))
+                                (when (boundp var)
+                                  (push var set)
+                                  (push `',(symbol-value var) set)))
+                              (nreverse set))
+                           ;; FIXME: Activating all packages would align the
+                           ;; functionality offered with what is usually done
+                           ;; for ELPA packages (and thus fix some compilation
+                           ;; issues with some ELPA packages), but it's too
+                           ;; blunt an instrument (e.g. we don't even know if
+                           ;; we're compiling such an ELPA package at
+                           ;; this point).
+                           ;;(package-activate-all)
                            ,native-comp-async-env-modifier-form
                            (message "Compiling %s..." ,source-file)
                            (comp--native-compile ,source-file ,(and load t))))
@@ -3994,7 +4008,7 @@ display a message."
     (run-hooks 'native-comp-async-all-done-hook)
     (with-current-buffer (get-buffer-create comp-async-buffer-name)
       (save-excursion
-        (let ((buffer-read-only nil))
+        (let ((inhibit-read-only t))
           (goto-char (point-max))
           (insert "Compilation finished.\n"))))
     ;; `comp-deferred-pending-h' should be empty at this stage.
@@ -4025,48 +4039,60 @@ the deferred compilation mechanism."
            (comp-ctxt (make-comp-ctxt :output output
                                       :with-late-load with-late-load)))
       (comp-log "\n\n" 1)
-      (condition-case err
-          (cl-loop
-           with report = nil
-           for t0 = (current-time)
-           for pass in comp-passes
-           unless (memq pass comp-disabled-passes)
-           do
-           (comp-log (format "(%s) Running pass %s:\n"
-                             function-or-file pass)
-                     2)
-           (setf data (funcall pass data))
-           (push (cons pass (float-time (time-since t0))) report)
-           (cl-loop for f in (alist-get pass comp-post-pass-hooks)
-                    do (funcall f data))
-           finally
-           (when comp-log-time-report
-             (comp-log (format "Done compiling %s" data) 0)
-             (cl-loop for (pass . time) in (reverse report)
-                      do (comp-log (format "Pass %s took: %fs." pass time) 
0))))
-        (native-compiler-skip)
-        (t
-         (let ((err-val (cdr err)))
-           ;; If we are doing an async native compilation print the
-           ;; error in the correct format so is parsable and abort.
-           (if (and comp-async-compilation
-                    (not (eq (car err) 'native-compiler-error)))
-               (progn
-                 (message (if err-val
-                              "%s: Error: %s %s"
-                            "%s: Error %s")
-                          function-or-file
-                          (get (car err) 'error-message)
-                          (car-safe err-val))
-                 (kill-emacs -1))
-             ;; Otherwise re-signal it adding the compilation input.
-            (signal (car err) (if (consp err-val)
-                                  (cons function-or-file err-val)
-                                (list function-or-file err-val)))))))
-        (if (stringp function-or-file)
-            data
-          ;; So we return the compiled function.
-          (native-elisp-load data)))))
+      (unwind-protect
+          (progn
+            (condition-case err
+                (cl-loop
+                 with report = nil
+                 for t0 = (current-time)
+                 for pass in comp-passes
+                 unless (memq pass comp-disabled-passes)
+                 do
+                 (comp-log (format "(%s) Running pass %s:\n"
+                                   function-or-file pass)
+                           2)
+                 (setf data (funcall pass data))
+                 (push (cons pass (float-time (time-since t0))) report)
+                 (cl-loop for f in (alist-get pass comp-post-pass-hooks)
+                          do (funcall f data))
+                 finally
+                 (when comp-log-time-report
+                   (comp-log (format "Done compiling %s" data) 0)
+                   (cl-loop for (pass . time) in (reverse report)
+                            do (comp-log (format "Pass %s took: %fs."
+                                                 pass time) 0))))
+              (native-compiler-skip)
+              (t
+               (let ((err-val (cdr err)))
+                 ;; If we are doing an async native compilation print the
+                 ;; error in the correct format so is parsable and abort.
+                 (if (and comp-async-compilation
+                          (not (eq (car err) 'native-compiler-error)))
+                     (progn
+                       (message (if err-val
+                                    "%s: Error: %s %s"
+                                  "%s: Error %s")
+                                function-or-file
+                                (get (car err) 'error-message)
+                                (car-safe err-val))
+                       (kill-emacs -1))
+                   ;; Otherwise re-signal it adding the compilation input.
+                  (signal (car err) (if (consp err-val)
+                                        (cons function-or-file err-val)
+                                      (list function-or-file err-val)))))))
+            (if (stringp function-or-file)
+                data
+              ;; So we return the compiled function.
+              (native-elisp-load data)))
+        ;; We may have created a temporary file when we're being
+        ;; called with something other than a file as the argument.
+        ;; Delete it.
+        (when (and (not (stringp function-or-file))
+                   (not output)
+                   comp-ctxt
+                   (comp-ctxt-output comp-ctxt)
+                   (file-exists-p (comp-ctxt-output comp-ctxt)))
+          (delete-file (comp-ctxt-output comp-ctxt)))))))
 
 (defun native-compile-async-skip-p (file load selector)
   "Return non-nil if FILE's compilation should be skipped.
@@ -4088,6 +4114,7 @@ LOAD and SELECTOR work as described in 
`native--compile-async'."
                     native-comp-deferred-compilation-deny-list))))
 
 (defun native--compile-async (files &optional recursively load selector)
+  ;; BEWARE, this function is also called directly from C.
   "Compile FILES asynchronously.
 FILES is one filename or a list of filenames or directories.
 
@@ -4121,16 +4148,17 @@ bytecode definition was not changed in the meantime)."
   (unless (listp files)
     (setf files (list files)))
   (let (file-list)
-    (dolist (path files)
-      (cond ((file-directory-p path)
+    (dolist (file-or-dir files)
+      (cond ((file-directory-p file-or-dir)
              (dolist (file (if recursively
                                (directory-files-recursively
-                                path comp-valid-source-re)
-                             (directory-files path t comp-valid-source-re)))
+                                file-or-dir comp-valid-source-re)
+                             (directory-files file-or-dir
+                                              t comp-valid-source-re)))
                (push file file-list)))
-            ((file-exists-p path) (push path file-list))
+            ((file-exists-p file-or-dir) (push file-or-dir file-list))
             (t (signal 'native-compiler-error
-                       (list "Path not a file nor directory" path)))))
+                       (list "Not a file nor directory" file-or-dir)))))
     (dolist (file file-list)
       (if-let ((entry (cl-find file comp-files-queue :key #'car :test 
#'string=)))
           ;; Most likely the byte-compiler has requested a deferred
diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el
index 6c172d6c31..c4929eb2b0 100644
--- a/lisp/emacs-lisp/debug.el
+++ b/lisp/emacs-lisp/debug.el
@@ -305,16 +305,15 @@ the debugger will not be entered."
                  (set-buffer debugger-old-buffer)))
               ;; Forget debugger window, it won't be back (Bug#17882).
               (setq debugger-previous-window nil))
-            ;; Restore previous state of debugger-buffer in case we were
-            ;; in a recursive invocation of the debugger, otherwise just
-            ;; erase the buffer.
+            ;; Restore previous state of debugger-buffer in case we
+            ;; were in a recursive invocation of the debugger,
+            ;; otherwise just exit (after changing the mode, since we
+            ;; can't interact with the buffer in the same way).
            (when (buffer-live-p debugger-buffer)
              (with-current-buffer debugger-buffer
                (if debugger-previous-state
                     (debugger--restore-buffer-state debugger-previous-state)
-                  (setq backtrace-insert-header-function nil)
-                  (setq backtrace-frames nil)
-                  (backtrace-print))))
+                  (backtrace-mode))))
            (with-timeout-unsuspend debugger-with-timeout-suspend)
            (set-match-data debugger-outer-match-data)))
         (setq debug-on-next-call debugger-step-after-exit)
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index d8b0a13c30..9dc5a1315e 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -41,7 +41,7 @@
 ;; See the Emacs Lisp Reference Manual for more details.
 
 ;; If you wish to change the default edebug global command prefix, change:
-;; (setq global-edebug-prefix "\C-xX")
+;; (setq edebug-global-prefix "\C-xX")
 
 ;; Edebug was written by
 ;; Daniel LaLiberte
@@ -3865,7 +3865,10 @@ be installed in `emacs-lisp-mode-map'.")
 
 (define-obsolete-variable-alias 'global-edebug-prefix
   'edebug-global-prefix "28.1")
-(defvar edebug-global-prefix "\^XX"
+(defvar edebug-global-prefix
+  (when-let ((binding
+              (car (where-is-internal 'Control-X-prefix (list global-map)))))
+    (concat binding [?X]))
   "Prefix key for global edebug commands, available from any buffer.")
 
 (define-obsolete-variable-alias 'global-edebug-map
diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el
index d687289b22..d9864e6965 100644
--- a/lisp/emacs-lisp/eieio-core.el
+++ b/lisp/emacs-lisp/eieio-core.el
@@ -137,6 +137,8 @@ Currently under control of this var:
 X can also be is a symbol."
   (eieio--class-p (if (symbolp x) (cl--find-class x) x)))
 
+(cl-deftype class () `(satisfies class-p))
+
 (defun eieio--class-print-name (class)
   "Return a printed representation of CLASS."
   (format "#<class %s>" (eieio-class-name class)))
@@ -165,6 +167,8 @@ Return nil if that option doesn't exist."
   (and (recordp obj)
        (eieio--class-p (eieio--object-class obj))))
 
+(cl-deftype eieio-object () `(satisfies eieio-object-p))
+
 (define-obsolete-function-alias 'object-p #'eieio-object-p "25.1")
 
 (defun class-abstract-p (class)
diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el
index 1315ca0c62..565eaf2d73 100644
--- a/lisp/emacs-lisp/eieio.el
+++ b/lisp/emacs-lisp/eieio.el
@@ -271,7 +271,8 @@ This method is obsolete."
        ;; test, so we can let typep have the CLOS documented behavior
        ;; while keeping our above predicate clean.
 
-       (define-symbol-prop ',name 'cl-deftype-satisfies #',testsym2)
+       (eval-and-compile
+         (define-symbol-prop ',name 'cl-deftype-satisfies #',testsym2))
 
        (eieio-defclass-internal ',name ',superclasses ',slots 
',options-and-doc)
 
diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el
index 74ffeb166d..0b8078579c 100644
--- a/lisp/emacs-lisp/eldoc.el
+++ b/lisp/emacs-lisp/eldoc.el
@@ -5,7 +5,7 @@
 ;; Author: Noah Friedman <friedman@splode.com>
 ;; Keywords: extensions
 ;; Created: 1995-10-06
-;; Version: 1.11.1
+;; Version: 1.12.0
 ;; Package-Requires: ((emacs "26.3"))
 
 ;; This is a GNU ELPA :core package.  Avoid functionality that is not
@@ -464,19 +464,22 @@ directly from the user or from ElDoc's automatic 
mechanisms'.")
 
 (defvar eldoc--doc-buffer-docs nil "Documentation items in 
`eldoc--doc-buffer'.")
 
-(defun eldoc-doc-buffer ()
-  "Display ElDoc documentation buffer.
+(defun eldoc-doc-buffer (&optional interactive)
+  "Get or display ElDoc documentation buffer.
 
-This holds the results of the last documentation request."
-  (interactive)
+The buffer holds the results of the last documentation request.
+If INTERACTIVE, display it.  Else, return said buffer."
+  (interactive (list t))
   (unless (buffer-live-p eldoc--doc-buffer)
     (user-error (format
                  "ElDoc buffer doesn't exist, maybe `%s' to produce one."
                  (substitute-command-keys "\\[eldoc]"))))
   (with-current-buffer eldoc--doc-buffer
-    (rename-buffer (replace-regexp-in-string "^ *" ""
-                                             (buffer-name)))
-    (display-buffer (current-buffer))))
+    (cond (interactive
+           (rename-buffer (replace-regexp-in-string "^ *" ""
+                                                    (buffer-name)))
+           (display-buffer (current-buffer)))
+          (t (current-buffer)))))
 
 (defun eldoc--format-doc-buffer (docs)
   "Ensure DOCS are displayed in an *eldoc* buffer."
diff --git a/lisp/emacs-lisp/ert-x.el b/lisp/emacs-lisp/ert-x.el
index 0e412a8d34..de18adff5b 100644
--- a/lisp/emacs-lisp/ert-x.el
+++ b/lisp/emacs-lisp/ert-x.el
@@ -96,7 +96,7 @@ ERT--THUNK with that buffer as current."
 
 To be used in ERT tests.  If BODY finishes successfully, the test
 buffer is killed; if there is an error, the test buffer is kept
-around on error for further inspection.  Its name is derived from
+around for further inspection.  Its name is derived from
 the name of the test and the result of NAME-FORM."
   (declare (debug ((":name" form) def-body))
            (indent 1))
@@ -338,7 +338,8 @@ unless the output is going to the echo area (when 
PRINTCHARFUN is
 t or PRINTCHARFUN is nil and `standard-output' is t).  If the
 output is destined for the echo area, the advice function will
 convert it to a string and pass it to COLLECTOR first."
-  (lambda (func object &optional printcharfun)
+  ;;; FIXME: Pass on OVERRIDES.
+  (lambda (func object &optional printcharfun _overrides)
     (if (not (eq t (or printcharfun standard-output)))
         (funcall func object printcharfun)
       (funcall collector (with-output-to-string
@@ -424,10 +425,15 @@ The following keyword arguments are supported:
 :text STRING    If non-nil, pass STRING to `make-temp-file' as
                 the TEXT argument.
 
+:coding CODING  If non-nil, bind `coding-system-for-write' to CODING
+                when executing BODY.  This is handy when STRING includes
+                non-ASCII characters or the temporary file must have a
+                specific encoding or end-of-line format.
+
 See also `ert-with-temp-directory'."
   (declare (indent 1) (debug (symbolp body)))
   (cl-check-type name symbol)
-  (let (keyw prefix suffix directory text extra-keywords)
+  (let (keyw prefix suffix directory text extra-keywords coding)
     (while (keywordp (setq keyw (car body)))
       (setq body (cdr body))
       (pcase keyw
@@ -435,6 +441,7 @@ See also `ert-with-temp-directory'."
         (:suffix (setq suffix (pop body)))
         (:directory (setq directory (pop body)))
         (:text (setq text (pop body)))
+        (:coding (setq coding (pop body)))
         (_ (push keyw extra-keywords) (pop body))))
     (when extra-keywords
       (error "Invalid keywords: %s" (mapconcat #'symbol-name extra-keywords " 
")))
@@ -443,7 +450,8 @@ See also `ert-with-temp-directory'."
           (suffix (or suffix ert-temp-file-suffix
                       (ert--with-temp-file-generate-suffix
                        (or (macroexp-file-name) buffer-file-name)))))
-      `(let* ((,temp-file (,(if directory 'file-name-as-directory 'identity)
+      `(let* ((coding-system-for-write ,(or coding coding-system-for-write))
+              (,temp-file (,(if directory 'file-name-as-directory 'identity)
                            (make-temp-file ,prefix ,directory ,suffix ,text)))
               (,name ,(if directory
                           `(file-name-as-directory ,temp-file)
@@ -483,6 +491,36 @@ The same keyword arguments are supported as in
   (string-match "Apple \\(LLVM\\|[Cc]lang\\)\\|Xcode\\.app"
                 (shell-command-to-string "gcc --version")))
 
+
+(defvar tramp-methods)
+(defvar tramp-default-host-alist)
+
+;; If this defconst is used in a test file, `tramp' shall be loaded
+;; prior `ert-x'.  There is no default value on w32 systems, which
+;; could work out of the box.
+(defconst ert-remote-temporary-file-directory
+  (when (featurep 'tramp)
+    (cond
+     ((getenv "REMOTE_TEMPORARY_FILE_DIRECTORY"))
+     ((eq system-type 'windows-nt) null-device)
+     (t (add-to-list
+         'tramp-methods
+         '("mock"
+          (tramp-login-program      "sh")
+          (tramp-login-args         (("-i")))
+          (tramp-remote-shell       "/bin/sh")
+          (tramp-remote-shell-args  ("-c"))
+          (tramp-connection-timeout 10)))
+        (add-to-list
+         'tramp-default-host-alist
+         `("\\`mock\\'" nil ,(system-name)))
+        ;; Emacs's Makefile sets $HOME to a nonexistent value.  Needed
+        ;; in batch mode only, therefore.
+        (unless (and (null noninteractive) (file-directory-p "~/"))
+          (setenv "HOME" temporary-file-directory))
+        (format "/mock::%s" temporary-file-directory))))
+    "Temporary directory for remote file tests.")
+
 (provide 'ert-x)
 
 ;;; ert-x.el ends here
diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el
index 00da5c718c..82722add42 100644
--- a/lisp/emacs-lisp/ert.el
+++ b/lisp/emacs-lisp/ert.el
@@ -1538,18 +1538,28 @@ of the tests (e.g. invalid SELECTOR or bug in the code 
that runs
 the tests)."
   (or noninteractive
       (user-error "This function is only for use in batch mode"))
-  ;; Better crash loudly than attempting to recover from undefined
-  ;; behavior.
-  (setq attempt-stack-overflow-recovery nil
-        attempt-orderly-shutdown-on-fatal-signal nil)
-  (unwind-protect
-      (let ((stats (ert-run-tests-batch selector)))
-        (kill-emacs (if (zerop (ert-stats-completed-unexpected stats)) 0 1)))
+  (let ((eln-dir (and (featurep 'native-compile)
+                      (make-temp-file "test-nativecomp-cache-" t))))
+    (when eln-dir
+      (startup-redirect-eln-cache eln-dir))
+    ;; Better crash loudly than attempting to recover from undefined
+    ;; behavior.
+    (setq attempt-stack-overflow-recovery nil
+          attempt-orderly-shutdown-on-fatal-signal nil)
     (unwind-protect
-        (progn
-          (message "Error running tests")
-          (backtrace))
-      (kill-emacs 2))))
+        (let ((stats (ert-run-tests-batch selector)))
+          (when eln-dir
+            (ignore-errors
+              (delete-directory eln-dir t)))
+          (kill-emacs (if (zerop (ert-stats-completed-unexpected stats)) 0 1)))
+      (unwind-protect
+          (progn
+            (message "Error running tests")
+            (backtrace))
+        (when eln-dir
+          (ignore-errors
+            (delete-directory eln-dir t)))
+        (kill-emacs 2)))))
 
 (defvar ert-load-file-name nil
   "The name of the loaded ERT test file, a string.
diff --git a/lisp/emacs-lisp/find-func.el b/lisp/emacs-lisp/find-func.el
index 96eaf1ab64..ac84b50b5f 100644
--- a/lisp/emacs-lisp/find-func.el
+++ b/lisp/emacs-lisp/find-func.el
@@ -269,11 +269,7 @@ defined in C.")
 If FUNC is not a symbol, return it.  Else, if it's not advised,
 return the symbol's function definition."
   (or (and (symbolp func)
-           (featurep 'nadvice)
-           (let ((ofunc (advice--symbol-function func)))
-             (if (advice--p ofunc)
-                 (advice--cd*r ofunc)
-               ofunc)))
+           (advice--cd*r (symbol-function func)))
       func))
 
 (defun find-function-C-source (fun-or-var file type)
@@ -516,8 +512,8 @@ Return t if any PRED returns t."
 (defun find-function-library (function &optional lisp-only verbose)
   "Return the pair (ORIG-FUNCTION . LIBRARY) for FUNCTION.
 
-ORIG-FUNCTION is the original name, after removing all advice and
-resolving aliases.  LIBRARY is an absolute file name, a relative
+ORIG-FUNCTION is the original name, after resolving aliases.
+LIBRARY is an absolute file name, a relative
 file name inside the C sources directory, or a name of an
 autoloaded feature.
 
diff --git a/lisp/emacs-lisp/generate-lisp-file.el 
b/lisp/emacs-lisp/generate-lisp-file.el
new file mode 100644
index 0000000000..8896a3f701
--- /dev/null
+++ b/lisp/emacs-lisp/generate-lisp-file.el
@@ -0,0 +1,113 @@
+;;; generate-lisp-file.el --- utility functions for generated files  -*- 
lexical-binding: t -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Keywords: maint
+;; Package: emacs
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-when-compile (require 'cl-lib))
+
+(cl-defun generate-lisp-file-heading (file generator
+                                           &key title commentary (code t))
+  "Insert a standard header for FILE created by GENERATOR.
+This header will specify that this is a generated file that
+should not be edited.
+
+If `standard-output' is bound to a buffer, insert in that buffer.
+If no, insert at point in the current buffer.
+
+TITLE (if any) will be used in the first line.
+
+COMMENTARY (if given) will be inserted as a comment.
+
+If CODE is non-nil (which is the default), a Code: line is
+inserted."
+  (with-current-buffer (if (bufferp standard-output)
+                           standard-output
+                         (current-buffer))
+    (insert ";;; " (file-name-nondirectory file)
+            " --- "
+            (or title "automatically generated")
+            " (do not edit) "
+            "  -*- lexical-binding: t -*-\n"
+            (format ";; Generated by the `%s' function.\n\n" generator)
+            ";; This file is part of GNU Emacs.\n\n")
+    (when commentary
+      (insert ";;; Commentary:\n\n")
+      (let ((start (point))
+            (fill-prefix ";; "))
+        (insert ";; " commentary)
+        (fill-region start (point))))
+    (ensure-empty-lines 1)
+    (when code
+      (insert ";;; Code:\n\n"))))
+
+(cl-defun generate-lisp-file-trailer (file &key version inhibit-provide
+                                      (coding 'utf-8-emacs-unix) autoloads
+                                      compile provide)
+  "Insert a standard trailer for FILE.
+By default, this trailer inhibits version control, byte
+compilation, updating autoloads, and uses a `utf-8-emacs-unix'
+coding system.  These can be inhibited by providing non-nil
+values to the VERSION, NO-PROVIDE, AUTOLOADS and COMPILE
+keyword arguments.
+
+CODING defaults to `utf-8-emacs-unix'.  Use a nil value to
+inhibit generating this setting, or a coding system value to use
+that.
+
+If PROVIDE is non-nil, use that in the `provide' statement
+instead of using FILE as the basis.
+
+If `standard-output' is bound to a buffer, insert in that buffer.
+If no, insert at point in the current buffer."
+  (with-current-buffer (if (bufferp standard-output)
+                           standard-output
+                         (current-buffer))
+    (ensure-empty-lines 1)
+    (unless inhibit-provide
+      (insert (format "(provide '%s)\n\n"
+                      (or provide
+                         (file-name-sans-extension
+                           (file-name-nondirectory file))))))
+    ;; Some of the strings below are chopped into bits to inhibit
+    ;; automatic scanning tools from thinking that they are actual
+    ;; directives.
+    (insert ";; Local " "Variables:\n")
+    (unless version
+      (insert ";; version-control: never\n"))
+    (unless compile
+      (insert ";; no-byte-" "compile: t\n")) ;; #$ is byte-compiled into nil.
+    (unless autoloads
+      (insert ";; no-update-autoloads: t\n"))
+    (when coding
+      (insert (format ";; coding: %s\n"
+                      (if (eq coding t)
+                          'utf-8-emacs-unix
+                        coding))))
+    (insert
+     ";; End:\n\n"
+     ";;; " (file-name-nondirectory file) " ends here\n")))
+
+(provide 'generate-lisp-file)
+
+;;; generate-lisp-file.el ends here
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index e7c3a4b64f..aaec13d1af 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -119,6 +119,15 @@
                               t))
                           "\\s-+\\(" lisp-mode-symbol-regexp "\\)"))
         2)
+   ;; Like the previous, but uses a quoted symbol as the name.
+   (list nil
+        (purecopy (concat "^\\s-*("
+                          (eval-when-compile
+                            (regexp-opt
+                             '("defalias" "define-obsolete-function-alias")
+                              t))
+                          "\\s-+'\\(" lisp-mode-symbol-regexp "\\)"))
+        2)
    (list (purecopy "Variables")
         (purecopy (concat "^\\s-*("
                           (eval-when-compile
@@ -156,6 +165,12 @@
 
   "Imenu generic expression for Lisp mode.  See `imenu-generic-expression'.")
 
+(defconst lisp-mode-autoload-regexp
+  "^;;;###\\(\\([-[:alnum:]]+?\\)-\\)?\\(autoload\\)"
+  "Regexp to match autoload cookies.
+The second group matches package names used to redirect autoloads
+to a package-local <package>-loaddefs.el file.")
+
 ;; This was originally in autoload.el and is still used there.
 (put 'autoload 'doc-string-elt 3)
 (put 'defmethod 'doc-string-elt 3)
@@ -235,6 +250,9 @@
               ('let
                 (forward-sexp 1)
                 (>= pos (point)))
+              ((or 'defun 'defmacro 'cl-defmethod 'cl-defun)
+                (forward-sexp 2)
+                (>= pos (point)))
               ('condition-case
                   ;; If (cdr paren-posns), then we're in the BODY
                   ;; of HANDLERS.
@@ -418,7 +436,8 @@ This will generate compile-time constants from BINDINGS."
              nil t))
         ;; Emacs Lisp autoload cookies.  Supports the slightly different
         ;; forms used by mh-e, calendar, etc.
-        ("^;;;###\\([-a-z]*autoload\\)" 1 font-lock-warning-face prepend))
+        (,lisp-mode-autoload-regexp (3 font-lock-warning-face prepend)
+                                    (2 font-lock-function-name-face prepend 
t)))
       "Subdued level highlighting for Emacs Lisp mode.")
 
     (defconst lisp-cl-font-lock-keywords-1
@@ -466,6 +485,9 @@ This will generate compile-time constants from BINDINGS."
          ;; Words inside ‘’, '' and `' tend to be symbol names.
          (,(concat "[`‘']\\(" lisp-mode-symbol-regexp "\\)['’]")
           (1 font-lock-constant-face prepend))
+         ;; \\= tends to be an escape in doc strings.
+         ("\\\\\\\\="
+          (0 font-lock-builtin-face prepend))
          ;; Constant values.
          (,(concat "\\_<:" lisp-mode-symbol-regexp "\\_>")
           (0 font-lock-builtin-face))
@@ -648,7 +670,9 @@ font-lock keywords will not be case sensitive."
   (setq-local indent-line-function 'lisp-indent-line)
   (setq-local indent-region-function 'lisp-indent-region)
   (setq-local comment-indent-function #'lisp-comment-indent)
-  (setq-local outline-regexp ";;;\\(;* [^ \t\n]\\|###autoload\\)\\|(")
+  (setq-local outline-regexp (concat ";;;;* [^ \t\n]\\|(\\|\\("
+                                     lisp-mode-autoload-regexp
+                                     "\\)"))
   (setq-local outline-level 'lisp-outline-level)
   (setq-local add-log-current-defun-function #'lisp-current-defun-name)
   (setq-local comment-start ";")
@@ -688,7 +712,8 @@ font-lock keywords will not be case sensitive."
   ;; Expects outline-regexp is ";;;\\(;* [^ \t\n]\\|###autoload\\)\\|("
   ;; and point is at the beginning of a matching line.
   (let ((len (- (match-end 0) (match-beginning 0))))
-    (cond ((looking-at "(\\|;;;###autoload")
+    (cond ((or (looking-at-p "(")
+               (looking-at-p lisp-mode-autoload-regexp))
            1000)
           ((looking-at ";;\\(;+\\) ")
            (- (match-end 1) (match-beginning 1)))
diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el
index ffca0dcf4f..641ce0d5c0 100644
--- a/lisp/emacs-lisp/lisp.el
+++ b/lisp/emacs-lisp/lisp.el
@@ -857,14 +857,33 @@ The option `delete-pair-blink-delay' can disable 
blinking."
          (delete-char -1)))
       (delete-char 1))))
 
-(defun raise-sexp (&optional arg)
-  "Raise ARG sexps higher up the tree."
+(defun raise-sexp (&optional n)
+  "Raise N sexps one level higher up the tree.
+
+This function removes the sexp enclosing the form which follows
+point, and then re-inserts N sexps that originally followe point,
+thus raising those N sexps one level up.
+
+Interactively, N is the numeric prefix argument, and defaults to 1.
+
+For instance, if you have:
+
+  (let ((foo 2))
+    (progn
+      (setq foo 3)
+      (zot)
+      (+ foo 2)))
+
+and point is before (zot), \\[raise-sexp] will give you
+
+  (let ((foo 2))
+    (zot))"
   (interactive "p")
   (let ((s (if (and transient-mark-mode mark-active)
                (buffer-substring (region-beginning) (region-end))
              (buffer-substring
               (point)
-              (save-excursion (forward-sexp arg) (point))))))
+              (save-excursion (forward-sexp n) (point))))))
     (backward-up-list 1)
     (delete-region (point) (save-excursion (forward-sexp 1) (point)))
     (save-excursion (insert s))))
diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el
new file mode 100644
index 0000000000..95666ddb2a
--- /dev/null
+++ b/lisp/emacs-lisp/loaddefs-gen.el
@@ -0,0 +1,704 @@
+;;; loaddefs-gen.el --- generate loaddefs.el files  -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Keywords: maint
+;; Package: emacs
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package generates the main lisp/loaddefs.el file, as well as
+;; all the other loaddefs files, like calendar/diary-loaddefs.el, etc.
+
+;; The main entry point is `loaddefs-generate' (normally called
+;; from loaddefs-generate-batch via lisp/Makefile).
+;;
+;; The "other" loaddefs files are specified either via a file-local
+;; setting of `generated-autoload-file', or by specifying
+;;
+;;   ;;;###foo-autoload
+;;
+;; This makes the autoload go to foo-loaddefs.el in the current directory.
+;; Normal ;;;###autoload specs go to the main loaddefs file.
+
+;;; Code:
+
+(require 'radix-tree)
+(require 'lisp-mnt)
+(require 'generate-lisp-file)
+
+(defvar autoload-compute-prefixes t
+  "If non-nil, autoload will add code to register the prefixes used in a file.
+Standard prefixes won't be registered anyway.  I.e. if a file
+\"foo.el\" defines variables or functions that use \"foo-\" as
+prefix, that will not be registered.  But all other prefixes will
+be included.")
+(put 'autoload-compute-prefixes 'safe-local-variable #'booleanp)
+
+(defvar autoload-ignored-definitions
+  '("define-obsolete-function-alias"
+    "define-obsolete-variable-alias"
+    "define-category" "define-key"
+    "defgroup" "defface" "defadvice"
+    "def-edebug-spec"
+    ;; Hmm... this is getting ugly:
+    "define-widget"
+    "define-erc-module"
+    "define-erc-response-handler"
+    "defun-rcirc-command")
+  "List of strings naming definitions to ignore for prefixes.
+More specifically those definitions will not be considered for the
+`register-definition-prefixes' call.")
+
+(defvar generated-autoload-file nil
+  "File into which to write autoload definitions.
+A Lisp file can set this in its local variables section to make
+its autoloads go somewhere else.
+
+If this is a relative file name, the directory is determined as
+follows:
+ - If a Lisp file defined `generated-autoload-file' as a
+   file-local variable, use its containing directory.
+ - Otherwise use the \"lisp\" subdirectory of `source-directory'.
+
+The autoload file is assumed to contain a trailer starting with a
+FormFeed character.")
+;;;###autoload
+(put 'generated-autoload-file 'safe-local-variable 'stringp)
+
+(defvar generated-autoload-load-name nil
+  "Load name for `autoload' statements generated from autoload cookies.
+If nil, this defaults to the file name, sans extension.
+Typically, you need to set this when the directory containing the file
+is not in `load-path'.
+This also affects the generated cus-load.el file.")
+;;;###autoload
+(put 'generated-autoload-load-name 'safe-local-variable 'stringp)
+
+(defun loaddefs-generate--file-load-name (file outfile)
+  "Compute the name that will be used to load FILE.
+OUTFILE should be the name of the global loaddefs.el file, which
+is expected to be at the root directory of the files we are
+scanning for autoloads and will be in the `load-path'."
+  (let* ((name (file-relative-name file (file-name-directory outfile)))
+         (names '())
+         (dir (file-name-directory outfile)))
+    ;; If `name' has directory components, only keep the
+    ;; last few that are really needed.
+    (while name
+      (setq name (directory-file-name name))
+      (push (file-name-nondirectory name) names)
+      (setq name (file-name-directory name)))
+    (while (not name)
+      (cond
+       ((null (cdr names)) (setq name (car names)))
+       ((file-exists-p (expand-file-name "subdirs.el" dir))
+        ;; FIXME: here we only check the existence of subdirs.el,
+        ;; without checking its content.  This makes it generate wrong load
+        ;; names for cases like lisp/term which is not added to load-path.
+        (setq dir (expand-file-name (pop names) dir)))
+       (t (setq name (mapconcat #'identity names "/")))))
+    (if (string-match "\\.elc?\\(\\.\\|\\'\\)" name)
+        (substring name 0 (match-beginning 0))
+      name)))
+
+(defun loaddefs-generate--make-autoload (form file &optional expansion)
+  "Turn FORM into an autoload or defvar for source file FILE.
+Returns nil if FORM is not a special autoload form (i.e. a function definition
+or macro definition or a defcustom).
+If EXPANSION is non-nil, we're processing the macro expansion of an
+expression, in which case we want to handle forms differently."
+  (let ((car (car-safe form)) expand)
+    (cond
+     ((and expansion (eq car 'defalias))
+      (pcase-let*
+          ((`(,_ ,_ ,arg . ,rest) form)
+           ;; `type' is non-nil if it defines a macro.
+           ;; `fun' is the function part of `arg' (defaults to `arg').
+           ((or (and (or `(cons 'macro ,fun) `'(macro . ,fun)) (let type t))
+                (and (let fun arg) (let type nil)))
+            arg)
+           ;; `lam' is the lambda expression in `fun' (or nil if not
+           ;; recognized).
+           (lam (if (memq (car-safe fun) '(quote function)) (cadr fun)))
+           ;; `args' is the list of arguments (or t if not recognized).
+           ;; `body' is the body of `lam' (or t if not recognized).
+           ((or `(lambda ,args . ,body)
+                (and (let args t) (let body t)))
+            lam)
+           ;; Get the `doc' from `body' or `rest'.
+           (doc (cond ((stringp (car-safe body)) (car body))
+                      ((stringp (car-safe rest)) (car rest))))
+           ;; Look for an interactive spec.
+           (interactive (pcase body
+                          ((or `((interactive . ,iargs) . ,_)
+                               `(,_ (interactive . ,iargs) . ,_))
+                           ;; List of modes or just t.
+                           (if (nthcdr 1 iargs)
+                               (list 'quote (nthcdr 1 iargs))
+                             t)))))
+        ;; Add the usage form at the end where describe-function-1
+        ;; can recover it.
+        (when (consp args) (setq doc (help-add-fundoc-usage doc args)))
+        ;; (message "autoload of %S" (nth 1 form))
+        `(autoload ,(nth 1 form) ,file ,doc ,interactive ,type)))
+
+     ((and expansion (memq car '(progn prog1)))
+      (let ((end (memq :autoload-end form)))
+       (when end             ;Cut-off anything after the :autoload-end marker.
+          (setq form (copy-sequence form))
+          (setcdr (memq :autoload-end form) nil))
+        (let ((exps (delq nil (mapcar (lambda (form)
+                                        (loaddefs-generate--make-autoload
+                                         form file expansion))
+                                      (cdr form)))))
+          (when exps (cons 'progn exps)))))
+
+     ;; For complex cases, try again on the macro-expansion.
+     ((and (memq car '(easy-mmode-define-global-mode define-global-minor-mode
+                       define-globalized-minor-mode defun defmacro
+                      easy-mmode-define-minor-mode define-minor-mode
+                       define-inline cl-defun cl-defmacro cl-defgeneric
+                       cl-defstruct pcase-defmacro))
+           (macrop car)
+          (setq expand (let ((load-true-file-name file)
+                              (load-file-name file))
+                          (macroexpand form)))
+          (memq (car expand) '(progn prog1 defalias)))
+      ;; Recurse on the expansion.
+      (loaddefs-generate--make-autoload expand file 'expansion))
+
+     ;; For special function-like operators, use the `autoload' function.
+     ((memq car '(define-skeleton define-derived-mode
+                   define-compilation-mode define-generic-mode
+                  easy-mmode-define-global-mode define-global-minor-mode
+                  define-globalized-minor-mode
+                  easy-mmode-define-minor-mode define-minor-mode
+                  cl-defun defun* cl-defmacro defmacro*
+                   define-overloadable-function))
+      (let* ((macrop (memq car '(defmacro cl-defmacro defmacro*)))
+            (name (nth 1 form))
+            (args (pcase car
+                     ((or 'defun 'defmacro
+                          'defun* 'defmacro* 'cl-defun 'cl-defmacro
+                          'define-overloadable-function)
+                      (nth 2 form))
+                     ('define-skeleton '(&optional str arg))
+                     ((or 'define-generic-mode 'define-derived-mode
+                          'define-compilation-mode)
+                      nil)
+                     (_ t)))
+            (body (nthcdr (or (function-get car 'doc-string-elt) 3) form))
+            (doc (if (stringp (car body)) (pop body))))
+        ;; Add the usage form at the end where describe-function-1
+        ;; can recover it.
+       (when (listp args) (setq doc (help-add-fundoc-usage doc args)))
+        ;; `define-generic-mode' quotes the name, so take care of that
+        `(autoload ,(if (listp name) name (list 'quote name))
+           ,file ,doc
+           ,(or (and (memq car '(define-skeleton define-derived-mode
+                                  define-generic-mode
+                                  easy-mmode-define-global-mode
+                                  define-global-minor-mode
+                                  define-globalized-minor-mode
+                                  easy-mmode-define-minor-mode
+                                  define-minor-mode))
+                     t)
+                (and (eq (car-safe (car body)) 'interactive)
+                     ;; List of modes or just t.
+                     (or (if (nthcdr 1 (car body))
+                             (list 'quote (nthcdr 1 (car body)))
+                           t))))
+           ,(if macrop ''macro nil))))
+
+     ;; For defclass forms, use `eieio-defclass-autoload'.
+     ((eq car 'defclass)
+      (let ((name (nth 1 form))
+           (superclasses (nth 2 form))
+           (doc (nth 4 form)))
+       (list 'eieio-defclass-autoload (list 'quote name)
+             (list 'quote superclasses) file doc)))
+
+     ;; Convert defcustom to less space-consuming data.
+     ((eq car 'defcustom)
+      (let* ((varname (car-safe (cdr-safe form)))
+            (props (nthcdr 4 form))
+            (initializer (plist-get props :initialize))
+            (init (car-safe (cdr-safe (cdr-safe form))))
+            (doc (car-safe (cdr-safe (cdr-safe (cdr-safe form)))))
+            ;; (rest (cdr-safe (cdr-safe (cdr-safe (cdr-safe form)))))
+            )
+       `(progn
+          ,(if (not (member initializer '(nil 'custom-initialize-default
+                                          #'custom-initialize-default
+                                          'custom-initialize-reset
+                                          #'custom-initialize-reset)))
+               form
+             `(defvar ,varname ,init ,doc))
+          ;; When we include the complete `form', this `custom-autoload'
+           ;; is not indispensable, but it still helps in case the `defcustom'
+           ;; doesn't specify its group explicitly, and probably in a few other
+           ;; corner cases.
+          (custom-autoload ',varname ,file
+                            ,(condition-case nil
+                                 (null (plist-get props :set))
+                               (error nil)))
+           ;; Propagate the :safe property to the loaddefs file.
+           ,@(when-let ((safe (plist-get props :safe)))
+               `((put ',varname 'safe-local-variable ,safe))))))
+
+     ((eq car 'defgroup)
+      ;; In Emacs this is normally handled separately by cus-dep.el, but for
+      ;; third party packages, it can be convenient to explicitly autoload
+      ;; a group.
+      (let ((groupname (nth 1 form)))
+        `(let ((loads (get ',groupname 'custom-loads)))
+           (if (member ',file loads) nil
+             (put ',groupname 'custom-loads (cons ',file loads))))))
+
+     ;; When processing a macro expansion, any expression
+     ;; before a :autoload-end should be included.  These are typically (put
+     ;; 'fun 'prop val) and things like that.
+     ((and expansion (consp form)) form)
+
+     ;; nil here indicates that this is not a special autoload form.
+     (t nil))))
+
+(defun loaddefs-generate--make-prefixes (defs file)
+  ;; Remove the defs that obey the rule that file foo.el (or
+  ;; foo-mode.el) uses "foo-" as prefix.  Then compute a small set of
+  ;; prefixes that cover all the remaining definitions.
+  (let* ((tree (let ((tree radix-tree-empty))
+                 (dolist (def defs)
+                   (setq tree (radix-tree-insert tree def t)))
+                 tree))
+         (prefixes nil))
+    ;; Get the root prefixes, that we should include in any case.
+    (radix-tree-iter-subtrees
+     tree (lambda (prefix subtree)
+            (push (cons prefix subtree) prefixes)))
+    ;; In some cases, the root prefixes are too short, e.g. if you define
+    ;; "cc-helper" and "c-mode", you'll get "c" in the root prefixes.
+    (dolist (pair (prog1 prefixes (setq prefixes nil)))
+      (let ((s (car pair)))
+        (if (or (and (> (length s) 2)   ; Long enough!
+                     ;; But don't use "def" from deffoo-pkg-thing.
+                     (not (string= "def" s)))
+                (string-match ".[[:punct:]]\\'" s) ;A real (tho short) prefix?
+                (radix-tree-lookup (cdr pair) "")) ;Nothing to expand!
+            (push pair prefixes)                   ;Keep it as is.
+          (radix-tree-iter-subtrees
+           (cdr pair) (lambda (prefix subtree)
+                        (push (cons (concat s prefix) subtree) prefixes))))))
+    (when prefixes
+      (let ((strings
+             (mapcar
+              (lambda (x)
+                (let ((prefix (car x)))
+                  (if (or (> (length prefix) 2) ;Long enough!
+                          (and (eq (length prefix) 2)
+                               (string-match "[[:punct:]]" prefix)))
+                      prefix
+                    ;; Some packages really don't follow the rules.
+                    ;; Drop the most egregious cases such as the
+                    ;; one-letter prefixes.
+                    (let ((dropped ()))
+                      (radix-tree-iter-mappings
+                       (cdr x) (lambda (s _)
+                                 (push (concat prefix s) dropped)))
+                      (message "%s:0: Warning: Not registering prefix \"%s\".  
Affects: %S"
+                               file prefix dropped)
+                      nil))))
+              prefixes)))
+        `(register-definition-prefixes ,file ',(sort (delq nil strings)
+                                                    'string<))))))
+
+(defun loaddefs-generate--parse-file (file main-outfile &optional package-data)
+  "Examing FILE for ;;;###autoload statements.
+MAIN-OUTFILE is the main loaddefs file these statements are
+destined for, but this can be overriden by the buffer-local
+setting of `generated-autoload-file' in FILE, and
+by ;;;###foo-autoload statements.
+
+If PACKAGE-DATA is `only', return only the package data.  If t,
+include the package data with the rest of the data.  Otherwise,
+don't include."
+  (let ((defs nil)
+        (load-name (loaddefs-generate--file-load-name file main-outfile))
+        (compute-prefixes t)
+        local-outfile inhibit-autoloads)
+    (with-temp-buffer
+      (insert-file-contents file)
+      (goto-char (point-max))
+      ;; We "open-code" this version of `hack-local-variables',
+      ;; because it's really slow in bootstrap-emacs.
+      (when (search-backward ";; Local Variables:" (- (point-max) 1000) t)
+        (save-excursion
+          (when (re-search-forward "generated-autoload-file: *" nil t)
+            ;; Buffer-local file that should be interpreted relative to
+            ;; the .el file.
+            (setq local-outfile (expand-file-name (read (current-buffer))
+                                                  (file-name-directory 
file)))))
+        (save-excursion
+          (when (re-search-forward "generated-autoload-load-name: *" nil t)
+            (setq load-name (read (current-buffer)))))
+        (save-excursion
+          (when (re-search-forward "no-update-autoloads: *" nil t)
+            (setq inhibit-autoloads (read (current-buffer)))))
+        (save-excursion
+          (when (re-search-forward "autoload-compute-prefixes: *" nil t)
+            (setq compute-prefixes (read (current-buffer))))))
+
+      ;; We always return the package version (even for pre-dumped
+      ;; files).
+      (when package-data
+        (let ((version (lm-header "version"))
+              package)
+          (when (and version
+                     (setq version (ignore-errors (version-to-list version)))
+                     (setq package (or (lm-header "package")
+                                       (file-name-sans-extension
+                                        (file-name-nondirectory file)))))
+            (push (list (or local-outfile main-outfile) file
+                        `(push (purecopy ',(cons (intern package) version))
+                               package--builtin-versions))
+                  defs))))
+
+      ;; Obey the `no-update-autoloads' file local variable.
+      (when (and (not inhibit-autoloads)
+                 (not (eq package-data 'only)))
+        (goto-char (point-min))
+        ;; The cookie might be like ;;;###tramp-autoload...
+        (while (re-search-forward lisp-mode-autoload-regexp nil t)
+          (when (or package-data
+                    ;; Outside of the main Emacs build (`package-data'
+                    ;; is set in the Emacs build), check that we don't
+                    ;; have an autoload cookie on the first column of a
+                    ;; doc string or the like.  (The Emacs tree
+                    ;; shouldn't contain any such instances.)
+                    (not (ppss-string-terminator (syntax-ppss))))
+            ;; ... and if we have one of these names, then alter outfile.
+            (let* ((aname (match-string 2))
+                   (to-file (if aname
+                                (expand-file-name
+                                 (concat aname "-loaddefs.el")
+                                 (file-name-directory file))
+                              (or local-outfile main-outfile))))
+              (if (eolp)
+                  ;; We have a form following.
+                  (let* ((form (prog1
+                                   (read (current-buffer))
+                                 (unless (bolp)
+                                   (forward-line 1))))
+                         (autoload (or (loaddefs-generate--make-autoload
+                                        form load-name)
+                                       form)))
+                    ;; We get back either an autoload form, or a tree
+                    ;; structure of `(progn ...)' things, so unravel that.
+                    (let ((forms (if (eq (car autoload) 'progn)
+                                     (cdr autoload)
+                                   (list autoload))))
+                      (while forms
+                        (let ((elem (pop forms)))
+                          (if (eq (car elem) 'progn)
+                              ;; More recursion; add it to the start.
+                              (setq forms (nconc (cdr elem) forms))
+                            ;; We have something to add to the defs; do it.
+                            (push (list to-file file elem) defs))))))
+                ;; Just put the rest of the line into the loaddefs.
+                ;; FIXME: We skip the first space if there's more
+                ;; whitespace after.
+                (when (looking-at-p " [\t ]")
+                  (forward-char 1))
+                (push (list to-file file
+                            (buffer-substring (point) (line-end-position)))
+                      defs)))))
+
+        (when (and autoload-compute-prefixes
+                   compute-prefixes)
+          (when-let ((form (loaddefs-generate--compute-prefixes load-name)))
+            ;; This output needs to always go in the main loaddefs.el,
+            ;; regardless of `generated-autoload-file'.
+            (push (list main-outfile file form) defs)))))
+    defs))
+
+(defun loaddefs-generate--compute-prefixes (load-name)
+  (goto-char (point-min))
+  (let ((prefs nil))
+    ;; Avoid (defvar <foo>) by requiring a trailing space.
+    (while (re-search-forward
+            "^(\\(def[^ ]+\\) ['(]*\\([^' ()\"\n]+\\)[\n \t]" nil t)
+      (unless (member (match-string 1) autoload-ignored-definitions)
+        (let ((name (match-string-no-properties 2)))
+          (when (save-excursion
+                  (goto-char (match-beginning 0))
+                  (or (bobp)
+                      (progn
+                        (forward-line -1)
+                        (not (looking-at ";;;###autoload")))))
+            (push name prefs)))))
+    (loaddefs-generate--make-prefixes prefs load-name)))
+
+(defun loaddefs-generate--rubric (file &optional type feature)
+  "Return a string giving the appropriate autoload rubric for FILE.
+TYPE (default \"autoloads\") is a string stating the type of
+information contained in FILE.  TYPE \"package\" acts like the default,
+but adds an extra line to the output to modify `load-path'.
+
+If FEATURE is non-nil, FILE will provide a feature.  FEATURE may
+be a string naming the feature, otherwise it will be based on
+FILE's name."
+  (let ((lp (and (equal type "package") (setq type "autoloads"))))
+    (with-temp-buffer
+      (generate-lisp-file-heading
+       file 'loaddefs-generate
+       :title (concat "automatically extracted " (or type "autoloads"))
+       :commentary (and (string-match "/lisp/loaddefs\\.el\\'" file)
+                        "This file will be copied to ldefs-boot.el and checked 
in periodically."))
+      (when lp
+        (insert "(add-to-list 'load-path (directory-file-name
+                         (or (file-name-directory #$) (car load-path))))\n\n"))
+      (insert "\n;;; End of scraped data\n\n")
+      (generate-lisp-file-trailer
+       file :provide (and (stringp feature) feature)
+       :inhibit-provide (not feature))
+      (buffer-string))))
+
+(defun loaddefs-generate--insert-section-header (outbuf autoloads
+                                                        load-name file time)
+  "Insert into buffer OUTBUF the section-header line for FILE.
+The header line lists the file name, its \"load name\", its autoloads,
+and the time the FILE was last updated (the time is inserted only
+if `autoload-timestamps' is non-nil, otherwise a fixed fake time is inserted)."
+  (insert "\f\n;;;### ")
+  (prin1 `(autoloads ,autoloads ,load-name ,file ,time)
+        outbuf)
+  (terpri outbuf)
+  ;; Break that line at spaces, to avoid very long lines.
+  ;; Make each sub-line into a comment.
+  (with-current-buffer outbuf
+    (save-excursion
+      (forward-line -1)
+      (while (not (eolp))
+       (move-to-column 64)
+       (skip-chars-forward "^ \n")
+       (or (eolp)
+           (insert "\n" ";;;;;; "))))))
+
+;;;###autoload
+(defun loaddefs-generate (dir output-file &optional excluded-files
+                              extra-data include-package-version
+                              generate-full)
+  "Generate loaddefs files for Lisp files in the directories DIRS.
+DIR can be either a single directory or a list of directories.
+
+The autoloads will be written to OUTPUT-FILE.  If any Lisp file
+binds `generated-autoload-file' as a file-local variable, write
+its autoloads into the specified file instead.
+
+The function does NOT recursively descend into subdirectories of the
+directory or directories specified.
+
+If EXTRA-DATA, include this string at the start of the generated
+file.  This will also force generation of OUTPUT-FILE even if
+there are no autoloads to put into the file.
+
+If INCLUDE-PACKAGE-VERSION, include package version data.
+
+If GENERATE-FULL, don't update, but regenerate all the loaddefs files."
+  (let* ((files-re (let ((tmp nil))
+                    (dolist (suf (get-load-suffixes))
+                       ;; We don't use module-file-suffix below because
+                       ;; we don't want to depend on whether Emacs was
+                       ;; built with or without modules support, nor
+                       ;; what is the suffix for the underlying OS.
+                      (unless (string-match "\\.\\(elc\\|so\\|dll\\)" suf)
+                         (push suf tmp)))
+                     (concat "\\`[^=.].*" (regexp-opt tmp t) "\\'")))
+        (files (apply #'nconc
+                      (mapcar (lambda (d)
+                                (directory-files (expand-file-name d)
+                                                  t files-re))
+                              (if (consp dir) dir (list dir)))))
+         (updating (and (file-exists-p output-file) (not generate-full)))
+         (defs nil))
+
+    ;; Collect all the autoload data.
+    (let ((progress (make-progress-reporter
+                     (byte-compile-info
+                      (concat "Scraping files for loaddefs"))
+                     0 (length files) nil 10))
+          (output-time
+           (file-attribute-modification-time (file-attributes output-file)))
+          (file-count 0))
+      (dolist (file files)
+        (progress-reporter-update progress (setq file-count (1+ file-count)))
+        (when (or (not updating)
+                  (time-less-p output-time
+                               (file-attribute-modification-time
+                                (file-attributes file))))
+          (setq defs (nconc
+                     (loaddefs-generate--parse-file
+                       file output-file
+                       ;; We only want the package name from the
+                       ;; excluded files.
+                       (and include-package-version
+                            (if (member (expand-file-name file) excluded-files)
+                                'only
+                              t)))
+                      defs))))
+      (progress-reporter-done progress))
+
+    ;; If we have no autoloads data, but we have EXTRA-DATA, then
+    ;; generate the (almost) empty file anyway.
+    (if (and (not defs) extra-data)
+        (with-temp-buffer
+          (insert (loaddefs-generate--rubric output-file nil t))
+          (search-backward "\f")
+          (insert extra-data)
+          (ensure-empty-lines 1)
+          (write-region (point-min) (point-max) output-file nil 'silent))
+      ;; We have some data, so generate the loaddef files.  First
+      ;; group per output file.
+      (dolist (fdefs (seq-group-by #'car defs))
+        (let ((loaddefs-file (car fdefs)))
+          (with-temp-buffer
+            (if (and updating (file-exists-p loaddefs-file))
+                (insert-file-contents loaddefs-file)
+              (insert (loaddefs-generate--rubric loaddefs-file nil t))
+              (search-backward "\f")
+              (when extra-data
+                (insert extra-data)
+                (ensure-empty-lines 1)))
+            ;; Then group by source file (and sort alphabetically).
+            (dolist (section (sort (seq-group-by #'cadr (cdr fdefs))
+                                   (lambda (e1 e2)
+                                     (string<
+                                      (file-name-sans-extension
+                                       (file-name-nondirectory (car e1)))
+                                      (file-name-sans-extension
+                                       (file-name-nondirectory (car e2)))))))
+              (pop section)
+              (let* ((relfile (file-relative-name
+                               (cadar section)
+                               (file-name-directory loaddefs-file)))
+                     (head (concat "\n\f\n;;; Generated autoloads from "
+                                   relfile "\n\n")))
+                (when (file-exists-p loaddefs-file)
+                  ;; If we're updating an old loaddefs file, then see if
+                  ;; there's a section here for this file already.
+                  (goto-char (point-min))
+                  (if (not (search-forward head nil t))
+                      ;; It's a new file; put the data at the end.
+                      (progn
+                        (goto-char (point-max))
+                        (search-backward "\f\n"))
+                    ;; Delete the old version of the section.
+                    (delete-region (match-beginning 0)
+                                   (and (search-forward "\n\f\n;;;")
+                                        (match-beginning 0)))
+                    (forward-line -2)))
+                (insert head)
+                (dolist (def (reverse section))
+                  (setq def (caddr def))
+                  (if (stringp def)
+                      (princ def (current-buffer))
+                    (loaddefs-generate--print-form def))
+                  (unless (bolp)
+                    (insert "\n")))))
+            (write-region (point-min) (point-max) loaddefs-file nil 'silent)
+            (byte-compile-info (file-relative-name loaddefs-file 
lisp-directory)
+                               t "GEN")))))))
+
+(defun loaddefs-generate--print-form (def)
+  "Print DEF in the way make-docfile.c expects it."
+  (if (or (not (consp def))
+          (not (symbolp (car def)))
+          (not (stringp (nth 3 def))))
+      (prin1 def (current-buffer) t)
+    ;; The salient point here is that we have to have the doc string
+    ;; that starts with a backslash and a newline, and there mustn't
+    ;; be any newlines before that.  So -- typically
+    ;; (defvar foo 'value "\
+    ;; Doc string" ...).
+    (insert "(")
+    (dotimes (_ 3)
+      (prin1 (pop def) (current-buffer)
+             '(t (escape-newlines . t)
+                 (escape-control-characters . t)))
+      (insert " "))
+    (let ((start (point)))
+      (prin1 (pop def) (current-buffer) t)
+      (save-excursion
+        (goto-char (1+ start))
+        (insert "\\\n")))
+    (while def
+      (insert " ")
+      (prin1 (pop def) (current-buffer) t))
+    (insert ")")))
+
+(defun loaddefs-generate--excluded-files ()
+  ;; Exclude those files that are preloaded on ALL platforms.
+  ;; These are the ones in loadup.el where "(load" is at the start
+  ;; of the line (crude, but it works).
+  (let ((default-directory (file-name-directory lisp-directory))
+        (excludes nil)
+       file)
+    (with-temp-buffer
+      (insert-file-contents "loadup.el")
+      (while (re-search-forward "^(load \"\\([^\"]+\\)\"" nil t)
+       (setq file (match-string 1))
+       (or (string-match "\\.el\\'" file)
+           (setq file (format "%s.el" file)))
+       (or (string-match "\\`site-" file)
+           (push (expand-file-name file) excludes))))
+    ;; Don't scan ldefs-boot.el, either.
+    (cons (expand-file-name "ldefs-boot.el") excludes)))
+
+;;;###autoload
+(defun loaddefs-generate-batch ()
+  "Generate loaddefs.el files in batch mode.
+This scans for ;;;###autoload forms and related things.
+
+The first element on the command line should be the (main)
+loaddefs.el output file, and the rest are the directories to
+use."
+  (let ((args command-line-args-left))
+    (setq command-line-args-left nil)
+    (loaddefs-generate (cdr args) (expand-file-name (car args)))))
+
+(defun loaddefs-generate--emacs-batch ()
+  "Generate the loaddefs for the Emacs build.
+This is like `loaddefs-generate-batch', but has some specific
+rules for built-in packages and excluded files."
+  (let ((args command-line-args-left)
+        (output-file (expand-file-name "loaddefs.el" lisp-directory)))
+    (setq command-line-args-left nil)
+    (loaddefs-generate
+     args output-file
+     (loaddefs-generate--excluded-files)
+     nil t
+     ;; Always do a complete update if loaddefs-gen.el has been
+     ;; updated.
+     (file-newer-than-file-p
+      (expand-file-name "emacs-lisp/loaddefs-gen.el" lisp-directory)
+      output-file))))
+
+(provide 'loaddefs-gen)
+
+;;; loaddefs-gen.el ends here
diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el
index 51c6e8e0ca..bae303c213 100644
--- a/lisp/emacs-lisp/macroexp.el
+++ b/lisp/emacs-lisp/macroexp.el
@@ -369,6 +369,54 @@ Assumes the caller has bound 
`macroexpand-all-environment'."
                    (macroexp--all-forms body))
                  (cdr form))
                 form)))
+            (`(setq ,(and var (pred symbolp)
+                          (pred (not booleanp)) (pred (not keywordp)))
+                    ,expr)
+             ;; Fast path for the setq common case.
+             (let ((new-expr (macroexp--expand-all expr)))
+               (if (eq new-expr expr)
+                   form
+                 `(,fn ,var ,new-expr))))
+            (`(setq . ,args)
+             ;; Normalise to a sequence of (setq SYM EXPR).
+             ;; Malformed code is translated to code that signals an error
+             ;; at run time.
+             (let ((nargs (length args)))
+               (if (/= (logand nargs 1) 0)
+                   (macroexp-warn-and-return
+                    "odd number of arguments in `setq' form"
+                    `(signal 'wrong-number-of-arguments '(setq ,nargs))
+                    nil 'compile-only fn)
+                 (let ((assignments nil))
+                   (while (consp (cdr-safe args))
+                     (let* ((var (car args))
+                            (expr (cadr args))
+                            (new-expr (macroexp--expand-all expr))
+                            (assignment
+                             (if (and (symbolp var)
+                                      (not (booleanp var)) (not (keywordp 
var)))
+                                 `(,fn ,var ,new-expr)
+                               (macroexp-warn-and-return
+                                (format-message "attempt to set %s `%s'"
+                                                (if (symbolp var)
+                                                    "constant"
+                                                  "non-variable")
+                                                var)
+                                (cond
+                                 ((keywordp var)
+                                  ;; Accept `(setq :a :a)' for compatibility.
+                                  `(if (eq ,var ,new-expr)
+                                       ,var
+                                     (signal 'setting-constant (list ',var))))
+                                 ((symbolp var)
+                                  `(signal 'setting-constant (list ',var)))
+                                 (t
+                                  `(signal 'wrong-type-argument
+                                           (list 'symbolp ',var))))
+                                nil 'compile-only var))))
+                       (push assignment assignments))
+                     (setq args (cddr args)))
+                   (cons 'progn (nreverse assignments))))))
             (`(,(and fun `(lambda . ,_)) . ,args)
              ;; Embedded lambda in function position.
              ;; If the byte-optimizer is loaded, try to unfold this,
diff --git a/lisp/emacs-lisp/memory-report.el b/lisp/emacs-lisp/memory-report.el
index 6cb4cb02e0..56b1ea6ed4 100644
--- a/lisp/emacs-lisp/memory-report.el
+++ b/lisp/emacs-lisp/memory-report.el
@@ -183,6 +183,10 @@ by counted more than once."
 (cl-defgeneric memory-report--object-size-1 (_counted _value)
   0)
 
+;; This shouldn't happen, but there's some leakage.
+(cl-defmethod memory-report--object-size-1 (_ (_value symbol-with-pos))
+  (memory-report--size 'symbol))
+
 (cl-defmethod memory-report--object-size-1 (_ (value symbol))
   ;; Don't count global symbols -- makes sizes of lists of symbols too
   ;; heavy.
diff --git a/lisp/emacs-lisp/oclosure.el b/lisp/emacs-lisp/oclosure.el
index cb8c59b05a..9775e8cc65 100644
--- a/lisp/emacs-lisp/oclosure.el
+++ b/lisp/emacs-lisp/oclosure.el
@@ -223,7 +223,7 @@ list of slot properties.  The currently known properties 
are the following:
   `:mutable': A non-nil value mean the slot can be mutated.
   `:type': Specifies the type of the values expected to appear in the slot."
   (declare (doc-string 2) (indent 1))
-  (unless (stringp docstring)
+  (unless (or (stringp docstring) (null docstring))
     (push docstring slots)
     (setq docstring nil))
   (let* ((options (when (consp name)
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 58c1349e1c..9aaeb052d0 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1003,6 +1003,7 @@ untar into a directory named DIR; otherwise, signal an 
error."
 
 (defun package-autoload-ensure-default-file (file)
   "Make sure that the autoload file FILE exists and if not create it."
+  (declare (obsolete nil "29.1"))
   (unless (file-exists-p file)
     (require 'autoload)
     (let ((coding-system-for-write 'utf-8-emacs-unix))
@@ -1021,8 +1022,11 @@ untar into a directory named DIR; otherwise, signal an 
error."
          (autoload-timestamps nil)
          (backup-inhibited t)
          (version-control 'never))
-    (package-autoload-ensure-default-file output-file)
-    (make-directory-autoloads pkg-dir output-file)
+    (loaddefs-generate
+     pkg-dir output-file
+     nil
+     "(add-to-list 'load-path (directory-file-name
+                         (or (file-name-directory #$) (car load-path))))")
     (let ((buf (find-buffer-visiting output-file)))
       (when buf (kill-buffer buf)))
     auto-name))
@@ -1629,7 +1633,9 @@ The variable `package-load-list' controls which packages 
to load."
          (qs (if (file-readable-p elc) elc
                (if (file-readable-p package-quickstart-file)
                    package-quickstart-file))))
-    (if qs
+    ;; The quickstart file presumes that it has a blank slate,
+    ;; so don't use it if we already activated some packages.
+    (if (and qs (not (bound-and-true-p package-activated-list)))
         ;; Skip load-source-file-function which would slow us down by a factor
         ;; 2 when loading the .el file (this assumes we were careful to
         ;; save this file so it doesn't need any decoding).
@@ -2140,26 +2146,56 @@ to install it but still mark it as selected."
 (defun package-update (name)
   "Update package NAME if a newer version exists."
   (interactive
-   (progn
-     ;; Initialize the package system to get the list of package
-     ;; symbols for completion.
-     (package--archives-initialize)
-     (list (completing-read
-            "Update package: "
-            (mapcar
-             #'car
-             (seq-filter
-              (lambda (elt)
-                (let ((available
-                       (assq (car elt) package-archive-contents)))
-                  (and available
-                       (version-list-<
-                        (package-desc-priority-version (cadr elt))
-                        (package-desc-priority-version (cadr available))))))
-              package-alist))
-            nil t))))
-  (package-delete (cadr (assq (intern name) package-alist)) 'force)
-  (package-install (intern name) 'dont-select))
+   (list (completing-read
+          "Update package: " (package--updateable-packages) nil t)))
+  (let ((package (if (symbolp name)
+                     name
+                   (intern name))))
+    (package-delete (cadr (assq package package-alist)) 'force)
+    (package-install package 'dont-select)))
+
+(defun package--updateable-packages ()
+  ;; Initialize the package system to get the list of package
+  ;; symbols for completion.
+  (package--archives-initialize)
+  (mapcar
+   #'car
+   (seq-filter
+    (lambda (elt)
+      (let ((available
+             (assq (car elt) package-archive-contents)))
+        (and available
+             (version-list-<
+              (package-desc-priority-version (cadr elt))
+              (package-desc-priority-version (cadr available))))))
+    package-alist)))
+
+;;;###autoload
+(defun package-update-all (&optional query)
+  "Refresh package list and upgrade all packages.
+If QUERY, ask the user before updating packages.  When called
+interactively, QUERY is always true."
+  (interactive (list (not noninteractive)))
+  (package-refresh-contents)
+  (let ((updateable (package--updateable-packages)))
+    (if (not updateable)
+        (message "No packages to update")
+      (when (and query
+                 (not (yes-or-no-p
+                       (if (length= updateable 1)
+                           "One package to update.  Do it? "
+                         (format "%s packages to update.  Do it?"
+                                 (length updateable))))))
+        (user-error "Updating aborted"))
+      (mapc #'package-update updateable))))
+
+(defun package--dependencies (pkg)
+  "Return a list of all dependencies PKG has.
+This is done recursively."
+  ;; Can we have circular dependencies?  Assume "nope".
+  (when-let* ((desc (cadr (assq pkg package-archive-contents)))
+              (deps (mapcar #'car (package-desc-reqs desc))))
+    (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps)))))
 
 (defun package-strip-rcs-id (str)
   "Strip RCS version ID from the version string STR.
@@ -2885,7 +2921,13 @@ either a full name or nil, and EMAIL is a valid email 
address."
 
 (define-derived-mode package-menu-mode tabulated-list-mode "Package Menu"
   "Major mode for browsing a list of packages.
-Letters do not insert themselves; instead, they are commands.
+The most useful commands here are:
+
+  `x': Install the package under point if it isn't already installed,
+       and delete it if it's already installed,
+  `i': mark a package for installation, and
+  `d': mark a package for deletion.  Use the `x' command to perform the
+       actions on the marked files.
 \\<package-menu-mode-map>
 \\{package-menu-mode-map}"
   :interactive nil
@@ -3547,17 +3589,34 @@ immediately."
     (setq package-menu--mark-upgrades-pending t)
     (message "Waiting for refresh to finish...")))
 
-(defun package-menu--list-to-prompt (packages)
+(defun package-menu--list-to-prompt (packages &optional include-dependencies)
   "Return a string listing PACKAGES that's usable in a prompt.
 PACKAGES is a list of `package-desc' objects.
 Formats the returned string to be usable in a minibuffer
-prompt (see `package-menu--prompt-transaction-p')."
+prompt (see `package-menu--prompt-transaction-p').
+
+If INCLUDE-DEPENDENCIES, also include the number of uninstalled
+dependencies."
   ;; The case where `package' is empty is handled in
   ;; `package-menu--prompt-transaction-p' below.
-  (format "%d (%s)"
+  (format "%d (%s)%s"
           (length packages)
-          (mapconcat #'package-desc-full-name packages " ")))
-
+          (mapconcat #'package-desc-full-name packages " ")
+          (let ((deps
+                 (seq-remove
+                  #'package-installed-p
+                  (delete-dups
+                   (apply
+                    #'nconc
+                    (mapcar (lambda (package)
+                              (package--dependencies
+                               (package-desc-name package)))
+                            packages))))))
+            (if (and include-dependencies deps)
+                (if (length= deps 1)
+                    (format " plus 1 dependency")
+                  (format " plus %d dependencies" (length deps)))
+              ""))))
 
 (defun package-menu--prompt-transaction-p (delete install upgrade)
   "Prompt the user about DELETE, INSTALL, and UPGRADE.
@@ -3566,11 +3625,14 @@ Either may be nil, but not all."
   (y-or-n-p
    (concat
     (when delete
-      (format "Packages to delete: %s.  " (package-menu--list-to-prompt 
delete)))
+      (format "Packages to delete: %s.  "
+              (package-menu--list-to-prompt delete)))
     (when install
-      (format "Packages to install: %s.  " (package-menu--list-to-prompt 
install)))
+      (format "Packages to install: %s.  "
+              (package-menu--list-to-prompt install t)))
     (when upgrade
-      (format "Packages to upgrade: %s.  " (package-menu--list-to-prompt 
upgrade)))
+      (format "Packages to upgrade: %s.  "
+              (package-menu--list-to-prompt upgrade)))
     "Proceed? ")))
 
 
@@ -3632,8 +3694,13 @@ packages list, respectively."
 (defun package-menu-execute (&optional noquery)
   "Perform marked Package Menu actions.
 Packages marked for installation are downloaded and installed,
-packages marked for deletion are removed,
-and packages marked for upgrading are downloaded and upgraded.
+packages marked for deletion are removed, and packages marked for
+upgrading are downloaded and upgraded.
+
+If no packages are marked, the action taken depends on the state
+of the package under point.  If it's not already installed, this
+command will install the package, and if it's installed, it will
+delete the package.
 
 Optional argument NOQUERY non-nil means do not ask the user to confirm."
   (interactive nil package-menu-mode)
@@ -3651,8 +3718,20 @@ Optional argument NOQUERY non-nil means do not ask the 
user to confirm."
                 ((eq cmd ?I)
                  (push pkg-desc install-list))))
         (forward-line)))
+    ;; Nothing marked.
     (unless (or delete-list install-list)
-      (user-error "No operations specified"))
+      ;; Not on a package line.
+      (unless (tabulated-list-get-id)
+        (user-error "No operations specified"))
+      (let* ((id (tabulated-list-get-id))
+             (status (package-menu-get-status)))
+        (cond
+         ((member status '("installed"))
+          (push id delete-list))
+         ((member status '("available" "avail-obso" "new" "dependency"))
+          (push id install-list))
+         (t (user-error "No default action available for status: %s"
+                        status)))))
     (let-alist (package-menu--partition-transaction install-list delete-list)
       (when (or noquery
                 (package-menu--prompt-transaction-p .delete .install .upgrade))
@@ -3884,16 +3963,14 @@ packages."
                       (mapcar #'car package-archives)))
                package-menu-mode)
   (package--ensure-package-menu-mode)
-  (let ((re (if (listp archive)
-                (regexp-opt archive)
-              archive)))
-    (package-menu--filter-by (lambda (pkg-desc)
-                        (let ((pkg-archive (package-desc-archive pkg-desc)))
-                          (and pkg-archive
-                               (string-match-p re pkg-archive))))
-                      (concat "archive:" (if (listp archive)
-                                             (string-join archive ",")
-                                           archive)))))
+  (let ((archives (ensure-list archive)))
+    (package-menu--filter-by
+     (lambda (pkg-desc)
+       (let ((pkg-archive (package-desc-archive pkg-desc)))
+         (or (null archives)
+             (and pkg-archive
+                  (member pkg-archive archives)))))
+     (concat "archive:" (string-join archives ",")))))
 
 (defun package-menu-filter-by-description (description)
   "Filter the \"*Packages*\" buffer by DESCRIPTION regexp.
@@ -4213,18 +4290,19 @@ activations need to be changed, such as when 
`package-load-list' is modified."
                   (locate-library (package--autoloads-file-name pkg))))
                (pfile (prin1-to-string file)))
           (insert "(let ((load-true-file-name " pfile ")\
-(load-file-name " pfile "))\n")
+\(load-file-name " pfile "))\n")
           (insert-file-contents file)
           ;; Fixup the special #$ reader form and throw away comments.
           (while (re-search-forward "#\\$\\|^;\\(.*\n\\)" nil 'move)
-            (unless (nth 8 (syntax-ppss))
+            (unless (ppss-string-terminator (save-match-data (syntax-ppss)))
               (replace-match (if (match-end 1) "" pfile) t t)))
           (unless (bolp) (insert "\n"))
           (insert ")\n")))
       (pp `(defvar package-activated-list) (current-buffer))
       (pp `(setq package-activated-list
-                 (append ',(mapcar #'package-desc-name 
package--quickstart-pkgs)
-                         package-activated-list))
+                 (delete-dups
+                  (append ',(mapcar #'package-desc-name 
package--quickstart-pkgs)
+                          package-activated-list)))
           (current-buffer))
       (let ((info-dirs (butlast Info-directory-list)))
         (when info-dirs
diff --git a/lisp/emacs-lisp/pp.el b/lisp/emacs-lisp/pp.el
index ad693fa5a6..a3ff2ecbaa 100644
--- a/lisp/emacs-lisp/pp.el
+++ b/lisp/emacs-lisp/pp.el
@@ -250,7 +250,7 @@ Use the `pp-max-width' variable to control the desired line 
length."
                                    (set-marker (make-marker) (1- (point))))))
               (pp--format-list sexp)))
            (t
-            (princ sexp (current-buffer)))))
+            (prin1 sexp (current-buffer)))))
     ;; Print some of the smaller integers as characters, perhaps?
     (integer
      (if (<= ?0 sexp ?z)
@@ -382,7 +382,7 @@ Use the `pp-max-width' variable to control the desired line 
length."
         (when (> (current-column) (pp--max-width))
           (condition-case ()
               (backward-up-list 1)
-            (:success (when (looking-back " " 2)
+            (:success (when (and (not (bobp)) (looking-back " " 2))
                         (insert "\n")))
             (error nil)))))))
 
diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el
index 340fe766c1..a1256ce1b8 100644
--- a/lisp/emacs-lisp/shortdoc.el
+++ b/lisp/emacs-lisp/shortdoc.el
@@ -83,7 +83,7 @@ together:
 If EVAL is a string, it will be inserted as is, and then that
 string will be `read' and evaluated.
 
-2. Document a form or string, but manually document its evalation
+2. Document a form or string, but manually document its evaluation
    result.  The provided form will not be evaluated.
 
   (FUNC
@@ -260,11 +260,16 @@ A FUNC form can have any number of `:no-eval' (or 
`:no-value'),
    :no-manual t
    :eval (string-blank-p " \n"))
   (string-lessp
-   :eval (string-lessp "foo" "bar"))
+   :eval (string-lessp "foo" "bar")
+   :eval (string-lessp "pic4.png" "pic32.png")
+   :eval (string-lessp "1.1" "1 2"))
   (string-greaterp
    :eval (string-greaterp "foo" "bar"))
   (string-version-lessp
-   :eval (string-version-lessp "pic4.png" "pic32.png"))
+   :eval (string-version-lessp "pic4.png" "pic32.png")
+   :eval (string-version-lessp "1.1" "1 2"))
+  (string-collate-lessp
+   :eval (string-collate-lessp "1.1" "1 2"))
   (string-prefix-p
    :eval (string-prefix-p "foo" "foobar"))
   (string-suffix-p
@@ -463,7 +468,9 @@ A FUNC form can have any number of `:no-eval' (or 
`:no-value'),
    :no-eval* (directory-files-and-attributes "/tmp/foo"))
   (file-expand-wildcards
    :no-eval (file-expand-wildcards "/tmp/*.png")
-   :eg-result ("/tmp/foo.png" "/tmp/zot.png"))
+   :eg-result ("/tmp/foo.png" "/tmp/zot.png")
+   :no-eval (file-expand-wildcards "/*/foo.png")
+   :eg-result ("/tmp/foo.png" "/var/foo.png"))
   (locate-dominating-file
    :no-eval (locate-dominating-file "foo.png" "/tmp/foo/bar/zot")
    :eg-result "/tmp/foo.png")
diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el
index 7cc076cd80..a4d7beade1 100644
--- a/lisp/emacs-lisp/syntax.el
+++ b/lisp/emacs-lisp/syntax.el
@@ -545,10 +545,11 @@ These are valid when the buffer has no restriction.")
 
 (defun syntax-ppss (&optional pos)
   "Parse-Partial-Sexp State at POS, defaulting to point.
+If POS is given, this function moves point to POS.
+
 The returned value is the same as that of `parse-partial-sexp'
 run from `point-min' to POS except that values at positions 2 and 6
 in the returned list (counting from 0) cannot be relied upon.
-Point is at POS when this function returns.
 
 It is necessary to call `syntax-ppss-flush-cache' explicitly if
 this function is called while `before-change-functions' is
diff --git a/lisp/emacs-lisp/tabulated-list.el 
b/lisp/emacs-lisp/tabulated-list.el
index b740a7457a..7d815a3ced 100644
--- a/lisp/emacs-lisp/tabulated-list.el
+++ b/lisp/emacs-lisp/tabulated-list.el
@@ -264,18 +264,14 @@ variables `tabulated-list-tty-sort-indicator-asc' and
 Populated by `tabulated-list-init-header'.")
 (defvar tabulated-list--header-overlay nil)
 
-(defun tabulated-list-line-number-width ()
-  "Return the width taken by `display-line-numbers' in the current buffer."
-  ;; line-number-display-width returns the value for the selected
-  ;; window, which might not be the window in which the current buffer
-  ;; is displayed.
-  (if (not display-line-numbers)
-           0
-    (let ((cbuf-window (get-buffer-window (current-buffer) t)))
-      (if (window-live-p cbuf-window)
-          (with-selected-window cbuf-window
-            (line-number-display-width 'columns))
-        4))))
+(define-obsolete-function-alias 'tabulated-list-line-number-width
+  'header-line-indent--line-number-width "29.1")
+(define-obsolete-function-alias 'tabulated-list-watch-line-number-width
+  'header-line-indent--watch-line-number-width "29.1")
+(define-obsolete-function-alias 'tabulated-list-watch-line-number-width
+  'header-line-indent--watch-line-number-width "29.1")
+(define-obsolete-function-alias 'tabulated-list-window-scroll-function
+  'header-line-indent--window-scroll-function "29.1")
 
 (defun tabulated-list-init-header ()
   "Set up header line for the Tabulated List buffer."
@@ -289,9 +285,9 @@ Populated by `tabulated-list-init-header'.")
          (hcols (mapcar #'car tabulated-list-format))
          (tabulated-list--near-rows (list hcols hcols))
         (cols nil))
-    (if display-line-numbers
-        (setq x (+ x (tabulated-list-line-number-width))))
-    (push (propertize " " 'display `(space :align-to ,x)) cols)
+    (push (propertize " " 'display
+                      `(space :align-to (+ header-line-indent-width ,x)))
+          cols)
     (dotimes (n len)
       (let* ((col (aref tabulated-list-format n))
              (not-last-col (< n (1- len)))
@@ -342,20 +338,25 @@ Populated by `tabulated-list-init-header'.")
             (when (> shift 0)
               (setq cols
                     (cons (car cols)
-                          (cons (propertize (make-string shift ?\s)
-                                            'display
-                                            `(space :align-to ,(+ x shift)))
-                                (cdr cols))))
+                          (cons
+                           (propertize
+                            (make-string shift ?\s)
+                            'display
+                            `(space :align-to
+                                    (+ header-line-indent-width ,(+ x shift))))
+                           (cdr cols))))
               (setq x (+ x shift)))))
        (if (>= pad-right 0)
-           (push (propertize " "
-                             'display `(space :align-to ,next-x)
-                             'face 'fixed-pitch)
+           (push (propertize
+                   " "
+                  'display `(space :align-to
+                                    (+ header-line-indent-width ,next-x))
+                  'face 'fixed-pitch)
                  cols))
         (setq x next-x)))
     (setq cols (apply 'concat (nreverse cols)))
     (if tabulated-list-use-header-line
-       (setq header-line-format cols)
+       (setq header-line-format (list "" 'header-line-indent cols))
       (setq-local tabulated-list--header-string cols))))
 
 (defun tabulated-list-print-fake-header ()
@@ -770,23 +771,6 @@ Interactively, N is the prefix numeric argument, and 
defaults to
   (interactive "p")
   (tabulated-list-widen-current-column (- n)))
 
-(defvar tabulated-list--current-lnum-width nil)
-(defun tabulated-list-watch-line-number-width (_window)
-  (if display-line-numbers
-      (let ((lnum-width (tabulated-list-line-number-width)))
-        (when (not (= tabulated-list--current-lnum-width lnum-width))
-          (setq-local tabulated-list--current-lnum-width lnum-width)
-          (tabulated-list-init-header)))))
-
-(defun tabulated-list-window-scroll-function (window _start)
-  (if display-line-numbers
-      (let ((lnum-width
-             (with-selected-window window
-               (line-number-display-width 'columns))))
-        (when (not (= tabulated-list--current-lnum-width lnum-width))
-          (setq-local tabulated-list--current-lnum-width lnum-width)
-          (tabulated-list-init-header)))))
-
 (defun tabulated-list-next-column (&optional arg)
   "Go to the start of the next column after point on the current line.
 If ARG is provided, move that many columns."
@@ -857,15 +841,7 @@ as the ewoc pretty-printer."
   ;; Avoid messing up the entries' display just because the first
   ;; column of the first entry happens to begin with a R2L letter.
   (setq bidi-paragraph-direction 'left-to-right)
-  ;; This is for if/when they turn on display-line-numbers
-  (add-hook 'display-line-numbers-mode-hook #'tabulated-list-revert nil t)
-  ;; This is for if/when they customize the line-number face or when
-  ;; the line-number width needs to change due to scrolling.
-  (setq-local tabulated-list--current-lnum-width 0)
-  (add-hook 'pre-redisplay-functions
-            #'tabulated-list-watch-line-number-width nil t)
-  (add-hook 'window-scroll-functions
-            #'tabulated-list-window-scroll-function nil t))
+  (header-line-indent-mode))
 
 (put 'tabulated-list-mode 'mode-class 'special)
 
diff --git a/lisp/epa-ks.el b/lisp/epa-ks.el
index 1078c209ae..f41429f773 100644
--- a/lisp/epa-ks.el
+++ b/lisp/epa-ks.el
@@ -338,4 +338,6 @@ enough, since keyservers have strict timeout settings."
       (forward-line))
     keys))
 
+(provide 'epa-ks)
+
 ;;; epa-ks.el ends here
diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index 4b21711da4..1252a5b4fa 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -315,8 +315,7 @@ This will only be consulted if the coding system in
   :version "24.1"
   :type '(repeat coding-system))
 
-(defcustom erc-server-coding-system (if (and (fboundp 'coding-system-p)
-                                             (coding-system-p 'undecided)
+(defcustom erc-server-coding-system (if (and (coding-system-p 'undecided)
                                              (coding-system-p 'utf-8))
                                         '(utf-8 . undecided)
                                       nil)
@@ -1192,7 +1191,7 @@ Would expand to:
                         aliases))
   (let* ((hook-name (intern (format "erc-server-%s-functions" name)))
          (fn-name (intern (format "erc-server-%s" name)))
-         (hook-doc (format-message "\
+         (hook-doc (format "\
 %sHook called upon receiving a %%s server response.
 Each function is called with two arguments, the process associated
 with the response and the parsed response.  If the function returns
@@ -1203,7 +1202,7 @@ See also `%s'."
                                (concat extra-var-doc "\n\n")
                              "")
                            fn-name))
-         (fn-doc (format-message "\
+         (fn-doc (format "\
 %sHandler for a %s server response.
 PROC is the server process which returned the response.
 PARSED is the actual response as an `erc-response' struct.
diff --git a/lisp/erc/erc-button.el b/lisp/erc/erc-button.el
index 0e7d0d584f..aeada705c4 100644
--- a/lisp/erc/erc-button.el
+++ b/lisp/erc/erc-button.el
@@ -125,7 +125,7 @@ longer than `erc-fill-column'."
   ;; a button, it makes no sense to optimize performance by
   ;; bytecompiling lambdas in this alist.  On the other hand, it makes
   ;; things hard to maintain.
-  '(('nicknames 0 erc-button-buttonize-nicks erc-nick-popup 0)
+  '((nicknames 0 erc-button-buttonize-nicks erc-nick-popup 0)
     (erc-button-url-regexp 0 t browse-url-button-open-url 0)
     ("<URL: *\\([^<> ]+\\) *>" 0 t browse-url-button-open-url 1)
 ;;; ("(\\(\\([^~\n \t@][^\n \t@]*\\)@\\([a-zA-Z0-9.:-]+\\)\\)" 1 t finger 2 3)
@@ -158,12 +158,12 @@ REGEXP is the string matching text around the button or a 
symbol
   strings, or an alist with the strings in the car.  Note that
   entries in lists or alists are considered to be nicks or other
   complete words.  Therefore they are enclosed in \\< and \\>
-  while searching.  REGEXP can also be the quoted symbol
-  \\='nicknames, which matches the nickname of any user on the
+  while searching.  REGEXP can also be the symbol
+  `nicknames', which matches the nickname of any user on the
   current server.
 
 BUTTON is the number of the regexp grouping actually matching the
-  button.  This is ignored if REGEXP is \\='nicknames.
+  button.  This is ignored if REGEXP is `nicknames'.
 
 FORM is a Lisp expression which must eval to true for the button to
   be added.
@@ -174,17 +174,15 @@ CALLBACK is the function to call when the user push this 
button.
 
 PAR is a number of a regexp grouping whose text will be passed to
   CALLBACK.  There can be several PAR arguments.  If REGEXP is
-  \\='nicknames, these are ignored, and CALLBACK will be called with
+  `nicknames', these are ignored, and CALLBACK will be called with
   the nickname matched as the argument."
-  :version "24.1"                       ; remove finger (bug#4443)
+  :version "29.1"
   :type '(repeat
           (list :tag "Button"
                 (choice :tag "Matches"
                         regexp
                         (variable :tag "Variable containing regexp")
-                        ;; FIXME It really does mean 'nicknames
-                        ;; rather than just nicknames.
-                        (const :tag "Nicknames" 'nicknames))
+                        (const :tag "Nicknames" nicknames))
                 (integer :tag "Number of the regexp section that matches")
                 (choice :tag "When to buttonize"
                         (const :tag "Always" t)
@@ -256,7 +254,9 @@ specified by `erc-button-alist'."
             regexp)
         (erc-button-remove-old-buttons)
         (dolist (entry alist)
-          (if (equal (car entry) (quote (quote nicknames)))
+          (if (or (eq (car entry) 'nicknames)
+                  ;; Old form retained for backward compatibility.
+                  (equal (car entry) (quote 'nicknames)))
               (erc-button-add-nickname-buttons entry)
             (progn
               (setq regexp (or (and (stringp (car entry)) (car entry))
diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el
index 59bfd24603..ff486b2d4e 100644
--- a/lisp/erc/erc-dcc.el
+++ b/lisp/erc/erc-dcc.el
@@ -43,7 +43,7 @@
 ;;  /dcc chat nick - Either accept pending chat offer from nick, or offer
 ;;                   DCC chat to nick
 ;;  /dcc close type [nick] - Close DCC connection (SEND/GET/CHAT) with nick
-;;  /dcc get nick [file] - Accept DCC offer from nick
+;;  /dcc get [-t][-s] nick [file] - Accept DCC offer from nick
 ;;  /dcc list - List all DCC offers/connections
 ;;  /dcc send nick file - Offer DCC SEND to nick
 
@@ -105,7 +105,11 @@ Looks like:
  :file - for outgoing sends, the full path to the file.  For incoming sends,
          the suggested filename or vetted filename
 
- :size - size of the file, may be nil on incoming DCCs")
+ :size - size of the file, may be nil on incoming DCCs
+
+ :secure - optional item indicating sender support for TLS
+
+ :turbo - optional item indicating sender support for TSEND")
 
 (defun erc-dcc-list-add (type nick peer parent &rest args)
   "Add a new entry of type TYPE to `erc-dcc-list' and return it."
@@ -119,12 +123,13 @@ Looks like:
 ;; more: the entry data from erc-dcc-list for this particular process.
 (defvar erc-dcc-connect-function 'erc-dcc-open-network-stream)
 
-(defun erc-dcc-open-network-stream (procname buffer addr port _entry)
+(defun erc-dcc-open-network-stream (procname buffer addr port entry)
   ;; FIXME: Time to try activating this again!?
   (if nil;  (fboundp 'open-network-stream-nowait)  ;; this currently crashes
                                                    ;; cvs emacs
       (open-network-stream-nowait procname buffer addr port)
-    (open-network-stream procname buffer addr port)))
+    (open-network-stream procname buffer addr port
+                         :type (and (plist-get entry :secure) 'tls))))
 
 (erc-define-catalog
  'english
@@ -144,13 +149,14 @@ Looks like:
    (dcc-get-bytes-received . "DCC: %f: %b bytes received")
    (dcc-get-complete
     . "DCC: file %f transfer complete (%s bytes in %t seconds)")
+   (dcc-get-failed . "DCC: file %f transfer failed at %s of %v in %t seconds")
    (dcc-get-cmd-aborted . "DCC: Aborted getting %f from %n")
    (dcc-get-file-too-long
     . "DCC: %f: File longer than sender claimed; aborting transfer")
    (dcc-get-notfound . "DCC: %n hasn't offered %f for DCC transfer")
-   (dcc-list-head . "DCC: From      Type  Active  Size            Filename")
-   (dcc-list-line . "DCC: --------  ----  ------  --------------  --------")
-   (dcc-list-item . "DCC: %-8n  %-4t  %-6a  %-14s  %f")
+   (dcc-list-head . "DCC: From      Type  Active  Size               Filename")
+   (dcc-list-line . "DCC: --------  ----  ------  -----------------  --------")
+   (dcc-list-item . "DCC: %-8n  %-4t  %-6a  %-17s  %f%u")
    (dcc-list-end  . "DCC: End of list.")
    (dcc-malformed . "DCC: error: %n (%u@%h) sent malformed request: %q")
    (dcc-privileged-port
@@ -195,7 +201,7 @@ compared with `erc-nick-equal-p' which is IRC 
case-insensitive."
                       (erc-extract-nick test)
                       (erc-extract-nick val)))
                 ;; not a nick
-                (eq test val)
+                (equal test val)
                 (setq cont nil))))
         (if cont
             (setq result elt)
@@ -505,8 +511,12 @@ At least one of TYPE and NICK must be provided."
 FILE is the filename.  If FILE is split into multiple arguments,
 re-join the arguments, separated by a space.
 PROC is the server process."
-  (setq file (and file (mapconcat #'identity file " ")))
-  (let* ((elt (erc-dcc-member :nick nick :type 'GET))
+  (let* ((args (seq-group-by (lambda (s) (eq ?- (aref s 0))) (cons nick file)))
+         (flags (prog1 (cdr (assq t args))
+                  (setq args (cdr (assq nil args))
+                        nick (pop args)
+                        file (and args (mapconcat #'identity args " ")))))
+         (elt (erc-dcc-member :nick nick :type 'GET :file file))
          (filename (or file (plist-get elt :file) "unknown")))
     (if elt
         (let* ((file (read-file-name
@@ -526,7 +536,13 @@ PROC is the server process."
                     'dcc-get-cmd-aborted
                     ?n nick ?f filename)))
                 (t
-                 (erc-dcc-get-file elt file proc))))
+                 (erc-dcc-get-file elt file proc)))
+          (when (member "-s" flags)
+            (setq erc-dcc-list (cons (plist-put elt :secure t)
+                                     (delq elt erc-dcc-list))))
+          (when (member "-t" flags)
+            (setq erc-dcc-list (cons (plist-put elt :turbo t)
+                                     (delq elt erc-dcc-list)))))
       (erc-display-message
        nil '(notice error) 'active
        'dcc-get-notfound ?n nick ?f filename))))
@@ -564,6 +580,7 @@ It lists the current state of `erc-dcc-list' in an easy to 
read manner."
               (process-status (plist-get elt :peer))
             "no")
        ?s (concat size
+                  ;; FIXME consider uniquified names, e.g., foo.bin<2>
                   (if (and (eq 'GET (plist-get elt :type))
                            (plist-member elt :file)
                            (buffer-live-p (get-buffer (plist-get elt :file)))
@@ -575,7 +592,12 @@ It lists the current state of `erc-dcc-list' in an easy to 
read manner."
                         (format " (%d%%)"
                                 (floor (* 100.0 byte-count)
                                        (plist-get elt :size))))))
-       ?f (or (and (plist-member elt :file) (plist-get elt :file)) "")))
+       ?f (or (and (plist-member elt :file) (plist-get elt :file)) "")
+       ?u (if-let* ((flags (concat (and (plist-get elt :turbo) "t")
+                                   (and (plist-get elt :secure) "s")))
+                    ((not (string-empty-p flags))))
+              (concat " (" flags ")")
+            "")))
     (erc-display-message
      nil 'notice 'active
      'dcc-list-end)
@@ -602,6 +624,10 @@ separated by a space."
 
 (defvar erc-dcc-query-handler-alist
   '(("SEND" . erc-dcc-handle-ctcp-send)
+    ("TSEND" . erc-dcc-handle-ctcp-send)
+    ("SSEND" . erc-dcc-handle-ctcp-send)
+    ("TSSEND" . erc-dcc-handle-ctcp-send)
+    ("STSEND" . erc-dcc-handle-ctcp-send)
     ("CHAT" . erc-dcc-handle-ctcp-chat)))
 
 ;;;###autoload
@@ -620,12 +646,16 @@ that subcommand."
        ?q query ?n nick ?u login ?h host))))
 
 (defconst erc-dcc-ctcp-query-send-regexp
-  (concat "^DCC SEND \\(?:"
+  (rx bot "DCC " (group-n 6 (: (** 0 2 (any "TS")) "SEND")) " "
           ;; Following part matches either filename without spaces
           ;; or filename enclosed in double quotes with any number
           ;; of escaped double quotes inside.
-          "\"\\(\\(?:\\\\\"\\|[^\"\\]\\)+\\)\"\\|\\([^ ]+\\)"
-          "\\) \\([0-9]+\\) \\([0-9]+\\) *\\([0-9]*\\)"))
+      (: (or (: ?\" (group-n 1 (+ (or (: ?\\ ?\") (not (any ?\" ?\\))))) ?\")
+             (group-n 2 (+ (not " ")))))
+      (: " " (group-n 3 (+ digit))
+         " " (group-n 4 (+ digit))
+         (* " ") (group-n 5 (* digit)))
+      eot))
 
 (define-inline erc-dcc-unquote-filename (filename)
   (inline-quote
@@ -650,12 +680,14 @@ It extracts the information about the dcc request and 
adds it to
        'dcc-request-bogus
        ?r "SEND" ?n nick ?u login ?h host))
      ((string-match erc-dcc-ctcp-query-send-regexp query)
-      (let ((filename
-             (or (match-string 2 query)
-                 (erc-dcc-unquote-filename (match-string 1 query))))
-            (ip       (erc-decimal-to-ip (match-string 3 query)))
-            (port     (match-string 4 query))
-            (size     (match-string 5 query)))
+      (let* ((filename (or (match-string 2 query)
+                           (erc-dcc-unquote-filename (match-string 1 query))))
+             (ip (erc-decimal-to-ip (match-string 3 query)))
+             (port (match-string 4 query))
+             (size (match-string 5 query))
+             (sub (substring (match-string 6 query) 0 -4))
+             (secure (seq-contains-p sub ?S #'eq))
+             (turbo (seq-contains-p sub ?T #'eq)))
         ;; FIXME: a warning really should also be sent
         ;; if the ip address != the host the dcc sender is on.
         (erc-display-message
@@ -672,7 +704,9 @@ It extracts the information about the dcc request and adds 
it to
          'GET (format "%s!%s@%s" nick login host)
          nil proc
          :ip ip :port port :file filename
-         :size (string-to-number size))
+         :size (string-to-number size)
+         :turbo (and turbo t)
+         :secure (and secure t))
         (if (and (eq erc-dcc-send-request 'auto)
                  (erc-dcc-auto-mask-p (format "\"%s!%s@%s\"" nick login host)))
             (erc-dcc-get-file (car erc-dcc-list) filename proc))))
@@ -920,8 +954,7 @@ and making the connection."
             (inhibit-file-name-operation 'write-region))
         (write-region (point) (point) erc-dcc-file-name nil 'nomessage))
 
-      (setq erc-server-process parent-proc
-            erc-dcc-entry-data entry)
+      (setq erc-server-process parent-proc)
       (setq erc-dcc-byte-count 0)
       (setq proc
             (funcall erc-dcc-connect-function
@@ -935,8 +968,8 @@ and making the connection."
 
       (set-process-filter proc #'erc-dcc-get-filter)
       (set-process-sentinel proc #'erc-dcc-get-sentinel)
-      (setq entry (plist-put entry :start-time (erc-current-time)))
-      (setq entry (plist-put entry :peer proc)))))
+      (setq erc-dcc-entry-data (plist-put (plist-put entry :peer proc)
+                                          :start-time (erc-current-time))))))
 
 (defun erc-dcc-append-contents (buffer _file)
   "Append the contents of BUFFER to FILE.
@@ -952,6 +985,16 @@ The contents of the BUFFER will then be erased."
       (setq erc-dcc-byte-count (+ (buffer-size) erc-dcc-byte-count))
       (erase-buffer))))
 
+;; If people really need this, we can convert it into a proper option.
+
+(defvar erc-dcc--X-send-final-turbo-ack nil
+  "Workaround for maverick turbo senders that only require a final ACK.
+The only known culprit is WeeChat, with its xfer.network.fast_send
+option, which is on by default.  Leaving this set to nil and calling
+/DCC GET -t works just fine, but WeeChat sees it as a failure even
+though the file arrives in its entirety.  Setting this to t may
+alleviate such problems.")
+
 (defun erc-dcc-get-filter (proc str)
   "This is the process filter for transfers from other clients to this one.
 It reads incoming bytes from the network and stores them in the DCC
@@ -986,31 +1029,43 @@ rather than every 1024 byte block, but nobody seems to 
care."
          'dcc-get-file-too-long
          ?f (file-name-nondirectory (buffer-name)))
         (delete-process proc))
-       (t
-        (process-send-string
-         proc (erc-pack-int received-bytes)))))))
-
+       ;; Some senders want us to hang up.  Only observed w. TSEND.
+       ((and (plist-get erc-dcc-entry-data :turbo)
+             (= received-bytes (plist-get erc-dcc-entry-data :size)))
+        (when erc-dcc--X-send-final-turbo-ack
+          (process-send-string proc (erc-pack-int received-bytes)))
+        (delete-process proc))
+       ((not (or (plist-get erc-dcc-entry-data :turbo)
+                 (process-get proc :reportingp)))
+        (process-put proc :reportingp t)
+        (process-send-string proc (erc-pack-int received-bytes))
+        (process-put proc :reportingp nil))))))
 
-(defun erc-dcc-get-sentinel (proc _event)
+(defun erc-dcc-get-sentinel (proc event)
   "This is the process sentinel for CTCP DCC SEND connections.
 It shuts down the connection and notifies the user that the
 transfer is complete."
   ;; FIXME, we should look at EVENT, and also check size.
+  (unless (member event '("connection broken by remote peer\n"
+                          "deleted\n"))
+    (lwarn 'erc :warning "Unexpected sentinel event %S for %s"
+           (string-trim-right event) proc))
   (with-current-buffer (process-buffer proc)
     (delete-process proc)
     (setq erc-dcc-list (delete erc-dcc-entry-data erc-dcc-list))
     (unless (= (point-min) (point-max))
       (erc-dcc-append-contents (current-buffer) erc-dcc-file-name))
-    (erc-display-message
-     nil 'notice erc-server-process
-     'dcc-get-complete
-     ?f erc-dcc-file-name
-     ?s (number-to-string erc-dcc-byte-count)
-     ?t (format "%.0f"
-                (erc-time-diff (plist-get erc-dcc-entry-data :start-time)
-                               nil))))
-  (kill-buffer (process-buffer proc))
-  (delete-process proc))
+    (let ((done (= erc-dcc-byte-count (plist-get erc-dcc-entry-data :size))))
+      (erc-display-message
+       nil (if done 'notice '(notice error)) erc-server-process
+       (if done 'dcc-get-complete 'dcc-get-failed)
+       ?v (plist-get erc-dcc-entry-data :size)
+       ?f erc-dcc-file-name
+       ?s (number-to-string erc-dcc-byte-count)
+       ?t (format "%.0f"
+                  (erc-time-diff (plist-get erc-dcc-entry-data :start-time)
+                                 nil))))
+    (kill-buffer)))
 
 ;;; CHAT handling
 
diff --git a/lisp/erc/erc-lang.el b/lisp/erc/erc-lang.el
index b65f4dbf6a..d059caf5a3 100644
--- a/lisp/erc/erc-lang.el
+++ b/lisp/erc/erc-lang.el
@@ -32,10 +32,8 @@
 
 (require 'erc)
 
-;; FIXME: It's ISO 639-1, not ISO 638.  ISO 638 is for paper, board and pulps.
-;; The Lisp variable should be renamed.
-
-(defvar iso-638-languages
+(define-obsolete-variable-alias 'iso-638-languages 'iso-639-1-languages "29.1")
+(defvar iso-639-1-languages
   '(("aa" . "Afar")
     ("ab" . "Abkhazian")
     ("af" . "Afrikaans")
@@ -197,12 +195,12 @@ Normungsinstitut (ON), Postfach 130, A-1021 Vienna, 
Austria.")
 (defun language (code)
   "Return the language name for the ISO CODE."
   (interactive (list (completing-read "ISO language code: "
-                                     iso-638-languages)))
-  (message "%s" (cdr (assoc code iso-638-languages))))
+                                     iso-639-1-languages)))
+  (message "%s" (cdr (assoc code iso-639-1-languages))))
 
 (defun erc-cmd-LANG (language)
   "Display the language name for the language code given by LANGUAGE."
-  (let ((lang (cdr (assoc language iso-638-languages))))
+  (let ((lang (cdr (assoc language iso-639-1-languages))))
     (erc-display-message
      nil 'notice 'active
      (or lang (concat language ": No such domain"))))
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index 06381c5ebe..ff482d4933 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -3625,12 +3625,7 @@ If S is non-nil, it will be used as the quit reason."
   "Zippy quit message.
 
 If S is non-nil, it will be used as the quit reason."
-  (or s
-      (if (fboundp 'yow)
-          (if (>= emacs-major-version 28)
-              (string-replace "\n" "" (yow))
-            (replace-regexp-in-string "\n" "" (yow)))
-        (erc-quit/part-reason-default))))
+  (or s (erc-quit/part-reason-default)))
 
 (make-obsolete 'erc-quit-reason-zippy "it will be removed." "24.4")
 
@@ -3654,12 +3649,7 @@ If S is non-nil, it will be used as the part reason."
   "Zippy part message.
 
 If S is non-nil, it will be used as the quit reason."
-  (or s
-      (if (fboundp 'yow)
-          (if (>= emacs-major-version 28)
-              (string-replace "\n" "" (yow))
-            (replace-regexp-in-string "\n" "" (yow)))
-        (erc-quit/part-reason-default))))
+  (or s (erc-quit/part-reason-default)))
 
 (make-obsolete 'erc-part-reason-zippy "it will be removed." "24.4")
 
diff --git a/lisp/eshell/em-hist.el b/lisp/eshell/em-hist.el
index a18127a547..1877749c5c 100644
--- a/lisp/eshell/em-hist.el
+++ b/lisp/eshell/em-hist.el
@@ -104,7 +104,7 @@ in bash, and any other non-nil value mirrors the 
\"ignoredups\"
 value."
   :type '(choice (const :tag "Don't ignore anything" nil)
                  (const :tag "Ignore consecutive duplicates" t)
-                 (const :tag "Only keep last duplicate" 'erase)))
+                 (const :tag "Only keep last duplicate" erase)))
 
 (defcustom eshell-save-history-on-exit t
   "Determine if history should be automatically saved.
diff --git a/lisp/eshell/em-ls.el b/lisp/eshell/em-ls.el
index 874591d250..bebb0d81b5 100644
--- a/lisp/eshell/em-ls.el
+++ b/lisp/eshell/em-ls.el
@@ -800,7 +800,7 @@ to use, and each member of which is the width of that column
              (+ 2 (length (car file))))
           files))
         ;; must account for the added space...
-        (max-width (+ (window-width) 2))
+        (max-width (+ (window-body-width nil 'remap) 2))
         (best-width 0)
         col-widths)
 
@@ -845,7 +845,7 @@ to use, and each member of which is the width of that column
            (lambda (file)
              (+ 2 (length (car file))))
           files))
-        (max-width (+ (window-width) 2))
+        (max-width (+ (window-body-width nil 'remap) 2))
         col-widths
         colw)
 
diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el
index 42616e7037..775e4c1057 100644
--- a/lisp/eshell/esh-cmd.el
+++ b/lisp/eshell/esh-cmd.el
@@ -256,6 +256,7 @@ the command."
 
 (defcustom eshell-subcommand-bindings
   '((eshell-in-subcommand-p t)
+    (eshell-in-pipeline-p nil)
     (default-directory default-directory)
     (process-environment (eshell-copy-environment)))
   "A list of `let' bindings for subcommand environments."
@@ -827,8 +828,8 @@ This macro calls itself recursively, with NOTFIRST non-nil."
                      ((cdr pipeline) t)
                      (t (quote 'last)))))
           (let ((proc ,(car pipeline)))
-            (setq headproc (or proc headproc))
-            (setq tailproc (or tailproc proc))
+            (set headproc (or proc (symbol-value headproc)))
+            (set tailproc (or (symbol-value tailproc) proc))
             proc))))))
 
 (defmacro eshell-do-pipelines-synchronously (pipeline)
@@ -861,7 +862,7 @@ This is used on systems where async subprocesses are not 
supported."
        (let ((result ,(car pipeline)))
          ;; tailproc gets the result of the last successful process in
          ;; the pipeline.
-         (setq tailproc (or result tailproc))
+         (set tailproc (or result (symbol-value tailproc)))
          ,(if (cdr pipeline)
               `(eshell-do-pipelines-synchronously (quote ,(cdr pipeline))))
          result))))
@@ -870,7 +871,11 @@ This is used on systems where async subprocesses are not 
supported."
 
 (defmacro eshell-execute-pipeline (pipeline)
   "Execute the commands in PIPELINE, connecting each to one another."
-  `(let ((eshell-in-pipeline-p t) headproc tailproc)
+  `(let ((eshell-in-pipeline-p t)
+         (headproc (make-symbol "headproc"))
+         (tailproc (make-symbol "tailproc")))
+     (set headproc nil)
+     (set tailproc nil)
      (progn
        ,(if (fboundp 'make-process)
            `(eshell-do-pipelines ,pipeline)
@@ -880,7 +885,8 @@ This is used on systems where async subprocesses are not 
supported."
                                (car (aref eshell-current-handles
                                           ,eshell-error-handle)) nil)))
             (eshell-do-pipelines-synchronously ,pipeline)))
-       (eshell-process-identity (cons headproc tailproc)))))
+       (eshell-process-identity (cons (symbol-value headproc)
+                                      (symbol-value tailproc))))))
 
 (defmacro eshell-as-subcommand (command)
   "Execute COMMAND using a temp buffer.
@@ -902,7 +908,8 @@ This avoids the need to use `let*'."
 (defmacro eshell-command-to-value (object)
   "Run OBJECT synchronously, returning its result as a string.
 Returns a string comprising the output from the command."
-  `(let ((value (make-symbol "eshell-temp")))
+  `(let ((value (make-symbol "eshell-temp"))
+         (eshell-in-pipeline-p nil))
      (eshell-do-command-to-value ,object)))
 
 ;;;_* Iterative evaluation
diff --git a/lisp/eshell/esh-opt.el b/lisp/eshell/esh-opt.el
index 0961e214f4..f52b70fe7a 100644
--- a/lisp/eshell/esh-opt.el
+++ b/lisp/eshell/esh-opt.el
@@ -205,7 +205,7 @@ a long option."
 VALUE is the potential value of the OPT, coming from args like
 \"-fVALUE\" or \"--foo=VALUE\", or nil if no value was supplied.  If
 OPT doesn't consume a value, return VALUE unchanged so that it can be
-processed later; otherwsie, return nil.
+processed later; otherwise, return nil.
 
 If the OPT consumes an argument for its value and VALUE is nil, the
 argument list will be modified."
diff --git a/lisp/eshell/esh-var.el b/lisp/eshell/esh-var.el
index 1c28d24af1..17add9b668 100644
--- a/lisp/eshell/esh-var.el
+++ b/lisp/eshell/esh-var.el
@@ -149,8 +149,8 @@ if they are quoted with a backslash."
 
 (defcustom eshell-variable-aliases-list
   `(;; for eshell.el
-    ("COLUMNS" ,(lambda (_indices) (window-width)) t)
-    ("LINES" ,(lambda (_indices) (window-height)) t)
+    ("COLUMNS" ,(lambda (_indices) (window-body-width nil 'remap)) t)
+    ("LINES" ,(lambda (_indices) (window-body-height nil 'remap)) t)
 
     ;; for eshell-cmd.el
     ("_" ,(lambda (indices)
@@ -185,7 +185,7 @@ list of the indices that was used in the reference, and 
whether the
 user is requesting the length of the ultimate element.  For example, a
 reference of `$NAME[10][20]' would result in the function for alias
 `NAME' being called (assuming it were aliased to a function), and the
-arguments passed to this function would be the list '(10 20)', and
+arguments passed to this function would be the list `(10 20)', and
 nil.
 
 If the value is a string, return the value for the variable with that
@@ -582,10 +582,11 @@ Otherwise, each INT-OR-NAME refers to an element of the 
list value.
 Integers imply a direct index, and names, an associate lookup using
 `assoc'.
 
-If QUOTED is non-nil, this was invoked inside double-quotes.  This
-affects the behavior of splitting strings: without quoting, the
-split values are converted to Lisp forms via `eshell-convert'; with
-quoting, they're left as strings.
+If QUOTED is non-nil, this was invoked inside double-quotes.
+This affects the behavior of splitting strings: without quoting,
+the split values are converted to numbers via
+`eshell-convert-to-number' if possible; with quoting, they're
+left as strings.
 
 For example, to retrieve the second element of a user's record in
 '/etc/passwd', the variable reference would look like:
@@ -599,9 +600,9 @@ For example, to retrieve the second element of a user's 
record in
                      (not (get-text-property 0 'number index)))
             (setq separator index
                   refs (cdr refs)))
-         (setq value
-               (mapcar (lambda (i) (eshell-convert i quoted))
-                       (split-string value separator)))))
+         (setq value (split-string value separator))
+          (unless quoted
+            (setq value (mapcar #'eshell-convert-to-number value)))))
       (cond
        ((< (length refs) 0)
        (error "Invalid array variable index: %s"
diff --git a/lisp/faces.el b/lisp/faces.el
index 12a386c8f6..d92569e7cd 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -516,6 +516,9 @@ FACES may be either a single face or a list of faces.
 
 (defun face-foreground (face &optional frame inherit)
   "Return the foreground color name of FACE, or nil if unspecified.
+On TTY frames, the returned color name can be \"unspecified-fg\",
+which stands for the unknown default foreground color of the display
+where the frame is displayed.
 If the optional argument FRAME is given, report on face FACE in that frame.
 If FRAME is t, report on the defaults for face FACE (for new frames).
 If FRAME is omitted or nil, use the selected frame.
@@ -537,6 +540,9 @@ merging with the `default' face (which is always completely 
specified)."
 
 (defun face-background (face &optional frame inherit)
   "Return the background color name of FACE, or nil if unspecified.
+On TTY frames, the returned color name can be \"unspecified-bg\",
+which stands for the unknown default background color of the display
+where the frame is displayed.
 If the optional argument FRAME is given, report on face FACE in that frame.
 If FRAME is t, report on the defaults for face FACE (for new frames).
 If FRAME is omitted or nil, use the selected frame.
@@ -1148,13 +1154,18 @@ returned.  Otherwise, DEFAULT is returned verbatim."
                            nil t nil 'face-name-history default))
               ;; Ignore elements that are not faces
               ;; (for example, because DEFAULT was "all faces")
-              (if (facep face) (push (intern face) faces)))
+              (if (facep face) (push (if (stringp face)
+                                         (intern face)
+                                       face)
+                                     faces)))
             (nreverse faces))
         (let ((face (completing-read
                      prompt
                      (completion-table-in-turn nonaliasfaces aliasfaces)
                      nil t nil 'face-name-history defaults)))
-          (if (facep face) (intern face)))))))
+          (when (facep face) (if (stringp face)
+                                 (intern face)
+                               face)))))))
 
 ;; Not defined without X, but behind window-system test.
 (defvar x-bitmap-file-path)
@@ -1202,8 +1213,9 @@ an integer value."
            (:height
             'integerp)
            (:stipple
-            (and (memq (window-system frame) '(x ns pgtk)) ; No stipple on w32 
or haiku
-                 (mapcar #'list
+            (and (memq (window-system frame) '(x ns pgtk haiku)) ; No stipple 
on w32
+                 (mapcar (lambda (item)
+                           (cons item item))
                          (apply #'nconc
                                 (mapcar (lambda (dir)
                                           (and (file-readable-p dir)
@@ -2091,11 +2103,17 @@ unnamed faces (e.g, `foreground-color')."
         (face-attribute 'default attribute))))
 
 (defun foreground-color-at-point ()
-  "Return the foreground color of the character after point."
+  "Return the foreground color of the character after point.
+On TTY frames, the returned color name can be \"unspecified-fg\",
+which stands for the unknown default foreground color of the
+display where the frame is displayed."
   (faces--attribute-at-point :foreground 'foreground-color))
 
 (defun background-color-at-point ()
-  "Return the background color of the character after point."
+  "Return the background color of the character after point.
+On TTY frames, the returned color name can be \"unspecified-bg\",
+which stands for the unknown default background color of the
+display where the frame is displayed."
   (faces--attribute-at-point :background 'background-color))
 
 
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 30a9577d38..ae86e55490 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -1229,13 +1229,13 @@ If the region is active, return a string from the 
region.
 
 If the point is in a comment, ensure that the returned string does not
 contain the comment start characters (especially for major modes that
-have '//' as comment start characters).
+have \"//\" as comment start characters).
 
 Set the variables `ffap-string-at-point' and
 `ffap-string-at-point-region'.
 
 When the region is active and larger than `ffap-max-region-length',
-return an empty string, and set `ffap-string-at-point-region' to '(1 1)."
+return an empty string, and set `ffap-string-at-point-region' to `(1 1)'."
   (let* (dir-separator
          (args
          (cdr
diff --git a/lisp/files-x.el b/lisp/files-x.el
index 0ae9fb076e..4db6fbd22c 100644
--- a/lisp/files-x.el
+++ b/lisp/files-x.el
@@ -740,22 +740,28 @@ If APPLICATION is nil, 
`connection-local-default-application' is used."
   "Apply connection-local variables according to `default-directory'.
 Execute BODY, and unwind connection-local variables."
   (declare (debug t))
-  `(if (file-remote-p default-directory)
-       (let ((enable-connection-local-variables t)
-             (old-buffer-local-variables (buffer-local-variables))
-            connection-local-variables-alist)
-        (hack-connection-local-variables-apply
-         (connection-local-criteria-for-default-directory))
-        (unwind-protect
-             (progn ,@body)
-          ;; Cleanup.
-          (dolist (variable connection-local-variables-alist)
-            (let ((elt (assq (car variable) old-buffer-local-variables)))
-              (if elt
-                  (set (make-local-variable (car elt)) (cdr elt))
-                (kill-local-variable (car variable)))))))
-     ;; No connection-local variables to apply.
-     ,@body))
+  `(with-connection-local-variables-1 (lambda () ,@body)))
+
+;;;###autoload
+(defun with-connection-local-variables-1 (body-fun)
+  "Apply connection-local variables according to `default-directory'.
+Call BODY-FUN with no args, and then unwind connection-local variables."
+  (if (file-remote-p default-directory)
+      (let ((enable-connection-local-variables t)
+            (old-buffer-local-variables (buffer-local-variables))
+           connection-local-variables-alist)
+       (hack-connection-local-variables-apply
+        (connection-local-criteria-for-default-directory))
+       (unwind-protect
+            (funcall body-fun)
+         ;; Cleanup.
+         (dolist (variable connection-local-variables-alist)
+           (let ((elt (assq (car variable) old-buffer-local-variables)))
+             (if elt
+                 (set (make-local-variable (car elt)) (cdr elt))
+               (kill-local-variable (car variable)))))))
+    ;; No connection-local variables to apply.
+    (funcall body-fun)))
 
 ;;;###autoload
 (defun path-separator ()
diff --git a/lisp/files.el b/lisp/files.el
index 2b0dc54db8..a804f0088e 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -1733,19 +1733,18 @@ rather than FUN itself, to `minibuffer-setup-hook'."
 
 (defun find-file (filename &optional wildcards)
   "Edit file FILENAME.
-Switch to a buffer visiting file FILENAME,
-creating one if none already exists.
+\\<minibuffer-local-map>Switch to a buffer visiting file FILENAME, creating 
one if none
+already exists.
 Interactively, the default if you just type RET is the current directory,
 but the visited file name is available through the minibuffer history:
 type \\[next-history-element] to pull it into the minibuffer.
 
-The first time \\[next-history-element] is used after Emacs prompts for
-the file name, the result is affected by `file-name-at-point-functions',
-which by default try to guess the file name by looking at point in the
-current buffer.  Customize the value of `file-name-at-point-functions'
-or set it to nil, if you want only the visited file name and the
-current directory to be available on first \\[next-history-element]
-request.
+The first time \\[next-history-element] is used after Emacs prompts for the 
file name,
+the result is affected by `file-name-at-point-functions', which by
+default try to guess the file name by looking at point in the current
+buffer.  Customize the value of `file-name-at-point-functions' or set
+it to nil, if you want only the visited file name and the current
+directory to be available on first \\[next-history-element] request.
 
 You can visit files on remote machines by specifying something
 like /ssh:SOME_REMOTE_MACHINE:FILE for the file name.  You can
@@ -1758,7 +1757,7 @@ Interactively, or if WILDCARDS is non-nil in a call from 
Lisp,
 expand wildcards (if any) and visit multiple files.  You can
 suppress wildcard expansion by setting `find-file-wildcards' to nil.
 
-To visit a file without any kind of conversion and without
+\\<global-map>To visit a file without any kind of conversion and without
 automatically choosing a major mode, use \\[find-file-literally]."
   (interactive
    (find-file-read-args "Find file: "
@@ -1774,6 +1773,7 @@ automatically choosing a major mode, use 
\\[find-file-literally]."
 Like \\[find-file] (which see), but creates a new window or reuses
 an existing one.  See the function `display-buffer'.
 
+\\<minibuffer-local-map>\
 Interactively, the default if you just type RET is the current directory,
 but the visited file name is available through the minibuffer history:
 type \\[next-history-element] to pull it into the minibuffer.
@@ -1806,6 +1806,7 @@ expand wildcards (if any) and visit multiple files."
 Like \\[find-file] (which see), but creates a new frame or reuses
 an existing one.  See the function `display-buffer'.
 
+\\<minibuffer-local-map>\
 Interactively, the default if you just type RET is the current directory,
 but the visited file name is available through the minibuffer history:
 type \\[next-history-element] to pull it into the minibuffer.
@@ -2101,8 +2102,11 @@ started Emacs, set `abbreviated-home-dir' to nil so it 
will be recalculated)."
   "Return the buffer visiting file FILENAME (a string).
 This is like `get-file-buffer', except that it checks for any buffer
 visiting the same file, possibly under a different name.
+
 If PREDICATE is non-nil, only buffers satisfying it are eligible,
-and others are ignored.
+and others are ignored.  PREDICATE is called with the buffer as
+the only argument, but not with the buffer as the current buffer.
+
 If there is no such live buffer, return nil."
   (let ((predicate (or predicate #'identity))
         (truename (abbreviate-file-name (file-truename filename))))
@@ -2323,7 +2327,16 @@ the various files."
             (attributes (file-attributes truename))
             (number (nthcdr 10 attributes))
             ;; Find any buffer for a file that has same truename.
-            (other (and (not buf) (find-buffer-visiting filename))))
+            (other (and (not buf)
+                         (find-buffer-visiting
+                          filename
+                          ;; We want to filter out buffers that we've
+                          ;; visited via symlinks and the like, where
+                          ;; the symlink no longer exists.
+                          (lambda (buffer)
+                            (let ((file (buffer-local-value
+                                         'buffer-file-name buffer)))
+                              (and file (file-exists-p file))))))))
        ;; Let user know if there is a buffer with the same truename.
        (if other
            (progn
@@ -2784,6 +2797,9 @@ since only a single case-insensitive search through the 
alist is made."
      ;; .dir-locals.el is not really Elisp.  Could use the
      ;; `dir-locals-file' constant if it weren't defined below.
      ("\\.dir-locals\\(?:-2\\)?\\.el\\'" . lisp-data-mode)
+     ("\\.eld\\'" . lisp-data-mode)
+     ;; FIXME: The lisp-data-mode files below should use the `.eld' extension
+     ;; (or a -*- mode cookie) so we don't need ad-hoc entries here.
      ("eww-bookmarks\\'" . lisp-data-mode)
      ("tramp\\'" . lisp-data-mode)
      ("/archive-contents\\'" . lisp-data-mode)
@@ -4481,7 +4497,7 @@ Return the new class name, which is a symbol named DIR."
     (with-demoted-errors "Error reading dir-locals: %S"
       (dolist (file files)
        (let ((file-time (file-attribute-modification-time
-                         (file-attributes file))))
+                         (file-attributes (file-chase-links file)))))
          (if (time-less-p latest file-time)
            (setq latest file-time)))
         (with-temp-buffer
@@ -5353,7 +5369,14 @@ on a DOS/Windows machine, it returns FILENAME in 
expanded form."
     (let ((fremote (file-remote-p filename))
          (dremote (file-remote-p directory))
          (fold-case (or (file-name-case-insensitive-p filename)
-                        read-file-name-completion-ignore-case)))
+                        ;; During bootstrap, it can happen that
+                         ;; `read-file-name-completion-ignore-case' is
+                         ;; not defined yet.
+                         ;; FIXME: `read-file-name-completion-ignore-case' is
+                         ;; a user-config which we shouldn't trust to reflect
+                         ;; the actual file system's semantics.
+                        (and (boundp 'read-file-name-completion-ignore-case)
+                             read-file-name-completion-ignore-case))))
       (if ;; Conditions for separate trees
          (or
           ;; Test for different filesystems on DOS/Windows
@@ -5705,11 +5728,14 @@ Before and after saving the buffer, this function runs
                     (signal (car err) (cdr err))))
            ;; Since we have created an entirely new file,
            ;; make sure it gets the right permission bits set.
-           (setq setmodes (or setmodes
-                              (list (or (file-modes buffer-file-name)
-                                        (logand ?\666 (default-file-modes)))
-                                    (file-extended-attributes buffer-file-name)
-                                    buffer-file-name)))
+           (setq setmodes
+                  (or setmodes
+                      (list (or (file-modes buffer-file-name)
+                               (logand ?\666 (default-file-modes)))
+                            (with-demoted-errors
+                                "Error getting extended attributes: %s"
+                             (file-extended-attributes buffer-file-name))
+                           buffer-file-name)))
            ;; We succeeded in writing the temp file,
            ;; so rename it.
            (rename-file tempname
@@ -5726,9 +5752,12 @@ Before and after saving the buffer, this function runs
        ;; (setmodes is set) because that says we're superseding.
        (cond ((and tempsetmodes (not setmodes))
               ;; Change the mode back, after writing.
-              (setq setmodes (list (file-modes buffer-file-name)
-                                   (file-extended-attributes buffer-file-name)
-                                   buffer-file-name))
+              (setq setmodes
+                     (list (file-modes buffer-file-name)
+                           (with-demoted-errors
+                               "Error getting extended attributes: %s"
+                            (file-extended-attributes buffer-file-name))
+                          buffer-file-name))
               ;; If set-file-extended-attributes fails, fall back on
               ;; set-file-modes.
               (unless
@@ -5849,7 +5878,18 @@ See `save-some-buffers' for PRED values."
                                   (funcall pred))))
                        buffer))
                  (buffer-list))))
-         (delq nil buffers)))
+    (delq nil buffers)))
+
+(defvar save-some-buffers-functions nil
+  "Functions to be run by `save-some-buffers' after saving the buffers.
+The functions can be called in two \"modes\", depending on the
+first argument.  If the first argument is `query', then the
+function should return non-nil if there is something to be
+saved (but it should not actually save anything).
+
+If the first argument is something else, then the function should
+save according to the value of the second argument, which is the
+ARG argument from `save-some-buffers'.")
 
 (defun save-some-buffers (&optional arg pred)
   "Save some modified file-visiting buffers.  Asks user about each one.
@@ -5875,7 +5915,10 @@ should return non-nil if that buffer should be 
considered.
 PRED defaults to the value of `save-some-buffers-default-predicate'.
 
 See `save-some-buffers-action-alist' if you want to
-change the additional actions you can take on files."
+change the additional actions you can take on files.
+
+The functions in `save-some-buffers-functions' will be called
+after saving the buffers."
   (interactive "P")
   (unless pred
     (setq pred
@@ -5891,7 +5934,7 @@ change the additional actions you can take on files."
           (lambda (buffer)
             (setq switched-buffer buffer)))
          queried autosaved-buffers
-        files-done abbrevs-done)
+        files-done inhibit-message)
     (unwind-protect
         (save-window-excursion
           (dolist (buffer (buffer-list))
@@ -5939,19 +5982,10 @@ change the additional actions you can take on files."
                  (files--buffers-needing-to-be-saved pred)
                 '("buffer" "buffers" "save")
                 save-some-buffers-action-alist))
-          ;; Maybe to save abbrevs, and record whether
-          ;; we either saved them or asked to.
-          (and save-abbrevs abbrevs-changed
-              (progn
-                (if (or arg
-                        (eq save-abbrevs 'silently)
-                        (y-or-n-p (format "Save abbrevs in %s? "
-                                           abbrev-file-name)))
-                    (write-abbrev-file nil))
-                ;; Don't keep bothering user if he says no.
-                (setq abbrevs-changed nil)
-                (setq abbrevs-done t)))
-          (or queried (> files-done 0) abbrevs-done
+          ;; Allow other things to be saved at this time, like abbrevs.
+          (dolist (func save-some-buffers-functions)
+            (setq inhibit-message (or (funcall func nil arg) inhibit-message)))
+          (or queried (> files-done 0) inhibit-message
              (cond
               ((null autosaved-buffers)
                 (when (called-interactively-p 'any)
@@ -7192,16 +7226,25 @@ by `sh' are supported."
   :type 'string
   :group 'dired)
 
-(defun file-expand-wildcards (pattern &optional full)
-  "Expand wildcard pattern PATTERN.
-This returns a list of file names that match the pattern.
-Files are sorted in `string<' order.
+(defun file-expand-wildcards (pattern &optional full regexp)
+  "Expand (a.k.a. \"glob\") file-name wildcard pattern PATTERN.
+This returns a list of file names that match PATTERN.
+The returned list of file names is sorted in the `string<' order.
+
+PATTERN is, by default, a \"glob\"/wildcard string, e.g.,
+\"/tmp/*.png\" or \"/*/*/foo.png\", but can also be a regular
+expression if the optional REGEXP parameter is non-nil.  In any
+case, the matches are applied per sub-directory, so a match can't
+span a parent/sub directory, which means that a regexp bit can't
+contain the \"/\" character.
 
-If PATTERN is written as an absolute file name,
-the values are absolute also.
+The returned list of file names is sorted in the `string<' order.
+
+If PATTERN is written as an absolute file name, the expansions in
+the returned list are also absolute.
 
 If PATTERN is written as a relative file name, it is interpreted
-relative to the current default directory, `default-directory'.
+relative to the current `default-directory'.
 The file names returned are normally also relative to the current
 default directory.  However, if FULL is non-nil, they are absolute."
   (save-match-data
@@ -7213,7 +7256,8 @@ default directory.  However, if FULL is non-nil, they are 
absolute."
           (dirs (if (and dirpart
                          (string-match "[[*?]" (file-local-name dirpart)))
                     (mapcar 'file-name-as-directory
-                            (file-expand-wildcards (directory-file-name 
dirpart)))
+                            (file-expand-wildcards
+                              (directory-file-name dirpart) nil regexp))
                   (list dirpart)))
           contents)
       (dolist (dir dirs)
@@ -7226,8 +7270,13 @@ default directory.  However, if FULL is non-nil, they 
are absolute."
                                  (unless (string-match "\\`\\.\\.?\\'"
                                                        (file-name-nondirectory 
name))
                                    name))
-                              (directory-files (or dir ".") full
-                                               (wildcard-to-regexp nondir))))))
+                              (directory-files
+                                (or dir ".") full
+                                (if regexp
+                                    ;; We're matching each file name
+                                    ;; element separately.
+                                    (concat "\\`" nondir "\\'")
+                                 (wildcard-to-regexp nondir)))))))
            (setq contents
                  (nconc
                   (if (and dir (not full))
@@ -7237,6 +7286,96 @@ default directory.  However, if FULL is non-nil, they 
are absolute."
                   contents)))))
       contents)))
 
+(defcustom find-sibling-rules nil
+  "Rules for finding \"sibling\" files.
+This is used by the `find-sibling-file' command.
+
+This variable is a list of (MATCH EXPANSION...) elements.
+
+MATCH is a regular expression that should match a file name that
+has a sibling.  It can contain sub-expressions that will be used
+in EXPANSIONS.
+
+EXPANSION is a string that matches file names.  For instance, to
+define \".h\" files as siblings of any \".c\", you could say:
+
+  (\"\\\\([^/]+\\\\)\\\\.c\\\\\\='\" \"\\\\1.h\")
+
+MATCH and EXPANSION can also be fuller paths.  For instance, if
+you want to define other versions of a project as being sibling
+files, you could say something like:
+
+  (\"src/emacs/[^/]+/\\\\(.*\\\\)\\\\\\='\" \"src/emacs/.*/\\\\1\\\\\\='\")
+
+In this example, if you're in src/emacs/emacs-27/lisp/abbrev.el,
+and you an src/emacs/emacs-28/lisp/abbrev.el file exists, it's
+now defined as a sibling."
+  :type 'sexp
+  :version "29.1")
+
+(defun find-sibling-file (file)
+  "Visit a \"sibling\" file of FILE.
+When called interactively, FILE is the currently visited file.
+
+The \"sibling\" file is defined by the `find-sibling-rules' variable."
+  (interactive (progn
+                 (unless buffer-file-name
+                   (user-error "Not visiting a file"))
+                 (list buffer-file-name)))
+  (unless find-sibling-rules
+    (user-error "The `find-sibling-rules' variable has not been configured"))
+  (let ((siblings (find-sibling-file-search (expand-file-name file)
+                                            find-sibling-rules)))
+    (cond
+     ((null siblings)
+      (user-error "Couldn't find any sibling files"))
+     ((length= siblings 1)
+      (find-file (car siblings)))
+     (t
+      (let ((relatives (mapcar (lambda (sibling)
+                                 (file-relative-name
+                                  sibling (file-name-directory file)))
+                               siblings)))
+        (find-file
+         (completing-read (format-prompt "Find file" (car relatives))
+                          relatives nil t nil nil (car relatives))))))))
+
+(defun find-sibling-file-search (file &optional rules)
+  "Return a list of FILE's \"siblings\"
+RULES should be a list on the form defined by `find-sibling-rules' (which
+see), and if nil, defaults to `find-sibling-rules'."
+  (let ((results nil))
+    (pcase-dolist (`(,match . ,expansions) (or rules find-sibling-rules))
+      ;; Go through the list and find matches.
+      (when (string-match match file)
+        (let ((match-data (match-data)))
+          (dolist (expansion expansions)
+            (let ((start 0))
+              ;; Expand \\1 forms in the expansions.
+              (while (string-match "\\\\\\([&0-9]+\\)" expansion start)
+                (let ((index (string-to-number (match-string 1 expansion))))
+                  (setq start (match-end 0)
+                        expansion
+                        (replace-match
+                         (substring file
+                                    (elt match-data (* index 2))
+                                    (elt match-data (1+ (* index 2))))
+                         t t expansion)))))
+            ;; Then see which files we have that are matching.  (And
+            ;; expand from the end of the file's match, since we might
+            ;; be doing a relative match.)
+            (let ((default-directory (substring file 0 (car match-data))))
+              ;; Keep the first matches first.
+              (setq results
+                    (nconc
+                     results
+                     (mapcar #'expand-file-name
+                             (file-expand-wildcards expansion nil t)))))))))
+    ;; Delete the file itself (in case it matched), and remove
+    ;; duplicates, in case we have several expansions and some match
+    ;; the same subsets of files.
+    (delete file (delete-dups results))))
+
 ;; Let Tramp know that `file-expand-wildcards' does not need an advice.
 (provide 'files '(remote-wildcards))
 
@@ -7251,12 +7390,11 @@ and `list-directory-verbose-switches'."
      (list (read-file-name
             (if pfx "List directory (verbose): "
              "List directory (brief): ")
-           nil default-directory t
-            nil
+           nil default-directory
             (lambda (file)
               (or (file-directory-p file)
                   (insert-directory-wildcard-in-dir-p
-                   (expand-file-name file)))))
+                   (file-name-as-directory (expand-file-name file))))))
            pfx)))
   (let ((switches (if verbose list-directory-verbose-switches
                    list-directory-brief-switches))
@@ -7275,9 +7413,9 @@ and `list-directory-verbose-switches'."
     ;; Finishing with-output-to-temp-buffer seems to clobber default-directory.
     (with-current-buffer buffer
       (setq default-directory
-           (if (file-directory-p dirname)
+           (if (file-accessible-directory-p dirname)
                (file-name-as-directory dirname)
-             (file-name-directory dirname))))))
+             (file-name-directory (directory-file-name dirname)))))))
 
 (defun shell-quote-wildcard-pattern (pattern)
   "Quote characters special to the shell in PATTERN, leave wildcards alone.
@@ -7779,7 +7917,11 @@ If RESTART, restart Emacs after killing the current 
Emacs process."
   (interactive "P")
   ;; Don't use save-some-buffers-default-predicate, because we want
   ;; to ask about all the buffers before killing Emacs.
-    (when (files--buffers-needing-to-be-saved t)
+  (when (or (files--buffers-needing-to-be-saved t)
+            (catch 'need-save
+              (dolist (func save-some-buffers-functions)
+                (when (funcall func 'query)
+                  (throw 'need-save t)))))
       (if (use-dialog-box-p)
           (pcase (x-popup-dialog
                   t `("Unsaved Buffers"
diff --git a/lisp/find-dired.el b/lisp/find-dired.el
index c04545e44e..61e626080e 100644
--- a/lisp/find-dired.el
+++ b/lisp/find-dired.el
@@ -241,6 +241,8 @@ it finishes, type \\[kill-find]."
     ;; Subdir headlerline must come first because the first marker in
     ;; subdir-alist points there.
     (insert "  " dir ":\n")
+    (when dired-make-directory-clickable
+      (dired--make-directory-clickable))
     ;; Make second line a ``find'' line in analogy to the ``total'' or
     ;; ``wildcard'' line.
     (let ((point (point)))
@@ -323,11 +325,7 @@ specifies what to use in place of \"-ls\" as the final 
argument."
            (save-restriction
              (widen)
              (let ((buffer-read-only nil)
-                   (beg (point-max))
-                   (l-opt (and (consp find-ls-option)
-                               (string-match "l" (cdr find-ls-option))))
-                   (ls-regexp (concat "^ +[^ \t\r\n]+\\( +[^ \t\r\n]+\\) +"
-                                      "[^ \t\r\n]+ +[^ \t\r\n]+\\( 
+[^[:space:]]+\\)")))
+                   (beg (point-max)))
                (goto-char beg)
                (insert string)
                (goto-char beg)
@@ -342,18 +340,6 @@ specifies what to use in place of \"-ls\" as the final 
argument."
                (goto-char (- beg 3))   ; no error if < 0
                (while (search-forward " ./" nil t)
                  (delete-region (point) (- (point) 2)))
-               ;; Pad the number of links and file size.  This is a
-               ;; quick and dirty way of getting the columns to line up
-               ;; most of the time, but it's not foolproof.
-               (when l-opt
-                 (goto-char beg)
-                 (goto-char (line-beginning-position))
-                 (while (re-search-forward ls-regexp nil t)
-                   (replace-match (format "%4s" (match-string 1))
-                                  nil nil nil 1)
-                   (replace-match (format "%9s" (match-string 2))
-                                  nil nil nil 2)
-                   (forward-line 1)))
                ;; Find all the complete lines in the unprocessed
                ;; output and process it to add text properties.
                (goto-char (point-max))
diff --git a/lisp/finder.el b/lisp/finder.el
index a2a27ea061..73072c0cd4 100644
--- a/lisp/finder.el
+++ b/lisp/finder.el
@@ -127,8 +127,6 @@ Keywords and package names both should be symbols.")
 cus-load\\|finder-inf\\|esh-groups\\|subdirs\\|leim-list\\)\\.el$\\)"
   "Regexp matching file names not to scan for keywords.")
 
-(autoload 'autoload-rubric "autoload")
-
 (defconst finder--builtins-descriptions
   ;; I have no idea whether these are supposed to be capitalized
   ;; and/or end in a full-stop.  Existing file headers are inconsistent,
@@ -264,9 +262,9 @@ from; the default is `load-path'."
       (find-file-noselect generated-finder-keywords-file)
     (setq buffer-undo-list t)
     (erase-buffer)
-    (insert (autoload-rubric generated-finder-keywords-file
-                             "keyword-to-package mapping" t))
-    (search-backward "")
+    (generate-lisp-file-heading
+     generated-finder-keywords-file 'finder-compile-keywords
+     :title "keyword-to-package mapping")
     ;; FIXME: Now that we have package--builtin-versions, package--builtins is
     ;; only needed to get the list of unversioned packages and to get the
     ;; summary description of each package.
@@ -280,6 +278,7 @@ from; the default is `load-path'."
     (insert "(setq finder-keywords-hash\n      ")
     (prin1 finder-keywords-hash (current-buffer))
     (insert ")\n")
+    (generate-lisp-file-trailer generated-finder-keywords-file)
     (basic-save-buffer)))
 
 (defun finder-compile-keywords-make-dist ()
diff --git a/lisp/follow.el b/lisp/follow.el
index 6c721899d4..adf1c1b762 100644
--- a/lisp/follow.el
+++ b/lisp/follow.el
@@ -1552,7 +1552,7 @@ non-first windows in Follow mode."
 (declare-function scroll-bar-drag "scroll-bar" (event))
 (declare-function scroll-bar-scroll-up "scroll-bar" (event))
 (declare-function scroll-bar-scroll-down "scroll-bar" (event))
-(declare-function mwheel-scroll "mwheel" (event))
+(declare-function mwheel-scroll "mwheel" (event &optional arg))
 
 (defun follow-scroll-bar-toolkit-scroll (event)
   (interactive "e")
diff --git a/lisp/forms.el b/lisp/forms.el
index 8bfeaad1c1..fdc44b5214 100644
--- a/lisp/forms.el
+++ b/lisp/forms.el
@@ -2009,7 +2009,7 @@ It returns the highest number.
 
 Usage: (setq forms-number-of-fields
              (forms-enumerate
-              '(field1 field2 field2 ...)))"
+              \\='(field1 field2 field2 ...)))"
 
   (let ((the-index 0))
     (while the-fields
diff --git a/lisp/frame.el b/lisp/frame.el
index 49eabcf978..27f99fb7d2 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -1993,7 +1993,8 @@ workarea attribute."
 (declare-function x-frame-list-z-order "xfns.c" (&optional display))
 (declare-function w32-frame-list-z-order "w32fns.c" (&optional display))
 (declare-function ns-frame-list-z-order "nsfns.m" (&optional display))
-(declare-function pgtk-frame-list-z-order "pgtkfns.c" (&optional display))
+;; TODO: implement this on PGTK.
+;; (declare-function pgtk-frame-list-z-order "pgtkfns.c" (&optional display))
 (declare-function haiku-frame-list-z-order "haikufns.c" (&optional display))
 
 (defun frame-list-z-order (&optional display)
@@ -2016,7 +2017,9 @@ Return nil if DISPLAY contains no Emacs frame."
      ((eq frame-type 'ns)
       (ns-frame-list-z-order display))
      ((eq frame-type 'pgtk)
-      (pgtk-frame-list-z-order display))
+      ;; This is currently not supported on PGTK.
+      ;; (pgtk-frame-list-z-order display)
+      nil)
      ((eq frame-type 'haiku)
       (haiku-frame-list-z-order display)))))
 
@@ -2373,6 +2376,8 @@ If DISPLAY is omitted or nil, it defaults to the selected 
frame's display."
                  (&optional terminal))
 (declare-function pgtk-display-monitor-attributes-list "pgtkfns.c"
                  (&optional terminal))
+(declare-function haiku-display-monitor-attributes-list "haikufns.c"
+                 (&optional terminal))
 
 (defun display-monitor-attributes-list (&optional display)
   "Return a list of physical monitor attributes on DISPLAY.
@@ -2424,6 +2429,8 @@ monitors."
       (ns-display-monitor-attributes-list display))
      ((eq frame-type 'pgtk)
       (pgtk-display-monitor-attributes-list display))
+     ((eq frame-type 'haiku)
+      (haiku-display-monitor-attributes-list display))
      (t
       (let ((geometry (list 0 0 (display-pixel-width display)
                            (display-pixel-height display))))
@@ -2433,8 +2440,8 @@ monitors."
                       ,(display-mm-height display)))
           (frames . ,(frames-on-display-list display)))))))))
 
-(declare-function x-device-class (name) "x-win.el")
-(declare-function pgtk-device-class (name) "pgtk-win.el")
+(declare-function x-device-class "term/x-win.el" (name))
+(declare-function pgtk-device-class "term/pgtk-win.el" (name))
 
 (defun device-class (frame name)
   "Return the class of the device NAME for an event generated on FRAME.
diff --git a/lisp/fringe.el b/lisp/fringe.el
index 1cfcce4542..657a73772d 100644
--- a/lisp/fringe.el
+++ b/lisp/fringe.el
@@ -253,7 +253,7 @@ Note that removing a right or left fringe (by setting the 
width
 to zero) makes Emacs reserve one column of the window body to
 display a line continuation marker.  (This happens for both the
 left and right fringe, since Emacs can display both left-to-right
-and right-to-left text.)  You can use `window-max-characters-per-line'
+and right-to-left text.)  You can use `window-max-chars-per-line'
 to check the effective width.
 
 Fringe widths set by `set-window-fringes' override the default
@@ -314,7 +314,7 @@ BITMAP is a symbol identifying the new fringe bitmap.
 BITS is either a string or a vector of integers.
 HEIGHT is height of bitmap.  If HEIGHT is nil, use length of BITS.
 WIDTH must be an integer between 1 and 16, or nil which defaults to 8.
-Optional fifth arg ALIGN may be one of ‘top’, ‘center’, or ‘bottom’,
+Optional fifth arg ALIGN may be one of `top', `center', or `bottom',
 indicating the positioning of the bitmap relative to the rows where it
 is used; the default is to center the bitmap.  Fifth arg may also be a
 list (ALIGN PERIODIC) where PERIODIC non-nil specifies that the bitmap
diff --git a/lisp/generic-x.el b/lisp/generic-x.el
index ecfa8aab84..2c9d1b316e 100644
--- a/lisp/generic-x.el
+++ b/lisp/generic-x.el
@@ -1847,4 +1847,8 @@ like an INI file.  You can add this hook to 
`find-file-hook'."
 
 (provide 'generic-x)
 
+;; Local Variables:
+;; autoload-compute-prefixes: nil
+;; End:
+
 ;;; generic-x.el ends here
diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el
index dd9c277805..7b5721fafb 100644
--- a/lisp/gnus/gnus-start.el
+++ b/lisp/gnus/gnus-start.el
@@ -329,10 +329,10 @@ with the subscription method in this variable."
   "If non-nil, Gnus will offer to subscribe hierarchically.
 When a new hierarchy appears, Gnus will ask the user:
 
-'alt.binaries': Do you want to subscribe to this hierarchy? ([d]ys):
+Descend hierarchy alt.binaries? ([y]nsq):
 
-If the user pressed `d', Gnus will descend the hierarchy, `y' will
-subscribe to all newsgroups in the hierarchy and `s' will skip this
+If the user pressed `y', Gnus will descend the hierarchy, `s' will
+subscribe to all newsgroups in the hierarchy and `n' will skip this
 hierarchy in its entirety."
   :group 'gnus-group-new
   :type 'boolean)
diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el
index 1f673771fa..f60c11f985 100644
--- a/lisp/gnus/gnus.el
+++ b/lisp/gnus/gnus.el
@@ -1591,7 +1591,7 @@ posting an article."
  "Alist of group regexps and its initial input of the number of articles."
  :variable-group gnus-group-parameter
  :parameter-type '(choice :tag "Initial Input for Large Newsgroup"
-                         (const :tag "All" 'all)
+                         (const :tag "All" all)
                          (integer))
  :parameter-document "\
 
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index e7dc089a3c..6973d8a86b 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -3180,8 +3180,7 @@ Like `text-mode', but with these additional commands:
     (mail-abbrevs-setup))
    ((message-mail-alias-type-p 'ecomplete)
     (ecomplete-setup)))
-  ;; FIXME: merge the completion tables from ecomplete/bbdb/...?
-  ;;(add-hook 'completion-at-point-functions #'message-ecomplete-capf nil t)
+  (add-hook 'completion-at-point-functions #'eudc-capf-complete -1 t)
   (add-hook 'completion-at-point-functions #'message-completion-function nil t)
   (unless buffer-file-name
     (message-set-auto-save-file-name))
@@ -7018,7 +7017,15 @@ is a function used to switch to and display the mail 
buffer."
        ;; https://lists.gnu.org/r/emacs-devel/2011-01/msg00337.html
        ;; We need to convert any string input, eg from rmail-start-mail.
        (dolist (h other-headers other-headers)
-         (if (stringp (car h)) (setcar h (intern (capitalize (car h)))))))
+         (when (stringp (car h))
+            (setcar h (intern (capitalize (car h)))))
+          ;; Firefox sends us In-Reply-To headers that are Message-IDs
+          ;; without <> around them.  Fix that.
+          (when (and (eq (car h) 'In-Reply-To)
+                     ;; Looks like a Message-ID.
+                     (string-match-p "\\`[^ @]+@[^ @]+\\'" (cdr h))
+                     (not (string-match-p "\\`<.*>\\'" (cdr h))))
+            (setcdr h (concat "<" (cdr h) ">")))))
        yank-action send-actions continue switch-function
        return-action))))
 
@@ -8364,7 +8371,8 @@ set to nil."
        (t
         (expand-abbrev))))
 
-(add-to-list 'completion-category-defaults '(email (styles substring)))
+(add-to-list 'completion-category-defaults '(email (styles substring
+                                                           
partial-completion)))
 
 (defun message--bbdb-query-with-words (words)
   ;; FIXME: This (or something like this) should live on the BBDB side.
diff --git a/lisp/gnus/mm-util.el b/lisp/gnus/mm-util.el
index 31cf92e617..727e3abfff 100644
--- a/lisp/gnus/mm-util.el
+++ b/lisp/gnus/mm-util.el
@@ -315,8 +315,7 @@ Valid elements include:
   "ISO-8859-15 exchangeable coding systems and inconvertible characters.")
 
 (defvar mm-iso-8859-x-to-15-table
-  (and (fboundp 'coding-system-p)
-       (mm-coding-system-p 'iso-8859-15)
+  (and (mm-coding-system-p 'iso-8859-15)
        (mapcar
        (lambda (cs)
          (if (mm-coding-system-p (car cs))
diff --git a/lisp/gnus/mm-uu.el b/lisp/gnus/mm-uu.el
index 9fe41f6786..8646998deb 100644
--- a/lisp/gnus/mm-uu.el
+++ b/lisp/gnus/mm-uu.el
@@ -214,7 +214,7 @@ This can be either \"inline\" or \"attachment\".")
      "$"
      ,#'mm-uu-org-src-code-block-extract))
   "A list of specifications for non-MIME attachments.
-Each element consist of a `mm-uu-entry'.
+Each element consists of a `mm-uu-entry'.
 The functions in the last 3 slots of this type can make use of the following
 dynamically-scoped variables:
 `file-name', `start-point', and `end-point'.
diff --git a/lisp/gnus/nnmail.el b/lisp/gnus/nnmail.el
index c71627f83a..bde0de9892 100644
--- a/lisp/gnus/nnmail.el
+++ b/lisp/gnus/nnmail.el
@@ -1937,9 +1937,7 @@ If TIME is nil, then return the cutoff time for oldness 
instead."
                 (and (string-match (cadr regexp-target-pair) to)
                      (let ((mail-dont-reply-to-names
                             (message-dont-reply-to-names)))
-                       (equal (if (fboundp 'rmail-dont-reply-to)
-                                  (rmail-dont-reply-to from)
-                                (mail-dont-reply-to from)) "")))))
+                        (equal (mail-dont-reply-to from) "")))))
        (setq target (format-time-string (caddr regexp-target-pair) date)))
        ((and (not (equal header 'to-from))
             (string-match (cadr regexp-target-pair)
diff --git a/lisp/gnus/nnrss.el b/lisp/gnus/nnrss.el
index 4ca53f108f..f740af3b6d 100644
--- a/lisp/gnus/nnrss.el
+++ b/lisp/gnus/nnrss.el
@@ -756,8 +756,7 @@ Export subscriptions to a buffer in OPML Format."
     (insert "  </body>\n"
            "</opml>\n"))
   (pop-to-buffer "*OPML Export*")
-  (when (fboundp 'sgml-mode)
-    (sgml-mode)))
+  (sgml-mode))
 
 (defun nnrss-generate-download-script ()
   "Generate a download script in the current buffer.
diff --git a/lisp/gnus/nnselect.el b/lisp/gnus/nnselect.el
index cdbfa0b591..9b8333a7c6 100644
--- a/lisp/gnus/nnselect.el
+++ b/lisp/gnus/nnselect.el
@@ -260,7 +260,7 @@ as `(keyfunc member)' and the corresponding element is just
 (defcustom nnselect-retrieve-headers-override-function nil
   "A function that retrieves article headers for ARTICLES from GROUP.
 The retrieved headers should populate the `nntp-server-buffer'.
-Returns either the retrieved header format 'nov or 'headers.
+Returns either the retrieved header format `nov' or `headers'.
 
 If this variable is nil, or if the provided function returns nil,
   `gnus-retrieve-headers' will be called instead."
@@ -291,9 +291,9 @@ parameters."
 
 (defmacro nnselect-get-artlist (group)
   "Get the list of articles for GROUP.
-If the group parameter 'nnselect-get-artlist-override-function is
+If the group parameter `nnselect-get-artlist-override-function' is
 non-nil call this function with argument GROUP to get the
-artlist; if the group parameter 'nnselect-always-regenerate is
+artlist; if the group parameter `nnselect-always-regenerate' is
 non-nil, regenerate the artlist; otherwise retrieve the artlist
 directly from the group parameters."
   `(when (gnus-nnselect-group-p ,group)
@@ -310,9 +310,9 @@ directly from the group parameters."
 
 (defmacro nnselect-store-artlist  (group artlist)
   "Store the ARTLIST for GROUP.
-If the group parameter 'nnselect-store-artlist-override-function
+If the group parameter `nnselect-store-artlist-override-function'
 is non-nil call this function on GROUP and ARTLIST; if the group
-parameter 'nnselect-always-regenerate is non-nil don't store the
+parameter `nnselect-always-regenerate' is non-nil don't store the
 artlist; otherwise store the ARTLIST in the group parameters."
   `(let ((override (gnus-group-get-parameter
                    ,group
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index 927a4f0d2c..61fc8037df 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -614,9 +614,18 @@ the C sources, too."
    menus))
 
 (defun help-fns--compiler-macro (function)
-  (let ((handler (function-get function 'compiler-macro)))
+  (pcase-dolist (`(,type . ,handler)
+                 (list (cons "compiler macro"
+                             (function-get function 'compiler-macro))
+                       (cons "`byte-compile' property"
+                             (function-get function 'byte-compile))
+                       (cons "byte-code optimizer"
+                             (function-get function 'byte-optimizer))))
     (when handler
-      (insert "  This function has a compiler macro")
+      (if (bolp)
+          (insert "  This function has a ")
+        (insert " and a "))
+      (insert type)
       (if (symbolp handler)
           (progn
             (insert (format-message " `%s'" handler))
@@ -631,8 +640,17 @@ the C sources, too."
             (save-excursion
               (re-search-backward (substitute-command-keys "`\\([^`']+\\)'")
                                   nil t)
-              (help-xref-button 1 'help-function-cmacro function lib)))))
-      (insert ".\n"))))
+              (help-xref-button 1 'help-function-cmacro function lib)))))))
+  (unless (bolp)
+    (insert ".  See "
+            (buttonize "the manual"
+                       (lambda (_) (info "(elisp)Advice and Byte Code")))
+            " for details.\n")
+    (save-restriction
+      (let ((fill-prefix "    "))
+        (narrow-to-region (line-beginning-position -1) (point))
+        (fill-region (point-min) (point-max)))
+      (goto-char (point-max)))))
 
 (defun help-fns--signature (function doc real-def real-function buffer)
   "Insert usage at point and return docstring.  With highlighting."
@@ -781,21 +799,23 @@ the C sources, too."
         (erase-buffer)
         (insert-file-contents f)
         (goto-char (point-min))
-        (search-forward "\n*")
-        (while (re-search-forward re nil t)
-          (let ((pos (match-beginning 0)))
-            (save-excursion
-              ;; Almost all entries are of the form "* ... in Emacs NN.MM."
-              ;; but there are also a few in the form "* Emacs NN.MM is a bug
-              ;; fix release ...".
-              (if (not (re-search-backward "^\\* .* Emacs \\([0-9.]+[0-9]\\)"
-                                           nil t))
-                  (message "Ref found in non-versioned section in %S"
-                           (file-name-nondirectory f))
-                (let ((version (match-string 1)))
-                  (when (or (null first) (version< version first))
-                    (setq place (list f pos))
-                    (setq first version)))))))))
+        ;; Failed git merges can leave empty files that look like NEWS
+        ;; in etc.  Don't error here.
+        (when (search-forward "\n*" nil t)
+          (while (re-search-forward re nil t)
+            (let ((pos (match-beginning 0)))
+              (save-excursion
+                ;; Almost all entries are of the form "* ... in Emacs NN.MM."
+                ;; but there are also a few in the form "* Emacs NN.MM is a bug
+                ;; fix release ...".
+                (if (not (re-search-backward "^\\* .* Emacs \\([0-9.]+[0-9]\\)"
+                                             nil t))
+                    (message "Ref found in non-versioned section in %S"
+                             (file-name-nondirectory f))
+                  (let ((version (match-string 1)))
+                    (when (or (null first) (version< version first))
+                      (setq place (list f pos))
+                      (setq first version))))))))))
     (when first
       (make-text-button first nil 'type 'help-news 'help-args place))))
 
@@ -1026,8 +1046,7 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED 
REAL-DEF)."
                             ;; for invalid functions i.s.o. signaling an error.
                             (documentation function t)
                           ;; E.g. an alias for a not yet defined function.
-                          ((invalid-function void-function) nil)))
-               (key-bindings-buffer (current-buffer)))
+                          ((invalid-function void-function) nil))))
 
     ;; If the function is autoloaded, and its docstring has
     ;; key substitution constructs, load the library.
@@ -1044,7 +1063,7 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED 
REAL-DEF)."
                      (help-fns--signature
                       function doc-raw
                       (if (subrp def) (indirect-function real-def) real-def)
-                      real-function key-bindings-buffer)
+                      real-function describe-function-orig-buffer)
                    ;; E.g. an alias for a not yet defined function.
                    ((invalid-function void-function) doc-raw))))
         (help-fns--ensure-empty-line)
@@ -1061,7 +1080,7 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED 
REAL-DEF)."
 (add-hook 'help-fns-describe-function-functions #'help-fns--obsolete)
 (add-hook 'help-fns-describe-function-functions #'help-fns--interactive-only)
 (add-hook 'help-fns-describe-function-functions #'help-fns--parent-mode)
-(add-hook 'help-fns-describe-function-functions #'help-fns--compiler-macro)
+(add-hook 'help-fns-describe-function-functions #'help-fns--compiler-macro 100)
 
 
 ;; Variables
@@ -1884,8 +1903,8 @@ variable with value KEYMAP."
 The heuristic to determine which keymap is most likely to be
 relevant to a user follows this order:
 
-1. 'keymap' text property at point
-2. 'local-map' text property at point
+1. `keymap' text property at point
+2. `local-map' text property at point
 3. the `current-local-map'
 
 This is used to set the default value for the interactive prompt
@@ -1904,7 +1923,10 @@ in `describe-keymap'.  See also `Searching the Active 
Keymaps'."
 When called interactively, prompt for a variable that has a
 keymap value."
   (interactive
-   (let* ((km (help-fns--most-relevant-active-keymap))
+   (let* ((sym (symbol-at-point))
+          (km (or (and (keymapp (ignore-errors (symbol-value sym)))
+                       sym)
+                  (help-fns--most-relevant-active-keymap)))
           (val (completing-read
                 (format-prompt "Keymap" km)
                 obarray
diff --git a/lisp/help-mode.el b/lisp/help-mode.el
index a0a587cd81..a50524253b 100644
--- a/lisp/help-mode.el
+++ b/lisp/help-mode.el
@@ -404,7 +404,7 @@ The format is (FUNCTION ARGS...).")
 ;;;###autoload
 (define-derived-mode help-mode special-mode "Help"
   "Major mode for viewing help text and navigating references in it.
-Also see the `help-enable-editing' variable.
+Also see the `help-enable-variable-value-editing' variable.
 
 Commands:
 \\{help-mode-map}"
@@ -422,12 +422,14 @@ Commands:
 ;;;###autoload
 (defun help-mode-setup ()
   "Enter Help mode in the current buffer."
+  (declare (obsolete nil "29.1"))
   (help-mode)
   (setq buffer-read-only nil))
 
 ;;;###autoload
 (defun help-mode-finish ()
   "Finalize Help mode setup in current buffer."
+  (declare (obsolete nil "29.1"))
   (when (derived-mode-p 'help-mode)
     (setq buffer-read-only t)
     (help-make-xrefs (current-buffer))))
@@ -452,6 +454,7 @@ Commands:
                    "\\(symbol\\|program\\|property\\)\\|" ; Don't link
                    "\\(source \\(?:code \\)?\\(?:of\\|for\\)\\)\\)"
                    "[ \t\n]+\\)?"
+                    "\\(\\\\\\+\\)?"
                     "['`‘]\\(\\(?:\\sw\\|\\s_\\)+\\|`\\)['’]"))
   "Regexp matching doc string references to symbols.
 
@@ -512,17 +515,16 @@ restore it properly when going back."
 ;;;###autoload
 (defun help-buffer ()
   "Return the name of a buffer for inserting help.
-If `help-xref-following' is non-nil, this is the name of the
-current buffer.  Signal an error if this buffer is not derived
-from `help-mode'.
+If `help-xref-following' is non-nil and the current buffer is
+derived from `help-mode', this is the name of the current buffer.
+
 Otherwise, return \"*Help*\", creating a buffer with that name if
 it does not already exist."
-  (buffer-name                         ;for with-output-to-temp-buffer
-   (if (not help-xref-following)
-       (get-buffer-create "*Help*")
-     (unless (derived-mode-p 'help-mode)
-       (error "Current buffer is not in Help mode"))
-     (current-buffer))))
+  (buffer-name                         ;for with-output-to-temp-buffer
+   (if (and help-xref-following
+            (derived-mode-p 'help-mode))
+       (current-buffer)
+     (get-buffer-create "*Help*"))))
 
 (defvar describe-symbol-backends
   `((nil ,#'fboundp ,(lambda (s _b _f) (describe-function s)))
@@ -628,27 +630,28 @@ that."
                 ;; Quoted symbols
                 (save-excursion
                   (while (re-search-forward help-xref-symbol-regexp nil t)
-                    (let* ((data (match-string 8))
-                           (sym (intern-soft data)))
-                      (if sym
-                          (cond
-                           ((match-string 3) ; `variable' &c
-                            (and (or (boundp sym) ; `variable' doesn't ensure
+                    (when-let ((sym (intern-soft (match-string 9))))
+                      (if (match-string 8)
+                          (delete-region (match-beginning 8)
+                                         (match-end 8))
+                        (cond
+                         ((match-string 3)        ; `variable' &c
+                          (and (or (boundp sym) ; `variable' doesn't ensure
                                         ; it's actually bound
-                                     (get sym 'variable-documentation))
-                                 (help-xref-button 8 'help-variable sym)))
-                           ((match-string 4) ; `function' &c
-                            (and (fboundp sym) ; similarly
-                                 (help-xref-button 8 'help-function sym)))
-                           ((match-string 5) ; `face'
-                            (and (facep sym)
-                                 (help-xref-button 8 'help-face sym)))
-                           ((match-string 6)) ; nothing for `symbol'
-                           ((match-string 7)
-                            (help-xref-button 8 'help-function-def sym))
-                           ((cl-some (lambda (x) (funcall (nth 1 x) sym))
-                                     describe-symbol-backends)
-                            (help-xref-button 8 'help-symbol sym)))))))
+                                   (get sym 'variable-documentation))
+                               (help-xref-button 9 'help-variable sym)))
+                         ((match-string 4)     ; `function' &c
+                          (and (fboundp sym)   ; similarly
+                               (help-xref-button 9 'help-function sym)))
+                         ((match-string 5) ; `face'
+                          (and (facep sym)
+                               (help-xref-button 9 'help-face sym)))
+                         ((match-string 6)) ; nothing for `symbol'
+                         ((match-string 7)
+                          (help-xref-button 9 'help-function-def sym))
+                         ((cl-some (lambda (x) (funcall (nth 1 x) sym))
+                                   describe-symbol-backends)
+                          (help-xref-button 9 'help-symbol sym)))))))
                 ;; An obvious case of a key substitution:
                 (save-excursion
                   (while (re-search-forward
diff --git a/lisp/help.el b/lisp/help.el
index 3c0370fee1..766bae0845 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -392,16 +392,23 @@ If that doesn't give a function, return nil."
 The prefix described consists of all but the last event
 of the key sequence that ran this command."
   (interactive)
-  (let ((key (this-command-keys)))
-    (describe-bindings
-     (if (stringp key)
-        (substring key 0 (1- (length key)))
-       (let ((prefix (make-vector (1- (length key)) nil))
-            (i 0))
-        (while (< i (length prefix))
-          (aset prefix i (aref key i))
-          (setq i (1+ i)))
-        prefix)))))
+  (let* ((key (this-command-keys))
+         (prefix
+          (if (stringp key)
+             (substring key 0 (1- (length key)))
+            (let ((prefix (make-vector (1- (length key)) nil))
+                 (i 0))
+             (while (< i (length prefix))
+               (aset prefix i (aref key i))
+               (setq i (1+ i)))
+             prefix))))
+    (describe-bindings prefix)
+    (with-current-buffer (help-buffer)
+      (when (< (buffer-size) 10)
+        (let ((inhibit-read-only t))
+          (insert (format "No commands with a binding that start with %s."
+                          (help--key-description-fontified prefix))))))))
+
 ;; Make C-h after a prefix, when not specifically bound,
 ;; run describe-prefix-bindings.
 (setq prefix-help-command 'describe-prefix-bindings)
@@ -1090,7 +1097,7 @@ strings done by `substitute-command-keys'."
   :version "29.1"
   :group 'help)
 
-(defun substitute-command-keys (string &optional no-face)
+(defun substitute-command-keys (string &optional no-face include-menus)
   "Substitute key descriptions for command names in STRING.
 Each substring of the form \\\\=[COMMAND] is replaced by either a
 keystroke sequence that invokes COMMAND, or \"M-x COMMAND\" if COMMAND
@@ -1100,18 +1107,20 @@ unless the optional argument NO-FACE is non-nil.
 Each substring of the form \\\\=`KEYBINDING' will be replaced by
 KEYBINDING and use the `help-key-binding' face.
 
-Each substring of the form \\\\={MAPVAR} is replaced by a summary of
-the value of MAPVAR as a keymap.  This summary is similar to the one
-produced by ‘describe-bindings’.  The summary ends in two newlines
-(used by the helper function ‘help-make-xrefs’ to find the end of the
-summary).
+Each substring of the form \\\\={MAPVAR} is replaced by a summary
+of the value of MAPVAR as a keymap.  This summary is similar to
+the one produced by `describe-bindings'.  This will normally
+exclude menu bindings, but if the optional INCLUDE-MENUS argument
+is non-nil, also include menu bindings.  The summary ends in two
+newlines (used by the helper function `help-make-xrefs' to find
+the end of the summary).
 
 Each substring of the form \\\\=<MAPVAR> specifies the use of MAPVAR
 as the keymap for future \\\\=[COMMAND] substrings.
 
 Each grave accent \\=` is replaced by left quote, and each apostrophe \\='
 is replaced by right quote.  Left and right quote characters are
-specified by ‘text-quoting-style’.
+specified by `text-quoting-style'.
 
 \\\\== quotes the following character and is discarded; thus, \\\\==\\\\== 
puts \\\\==
 into the output, \\\\==\\[ puts \\[ into the output, and \\\\==\\=` puts \\=` 
into the
@@ -1164,7 +1173,8 @@ Otherwise, return a new string."
                 (let ((k (buffer-substring-no-properties orig-point (point))))
                   (cond ((= (length k) 0)
                          (error "Empty key sequence in substitution"))
-                        ((not (key-valid-p k))
+                        ((and (not (string-match-p "\\`M-x " k))
+                              (not (key-valid-p k)))
                          (error "Invalid key sequence in substitution: `%s'" 
k))))
                 (add-text-properties orig-point (point)
                                      '( face help-key-binding
@@ -1253,9 +1263,11 @@ Otherwise, return a new string."
                    (t
                     ;; Get the list of active keymaps that precede this one.
                     ;; If this one's not active, get nil.
-                    (let ((earlier-maps (cdr (memq this-keymap (reverse 
active-maps)))))
+                    (let ((earlier-maps
+                           (cdr (memq this-keymap (reverse active-maps)))))
                       (describe-map-tree this-keymap t (nreverse earlier-maps)
-                                         nil nil t nil nil t))))))))
+                                         nil nil (not include-menus)
+                                         nil nil t))))))))
              ;; 2. Handle quotes.
              ((and (eq (text-quoting-style) 'curve)
                    (or (and (= (following-char) ?\`)
@@ -1502,10 +1514,11 @@ in `describe-map-tree'."
       ;; Now output them in sorted order.
       (while vect
         (let* ((elem (car vect))
-               (start (car elem))
-               (definition (cadr elem))
-               (shadowed (caddr elem))
-               (end start))
+               (start (nth 0 elem))
+               (definition (nth 1 elem))
+               (shadowed (nth 2 elem))
+               (end start)
+               remapped)
           ;; Find consecutive chars that are identically defined.
           (when (fixnump start)
             (while (and (cdr vect)
@@ -1529,7 +1542,19 @@ in `describe-map-tree'."
             ;; Now START .. END is the range to describe next.
             ;; Insert the string to describe the event START.
             (setq line-start (point))
-            (insert (help--key-description-fontified (vector start) prefix))
+            ;; If we're in a <remap> section of the output, then also
+            ;; display the bindings of the keys that we've remapped from.
+            ;; This enables the user to actually see what keys to tap to
+            ;; execute the remapped commands.
+            (if (setq remapped
+                      (and (equal prefix [remap])
+                           (not (eq definition 'self-insert-command))
+                           (car (where-is-internal definition))))
+                (insert (help--key-description-fontified
+                         (vector (elt remapped (1- (length remapped))))
+                         (seq-into (butlast (seq-into remapped 'list))
+                                   'vector)))
+              (insert (help--key-description-fontified (vector start) prefix)))
             (when (not (eq start end))
               (insert " .. " (help--key-description-fontified (vector end)
                                                               prefix)))
@@ -1543,9 +1568,15 @@ in `describe-map-tree'."
             ;; Print a description of the definition of this character.
             ;; elt_describer will take care of spacing out far enough for
             ;; alignment purposes.
-            (when shadowed
+            (when (or shadowed remapped)
               (goto-char (max (1- (point)) (point-min)))
-              (insert "\n  (this binding is currently shadowed)")
+              (when shadowed
+                (insert "\n  (this binding is currently shadowed)"))
+              (when remapped
+                (insert (format
+                         "\n  (Remapped via %s)"
+                         (help--key-description-fontified
+                          (vector start) prefix))))
               (goto-char (min (1+ (point)) (point-max))))))
         ;; Next item in list.
         (setq vect (cdr vect)))
@@ -1934,40 +1965,39 @@ Return VALUE."
     ;; Return VALUE.
     value))
 
-;; `with-help-window' is a wrapper for `with-temp-buffer-window'
-;; providing the following additional twists:
-
-;; (1) It puts the buffer in `help-mode' (via `help-mode-setup') and
-;;     adds cross references (via `help-mode-finish').
-
-;; (2) It issues a message telling how to scroll and quit the help
-;;     window (via `help-window-setup').
-
-;; (3) An option (customizable via `help-window-select') to select the
-;;     help window automatically.
-
-;; (4) A marker (`help-window-point-marker') to move point in the help
-;;     window to an arbitrary buffer position.
 (defmacro with-help-window (buffer-or-name &rest body)
   "Evaluate BODY, send output to BUFFER-OR-NAME and show in a help window.
-This construct is like `with-temp-buffer-window', which see, but unlike
-that, it puts the buffer specified by BUFFER-OR-NAME in `help-mode' and
-displays a message about how to delete the help window when it's no
-longer needed.  The help window will be selected if
-`help-window-select' is non-nil.
-Most of this is done by `help-window-setup', which see."
+The return value from BODY will be returned.
+
+The help window will be selected if `help-window-select' is
+non-nil.
+
+The `temp-buffer-window-setup-hook' hook is called."
   (declare (indent 1) (debug t))
-  `(progn
-     ;; Make `help-window-point-marker' point nowhere.  The only place
-     ;; where this should be set to a buffer position is within BODY.
-     (set-marker help-window-point-marker nil)
-     (let ((temp-buffer-window-setup-hook
-           (cons 'help-mode-setup temp-buffer-window-setup-hook))
-          (temp-buffer-window-show-hook
-           (cons 'help-mode-finish temp-buffer-window-show-hook)))
-       (setq help-window-old-frame (selected-frame))
-       (with-temp-buffer-window
-       ,buffer-or-name nil 'help-window-setup (progn ,@body)))))
+  `(help--window-setup ,buffer-or-name (lambda () ,@body)))
+
+(defun help--window-setup (buffer callback)
+  ;; Make `help-window-point-marker' point nowhere.  The only place
+  ;; where this should be set to a buffer position is within BODY.
+  (set-marker help-window-point-marker nil)
+  (with-current-buffer (get-buffer-create buffer)
+    (unless (derived-mode-p 'help-mode)
+      (help-mode))
+    (setq buffer-read-only t
+          buffer-file-name nil)
+    (setq-local help-mode--current-data nil)
+    (buffer-disable-undo)
+    (let ((inhibit-read-only t)
+         (inhibit-modification-hooks t))
+      (erase-buffer)
+      (delete-all-overlays)
+      (prog1
+          (let ((standard-output (current-buffer)))
+            (prog1
+                (funcall callback)
+              (run-hooks 'temp-buffer-window-setup-hook)))
+        (help-window-setup (temp-buffer-window-show (current-buffer)))
+        (help-make-xrefs (current-buffer))))))
 
 ;; Called from C, on encountering `help-char' when reading a char.
 ;; Don't print to *Help*; that would clobber Help history.
diff --git a/lisp/hfy-cmap.el b/lisp/hfy-cmap.el
index 258502bfe7..c08359696d 100644
--- a/lisp/hfy-cmap.el
+++ b/lisp/hfy-cmap.el
@@ -859,8 +859,4 @@ Loads the variable `hfy-rgb-txt-color-map', which is used by
 
 (provide 'hfy-cmap)
 
-;; Local Variables:
-;; generated-autoload-file: "htmlfontify-loaddefs.el"
-;; End:
-
 ;;; hfy-cmap.el ends here
diff --git a/lisp/hilit-chg.el b/lisp/hilit-chg.el
index 10e2512e9d..4832dd9023 100644
--- a/lisp/hilit-chg.el
+++ b/lisp/hilit-chg.el
@@ -669,7 +669,7 @@ This removes all saved change information."
 
 ;;;###autoload
 (defun highlight-changes-rotate-faces ()
-  "Rotate the faces if in Highlight Changes mode and the changes are visible.
+  "\"Age\" changes if in Highlight Changes mode and the changes are visible.
 
 Current changes are displayed in the face described by the first element
 of `highlight-changes-face-list', one level older changes are shown in
diff --git a/lisp/htmlfontify.el b/lisp/htmlfontify.el
index 9ea27f2465..dbcc152c15 100644
--- a/lisp/htmlfontify.el
+++ b/lisp/htmlfontify.el
@@ -81,8 +81,6 @@
 (eval-when-compile (require 'cl-lib))
 (require 'cus-edit)
 
-(require 'htmlfontify-loaddefs)
-
 (defconst htmlfontify-version 0.21)
 
 (defconst hfy-meta-tags
@@ -364,7 +362,7 @@ the etags output on stdout.
 Two canned commands are provided - they drive Emacs's etags and
 exuberant-ctags' etags respectively."
   :tag   "etags-command"
-  :type (let ((clist (list '(string))))
+  :type (let ((clist (list '(string) '(const :tag "None" nil))))
           (dolist (C hfy-etags-cmd-alist)
             (push (list 'const :tag (car C) (cdr C)) clist))
           (cons 'choice clist)))
@@ -1157,14 +1155,6 @@ The default handler is `hfy-face-to-css-default'.
 
 See also `hfy-face-to-style'.")
 
-(defalias 'hfy-prop-invisible-p
-  (if (fboundp 'invisible-p) #'invisible-p
-    (lambda (prop)
-      "Is text property PROP an active invisibility property?"
-      (or (and (eq buffer-invisibility-spec t) prop)
-          (or (memq prop buffer-invisibility-spec)
-              (assq prop buffer-invisibility-spec))))))
-
 (defun hfy-find-invisible-ranges ()
   "Return a list of (start-point . end-point) cons cells of invisible regions."
   (save-excursion
@@ -1254,8 +1244,8 @@ return a `defface' style list of face properties instead 
of a face symbol."
       (when face-name (setq base-face face-name))
       (dolist (P overlay-data)
         (let ((iprops (cadr (memq 'invisible P)))) ;FIXME: plist-get?
-          ;;(message "(hfy-prop-invisible-p %S)" iprops)
-          (when (and iprops (hfy-prop-invisible-p iprops))
+          ;;(message "(invisible-p %S)" iprops)
+          (when (and iprops (invisible-p iprops))
             (setq extra-props
                   (cons :invisible (cons t extra-props))) ))
         (let ((fprops (cadr (or (memq 'face P)
@@ -2409,6 +2399,8 @@ You may also want to set `hfy-page-header' and 
`hfy-page-footer'."
   (declare (obsolete seq-intersection "28.1"))
   (nreverse (seq-intersection set-a set-b #'eq)))
 
+(define-obsolete-function-alias 'hfy-prop-invisible-p #'invisible-p "29.1")
+
 (provide 'htmlfontify)
 
 ;;; htmlfontify.el ends here
diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index ee1a131a6e..be7f6831cc 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -139,7 +139,9 @@ See `icomplete-delay-completions-threshold'."
   :type 'integer)
 
 (defvar icomplete-in-buffer nil
-  "If non-nil, also use Icomplete when completing in non-mini buffers.")
+  "If non-nil, also use Icomplete when completing in non-mini buffers.
+This affects commands like `complete-in-region', but not commands
+that use their own completions setup.")
 
 (defcustom icomplete-minibuffer-setup-hook nil
   "Icomplete-specific customization of minibuffer setup.
@@ -557,7 +559,8 @@ Usually run by inclusion in `minibuffer-setup-hook'."
        ;; predicates" which may vary depending on specific
        ;; `completing-read' invocations, described below:
        for fn in (cond ((and minibuffer-default
-                             (stringp minibuffer-default) ; bug#38992
+                             (stringp (or (car-safe minibuffer-default)
+                                          minibuffer-default)) ; bug#38992 
bug#55800
                              (equal (icomplete--field-string) 
icomplete--initial-input))
                         ;; Here, we have a non-nil string default and
                         ;; no input whatsoever.  We want to make sure
@@ -575,7 +578,9 @@ Usually run by inclusion in `minibuffer-setup-hook'."
                           ;; Has "bar" at the top, so RET will select
                           ;; it, as desired.
                           ,(lambda (comp)
-                             (equal minibuffer-default comp))
+                             (equal (or (car-safe minibuffer-default)
+                                        minibuffer-default)
+                                    comp))
                           ;; Why do we need this second predicate?
                           ;; Because that'll make things like M-x man
                           ;; RET RET, when invoked with point on the
@@ -597,7 +602,9 @@ Usually run by inclusion in `minibuffer-setup-hook'."
                           ;; useful for a very broad spectrum of
                           ;; cases.
                           ,(lambda (comp)
-                             (string-prefix-p minibuffer-default comp))))
+                             (string-prefix-p (or (car-safe minibuffer-default)
+                                                  minibuffer-default)
+                                              comp))))
                        ((and fido-mode
                              (not minibuffer-default)
                              (eq (icomplete--category) 'file))
diff --git a/lisp/ido.el b/lisp/ido.el
index e068028d91..f970fce1ed 100644
--- a/lisp/ido.el
+++ b/lisp/ido.el
@@ -2238,8 +2238,7 @@ If cursor is not at the end of the user input, move to 
end of input."
        (t
        (add-to-history 'buffer-name-history buf)
        (setq buf (get-buffer-create buf))
-       (if (fboundp 'set-buffer-major-mode)
-           (set-buffer-major-mode buf))
+        (set-buffer-major-mode buf)
        (ido-visit-buffer buf method t))))))
 
 (defun ido-record-work-directory (&optional dir)
@@ -3940,7 +3939,7 @@ If `ido-change-word-sub' cannot be found in WORD, return 
nil."
       ;; In the new buffer, go to the first completion.
       ;; FIXME: Perhaps this should be done in `ido-completion-help'.
       (when (bobp)
-       (next-completion 1)))))
+       (first-completion)))))
 
 (defun ido-completion-auto-help ()
   "Call `ido-completion-help' if `completion-auto-help' is non-nil."
@@ -3977,23 +3976,30 @@ If `ido-change-word-sub' cannot be found in WORD, 
return nil."
       (setq display-it t))
     (if (and ido-completion-buffer display-it)
        (with-output-to-temp-buffer ido-completion-buffer
-         (let ((completion-list (sort
-                                 (cond
-                                  (ido-directory-too-big
-                                   (message "Reading directory...")
-                                   (setq ido-directory-too-big nil
-                                         ido-ignored-list nil
-                                         ido-cur-list (ido-all-completions)
-                                         ido-rescan t)
-                                   (ido-set-matches)
-                                   (or ido-matches ido-cur-list))
-                                  (ido-use-merged-list
-                                   (ido-flatten-merged-list (or ido-matches 
ido-cur-list)))
-                                  ((or full-list 
ido-completion-buffer-all-completions)
-                                   (ido-all-completions))
-                                  (t
-                                   (copy-sequence (or ido-matches 
ido-cur-list))))
-                                 #'ido-file-lessp)))
+         (let* ((comps
+                 (cond
+                  (ido-directory-too-big
+                   (message "Reading directory...")
+                   (setq ido-directory-too-big nil
+                         ido-ignored-list nil
+                         ido-cur-list (ido-all-completions)
+                         ido-rescan t)
+                   (ido-set-matches)
+                   (or ido-matches ido-cur-list))
+                  (ido-use-merged-list
+                   (ido-flatten-merged-list (or ido-matches ido-cur-list)))
+                  ((or full-list ido-completion-buffer-all-completions)
+                   (ido-all-completions))
+                  (t
+                   (copy-sequence (or ido-matches ido-cur-list)))))
+                 (completion-list
+                  ;; If we have an alist COMPLETIONS, transform to a
+                  ;; simple list first.
+                  (sort (if (and (consp comps)
+                                 (consp (car comps)))
+                            (mapcar #'car comps)
+                          comps)
+                        #'ido-file-lessp)))
            ;;(add-hook 'completion-setup-hook #'completion-setup-function)
            (display-completion-list completion-list))))))
 
diff --git a/lisp/iimage.el b/lisp/iimage.el
index 2fe50d3e3f..8a765d5e5d 100644
--- a/lisp/iimage.el
+++ b/lisp/iimage.el
@@ -76,11 +76,9 @@ Examples of image filename patterns to match:
      foo.JPG"
   :type '(alist :key-type regexp :value-type integer))
 
-(defvar iimage-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "\C-l" #'iimage-recenter)
-    map)
-  "Keymap used in `iimage-mode'.")
+(defvar-keymap iimage-mode-map
+  :doc "Keymap used in `iimage-mode'."
+  "C-l" #'iimage-recenter)
 
 (defun iimage-recenter (&optional arg)
   "Re-draw images and recenter."
diff --git a/lisp/image-dired.el b/lisp/image-dired.el
index d8bd2937db..30bf5ee108 100644
--- a/lisp/image-dired.el
+++ b/lisp/image-dired.el
@@ -2261,23 +2261,26 @@ Optionally use old comment from FILE as initial value."
      comment)))
 
 ;;;###autoload
-(defun image-dired-mark-tagged-files ()
-  "Use regexp to mark files with matching tag.
+(defun image-dired-mark-tagged-files (regexp)
+  "Use REGEXP to mark files with matching tag.
 A `tag' is a keyword, a piece of meta data, associated with an
 image file and stored in image-dired's database file.  This command
 lets you input a regexp and this will be matched against all tags
 on all image files in the database file.  The files that have a
 matching tag will be marked in the Dired buffer."
-  (interactive)
+  (interactive "sMark tagged files (regexp): ")
   (image-dired-sane-db-file)
-  (let ((tag (read-string "Mark tagged files (regexp): "))
-        (hits 0)
+  (let ((hits 0)
         files)
     (image-dired--with-db-file
-     ;; Collect matches
-     (while (search-forward-regexp
-            (concat "\\(^[^;\n]+\\);.*" tag ".*$") nil t)
-       (push (match-string 1) files)))
+      ;; Collect matches
+      (while (search-forward-regexp "\\(^[^;\n]+\\);\\(.*\\)" nil t)
+        (let ((file (match-string 1))
+              (tags (split-string (match-string 2) ";")))
+          (when (seq-find (lambda (tag)
+                            (string-match-p regexp tag))
+                          tags)
+            (push file files)))))
     ;; Mark files
     (dolist (curr-file files)
       ;; I tried using `dired-mark-files-regexp' but it was waaaay to
diff --git a/lisp/image-mode.el b/lisp/image-mode.el
index 721f2f2bbd..ea5d7ff0f3 100644
--- a/lisp/image-mode.el
+++ b/lisp/image-mode.el
@@ -282,10 +282,17 @@ Stop if the top edge of the image is reached."
 (defun image-scroll-up (&optional n)
   "Scroll image in current window upward by N lines.
 Stop if the bottom edge of the image is reached.
-If ARG is omitted or nil, scroll upward by a near full screen.
+
+Interactively, giving this command a numerical prefix will scroll
+up by that many lines (and down by that many lines if the number
+is negative).  Without a prefix, scroll up by a full screen.
+If given a `C-u -' prefix, scroll a full page down instead.
+
+If N is omitted or nil, scroll upward by a near full screen.
 A near full screen is `next-screen-context-lines' less than a full screen.
-Negative ARG means scroll downward.
-If ARG is the atom `-', scroll downward by nearly full screen.
+A negative N means scroll downward.
+
+If N is the atom `-', scroll downward by nearly full screen.
 When calling from a program, supply as argument a number, nil, or `-'."
   (interactive "P")
   (cond ((null n)
@@ -303,10 +310,17 @@ When calling from a program, supply as argument a number, 
nil, or `-'."
 (defun image-scroll-down (&optional n)
   "Scroll image in current window downward by N lines.
 Stop if the top edge of the image is reached.
-If ARG is omitted or nil, scroll downward by a near full screen.
+
+Interactively, giving this command a numerical prefix will scroll
+down by that many lines (and up by that many lines if the number
+is negative).  Without a prefix, scroll down by a full screen.
+If given a `C-u -' prefix, scroll a full page up instead.
+
+If N is omitted or nil, scroll downward by a near full screen.
 A near full screen is `next-screen-context-lines' less than a full screen.
-Negative ARG means scroll upward.
-If ARG is the atom `-', scroll upward by nearly full screen.
+A negative N means scroll upward.
+
+If N is the atom `-', scroll upward by nearly full screen.
 When calling from a program, supply as argument a number, nil, or `-'."
   (interactive "P")
   (cond ((null n)
diff --git a/lisp/image/image-converter.el b/lisp/image/image-converter.el
index 7914d28c29..9440c623f9 100644
--- a/lisp/image/image-converter.el
+++ b/lisp/image/image-converter.el
@@ -49,7 +49,7 @@ formats that are to be supported: Only the suffixes that map 
to
 (defcustom image-convert-to-format "png"
   "The image format to convert to.
 This should be a string like \"png\" or \"ppm\" or some
-other (preferrably lossless) format that Emacs understands
+other (preferably lossless) format that Emacs understands
 natively.  The converter chosen has to support the format, and if
 not, conversion will fail."
   :group 'image
diff --git a/lisp/imenu.el b/lisp/imenu.el
index a87860f006..2636e77d08 100644
--- a/lisp/imenu.el
+++ b/lisp/imenu.el
@@ -899,6 +899,13 @@ for more information."
       (`(,name . ,pos) (imenu (list name pos imenu-default-goto-function)))
       (_ (error "Unknown imenu item: %S" index-item)))))
 
+(defun imenu-flush-cache ()
+  "Flush the current imenu cache.
+This forces a full rescan of the buffer to recreate the index alist
+next time `imenu' is invoked."
+  (imenu--cleanup)
+  (setq imenu--index-alist nil))
+
 (provide 'imenu)
 
 ;;; imenu.el ends here
diff --git a/lisp/indent.el b/lisp/indent.el
index 0343439d14..d6dee94016 100644
--- a/lisp/indent.el
+++ b/lisp/indent.el
@@ -240,21 +240,23 @@ Blank lines are ignored."
                             (current-indentation))))
         indent))))
 
-(defvar indent-rigidly-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [left]  'indent-rigidly-left)
-    (define-key map [right] 'indent-rigidly-right)
-    (define-key map [S-left]  'indent-rigidly-left-to-tab-stop)
-    (define-key map [S-right] 'indent-rigidly-right-to-tab-stop)
-    map)
-  "Transient keymap for adjusting indentation interactively.
-It is activated by calling `indent-rigidly' interactively.")
+(defvar-keymap indent-rigidly-map
+  :doc   "Transient keymap for adjusting indentation interactively.
+It is activated by calling `indent-rigidly' interactively."
+  "TAB"       #'indent-rigidly-right
+  "<left>"    #'indent-rigidly-left
+  "<right>"   #'indent-rigidly-right
+  "S-<left>"  #'indent-rigidly-left-to-tab-stop
+  "S-<right>" #'indent-rigidly-right-to-tab-stop)
+(put 'indent-rigidly-right :advertised-binding (kbd "<right>"))
 
 (defun indent-rigidly (start end arg &optional interactive)
   "Indent all lines starting in the region.
 If called interactively with no prefix argument, activate a
 transient mode in which the indentation can be adjusted interactively
 by typing \\<indent-rigidly-map>\\[indent-rigidly-left], 
\\[indent-rigidly-right], \\[indent-rigidly-left-to-tab-stop], or 
\\[indent-rigidly-right-to-tab-stop].
+In addition, \\`TAB' is also bound (and calls `indent-rigidly-right').
+
 Typing any other key exits this mode, and this key is then
 acted upon as normally.  If `transient-mark-mode' is enabled,
 exiting also deactivates the mark.
diff --git a/lisp/info.el b/lisp/info.el
index 514cf7b3f4..f9d63b0f32 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -1834,7 +1834,7 @@ list of valid filename suffixes for Info files.  See
           ;; include it (without the suffix).
           (when (and (string-match suffix file)
                      ;; But exclude subfiles of split Info files.
-                     (not (string-match "\.info-[0-9]+" file))
+                     (not (string-match "\\.info-[0-9]+" file))
                      ;; And exclude backup files.
                      (not (string-match "~\\'" file)))
             (push (substring file 0 (match-beginning 0))
@@ -4236,7 +4236,7 @@ If FORK is non-nil, it is passed to `Info-goto-node'."
   (Info-history-menu e "Back in history" Info-history 'Info-history-back))
 
 (defun Info-history-forward-menu (e)
-  "Pop up the menu with a list of Info nodes visited with ‘Info-history-back’."
+  "Pop up the menu with a list of Info nodes visited with `Info-history-back'."
   (interactive "e" Info-mode)
   (Info-history-menu e "Forward in history" Info-history-forward 
'Info-history-forward))
 
diff --git a/lisp/international/emoji.el b/lisp/international/emoji.el
index df488708af..8970a466b7 100644
--- a/lisp/international/emoji.el
+++ b/lisp/international/emoji.el
@@ -31,6 +31,7 @@
 (require 'cl-extra)
 (require 'transient)
 (require 'multisession)
+(require 'generate-lisp-file)
 
 (defgroup emoji nil
   "Inserting Emojis."
@@ -415,8 +416,8 @@ the name is not known."
     (dolist (glyph glyphs)
       (remhash glyph emoji--derived)))
   (with-temp-buffer
-    (insert ";; Generated file -- do not edit.   -*- lexical-binding:t -*-
-;; Copyright © 1991-2021 Unicode, Inc.
+    (generate-lisp-file-heading file 'emoji--generate-file)
+    (insert ";; Copyright © 1991-2021 Unicode, Inc.
 ;; Generated from Unicode data files by emoji.el.
 ;; The source for this file is found in the admin/unidata/emoji-test.txt
 ;; file in the Emacs sources.  The Unicode data files are used under the
@@ -426,18 +427,7 @@ the name is not known."
       (insert (format "(defconst %s '" var))
       (pp (symbol-value var) (current-buffer))
       (insert (format "\n) ;; End %s\n\n" var)))
-    (insert ";; Local" " Variables:
-;; coding: utf-8
-;; version-control: never
-;; no-byte-"
-            ;; Obfuscate to not inhibit compilation of this file, too.
-            "compile: t
-;; no-update-autoloads: t
-;; End:
-
-\(provide 'emoji-labels)
-
-\;;; emoji-labels.el ends here\n")
+    (generate-lisp-file-trailer file)
     (write-region (point-min) (point-max) file)))
 
 (defun emoji--base-name (name derivations)
diff --git a/lisp/international/fontset.el b/lisp/international/fontset.el
index 883f08905e..8d34aa99c3 100644
--- a/lisp/international/fontset.el
+++ b/lisp/international/fontset.el
@@ -182,8 +182,20 @@
        (canadian-aboriginal #x14C0)
        (ogham #x168F)
        (runic #x16A0)
+        (tagalog #x1700)
+        (hanunoo #x1720)
+        (buhid #x1740)
+        (tagbanwa #x1760)
        (khmer #x1780)
        (mongolian #x1826)
+        (limbu #x1901 #x1920 #x1936)
+        (buginese #x1A00 #x1A1E)
+        (balinese #x1B13 #x1B35 #x1B5E)
+        (sundanese #x1B8A #x1BAB #x1CC4)
+        (batak #x1BC2 #x1BE7 #x1BFF)
+        (lepcha #x1C00 #x1C24 #x1C40)
+        (tai-le #x1950)
+        (tai-lue #x1980)
         (tai-tham #x1A20 #x1A55 #x1A61 #x1A80)
        (symbol . [#x201C #x2200 #x2500])
        (braille #x2800)
@@ -194,9 +206,12 @@
        (kanbun #x319D)
        (han #x5B57)
        (yi #xA288)
-       (javanese #xA980)
+        (syloti-nagri #xA807 #xA823 #xA82C)
+        (rejang #xA930 #xA947 #xA95F)
+       (javanese #xA98F #xA9B4 #xA9CA)
        (cham #xAA00)
        (tai-viet #xAA80)
+        (meetei-mayek #xABC0 #xABE3 #xAAE0 #xAAF6)
        (hangul #xAC00)
        (linear-b #x10000)
        (aegean-number #x10100)
@@ -224,7 +239,7 @@
        (lydian #x10920)
        (kharoshthi #x10A00)
        (manichaean #x10AC0)
-       (hanifi-rohingya #x10D00)
+       (hanifi-rohingya #x10D00 #x10D24 #x10D39)
        (yezidi #x10E80)
        (old-sogdian #x10F00)
        (sogdian #x10F30)
@@ -232,14 +247,16 @@
        (elymaic #x10FE0)
        (old-uyghur #x10F70)
         (brahmi #x11013 #x11045 #x11052 #x11065)
+        (kaithi #x1108D #x110B0 #x110BD)
        (mahajani #x11150)
+        (sharada #x11191 #x111B3 #x111CD)
        (khojki #x11200)
        (khudawadi #x112B0)
-       (grantha #x11305)
+       (grantha #x11315 #x1133E #x11374)
        (newa #x11400)
-       (tirhuta #x11481)
-       (siddham #x11580)
-       (modi #x11600)
+       (tirhuta #x11481 #x1148F #x114D0)
+       (siddham #x1158E #x115AF #x115D4)
+       (modi #x1160E #x11630 #x11655)
        (takri #x11680)
        (dogra #x11800)
        (warang-citi #x118A1)
@@ -252,7 +269,7 @@
        (marchen #x11C72)
        (masaram-gondi #x11D00)
        (gunjala-gondi #x11D60)
-       (makasar #x11EE0)
+       (makasar #x11EE0 #x11EF7)
        (cuneiform #x12000)
        (cypro-minoan #x12F90)
        (egyptian #x13000)
@@ -364,8 +381,8 @@
        (latn . latin)
        (lepc . lepcha)
        (limb . limbu)
-       (lina . linear_a)
-       (linb . linear_b)
+       (lina . linear-a)
+       (linb . linear-b)
        (lisu . lisu)
        (lyci . lycian)
        (lydi . lydian)
@@ -432,11 +449,11 @@
        (sora . sora-sompeng)
        (soyo . soyombo)
        (sund . sundanese)
-       (sylo . syloti_nagri)
+       (sylo . syloti-nagri)
        (syrc . syriac)
        (tglg . tagalog)
        (tagb . tagbanwa)
-       (tale . tai_le)
+       (tale . tai-le)
        (talu . tai-lue)
        (lana . tai-tham)
        (tavt . tai-viet)
@@ -743,11 +760,24 @@
                     cham
                    ogham
                    runic
+                    tagalog
+                    hanunoo
+                    buhid
+                    tagbanwa
+                    limbu
+                    buginese
+                    balinese
+                    sundanese
+                    batak
+                    lepcha
                    symbol
                    braille
                    yi
+                    syloti-nagri
+                    rejang
                     javanese
                    tai-viet
+                    meetei-mayek
                    aegean-number
                    ancient-greek-number
                    ancient-symbol
@@ -765,6 +795,7 @@
                    cypriot-syllabary
                    phoenician
                    lydian
+                    hanifi-rohingya
                     yezidi
                    kharoshthi
                    manichaean
@@ -772,6 +803,12 @@
                    elymaic
                     old-uyghur
                     brahmi
+                    kaithi
+                    sharada
+                    grantha
+                    tirhuta
+                    siddham
+                    modi
                    makasar
                     dives-akuru
                    cuneiform
@@ -941,6 +978,13 @@
   (set-fontset-font "fontset-default" 'emoji
                     '("Noto Color Emoji" . "iso10646-1") nil 'prepend)
 
+  ;; This supports the display of Tamil Supplement characters.  As
+  ;; these characters are pretty simple and do not need reordering,
+  ;; ligatures, vowel signs, virama etc., neither tml2 nor other OTF
+  ;; features are needed here.
+  (set-fontset-font "fontset-default" '(#x11FC0 . #x11FFF)
+                    '("Noto Sans Tamil Supplement" . "iso10646-1") nil 'append)
+
   ;; Append CJK fonts for characters other than han, kana, cjk-misc.
   ;; Append fonts for scripts whose name is also a charset name.
   (let* ((data (build-default-fontset-data))
diff --git a/lisp/international/iso-transl.el b/lisp/international/iso-transl.el
index b90c065461..417f0076ef 100644
--- a/lisp/international/iso-transl.el
+++ b/lisp/international/iso-transl.el
@@ -112,8 +112,12 @@
     (",,"   . [?¸])
     (",A"   . [?Ą])
     (",C"   . [?Ç])
+    (",N"   . [?Ņ])
+    (",S"   . [?Ş])
     (",a"   . [?ą])
     (",c"   . [?ç])
+    (",n"   . [?ņ])
+    (",s"   . [?ş])
     ("*-"   . [?­])
     ("-"    . [?­])
     ("*."   . [?·])
@@ -134,7 +138,23 @@
     ("*<"   . [?«])
     ("<"    . [?«])
     ("*="   . [?¯])
-    ("="    . [?¯])
+    ("=="   . [?¯])
+    ("=A"   . [?Ā])
+    ("=a"   . [?ā])
+    ("=E"   . [?Ē])
+    ("=e"   . [?ē])
+    ("=/E"  . [?Ǣ])
+    ("=/e"  . [?ǣ])
+    ("=G"   . [?Ḡ])
+    ("=g"   . [?ḡ])
+    ("=I"   . [?Ī])
+    ("=i"   . [?ī])
+    ("=O"   . [?Ō])
+    ("=o"   . [?ō])
+    ("=U"   . [?Ū])
+    ("=u"   . [?ū])
+    ("=Y"   . [?Ȳ])
+    ("=y"   . [?ȳ])
     ("*>"   . [?»])
     (">"    . [?»])
     ("*?"   . [?¿])
@@ -149,11 +169,34 @@
     ("R"    . [?®])
     ("*S"   . [?§])
     ("S"    . [?§])
+    ("*T"   . [?™])
+    ("T"    . [?™])
     ("*Y"   . [?¥])
     ("Y"    . [?¥])
+    ("^0"   . [?⁰])
     ("^1"   . [?¹])
     ("^2"   . [?²])
     ("^3"   . [?³])
+    ("^4"   . [?⁴])
+    ("^5"   . [?⁵])
+    ("^6"   . [?⁶])
+    ("^7"   . [?⁷])
+    ("^8"   . [?⁸])
+    ("^9"   . [?⁹])
+    ("^+"   . [?⁺])
+    ("^-"   . [?⁻])
+    ("_0"   . [?₀])
+    ("_1"   . [?₁])
+    ("_2"   . [?₂])
+    ("_3"   . [?₃])
+    ("_4"   . [?₄])
+    ("_5"   . [?₅])
+    ("_6"   . [?₆])
+    ("_7"   . [?₇])
+    ("_8"   . [?₈])
+    ("_9"   . [?₉])
+    ("_+"   . [?₊])
+    ("_-"   . [?₋])
     ("^A"   . [?Â])
     ("^E"   . [?Ê])
     ("^I"   . [?Î])
diff --git a/lisp/international/ja-dic-cnv.el b/lisp/international/ja-dic-cnv.el
index 704f1a1ae6..ec68d8c804 100644
--- a/lisp/international/ja-dic-cnv.el
+++ b/lisp/international/ja-dic-cnv.el
@@ -44,6 +44,8 @@
 
 ;;; Code:
 
+(require 'generate-lisp-file)
+
 ;; Name of a file to generate from SKK dictionary.
 (defvar ja-dic-filename "ja-dic.el")
 
@@ -295,7 +297,7 @@
       (setq skkdic-okuri-nasi-entries-count (length skkdic-okuri-nasi-entries))
       (progress-reporter-done progress))))
 
-(defun skkdic-convert-okuri-nasi (skkbuf buf)
+(defun skkdic-convert-okuri-nasi (skkbuf buf &optional no-reduction)
   (with-current-buffer buf
     (insert ";; Setting okuri-nasi entries.\n"
            "(skkdic-set-okuri-nasi\n")
@@ -311,7 +313,9 @@
           (setq count (1+ count))
           (progress-reporter-update progress count)
          (if (setq candidates
-                   (skkdic-reduced-candidates skkbuf kana candidates))
+                    (if no-reduction
+                        candidates
+                      (skkdic-reduced-candidates skkbuf kana candidates)))
              (progn
                (insert "\"" kana)
                (while candidates
@@ -322,10 +326,11 @@
       (progress-reporter-done progress))
     (insert ")\n\n")))
 
-(defun skkdic-convert (filename &optional dirname)
+(defun skkdic-convert (filename &optional dirname no-reduction)
   "Generate Emacs Lisp file from Japanese dictionary file FILENAME.
 The format of the dictionary file should be the same as SKK dictionaries.
-Saves the output as `ja-dic-filename', in directory DIRNAME (if specified)."
+Saves the output as `ja-dic-filename', in directory DIRNAME (if specified).
+If NO-REDUCTION is non-nil, do not reduce the dictionary vocabulary."
   (interactive "FSKK dictionary file: ")
   (let* ((skkbuf (get-buffer-create " *skkdic-unannotated*"))
         (buf (get-buffer-create "*skkdic-work*")))
@@ -335,18 +340,15 @@ Saves the output as `ja-dic-filename', in directory 
DIRNAME (if specified)."
         (insert-file-contents (expand-file-name filename)))
       (re-search-forward "^[^;]")
       (while (re-search-forward ";[^\n/]*/" nil t)
-       (replace-match "/")))
+       (replace-match "/" t t)))
     ;; Setup and generate the header part of working buffer.
     (with-current-buffer buf
       (erase-buffer)
       (buffer-disable-undo)
-      (insert ";;; ja-dic.el --- dictionary for Japanese input method"
-             "  -*- lexical-binding:t -*-\n"
-             ";;\tGenerated by the command `skkdic-convert'\n"
-             ";;\tOriginal SKK dictionary file: "
+      (generate-lisp-file-heading ja-dic-filename 'skkdic-convert :code nil)
+      (insert ";; Original SKK dictionary file: "
              (file-relative-name (expand-file-name filename) dirname)
              "\n\n"
-             ";; This file is part of GNU Emacs.\n\n"
              ";;; Start of the header of the original SKK dictionary.\n\n")
       (set-buffer skkbuf)
       (goto-char 1)
@@ -389,18 +391,12 @@ Saves the output as `ja-dic-filename', in directory 
DIRNAME (if specified)."
        (skkdic-collect-okuri-nasi)
 
        ;; Convert okuri-nasi general entries.
-       (skkdic-convert-okuri-nasi skkbuf buf)
+       (skkdic-convert-okuri-nasi skkbuf buf no-reduction)
 
        ;; Postfix
        (with-current-buffer buf
          (goto-char (point-max))
-         (insert ";;\n(provide 'ja-dic)\n\n"
-                 ";; Local Variables:\n"
-                 ";; version-control: never\n"
-                 ";; no-update-autoloads: t\n"
-                 ";; coding: utf-8\n"
-                 ";; End:\n\n"
-                 ";;; ja-dic.el ends here\n")))
+          (generate-lisp-file-trailer ja-dic-filename :compile t)))
 
       ;; Save the working buffer.
       (set-buffer buf)
@@ -427,15 +423,21 @@ To get complete usage, invoke:
        (message "To convert SKK-JISYO.L into skkdic.el:")
        (message "  %% emacs -batch -l ja-dic-cnv -f batch-skkdic-convert 
SKK-JISYO.L")
        (message "To convert SKK-JISYO.L into DIR/ja-dic.el:")
-       (message "  %% emacs -batch -l ja-dic-cnv -f batch-skkdic-convert -dir 
DIR SKK-JISYO.L"))
-    (let (targetdir filename)
+       (message "  %% emacs -batch -l ja-dic-cnv -f batch-skkdic-convert -dir 
DIR SKK-JISYO.L")
+        (message "To convert SKK-JISYO.L into skkdic.el without reducing 
dictionary vocabulary:")
+        (message "  %% emacs -batch -l ja-dic-cnv -f batch-skkdic-convert 
--no-reduction SKK-JISYO.L"))
+    (let (targetdir filename no-reduction)
       (if (string= (car command-line-args-left) "-dir")
          (progn
            (setq command-line-args-left (cdr command-line-args-left))
            (setq targetdir (expand-file-name (car command-line-args-left)))
            (setq command-line-args-left (cdr command-line-args-left))))
+      (if (string= (car command-line-args-left) "--no-reduction")
+          (progn
+           (setq no-reduction t)
+           (setq command-line-args-left (cdr command-line-args-left))))
       (setq filename (expand-file-name (car command-line-args-left)))
-      (skkdic-convert filename targetdir)))
+      (skkdic-convert filename targetdir no-reduction)))
   (kill-emacs 0))
 
 
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index 1596cdb481..ab74c2cffd 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -310,7 +310,7 @@ Print messages at start and end of loading unless optional 
fourth
 arg NOMESSAGE is non-nil.
 
 If EVAL-FUNCTION, call that instead of calling `eval-buffer'
-directly.  It is called with two paramameters: The buffer object
+directly.  It is called with two parameters: The buffer object
 and the file name.
 
 Return t if file exists."
diff --git a/lisp/international/titdic-cnv.el b/lisp/international/titdic-cnv.el
index a3b6266791..2a91e7cb5e 100644
--- a/lisp/international/titdic-cnv.el
+++ b/lisp/international/titdic-cnv.el
@@ -62,6 +62,7 @@
 ;;; Code:
 
 (require 'quail)
+(require 'generate-lisp-file)
 
 ;; List of values of key "ENCODE:" and the corresponding Emacs
 ;; coding-system and language environment name.
@@ -269,13 +270,10 @@ SPC, 6, 3, 4, or 7 specifying a tone (SPC:陰平, 6:陽平, 3:上聲, 
4:去聲,
        (tit-moveleft ",<")
        (tit-keyprompt nil))
 
-    (princ (format ";;; %s  -*- lexical-binding:t -*-\n"
-                   (file-name-nondirectory filename)))
+    (generate-lisp-file-heading filename 'titdic-convert :code nil)
     (princ ";; Quail package `")
     (princ package)
     (princ "\n")
-    (princ (substitute-command-keys
-           ";;   Generated by the command `titdic-convert'\n"))
     (princ ";;\tOriginal TIT dictionary file: ")
     (princ (file-name-nondirectory filename))
     (princ "\n\n")
@@ -521,11 +519,8 @@ the generated Quail package is saved."
 
          ;; Process the body part
          (tit-process-body)
-
-         (princ ";; Local Variables:\n")
-         (princ ";; version-control: never\n")
-         (princ ";; no-update-autoloads: t\n")
-         (princ ";; End:\n"))))))
+          (generate-lisp-file-trailer
+           filename :inhibit-provide t :compile t :coding nil))))))
 
 ;;;###autoload
 (defun batch-titdic-convert (&optional force)
@@ -1135,11 +1130,8 @@ the generated Quail package is saved."
        ;; Explicitly set eol format to `unix'.
        (setq coding-system-for-write 'utf-8-unix)
        (with-temp-file (expand-file-name quailfile dirname)
-          (insert (format ";;; %s  -*- lexical-binding:t -*-\n"
-                          (file-name-nondirectory quailfile)))
+          (generate-lisp-file-heading quailfile 'miscdic-convert)
          (insert (format-message ";; Quail package `%s'\n" name))
-         (insert (format-message
-                  ";;   Generated by the command `miscdic-convert'\n"))
          (insert ";;   Source dictionary file: " dicfile "\n")
          (insert ";;   Copyright notice of the source file\n")
          (insert ";;------------------------------------------------------\n")
@@ -1161,11 +1153,8 @@ the generated Quail package is saved."
               (let ((dicbuf (current-buffer)))
                 (with-current-buffer dstbuf
                   (funcall converter dicbuf)))))
-         (insert ";; Local Variables:\n"
-                 ";; version-control: never\n"
-                 ";; no-update-autoloads: t\n"
-                 ";; End:\n\n"
-                 ";;; " quailfile " ends here\n")))
+          (generate-lisp-file-trailer
+           quailfile :inhibit-provide t :compile t :coding nil)))
       (setq tail (cdr tail)))))
 
 (defun batch-miscdic-convert ()
@@ -1228,7 +1217,4 @@ The library is named pinyin.el, and contains the constant
       (insert "(provide 'pinyin)\n"))
     (kill-emacs 0)))
 
-;; Prevent "Local Variables" above confusing Emacs.
-
-
 ;;; titdic-cnv.el ends here
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 96168f94bd..91aaa66a5b 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -4410,14 +4410,17 @@ LAX-WHITESPACE: The value of `isearch-lax-whitespace' 
and
     (let ((unwind (make-symbol "minibuffer-lazy-highlight--unwind"))
           (after-change (make-symbol 
"minibuffer-lazy-highlight--after-change"))
           (display-count (make-symbol 
"minibuffer-lazy-highlight--display-count"))
+          (buffer (current-buffer))
           overlay)
       (fset unwind
             (lambda ()
-              (remove-function isearch-filter-predicate filter)
+              (when filter
+                (with-current-buffer buffer
+                  (remove-function (local 'isearch-filter-predicate) filter)))
               (remove-hook 'lazy-count-update-hook display-count)
               (when overlay (delete-overlay overlay))
-              (remove-hook 'after-change-functions after-change)
-              (remove-hook 'minibuffer-exit-hook unwind)
+              (remove-hook 'after-change-functions after-change t)
+              (remove-hook 'minibuffer-exit-hook unwind t)
               (let ((lazy-highlight-cleanup cleanup))
                 (lazy-highlight-cleanup))))
       (fset after-change
@@ -4441,16 +4444,102 @@ LAX-WHITESPACE: The value of `isearch-lax-whitespace' 
and
                                 (format minibuffer-lazy-count-format
                                         isearch-lazy-count-total)))))
       (lambda ()
-        (add-hook 'minibuffer-exit-hook unwind)
-        (add-hook 'after-change-functions after-change)
+        (add-hook 'minibuffer-exit-hook unwind nil t)
+        (add-hook 'after-change-functions after-change nil t)
         (when minibuffer-lazy-count-format
           (setq overlay (make-overlay (point-min) (point-min) (current-buffer) 
t))
           (add-hook 'lazy-count-update-hook display-count))
         (when filter
-          (add-function :after-while isearch-filter-predicate filter))
+          (with-current-buffer buffer
+            (add-function :after-while (local 'isearch-filter-predicate) 
filter)))
         (funcall after-change nil nil nil)))))
 
 
+(defun isearch-search-fun-in-text-property (property &optional search-fun)
+  "Return the function to search inside text that has the specified PROPERTY.
+The function will limit the search for matches only inside text which has
+this property in the current buffer.
+Optional argument SEARCH-FUN provides the function to search text, and
+defaults to the value of `isearch-search-fun-default'."
+  (lambda (string &optional bound noerror count)
+    (let* ((old (point))
+           ;; Check if point is already on the property.
+           (beg (when (get-text-property
+                       (if isearch-forward old (max (1- old) (point-min)))
+                       property)
+                  old))
+           end found (i 0)
+           (subregexp
+            (and isearch-regexp
+                 (save-match-data
+                   (catch 'subregexp
+                     (while (string-match "\\^\\|\\$" string i)
+                       (setq i (match-end 0))
+                       (when (subregexp-context-p string (match-beginning 0))
+                         ;; The ^/$ is not inside a char-range or escaped.
+                         (throw 'subregexp t))))))))
+      ;; Otherwise, try to search for the next property.
+      (unless beg
+        (setq beg (if isearch-forward
+                      (next-single-property-change old property)
+                    (previous-single-property-change old property)))
+        (when beg (goto-char beg)))
+      ;; Non-nil `beg' means there are more properties.
+      (while (and beg (not found))
+        ;; Search for the end of the current property.
+        (setq end (if isearch-forward
+                      (next-single-property-change beg property)
+                    (previous-single-property-change beg property)))
+        ;; Handle ^/$ specially by matching in a temporary buffer.
+        (if subregexp
+            (let* ((prop-beg
+                    (if (or (if isearch-forward (bobp) (eobp))
+                            (null (get-text-property
+                                   (+ (point) (if isearch-forward -1 0))
+                                   property)))
+                        ;; Already at the beginning of the field.
+                        beg
+                      ;; Get the real beginning of the field when
+                      ;; the search was started in the middle.
+                      (if isearch-forward
+                          (previous-single-property-change beg property)
+                        (next-single-property-change beg property))))
+                   (substring (buffer-substring prop-beg end))
+                   (offset (if isearch-forward prop-beg end))
+                   match-data)
+              (with-temp-buffer
+                (insert substring)
+                (goto-char (- beg offset -1))
+                ;; Apply ^/$ regexp on the whole extracted substring.
+                (setq found (funcall
+                             (or search-fun (isearch-search-fun-default))
+                             string (and bound (max (point-min)
+                                                    (min (point-max)
+                                                         (- bound offset -1))))
+                             noerror count))
+                ;; Adjust match data as if it's matched in original buffer.
+                (when found
+                  (setq found (+ found offset -1)
+                        match-data (mapcar (lambda (m) (+ m offset -1))
+                                           (match-data)))))
+              (when match-data (set-match-data match-data)))
+          (setq found (funcall
+                       (or search-fun (isearch-search-fun-default))
+                       string (if bound (if isearch-forward
+                                            (min bound end)
+                                          (max bound end))
+                                end)
+                       noerror count)))
+        ;; Get the next text property.
+        (unless found
+          (setq beg (if isearch-forward
+                        (next-single-property-change end property)
+                      (previous-single-property-change end property)))
+          (when beg (goto-char beg))))
+      (unless found (goto-char old))
+      found)))
+
+
 (defun isearch-resume (string regexp word forward message case-fold)
   "Resume an incremental search.
 STRING is the string or regexp searched for.
diff --git a/lisp/jit-lock.el b/lisp/jit-lock.el
index 20c1202474..17969d5762 100644
--- a/lisp/jit-lock.el
+++ b/lisp/jit-lock.el
@@ -217,6 +217,11 @@ If the system load rises above `jit-lock-stealth-load' 
percent, stealth
 fontification is suspended.  Stealth fontification intensity is controlled via
 the variable `jit-lock-stealth-nice'.
 
+`jit-lock-mode' is not a regular minor mode, and it doesn't
+follow the regular conventions to switch the functionality on or
+off.  Instead, an ARG of nil will switch it off, and non-nil will
+switch it on.
+
 If you need to debug code run from jit-lock, see `jit-lock-debug-mode'."
   (setq jit-lock-mode arg)
   (cond
diff --git a/lisp/kmacro.el b/lisp/kmacro.el
index 3f1f12fad6..5746b770a2 100644
--- a/lisp/kmacro.el
+++ b/lisp/kmacro.el
@@ -172,7 +172,7 @@ macro to be executed before appending to it."
     (define-key map "\C-k" #'kmacro-end-or-call-macro-repeat)
     (define-key map "r"    #'apply-macro-to-region-lines)
     (define-key map "q"    #'kbd-macro-query)  ;; Like C-x q
-    (define-key map "d"    #'kdb-macro-redisplay)
+    (define-key map "d"    #'kmacro-redisplay)
 
     ;; macro ring
     (define-key map "\C-n" #'kmacro-cycle-ring-next)
@@ -1374,12 +1374,12 @@ To customize possible responses, change the 
\"bindings\" in
       (kmacro-push-ring)
       (setq last-kbd-macro kmacro-step-edit-new-macro))))
 
-(defun kdb-macro-redisplay ()
-  "Force redisplay during kbd macro execution."
+(defun kmacro-redisplay ()
+  "Force redisplay during keyboard macro execution."
   (interactive)
   (or executing-kbd-macro
       defining-kbd-macro
-      (user-error "Not defining or executing kbd macro"))
+      (user-error "Not defining or executing keyboard macro"))
   (when executing-kbd-macro
     (let ((executing-kbd-macro nil))
       (redisplay))))
diff --git a/lisp/language/greek.el b/lisp/language/greek.el
index 58f4fe6fc4..920cf67d87 100644
--- a/lisp/language/greek.el
+++ b/lisp/language/greek.el
@@ -79,7 +79,9 @@
           (coding-priority greek-iso-8bit)
           (nonascii-translation . iso-8859-7)
           (input-method . "greek")
-          (documentation . t)))
+          (documentation . "Support for Greek ISO-8859-7 using the greek input 
method.")
+           (sample-text . "Greek (ελληνικά)    Γειά σας")
+           (tutorial . "TUTORIAL.el_GR")))
 
 (provide 'greek)
 
diff --git a/lisp/language/indian.el b/lisp/language/indian.el
index c3d59b6f77..2887d410ad 100644
--- a/lisp/language/indian.el
+++ b/lisp/language/indian.el
@@ -45,8 +45,9 @@
                (coding-system utf-8)
                (coding-priority utf-8)
                (input-method . "devanagari-aiba")
+                (sample-text . "Devanagari (देवनागरी)  नमस्ते / नमस्कार")
                (documentation . "\
-Such languages using Devanagari script as Hindi and Marathi
+Such languages using Devanagari script as Hindi, Marathi and Nepali
 are supported in this language environment."))
  '("Indian"))
 
@@ -55,16 +56,18 @@ are supported in this language environment."))
             (coding-system utf-8)
             (coding-priority utf-8)
             (input-method . "bengali-itrans")
+             (sample-text . "Bengali (বাংলা)   নমস্কার")
             (documentation . "\
 Such languages using Bengali script as Bengali and Assamese
 are supported in this language environment."))
  '("Indian"))
 
 (set-language-info-alist
- "Punjabi" '((charset unicode)
+ "Gurmukhi" '((charset unicode)
              (coding-system utf-8)
              (coding-priority utf-8)
              (input-method . "punjabi-itrans")
+              (sample-text . "Gurmukhi (ਗੁਰਮੁਖੀ)       ਸਤ ਸ੍ਰੀ ਅਕਾਲ")
              (documentation . "\
 North Indian language Punjabi is supported in this language environment."))
  '("Indian"))
@@ -74,17 +77,31 @@ North Indian language Punjabi is supported in this language 
environment."))
              (coding-system utf-8)
              (coding-priority utf-8)
              (input-method . "gujarati-itrans")
+              (sample-text . "Gujarati (ગુજરાતી)       નમસ્તે")
              (documentation . "\
 North Indian language Gujarati is supported in this language environment."))
  '("Indian"))
 
+(set-language-info-alist
+ "Odia" '((charset unicode)
+         (coding-system utf-8)
+         (coding-priority utf-8)
+         (input-method . "odia")
+          (sample-text . "Odia (ଓଡ଼ିଆ)  ନମସ୍କାର")
+         (documentation . "\
+Such languages using the Odia script as Odia, Khonti, and Santali
+are supported in this language environment.  (This language
+environment was formerly known as \"Oriya\")."))
+ '("Indian"))
+
 (set-language-info-alist
  "Oriya" '((charset unicode)
-             (coding-system utf-8)
-             (coding-priority utf-8)
-             (input-method . "oriya-itrans")
-             (documentation . "\
-Such languages using Oriya script as Oriya, Khonti, and Santali
+         (coding-system utf-8)
+         (coding-priority utf-8)
+         (input-method . "odia")
+          (sample-text . "Odia (ଓଡ଼ିଆ)  ନମସ୍କାର")
+         (documentation . "\
+Such languages using the Odia script as Odia, Khonti, and Santali
 are supported in this language environment."))
  '("Indian"))
 
@@ -93,6 +110,7 @@ are supported in this language environment."))
           (coding-system utf-8)
           (coding-priority utf-8)
           (input-method . "tamil-itrans")
+           (sample-text . "Tamil (தமிழ்)       வணக்கம்")
           (documentation . "\
 South Indian Language Tamil is supported in this language environment."))
  '("Indian"))
@@ -102,6 +120,7 @@ South Indian Language Tamil is supported in this language 
environment."))
            (coding-system utf-8)
            (coding-priority utf-8)
            (input-method . "telugu-itrans")
+            (sample-text . "Telugu (తెలుగు)    నమస్కారం")
            (documentation . "\
 South Indian Language Telugu is supported in this language environment."))
  '("Indian"))
@@ -113,7 +132,7 @@ South Indian Language Telugu is supported in this language 
environment."))
             (input-method . "kannada-itrans")
             (sample-text . "Kannada (ಕನ್ನಡ)    ನಮಸ್ಕಾರ")
             (documentation . "\
-Kannada language and script is supported in this language
+Kannada language and script are supported in this language
 environment."))
  '("Indian"))
 
@@ -122,6 +141,7 @@ environment."))
               (coding-system utf-8)
               (coding-priority utf-8)
               (input-method . "malayalam-itrans")
+               (sample-text . "Malayalam (മലയാളം)      നമസ്കാരം")
               (documentation . "\
 South Indian language Malayalam is supported in this language environment."))
  '("Indian"))
@@ -136,6 +156,115 @@ South Indian language Malayalam is supported in this 
language environment."))
 The ancient Brahmi script is supported in this language environment."))
  '("Indian"))                           ; Should we have an "Old" category?
 
+(set-language-info-alist
+ "Kaithi" '((charset unicode)
+            (coding-system utf-8)
+            (coding-priority utf-8)
+            (input-method . "kaithi")
+            (sample-text . "Kaithi (𑂍𑂶𑂟𑂲)      𑂩𑂰𑂧𑂩𑂰𑂧")
+            (documentation . "\
+Languages such as Awadhi, Bhojpuri, Magahi and Maithili
+which used the Kaithi script are supported in this language environment."))
+ '("Indian"))
+
+(set-language-info-alist
+ "Tirhuta" '((charset unicode)
+             (coding-system utf-8)
+             (coding-priority utf-8)
+             (input-method . "tirhuta")
+             (sample-text . "Tirhuta (𑒞𑒱𑒩𑒯𑒳𑒞𑒰) 𑒣𑓂𑒩𑒢𑒰𑒧 / 𑒮𑒲𑒞𑒰𑒩𑒰𑒧")
+             (documentation . "\
+Maithili language and its script Tirhuta are supported in this
+language environment."))
+ '("Indian"))
+
+(set-language-info-alist
+ "Sharada" '((charset unicode)
+             (coding-system utf-8)
+             (coding-priority utf-8)
+             (input-method . "sharada")
+             (sample-text . "Sharada (𑆯𑆳𑆫𑆢𑆳)   𑆤𑆩𑆱𑇀𑆑𑆳𑆫")
+             (documentation . "\
+Kashmiri language and its script Sharada are supported in this
+language environment."))
+ '("Indian"))
+
+(set-language-info-alist
+ "Siddham" '((charset unicode)
+             (coding-system utf-8)
+             (coding-priority utf-8)
+             (input-method . "siddham")
+             (sample-text . "Siddham (𑖭𑖰𑖟𑖿𑖠𑖽)  𑖡𑖦𑖭𑖿𑖝𑖸")
+             (documentation . "\
+Sanskrit language and one of its script Siddham are supported
+in this language environment."))
+ '("Indian"))
+
+(set-language-info-alist
+ "Syloti Nagri" '((charset unicode)
+                  (coding-system utf-8)
+                  (coding-priority utf-8)
+                  (input-method . "syloti-nagri")
+                  (sample-text . "Syloti Nagri (ꠍꠤꠟꠐꠤ ꠘꠣꠉꠞꠤ)   ꠀꠌ꠆ꠍꠣꠟꠣꠝꠥ 
ꠀꠟꠣꠁꠇꠥꠝ / ꠘꠝꠡ꠆ꠇꠣꠞ")
+                  (documentation . "\
+Sylheti language and its script Syloti Nagri are supported
+in this language environment."))
+ '("Indian"))
+
+(set-language-info-alist
+ "Modi" '((charset unicode)
+          (coding-system utf-8)
+          (coding-priority utf-8)
+          (input-method . "modi")
+          (sample-text . "Modi (𑘦𑘻𑘚𑘲)  𑘡𑘦𑘭𑘿𑘎𑘰𑘨")
+          (documentation . "\
+Marathi language and one of its script Modi are supported
+in this language environment."))
+ '("Indian"))
+
+(set-language-info-alist
+ "Limbu" '((charset unicode)
+           (coding-system utf-8)
+           (coding-priority utf-8)
+           (input-method . "limbu")
+           (sample-text . "Limbu (ᤕᤠᤰᤌᤢᤱ ᤐᤠᤴ)  ᤛᤣᤘᤠᤖᤥ")
+           (documentation . "\
+Limbu language and its script are supported in this
+language environment."))
+ '("Indian"))
+
+(set-language-info-alist
+ "Grantha" '((charset unicode)
+             (coding-system utf-8)
+             (coding-priority utf-8)
+             (input-method . "grantha")
+             (sample-text . "Grantha (𑌗𑍍𑌰𑌨𑍍𑌥)  𑌨𑌮𑌸𑍍𑌤𑍇 / 𑌨𑌮𑌸𑍍𑌕𑌾𑌰𑌃")
+             (documentation . "\
+Languages such as Sanskrit and Manipravalam, when they use the
+Grantha script, are supported in this language environment."))
+ '("Indian"))
+
+(set-language-info-alist
+ "Lepcha" '((charset unicode)
+            (coding-system utf-8)
+            (coding-priority utf-8)
+            (input-method . "lepcha")
+            (sample-text . "Lepcha (ᰛᰩᰵᰛᰧᰵᰶ)   ᰂᰦᰕᰥᰬ")
+            (documentation . "\
+Lepcha language and its script are supported in this
+language environment."))
+ '("Indian"))
+
+(set-language-info-alist
+ "Meetei Mayek" '((charset unicode)
+                  (coding-system utf-8)
+                  (coding-priority utf-8)
+                  (input-method . "meetei-mayek")
+                  (sample-text . "Meetei Mayek (ꯃꯤꯇꯩ ꯃꯌꯦꯛ)     ꯈꯨꯔꯨꯝꯖꯔꯤ")
+                  (documentation . "\
+Meetei language and its script Meetei Mayek are supported in this
+language environment."))
+ '("Indian"))
 
 ;; Replace mnemonic characters in REGEXP according to TABLE.  TABLE is
 ;; an alist of (MNEMONIC-STRING . REPLACEMENT-STRING).
@@ -158,6 +287,8 @@ The ancient Brahmi script is supported in this language 
environment."))
           ("H" . "\u094D")             ; HALANT
           ("s" . "[\u0951\u0952]")     ; stress sign
           ("t" . "[\u0953\u0954]")     ; accent
+           ("1" . "\u0967")             ; numeral 1
+           ("3" . "\u0969")             ; numeral 3
           ("N" . "\u200C")             ; ZWNJ
           ("J" . "\u200D")             ; ZWJ
           ("X" . "[\u0900-\u097F]")))) ; all coverage
@@ -169,6 +300,8 @@ The ancient Brahmi script is supported in this language 
environment."))
       "Cn?\\(?:J?HJ?Cn?\\)*\\(?:H[NJ]?\\|v*n?a?s?t?A?\\)\\|"
       ;; special consonant form, or
       "JHR\\|"
+      ;; vedic accents with numerals, or
+      "1ss?\\|3ss\\|s3ss\\|"
       ;; any other singleton characters
       "X")
      table))
@@ -179,14 +312,15 @@ The ancient Brahmi script is supported in this language 
environment."))
         '(("a" . "\u0981")             ; SIGN CANDRABINDU
           ("A" . "[\u0982\u0983]")     ; SIGN ANUSVARA .. VISARGA
           ("V" . "[\u0985-\u0994\u09E0\u09E1]") ; independent vowel
-          ("C" . "[\u0995-\u09B9\u09DC-\u09DF\u09F1]") ; consonant
+          ("C" . "[\u0995-\u09B9\u09DC-\u09DF\u09F0\u09F1]") ; consonant
           ("B" . "[\u09AC\u09AF\u09B0\u09F0]")         ; BA, YA, RA
           ("R" . "[\u09B0\u09F0]")             ; RA
           ("n" . "\u09BC")             ; NUKTA
           ("v" . "[\u09BE-\u09CC\u09D7\u09E2\u09E3]") ; vowel sign
           ("H" . "\u09CD")             ; HALANT
           ("T" . "\u09CE")             ; KHANDA TA
-          ("N" . "\u200C")             ; ZWNJ
+           ("S" . "\u09FE")             ; SANDHI MARK
+           ("N" . "\u200C")            ; ZWNJ
           ("J" . "\u200D")             ; ZWJ
           ("X" . "[\u0980-\u09FF]")))) ; all coverage
     (indian-compose-regexp
@@ -194,7 +328,7 @@ The ancient Brahmi script is supported in this language 
environment."))
       ;; syllables with an independent vowel, or
       "\\(?:RH\\)?Vn?\\(?:J?HB\\)?v*n?a?A?\\|"
       ;; consonant-based syllables, or
-      "Cn?\\(?:J?HJ?Cn?\\)*\\(?:H[NJ]?\\|v*[NJ]?v?a?A?\\)\\|"
+      "Cn?\\(?:J?HJ?Cn?\\)*\\(?:H[NJ]?\\|v*[NJ]?v?a?A?S?\\)\\|"
       ;; another syllables with an independent vowel, or
       "\\(?:RH\\)?T\\|"
       ;; special consonant form, or
@@ -261,7 +395,7 @@ The ancient Brahmi script is supported in this language 
environment."))
         '(("a" . "\u0B01")             ; SIGN CANDRABINDU
           ("A" . "[\u0B02\u0B03]")     ; SIGN ANUSVARA .. VISARGA
           ("V" . "[\u0B05-\u0B14\u0B60\u0B61]") ; independent vowel
-          ("C" . "[\u0B15-\u0B39\u0B5C\u0B5D\u0B71]")  ; consonant
+          ("C" . "[\u0B15-\u0B39\u0B5C\u0B5D\u0B5F\u0B71]")    ; consonant
           ("B" . 
"[\u0B15-\u0B17\u0B1B-\u0B1D\u0B1F-\u0B21\u0B23\u0B24\u0B27-\u0B30\u0B32-\u0B35\u0B38\u0B39]")
 ; consonant with below form
           ("R" . "\u0B30")             ; RA
           ("n" . "\u0B3C")             ; NUKTA
@@ -421,6 +555,237 @@ The ancient Brahmi script is supported in this language 
environment."))
                                (concat multiplier number-joiner numeral)
                                1 'font-shape-gstring))))
 
-(provide 'indian)
+;; Kaithi composition rules
+(let ((consonant            "[\x1108D-\x110AF]")
+      (nukta                "\x110BA")
+      (independent-vowel    "[\x11083-\x1108C]")
+      (vowel                "[\x1108D-\x110C2]")
+      (nasal                "[\x11080\x11081]")
+      (virama               "\x110B9")
+      (number-sign          "\x110BD")
+      (number-sign-above    "\x110CD")
+      (numerals             "[\x966-\x96F]+")
+      (zwj                  "\x200D"))
+  (set-char-table-range composition-function-table
+                        '(#x110B0 . #x110BA)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant nukta "?\\(?:" virama zwj "?" 
consonant
+                                       nukta "?\\)*\\(?:" virama zwj "?\\|" 
vowel "*" nukta
+                                       "?" nasal "?\\)")
+                               1 'font-shape-gstring)
+                              (vector
+                               ;; Vowel based syllables
+                               (concat independent-vowel nukta "?" virama "?" 
vowel "?")
+                               1 'font-shape-gstring)))
+  (set-char-table-range composition-function-table
+                        '(#x110BD . #x110BD)
+                        (list (vector
+                               ;; Number sign
+                               (concat number-sign numerals)
+                               0 'font-shape-gstring)))
+  (set-char-table-range composition-function-table
+                        '(#x110CD . #x110CD)
+                        (list (vector
+                               ;; Number sign above
+                               (concat number-sign-above numerals)
+                               0 'font-shape-gstring))))
+
+;; Tirhuta composition rules
+(let ((consonant            "[\x1148F-\x114AF]")
+      (nukta                "\x114C3")
+      (independent-vowel    "[\x11481-\x1148E]")
+      (vowel                "[\x114B0-\x114BE]")
+      (nasal                "[\x114BF\x114C0]")
+      (virama               "\x114C2"))
+  (set-char-table-range composition-function-table
+                        '(#x114B0 . #x114C3)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant nukta "?\\(?:" virama 
consonant nukta
+                                       "?\\)*\\(?:" virama "\\|" vowel "*" 
nukta "?"
+                                       nasal "?\\)")
+                               1 'font-shape-gstring)
+                              (vector
+                               ;; Vowel based syllables
+                               (concat independent-vowel nukta "?" virama "?" 
vowel "?" nasal "?")
+                               1 'font-shape-gstring))))
 
+;; Sharada composition rules
+(let ((consonant              "[\x11191-\x111B2]")
+      (nukta                  "\x111CA")
+      (independent-vowel      "[\x11183-\x11190]")
+      (vowel                  "[\x111B3-\x111BF\x111CE]")
+      (vowel-modifier         "\x111CB")
+      (extra-short-vowel-mark "\x111CC")
+      (nasal                  "[\x11181\x11180\x111CF]")
+      (virama                 "\x111C0")
+      (fricatives             "[\x111C2\x111C3]")
+      (sandhi-mark            "\x111C9")
+      (misc                   "[\x111C4-\x111C8\x111CD]"))
+  (set-char-table-range composition-function-table
+                        '(#x111B3 . #x111CE)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant nukta "?" vowel-modifier 
"?\\(?:" virama
+                                       consonant nukta "?" vowel-modifier 
"?\\)*\\(?:" virama
+                                       "\\|" vowel "*" nukta "?" nasal "?" 
extra-short-vowel-mark
+                                        "?" vowel-modifier "?" sandhi-mark 
"?+" misc "?\\)")
+                               1 'font-shape-gstring)
+                              (vector
+                               ;; Vowel based syllables
+                               (concat independent-vowel nukta "?" 
vowel-modifier "?" virama "?"
+                                       vowel "?" extra-short-vowel-mark "?" 
sandhi-mark "?"
+                                       fricatives "?" misc "?")
+                               1 'font-shape-gstring)
+                              (vector
+                               ;; Fricatives with Consonants
+                               (concat fricatives "?" consonant vowel "?")
+                               0 'font-shape-gstring))))
+
+;; Siddham composition rules
+(let ((consonant            "[\x1158E-\x115AE]")
+      (nukta                "\x115C0")
+      (independent-vowel    "[\x11580-\x1158D\x115D8-\x115DB]")
+      (vowel                "[\x115AF-\x115BB\x115DC\x115DD]")
+      (nasal                "[\x115BC\x115BD]")
+      (visarga              "\x115BE")
+      (virama               "\x115BF"))
+  (set-char-table-range composition-function-table
+                        '(#x115AF . #x115C0)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant nukta "?" "\\(?:" virama 
consonant nukta
+                                       "?\\)*\\(?:" virama "\\|" vowel "*" 
nukta "?" nasal
+                                       "?" visarga "?\\)")
+                               1 'font-shape-gstring)
+                              (vector
+                               ;; Vowels based syllables
+                               (concat independent-vowel nukta "?" virama "?" 
vowel "?"
+                                       nasal "?" visarga "?")
+                               1 'font-shape-gstring))))
+
+;; Syloti Nagri composition rules
+(let ((consonant            "[\xA807-\xA80A\xA80C-\xA822]")
+      (vowel                "[\xA802\xA823-\xA827]")
+      (nasal                "[\xA80B]")
+      (virama               "\xA806")
+      (alternate-virama     "\xA82C"))
+  (set-char-table-range composition-function-table
+                        '(#xA806 . #xA806)
+                        (list (vector
+                               ;; Consonant conjunct based syllables
+                               (concat consonant "\\(?:" virama consonant 
"\\)+"
+                                       vowel "?" nasal "?")
+                               1 'font-shape-gstring)))
+  (set-char-table-range composition-function-table
+                        '(#xA823 . #xA827)
+                        (list (vector
+                               ;; Non Consonant conjunct based syllables
+                               (concat consonant vowel nasal "?")
+                               1 'font-shape-gstring)))
+    (set-char-table-range composition-function-table
+                        '(#xA82C . #xA82C)
+                        (list (vector
+                               ;; Consonant with the alternate virama
+                               (concat consonant "\\(?:" alternate-virama 
consonant "\\)+"
+                                       vowel "?" nasal "?")
+                               1 'font-shape-gstring))))
+
+;; Modi composition rules
+(let ((consonant            "[\x1160E-\x1162F]")
+      (independent-vowel    "[\x11600-\x1160D]")
+      (vowel                "[\x11630-\x1163C]")
+      (nasal                "\x1163D")
+      (visarga              "\x1163E")
+      (virama               "\x1163F")
+      (ardhacandra          "\x11640"))
+  (set-char-table-range composition-function-table
+                        '(#x11630 . #x11640)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant "\\(?:" virama consonant 
"\\)*\\(?:"
+                                       virama "\\|" vowel "*" ardhacandra "?" 
nasal
+                                       "?" visarga "?\\)")
+                               1 'font-shape-gstring)
+                              (vector
+                               ;; Vowels based syllables
+                               (concat independent-vowel virama "?" vowel "?" 
ardhacandra
+                                       nasal "?" visarga "?")
+                               1 'font-shape-gstring))))
+
+;; Limbu composition rules
+(let ((consonant            "[\x1900-\x191E]")
+      (vowel                "[\x1920-\x1928]")
+      (subjoined-letter     "[\x1929-\x192B]")
+      (small-letter         "[\x1930-\x1938]")
+      (other-signs          "[\x1939\x193A]")
+      (sa-i                 "\x193B"))
+  (set-char-table-range composition-function-table
+                        '(#x1920 . #x193B)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant sa-i "?" subjoined-letter "?" 
small-letter
+                                       "?" vowel "?" other-signs "?")
+                               1 'font-shape-gstring))))
+
+;; Grantha composition rules
+(let ((consonant            "[\x11315-\x11339]")
+      (nukta                "\x1133C")
+      (independent-vowel    "[\x11305-\x11314\x11360\x11361]")
+      (vowel                "[\x1133E-\x1134C\x11357\x11362\x11363]")
+      (nasal                "[\x11300-\x11302]")
+      (bindu                "\x1133B")
+      (visarga              "\x11303")
+      (virama               "\x1134D")
+      (avagraha             "\x1133D")
+      (modifier-above       "[\x11366-\x11374]"))
+  (set-char-table-range composition-function-table
+                        '(#x1133B . #x1134D)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant nukta "?" "\\(?:" virama 
consonant nukta
+                                       "?\\)*\\(?:" virama "\\|" vowel "*" 
nukta "?" nasal
+                                       "?" bindu "?" visarga "?" 
modifier-above "?"
+                                       avagraha "?\\)")
+                               1 'font-shape-gstring)
+                              (vector
+                               ;; Vowels based syllables
+                               (concat independent-vowel nukta "?" virama "?" 
vowel "?"
+                                       nasal "?" bindu "?" visarga "?" 
modifier-above
+                                       "?" avagraha "?")
+                               1 'font-shape-gstring))))
+
+;; Lepcha composition rules
+(let ((consonant            "[\x1C00-\x1C23\x1C4D-\x1C4F]")
+      (vowel                "[\x1C26-\x1C2C]")
+      (subjoined-letter     "[\x1C24\x1C25]")
+      (consonant-sign       "[\x1C2D-\x1C35]")
+      (other-signs          "[\x1C36\x1C37]"))
+  (set-char-table-range composition-function-table
+                        '(#x1C24 . #x1C37)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant other-signs "?" vowel "?"
+                                       consonant-sign "?" subjoined-letter "?"
+                                       other-signs "?")
+                               1 'font-shape-gstring))))
+
+;; Meetei Mayek composition rules
+(let ((akshara              "[\xABC0-\xABE2\xAAE0-\xAAEA]")
+      (vowel                "[\xABE3-\xABE9\xAAEB-\xAAEC]")
+      (nasal                "\xABEA")
+      (visarga              "\xAAF5")
+      (virama               "[\xABED\xAAF6]")
+      (heavy-tone           "\x11640"))
+  (set-char-table-range composition-function-table
+                        '(#xABE3 . #xABED)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat akshara "\\(?:" virama akshara 
"\\)*\\(?:"
+                                       virama "\\|" vowel "*" nasal "?" 
visarga "?"
+                                       heavy-tone "?\\)")
+                               1 'font-shape-gstring))))
+
+(provide 'indian)
 ;;; indian.el ends here
diff --git a/lisp/language/indonesian.el b/lisp/language/indonesian.el
new file mode 100644
index 0000000000..699f819254
--- /dev/null
+++ b/lisp/language/indonesian.el
@@ -0,0 +1,197 @@
+;;; indonesian.el --- Indonesian languages support  -*- coding: utf-8; 
lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Author: समीर सिंह Sameer Singh <lumarzeli30@gmail.com>
+;; Keywords: multilingual, input method, i18n, Indonesia
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This file contains definitions of Indonesia language environments, and
+;; setups for displaying the scripts used there.
+
+;;; Code:
+
+(set-language-info-alist
+ "Balinese" '((charset unicode)
+              (coding-system utf-8)
+              (coding-priority utf-8)
+              (input-method . "balinese")
+              (sample-text . "Balinese (ᬅᬓ᭄ᬱᬭᬩᬮᬶ)      ᬒᬁᬲ᭄ᬯᬲ᭄ᬢ᭄ᬬᬲ᭄ᬢᬸ")
+              (documentation . "\
+Balinese language and its script are supported in this language 
environment.")))
+
+(set-language-info-alist
+ "Javanese" '((charset unicode)
+              (coding-system utf-8)
+              (coding-priority utf-8)
+              (input-method . "javanese")
+              (sample-text . "Javanese (ꦲꦏ꧀ꦱꦫꦗꦮ)       ꦲꦭꦺꦴ")
+              (documentation . "\
+Javanese language and its script are supported in this language 
environment.")))
+
+(set-language-info-alist
+ "Sundanese" '((charset unicode)
+              (coding-system utf-8)
+              (coding-priority utf-8)
+              (input-method . "sundanese")
+              (sample-text . "Sundanese (ᮃᮊ᮪ᮞᮛᮞᮥᮔ᮪ᮓ)    ᮞᮙ᮪ᮕᮥᮛᮞᮥᮔ᮪")
+              (documentation . "\
+Sundanese language and its script are supported in this language 
environment.")))
+
+(set-language-info-alist
+ "Batak" '((charset unicode)
+           (coding-system utf-8)
+           (coding-priority utf-8)
+           (input-method . "batak")
+           (sample-text . "Batak (ᯘᯮᯒᯗ᯲ᯅᯗᯂ᯲)    ᯂᯬᯒᯘ᯲ / ᯔᯧᯐᯬᯀᯱᯐᯬᯀᯱ")
+           (documentation . "\
+Languages that use the Batak script, such as Karo, Toba, Pakpak, Mandailing
+and Simalungun, are supported in this language environment.")))
+
+(set-language-info-alist
+ "Rejang" '((charset unicode)
+            (coding-system utf-8)
+            (coding-priority utf-8)
+            (input-method . "rejang")
+            (sample-text . "Rejang (ꥆꤰ꥓ꤼꤽ ꤽꥍꤺꥏ)    ꤸꥉꥐꤺꥉꥂꥎ")
+            (documentation . "\
+Rejang language and its script are supported in this language environment.")))
+
+(set-language-info-alist
+ "Makasar" '((charset unicode)
+             (coding-system utf-8)
+             (coding-priority utf-8)
+             (input-method . "makasar")
+             (sample-text . "Makasar (𑻪𑻢𑻪𑻢)    𑻦𑻤𑻵𑻱")
+             (documentation . "\
+Makassarese language and its script Makasar are supported in this language 
environment.")))
+
+(set-language-info-alist
+ "Buginese" '((charset unicode)
+              (coding-system utf-8)
+              (coding-priority utf-8)
+              (input-method . "lontara")
+              (sample-text . "Buginese (ᨒᨚᨈᨑ)    ᨖᨒᨚ")
+              (documentation . "\
+Buginese language and its script Lontara are supported in this language 
environment.")))
+
+;; Balinese composition rules
+(let ((consonant            "[\x1B13-\x1B33\x1B45-\x1B4B]")
+      (independent-vowel    "[\x1B05-\x1B12]")
+      (rerekan              "\x1B34")
+      (vowel                "[\x1B35-\x1B43]")
+      (modifier-above       "[\x1B00-\x1B04]")
+      (adeg-adeg            "\x1B44")
+      (musical-symbol       "[\x1B6B-\x1B73]"))
+  (set-char-table-range composition-function-table
+                        '(#x1B34 . #x1B44)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant rerekan "?\\(?:" adeg-adeg 
consonant
+                                       rerekan "?\\)*\\(?:" adeg-adeg "\\|" 
vowel "*" rerekan
+                                       "?" modifier-above "?" musical-symbol 
"?\\)")
+                               1 'font-shape-gstring)
+                              (vector
+                               ;; Vowels based syllables
+                               (concat independent-vowel rerekan "?" adeg-adeg 
"?"
+                                       vowel "?" modifier-above "?" 
musical-symbol "?")
+                               1 'font-shape-gstring))))
+
+;; Javanese composition rules
+(let ((consonant            "[\xA98F-\xA9B2]")
+      (independent-vowel    "[\xA984-\xA98E]")
+      (telu                 "\xA9B3")
+      (vowel                "[\xA9B4-\xA9BC]")
+      (dependant-consonant  "[\xA9BD-\xA9BF]")
+      (modifier-above       "[\xA980-\xA983]")
+      (pangkon              "\xA9C0"))
+  (set-char-table-range composition-function-table
+                        '(#xA9B3 . #xA9C0)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant telu "?\\(?:" pangkon 
consonant
+                                       telu "?\\)*\\(?:" pangkon "\\|" vowel 
"*" telu
+                                       "?" modifier-above "?" 
dependant-consonant "?\\)")
+                               1 'font-shape-gstring)
+                              (vector
+                               ;; Vowels based syllables
+                               (concat independent-vowel telu "?" pangkon "?"
+                                       vowel "?" modifier-above "?" 
dependant-consonant "?")
+                               1 'font-shape-gstring))))
+
+;; Sundanese composition rules
+(let ((consonant            "[\x1B8A-\x1BA0\x1BAE\x1BAF\x1BBB-\x1BBF]")
+      (independent-vowel    "[\x1B83-\x1B89]")
+      (vowel                "[\x1BA4-\x1BA9]")
+      (dependant-consonant  "[\x1BA1-\x1BA3\x1BAC-\x1BAD]")
+      (modifier-above       "[\x1B80-\x1B82]")
+      (virama               "[\x1BAA\x1BAB]"))
+  (set-char-table-range composition-function-table
+                        '(#x1BA1 . #x1BAD)
+                        (list (vector
+                               ;; Consonant based syllables
+                               (concat consonant "\\(?:" virama consonant
+                                       "\\)*\\(?:" virama "\\|" vowel "*"
+                                       modifier-above "?" dependant-consonant 
"?\\)")
+                               1 'font-shape-gstring)
+                              (vector
+                               ;; Vowels based syllables
+                               (concat independent-vowel virama "?"
+                                       vowel "?" modifier-above "?" 
dependant-consonant "?")
+                               1 'font-shape-gstring))))
+
+;; Batak composition rules
+(let ((akshara              "[\x1BC0-\x1BE5]")
+      (vowel                "[\x1BE7-\x1BEF]")
+      (dependant-consonant  "[\x1BF0\x1BF1]")
+      (modifier-above       "\x1BE6")
+      (virama               "[\x1BF2\x1BF3]"))
+  (set-char-table-range composition-function-table
+                        '(#x1BE6 . #x1BF3)
+                        (list (vector
+                               ;; Akshara based syllables
+                               (concat akshara virama "?" vowel "*" 
modifier-above
+                                       "?" dependant-consonant "?")
+                               1 'font-shape-gstring))))
+
+;; Rejang composition rules
+(let ((akshara              "[\xA930-\xA946]")
+      (vowel                "[\xA947-\xA94E]")
+      (dependant-consonant  "[\xA94F\xA952]")
+      (virama               "\xA953"))
+  (set-char-table-range composition-function-table
+                        '(#xA947 . #xA953)
+                        (list (vector
+                               ;; Akshara based syllables
+                               (concat akshara virama "?" vowel "*"
+                                       dependant-consonant "?")
+                               1 'font-shape-gstring))))
+
+;; Makasar composition rules
+(let ((akshara              "[\x11EE0-\x11EF2]")
+      (vowel                "[\x11EF3-\x11EF6]"))
+  (set-char-table-range composition-function-table
+                        '(#x11EF3 . #x11EF6)
+                        (list (vector
+                               ;; Akshara based syllables
+                               (concat akshara vowel "*")
+                               1 'font-shape-gstring))))
+
+(provide 'indonesian)
+;;; indonesian.el ends here
diff --git a/lisp/language/misc-lang.el b/lisp/language/misc-lang.el
index c8a4821abf..1e915c2f83 100644
--- a/lisp/language/misc-lang.el
+++ b/lisp/language/misc-lang.el
@@ -1,5 +1,6 @@
 ;;; misc-lang.el --- support for miscellaneous languages (characters)  -*- 
lexical-binding: t; -*-
 
+;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
 ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
 ;;   2005, 2006, 2007, 2008, 2009, 2010, 2011
 ;;   National Institute of Advanced Industrial Science and Technology (AIST)
@@ -212,6 +213,59 @@ thin (i.e. 1-dot width) space."
    (list (vector "[\U00013000-\U0001342E]+"
                  0 #'font-shape-gstring))))
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Hanifi Rohingya
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(set-language-info-alist
+ "Hanifi Rohingya" '((charset unicode)
+                     (coding-system utf-8)
+                     (coding-priority utf-8)
+                     (input-method . "hanifi-rohingya")
+                     (sample-text . "Hanifi Rohingya (𐴌𐴟𐴇𐴥𐴝𐴚𐴒𐴙𐴝 𐴇𐴝𐴕𐴞𐴉𐴞 𐴓𐴠𐴑𐴤𐴝)  
𐴀𐴝𐴏𐴓𐴝𐴀𐴡𐴤𐴛𐴝𐴓𐴝𐴙𐴑𐴟𐴔")
+                     (documentation . "\
+Rohingya language and its script Hanifi Rohingya are supported
+in this language environment.")))
+
+;; Hanifi Rohingya composition rules
+(set-char-table-range
+ composition-function-table
+ '(#x10D1D . #x10D27)
+ (list (vector
+        "[\x10D00-\x10D27]+"
+        1 'font-shape-gstring)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Kharoṣṭhī
+;; Author: Stefan Baums <baums@gandhari.org>
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(set-language-info-alist
+ "Kharoshthi" '((charset unicode)
+               (coding-system utf-8)
+               (coding-priority utf-8)
+               (input-method . "kharoshthi")
+                (sample-text . "Kharoṣṭhī (𐨑𐨪𐨆𐨛𐨁)      𐨣𐨨𐨲𐨪𐨆 𐨐𐨪𐨅𐨨𐨁")
+               (documentation . "\
+Language environment for Gāndhārī, Sanskrit, and other languages
+using the Kharoṣṭhī script.")))
+
+(let ((consonant     "[\U00010A00\U00010A10-\U00010A35]")
+      (vowel         "[\U00010A01-\U00010A06]")
+      (virama        "\U00010A3F")
+      (modifier      "[\U00010A0C-\U00010A0F\U00010A38-\U00010A3A]"))
+  (set-char-table-range composition-function-table
+                       '(#x10A3F . #x10A3F)
+                        (list
+                         (vector
+                          (concat consonant
+                                  "\\(?:" virama consonant "\\)*"
+                                  modifier "*"
+                                  virama "?"
+                                  vowel "*"
+                                  modifier "*")
+                          1 'font-shape-gstring))))
+
 (provide 'misc-lang)
 
 ;;; misc-lang.el ends here
diff --git a/lisp/language/philippine.el b/lisp/language/philippine.el
new file mode 100644
index 0000000000..e52ad6912c
--- /dev/null
+++ b/lisp/language/philippine.el
@@ -0,0 +1,96 @@
+;;; philippine.el --- Philippine languages support  -*- coding: utf-8; 
lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Author: समीर सिंह Sameer Singh <lumarzeli30@gmail.com>
+;; Keywords: multilingual, input method, i18n, Philippines
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This file contains definitions of Philippine language environments, and
+;; setups for displaying the scripts used there.
+
+;;; Code:
+
+(set-language-info-alist
+ "Tagalog" '((charset unicode)
+             (coding-system utf-8)
+             (coding-priority utf-8)
+             (input-method . "tagalog")
+             (sample-text . "Tagalog (ᜊᜌ᜔ᜊᜌᜒᜈ᜔)        ᜃᜓᜋᜓᜐ᜔ᜆ")
+             (documentation . "\
+Tagalog language using the Baybayin script is supported in
+this language environment.")))
+
+(set-language-info-alist
+ "Hanunoo" '((charset unicode)
+             (coding-system utf-8)
+             (coding-priority utf-8)
+             (input-method . "hanunoo")
+             (sample-text . "Hanunoo (ᜱᜨᜳᜨᜳᜢ)  ᜫᜬᜧ᜴ ᜣᜭᜯᜥ᜴ ᜰᜲᜭᜥ᜴")
+             (documentation . "\
+Philippine Language Hanunoo is supported in this language environment.")))
+
+(set-language-info-alist
+ "Buhid" '((charset unicode)
+           (coding-system utf-8)
+           (coding-priority utf-8)
+           (input-method . "buhid")
+           (documentation . "\
+Philippine Language Buhid is supported in this language environment.")))
+
+(set-language-info-alist
+ "Tagbanwa" '((charset unicode)
+             (coding-system utf-8)
+             (coding-priority utf-8)
+             (input-method . "tagbanwa")
+             (sample-text . "Tagbanwa (ᝦᝪᝯ)    ᝫᝩᝬᝥ ᝣᝮᝧᝯ")
+             (documentation . "\
+Philippine Languages Tagbanwa are supported in this language environment.")))
+
+;; Tagalog composition rules
+(let ((akshara              "[\x1700-\x1711\x171F]")
+      (vowel                "[\x1712\x1713]")
+      (virama               "\x1714")
+      (pamudpod             "\x1715"))
+  (set-char-table-range composition-function-table
+                        '(#x1714 . #x1714)
+                        (list (vector
+                               ;; Akshara virama syllables
+                               (concat akshara virama vowel "?")
+                               1 'font-shape-gstring)))
+  (set-char-table-range composition-function-table
+                        '(#x1715 . #x1715)
+                        (list (vector
+                               ;; Akshara pamudpod syllables
+                               (concat akshara pamudpod vowel "?")
+                               1 'font-shape-gstring))))
+
+;; Hanunoo composition rules
+(let ((akshara              "[\x1720-\x1731]")
+      (vowel                "[\x1732\x1733]")
+      (pamudpod             "\x1734"))
+  (set-char-table-range composition-function-table
+                        '(#x1734 . #x1734)
+                        (list (vector
+                               ;; Akshara pamudpod syllables
+                               (concat akshara pamudpod vowel "?")
+                               1 'font-shape-gstring))))
+
+(provide 'philippine)
+;;; philippine.el ends here
diff --git a/lisp/language/thai-util.el b/lisp/language/thai-util.el
index d11daf0f83..6c004e9495 100644
--- a/lisp/language/thai-util.el
+++ b/lisp/language/thai-util.el
@@ -244,15 +244,13 @@ positions (integers or markers) specifying the region."
 ;; Thai-word-mode requires functions in the feature `thai-word'.
 (require 'thai-word)
 
-(defvar thai-word-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [remap forward-word] 'thai-forward-word)
-    (define-key map [remap backward-word] 'thai-backward-word)
-    (define-key map [remap kill-word] 'thai-kill-word)
-    (define-key map [remap backward-kill-word] 'thai-backward-kill-word)
-    (define-key map [remap transpose-words] 'thai-transpose-words)
-    map)
-  "Keymap for `thai-word-mode'.")
+(defvar-keymap thai-word-mode-map
+  :doc "Keymap for `thai-word-mode'."
+  "<remap> <forward-word>"       #'thai-forward-word
+  "<remap> <backward-word>"      #'thai-backward-word
+  "<remap> <kill-word>"          #'thai-kill-word
+  "<remap> <backward-kill-word>" #'thai-backward-kill-word
+  "<remap> <transpose-words>"    #'thai-transpose-words)
 
 (define-minor-mode thai-word-mode
   "Minor mode to make word-oriented commands aware of Thai words.
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index b79c6b2a08..f4e9d2732f 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -1,10 +1,17 @@
-;;; loaddefs.el --- automatically extracted autoloads  -*- lexical-binding: t 
-*-
-;; This file will be copied to ldefs-boot.el and checked in periodically.
-;;
+;;; loaddefs.el --- automatically extracted autoloads (do not edit)   -*- 
lexical-binding: t -*-
+;; Generated by the `loaddefs-generate' function.
+
+;; This file is part of GNU Emacs.
+
+;;; Commentary:
+
+;; This file will be copied to ldefs-boot.el and checked in
+;; periodically.
+
 ;;; Code:
 
+
 
-;;;### (autoloads nil "5x5" "play/5x5.el" (0 0 0 0))
 ;;; Generated autoloads from play/5x5.el
 
 (autoload '5x5 "5x5" "\
@@ -31,21 +38,16 @@ Rotate left Calc Solutions  \\[5x5-solve-rotate-left]
 Rotate right Calc Solutions \\[5x5-solve-rotate-right]
 Quit current game           \\[5x5-quit-game]
 
-\(fn &optional SIZE)" t nil)
-
+(fn &optional SIZE)" t nil)
 (autoload '5x5-crack-randomly "5x5" "\
 Attempt to crack 5x5 using random solutions." t nil)
-
 (autoload '5x5-crack-mutating-current "5x5" "\
 Attempt to crack 5x5 by mutating the current solution." t nil)
-
 (autoload '5x5-crack-mutating-best "5x5" "\
 Attempt to crack 5x5 by mutating the best solution." t nil)
-
 (autoload '5x5-crack-xor-mutate "5x5" "\
 Attempt to crack 5x5 by xoring the current and best solution.
 Mutate the result." t nil)
-
 (autoload '5x5-crack "5x5" "\
 Attempt to find a solution for 5x5.
 
@@ -54,50 +56,39 @@ two parameters, the first will be a grid vector array that 
is the current
 solution and the second will be the best solution so far.  The function
 should return a grid vector array that is the new solution.
 
-\(fn BREEDER)" t nil)
-
+(fn BREEDER)" t nil)
 (register-definition-prefixes "5x5" '("5x5-"))
 
-;;;***
 
-;;;### (autoloads nil "add-log" "vc/add-log.el" (0 0 0 0))
 ;;; Generated autoloads from vc/add-log.el
 
 (put 'change-log-default-name 'safe-local-variable #'string-or-null-p)
-
 (defvar add-log-current-defun-function nil "\
 If non-nil, function to guess name of surrounding function.
 It is called by `add-log-current-defun' with no argument, and
 should return the function's name as a string, or nil if point is
 outside a function.")
-
 (custom-autoload 'add-log-current-defun-function "add-log" t)
-
 (defvar add-log-full-name nil "\
 Full name of user, for inclusion in ChangeLog daily headers.
 This defaults to the value returned by the function `user-full-name'.")
-
 (custom-autoload 'add-log-full-name "add-log" t)
-
 (defvar add-log-mailing-address nil "\
 Email addresses of user, for inclusion in ChangeLog headers.
 This defaults to the value of `user-mail-address'.  In addition to
 being a simple string, this value can also be a list.  All elements
 will be recognized as referring to the same user; when creating a new
 ChangeLog entry, one element will be chosen at random.")
-
 (custom-autoload 'add-log-mailing-address "add-log" t)
-
 (autoload 'prompt-for-change-log-name "add-log" "\
 Prompt for a change log name." nil nil)
-
 (autoload 'find-change-log "add-log" "\
 Find a change log file for \\[add-change-log-entry] and return the name.
 
 Optional arg FILE-NAME specifies the file to use.
 If FILE-NAME is nil, use the value of `change-log-default-name'.
 If `change-log-default-name' is nil, behave as though it were \"ChangeLog\"
-\(or whatever we use on this operating system).
+(or whatever we use on this operating system).
 
 If `change-log-default-name' contains a leading directory component, then
 simply find it in the current directory.  Otherwise, search in the current
@@ -111,8 +102,7 @@ Once a file is found, `change-log-default-name' is set 
locally in the
 current buffer to the complete file name.
 Optional arg BUFFER-FILE overrides `buffer-file-name'.
 
-\(fn &optional FILE-NAME BUFFER-FILE)" nil nil)
-
+(fn &optional FILE-NAME BUFFER-FILE)" nil nil)
 (autoload 'add-change-log-entry "add-log" "\
 Find ChangeLog buffer, add an entry for today and an item for this file.
 Optional arg WHOAMI (interactive prefix) non-nil means prompt for
@@ -148,15 +138,13 @@ notices.
 Today's date is calculated according to `add-log-time-zone-rule' if
 non-nil, otherwise in local time.
 
-\(fn &optional WHOAMI CHANGELOG-FILE-NAME OTHER-WINDOW NEW-ENTRY 
PUT-NEW-ENTRY-ON-NEW-LINE)" t nil)
-
+(fn &optional WHOAMI CHANGELOG-FILE-NAME OTHER-WINDOW NEW-ENTRY 
PUT-NEW-ENTRY-ON-NEW-LINE)" t nil)
 (autoload 'add-change-log-entry-other-window "add-log" "\
 Find change log file in other window and add entry and item.
 This is just like `add-change-log-entry' except that it displays
 the change log file in another window.
 
-\(fn &optional WHOAMI FILE-NAME)" t nil)
-
+(fn &optional WHOAMI FILE-NAME)" t nil)
 (autoload 'change-log-mode "add-log" "\
 Major mode for editing change logs; like Indented Text mode.
 Prevents numeric backups and sets `left-margin' to 8 and `fill-column' to 74.
@@ -166,8 +154,7 @@ Runs `change-log-mode-hook'.
 
 \\{change-log-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'add-log-current-defun "add-log" "\
 Return name of function definition point is in, or nil.
 
@@ -181,7 +168,6 @@ identifiers followed by `:' or `='.  See variables
 `add-log-current-defun-function'.
 
 Has a preference of looking backwards." nil nil)
-
 (autoload 'change-log-merge "add-log" "\
 Merge the contents of change log file OTHER-LOG with this buffer.
 Both must be found in Change Log mode (since the merging depends on
@@ -191,13 +177,10 @@ or a buffer.
 Entries are inserted in chronological order.  Both the current and
 old-style time formats for entries are supported.
 
-\(fn OTHER-LOG)" t nil)
-
+(fn OTHER-LOG)" t nil)
 (register-definition-prefixes "add-log" '("add-log-" "change-log-"))
 
-;;;***
 
-;;;### (autoloads nil "advice" "emacs-lisp/advice.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/advice.el
 
 (defvar ad-redefinition-action 'warn "\
@@ -210,9 +193,7 @@ old original, or keep it and raise an error.  The values 
`accept', `discard',
 `error' or `warn' govern what will be done.  `warn' is just like `accept' but
 it additionally prints a warning message.  All other values will be
 interpreted as `error'.")
-
 (custom-autoload 'ad-redefinition-action "advice" t)
-
 (defvar ad-default-compilation-action 'maybe "\
 Defines whether to compile advised definitions during activation.
 A value of `always' will result in unconditional compilation, `never' will
@@ -221,19 +202,15 @@ loaded, and `like-original' will compile if the original 
definition of the
 advised function is compiled or a built-in function.  Every other value will
 be interpreted as `maybe'.  This variable will only be considered if the
 COMPILE argument of `ad-activate' was supplied as nil.")
-
 (custom-autoload 'ad-default-compilation-action "advice" t)
-
 (autoload 'ad-enable-advice "advice" "\
 Enables the advice of FUNCTION with CLASS and NAME.
 
-\(fn FUNCTION CLASS NAME)" t nil)
-
+(fn FUNCTION CLASS NAME)" t nil)
 (autoload 'ad-disable-advice "advice" "\
 Disable the advice of FUNCTION with CLASS and NAME.
 
-\(fn FUNCTION CLASS NAME)" t nil)
-
+(fn FUNCTION CLASS NAME)" t nil)
 (autoload 'ad-add-advice "advice" "\
 Add a piece of ADVICE to FUNCTION's list of advices in CLASS.
 
@@ -257,8 +234,7 @@ If FUNCTION was not advised already, its advice info will be
 initialized.  Redefining a piece of advice whose name is part of
 the cache-id will clear the cache.
 
-\(fn FUNCTION ADVICE CLASS POSITION)" nil nil)
-
+(fn FUNCTION ADVICE CLASS POSITION)" nil nil)
 (autoload 'ad-activate "advice" "\
 Activate all the advice information of an advised FUNCTION.
 If FUNCTION has a proper original definition then an advised
@@ -276,8 +252,7 @@ an advised function that has actual pieces of advice but 
none of them are
 enabled is equivalent to a call to `ad-deactivate'.  The current advised
 definition will always be cached for later usage.
 
-\(fn FUNCTION &optional COMPILE)" t nil)
-
+(fn FUNCTION &optional COMPILE)" t nil)
 (autoload 'defadvice "advice" "\
 Define a piece of advice for FUNCTION (a symbol).
 The syntax of `defadvice' is as follows:
@@ -324,17 +299,12 @@ usage: (defadvice FUNCTION (CLASS NAME [POSITION] 
[ARGLIST] FLAG...)
           [DOCSTRING] [INTERACTIVE-FORM]
           BODY...)
 
-\(fn FUNCTION ARGS &rest BODY)" nil t)
-
+(fn FUNCTION ARGS &rest BODY)" nil t)
 (function-put 'defadvice 'doc-string-elt '3)
-
 (function-put 'defadvice 'lisp-indent-function '2)
-
 (register-definition-prefixes "advice" '("ad-"))
 
-;;;***
 
-;;;### (autoloads nil "align" "align.el" (0 0 0 0))
 ;;; Generated autoloads from align.el
 
 (autoload 'align "align" "\
@@ -365,8 +335,7 @@ default rule lists defined in `align-rules-list' and
 `align-exclude-rules-list'.  See `align-rules-list' for more details
 on the format of these lists.
 
-\(fn BEG END &optional SEPARATE RULES EXCLUDE-RULES)" t nil)
-
+(fn BEG END &optional SEPARATE RULES EXCLUDE-RULES)" t nil)
 (autoload 'align-regexp "align" "\
 Align the current region using an ad-hoc rule read from the minibuffer.
 BEG and END mark the limits of the region.  Interactively, this function
@@ -409,8 +378,7 @@ The non-interactive form of the previous example would look 
something like:
 This function is a nothing more than a small wrapper that helps you
 construct a rule to pass to `align-region', which does the real work.
 
-\(fn BEG END REGEXP &optional GROUP SPACING REPEAT)" t nil)
-
+(fn BEG END REGEXP &optional GROUP SPACING REPEAT)" t nil)
 (autoload 'align-entire "align" "\
 Align the selected region as if it were one alignment section.
 BEG and END mark the extent of the region.  If RULES or EXCLUDE-RULES
@@ -418,8 +386,7 @@ is set to a list of rules (see `align-rules-list'), it can 
be used to
 override the default alignment rules that would have been used to
 align that section.
 
-\(fn BEG END &optional RULES EXCLUDE-RULES)" t nil)
-
+(fn BEG END &optional RULES EXCLUDE-RULES)" t nil)
 (autoload 'align-current "align" "\
 Call `align' on the current alignment section.
 This function assumes you want to align only the current section, and
@@ -428,8 +395,7 @@ EXCLUDE-RULES is set to a list of rules (see 
`align-rules-list'), it
 can be used to override the default alignment rules that would have
 been used to align that section.
 
-\(fn &optional RULES EXCLUDE-RULES)" t nil)
-
+(fn &optional RULES EXCLUDE-RULES)" t nil)
 (autoload 'align-highlight-rule "align" "\
 Highlight the whitespace which a given rule would have modified.
 BEG and END mark the extent of the region.  TITLE identifies the rule
@@ -438,31 +404,25 @@ list of rules (see `align-rules-list'), it can be used to 
override the
 default alignment rules that would have been used to identify the text
 to be colored.
 
-\(fn BEG END TITLE &optional RULES EXCLUDE-RULES)" t nil)
-
+(fn BEG END TITLE &optional RULES EXCLUDE-RULES)" t nil)
 (autoload 'align-unhighlight-rule "align" "\
 Remove any highlighting that was added by `align-highlight-rule'." t nil)
-
 (autoload 'align-newline-and-indent "align" "\
 A replacement function for `newline-and-indent', aligning as it goes.
 The alignment is done by calling `align' on the region that was
 indented." t nil)
-
 (register-definition-prefixes "align" '("align-"))
 
-;;;***
 
-;;;### (autoloads nil "allout" "allout.el" (0 0 0 0))
 ;;; Generated autoloads from allout.el
-(push (purecopy '(allout 2 3)) package--builtin-versions)
 
+(push (purecopy '(allout 2 3)) package--builtin-versions)
 (autoload 'allout-auto-activation-helper "allout" "\
 Institute `allout-auto-activation'.
 
 Intended to be used as the `allout-auto-activation' :set function.
 
-\(fn VAR VALUE)" nil nil)
-
+(fn VAR VALUE)" nil nil)
 (autoload 'allout-setup "allout" "\
 Do fundamental Emacs session for allout auto-activation.
 
@@ -471,7 +431,6 @@ Establishes allout processing as part of visiting a file if
 
 The proper way to use this is through customizing the setting of
 `allout-auto-activation'." nil nil)
-
 (defvar allout-auto-activation nil "\
 Configure allout outline mode auto-activation.
 
@@ -490,40 +449,23 @@ With value \"activate\", only auto-mode-activation is 
enabled.
 Auto-layout is not.
 
 With value nil, inhibit any automatic allout-mode activation.")
-
 (custom-autoload 'allout-auto-activation "allout" nil)
-
 (put 'allout-use-hanging-indents 'safe-local-variable #'booleanp)
-
 (put 'allout-reindent-bodies 'safe-local-variable (lambda (x) (memq x '(nil t 
text force))))
-
 (put 'allout-show-bodies 'safe-local-variable #'booleanp)
-
 (put 'allout-header-prefix 'safe-local-variable #'stringp)
-
 (put 'allout-primary-bullet 'safe-local-variable #'stringp)
-
 (put 'allout-plain-bullets-string 'safe-local-variable #'stringp)
-
 (put 'allout-distinctive-bullets-string 'safe-local-variable #'stringp)
-
 (put 'allout-use-mode-specific-leader 'safe-local-variable (lambda (x) (or 
(memq x '(t nil allout-mode-leaders comment-start)) (stringp x))))
-
 (put 'allout-old-style-prefixes 'safe-local-variable #'booleanp)
-
 (put 'allout-stylish-prefixes 'safe-local-variable #'booleanp)
-
 (put 'allout-numbered-bullet 'safe-local-variable #'string-or-null-p)
-
 (put 'allout-file-xref-bullet 'safe-local-variable #'string-or-null-p)
-
 (put 'allout-presentation-padding 'safe-local-variable #'integerp)
-
 (put 'allout-layout 'safe-local-variable (lambda (x) (or (numberp x) (listp x) 
(memq x '(: * + -)))))
-
 (autoload 'allout-mode-p "allout" "\
 Return t if `allout-mode' is active in current buffer." nil t)
-
 (autoload 'allout-mode "allout" "\
 Toggle Allout outline mode.
 
@@ -674,7 +616,7 @@ When the text cursor is positioned directly on the bullet 
character of
 a topic, regular characters (a to z) invoke the commands of the
 corresponding allout-mode keymap control chars.  For example, \"f\"
 would invoke the command typically bound to \"C-c<space>C-f\"
-\(\\[allout-forward-current-level] `allout-forward-current-level').
+(\\[allout-forward-current-level] `allout-forward-current-level').
 
 Thus, by positioning the cursor on a topic bullet, you can
 execute the outline navigation and manipulation commands with a
@@ -687,7 +629,7 @@ replaced with one that makes it easy to get to the 
hot-spot.  If you
 repeat it immediately it cycles (if `allout-beginning-of-line-cycles'
 is set) to the beginning of the item and then, if you hit it again
 immediately, to the hot-spot.  Similarly, `allout-beginning-of-current-entry'
-\(\\[allout-beginning-of-current-entry]) moves to the hot-spot when the cursor 
is already located
+(\\[allout-beginning-of-current-entry]) moves to the hot-spot when the cursor 
is already located
 at the beginning of the current entry.
 
                              Extending Allout
@@ -801,34 +743,27 @@ evaluate `allout-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defalias 'outlinify-sticky #'outlineify-sticky)
-
 (autoload 'outlineify-sticky "allout" "\
 Activate outline mode and establish file var so it is started subsequently.
 
 See `allout-layout' and customization of `allout-auto-activation'
 for details on preparing Emacs for automatic allout activation.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "allout" '("allout-"))
 
-;;;***
 
-;;;### (autoloads nil "allout-widgets" "allout-widgets.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from allout-widgets.el
-(push (purecopy '(allout-widgets 1 0)) package--builtin-versions)
 
+(push (purecopy '(allout-widgets 1 0)) package--builtin-versions)
 (autoload 'allout-widgets-setup "allout-widgets" "\
 Commission or decommission allout-widgets-mode along with allout-mode.
 
 Meant to be used by customization of `allout-widgets-auto-activation'.
 
-\(fn VARNAME VALUE)" nil nil)
-
+(fn VARNAME VALUE)" nil nil)
 (defvar allout-widgets-auto-activation nil "\
 Activate to enable allout icon graphics wherever allout mode is active.
 
@@ -843,11 +778,8 @@ explicitly invoke `allout-widgets-mode' in allout buffers 
where
 you want allout widgets operation.
 
 See `allout-widgets-mode' for allout widgets mode features.")
-
 (custom-autoload 'allout-widgets-auto-activation "allout-widgets" nil)
-
 (put 'allout-widgets-mode-inhibit 'safe-local-variable #'booleanp)
-
 (autoload 'allout-widgets-mode "allout-widgets" "\
 Toggle Allout Widgets mode.
 
@@ -883,17 +815,18 @@ evaluate `allout-widgets-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "allout-widgets" '("allout-"))
 
-;;;***
 
-;;;### (autoloads nil "ange-ftp" "net/ange-ftp.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/analyze.el
+
+(register-definition-prefixes "semantic/analyze" '("semantic-a"))
+
+
 ;;; Generated autoloads from net/ange-ftp.el
 
 (defalias 'ange-ftp-re-read-dir 'ange-ftp-reread-dir)
-
 (autoload 'ange-ftp-reread-dir "ange-ftp" "\
 Reread remote directory DIR to update the directory cache.
 The implementation of remote FTP file names caches directory contents
@@ -901,18 +834,14 @@ for speed.  Therefore, when new remote files are created, 
Emacs
 may not know they exist.  You can use this command to reread a specific
 directory, so that Emacs will know its current contents.
 
-\(fn &optional DIR)" t nil)
-
+(fn &optional DIR)" t nil)
 (autoload 'ange-ftp-hook-function "ange-ftp" "\
 
 
-\(fn OPERATION &rest ARGS)" nil nil)
-
+(fn OPERATION &rest ARGS)" nil nil)
 (register-definition-prefixes "ange-ftp" '("ange-ftp-" "ftp-error" 
"internal-ange-ftp-mode"))
 
-;;;***
 
-;;;### (autoloads nil "animate" "play/animate.el" (0 0 0 0))
 ;;; Generated autoloads from play/animate.el
 
 (autoload 'animate-string "animate" "\
@@ -923,8 +852,7 @@ passing through `animate-n-steps' positions before the 
final ones.
 If HPOS is nil (or omitted), center the string horizontally
 in the current window.
 
-\(fn STRING VPOS &optional HPOS)" nil nil)
-
+(fn STRING VPOS &optional HPOS)" nil nil)
 (autoload 'animate-sequence "animate" "\
 Display animation strings from LIST-OF-STRING with buffer *Animation*.
 Strings will be separated from each other by SPACE lines.
@@ -932,27 +860,22 @@ Strings will be separated from each other by SPACE lines.
 animation in the buffer named by variable's value, creating the
 buffer if one does not exist.
 
-\(fn LIST-OF-STRINGS SPACE)" nil nil)
-
+(fn LIST-OF-STRINGS SPACE)" nil nil)
 (autoload 'animate-birthday-present "animate" "\
 Return a birthday present in the buffer *Birthday-Present*.
 When optional arg NAME is non-nil or called-interactively, prompt for
 NAME of birthday present receiver and return a birthday present in
 the buffer *Birthday-Present-for-Name*.
 
-\(fn &optional NAME)" t nil)
-
+(fn &optional NAME)" t nil)
 (register-definition-prefixes "animate" '("animat"))
 
-;;;***
 
-;;;### (autoloads nil "ansi-color" "ansi-color.el" (0 0 0 0))
 ;;; Generated autoloads from ansi-color.el
-(push (purecopy '(ansi-color 3 4 2)) package--builtin-versions)
 
+(push (purecopy '(ansi-color 3 4 2)) package--builtin-versions)
 (autoload 'ansi-color-for-comint-mode-on "ansi-color" "\
 Set `ansi-color-for-comint-mode' to t." t nil)
-
 (autoload 'ansi-color-process-output "ansi-color" "\
 Maybe translate SGR control sequences of comint output into text properties.
 
@@ -966,22 +889,17 @@ The comint output is assumed to lie between the marker
 
 This is a good function to put in `comint-output-filter-functions'.
 
-\(fn IGNORED)" nil nil)
-
+(fn IGNORED)" nil nil)
 (autoload 'ansi-color-compilation-filter "ansi-color" "\
 Maybe translate SGR control sequences into text properties.
 This function depends on the `ansi-color-for-compilation-mode'
 variable, and is meant to be used in `compilation-filter-hook'." nil nil)
-
 (register-definition-prefixes "ansi-color" '("ansi-color-"))
 
-;;;***
 
-;;;### (autoloads nil "antlr-mode" "progmodes/antlr-mode.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from progmodes/antlr-mode.el
-(push (purecopy '(antlr-mode 2 2 3)) package--builtin-versions)
 
+(push (purecopy '(antlr-mode 2 2 3)) package--builtin-versions)
 (autoload 'antlr-show-makefile-rules "antlr-mode" "\
 Show Makefile rules for all grammar files in the current directory.
 If the `major-mode' of the current buffer has the value `makefile-mode',
@@ -998,21 +916,16 @@ If the file for a super-grammar cannot be determined, 
special file names
 are used according to variable `antlr-unknown-file-formats' and a
 commentary with value `antlr-help-unknown-file-text' is added.  The
 *Help* buffer always starts with the text in `antlr-help-rules-intro'." t nil)
-
 (autoload 'antlr-mode "antlr-mode" "\
 Major mode for editing ANTLR grammar files.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'antlr-set-tabs "antlr-mode" "\
 Use ANTLR's convention for TABs according to `antlr-tab-offset-alist'.
 Used in `antlr-mode'.  Also a useful function in `java-mode-hook'." nil nil)
-
 (register-definition-prefixes "antlr-mode" '("antlr-"))
 
-;;;***
 
-;;;### (autoloads nil "appt" "calendar/appt.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/appt.el
 
 (autoload 'appt-add "appt" "\
@@ -1022,20 +935,16 @@ Optional argument WARNTIME is an integer (or string) 
giving the number
 of minutes before the appointment at which to start warning.
 The default is `appt-message-warning-time'.
 
-\(fn TIME MSG &optional WARNTIME)" t nil)
-
+(fn TIME MSG &optional WARNTIME)" t nil)
 (autoload 'appt-activate "appt" "\
 Toggle checking of appointments.
 With optional numeric argument ARG, turn appointment checking on if
 ARG is positive, otherwise off.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "appt" '("appt-"))
 
-;;;***
 
-;;;### (autoloads nil "apropos" "apropos.el" (0 0 0 0))
 ;;; Generated autoloads from apropos.el
 
 (autoload 'apropos-read-pattern "apropos" "\
@@ -1046,8 +955,7 @@ literally, or a string which is used as a regexp to search 
for.
 SUBJECT is a string that is included in the prompt to identify what
 kind of objects to search.
 
-\(fn SUBJECT)" nil nil)
-
+(fn SUBJECT)" nil nil)
 (autoload 'apropos-user-option "apropos" "\
 Show user options that match PATTERN.
 PATTERN can be a word, a list of words (separated by spaces),
@@ -1058,16 +966,14 @@ search for matches for any two (or more) of those words.
 With \\[universal-argument] prefix, or if `apropos-do-all' is non-nil, also 
show
 variables, not just user options.
 
-\(fn PATTERN &optional DO-ALL)" t nil)
-
+(fn PATTERN &optional DO-ALL)" t nil)
 (autoload 'apropos-variable "apropos" "\
 Show variables that match PATTERN.
 With the optional argument DO-NOT-ALL non-nil (or when called
 interactively with the prefix \\[universal-argument]), show user
 options only, i.e. behave like `apropos-user-option'.
 
-\(fn PATTERN &optional DO-NOT-ALL)" t nil)
-
+(fn PATTERN &optional DO-NOT-ALL)" t nil)
 (autoload 'apropos-local-variable "apropos" "\
 Show buffer-local variables that match PATTERN.
 Optional arg BUFFER (default: current buffer) is the buffer to check.
@@ -1075,8 +981,7 @@ Optional arg BUFFER (default: current buffer) is the 
buffer to check.
 The output includes variables that are not yet set in BUFFER, but that
 will be buffer-local when set.
 
-\(fn PATTERN &optional BUFFER)" t nil)
-
+(fn PATTERN &optional BUFFER)" t nil)
 (autoload 'apropos-function "apropos" "\
 Show functions that match PATTERN.
 
@@ -1088,10 +993,8 @@ search for matches for any two (or more) of those words.
 This is the same as running `apropos-command' with a \\[universal-argument] 
prefix,
 or a non-nil `apropos-do-all' argument.
 
-\(fn PATTERN)" t nil)
-
+(fn PATTERN)" t nil)
 (defalias 'command-apropos #'apropos-command)
-
 (autoload 'apropos-command "apropos" "\
 Show commands (interactively callable functions) that match PATTERN.
 PATTERN can be a word, a list of words (separated by spaces),
@@ -1108,13 +1011,11 @@ satisfy the predicate VAR-PREDICATE.
 When called from a Lisp program, a string PATTERN is used as a regexp,
 while a list of strings is used as a word list.
 
-\(fn PATTERN &optional DO-ALL VAR-PREDICATE)" t nil)
-
+(fn PATTERN &optional DO-ALL VAR-PREDICATE)" t nil)
 (autoload 'apropos-documentation-property "apropos" "\
 Like (documentation-property SYMBOL PROPERTY RAW) but handle errors.
 
-\(fn SYMBOL PROPERTY RAW)" nil nil)
-
+(fn SYMBOL PROPERTY RAW)" nil nil)
 (autoload 'apropos "apropos" "\
 Show all meaningful Lisp symbols whose names match PATTERN.
 Symbols are shown if they are defined as functions, variables, or
@@ -1133,16 +1034,14 @@ Return list of symbols and documentation found.
 The *Apropos* window will be selected if `help-window-select' is
 non-nil.
 
-\(fn PATTERN &optional DO-ALL)" t nil)
-
+(fn PATTERN &optional DO-ALL)" t nil)
 (autoload 'apropos-library "apropos" "\
 List the variables and functions defined by library FILE.
 FILE should be one of the libraries currently loaded and should
 thus be found in `load-history'.  If `apropos-do-all' is non-nil,
 the output includes key-bindings of commands.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'apropos-value "apropos" "\
 Show all symbols whose value's printed representation matches PATTERN.
 PATTERN can be a word, a list of words (separated by spaces),
@@ -1156,15 +1055,13 @@ names and values of properties.
 
 Returns list of symbols and values found.
 
-\(fn PATTERN &optional DO-ALL)" t nil)
-
+(fn PATTERN &optional DO-ALL)" t nil)
 (autoload 'apropos-local-value "apropos" "\
 Show buffer-local variables whose values match PATTERN.
 This is like `apropos-value', but only for buffer-local variables.
 Optional arg BUFFER (default: current buffer) is the buffer to check.
 
-\(fn PATTERN &optional BUFFER)" t nil)
-
+(fn PATTERN &optional BUFFER)" t nil)
 (autoload 'apropos-documentation "apropos" "\
 Show symbols whose documentation contains matches for PATTERN.
 PATTERN can be a word, a list of words (separated by spaces),
@@ -1179,13 +1076,10 @@ documentation strings.
 
 Returns list of symbols and documentation found.
 
-\(fn PATTERN &optional DO-ALL)" t nil)
-
+(fn PATTERN &optional DO-ALL)" t nil)
 (register-definition-prefixes "apropos" '("apropos-"))
 
-;;;***
 
-;;;### (autoloads nil "arc-mode" "arc-mode.el" (0 0 0 0))
 ;;; Generated autoloads from arc-mode.el
 
 (autoload 'archive-mode "arc-mode" "\
@@ -1201,13 +1095,15 @@ archive.
 
 \\{archive-mode-map}
 
-\(fn &optional FORCE)" nil nil)
-
+(fn &optional FORCE)" nil nil)
 (register-definition-prefixes "arc-mode" '("arc"))
 
-;;;***
 
-;;;### (autoloads nil "array" "array.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/args.el
+
+(register-definition-prefixes "srecode/args" '("srecode-"))
+
+
 ;;; Generated autoloads from array.el
 
 (autoload 'array-mode "array" "\
@@ -1277,13 +1173,10 @@ take a numeric prefix argument):
 
 Entering array mode calls the function `array-mode-hook'.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "array" '("array-" "current-line" "limit-index" 
"move-to-column-untabify" "untabify-backward"))
 
-;;;***
 
-;;;### (autoloads nil "artist" "textmodes/artist.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/artist.el
 
 (autoload 'artist-mode "artist" "\
@@ -1498,13 +1391,10 @@ evaluate `artist-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "artist" '("artist-"))
 
-;;;***
 
-;;;### (autoloads nil "asm-mode" "progmodes/asm-mode.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/asm-mode.el
 
 (autoload 'asm-mode "asm-mode" "\
@@ -1527,21 +1417,16 @@ Turning on Asm mode runs the hook `asm-mode-hook' at 
the end of initialization.
 Special commands:
 \\{asm-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "asm-mode" '("asm-"))
 
-;;;***
 
-;;;### (autoloads nil "auth-source" "auth-source.el" (0 0 0 0))
 ;;; Generated autoloads from auth-source.el
 
 (defvar auth-source-cache-expiry 7200 "\
 How many seconds passwords are cached, or nil to disable expiring.
 Overrides `password-cache-expiry' through a let-binding.")
-
 (custom-autoload 'auth-source-cache-expiry "auth-source" t)
-
 (autoload 'authinfo-mode "auth-source" "\
 Mode for editing .authinfo/.netrc files.
 
@@ -1551,20 +1436,15 @@ point is moved into the passwords (see 
`authinfo-hide-elements').
 
 \\{authinfo-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "auth-source" '("auth"))
 
-;;;***
 
-;;;### (autoloads nil "auth-source-pass" "auth-source-pass.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from auth-source-pass.el
-(push (purecopy '(auth-source-pass 5 0 0)) package--builtin-versions)
 
+(push (purecopy '(auth-source-pass 5 0 0)) package--builtin-versions)
 (autoload 'auth-source-pass-enable "auth-source-pass" "\
 Enable auth-source-password-store." nil nil)
-
 (autoload 'auth-source-pass-get "auth-source-pass" "\
 Return the value associated to KEY in the password-store entry ENTRY.
 
@@ -1578,40 +1458,41 @@ secret
 key1: value1
 key2: value2
 
-\(fn KEY ENTRY)" nil nil)
-
+(fn KEY ENTRY)" nil nil)
 (register-definition-prefixes "auth-source-pass" '("auth-source-pass-"))
 
-;;;***
 
-;;;### (autoloads nil "autoconf" "progmodes/autoconf.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/auto.el
+
+(register-definition-prefixes "ede/auto" '("ede-"))
+
+
 ;;; Generated autoloads from progmodes/autoconf.el
 
 (autoload 'autoconf-mode "autoconf" "\
 Major mode for editing Autoconf configure.ac files.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "autoconf" '("autoconf-"))
 
-;;;***
 
-;;;### (autoloads nil "autoinsert" "autoinsert.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/autoconf-edit.el
+
+(register-definition-prefixes "ede/autoconf-edit" '("autoconf-"))
+
+
 ;;; Generated autoloads from autoinsert.el
 
 (autoload 'auto-insert "autoinsert" "\
 Insert default contents into new files if variable `auto-insert' is non-nil.
 Matches the visited file name against the elements of `auto-insert-alist'." t 
nil)
-
 (autoload 'define-auto-insert "autoinsert" "\
 Associate CONDITION with (additional) ACTION in `auto-insert-alist'.
 Optional AFTER means to insert action after all existing actions for CONDITION,
 or if CONDITION had no actions, after all other CONDITIONs.
 
-\(fn CONDITION ACTION &optional AFTER)" nil nil)
-
+(fn CONDITION ACTION &optional AFTER)" nil nil)
 (function-put 'define-auto-insert 'lisp-indent-function 'defun)
-
 (defvar auto-insert-mode nil "\
 Non-nil if Auto-Insert mode is enabled.
 See the `auto-insert-mode' command
@@ -1619,9 +1500,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `auto-insert-mode'.")
-
 (custom-autoload 'auto-insert-mode "autoinsert" nil)
-
 (autoload 'auto-insert-mode "autoinsert" "\
 Toggle Auto-insert mode, a global minor mode.
 
@@ -1642,22 +1521,13 @@ evaluate `(default-value \\='auto-insert-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "autoinsert" '("auto-insert"))
 
-;;;***
 
-;;;### (autoloads nil "autoload" "emacs-lisp/autoload.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from emacs-lisp/autoload.el
 
-(put 'generated-autoload-file 'safe-local-variable 'stringp)
-
-(put 'generated-autoload-load-name 'safe-local-variable 'stringp)
-
 (put 'autoload-ensure-writable 'risky-local-variable t)
-
 (autoload 'update-file-autoloads "autoload" "\
 Update the autoloads for FILE.
 If prefix arg SAVE-AFTER is non-nil, save the buffer too.
@@ -1670,8 +1540,7 @@ existing value of `generated-autoload-file'.
 
 Return FILE if there was no autoload cookie in it, else nil.
 
-\(fn FILE &optional SAVE-AFTER OUTFILE)" t nil)
-
+(fn FILE &optional SAVE-AFTER OUTFILE)" t nil)
 (autoload 'update-directory-autoloads "autoload" "\
 Update autoload definitions for Lisp files in the directories DIRS.
 In an interactive call, you must give one argument, the name of a
@@ -1687,10 +1556,8 @@ value of `generated-autoload-file'.  If any Lisp file 
binds
 `generated-autoload-file' as a file-local variable, write its
 autoloads into the specified file instead.
 
-\(fn &rest DIRS)" t nil)
-
+(fn &rest DIRS)" t nil)
 (make-obsolete 'update-directory-autoloads 'make-directory-autoloads '"28.1")
-
 (autoload 'make-directory-autoloads "autoload" "\
 Update autoload definitions for Lisp files in the directories DIRS.
 DIR can be either a single directory or a list of
@@ -1703,19 +1570,15 @@ its autoloads into the specified file instead.
 The function does NOT recursively descend into subdirectories of the
 directory or directories specified.
 
-\(fn DIR OUTPUT-FILE)" t nil)
-
+(fn DIR OUTPUT-FILE)" t nil)
 (autoload 'batch-update-autoloads "autoload" "\
 Update loaddefs.el autoloads in batch mode.
 Calls `update-directory-autoloads' on the command line arguments.
 Definitions are written to `generated-autoload-file' (which
 should be non-nil)." nil nil)
+(register-definition-prefixes "autoload" '("autoload-" 
"batch-update-autoloads--summary" "generate-" "make-autoload" 
"no-update-autoloads"))
 
-(register-definition-prefixes "autoload" '("autoload-" 
"batch-update-autoloads--summary" "generate" "make-autoload" 
"no-update-autoloads"))
-
-;;;***
 
-;;;### (autoloads nil "autorevert" "autorevert.el" (0 0 0 0))
 ;;; Generated autoloads from autorevert.el
 
 (autoload 'auto-revert-mode "autorevert" "\
@@ -1750,14 +1613,12 @@ evaluate `auto-revert-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'turn-on-auto-revert-mode "autorevert" "\
 Turn on Auto-Revert Mode.
 
 This function is designed to be added to hooks, for example:
   (add-hook \\='c-mode-hook #\\='turn-on-auto-revert-mode)" nil nil)
-
 (autoload 'auto-revert-tail-mode "autorevert" "\
 Toggle reverting tail of buffer when the file grows.
 
@@ -1791,14 +1652,12 @@ evaluate `auto-revert-tail-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'turn-on-auto-revert-tail-mode "autorevert" "\
 Turn on Auto-Revert Tail Mode.
 
 This function is designed to be added to hooks, for example:
   (add-hook \\='my-logfile-mode-hook #\\='turn-on-auto-revert-tail-mode)" nil 
nil)
-
 (defvar global-auto-revert-mode nil "\
 Non-nil if Global Auto-Revert mode is enabled.
 See the `global-auto-revert-mode' command
@@ -1806,9 +1665,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-auto-revert-mode'.")
-
 (custom-autoload 'global-auto-revert-mode "autorevert" nil)
-
 (autoload 'global-auto-revert-mode "autorevert" "\
 Toggle Global Auto-Revert Mode.
 
@@ -1844,21 +1701,15 @@ evaluate `(default-value \\='global-auto-revert-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "autorevert" '("auto-revert-" 
"global-auto-revert-"))
 
-;;;***
 
-;;;### (autoloads nil "avl-tree" "emacs-lisp/avl-tree.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from emacs-lisp/avl-tree.el
 
 (register-definition-prefixes "avl-tree" '("avl-tree-"))
 
-;;;***
 
-;;;### (autoloads nil "avoid" "avoid.el" (0 0 0 0))
 ;;; Generated autoloads from avoid.el
 
 (defvar mouse-avoidance-mode nil "\
@@ -1866,9 +1717,7 @@ Activate Mouse Avoidance mode.
 See function `mouse-avoidance-mode' for possible values.
 Setting this variable directly does not take effect;
 use either \\[customize] or \\[mouse-avoidance-mode].")
-
 (custom-autoload 'mouse-avoidance-mode "avoid" nil)
-
 (autoload 'mouse-avoidance-mode "avoid" "\
 Set Mouse Avoidance mode to MODE.
 MODE should be one of the symbols `banish', `exile', `jump', `animate',
@@ -1888,34 +1737,31 @@ Effects of the different modes:
  * cat-and-mouse: Same as `animate'.
  * proteus: As `animate', but changes the shape of the mouse pointer too.
 
-\(See `mouse-avoidance-threshold' for definition of \"too close\",
+(See `mouse-avoidance-threshold' for definition of \"too close\",
 and `mouse-avoidance-nudge-dist' and `mouse-avoidance-nudge-var' for
 definition of \"random distance\".)
 
-\(fn &optional MODE)" t nil)
-
+(fn &optional MODE)" t nil)
 (register-definition-prefixes "avoid" '("mouse-avoidance-"))
 
-;;;***
 
-;;;### (autoloads nil "backtrace" "emacs-lisp/backtrace.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emacs-lisp/backtrace.el
-(push (purecopy '(backtrace 1 0)) package--builtin-versions)
 
+(push (purecopy '(backtrace 1 0)) package--builtin-versions)
 (autoload 'backtrace "backtrace" "\
 Print a trace of Lisp function calls currently active.
 Output stream used is value of `standard-output'." nil nil)
-
 (register-definition-prefixes "backtrace" '("backtrace-"))
 
-;;;***
 
-;;;### (autoloads nil "bat-mode" "progmodes/bat-mode.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/base.el
+
+(register-definition-prefixes "ede/base" '("ede-"))
+
+
 ;;; Generated autoloads from progmodes/bat-mode.el
 
 (add-to-list 'auto-mode-alist '("\\.\\(bat\\|cmd\\)\\'" . bat-mode))
-
 (autoload 'bat-mode "bat-mode" "\
 Major mode for editing DOS/Windows batch files.
 Start a new script from `bat-template'.  Read help pages for DOS commands
@@ -1924,21 +1770,17 @@ Run script using `bat-run' and `bat-run-args'.
 
 \\{bat-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "bat-mode" '("bat-"))
 
-;;;***
 
-;;;### (autoloads nil "battery" "battery.el" (0 0 0 0))
 ;;; Generated autoloads from battery.el
- (put 'battery-mode-line-string 'risky-local-variable t)
 
+ (put 'battery-mode-line-string 'risky-local-variable t)
 (autoload 'battery "battery" "\
 Display battery status information in the echo area.
 The text being displayed in the echo area is controlled by the variables
 `battery-echo-area-format' and `battery-status-function'." t nil)
-
 (defvar display-battery-mode nil "\
 Non-nil if Display-Battery mode is enabled.
 See the `display-battery-mode' command
@@ -1946,9 +1788,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `display-battery-mode'.")
-
 (custom-autoload 'display-battery-mode "battery" nil)
-
 (autoload 'display-battery-mode "battery" "\
 Toggle battery status display in mode line (Display Battery mode).
 
@@ -1957,6 +1797,10 @@ The text displayed in the mode line is controlled by
 The mode line is be updated every `battery-update-interval'
 seconds.
 
+The function which updates the mode-line display will call the
+functions in `battery-update-functions', which can be used to
+trigger actions based on battery-related events.
+
 This is a global minor mode.  If called interactively, toggle the
 `Display-Battery mode' mode.  If the prefix argument is positive,
 enable the mode, and if it is zero or negative, disable the mode.
@@ -1971,14 +1815,10 @@ evaluate `(default-value \\='display-battery-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
-(register-definition-prefixes "battery" '("battery-"))
+(fn &optional ARG)" t nil)
+(register-definition-prefixes "battery" '("battery-" "my-"))
 
-;;;***
 
-;;;### (autoloads nil "benchmark" "emacs-lisp/benchmark.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emacs-lisp/benchmark.el
 
 (autoload 'benchmark-call "benchmark" "\
@@ -1993,8 +1833,7 @@ specifies a minimum number of seconds that the benchmark 
execution
 should take.  In that case the return value is prepended with the
 number of repetitions actually used.
 
-\(fn FUNC &optional REPETITIONS)" nil nil)
-
+(fn FUNC &optional REPETITIONS)" nil nil)
 (autoload 'benchmark-run "benchmark" "\
 Time execution of FORMS.
 If REPETITIONS is supplied as a number, run FORMS that many times,
@@ -2004,20 +1843,16 @@ Return a list of the total elapsed time for execution, 
the number of
 garbage collections that ran, and the time taken by garbage collection.
 See also `benchmark-run-compiled'.
 
-\(fn &optional REPETITIONS &rest FORMS)" nil t)
-
+(fn &optional REPETITIONS &rest FORMS)" nil t)
 (function-put 'benchmark-run 'lisp-indent-function '1)
-
 (autoload 'benchmark-run-compiled "benchmark" "\
 Time execution of compiled version of FORMS.
 This is like `benchmark-run', but what is timed is a funcall of the
 byte code obtained by wrapping FORMS in a `lambda' and compiling the
 result.  The overhead of the `lambda's is accounted for.
 
-\(fn &optional REPETITIONS &rest FORMS)" nil t)
-
+(fn &optional REPETITIONS &rest FORMS)" nil t)
 (function-put 'benchmark-run-compiled 'lisp-indent-function '1)
-
 (autoload 'benchmark "benchmark" "\
 Print the time taken for REPETITIONS executions of FORM.
 Interactively, REPETITIONS is taken from the prefix arg, and
@@ -2027,28 +1862,21 @@ For non-interactive use see also `benchmark-run' and
 FORM can also be a function in which case we measure the time it takes
 to call it without any argument.
 
-\(fn REPETITIONS FORM)" t nil)
-
+(fn REPETITIONS FORM)" t nil)
 (autoload 'benchmark-progn "benchmark" "\
 Evaluate BODY and message the time taken.
 The return value is the value of the final form in BODY.
 
-\(fn &rest BODY)" nil t)
-
+(fn &rest BODY)" nil t)
 (function-put 'benchmark-progn 'lisp-indent-function '0)
-
 (register-definition-prefixes "benchmark" '("benchmark-"))
 
-;;;***
 
-;;;### (autoloads nil "bib-mode" "textmodes/bib-mode.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/bib-mode.el
 
 (register-definition-prefixes "bib-mode" '("addbib" "bib-" "mark-bib" 
"return-key-bib" "unread-bib"))
 
-;;;***
 
-;;;### (autoloads nil "bibtex" "textmodes/bibtex.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/bibtex.el
 
 (autoload 'bibtex-initialize "bibtex" "\
@@ -2065,8 +1893,7 @@ When called interactively, FORCE is t, CURRENT is t if 
current buffer
 visits a file using `bibtex-mode', and SELECT is t if current buffer
 does not use `bibtex-mode'.
 
-\(fn &optional CURRENT FORCE SELECT)" t nil)
-
+(fn &optional CURRENT FORCE SELECT)" t nil)
 (autoload 'bibtex-mode "bibtex" "\
 Major mode for editing BibTeX files.
 
@@ -2120,8 +1947,7 @@ if that value is non-nil.
 
 \\{bibtex-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'bibtex-search-entry "bibtex" "\
 Move point to the beginning of BibTeX entry named KEY.
 Return position of entry if KEY is found or nil if not found.
@@ -2135,59 +1961,44 @@ Also, GLOBAL is t if the current mode is not 
`bibtex-mode'
 or `bibtex-search-entry-globally' is non-nil.
 A prefix arg negates the value of `bibtex-search-entry-globally'.
 
-\(fn KEY &optional GLOBAL START DISPLAY)" t nil)
-
+(fn KEY &optional GLOBAL START DISPLAY)" t nil)
 (register-definition-prefixes "bibtex" '("bibtex-"))
 
-;;;***
 
-;;;### (autoloads nil "bibtex-style" "textmodes/bibtex-style.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from textmodes/bibtex-style.el
 
 (autoload 'bibtex-style-mode "bibtex-style" "\
 Major mode for editing BibTeX style files.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "bibtex-style" '("bibtex-style-"))
 
-;;;***
 
-;;;### (autoloads nil "bindat" "emacs-lisp/bindat.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/bindat.el
 
 (register-definition-prefixes "bindat" '("bindat-"))
 
-;;;***
 
-;;;### (autoloads nil "binhex" "mail/binhex.el" (0 0 0 0))
 ;;; Generated autoloads from mail/binhex.el
 
 (defconst binhex-begin-line 
"^:...............................................................$" "\
 Regular expression matching the start of a BinHex encoded region.")
-
 (autoload 'binhex-decode-region-internal "binhex" "\
 Binhex decode region between START and END without using an external program.
 If HEADER-ONLY is non-nil only decode header and return filename.
 
-\(fn START END &optional HEADER-ONLY)" t nil)
-
+(fn START END &optional HEADER-ONLY)" t nil)
 (autoload 'binhex-decode-region-external "binhex" "\
 Binhex decode region between START and END using external decoder.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'binhex-decode-region "binhex" "\
 Binhex decode region between START and END.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (register-definition-prefixes "binhex" '("binhex-"))
 
-;;;***
 
-;;;### (autoloads nil "blackbox" "play/blackbox.el" (0 0 0 0))
 ;;; Generated autoloads from play/blackbox.el
 
 (autoload 'blackbox "blackbox" "\
@@ -2302,22 +2113,23 @@ H * * * O - - - -         - - - - - - - -          - - 
- - - - - -
 Be sure to compare the second example of a hit with the first example of
 a reflection.
 
-\(fn NUM)" t nil)
-
+(fn NUM)" t nil)
 (register-definition-prefixes "blackbox" '("bb-" "blackbox-"))
 
-;;;***
 
-;;;### (autoloads nil "bookmark" "bookmark.el" (0 0 0 0))
 ;;; Generated autoloads from bookmark.el
+
  (define-key ctl-x-r-map "b" 'bookmark-jump)
  (define-key ctl-x-r-map "m" 'bookmark-set)
  (define-key ctl-x-r-map "M" 'bookmark-set-no-overwrite)
  (define-key ctl-x-r-map "l" 'bookmark-bmenu-list)
-
-(defvar-keymap bookmark-map :doc "Keymap containing bindings to bookmark 
functions.\nIt is not bound to any key by default: to bind it\nso that you have 
a bookmark prefix, just use `global-set-key' and bind a\nkey of your choice to 
variable `bookmark-map'.  All interactive bookmark\nfunctions have a binding in 
this keymap." "x" #'bookmark-set "m" #'bookmark-set "M" 
#'bookmark-set-no-overwrite "j" #'bookmark-jump "g" #'bookmark-jump "o" 
#'bookmark-jump-other-window "5" #'bookmark-jump-oth [...]
+(defvar-keymap bookmark-map :doc "\
+Keymap containing bindings to bookmark functions.
+It is not bound to any key by default: to bind it
+so that you have a bookmark prefix, just use `global-set-key' and bind a
+key of your choice to variable `bookmark-map'.  All interactive bookmark
+functions have a binding in this keymap." "x" #'bookmark-set "m" 
#'bookmark-set "M" #'bookmark-set-no-overwrite "j" #'bookmark-jump "g" 
#'bookmark-jump "o" #'bookmark-jump-other-window "5" 
#'bookmark-jump-other-frame "i" #'bookmark-insert "e" #'edit-bookmarks "f" 
#'bookmark-insert-location "r" #'bookmark-rename "d" #'bookmark-delete "D" 
#'bookmark-delete-all "l" #'bookmark-load "w" #'bookmark-write "s" 
#'bookmark-save)
  (fset 'bookmark-map bookmark-map)
-
 (autoload 'bookmark-set "bookmark" "\
 Set a bookmark named NAME at the current location.
 If NAME is nil, then prompt the user.
@@ -2343,8 +2155,7 @@ Use \\[bookmark-delete] to remove bookmarks (you give it 
a name and
 it removes only the first instance of a bookmark with that name from
 the list of bookmarks.)
 
-\(fn &optional NAME NO-OVERWRITE)" t nil)
-
+(fn &optional NAME NO-OVERWRITE)" t nil)
 (autoload 'bookmark-set-no-overwrite "bookmark" "\
 Set a bookmark named NAME at the current location.
 If NAME is nil, then prompt the user.
@@ -2373,8 +2184,7 @@ Use \\[bookmark-delete] to remove bookmarks (you give it 
a name and
 it removes only the first instance of a bookmark with that name from
 the list of bookmarks.)
 
-\(fn &optional NAME PUSH-BOOKMARK)" t nil)
-
+(fn &optional NAME PUSH-BOOKMARK)" t nil)
 (autoload 'bookmark-jump "bookmark" "\
 Jump to bookmark BOOKMARK (a point in some file).
 You may have a problem using this function if the value of variable
@@ -2394,18 +2204,15 @@ If DISPLAY-FUNC is non-nil, it is a function to invoke 
to display the
 bookmark.  It defaults to `pop-to-buffer-same-window'.  A typical value for
 DISPLAY-FUNC would be `switch-to-buffer-other-window'.
 
-\(fn BOOKMARK &optional DISPLAY-FUNC)" t nil)
-
+(fn BOOKMARK &optional DISPLAY-FUNC)" t nil)
 (autoload 'bookmark-jump-other-window "bookmark" "\
 Jump to BOOKMARK in another window.  See `bookmark-jump' for more.
 
-\(fn BOOKMARK)" t nil)
-
+(fn BOOKMARK)" t nil)
 (autoload 'bookmark-jump-other-frame "bookmark" "\
 Jump to BOOKMARK in another frame.  See `bookmark-jump' for more.
 
-\(fn BOOKMARK)" t nil)
-
+(fn BOOKMARK)" t nil)
 (autoload 'bookmark-relocate "bookmark" "\
 Relocate BOOKMARK-NAME to another file, reading file name with minibuffer.
 
@@ -2413,18 +2220,15 @@ This makes an already existing bookmark point to that 
file, instead of
 the one it used to point at.  Useful when a file has been renamed
 after a bookmark was set in it.
 
-\(fn BOOKMARK-NAME)" t nil)
-
+(fn BOOKMARK-NAME)" t nil)
 (autoload 'bookmark-insert-location "bookmark" "\
 Insert the name of the file associated with BOOKMARK-NAME.
 
 Optional second arg NO-HISTORY means don't record this in the
 minibuffer history list `bookmark-history'.
 
-\(fn BOOKMARK-NAME &optional NO-HISTORY)" t nil)
-
+(fn BOOKMARK-NAME &optional NO-HISTORY)" t nil)
 (defalias 'bookmark-locate 'bookmark-insert-location)
-
 (autoload 'bookmark-rename "bookmark" "\
 Change the name of OLD-NAME bookmark to NEW-NAME name.
 If called from keyboard, prompt for OLD-NAME and NEW-NAME.
@@ -2438,8 +2242,7 @@ While you are entering the new name, consecutive 
\\<bookmark-minibuffer-read-nam
 consecutive words from the text of the buffer into the new bookmark
 name.
 
-\(fn OLD-NAME &optional NEW-NAME)" t nil)
-
+(fn OLD-NAME &optional NEW-NAME)" t nil)
 (autoload 'bookmark-insert "bookmark" "\
 Insert the text of the file pointed to by bookmark BOOKMARK-NAME.
 BOOKMARK-NAME is a bookmark name (a string), not a bookmark record.
@@ -2449,8 +2252,7 @@ You may have a problem using this function if the value 
of variable
 bookmarks.  See help on function `bookmark-load' for more about
 this.
 
-\(fn BOOKMARK-NAME)" t nil)
-
+(fn BOOKMARK-NAME)" t nil)
 (autoload 'bookmark-delete "bookmark" "\
 Delete BOOKMARK-NAME from the bookmark list.
 
@@ -2461,20 +2263,16 @@ one most recently used in this file, if any).
 Optional second arg BATCH means don't update the bookmark list buffer,
 probably because we were called from there.
 
-\(fn BOOKMARK-NAME &optional BATCH)" t nil)
-
+(fn BOOKMARK-NAME &optional BATCH)" t nil)
 (autoload 'bookmark-delete-all "bookmark" "\
 Permanently delete all bookmarks.
 If optional argument NO-CONFIRM is non-nil, don't ask for
 confirmation.
 
-\(fn &optional NO-CONFIRM)" t nil)
-
+(fn &optional NO-CONFIRM)" t nil)
 (autoload 'bookmark-write "bookmark" "\
 Write bookmarks to a file (reading the file name with the minibuffer)." t nil)
-
 (function-put 'bookmark-write 'interactive-only 'bookmark-save)
-
 (autoload 'bookmark-save "bookmark" "\
 Save currently defined bookmarks in FILE.
 FILE defaults to `bookmark-default-file'.
@@ -2488,8 +2286,7 @@ When you want to load in the bookmarks from a file, use
 for a file, defaulting to the file defined by variable
 `bookmark-default-file'.
 
-\(fn &optional PARG FILE MAKE-DEFAULT)" t nil)
-
+(fn &optional PARG FILE MAKE-DEFAULT)" t nil)
 (autoload 'bookmark-load "bookmark" "\
 Load bookmarks from FILE (which must be in bookmark format).
 Appends loaded bookmarks to the front of the list of bookmarks.
@@ -2509,34 +2306,29 @@ If you load a file containing bookmarks with the same 
names as
 bookmarks already present in your Emacs, the new bookmarks will get
 unique numeric suffixes \"<2>\", \"<3>\", etc.
 
-\(fn FILE &optional OVERWRITE NO-MSG DEFAULT)" t nil)
-
+(fn FILE &optional OVERWRITE NO-MSG DEFAULT)" t nil)
 (autoload 'bookmark-bmenu-get-buffer "bookmark" "\
 Return the Bookmark List, building it if it doesn't exists.
 Don't affect the buffer ring order." nil nil)
-
 (autoload 'bookmark-bmenu-list "bookmark" "\
 Display a list of existing bookmarks.
 The list is displayed in a buffer named `*Bookmark List*'.
 The leftmost column displays a D if the bookmark is flagged for
 deletion, or > if it is flagged for displaying." t nil)
-
 (defalias 'list-bookmarks 'bookmark-bmenu-list)
-
 (defalias 'edit-bookmarks 'bookmark-bmenu-list)
-
 (autoload 'bookmark-bmenu-search "bookmark" "\
 Incremental search of bookmarks, hiding the non-matches as we go." 
'(bookmark-bmenu-mode) nil)
-
 (defvar menu-bar-bookmark-map (let ((map (make-sparse-keymap "Bookmark 
functions"))) (bindings--define-key map [load] '(menu-item "Load a Bookmark 
File..." bookmark-load :help "Load bookmarks from a bookmark file)")) 
(bindings--define-key map [write] '(menu-item "Save Bookmarks As..." 
bookmark-write :help "Write bookmarks to a file (reading the file name with the 
minibuffer)")) (bindings--define-key map [save] '(menu-item "Save Bookmarks" 
bookmark-save :help "Save currently defined bookm [...]
-
 (defalias 'menu-bar-bookmark-map menu-bar-bookmark-map)
-
 (register-definition-prefixes "bookmark" '("bookmark-" 
"with-buffer-modified-unmodified"))
 
-;;;***
 
-;;;### (autoloads nil "browse-url" "net/browse-url.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/bovine.el
+
+(register-definition-prefixes "semantic/bovine" '("semantic-"))
+
+
 ;;; Generated autoloads from net/browse-url.el
 
 (defvar browse-url-browser-function 'browse-url-default-browser "\
@@ -2546,16 +2338,13 @@ This is used by the `browse-url-at-point', 
`browse-url-at-mouse', and
 
 Also see `browse-url-secondary-browser-function' and
 `browse-url-handlers'.")
-
 (custom-autoload 'browse-url-browser-function "browse-url" t)
-
 (defvar browse-url-default-handlers '(("\\`mailto:"; . browse-url--mailto) 
("\\`man:" . browse-url--man) (browse-url--non-html-file-url-p . 
browse-url-emacs)) "\
 Like `browse-url-handlers' but populated by Emacs and packages.
 
 Emacs and external packages capable of browsing certain URLs
 should place their entries in this alist rather than
 `browse-url-handlers' which is reserved for the user.")
-
 (autoload 'browse-url-select-handler "browse-url" "\
 Return a handler of suitable for browsing URL.
 This searches `browse-url-handlers', and
@@ -2570,8 +2359,7 @@ Currently, it also consults `browse-url-browser-function' 
first
 if it is set to an alist, although this usage is deprecated since
 Emacs 28.1 and will be removed in a future release.
 
-\(fn URL &optional KIND)" nil nil)
-
+(fn URL &optional KIND)" nil nil)
 (autoload 'browse-url-of-file "browse-url" "\
 Use a web browser to display FILE.
 Display the current buffer's file if FILE is nil or if called
@@ -2579,8 +2367,7 @@ interactively.  Turn the filename into a URL with function
 `browse-url-file-url'.  Pass the URL to a browser using the
 `browse-url' function then run `browse-url-of-file-hook'.
 
-\(fn &optional FILE)" t nil)
-
+(fn &optional FILE)" t nil)
 (autoload 'browse-url-of-buffer "browse-url" "\
 Use a web browser to display BUFFER.
 See `browse-url' for details.
@@ -2589,17 +2376,14 @@ Display the current buffer if BUFFER is nil.  Display 
only the
 currently visible part of BUFFER (from a temporary file) if buffer is
 narrowed.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (autoload 'browse-url-of-dired-file "browse-url" "\
 In Dired, ask a WWW browser to display the file named on this line." t nil)
-
 (autoload 'browse-url-of-region "browse-url" "\
 Use a web browser to display the current region.
 See `browse-url' for details.
 
-\(fn MIN MAX)" t nil)
-
+(fn MIN MAX)" t nil)
 (autoload 'browse-url "browse-url" "\
 Open URL using a configurable method.
 This will typically (by default) open URL with an external web
@@ -2621,16 +2405,14 @@ significance of ARGS (most of the functions ignore it).
 If ARGS are omitted, the default is to pass
 `browse-url-new-window-flag' as ARGS.
 
-\(fn URL &rest ARGS)" t nil)
-
+(fn URL &rest ARGS)" t nil)
 (autoload 'browse-url-at-point "browse-url" "\
 Open URL at point using a configurable method.
 See `browse-url' for details.
 Optional prefix argument ARG non-nil inverts the value of the option
 `browse-url-new-window-flag'.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'browse-url-with-browser-kind "browse-url" "\
 Browse URL with a browser of the given browser KIND.
 KIND is either `internal' or `external'.
@@ -2638,8 +2420,7 @@ KIND is either `internal' or `external'.
 When called interactively, the default browser kind is the
 opposite of the browser kind of `browse-url-browser-function'.
 
-\(fn KIND URL &optional ARG)" t nil)
-
+(fn KIND URL &optional ARG)" t nil)
 (autoload 'browse-url-at-mouse "browse-url" "\
 Use a web browser to load a URL clicked with the mouse.
 See `browse-url' for details.
@@ -2647,15 +2428,13 @@ See `browse-url' for details.
 The URL is the one around or before the position of the mouse
 click but point is not changed.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (autoload 'browse-url-xdg-open "browse-url" "\
 Pass the specified URL to the \"xdg-open\" command.
 xdg-open is a desktop utility that calls your preferred web browser.
 The optional argument IGNORED is not used.
 
-\(fn URL &optional IGNORED)" t nil)
-
+(fn URL &optional IGNORED)" t nil)
 (autoload 'browse-url-mozilla "browse-url" "\
 Ask the Mozilla WWW browser to load URL.
 Default to the URL around or before point.  The strings in variable
@@ -2673,8 +2452,7 @@ new tab in an existing window instead.
 When called non-interactively, optional second argument NEW-WINDOW is
 used instead of `browse-url-new-window-flag'.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (autoload 'browse-url-firefox "browse-url" "\
 Ask the Firefox WWW browser to load URL.
 Defaults to the URL around or before point.  Passes the strings
@@ -2691,8 +2469,7 @@ is loaded in a new tab in an existing window instead.
 Non-interactively, this uses the optional second argument NEW-WINDOW
 instead of `browse-url-new-window-flag'.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (autoload 'browse-url-chromium "browse-url" "\
 Ask the Chromium WWW browser to load URL.
 Default to the URL around or before point.  The strings in
@@ -2700,22 +2477,24 @@ variable `browse-url-chromium-arguments' are also 
passed to
 Chromium.
 The optional argument NEW-WINDOW is not used.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (autoload 'browse-url-webpositive "browse-url" "\
 Ask the WebPositive WWW browser to load URL.
 Default to the URL around or before point.
 The optional argument NEW-WINDOW is not used.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t nil)
+(autoload 'browse-url-default-haiku-browser "browse-url" "\
+Browse URL with the system default browser.
+Default to the URL around or before point.
 
+(fn URL &optional NEW-WINDOW)" t nil)
 (autoload 'browse-url-emacs "browse-url" "\
 Ask Emacs to load URL into a buffer and show it in another window.
 Optional argument SAME-WINDOW non-nil means show the URL in the
 currently selected window instead.
 
-\(fn URL &optional SAME-WINDOW)" t nil)
-
+(fn URL &optional SAME-WINDOW)" t nil)
 (autoload 'browse-url-gnome-moz "browse-url" "\
 Ask Mozilla to load URL via the GNOME program `gnome-moz-remote'.
 Default to the URL around or before point.  The strings in variable
@@ -2729,10 +2508,8 @@ effect of `browse-url-new-window-flag'.
 When called non-interactively, optional second argument NEW-WINDOW is
 used instead of `browse-url-new-window-flag'.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (make-obsolete 'browse-url-gnome-moz 'nil '"25.1")
-
 (autoload 'browse-url-conkeror "browse-url" "\
 Ask the Conkeror WWW browser to load URL.
 Default to the URL around or before point.  Also pass the strings
@@ -2751,10 +2528,8 @@ new window, load it in a new buffer in an existing 
window instead.
 When called non-interactively, use optional second argument
 NEW-WINDOW instead of `browse-url-new-window-flag'.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (make-obsolete 'browse-url-conkeror 'nil '"28.1")
-
 (autoload 'browse-url-w3 "browse-url" "\
 Ask the w3 WWW browser to load URL.
 Default to the URL around or before point.
@@ -2766,17 +2541,14 @@ prefix argument reverses the effect of 
`browse-url-new-window-flag'.
 When called non-interactively, optional second argument NEW-WINDOW is
 used instead of `browse-url-new-window-flag'.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (autoload 'browse-url-w3-gnudoit "browse-url" "\
 Ask another Emacs running gnuserv to load the URL using the W3 browser.
 The `browse-url-gnudoit-program' program is used with options given by
 `browse-url-gnudoit-args'.  Default to the URL around or before point.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (make-obsolete 'browse-url-w3-gnudoit 'nil '"25.1")
-
 (autoload 'browse-url-text-xterm "browse-url" "\
 Ask a text browser to load URL.
 URL defaults to the URL around or before point.
@@ -2785,8 +2557,7 @@ in an Xterm window using the Xterm program named by 
`browse-url-xterm-program'
 with possible additional arguments `browse-url-xterm-args'.
 The optional argument NEW-WINDOW is not used.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (autoload 'browse-url-text-emacs "browse-url" "\
 Ask a text browser to load URL.
 URL defaults to the URL around or before point.
@@ -2801,8 +2572,7 @@ reverses the effect of `browse-url-new-window-flag'.
 When called non-interactively, optional second argument NEW-WINDOW is
 used instead of `browse-url-new-window-flag'.
 
-\(fn URL &optional NEW-BUFFER)" t nil)
-
+(fn URL &optional NEW-BUFFER)" t nil)
 (autoload 'browse-url-mail "browse-url" "\
 Open a new mail message buffer within Emacs for the RFC 2368 URL.
 Default to using the mailto: URL around or before point as the
@@ -2818,8 +2588,7 @@ non-nil interactive prefix argument reverses the effect of
 When called non-interactively, optional second argument NEW-WINDOW is
 used instead of `browse-url-new-window-flag'.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (autoload 'browse-url-generic "browse-url" "\
 Ask the WWW browser defined by `browse-url-generic-program' to load URL.
 Default to the URL around or before point.  A fresh copy of the
@@ -2827,15 +2596,13 @@ browser is started up in a new process with possible 
additional arguments
 `browse-url-generic-args'.  This is appropriate for browsers which
 don't offer a form of remote control.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (autoload 'browse-url-kde "browse-url" "\
 Ask the KDE WWW browser to load URL.
 Default to the URL around or before point.
 The optional argument NEW-WINDOW is not used.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (autoload 'browse-url-elinks "browse-url" "\
 Ask the Elinks WWW browser to load URL.
 Default to the URL around the point.
@@ -2846,42 +2613,34 @@ none yet running, a newly started instance.
 The Elinks command will be prepended by the program+arguments
 from `browse-url-elinks-wrapper'.
 
-\(fn URL &optional NEW-WINDOW)" t nil)
-
+(fn URL &optional NEW-WINDOW)" t nil)
 (autoload 'browse-url-button-open "browse-url" "\
 Follow the link under point using `browse-url'.
 If EXTERNAL (the prefix if used interactively), open with the
 external browser instead of the default one.
 
-\(fn &optional EXTERNAL MOUSE-EVENT)" t nil)
-
+(fn &optional EXTERNAL MOUSE-EVENT)" t nil)
 (autoload 'browse-url-button-open-url "browse-url" "\
 Open URL using `browse-url'.
 If `current-prefix-arg' is non-nil, use
 `browse-url-secondary-browser-function' instead.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "browse-url" '("browse-url-"))
 
-;;;***
 
-;;;### (autoloads nil "bs" "bs.el" (0 0 0 0))
 ;;; Generated autoloads from bs.el
 
 (autoload 'bs-cycle-next "bs" "\
 Select next buffer defined by buffer cycling.
 The buffers taking part in buffer cycling are defined
 by buffer configuration `bs-cycle-configuration-name'." t nil)
-
 (autoload 'bs-cycle-previous "bs" "\
 Select previous buffer defined by buffer cycling.
 The buffers taking part in buffer cycling are defined
 by buffer configuration `bs-cycle-configuration-name'." t nil)
-
 (autoload 'bs-customize "bs" "\
 Customization of group bs for Buffer Selection Menu." t nil)
-
 (autoload 'bs-show "bs" "\
 Make a menu of buffers so you can manipulate buffers or the buffer list.
 \\<bs-mode-map>
@@ -2896,13 +2655,10 @@ With prefix argument ARG show a different buffer list.  
Function
 `bs--configuration-name-for-prefix-arg' determine accordingly
 name of buffer configuration.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (register-definition-prefixes "bs" '("bs-"))
 
-;;;***
 
-;;;### (autoloads nil "bubbles" "play/bubbles.el" (0 0 0 0))
 ;;; Generated autoloads from play/bubbles.el
 
 (autoload 'bubbles "bubbles" "\
@@ -2918,19 +2674,13 @@ columns on its right towards the left.
 \\[bubbles-set-game-medium] sets the difficulty to medium.
 \\[bubbles-set-game-difficult] sets the difficulty to difficult.
 \\[bubbles-set-game-hard] sets the difficulty to hard." t nil)
-
 (register-definition-prefixes "bubbles" '("bubbles-"))
 
-;;;***
 
-;;;### (autoloads nil "bug-reference" "progmodes/bug-reference.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from progmodes/bug-reference.el
 
 (put 'bug-reference-url-format 'safe-local-variable (lambda (s) (or (stringp 
s) (and (symbolp s) (get s 'bug-reference-url-format)))))
-
 (put 'bug-reference-bug-regexp 'safe-local-variable 'stringp)
-
 (autoload 'bug-reference-mode "bug-reference" "\
 Toggle hyperlinking bug references in the buffer (Bug Reference mode).
 
@@ -2948,8 +2698,7 @@ evaluate `bug-reference-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'bug-reference-prog-mode "bug-reference" "\
 Like `bug-reference-mode', but only buttonize in comments and strings.
 
@@ -2968,35 +2717,26 @@ evaluate `bug-reference-prog-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "bug-reference" '("bug-reference-"))
 
-;;;***
 
-;;;### (autoloads nil "byte-opt" "emacs-lisp/byte-opt.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from emacs-lisp/byte-opt.el
 
 (register-definition-prefixes "byte-opt" '("byte-" "disassemble-offset"))
 
-;;;***
 
-;;;### (autoloads nil "bytecomp" "emacs-lisp/bytecomp.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from emacs-lisp/bytecomp.el
+
 (put 'byte-compile-dynamic 'safe-local-variable 'booleanp)
 (put 'byte-compile-disable-print-circle 'safe-local-variable 'booleanp)
 (put 'byte-compile-dynamic-docstrings 'safe-local-variable 'booleanp)
 (put 'byte-compile-error-on-warn 'safe-local-variable 'booleanp)
-
 (put 'byte-compile-warnings 'safe-local-variable (lambda (v) (or (symbolp v) 
(null (delq nil (mapcar (lambda (x) (not (symbolp x))) v))))))
-
 (autoload 'byte-compile-warning-enabled-p "bytecomp" "\
 Return non-nil if WARNING is enabled, according to `byte-compile-warnings'.
 
-\(fn WARNING &optional SYMBOL)" nil nil)
-
+(fn WARNING &optional SYMBOL)" nil nil)
 (autoload 'byte-compile-disable-warning "bytecomp" "\
 Change `byte-compile-warnings' to disable WARNING.
 If `byte-compile-warnings' is t, set it to `(not WARNING)'.
@@ -3004,8 +2744,7 @@ Otherwise, if the first element is `not', add WARNING, 
else remove it.
 Normally you should let-bind `byte-compile-warnings' before calling this,
 else the global value will be modified.
 
-\(fn WARNING)" nil nil)
-
+(fn WARNING)" nil nil)
 (autoload 'byte-compile-enable-warning "bytecomp" "\
 Change `byte-compile-warnings' to enable WARNING.
 If `byte-compile-warnings' is t, do nothing.  Otherwise, if the
@@ -3013,14 +2752,12 @@ first element is `not', remove WARNING, else add it.
 Normally you should let-bind `byte-compile-warnings' before calling this,
 else the global value will be modified.
 
-\(fn WARNING)" nil nil)
-
+(fn WARNING)" nil nil)
 (autoload 'byte-force-recompile "bytecomp" "\
 Recompile every `.el' file in DIRECTORY that already has a `.elc' file.
 Files in subdirectories of DIRECTORY are processed also.
 
-\(fn DIRECTORY)" t nil)
-
+(fn DIRECTORY)" t nil)
 (autoload 'byte-recompile-directory "bytecomp" "\
 Recompile every `.el' file in DIRECTORY that needs recompilation.
 This happens when a `.elc' file exists but is older than the `.el' file.
@@ -3040,9 +2777,8 @@ This command will normally not follow symlinks when 
compiling
 files.  If FOLLOW-SYMLINKS is non-nil, symlinked `.el' files will
 also be compiled.
 
-\(fn DIRECTORY &optional ARG FORCE FOLLOW-SYMLINKS)" t nil)
+(fn DIRECTORY &optional ARG FORCE FOLLOW-SYMLINKS)" t nil)
 (put 'no-byte-compile 'safe-local-variable 'booleanp)
-
 (autoload 'byte-compile-file "bytecomp" "\
 Compile a file of Lisp code named FILENAME into a file of byte code.
 The output file's name is generated by passing FILENAME to the
@@ -3051,23 +2787,19 @@ The value is non-nil if there were no errors, nil if 
errors.
 
 See also `emacs-lisp-byte-compile-and-load'.
 
-\(fn FILENAME &optional LOAD)" t nil)
-
+(fn FILENAME &optional LOAD)" t nil)
 (set-advertised-calling-convention 'byte-compile-file '(filename) '"28.1")
-
 (autoload 'compile-defun "bytecomp" "\
 Compile and evaluate the current top-level form.
 Print the result in the echo area.
 With argument ARG, insert value in current buffer after the form.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'byte-compile "bytecomp" "\
 If FORM is a symbol, byte-compile its function definition.
 If FORM is a lambda or a macro, byte-compile it as a function.
 
-\(fn FORM)" nil nil)
-
+(fn FORM)" nil nil)
 (autoload 'display-call-tree "bytecomp" "\
 Display a call graph of a specified file.
 This lists which functions have been called, what functions called
@@ -3077,19 +2809,17 @@ all functions called by those functions.
 
 The call graph does not include macros, inline functions, or
 primitives that the byte-code interpreter knows about directly
-\(`eq', `cons', etc.).
+(`eq', `cons', etc.).
 
 The call tree also lists those functions which are not known to be called
-\(that is, to which no calls have been compiled), and which cannot be
+(that is, to which no calls have been compiled), and which cannot be
 invoked interactively.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (autoload 'batch-byte-compile-if-not-done "bytecomp" "\
 Like `byte-compile-file' but doesn't recompile if already up to date.
 Use this from the command line, with `-batch';
 it won't work in an interactive Emacs." nil nil)
-
 (autoload 'batch-byte-compile "bytecomp" "\
 Run `byte-compile-file' on the files remaining on the command line.
 Use this from the command line, with `-batch';
@@ -3106,8 +2836,7 @@ For example, invoke \"emacs -batch -f batch-byte-compile 
$emacs/ ~/*.el\".
 If NOFORCE is non-nil, don't recompile a file that seems to be
 already up-to-date.
 
-\(fn &optional NOFORCE)" nil nil)
-
+(fn &optional NOFORCE)" nil nil)
 (autoload 'batch-byte-recompile-directory "bytecomp" "\
 Run `byte-recompile-directory' on the dirs remaining on the command line.
 Must be used only with `-batch', and kills Emacs on completion.
@@ -3117,61 +2846,44 @@ Optional argument ARG is passed as second argument ARG 
to
 `byte-recompile-directory'; see there for its possible values
 and corresponding effects.
 
-\(fn &optional ARG)" nil nil)
-
+(fn &optional ARG)" nil nil)
 (register-definition-prefixes "bytecomp" '("batch-byte-compile-file" "byte" 
"displaying-byte-compile-warnings" "emacs-lisp-" "no-byte-compile"))
 
-;;;***
 
-;;;### (autoloads nil "cal-bahai" "calendar/cal-bahai.el" (0 0 0
-;;;;;;  0))
+;;; Generated autoloads from cedet/semantic/bovine/c.el
+
+(register-definition-prefixes "semantic/bovine/c" '("c-mode" "semantic"))
+
+
 ;;; Generated autoloads from calendar/cal-bahai.el
 
 (register-definition-prefixes "cal-bahai" '("calendar-bahai-" "diary-bahai-" 
"holiday-bahai"))
 
-;;;***
 
-;;;### (autoloads nil "cal-china" "calendar/cal-china.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from calendar/cal-china.el
 
 (put 'calendar-chinese-time-zone 'risky-local-variable t)
-
 (register-definition-prefixes "cal-china" '("calendar-chinese-" 
"diary-chinese-" "holiday-chinese"))
 
-;;;***
 
-;;;### (autoloads nil "cal-coptic" "calendar/cal-coptic.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from calendar/cal-coptic.el
 
 (register-definition-prefixes "cal-coptic" '("calendar-" "diary-"))
 
-;;;***
 
-;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/cal-dst.el
 
 (put 'calendar-daylight-savings-starts 'risky-local-variable t)
-
 (put 'calendar-daylight-savings-ends 'risky-local-variable t)
-
 (put 'calendar-current-time-zone-cache 'risky-local-variable t)
-
 (register-definition-prefixes "cal-dst" '("calendar-" "dst-"))
 
-;;;***
 
-;;;### (autoloads nil "cal-french" "calendar/cal-french.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from calendar/cal-french.el
 
 (register-definition-prefixes "cal-french" '("calendar-french-" 
"diary-french-date"))
 
-;;;***
 
-;;;### (autoloads nil "cal-hebrew" "calendar/cal-hebrew.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from calendar/cal-hebrew.el
 
 (autoload 'calendar-hebrew-list-yahrzeits "cal-hebrew" "\
@@ -3179,164 +2891,124 @@ List Yahrzeit dates for *Gregorian* DEATH-DATE from 
START-YEAR to END-YEAR.
 When called interactively from the calendar window, the date of death is taken
 from the cursor position.
 
-\(fn DEATH-DATE START-YEAR END-YEAR)" t nil)
-
+(fn DEATH-DATE START-YEAR END-YEAR)" t nil)
 (register-definition-prefixes "cal-hebrew" '("calendar-hebrew-" 
"diary-hebrew-" "holiday-hebrew"))
 
-;;;***
 
-;;;### (autoloads nil "cal-html" "calendar/cal-html.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/cal-html.el
 
 (register-definition-prefixes "cal-html" '("cal-html-"))
 
-;;;***
 
-;;;### (autoloads nil "cal-islam" "calendar/cal-islam.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from calendar/cal-islam.el
 
 (register-definition-prefixes "cal-islam" '("calendar-islamic-" 
"diary-islamic-" "holiday-islamic"))
 
-;;;***
 
-;;;### (autoloads nil "cal-iso" "calendar/cal-iso.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/cal-iso.el
 
 (register-definition-prefixes "cal-iso" '("calendar-iso-" "diary-iso-date"))
 
-;;;***
 
-;;;### (autoloads nil "cal-julian" "calendar/cal-julian.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from calendar/cal-julian.el
 
 (register-definition-prefixes "cal-julian" '("calendar-" "diary-" 
"holiday-julian"))
 
-;;;***
 
-;;;### (autoloads nil "cal-mayan" "calendar/cal-mayan.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from calendar/cal-mayan.el
 
 (register-definition-prefixes "cal-mayan" '("calendar-mayan-" 
"diary-mayan-date"))
 
-;;;***
 
-;;;### (autoloads nil "cal-menu" "calendar/cal-menu.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/cal-menu.el
 
 (register-definition-prefixes "cal-menu" '("cal"))
 
-;;;***
 
-;;;### (autoloads nil "cal-move" "calendar/cal-move.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/cal-move.el
 
 (register-definition-prefixes "cal-move" '("calendar-"))
 
-;;;***
 
-;;;### (autoloads nil "cal-persia" "calendar/cal-persia.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from calendar/cal-persia.el
 
 (register-definition-prefixes "cal-persia" '("calendar-persian-" 
"diary-persian-date"))
 
-;;;***
 
-;;;### (autoloads nil "cal-tex" "calendar/cal-tex.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/cal-tex.el
 
 (register-definition-prefixes "cal-tex" '("cal-tex-"))
 
-;;;***
 
-;;;### (autoloads nil "cal-x" "calendar/cal-x.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/cal-x.el
 
 (register-definition-prefixes "cal-x" '("calendar-" "diary-frame"))
 
-;;;***
 
-;;;### (autoloads nil "calc" "calc/calc.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc.el
- (define-key ctl-x-map "*" 'calc-dispatch)
 
+ (define-key ctl-x-map "*" 'calc-dispatch)
 (autoload 'calc-dispatch "calc" "\
 Invoke the GNU Emacs Calculator.  See \\[calc-dispatch-help] for details.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'calc "calc" "\
 The Emacs Calculator.  Full documentation is listed under `calc-mode'.
 
-\(fn &optional ARG FULL-DISPLAY INTERACTIVE)" t nil)
-
+(fn &optional ARG FULL-DISPLAY INTERACTIVE)" t nil)
 (autoload 'full-calc "calc" "\
 Invoke the Calculator and give it a full-sized window.
 
-\(fn &optional INTERACTIVE)" t nil)
-
+(fn &optional INTERACTIVE)" t nil)
 (autoload 'quick-calc "calc" "\
 Do a quick calculation in the minibuffer without invoking full Calculator.
 With prefix argument INSERT, insert the result in the current
 buffer.  Otherwise, the result is copied into the kill ring.
 
-\(fn &optional INSERT)" t nil)
-
+(fn &optional INSERT)" t nil)
 (autoload 'calc-eval "calc" "\
 Do a quick calculation and return the result as a string.
 Return value will either be the formatted result in string form,
 or a list containing a character position and an error message in string form.
 
-\(fn STR &optional SEPARATOR &rest ARGS)" nil nil)
-
+(fn STR &optional SEPARATOR &rest ARGS)" nil nil)
 (autoload 'calc-keypad "calc" "\
 Invoke the Calculator in \"visual keypad\" mode.
 This is most useful in the X window system.
 In this mode, click on the Calc \"buttons\" using the left mouse button.
 Or, position the cursor manually and do \\[calc-keypad-press].
 
-\(fn &optional INTERACTIVE)" t nil)
-
+(fn &optional INTERACTIVE)" t nil)
 (autoload 'full-calc-keypad "calc" "\
 Invoke the Calculator in full-screen \"visual keypad\" mode.
 See calc-keypad for details.
 
-\(fn &optional INTERACTIVE)" t nil)
-
+(fn &optional INTERACTIVE)" t nil)
 (autoload 'calc-grab-region "calc" "\
 Parse the region as a vector of numbers and push it on the Calculator stack.
 
-\(fn TOP BOT ARG)" t nil)
-
+(fn TOP BOT ARG)" t nil)
 (autoload 'calc-grab-rectangle "calc" "\
 Parse a rectangle as a matrix of numbers and push it on the Calculator stack.
 
-\(fn TOP BOT ARG)" t nil)
-
+(fn TOP BOT ARG)" t nil)
 (autoload 'calc-grab-sum-down "calc" "\
 Parse a rectangle as a matrix of numbers and sum its columns.
 
-\(fn TOP BOT ARG)" t nil)
-
+(fn TOP BOT ARG)" t nil)
 (autoload 'calc-grab-sum-across "calc" "\
 Parse a rectangle as a matrix of numbers and sum its rows.
 
-\(fn TOP BOT ARG)" t nil)
-
+(fn TOP BOT ARG)" t nil)
 (autoload 'calc-embedded "calc" "\
 Start Calc Embedded mode on the formula surrounding point.
 
-\(fn ARG &optional END OBEG OEND)" t nil)
-
+(fn ARG &optional END OBEG OEND)" t nil)
 (autoload 'calc-embedded-activate "calc" "\
 Scan the current editing buffer for all embedded := and => formulas.
 Also looks for the equivalent TeX words, \\gets and \\evalto.
 
-\(fn &optional ARG CBUF)" t nil)
-
+(fn &optional ARG CBUF)" t nil)
 (autoload 'defmath "calc" "\
 Define Calc function.
 
@@ -3349,299 +3021,234 @@ actual Lisp function name.
 
 See Info node `(calc)Defining Functions'.
 
-\(fn FUNC ARGS &rest BODY)" nil t)
-
+(fn FUNC ARGS &rest BODY)" nil t)
 (function-put 'defmath 'doc-string-elt '3)
-
 (function-put 'defmath 'lisp-indent-function 'defun)
-
 (register-definition-prefixes "calc" '("calc" "defcalcmodevar" 
"inexact-result" "math-" "var-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-alg" "calc/calc-alg.el" (0 0 0 0))
+;;; Generated autoloads from calc/calc-aent.el
+
+(register-definition-prefixes "calc-aent" '("calc" "math-"))
+
+
 ;;; Generated autoloads from calc/calc-alg.el
 
 (register-definition-prefixes "calc-alg" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-arith" "calc/calc-arith.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-arith.el
 
 (register-definition-prefixes "calc-arith" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-bin" "calc/calc-bin.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-bin.el
 
 (register-definition-prefixes "calc-bin" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-comb" "calc/calc-comb.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-comb.el
 
 (register-definition-prefixes "calc-comb" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-cplx" "calc/calc-cplx.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-cplx.el
 
 (register-definition-prefixes "calc-cplx" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-ext" "calc/calc-ext.el" (0 0 0 0))
+;;; Generated autoloads from calc/calc-embed.el
+
+(register-definition-prefixes "calc-embed" '("calc-"))
+
+
 ;;; Generated autoloads from calc/calc-ext.el
 
 (register-definition-prefixes "calc-ext" '("calc" "math-" "var-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-fin" "calc/calc-fin.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-fin.el
 
 (register-definition-prefixes "calc-fin" '("calc" "math-c"))
 
-;;;***
 
-;;;### (autoloads nil "calc-forms" "calc/calc-forms.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-forms.el
 
 (register-definition-prefixes "calc-forms" '("calc" "math-" "var-TimeZone"))
 
-;;;***
 
-;;;### (autoloads nil "calc-frac" "calc/calc-frac.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-frac.el
 
 (register-definition-prefixes "calc-frac" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-funcs" "calc/calc-funcs.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-funcs.el
 
 (register-definition-prefixes "calc-funcs" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-graph" "calc/calc-graph.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-graph.el
 
 (register-definition-prefixes "calc-graph" '("calc-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-help" "calc/calc-help.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-help.el
 
 (register-definition-prefixes "calc-help" '("calc-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-incom" "calc/calc-incom.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-incom.el
 
 (register-definition-prefixes "calc-incom" '("calc-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-keypd" "calc/calc-keypd.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-keypd.el
 
 (register-definition-prefixes "calc-keypd" '("calc-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-lang" "calc/calc-lang.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-lang.el
 
 (register-definition-prefixes "calc-lang" '("calc-" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-macs" "calc/calc-macs.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-macs.el
 
 (register-definition-prefixes "calc-macs" '("Math-" "calc-" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-map" "calc/calc-map.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-map.el
 
 (register-definition-prefixes "calc-map" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-math" "calc/calc-math.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-math.el
 
 (register-definition-prefixes "calc-math" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-menu" "calc/calc-menu.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-menu.el
 
 (register-definition-prefixes "calc-menu" '("calc-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-mode" "calc/calc-mode.el" (0 0 0 0))
+;;; Generated autoloads from calc/calc-misc.el
+
+(register-definition-prefixes "calc-misc" '("math-iipow"))
+
+
 ;;; Generated autoloads from calc/calc-mode.el
 
 (register-definition-prefixes "calc-mode" '("calc-" "math-get-modes-vec"))
 
-;;;***
 
-;;;### (autoloads nil "calc-mtx" "calc/calc-mtx.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-mtx.el
 
 (register-definition-prefixes "calc-mtx" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-nlfit" "calc/calc-nlfit.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-nlfit.el
 
 (register-definition-prefixes "calc-nlfit" '("calc-fit-" "math-nlfit-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-poly" "calc/calc-poly.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-poly.el
 
 (register-definition-prefixes "calc-poly" '("calcFunc-" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-prog" "calc/calc-prog.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-prog.el
 
 (register-definition-prefixes "calc-prog" '("calc" "math-" "var-q"))
 
-;;;***
 
-;;;### (autoloads nil "calc-rewr" "calc/calc-rewr.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-rewr.el
 
 (register-definition-prefixes "calc-rewr" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-rules" "calc/calc-rules.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-rules.el
 
 (register-definition-prefixes "calc-rules" '("calc-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-sel" "calc/calc-sel.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-sel.el
 
 (register-definition-prefixes "calc-sel" '("calc-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-stat" "calc/calc-stat.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-stat.el
 
 (register-definition-prefixes "calc-stat" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-store" "calc/calc-store.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-store.el
 
 (register-definition-prefixes "calc-store" '("calc"))
 
-;;;***
 
-;;;### (autoloads nil "calc-stuff" "calc/calc-stuff.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-stuff.el
 
 (register-definition-prefixes "calc-stuff" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-trail" "calc/calc-trail.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-trail.el
 
 (register-definition-prefixes "calc-trail" '("calc-trail-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-undo" "calc/calc-undo.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-undo.el
 
 (autoload 'calc-undo "calc-undo" "\
 
 
-\(fn N)" t nil)
-
+(fn N)" t nil)
 (register-definition-prefixes "calc-undo" '("calc-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-units" "calc/calc-units.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-units.el
 
 (register-definition-prefixes "calc-units" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calc-vec" "calc/calc-vec.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-vec.el
 
 (register-definition-prefixes "calc-vec" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calcalg2" "calc/calcalg2.el" (0 0 0 0))
+;;; Generated autoloads from calc/calc-yank.el
+
+(register-definition-prefixes "calc-yank" '("calc-" "math-number-regexp"))
+
+
 ;;; Generated autoloads from calc/calcalg2.el
 
 (register-definition-prefixes "calcalg2" '("calc" "math-" "var-IntegLimit"))
 
-;;;***
 
-;;;### (autoloads nil "calcalg3" "calc/calcalg3.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calcalg3.el
 
 (register-definition-prefixes "calcalg3" '("calc" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calccomp" "calc/calccomp.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calccomp.el
 
 (register-definition-prefixes "calccomp" '("calcFunc-c" "math-"))
 
-;;;***
 
-;;;### (autoloads nil "calcsel2" "calc/calcsel2.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calcsel2.el
 
 (register-definition-prefixes "calcsel2" '("calc-"))
 
-;;;***
 
-;;;### (autoloads nil "calculator" "calculator.el" (0 0 0 0))
 ;;; Generated autoloads from calculator.el
 
 (autoload 'calculator "calculator" "\
 Run the Emacs calculator.
 See the documentation for `calculator-mode' for more information." t nil)
-
 (register-definition-prefixes "calculator" '("calculator-"))
 
-;;;***
 
-;;;### (autoloads nil "calendar" "calendar/calendar.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/calendar.el
 
 (autoload 'calendar "calendar" "\
@@ -3679,94 +3286,68 @@ Runs the following hooks:
 
 This function is suitable for execution in an init file.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "calendar" '("calendar-" "diary-" 
"holiday-buffer" "lunar-phases-buffer" "solar-sunrises-buffer"))
 
-;;;***
 
-;;;### (autoloads nil "canlock" "gnus/canlock.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/canlock.el
 
 (autoload 'canlock-insert-header "canlock" "\
 Insert a Cancel-Key and/or a Cancel-Lock header if possible.
 
-\(fn &optional ID-FOR-KEY ID-FOR-LOCK PASSWORD)" nil nil)
-
+(fn &optional ID-FOR-KEY ID-FOR-LOCK PASSWORD)" nil nil)
 (autoload 'canlock-verify "canlock" "\
 Verify Cancel-Lock or Cancel-Key in BUFFER.
 If BUFFER is nil, the current buffer is assumed.  Signal an error if
 it fails.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (register-definition-prefixes "canlock" '("canlock-"))
 
-;;;***
 
-;;;### (autoloads nil "cc-align" "progmodes/cc-align.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-align.el
 
 (register-definition-prefixes "cc-align" '("c-"))
 
-;;;***
 
-;;;### (autoloads nil "cc-awk" "progmodes/cc-awk.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-awk.el
 
 (register-definition-prefixes "cc-awk" '("awk-" "c-awk-"))
 
-;;;***
 
-;;;### (autoloads nil "cc-bytecomp" "progmodes/cc-bytecomp.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from progmodes/cc-bytecomp.el
 
 (register-definition-prefixes "cc-bytecomp" '("cc-"))
 
-;;;***
 
-;;;### (autoloads nil "cc-cmds" "progmodes/cc-cmds.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-cmds.el
 
 (register-definition-prefixes "cc-cmds" '("c-"))
 
-;;;***
 
-;;;### (autoloads nil "cc-defs" "progmodes/cc-defs.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-defs.el
 
 (register-definition-prefixes "cc-defs" '("c-" 
"cc-bytecomp-compiling-or-loading"))
 
-;;;***
 
-;;;### (autoloads nil "cc-engine" "progmodes/cc-engine.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/cc-engine.el
 
 (autoload 'c-guess-basic-syntax "cc-engine" "\
 Return the syntactic context of the current line." nil nil)
-
 (register-definition-prefixes "cc-engine" '("c-"))
 
-;;;***
 
-;;;### (autoloads nil "cc-fonts" "progmodes/cc-fonts.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-fonts.el
 
 (register-definition-prefixes "cc-fonts" '("autodoc-" "c++-font-lock-keywords" 
"c-" "doxygen-font-lock-" "gtkdoc-font-lock-" "idl-font-lock-keywords" "java" 
"objc-font-lock-keywords" "pike-font-lock-keywords"))
 
-;;;***
 
-;;;### (autoloads nil "cc-guess" "progmodes/cc-guess.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-guess.el
 
 (defvar c-guess-guessed-offsets-alist nil "\
 Currently guessed offsets-alist.")
-
 (defvar c-guess-guessed-basic-offset nil "\
 Currently guessed basic-offset.")
-
 (autoload 'c-guess "cc-guess" "\
 Guess the style in the region up to `c-guess-region-max', and install it.
 
@@ -3776,8 +3357,7 @@ If given a prefix argument (or if the optional argument 
ACCUMULATE is
 non-nil) then the previous guess is extended, otherwise a new guess is
 made from scratch.
 
-\(fn &optional ACCUMULATE)" t nil)
-
+(fn &optional ACCUMULATE)" t nil)
 (autoload 'c-guess-no-install "cc-guess" "\
 Guess the style in the region up to `c-guess-region-max'; don't install it.
 
@@ -3785,8 +3365,7 @@ If given a prefix argument (or if the optional argument 
ACCUMULATE is
 non-nil) then the previous guess is extended, otherwise a new guess is
 made from scratch.
 
-\(fn &optional ACCUMULATE)" t nil)
-
+(fn &optional ACCUMULATE)" t nil)
 (autoload 'c-guess-buffer "cc-guess" "\
 Guess the style on the whole current buffer, and install it.
 
@@ -3796,8 +3375,7 @@ If given a prefix argument (or if the optional argument 
ACCUMULATE is
 non-nil) then the previous guess is extended, otherwise a new guess is
 made from scratch.
 
-\(fn &optional ACCUMULATE)" t nil)
-
+(fn &optional ACCUMULATE)" t nil)
 (autoload 'c-guess-buffer-no-install "cc-guess" "\
 Guess the style on the whole current buffer; don't install it.
 
@@ -3805,8 +3383,7 @@ If given a prefix argument (or if the optional argument 
ACCUMULATE is
 non-nil) then the previous guess is extended, otherwise a new guess is
 made from scratch.
 
-\(fn &optional ACCUMULATE)" t nil)
-
+(fn &optional ACCUMULATE)" t nil)
 (autoload 'c-guess-region "cc-guess" "\
 Guess the style on the region and install it.
 
@@ -3816,8 +3393,7 @@ If given a prefix argument (or if the optional argument 
ACCUMULATE is
 non-nil) then the previous guess is extended, otherwise a new guess is
 made from scratch.
 
-\(fn START END &optional ACCUMULATE)" t nil)
-
+(fn START END &optional ACCUMULATE)" t nil)
 (autoload 'c-guess-region-no-install "cc-guess" "\
 Guess the style on the region; don't install it.
 
@@ -3841,41 +3417,33 @@ guess is made from scratch.
 Note that the larger the region to guess in, the slower the guessing.
 So you can limit the region with `c-guess-region-max'.
 
-\(fn START END &optional ACCUMULATE)" t nil)
-
+(fn START END &optional ACCUMULATE)" t nil)
 (autoload 'c-guess-install "cc-guess" "\
 Install the latest guessed style into the current buffer.
-\(This guessed style is a combination of `c-guess-guessed-basic-offset',
+(This guessed style is a combination of `c-guess-guessed-basic-offset',
 `c-guess-guessed-offsets-alist' and `c-offsets-alist'.)
 
 The style is entered into CC Mode's style system by
 `c-add-style'.  Its name is either STYLE-NAME, or a name based on
 the absolute file name of the file if STYLE-NAME is nil.
 
-\(fn &optional STYLE-NAME)" t nil)
-
+(fn &optional STYLE-NAME)" t nil)
 (register-definition-prefixes "cc-guess" '("c-guess-"))
 
-;;;***
 
-;;;### (autoloads nil "cc-langs" "progmodes/cc-langs.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-langs.el
 
 (register-definition-prefixes "cc-langs" '("c-"))
 
-;;;***
 
-;;;### (autoloads nil "cc-menus" "progmodes/cc-menus.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-menus.el
 
 (register-definition-prefixes "cc-menus" '("cc-imenu-"))
 
-;;;***
 
-;;;### (autoloads nil "cc-mode" "progmodes/cc-mode.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-mode.el
-(push (purecopy '(cc-mode 5 33 1)) package--builtin-versions)
 
+(push (purecopy '(cc-mode 5 33 1)) package--builtin-versions)
 (autoload 'c-initialize-cc-mode "cc-mode" "\
 Initialize CC Mode for use in the current buffer.
 If the optional NEW-STYLE-INIT is nil or left out then all necessary
@@ -3884,7 +3452,7 @@ only some basic setup is done, and a call to 
`c-init-language-vars' or
 `c-init-language-vars-for' is necessary too (which gives more
 control).  See \"cc-mode.el\" for more info.
 
-\(fn &optional NEW-STYLE-INIT)" nil nil)
+(fn &optional NEW-STYLE-INIT)" nil nil)
  (add-to-list 'auto-mode-alist '("\\.\\(cc\\|hh\\)\\'" . c++-mode))
  (add-to-list 'auto-mode-alist '("\\.[ch]\\(pp\\|xx\\|\\+\\+\\)\\'" . 
c++-mode))
  (add-to-list 'auto-mode-alist '("\\.\\(CC?\\|HH?\\)\\'" . c++-mode))
@@ -3894,7 +3462,6 @@ control).  See \"cc-mode.el\" for more info.
  (add-to-list 'auto-mode-alist '("\\.lex\\'" . c-mode))
  (add-to-list 'auto-mode-alist '("\\.i\\'" . c-mode))
  (add-to-list 'auto-mode-alist '("\\.ii\\'" . c++-mode))
-
 (autoload 'c-mode "cc-mode" "\
 Major mode for editing C code.
 
@@ -3911,8 +3478,7 @@ initialization, then `c-mode-hook'.
 Key bindings:
 \\{c-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'c-or-c++-mode "cc-mode" "\
 Analyze buffer and enable either C or C++ mode.
 
@@ -3924,7 +3490,6 @@ should be used.
 This function attempts to use file contents to determine whether
 the code is C or C++ and based on that chooses whether to enable
 `c-mode' or `c++-mode'." t nil)
-
 (autoload 'c++-mode "cc-mode" "\
 Major mode for editing C++ code.
 To submit a problem report, enter `\\[c-submit-bug-report]' from a
@@ -3941,9 +3506,8 @@ initialization, then `c++-mode-hook'.
 Key bindings:
 \\{c++-mode-map}
 
-\(fn)" t nil)
+(fn)" t nil)
  (add-to-list 'auto-mode-alist '("\\.m\\'" . objc-mode))
-
 (autoload 'objc-mode "cc-mode" "\
 Major mode for editing Objective C code.
 To submit a problem report, enter `\\[c-submit-bug-report]' from an
@@ -3960,9 +3524,8 @@ initialization, then `objc-mode-hook'.
 Key bindings:
 \\{objc-mode-map}
 
-\(fn)" t nil)
+(fn)" t nil)
  (add-to-list 'auto-mode-alist '("\\.java\\'" . java-mode))
-
 (autoload 'java-mode "cc-mode" "\
 Major mode for editing Java code.
 To submit a problem report, enter `\\[c-submit-bug-report]' from a
@@ -3979,9 +3542,8 @@ initialization, then `java-mode-hook'.
 Key bindings:
 \\{java-mode-map}
 
-\(fn)" t nil)
+(fn)" t nil)
  (add-to-list 'auto-mode-alist '("\\.idl\\'" . idl-mode))
-
 (autoload 'idl-mode "cc-mode" "\
 Major mode for editing CORBA's IDL, PSDL and CIDL code.
 To submit a problem report, enter `\\[c-submit-bug-report]' from an
@@ -3998,10 +3560,9 @@ initialization, then `idl-mode-hook'.
 Key bindings:
 \\{idl-mode-map}
 
-\(fn)" t nil)
+(fn)" t nil)
  (add-to-list 'auto-mode-alist '("\\.\\(u?lpc\\|pike\\|pmod\\(\\.in\\)?\\)\\'" 
. pike-mode))
  (add-to-list 'interpreter-mode-alist '("pike" . pike-mode))
-
 (autoload 'pike-mode "cc-mode" "\
 Major mode for editing Pike code.
 To submit a problem report, enter `\\[c-submit-bug-report]' from a
@@ -4018,13 +3579,12 @@ initialization, then `pike-mode-hook'.
 Key bindings:
 \\{pike-mode-map}
 
-\(fn)" t nil)
+(fn)" t nil)
  (add-to-list 'auto-mode-alist '("\\.awk\\'" . awk-mode))
  (add-to-list 'interpreter-mode-alist '("awk" . awk-mode))
  (add-to-list 'interpreter-mode-alist '("mawk" . awk-mode))
  (add-to-list 'interpreter-mode-alist '("nawk" . awk-mode))
  (add-to-list 'interpreter-mode-alist '("gawk" . awk-mode))
-
 (autoload 'awk-mode "cc-mode" "\
 Major mode for editing AWK code.
 To submit a problem report, enter `\\[c-submit-bug-report]' from an
@@ -4040,14 +3600,10 @@ initialization, then `awk-mode-hook'.
 Key bindings:
 \\{awk-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "cc-mode" '("awk-mode-map" "c++-mode-" "c-" 
"idl-mode-" "java-mode-" "objc-mode-" "pike-mode-"))
 
-;;;***
 
-;;;### (autoloads nil "cc-styles" "progmodes/cc-styles.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/cc-styles.el
 
 (autoload 'c-set-style "cc-styles" "\
@@ -4073,8 +3629,7 @@ calls c-set-style internally in this way whilst 
initializing a buffer; if
 c-set-style is called like this from anywhere else, it will usually behave as
 a null operation.
 
-\(fn STYLENAME &optional DONT-OVERRIDE)" t nil)
-
+(fn STYLENAME &optional DONT-OVERRIDE)" t nil)
 (autoload 'c-add-style "cc-styles" "\
 Add a style to `c-style-alist', or update an existing one.
 STYLE is a string identifying the style to add or update.  DESCRIPTION
@@ -4086,43 +3641,35 @@ See the variable `c-style-alist' for the semantics of 
BASESTYLE,
 VARIABLE and VALUE.  This function also sets the current style to
 STYLE using `c-set-style' if the optional SET-P flag is non-nil.
 
-\(fn STYLE DESCRIPTION &optional SET-P)" t nil)
-
+(fn STYLE DESCRIPTION &optional SET-P)" t nil)
 (autoload 'c-set-offset "cc-styles" "\
 Change the value of a syntactic element symbol in `c-offsets-alist'.
 SYMBOL is the syntactic element symbol to change and OFFSET is the new
 offset for that syntactic element.  The optional argument is not used
 and exists only for compatibility reasons.
 
-\(fn SYMBOL OFFSET &optional IGNORED)" t nil)
-
+(fn SYMBOL OFFSET &optional IGNORED)" t nil)
 (register-definition-prefixes "cc-styles" '("c-" "cc-choose-style-for-mode"))
 
-;;;***
 
-;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-vars.el
+
 (put 'c-basic-offset 'safe-local-variable 'integerp)
 (put 'c-backslash-column 'safe-local-variable 'integerp)
 (put 'c-file-style 'safe-local-variable 'string-or-null-p)
-
 (register-definition-prefixes "cc-vars" '("awk-mode-hook" "c++-" "c-" 
"defcustom-c-stylevar" "idl-" "java-" "objc-" "pike-"))
 
-;;;***
 
-;;;### (autoloads nil "ccl" "international/ccl.el" (0 0 0 0))
 ;;; Generated autoloads from international/ccl.el
 
 (autoload 'ccl-compile "ccl" "\
 Return the compiled code of CCL-PROGRAM as a vector of integers.
 
-\(fn CCL-PROGRAM)" nil nil)
-
+(fn CCL-PROGRAM)" nil nil)
 (autoload 'ccl-dump "ccl" "\
 Disassemble compiled CCL-code CODE.
 
-\(fn CODE)" nil nil)
-
+(fn CODE)" nil nil)
 (autoload 'declare-ccl-program "ccl" "\
 Declare NAME as a name of CCL program.
 
@@ -4134,8 +3681,7 @@ execution.
 
 Optional arg VECTOR is a compiled CCL code of the CCL program.
 
-\(fn NAME &optional VECTOR)" nil t)
-
+(fn NAME &optional VECTOR)" nil t)
 (autoload 'define-ccl-program "ccl" "\
 Set NAME the compiled code of CCL-PROGRAM.
 
@@ -4380,12 +3926,9 @@ MAP-IDs := MAP-ID ...
 MAP-SET := MAP-IDs | (MAP-IDs) MAP-SET
 MAP-ID := integer
 
-\(fn NAME CCL-PROGRAM &optional DOC)" nil t)
-
+(fn NAME CCL-PROGRAM &optional DOC)" nil t)
 (function-put 'define-ccl-program 'doc-string-elt '3)
-
 (function-put 'define-ccl-program 'lisp-indent-function 'defun)
-
 (autoload 'check-ccl-program "ccl" "\
 Check validity of CCL-PROGRAM.
 If CCL-PROGRAM is a symbol denoting a CCL program, return
@@ -4393,21 +3936,17 @@ CCL-PROGRAM, else return nil.
 If CCL-PROGRAM is a vector and optional arg NAME (symbol) is supplied,
 register CCL-PROGRAM by name NAME, and return NAME.
 
-\(fn CCL-PROGRAM &optional NAME)" nil t)
-
+(fn CCL-PROGRAM &optional NAME)" nil t)
 (autoload 'ccl-execute-with-args "ccl" "\
 Execute CCL-PROGRAM with registers initialized by the remaining args.
 The return value is a vector of resulting CCL registers.
 
 See the documentation of `define-ccl-program' for the detail of CCL program.
 
-\(fn CCL-PROG &rest ARGS)" nil nil)
-
+(fn CCL-PROG &rest ARGS)" nil nil)
 (register-definition-prefixes "ccl" '("ccl-"))
 
-;;;***
 
-;;;### (autoloads nil "cconv" "emacs-lisp/cconv.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/cconv.el
 
 (autoload 'cconv-closure-convert "cconv" "\
@@ -4417,63 +3956,44 @@ Main entry point for closure conversion.
 
 Returns a form where all lambdas don't have any free variables.
 
-\(fn FORM)" nil nil)
-
+(fn FORM)" nil nil)
 (register-definition-prefixes "cconv" '("cconv-"))
 
-;;;***
 
-;;;### (autoloads nil "cdl" "cdl.el" (0 0 0 0))
 ;;; Generated autoloads from cdl.el
 
 (register-definition-prefixes "cdl" '("cdl-"))
 
-;;;***
 
-;;;### (autoloads nil "cedet" "cedet/cedet.el" (0 0 0 0))
 ;;; Generated autoloads from cedet/cedet.el
-(push (purecopy '(cedet 2 0)) package--builtin-versions)
 
+(push (purecopy '(cedet 2 0)) package--builtin-versions)
 (register-definition-prefixes "cedet" '("cedet-"))
 
-;;;***
 
-;;;### (autoloads nil "cedet-cscope" "cedet/cedet-cscope.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from cedet/cedet-cscope.el
 
 (register-definition-prefixes "cedet-cscope" '("cedet-cscope-"))
 
-;;;***
 
-;;;### (autoloads nil "cedet-files" "cedet/cedet-files.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from cedet/cedet-files.el
 
 (register-definition-prefixes "cedet-files" '("cedet-"))
 
-;;;***
 
-;;;### (autoloads nil "cedet-global" "cedet/cedet-global.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from cedet/cedet-global.el
 
 (register-definition-prefixes "cedet-global" '("cedet-g"))
 
-;;;***
 
-;;;### (autoloads nil "cedet-idutils" "cedet/cedet-idutils.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from cedet/cedet-idutils.el
 
 (register-definition-prefixes "cedet-idutils" '("cedet-idutils-"))
 
-;;;***
 
-;;;### (autoloads nil "cfengine" "progmodes/cfengine.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cfengine.el
-(push (purecopy '(cfengine 1 4)) package--builtin-versions)
 
+(push (purecopy '(cfengine 1 4)) package--builtin-versions)
 (autoload 'cfengine3-mode "cfengine" "\
 Major mode for editing CFEngine3 input.
 There are no special keybindings by default.
@@ -4481,8 +4001,7 @@ There are no special keybindings by default.
 Action blocks are treated as defuns, i.e. \\[beginning-of-defun] moves
 to the action header.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'cfengine2-mode "cfengine" "\
 Major mode for editing CFEngine2 input.
 There are no special keybindings by default.
@@ -4490,16 +4009,12 @@ There are no special keybindings by default.
 Action blocks are treated as defuns, i.e. \\[beginning-of-defun] moves
 to the action header.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'cfengine-auto-mode "cfengine" "\
 Choose `cfengine2-mode' or `cfengine3-mode' by buffer contents." t nil)
-
 (register-definition-prefixes "cfengine" '("cfengine"))
 
-;;;***
 
-;;;### (autoloads nil "char-fold" "char-fold.el" (0 0 0 0))
 ;;; Generated autoloads from char-fold.el
 
 (autoload 'char-fold-to-regexp "char-fold" "\
@@ -4520,42 +4035,37 @@ just return the result of calling `regexp-quote' on 
STRING.
 FROM is for internal use.  It specifies an index in the STRING
 from which to start.
 
-\(fn STRING &optional LAX FROM)" nil nil)
-
+(fn STRING &optional LAX FROM)" nil nil)
 (register-definition-prefixes "char-fold" '("char-fold-"))
 
-;;;***
 
-;;;### (autoloads nil "chart" "emacs-lisp/chart.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/chart.el
 
 (register-definition-prefixes "chart" '("chart"))
 
-;;;***
 
-;;;### (autoloads nil "check-declare" "emacs-lisp/check-declare.el"
-;;;;;;  (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/chart.el
+
+(register-definition-prefixes "semantic/chart" '("semantic-chart-"))
+
+
 ;;; Generated autoloads from emacs-lisp/check-declare.el
 
 (autoload 'check-declare-file "check-declare" "\
 Check veracity of all `declare-function' statements in FILE.
 See `check-declare-directory' for more information.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'check-declare-directory "check-declare" "\
 Check veracity of all `declare-function' statements under directory ROOT.
 Returns non-nil if any false statements are found.
 
-\(fn ROOT)" t nil)
-
+(fn ROOT)" t nil)
 (register-definition-prefixes "check-declare" '("check-declare-"))
 
-;;;***
 
-;;;### (autoloads nil "checkdoc" "emacs-lisp/checkdoc.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from emacs-lisp/checkdoc.el
+
 (put 'checkdoc-force-docstrings-flag 'safe-local-variable #'booleanp)
 (put 'checkdoc-force-history-flag 'safe-local-variable #'booleanp)
 (put 'checkdoc-permit-comma-termination-flag 'safe-local-variable #'booleanp)
@@ -4564,19 +4074,16 @@ Returns non-nil if any false statements are found.
 (put 'checkdoc-arguments-in-order-flag 'safe-local-variable #'booleanp)
 (put 'checkdoc-verb-check-experimental-flag 'safe-local-variable #'booleanp)
 (put 'checkdoc-symbol-words 'safe-local-variable #'checkdoc-list-of-strings-p)
-
 (autoload 'checkdoc-list-of-strings-p "checkdoc" "\
 Return t when OBJ is a list of strings.
 
-\(fn OBJ)" nil nil)
+(fn OBJ)" nil nil)
 (put 'checkdoc-proper-noun-regexp 'safe-local-variable 'stringp)
 (put 'checkdoc-common-verbs-regexp 'safe-local-variable 'stringp)
-
 (autoload 'checkdoc "checkdoc" "\
 Interactively check the entire buffer for style errors.
 The current status of the check will be displayed in a buffer which
 the users will view as each check is completed." '(emacs-lisp-mode) nil)
-
 (autoload 'checkdoc-interactive "checkdoc" "\
 Interactively check the current buffer for doc string errors.
 Prefix argument START-HERE will start the checking from the current
@@ -4586,8 +4093,7 @@ errors.  Does not check for comment or space warnings.
 Optional argument SHOWSTATUS indicates that we should update the
 checkdoc status window instead of the usual behavior.
 
-\(fn &optional START-HERE SHOWSTATUS)" '(emacs-lisp-mode) nil)
-
+(fn &optional START-HERE SHOWSTATUS)" '(emacs-lisp-mode) nil)
 (autoload 'checkdoc-message-interactive "checkdoc" "\
 Interactively check the current buffer for message string errors.
 Prefix argument START-HERE will start the checking from the current
@@ -4597,27 +4103,23 @@ errors.  Does not check for comment or space warnings.
 Optional argument SHOWSTATUS indicates that we should update the
 checkdoc status window instead of the usual behavior.
 
-\(fn &optional START-HERE SHOWSTATUS)" '(emacs-lisp-mode) nil)
-
+(fn &optional START-HERE SHOWSTATUS)" '(emacs-lisp-mode) nil)
 (autoload 'checkdoc-eval-current-buffer "checkdoc" "\
 Evaluate and check documentation for the current buffer.
 Evaluation is done first because good documentation for something that
 doesn't work is just not useful.  Comments, doc strings, and rogue
 spacing are all verified." t nil)
-
 (autoload 'checkdoc-current-buffer "checkdoc" "\
 Check current buffer for document, comment, error style, and rogue spaces.
 With a prefix argument (in Lisp, the argument TAKE-NOTES),
 store all errors found in a warnings buffer,
 otherwise stop after the first error.
 
-\(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
-
+(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
 (autoload 'checkdoc-file "checkdoc" "\
 Check FILE for document, comment, error style, and rogue spaces.
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (autoload 'checkdoc-start "checkdoc" "\
 Start scanning the current buffer for documentation string style errors.
 Only documentation strings are checked.
@@ -4625,23 +4127,20 @@ Use `checkdoc-continue' to continue checking if an 
error cannot be fixed.
 Prefix argument TAKE-NOTES means to collect all the warning messages into
 a separate buffer.
 
-\(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
-
+(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
 (autoload 'checkdoc-continue "checkdoc" "\
 Find the next doc string in the current buffer which has a style error.
 Prefix argument TAKE-NOTES means to continue through the whole
 buffer and save warnings in a separate buffer.
 
-\(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
-
+(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
 (autoload 'checkdoc-comments "checkdoc" "\
 Find missing comment sections in the current Emacs Lisp file.
 Prefix argument TAKE-NOTES non-nil means to save warnings in a
 separate buffer.  Otherwise print a message.  This returns the error
 if there is one.
 
-\(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
-
+(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
 (autoload 'checkdoc-rogue-spaces "checkdoc" "\
 Find extra spaces at the end of lines in the current file.
 Prefix argument TAKE-NOTES non-nil means to save warnings in a
@@ -4649,20 +4148,17 @@ separate buffer.  Otherwise print a message.  This 
returns the error
 if there is one.
 Optional argument INTERACT permits more interactive fixing.
 
-\(fn &optional TAKE-NOTES INTERACT)" '(emacs-lisp-mode) nil)
-
+(fn &optional TAKE-NOTES INTERACT)" '(emacs-lisp-mode) nil)
 (autoload 'checkdoc-message-text "checkdoc" "\
 Scan the buffer for occurrences of the error function, and verify text.
 Optional argument TAKE-NOTES causes all errors to be logged.
 
-\(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
-
+(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
 (autoload 'checkdoc-eval-defun "checkdoc" "\
 Evaluate the current form with `eval-defun' and check its documentation.
 Evaluation is done first so the form will be read before the
 documentation is checked.  If there is a documentation error, then the display
 of what was evaluated will be overwritten by the diagnostic message." t nil)
-
 (autoload 'checkdoc-defun "checkdoc" "\
 Examine the doc string of the function or variable under point.
 Call `error' if the doc string has problems.  If NO-ERROR is
@@ -4670,61 +4166,50 @@ non-nil, then do not call error, but call `message' 
instead.
 If the doc string passes the test, then check the function for rogue white
 space at the end of each line.
 
-\(fn &optional NO-ERROR)" t nil)
-
+(fn &optional NO-ERROR)" t nil)
 (autoload 'checkdoc-dired "checkdoc" "\
 In Dired, run `checkdoc' on marked files.
 Skip anything that doesn't have the Emacs Lisp library file
 extension (\".el\").
 When called from Lisp, FILES is a list of filenames.
 
-\(fn FILES)" '(dired-mode) nil)
-
+(fn FILES)" '(dired-mode) nil)
 (autoload 'checkdoc-ispell "checkdoc" "\
 Check the style and spelling of everything interactively.
 Calls `checkdoc' with spell-checking turned on.
 Prefix argument is the same as for `checkdoc'." t nil)
-
 (autoload 'checkdoc-ispell-current-buffer "checkdoc" "\
 Check the style and spelling of the current buffer.
 Calls `checkdoc-current-buffer' with spell-checking turned on.
 Prefix argument is the same as for `checkdoc-current-buffer'." t nil)
-
 (autoload 'checkdoc-ispell-interactive "checkdoc" "\
 Check the style and spelling of the current buffer interactively.
 Calls `checkdoc-interactive' with spell-checking turned on.
 Prefix argument is the same as for `checkdoc-interactive'." t nil)
-
 (autoload 'checkdoc-ispell-message-interactive "checkdoc" "\
 Check the style and spelling of message text interactively.
 Calls `checkdoc-message-interactive' with spell-checking turned on.
 Prefix argument is the same as for `checkdoc-message-interactive'." t nil)
-
 (autoload 'checkdoc-ispell-message-text "checkdoc" "\
 Check the style and spelling of message text interactively.
 Calls `checkdoc-message-text' with spell-checking turned on.
 Prefix argument is the same as for `checkdoc-message-text'." t nil)
-
 (autoload 'checkdoc-ispell-start "checkdoc" "\
 Check the style and spelling of the current buffer.
 Calls `checkdoc-start' with spell-checking turned on.
 Prefix argument is the same as for `checkdoc-start'." t nil)
-
 (autoload 'checkdoc-ispell-continue "checkdoc" "\
 Check the style and spelling of the current buffer after point.
 Calls `checkdoc-continue' with spell-checking turned on.
 Prefix argument is the same as for `checkdoc-continue'." t nil)
-
 (autoload 'checkdoc-ispell-comments "checkdoc" "\
 Check the style and spelling of the current buffer's comments.
 Calls `checkdoc-comments' with spell-checking turned on.
 Prefix argument is the same as for `checkdoc-comments'." t nil)
-
 (autoload 'checkdoc-ispell-defun "checkdoc" "\
 Check the style and spelling of the current defun with Ispell.
 Calls `checkdoc-defun' with spell-checking turned on.
 Prefix argument is the same as for `checkdoc-defun'." t nil)
-
 (autoload 'checkdoc-minor-mode "checkdoc" "\
 Toggle automatic docstring checking (Checkdoc minor mode).
 
@@ -4748,52 +4233,39 @@ evaluate `checkdoc-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'checkdoc-package-keywords "checkdoc" "\
 Find package keywords that aren't in `finder-known-keywords'." t nil)
-
 (register-definition-prefixes "checkdoc" '("checkdoc-"))
 
-;;;***
 
-;;;### (autoloads nil "china-util" "language/china-util.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from language/china-util.el
 
 (autoload 'decode-hz-region "china-util" "\
 Decode HZ/ZW encoded text in the current region.
 Return the length of resulting text.
 
-\(fn BEG END)" t nil)
-
+(fn BEG END)" t nil)
 (autoload 'decode-hz-buffer "china-util" "\
 Decode HZ/ZW encoded text in the current buffer." t nil)
-
 (autoload 'encode-hz-region "china-util" "\
 Encode the text in the current region to HZ.
 Return the length of resulting text.
 
-\(fn BEG END)" t nil)
-
+(fn BEG END)" t nil)
 (autoload 'encode-hz-buffer "china-util" "\
 Encode the text in the current buffer to HZ." t nil)
-
 (autoload 'post-read-decode-hz "china-util" "\
 
 
-\(fn LEN)" nil nil)
-
+(fn LEN)" nil nil)
 (autoload 'pre-write-encode-hz "china-util" "\
 
 
-\(fn FROM TO)" nil nil)
-
+(fn FROM TO)" nil nil)
 (register-definition-prefixes "china-util" '("decode-hz-line-continuation" 
"hz-" "hz/zw-start-gb" "iso2022-" "zw-start-gb"))
 
-;;;***
 
-;;;### (autoloads nil "chistory" "chistory.el" (0 0 0 0))
 ;;; Generated autoloads from chistory.el
 
 (autoload 'repeat-matching-complex-command "chistory" "\
@@ -4803,8 +4275,7 @@ a form for evaluation.  If PATTERN is empty (or nil), 
every form in the
 command history is offered.  The form is placed in the minibuffer for
 editing and the result is evaluated.
 
-\(fn &optional PATTERN)" t nil)
-
+(fn &optional PATTERN)" t nil)
 (autoload 'list-command-history "chistory" "\
 List history of commands that used the minibuffer.
 The number of commands listed is controlled by `list-command-history-max'.
@@ -4812,7 +4283,6 @@ Calls value of `list-command-history-filter' (if non-nil) 
on each history
 element to judge if that element should be excluded from the list.
 
 The buffer is left in Command History mode." t nil)
-
 (autoload 'command-history "chistory" "\
 Examine commands from variable `command-history' in a buffer.
 The number of commands listed is controlled by `list-command-history-max'.
@@ -4825,13 +4295,14 @@ and digits provide prefix arguments.  Tab does not 
indent.
 
 This command always recompiles the Command History listing
 and runs the normal hook `command-history-hook'." t nil)
-
 (register-definition-prefixes "chistory" '("command-history-" 
"default-command-history-filter" "list-command-history-"))
 
-;;;***
 
-;;;### (autoloads nil "cl-font-lock" "progmodes/cl-font-lock.el"
-;;;;;;  (0 0 0 0))
+;;; Generated autoloads from emacs-lisp/cl-extra.el
+
+(register-definition-prefixes "cl-extra" '("cl-"))
+
+
 ;;; Generated autoloads from progmodes/cl-font-lock.el
 
 (defvar cl-font-lock-built-in-mode nil "\
@@ -4841,9 +4312,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `cl-font-lock-built-in-mode'.")
-
 (custom-autoload 'cl-font-lock-built-in-mode "cl-font-lock" nil)
-
 (autoload 'cl-font-lock-built-in-mode "cl-font-lock" "\
 Highlight built-in functions, variables, and types in `lisp-mode'.
 
@@ -4862,17 +4331,13 @@ evaluate `(default-value 
\\='cl-font-lock-built-in-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "cl-font-lock" '("cl-font-lock-"))
 
-;;;***
 
-;;;### (autoloads nil "cl-generic" "emacs-lisp/cl-generic.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/cl-generic.el
-(push (purecopy '(cl-generic 1 0)) package--builtin-versions)
 
+(push (purecopy '(cl-generic 1 0)) package--builtin-versions)
 (autoload 'cl-defgeneric "cl-generic" "\
 Create a generic function NAME.
 DOC-STRING is the base documentation for this class.  A generic
@@ -4886,17 +4351,13 @@ OPTIONS-AND-METHODS currently understands:
 - (:method [QUALIFIERS...] ARGS &rest BODY)
 DEFAULT-BODY, if present, is used as the body of a default method.
 
-\(fn NAME ARGS [DOC-STRING] [OPTIONS-AND-METHODS...] &rest DEFAULT-BODY)" nil 
t)
-
+(fn NAME ARGS [DOC-STRING] [OPTIONS-AND-METHODS...] &rest DEFAULT-BODY)" nil t)
 (function-put 'cl-defgeneric 'lisp-indent-function '2)
-
 (function-put 'cl-defgeneric 'doc-string-elt '3)
-
 (autoload 'cl-generic-define "cl-generic" "\
 
 
-\(fn NAME ARGS OPTIONS)" nil nil)
-
+(fn NAME ARGS OPTIONS)" nil nil)
 (autoload 'cl-defmethod "cl-generic" "\
 Define a new method for generic function NAME.
 This defines an implementation of NAME to use for invocations
@@ -4927,7 +4388,7 @@ the method is combined with other methods, including:
    :around  - Method will be called around everything else
 The absence of QUALIFIER means this is a \"primary\" method.
 The set of acceptable qualifiers and their meaning is defined
-\(and can be extended) by the methods of `cl-generic-combine-methods'.
+(and can be extended) by the methods of `cl-generic-combine-methods'.
 
 ARGS can also include so-called context specializers, introduced by
 `&context' (which should appear right after the mandatory arguments,
@@ -4936,30 +4397,22 @@ EXPR is an Elisp expression whose value should match 
TYPE for the
 method to be applicable.
 
 The set of acceptable TYPEs (also called \"specializers\") is defined
-\(and can be extended) by the various methods of `cl-generic-generalizers'.
-
-\(fn NAME [EXTRA] [QUALIFIER] ARGS &rest [DOCSTRING] BODY)" nil t)
+(and can be extended) by the various methods of `cl-generic-generalizers'.
 
+(fn NAME [EXTRA] [QUALIFIER] ARGS &rest [DOCSTRING] BODY)" nil t)
 (function-put 'cl-defmethod 'doc-string-elt 'cl--defmethod-doc-pos)
-
 (function-put 'cl-defmethod 'lisp-indent-function 'defun)
-
 (autoload 'cl-generic-define-method "cl-generic" "\
 
 
-\(fn NAME QUALIFIERS ARGS CALL-CON FUNCTION)" nil nil)
-
+(fn NAME QUALIFIERS ARGS CALL-CON FUNCTION)" nil nil)
 (autoload 'cl-find-method "cl-generic" "\
 
 
-\(fn GENERIC QUALIFIERS SPECIALIZERS)" nil nil)
-
+(fn GENERIC QUALIFIERS SPECIALIZERS)" nil nil)
 (register-definition-prefixes "cl-generic" '("cl-"))
 
-;;;***
 
-;;;### (autoloads nil "cl-indent" "emacs-lisp/cl-indent.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emacs-lisp/cl-indent.el
 
 (autoload 'common-lisp-indent-function "cl-indent" "\
@@ -5027,7 +4480,7 @@ property are:
     specifies how to indent the associated argument.
 
 For example, the function `case' has an indent property
-\(4 &rest (&whole 2 &rest 1)), meaning:
+(4 &rest (&whole 2 &rest 1)), meaning:
   * indent the first argument by 4.
   * arguments after the first should be lists, and there may be any number
     of them.  The first list element has an offset of 2, all the rest
@@ -5038,18 +4491,15 @@ If the current mode is actually `emacs-lisp-mode', look 
for a
 at `common-lisp-indent-function' and, if set, use its value
 instead.
 
-\(fn INDENT-POINT STATE)" nil nil)
-
+(fn INDENT-POINT STATE)" nil nil)
 (register-definition-prefixes "cl-indent" '("common-lisp-" "lisp-"))
 
-;;;***
 
-;;;### (autoloads nil "cl-lib" "emacs-lisp/cl-lib.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/cl-lib.el
-(push (purecopy '(cl-lib 1 0)) package--builtin-versions)
-
-(define-obsolete-variable-alias 'custom-print-functions 
'cl-custom-print-functions "24.3")
 
+(push (purecopy '(cl-lib 1 0)) package--builtin-versions)
+(define-obsolete-variable-alias 'custom-print-functions 
'cl-custom-print-functions "\
+24.3")
 (defvar cl-custom-print-functions nil "\
 This is a list of functions that format user objects for printing.
 Each function is called in turn with three arguments: the object, the
@@ -5059,7 +4509,6 @@ printer proceeds to the next function on the list.
 
 This variable is not used at present, but it is defined in hopes that
 a future Emacs interpreter will be able to use it.")
-
 (autoload 'cl-incf "cl-lib" "\
 Increment PLACE by X (1 by default).
 PLACE may be a symbol, or any generalized variable allowed by `setf'.
@@ -5068,8 +4517,7 @@ The return value is the incremented value of PLACE.
 If X is specified, it should be an expression that should
 evaluate to a number.
 
-\(fn PLACE &optional X)" nil t)
-
+(fn PLACE &optional X)" nil t)
 (defvar cl-old-struct-compat-mode nil "\
 Non-nil if Cl-Old-Struct-Compat mode is enabled.
 See the `cl-old-struct-compat-mode' command
@@ -5077,9 +4525,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `cl-old-struct-compat-mode'.")
-
 (custom-autoload 'cl-old-struct-compat-mode "cl-lib" nil)
-
 (autoload 'cl-old-struct-compat-mode "cl-lib" "\
 Enable backward compatibility with old-style structs.
 
@@ -5102,32 +4548,31 @@ evaluate `(default-value 
\\='cl-old-struct-compat-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "cl-lib" '("cl-"))
 
-;;;***
 
-;;;### (autoloads nil "cl-print" "emacs-lisp/cl-print.el" (0 0 0
-;;;;;;  0))
+;;; Generated autoloads from emacs-lisp/cl-macs.el
+
+(register-definition-prefixes "cl-macs" '("cl-" "foo" "function-form"))
+
+
 ;;; Generated autoloads from emacs-lisp/cl-print.el
-(push (purecopy '(cl-print 1 0)) package--builtin-versions)
 
+(push (purecopy '(cl-print 1 0)) package--builtin-versions)
 (autoload 'cl-print-object "cl-print" "\
 Dispatcher to print OBJECT on STREAM according to its type.
 You can add methods to it to customize the output.
 But if you just want to print something, don't call this directly:
 call other entry points instead, such as `cl-prin1'.
 
-\(fn OBJECT STREAM)" nil nil)
-
+(fn OBJECT STREAM)" nil nil)
 (autoload 'cl-print-expand-ellipsis "cl-print" "\
 Print the expansion of an ellipsis to STREAM.
 VALUE should be the value of the `cl-print-ellipsis' text property
 which was attached to the ellipsis by `cl-prin1'.
 
-\(fn VALUE STREAM)" nil nil)
-
+(fn VALUE STREAM)" nil nil)
 (autoload 'cl-prin1 "cl-print" "\
 Print OBJECT on STREAM according to its type.
 Output is further controlled by the variables
@@ -5135,13 +4580,11 @@ Output is further controlled by the variables
 variables for the standard printing functions.  See Info
 node `(elisp)Output Variables'.
 
-\(fn OBJECT &optional STREAM)" nil nil)
-
+(fn OBJECT &optional STREAM)" nil nil)
 (autoload 'cl-prin1-to-string "cl-print" "\
 Return a string containing the `cl-prin1'-printed representation of OBJECT.
 
-\(fn OBJECT)" nil nil)
-
+(fn OBJECT)" nil nil)
 (autoload 'cl-print-to-string-with-limit "cl-print" "\
 Return a string containing a printed representation of VALUE.
 Attempt to get the length of the returned string under LIMIT
@@ -5158,13 +4601,15 @@ this function with `cl-prin1-expand-ellipsis' to expand 
an
 ellipsis, abbreviating the expansion to stay within a size
 limit.
 
-\(fn PRINT-FUNCTION VALUE LIMIT)" nil nil)
-
+(fn PRINT-FUNCTION VALUE LIMIT)" nil nil)
 (register-definition-prefixes "cl-print" '("cl-print-" "help-byte-code"))
 
-;;;***
 
-;;;### (autoloads nil "cmacexp" "progmodes/cmacexp.el" (0 0 0 0))
+;;; Generated autoloads from emacs-lisp/cl-seq.el
+
+(register-definition-prefixes "cl-seq" '("cl--"))
+
+
 ;;; Generated autoloads from progmodes/cmacexp.el
 
 (autoload 'c-macro-expand "cmacexp" "\
@@ -5180,13 +4625,10 @@ otherwise use `c-macro-cppflags'.
 Noninteractive args are START, END, SUBST.
 For use inside Lisp programs, see also `c-macro-expansion'.
 
-\(fn START END SUBST)" t nil)
-
+(fn START END SUBST)" t nil)
 (register-definition-prefixes "cmacexp" '("c-macro-"))
 
-;;;***
 
-;;;### (autoloads nil "cmuscheme" "cmuscheme.el" (0 0 0 0))
 ;;; Generated autoloads from cmuscheme.el
 
 (autoload 'run-scheme "cmuscheme" "\
@@ -5200,15 +4642,12 @@ Note that this may lose due to a timing error if the 
Scheme processor
 discards input when it starts up.
 Runs the hook `inferior-scheme-mode-hook' (after the `comint-mode-hook'
 is run).
-\(Type \\[describe-mode] in the process buffer for a list of commands.)
-
-\(fn CMD)" t nil)
+(Type \\[describe-mode] in the process buffer for a list of commands.)
 
+(fn CMD)" t nil)
 (register-definition-prefixes "cmuscheme" '("cmuscheme-load-hook" 
"inferior-scheme-" "scheme-" "switch-to-scheme"))
 
-;;;***
 
-;;;### (autoloads nil "color" "color.el" (0 0 0 0))
 ;;; Generated autoloads from color.el
 
 (autoload 'color-name-to-rgb "color" "\
@@ -5216,6 +4655,10 @@ Convert COLOR string to a list of normalized RGB 
components.
 COLOR should be a color name (e.g. \"white\") or an RGB triplet
 string (e.g. \"#ffff1122eecc\").
 
+COLOR can also be the symbol `unspecified' or one of the strings
+\"unspecified-fg\" or \"unspecified-bg\", in which case the
+return value is nil.
+
 Normally the return value is a list of three floating-point
 numbers, (RED GREEN BLUE), each between 0.0 and 1.0 inclusive.
 
@@ -5223,13 +4666,10 @@ Optional argument FRAME specifies the frame where the 
color is to be
 displayed.  If FRAME is omitted or nil, use the selected frame.
 If FRAME cannot display COLOR, return nil.
 
-\(fn COLOR &optional FRAME)" nil nil)
-
+(fn COLOR &optional FRAME)" nil nil)
 (register-definition-prefixes "color" '("color-"))
 
-;;;***
 
-;;;### (autoloads nil "comint" "comint.el" (0 0 0 0))
 ;;; Generated autoloads from comint.el
 
 (defvar comint-output-filter-functions '(ansi-color-process-output 
comint-postoutput-scroll-to-bottom comint-watch-for-password-prompt) "\
@@ -5244,7 +4684,6 @@ See also `comint-preoutput-filter-functions'.
 
 You can use `add-hook' to add functions to this list
 either globally or locally.")
-
 (autoload 'make-comint-in-buffer "comint" "\
 Make a Comint process NAME in BUFFER, running PROGRAM.
 If BUFFER is nil, it defaults to NAME surrounded by `*'s.
@@ -5264,8 +4703,7 @@ If PROGRAM is a string, any more args are arguments to 
PROGRAM.
 
 Return the (possibly newly created) process buffer.
 
-\(fn NAME BUFFER PROGRAM &optional STARTFILE &rest SWITCHES)" nil nil)
-
+(fn NAME BUFFER PROGRAM &optional STARTFILE &rest SWITCHES)" nil nil)
 (autoload 'make-comint "comint" "\
 Make a Comint process NAME in a buffer, running PROGRAM.
 The name of the buffer is made by surrounding NAME with `*'s.
@@ -5280,8 +4718,7 @@ If PROGRAM is a string, any more args are arguments to 
PROGRAM.
 
 Returns the (possibly newly created) process buffer.
 
-\(fn NAME PROGRAM &optional STARTFILE &rest SWITCHES)" nil nil)
-
+(fn NAME PROGRAM &optional STARTFILE &rest SWITCHES)" nil nil)
 (autoload 'comint-run "comint" "\
 Run PROGRAM in a Comint buffer and switch to that buffer.
 
@@ -5294,79 +4731,66 @@ hooks on this symbol are run in the buffer.
 
 See `make-comint' and `comint-exec'.
 
-\(fn PROGRAM &optional SWITCHES)" t nil)
-
+(fn PROGRAM &optional SWITCHES)" t nil)
 (function-put 'comint-run 'interactive-only 'make-comint)
-
 (defvar comint-file-name-prefix (purecopy "") "\
 Prefix prepended to absolute file names taken from process input.
 This is used by Comint's and shell's completion functions, and by shell's
 directory tracking functions.")
-
 (autoload 'comint-redirect-send-command "comint" "\
 Send COMMAND to process in current buffer, with output to OUTPUT-BUFFER.
 With prefix arg ECHO, echo output in process buffer.
 
 If NO-DISPLAY is non-nil, do not show the output buffer.
 
-\(fn COMMAND OUTPUT-BUFFER ECHO &optional NO-DISPLAY)" t nil)
-
+(fn COMMAND OUTPUT-BUFFER ECHO &optional NO-DISPLAY)" t nil)
 (autoload 'comint-redirect-send-command-to-process "comint" "\
 Send COMMAND to PROCESS, with output to OUTPUT-BUFFER.
 With prefix arg, echo output in process buffer.
 
 If NO-DISPLAY is non-nil, do not show the output buffer.
 
-\(fn COMMAND OUTPUT-BUFFER PROCESS ECHO &optional NO-DISPLAY)" t nil)
-
+(fn COMMAND OUTPUT-BUFFER PROCESS ECHO &optional NO-DISPLAY)" t nil)
 (autoload 'comint-redirect-results-list "comint" "\
 Send COMMAND to current process.
 Return a list of expressions in the output which match REGEXP.
 REGEXP-GROUP is the regular expression group in REGEXP to use.
 
-\(fn COMMAND REGEXP REGEXP-GROUP)" nil nil)
-
+(fn COMMAND REGEXP REGEXP-GROUP)" nil nil)
 (autoload 'comint-redirect-results-list-from-process "comint" "\
 Send COMMAND to PROCESS.
 Return a list of expressions in the output which match REGEXP.
 REGEXP-GROUP is the regular expression group in REGEXP to use.
 
-\(fn PROCESS COMMAND REGEXP REGEXP-GROUP)" nil nil)
-
+(fn PROCESS COMMAND REGEXP REGEXP-GROUP)" nil nil)
 (register-definition-prefixes "comint" '("comint-"))
 
-;;;***
 
-;;;### (autoloads nil "comp" "emacs-lisp/comp.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/comp.el
-(put 'no-native-compile 'safe-local-variable 'booleanp)
 
+(put 'no-native-compile 'safe-local-variable 'booleanp)
 (autoload 'comp-subr-trampoline-install "comp" "\
 Make SUBR-NAME effectively advice-able when called from native code.
 
-\(fn SUBR-NAME)" nil nil)
-
+(fn SUBR-NAME)" nil nil)
 (autoload 'comp-c-func-name "comp" "\
 Given NAME, return a name suitable for the native code.
 Add PREFIX in front of it.  If FIRST is not nil, pick the first
 available name ignoring compilation context and potential name
 clashes.
 
-\(fn NAME PREFIX &optional FIRST)" nil nil)
-
+(fn NAME PREFIX &optional FIRST)" nil nil)
 (autoload 'comp-clean-up-stale-eln "comp" "\
 Remove all FILE*.eln* files found in `native-comp-eln-load-path'.
 The files to be removed are those produced from the original source
 filename (including FILE).
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (autoload 'comp-lookup-eln "comp" "\
 Given a Lisp source FILENAME return the corresponding .eln file if found.
 Search happens in `native-comp-eln-load-path'.
 
-\(fn FILENAME)" nil nil)
-
+(fn FILENAME)" nil nil)
 (autoload 'native-compile "comp" "\
 Compile FUNCTION-OR-FILE into native code.
 This is the synchronous entry-point for the Emacs Lisp native
@@ -5379,8 +4803,7 @@ If FUNCTION-OR-FILE is a filename, return the filename of 
the
 compiled object.  If FUNCTION-OR-FILE is a function symbol or a
 form, return the compiled function.
 
-\(fn FUNCTION-OR-FILE &optional OUTPUT)" nil nil)
-
+(fn FUNCTION-OR-FILE &optional OUTPUT)" nil nil)
 (autoload 'batch-native-compile "comp" "\
 Perform batch native compilation of remaining command-line arguments.
 
@@ -5392,8 +4815,7 @@ as part of building the source tarball, in which case the 
.eln file
 will be placed under the native-lisp/ directory (actually, in the
 last directory in `native-comp-eln-load-path').
 
-\(fn &optional FOR-TARBALL)" nil nil)
-
+(fn &optional FOR-TARBALL)" nil nil)
 (autoload 'batch-byte+native-compile "comp" "\
 Like `batch-native-compile', but used for bootstrap.
 Generate .elc files in addition to the .eln files.
@@ -5401,7 +4823,6 @@ Force the produced .eln to be outputted in the eln system
 directory (the last entry in `native-comp-eln-load-path') unless
 `native-compile-target-directory' is non-nil.  If the environment
 variable \"NATIVE_DISABLED\" is set, only byte compile." nil nil)
-
 (autoload 'native-compile-async "comp" "\
 Compile FILES asynchronously.
 FILES is one file or a list of filenames or directories.
@@ -5421,21 +4842,20 @@ a function -- A function selecting files with matching 
names.
 The variable `native-comp-async-jobs-number' specifies the number
 of (commands) to run simultaneously.
 
-\(fn FILES &optional RECURSIVELY LOAD SELECTOR)" nil nil)
-
+(fn FILES &optional RECURSIVELY LOAD SELECTOR)" nil nil)
 (register-definition-prefixes "comp" '("comp-" "make-comp-edge" "native-" 
"no-native-compile"))
 
-;;;***
 
-;;;### (autoloads nil "comp-cstr" "emacs-lisp/comp-cstr.el" (0 0
-;;;;;;  0 0))
+;;; Generated autoloads from cedet/semantic/wisent/comp.el
+
+(register-definition-prefixes "semantic/wisent/comp" '("wisent-"))
+
+
 ;;; Generated autoloads from emacs-lisp/comp-cstr.el
 
 (register-definition-prefixes "comp-cstr" '("comp-" 
"with-comp-cstr-accessors"))
 
-;;;***
 
-;;;### (autoloads nil "compare-w" "vc/compare-w.el" (0 0 0 0))
 ;;; Generated autoloads from vc/compare-w.el
 
 (autoload 'compare-windows "compare-w" "\
@@ -5467,70 +4887,52 @@ on first call it advances points to the next difference,
 on second call it synchronizes points by skipping the difference,
 on third call it again advances points to the next difference and so on.
 
-\(fn IGNORE-WHITESPACE)" t nil)
-
+(fn IGNORE-WHITESPACE)" t nil)
 (register-definition-prefixes "compare-w" '("compare-"))
 
-;;;***
 
-;;;### (autoloads nil "compface" "image/compface.el" (0 0 0 0))
 ;;; Generated autoloads from image/compface.el
 
 (register-definition-prefixes "compface" '("uncompface"))
 
-;;;***
 
-;;;### (autoloads nil "compile" "progmodes/compile.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/compile.el
 
 (defvar compilation-mode-hook nil "\
 List of hook functions run by `compilation-mode'.")
-
 (custom-autoload 'compilation-mode-hook "compile" t)
-
 (defvar compilation-start-hook nil "\
 Hook run after starting a new compilation process.
 The hook is run with one argument, the new process.")
-
 (custom-autoload 'compilation-start-hook "compile" t)
-
 (defvar compilation-window-height nil "\
 Number of lines in a compilation window.
 If nil, use Emacs default.")
-
 (custom-autoload 'compilation-window-height "compile" t)
-
 (defvar compilation-process-setup-function #'ignore "\
 Function to call to customize the compilation process.
 This function is called immediately before the compilation process is
 started.  It can be used to set any variables or functions that are used
 while processing the output of the compilation process.")
-
 (defvar compilation-buffer-name-function #'compilation--default-buffer-name "\
 Function to compute the name of a compilation buffer.
 The function receives one argument, the name of the major mode of the
 compilation buffer.  It should return a string.
 By default, it returns `(concat \"*\" (downcase name-of-mode) \"*\")'.")
-
 (defvar compilation-finish-functions nil "\
 Functions to call when a compilation process finishes.
 Each function is called with two arguments: the compilation buffer,
 and a string describing how the process finished.")
 (put 'compilation-directory 'safe-local-variable 'stringp)
-
 (defvar compilation-ask-about-save t "\
 Non-nil means \\[compile] asks which buffers to save before compiling.
 Otherwise, it saves all modified buffers without asking.")
-
 (custom-autoload 'compilation-ask-about-save "compile" t)
-
 (defvar compilation-search-path '(nil) "\
 List of directories to search for source files named in error messages.
 Elements should be directory names, not file names of directories.
 The value nil as an element means to try the default directory.")
-
 (custom-autoload 'compilation-search-path "compile" t)
-
 (defvar compile-command (purecopy "make -k ") "\
 Last shell command used to do a compilation; default for next compilation.
 
@@ -5548,17 +4950,13 @@ You might also use mode hooks to specify it in certain 
modes, like this:
                            (file-name-sans-extension buffer-file-name))))))))
 
 It's often useful to leave a space at the end of the value.")
-
 (custom-autoload 'compile-command "compile" t)
 (put 'compile-command 'safe-local-variable (lambda (a) (and (stringp a) (or 
(not (boundp 'compilation-read-command)) compilation-read-command))))
-
 (defvar compilation-disable-input nil "\
 If non-nil, send end-of-file as compilation process input.
 This only affects platforms that support asynchronous processes (see
 `start-process'); synchronous compilation processes never accept input.")
-
 (custom-autoload 'compilation-disable-input "compile" t)
-
 (autoload 'compile "compile" "\
 Compile the program including the current buffer.  Default: run `make'.
 Runs COMMAND, a shell command, in a separate process asynchronously
@@ -5588,8 +4986,7 @@ The name used for the buffer is actually whatever is 
returned by
 the function in `compilation-buffer-name-function', so you can set that
 to a function that generates a unique name.
 
-\(fn COMMAND &optional COMINT)" t nil)
-
+(fn COMMAND &optional COMINT)" t nil)
 (autoload 'compilation-start "compile" "\
 Run compilation command COMMAND (low level interface).
 If COMMAND starts with a cd command, that becomes the `default-directory'.
@@ -5607,10 +5004,15 @@ If HIGHLIGHT-REGEXP is non-nil, `next-error' will 
temporarily highlight
 the matching section of the visited source line; the default is to use the
 global value of `compilation-highlight-regexp'.
 
-Returns the compilation buffer created.
+If CONTINUE is non-nil, the buffer won't be emptied before
+compilation is started.  This can be useful if you wish to
+combine the output from several compilation commands in the same
+buffer.  The new output will be at the end of the buffer, and
+point is not changed.
 
-\(fn COMMAND &optional MODE NAME-FUNCTION HIGHLIGHT-REGEXP)" nil nil)
+Returns the compilation buffer created.
 
+(fn COMMAND &optional MODE NAME-FUNCTION HIGHLIGHT-REGEXP CONTINUE)" nil nil)
 (autoload 'compilation-mode "compile" "\
 Major mode for compilation log buffers.
 \\<compilation-mode-map>To visit the source for a line-numbered error,
@@ -5621,10 +5023,8 @@ Runs `compilation-mode-hook' with `run-mode-hooks' 
(which see).
 
 \\{compilation-mode-map}
 
-\(fn &optional NAME-OF-MODE)" t nil)
-
+(fn &optional NAME-OF-MODE)" t nil)
 (put 'define-compilation-mode 'doc-string-elt 3)
-
 (autoload 'compilation-shell-minor-mode "compile" "\
 Toggle Compilation Shell minor mode.
 
@@ -5648,8 +5048,7 @@ evaluate `compilation-shell-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'compilation-minor-mode "compile" "\
 Toggle Compilation minor mode.
 
@@ -5672,19 +5071,30 @@ evaluate `compilation-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'compilation-next-error-function "compile" "\
 Advance to the next error message and visit the file where the error was.
 This is the value of `next-error-function' in Compilation buffers.
 
-\(fn N &optional RESET)" t nil)
-
+(fn N &optional RESET)" t nil)
 (register-definition-prefixes "compile" '("compil" "define-compilation-mode" 
"kill-compilation" "recompile"))
 
-;;;***
 
-;;;### (autoloads nil "completion" "completion.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/compile.el
+
+(register-definition-prefixes "srecode/compile" '("srecode-"))
+
+
+;;; Generated autoloads from cedet/semantic/analyze/complete.el
+
+(register-definition-prefixes "semantic/analyze/complete" 
'("semantic-analyze-"))
+
+
+;;; Generated autoloads from cedet/semantic/complete.el
+
+(register-definition-prefixes "semantic/complete" '("semantic-"))
+
+
 ;;; Generated autoloads from completion.el
 
 (defvar dynamic-completion-mode nil "\
@@ -5694,9 +5104,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `dynamic-completion-mode'.")
-
 (custom-autoload 'dynamic-completion-mode "completion" nil)
-
 (autoload 'dynamic-completion-mode "completion" "\
 Toggle dynamic word-completion on or off.
 
@@ -5715,14 +5123,10 @@ evaluate `(default-value \\='dynamic-completion-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "completion" '("*c-def-regexp*" 
"*lisp-def-regexp*" "accept-completion" "add-" "cdabbrev-" 
"check-completion-length" "clear-all-completions" "cmpl-" "complet" 
"current-completion-source" "delete-completion" "enable-completion" "find-" 
"inside-locate-completion-entry" "interactive-completion-string-reader" "kill-" 
"list-all-completions" "load-completions-from-file" "make-c" "next-cdabbrev" 
"num-cmpl-sources" "reset-cdabbrev" "save" "set-c" "symbol-" "use-comp [...]
 
-;;;***
 
-;;;### (autoloads nil "conf-mode" "textmodes/conf-mode.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from textmodes/conf-mode.el
 
 (autoload 'conf-mode "conf-mode" "\
@@ -5756,14 +5160,12 @@ See also `conf-space-mode', `conf-colon-mode', 
`conf-javaprop-mode',
 
 \\{conf-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'conf-unix-mode "conf-mode" "\
 Conf Mode starter for Unix style Conf files.
 Comments start with `#'.  For details see `conf-mode'.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'conf-windows-mode "conf-mode" "\
 Conf Mode starter for Windows style Conf files.
 Comments start with `;'.
@@ -5771,15 +5173,14 @@ For details see `conf-mode'.  Example:
 
 ; Conf mode font-locks this right on Windows and with \\[conf-windows-mode]
 
-\[ExtShellFolderViews]
+[ExtShellFolderViews]
 Default={5984FFE0-28D4-11CF-AE66-08002B2E1262}
 {5984FFE0-28D4-11CF-AE66-08002B2E1262}={5984FFE0-28D4-11CF-AE66-08002B2E1262}
 
-\[{5984FFE0-28D4-11CF-AE66-08002B2E1262}]
+[{5984FFE0-28D4-11CF-AE66-08002B2E1262}]
 PersistMoniker=file://Folder.htt
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'conf-javaprop-mode "conf-mode" "\
 Conf Mode starter for Java properties files.
 Comments start with `#' but are also recognized with `//' or
@@ -5797,8 +5198,7 @@ x.1 =
 x.2.y.1.z.1 =
 x.2.y.1.z.2.zz =
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'conf-space-mode "conf-mode" "\
 Conf Mode starter for space separated conf files.
 \"Assignments\" are with ` '.  Keywords before the parameters are
@@ -5822,14 +5222,12 @@ class desktop
 add /dev/audio         desktop
 add /dev/mixer         desktop
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'conf-space-keywords "conf-mode" "\
 Enter Conf Space mode using regexp KEYWORDS to match the keywords.
 See `conf-space-mode'.
 
-\(fn KEYWORDS)" t nil)
-
+(fn KEYWORDS)" t nil)
 (autoload 'conf-colon-mode "conf-mode" "\
 Conf Mode starter for Colon files.
 \"Assignments\" are with `:'.
@@ -5840,8 +5238,7 @@ For details see `conf-mode'.  Example:
 <Multi_key> <exclam> <exclam>          : \"\\241\"     exclamdown
 <Multi_key> <c> <slash>                        : \"\\242\"     cent
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'conf-ppd-mode "conf-mode" "\
 Conf Mode starter for Adobe/CUPS PPD files.
 Comments start with `*%' and \"assignments\" are with `:'.
@@ -5852,8 +5249,7 @@ For details see `conf-mode'.  Example:
 *DefaultTransfer: Null
 *Transfer Null.Inverse: \"{ 1 exch sub }\"
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'conf-xdefaults-mode "conf-mode" "\
 Conf Mode starter for Xdefaults files.
 Comments start with `!' and \"assignments\" are with `:'.
@@ -5864,8 +5260,7 @@ For details see `conf-mode'.  Example:
 *background:                   gray99
 *foreground:                   black
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'conf-toml-mode "conf-mode" "\
 Conf Mode starter for TOML files.
 Comments start with `#' and \"assignments\" are with `='.
@@ -5873,11 +5268,10 @@ For details see `conf-mode'.  Example:
 
 # Conf mode font-locks this right with \\[conf-toml-mode]
 
-\[entry]
+[entry]
 value = \"some string\"
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'conf-desktop-mode "conf-mode" "\
 Conf Mode started for freedesktop.org Desktop files.
 Comments start with `#' and \"assignments\" are with `='.
@@ -5890,13 +5284,15 @@ For details see `conf-mode'.
        Exec=gimp-2.8 %U
        Terminal=false
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "conf-mode" '("conf-"))
 
-;;;***
 
-;;;### (autoloads nil "cookie1" "play/cookie1.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/config.el
+
+(register-definition-prefixes "ede/config" '("ede-"))
+
+
 ;;; Generated autoloads from play/cookie1.el
 
 (autoload 'cookie "cookie1" "\
@@ -5906,33 +5302,27 @@ of load, ENDMSG at the end.
 Interactively, PHRASE-FILE defaults to `cookie-file', unless that
 is nil or a prefix argument is used.
 
-\(fn PHRASE-FILE &optional STARTMSG ENDMSG)" t nil)
-
+(fn PHRASE-FILE &optional STARTMSG ENDMSG)" t nil)
 (autoload 'cookie-insert "cookie1" "\
 Insert random phrases from PHRASE-FILE; COUNT of them.
 When the phrase file is read in, display STARTMSG at the beginning
 of load, ENDMSG at the end.
 
-\(fn PHRASE-FILE &optional COUNT STARTMSG ENDMSG)" nil nil)
-
+(fn PHRASE-FILE &optional COUNT STARTMSG ENDMSG)" nil nil)
 (autoload 'cookie-snarf "cookie1" "\
 Read the PHRASE-FILE, return it as a vector of strings.
 Emit STARTMSG and ENDMSG before and after.  Cache the result; second
 and subsequent calls on the same file won't go to disk.
 
-\(fn PHRASE-FILE &optional STARTMSG ENDMSG)" nil nil)
-
+(fn PHRASE-FILE &optional STARTMSG ENDMSG)" nil nil)
 (register-definition-prefixes "cookie1" '("cookie"))
 
-;;;***
 
-;;;### (autoloads nil "copyright" "emacs-lisp/copyright.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emacs-lisp/copyright.el
+
 (put 'copyright-at-end-flag 'safe-local-variable 'booleanp)
 (put 'copyright-names-regexp 'safe-local-variable 'stringp)
 (put 'copyright-year-ranges 'safe-local-variable 'booleanp)
-
 (autoload 'copyright-update "copyright" "\
 Update copyright notice to indicate the current year.
 With prefix ARG, replace the years in the notice rather than adding
@@ -5942,32 +5332,26 @@ following the copyright are updated as well.
 If non-nil, INTERACTIVEP tells the function to behave as when it's called
 interactively.
 
-\(fn &optional ARG INTERACTIVEP)" t nil)
-
+(fn &optional ARG INTERACTIVEP)" t nil)
 (autoload 'copyright-fix-years "copyright" "\
 Convert 2 digit years to 4 digit years.
 Uses heuristic: year >= 50 means 19xx, < 50 means 20xx.
 If `copyright-year-ranges' (which see) is non-nil, also
 independently replaces consecutive years with a range." t nil)
-
 (autoload 'copyright "copyright" "\
 Insert a copyright by $ORGANIZATION notice at cursor.
 
-\(fn &optional STR ARG)" t nil)
-
+(fn &optional STR ARG)" t nil)
 (autoload 'copyright-update-directory "copyright" "\
 Update copyright notice for all files in DIRECTORY matching MATCH.
 If FIX is non-nil, run `copyright-fix-years' instead.
 
-\(fn DIRECTORY MATCH &optional FIX)" t nil)
-
+(fn DIRECTORY MATCH &optional FIX)" t nil)
 (register-definition-prefixes "copyright" '("copyright-"))
 
-;;;***
 
-;;;### (autoloads nil "cperl-mode" "progmodes/cperl-mode.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from progmodes/cperl-mode.el
+
 (put 'cperl-indent-level 'safe-local-variable 'integerp)
 (put 'cperl-brace-offset 'safe-local-variable 'integerp)
 (put 'cperl-continued-brace-offset 'safe-local-variable 'integerp)
@@ -5975,7 +5359,7 @@ If FIX is non-nil, run `copyright-fix-years' instead.
 (put 'cperl-continued-statement-offset 'safe-local-variable 'integerp)
 (put 'cperl-extra-newline-before-brace 'safe-local-variable 'booleanp)
 (put 'cperl-merge-trailing-else 'safe-local-variable 'booleanp)
-
+(put 'cperl-file-style 'safe-local-variable 'stringp)
 (autoload 'cperl-mode "cperl-mode" "\
 Major mode for editing Perl code.
 Expression and list commands understand all C brackets.
@@ -6045,10 +5429,10 @@ into
 \\{cperl-mode-map}
 
 Setting the variable `cperl-font-lock' to t switches on `font-lock-mode'
-\(even with older Emacsen), `cperl-electric-lbrace-space' to t switches
+(even with older Emacsen), `cperl-electric-lbrace-space' to t switches
 on electric space between $ and {, `cperl-electric-parens-string' is
 the string that contains parentheses that should be electric in CPerl
-\(see also `cperl-electric-parens-mark' and `cperl-electric-parens'),
+(see also `cperl-electric-parens-mark' and `cperl-electric-parens'),
 setting `cperl-electric-keywords' enables electric expansion of
 control structures in CPerl.  `cperl-electric-linefeed' governs which
 one of two linefeed behavior is preferable.  You can enable all these
@@ -6063,7 +5447,7 @@ If your site has perl5 documentation in info format, you 
can use commands
 These keys run commands `cperl-info-on-current-command' and
 `cperl-info-on-command', which one is which is controlled by variable
 `cperl-info-on-command-no-prompt' and `cperl-clobber-lisp-bindings'
-\(in turn affected by `cperl-hairy').
+(in turn affected by `cperl-hairy').
 
 Even if you have no info-format documentation, short one-liner-style
 help is available on \\[cperl-get-help], and one can run perldoc or
@@ -6126,9 +5510,11 @@ Settings for classic indent-styles: K&R BSD=C++ GNU PBP 
PerlStyle=Whitesmith
   `cperl-continued-statement-offset'  5   4       2   4   4
 
 CPerl knows several indentation styles, and may bulk set the
-corresponding variables.  Use \\[cperl-set-style] to do this.  Use
-\\[cperl-set-style-back] to restore the memorized preexisting values
-\(both available from menu).  See examples in `cperl-style-examples'.
+corresponding variables.  Use \\[cperl-set-style] to do this or
+set the `cperl-file-style' user option.  Use
+\\[cperl-set-style-back] to restore the memorized preexisting
+values (both available from menu).  See examples in
+`cperl-style-examples'.
 
 Part of the indentation style is how different parts of if/elsif/else
 statements are broken into lines; in CPerl, this is reflected on how
@@ -6149,21 +5535,16 @@ DO NOT FORGET to read micro-docs (available from `Perl' 
menu)
 or as help on variables `cperl-tips', `cperl-problems',
 `cperl-praise', `cperl-speed'.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'cperl-perldoc "cperl-mode" "\
 Run `perldoc' on WORD.
 
-\(fn WORD)" t nil)
-
+(fn WORD)" t nil)
 (autoload 'cperl-perldoc-at-point "cperl-mode" "\
 Run a `perldoc' on the word around point." t nil)
-
 (register-definition-prefixes "cperl-mode" '("cperl-" "pod2man-program"))
 
-;;;***
 
-;;;### (autoloads nil "cpp" "progmodes/cpp.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cpp.el
 
 (autoload 'cpp-highlight-buffer "cpp" "\
@@ -6172,16 +5553,22 @@ This command pops up a buffer which you should edit to 
specify
 what kind of highlighting to use, and the criteria for highlighting.
 A prefix arg suppresses display of that buffer.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'cpp-parse-edit "cpp" "\
 Edit display information for cpp conditionals." t nil)
-
 (register-definition-prefixes "cpp" '("cpp-"))
 
-;;;***
 
-;;;### (autoloads nil "crm" "emacs-lisp/crm.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/cpp.el
+
+(register-definition-prefixes "srecode/cpp" '("srecode-"))
+
+
+;;; Generated autoloads from cedet/ede/cpp-root.el
+
+(register-definition-prefixes "ede/cpp-root" '("ede-cpp-root-"))
+
+
 ;;; Generated autoloads from emacs-lisp/crm.el
 
 (autoload 'completing-read-multiple "crm" "\
@@ -6203,13 +5590,15 @@ contents of the minibuffer are \"alice,bob,eve\" and 
point is between
 This function returns a list of the strings that were read,
 with empty strings removed.
 
-\(fn PROMPT TABLE &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF 
INHERIT-INPUT-METHOD)" nil nil)
-
+(fn PROMPT TABLE &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF 
INHERIT-INPUT-METHOD)" nil nil)
 (register-definition-prefixes "crm" '("crm-"))
 
-;;;***
 
-;;;### (autoloads nil "css-mode" "textmodes/css-mode.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/symref/cscope.el
+
+(register-definition-prefixes "semantic/symref/cscope" 
'("semantic-symref-cscope--line-re"))
+
+
 ;;; Generated autoloads from textmodes/css-mode.el
 
 (autoload 'css-mode "css-mode" "\
@@ -6233,14 +5622,12 @@ be used to fill comments.
 
 \\{css-mode-map}
 
-\(fn)" t nil)
+(fn)" t nil)
  (add-to-list 'auto-mode-alist '("\\.scss\\'" . scss-mode))
-
 (autoload 'scss-mode "css-mode" "\
 Major mode to edit \"Sassy CSS\" files.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'css-lookup-symbol "css-mode" "\
 Display the CSS documentation for SYMBOL, as found on MDN.
 When this command is used interactively, it picks a default
@@ -6248,13 +5635,20 @@ symbol based on the CSS text before point -- either an 
@-keyword,
 a property name, a pseudo-class, or a pseudo-element, depending
 on what is seen near point.
 
-\(fn SYMBOL)" t nil)
-
+(fn SYMBOL)" t nil)
 (register-definition-prefixes "css-mode" '("css-" "scss-"))
 
-;;;***
 
-;;;### (autoloads nil "cua-base" "emulation/cua-base.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/ctxt.el
+
+(register-definition-prefixes "srecode/ctxt" '("srecode-"))
+
+
+;;; Generated autoloads from cedet/semantic/ctxt.el
+
+(register-definition-prefixes "semantic/ctxt" '("semantic-"))
+
+
 ;;; Generated autoloads from emulation/cua-base.el
 
 (defvar cua-mode nil "\
@@ -6264,9 +5658,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `cua-mode'.")
-
 (custom-autoload 'cua-mode "cua-base" nil)
-
 (autoload 'cua-mode "cua-base" "\
 Toggle Common User Access style editing (CUA mode).
 
@@ -6302,25 +5694,19 @@ evaluate `(default-value \\='cua-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'cua-selection-mode "cua-base" "\
 Enable CUA selection mode without the C-z/C-x/C-c/C-v bindings.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (register-definition-prefixes "cua-base" '("cua-"))
 
-;;;***
 
-;;;### (autoloads nil "cua-gmrk" "emulation/cua-gmrk.el" (0 0 0 0))
 ;;; Generated autoloads from emulation/cua-gmrk.el
 
 (register-definition-prefixes "cua-gmrk" '("cua-"))
 
-;;;***
 
-;;;### (autoloads nil "cua-rect" "emulation/cua-rect.el" (0 0 0 0))
 ;;; Generated autoloads from emulation/cua-rect.el
 
 (autoload 'cua-rectangle-mark-mode "cua-rect" "\
@@ -6343,21 +5729,16 @@ evaluate `cua-rectangle-mark-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "cua-rect" '("cua-"))
 
-;;;***
 
-;;;### (autoloads nil "cursor-sensor" "emacs-lisp/cursor-sensor.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/cursor-sensor.el
 
 (defvar cursor-sensor-inhibit nil "\
 When non-nil, suspend `cursor-sensor-mode' and `cursor-intangible-mode'.
 By convention, this is a list of symbols where each symbol stands for the
 \"cause\" of the suspension.")
-
 (autoload 'cursor-intangible-mode "cursor-sensor" "\
 Keep cursor outside of any `cursor-intangible' text property.
 
@@ -6376,8 +5757,7 @@ evaluate `cursor-intangible-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'cursor-sensor-mode "cursor-sensor" "\
 Handle the `cursor-sensor-functions' text property.
 
@@ -6401,37 +5781,26 @@ evaluate `cursor-sensor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "cursor-sensor" '("cursor-sensor-"))
 
-;;;***
 
-;;;### (autoloads nil "cus-dep" "cus-dep.el" (0 0 0 0))
 ;;; Generated autoloads from cus-dep.el
 
 (register-definition-prefixes "cus-dep" '("custom-" 
"generated-custom-dependencies-file"))
 
-;;;***
 
-;;;### (autoloads nil "cus-edit" "cus-edit.el" (0 0 0 0))
 ;;; Generated autoloads from cus-edit.el
 
 (defvar custom-browse-sort-alphabetically nil "\
 If non-nil, sort customization group alphabetically in `custom-browse'.")
-
 (custom-autoload 'custom-browse-sort-alphabetically "cus-edit" t)
-
 (defvar custom-buffer-sort-alphabetically t "\
 Whether to sort customization groups alphabetically in Custom buffer.")
-
 (custom-autoload 'custom-buffer-sort-alphabetically "cus-edit" t)
-
 (defvar custom-menu-sort-alphabetically nil "\
 If non-nil, sort each customization group alphabetically in menus.")
-
 (custom-autoload 'custom-menu-sort-alphabetically "cus-edit" t)
-
 (autoload 'customize-set-value "cus-edit" "\
 Set VARIABLE to VALUE, and return VALUE.  VALUE is a Lisp object.
 
@@ -6443,8 +5812,7 @@ If VARIABLE has a `custom-type' property, it must be a 
widget and the
 
 If given a prefix (or a COMMENT argument), also prompt for a comment.
 
-\(fn VARIABLE VALUE &optional COMMENT)" t nil)
-
+(fn VARIABLE VALUE &optional COMMENT)" t nil)
 (autoload 'customize-set-variable "cus-edit" "\
 Set the default for VARIABLE to VALUE, and return VALUE.
 VALUE is a Lisp object.
@@ -6460,21 +5828,18 @@ If VARIABLE has a `custom-type' property, it must be a 
widget and the
 
 If given a prefix (or a COMMENT argument), also prompt for a comment.
 
-\(fn VARIABLE VALUE &optional COMMENT)" t nil)
-
+(fn VARIABLE VALUE &optional COMMENT)" t nil)
 (autoload 'setopt "cus-edit" "\
 Set VARIABLE/VALUE pairs, and return the final VALUE.
 This is like `setq', but is meant for user options instead of
 plain variables.  This means that `setopt' will execute any
 `custom-set' form associated with VARIABLE.
 
-\(fn [VARIABLE VALUE]...)" nil t)
-
+(fn [VARIABLE VALUE]...)" nil t)
 (autoload 'setopt--set "cus-edit" "\
 
 
-\(fn VARIABLE VALUE)" nil nil)
-
+(fn VARIABLE VALUE)" nil nil)
 (autoload 'customize-save-variable "cus-edit" "\
 Set the default for VARIABLE to VALUE, and save it for future sessions.
 Return VALUE.
@@ -6490,8 +5855,7 @@ If VARIABLE has a `custom-type' property, it must be a 
widget and the
 
 If given a prefix (or a COMMENT argument), also prompt for a comment.
 
-\(fn VARIABLE VALUE &optional COMMENT)" t nil)
-
+(fn VARIABLE VALUE &optional COMMENT)" t nil)
 (autoload 'customize-push-and-save "cus-edit" "\
 Add ELTS to LIST-VAR and save for future sessions, safely.
 ELTS should be a list.  This function adds each entry to the
@@ -6501,48 +5865,39 @@ If Emacs is initialized, call `customize-save-variable' 
to save
 the resulting list value now.  Otherwise, add an entry to
 `after-init-hook' to save it after initialization.
 
-\(fn LIST-VAR ELTS)" nil nil)
-
+(fn LIST-VAR ELTS)" nil nil)
 (autoload 'customize "cus-edit" "\
 Select a customization buffer which you can use to set user options.
 User options are structured into \"groups\".
 Initially the top-level group `Emacs' and its immediate subgroups
 are shown; the contents of those subgroups are initially hidden." t nil)
-
 (autoload 'customize-mode "cus-edit" "\
 Customize options related to a major or minor mode.
 By default the current major mode is used.  With a prefix
 argument or if the current major mode has no known group, prompt
 for the MODE to customize.
 
-\(fn MODE)" t nil)
-
+(fn MODE)" t nil)
 (autoload 'customize-group "cus-edit" "\
 Customize GROUP, which must be a customization group.
 If OTHER-WINDOW is non-nil, display in another window.
 
-\(fn &optional GROUP OTHER-WINDOW)" t nil)
-
+(fn &optional GROUP OTHER-WINDOW)" t nil)
 (autoload 'customize-group-other-window "cus-edit" "\
 Customize GROUP, which must be a customization group, in another window.
 
-\(fn &optional GROUP)" t nil)
-
+(fn &optional GROUP)" t nil)
 (defalias 'customize-variable 'customize-option)
-
 (autoload 'customize-option "cus-edit" "\
 Customize SYMBOL, which must be a user option.
 
-\(fn SYMBOL)" t nil)
-
+(fn SYMBOL)" t nil)
 (defalias 'customize-variable-other-window 'customize-option-other-window)
-
 (autoload 'customize-option-other-window "cus-edit" "\
 Customize SYMBOL, which must be a user option.
 Show the buffer in another window, but don't select it.
 
-\(fn SYMBOL)" t nil)
-
+(fn SYMBOL)" t nil)
 (defvar customize-package-emacs-version-alist nil "\
 Alist mapping versions of a package to Emacs versions.
 We use this for packages that have their own names, but are released
@@ -6573,9 +5928,8 @@ The value of PACKAGE needs to be unique and it needs to 
match the
 PACKAGE value appearing in the :package-version keyword.  Since
 the user might see the value in an error message, a good choice is
 the official name of the package, such as MH-E or Gnus.")
-
-(define-obsolete-function-alias 'customize-changed-options #'customize-changed 
"28.1")
-
+(define-obsolete-function-alias 'customize-changed-options #'customize-changed 
"\
+28.1")
 (autoload 'customize-changed "cus-edit" "\
 Customize all settings whose meanings have changed in Emacs itself.
 This includes new user options and faces, and new customization
@@ -6586,8 +5940,7 @@ release.
 With argument SINCE-VERSION (a string), customize all settings
 that were added or redefined since that version.
 
-\(fn &optional SINCE-VERSION)" t nil)
-
+(fn &optional SINCE-VERSION)" t nil)
 (autoload 'customize-face "cus-edit" "\
 Customize FACE, which should be a face name or nil.
 If FACE is nil, customize all faces.  If FACE is actually a
@@ -6598,8 +5951,7 @@ If OTHER-WINDOW is non-nil, display in another window.
 Interactively, when point is on text which has a face specified,
 suggest to customize that face, if it's customizable.
 
-\(fn &optional FACE OTHER-WINDOW)" t nil)
-
+(fn &optional FACE OTHER-WINDOW)" t nil)
 (autoload 'customize-face-other-window "cus-edit" "\
 Show customization buffer for face FACE in other window.
 If FACE is actually a face-alias, customize the face it is aliased to.
@@ -6607,17 +5959,13 @@ If FACE is actually a face-alias, customize the face it 
is aliased to.
 Interactively, when point is on text which has a face specified,
 suggest to customize that face, if it's customizable.
 
-\(fn &optional FACE)" t nil)
-
+(fn &optional FACE)" t nil)
 (autoload 'customize-unsaved "cus-edit" "\
 Customize all options and faces set in this session but not saved." t nil)
-
 (autoload 'customize-rogue "cus-edit" "\
 Customize all user variables modified outside customize." t nil)
-
 (autoload 'customize-saved "cus-edit" "\
 Customize all saved options and faces." t nil)
-
 (autoload 'customize-apropos "cus-edit" "\
 Customize loaded options, faces and groups matching PATTERN.
 PATTERN can be a word, a list of words (separated by spaces),
@@ -6629,28 +5977,23 @@ If TYPE is `options', include only options.
 If TYPE is `faces', include only faces.
 If TYPE is `groups', include only groups.
 
-\(fn PATTERN &optional TYPE)" t nil)
-
+(fn PATTERN &optional TYPE)" t nil)
 (autoload 'customize-apropos-options "cus-edit" "\
 Customize all loaded customizable options matching REGEXP.
 
-\(fn REGEXP &optional IGNORED)" t nil)
-
+(fn REGEXP &optional IGNORED)" t nil)
 (autoload 'customize-apropos-faces "cus-edit" "\
 Customize all loaded faces matching REGEXP.
 
-\(fn REGEXP)" t nil)
-
+(fn REGEXP)" t nil)
 (autoload 'customize-apropos-groups "cus-edit" "\
 Customize all loaded groups matching REGEXP.
 
-\(fn REGEXP)" t nil)
-
+(fn REGEXP)" t nil)
 (autoload 'custom-prompt-customize-unsaved-options "cus-edit" "\
 Prompt user to customize any unsaved customization options.
 Return nil if user chooses to customize, for use in
 `kill-emacs-query-functions'." nil nil)
-
 (autoload 'custom-buffer-create "cus-edit" "\
 Create a buffer containing OPTIONS.
 Optional NAME is the name of the buffer.
@@ -6659,8 +6002,7 @@ SYMBOL is a customization option, and WIDGET is a widget 
for editing
 that option.
 DESCRIPTION is unused.
 
-\(fn OPTIONS &optional NAME DESCRIPTION)" nil nil)
-
+(fn OPTIONS &optional NAME DESCRIPTION)" nil nil)
 (autoload 'custom-buffer-create-other-window "cus-edit" "\
 Create a buffer containing OPTIONS, and display it in another window.
 The result includes selecting that window.
@@ -6670,13 +6012,11 @@ SYMBOL is a customization option, and WIDGET is a 
widget for editing
 that option.
 DESCRIPTION is unused.
 
-\(fn OPTIONS &optional NAME DESCRIPTION)" nil nil)
-
+(fn OPTIONS &optional NAME DESCRIPTION)" nil nil)
 (autoload 'customize-browse "cus-edit" "\
 Create a tree browser for the customize hierarchy.
 
-\(fn &optional GROUP)" t nil)
-
+(fn &optional GROUP)" t nil)
 (defvar custom-file nil "\
 File used for storing customization information.
 The default is nil, which means to use your init file
@@ -6687,8 +6027,8 @@ You can set this option through Custom, if you carefully 
read the
 last paragraph below.  However, usually it is simpler to write
 something like the following in your init file:
 
-\(setq custom-file \"~/.config/emacs-custom.el\")
-\(load custom-file)
+(setq custom-file \"~/.config/emacs-custom.el\")
+(load custom-file)
 
 Note that both lines are necessary: the first line tells Custom to
 save all customizations in this file, but does not load it.
@@ -6709,34 +6049,26 @@ want.  You also have to put something like (load 
\"CUSTOM-FILE\")
 in your init file, where CUSTOM-FILE is the actual name of the
 file.  Otherwise, Emacs will not load the file when it starts up,
 and hence will not set `custom-file' to that file either.")
-
 (custom-autoload 'custom-file "cus-edit" t)
-
 (autoload 'custom-save-all "cus-edit" "\
 Save all customizations in `custom-file'." nil nil)
-
 (autoload 'customize-save-customized "cus-edit" "\
 Save all user options which have been set in this session." t nil)
-
 (autoload 'custom-menu-create "cus-edit" "\
 Create menu for customization group SYMBOL.
 The menu is in a format applicable to `easy-menu-define'.
 
-\(fn SYMBOL)" nil nil)
-
+(fn SYMBOL)" nil nil)
 (autoload 'customize-menu-create "cus-edit" "\
 Return a customize menu for customization group SYMBOL.
 If optional NAME is given, use that as the name of the menu.
 Otherwise the menu will be named `Customize'.
 The format is suitable for use with `easy-menu-define'.
 
-\(fn SYMBOL &optional NAME)" nil nil)
-
+(fn SYMBOL &optional NAME)" nil nil)
 (register-definition-prefixes "cus-edit" '("Custom-" "cus" "widget-"))
 
-;;;***
 
-;;;### (autoloads nil "cus-theme" "cus-theme.el" (0 0 0 0))
 ;;; Generated autoloads from cus-theme.el
 
 (autoload 'customize-create-theme "cus-theme" "\
@@ -6748,42 +6080,38 @@ from the Custom save file.
 BUFFER, if non-nil, should be a buffer to use; the default is
 named *Custom Theme*.
 
-\(fn &optional THEME BUFFER)" t nil)
-
+(fn &optional THEME BUFFER)" t nil)
 (autoload 'custom-theme-visit-theme "cus-theme" "\
 Set up a Custom buffer to edit custom theme THEME.
 
-\(fn THEME)" t nil)
-
+(fn THEME)" t nil)
 (autoload 'describe-theme "cus-theme" "\
 Display a description of the Custom theme THEME (a symbol).
 
-\(fn THEME)" t nil)
-
+(fn THEME)" t nil)
 (autoload 'customize-themes "cus-theme" "\
 Display a selectable list of Custom themes.
 When called from Lisp, BUFFER should be the buffer to use; if
 omitted, a buffer named *Custom Themes* is used.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (register-definition-prefixes "cus-theme" '("custom-" "describe-theme-1"))
 
-;;;***
 
-;;;### (autoloads nil "cvs-status" "vc/cvs-status.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/custom.el
+
+(register-definition-prefixes "ede/custom" '("ede-" "eieio-ede-old-variables"))
+
+
 ;;; Generated autoloads from vc/cvs-status.el
 
 (autoload 'cvs-status-mode "cvs-status" "\
 Mode used for cvs status output.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "cvs-status" '("cvs-"))
 
-;;;***
 
-;;;### (autoloads nil "cwarn" "progmodes/cwarn.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cwarn.el
 
 (autoload 'cwarn-mode "cwarn" "\
@@ -6809,12 +6137,10 @@ evaluate `cwarn-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
-(define-obsolete-function-alias 'turn-on-cwarn-mode 'cwarn-mode "24.1")
-
+(fn &optional ARG)" t nil)
+(define-obsolete-function-alias 'turn-on-cwarn-mode 'cwarn-mode "\
+24.1")
 (put 'global-cwarn-mode 'globalized-minor-mode t)
-
 (defvar global-cwarn-mode nil "\
 Non-nil if Global Cwarn mode is enabled.
 See the `global-cwarn-mode' command
@@ -6822,9 +6148,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-cwarn-mode'.")
-
 (custom-autoload 'global-cwarn-mode "cwarn" nil)
-
 (autoload 'global-cwarn-mode "cwarn" "\
 Toggle Cwarn mode in all buffers.
 With prefix ARG, enable Global Cwarn mode if ARG is positive;
@@ -6839,26 +6163,20 @@ Cwarn mode is enabled in all buffers where
 
 See `cwarn-mode' for more information on Cwarn mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "cwarn" '("cwarn-" 
"turn-on-cwarn-mode-if-enabled"))
 
-;;;***
 
-;;;### (autoloads nil "cyril-util" "language/cyril-util.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from language/cyril-util.el
 
 (autoload 'cyrillic-encode-koi8-r-char "cyril-util" "\
 Return KOI8-R external character code of CHAR if appropriate.
 
-\(fn CHAR)" nil nil)
-
+(fn CHAR)" nil nil)
 (autoload 'cyrillic-encode-alternativnyj-char "cyril-util" "\
 Return ALTERNATIVNYJ external character code of CHAR if appropriate.
 
-\(fn CHAR)" nil nil)
-
+(fn CHAR)" nil nil)
 (autoload 'standard-display-cyrillic-translit "cyril-util" "\
 Display a Cyrillic buffer using a transliteration.
 For readability, the table is slightly
@@ -6870,19 +6188,16 @@ Possible values are listed in `cyrillic-language-alist'.
 If the argument is t, we use the default cyrillic transliteration.
 If the argument is nil, we return the display table to its standard state.
 
-\(fn &optional CYRILLIC-LANGUAGE)" t nil)
-
+(fn &optional CYRILLIC-LANGUAGE)" t nil)
 (register-definition-prefixes "cyril-util" '("cyrillic-language-alist"))
 
-;;;***
 
-;;;### (autoloads nil "dabbrev" "dabbrev.el" (0 0 0 0))
 ;;; Generated autoloads from dabbrev.el
+
 (put 'dabbrev-case-fold-search 'risky-local-variable t)
 (put 'dabbrev-case-replace 'risky-local-variable t)
  (define-key esc-map "/" 'dabbrev-expand)
  (define-key esc-map [?\C-/] 'dabbrev-completion)
-
 (autoload 'dabbrev-completion "dabbrev" "\
 Completion on current word.
 Like \\[dabbrev-expand] but finds all expansions in the current buffer
@@ -6895,8 +6210,7 @@ completions.
 If the prefix argument is 16 (which comes from \\[universal-argument] 
\\[universal-argument]),
 then it searches *all* buffers.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'dabbrev-expand "dabbrev" "\
 Expand previous word \"dynamically\".
 
@@ -6921,25 +6235,74 @@ direction of search to backward if set non-nil.
 
 See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion].
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (register-definition-prefixes "dabbrev" '("dabbrev-"))
 
-;;;***
 
-;;;### (autoloads nil "data-debug" "cedet/data-debug.el" (0 0 0 0))
 ;;; Generated autoloads from cedet/data-debug.el
 
 (autoload 'data-debug-new-buffer "data-debug" "\
 Create a new data-debug buffer with NAME.
 
-\(fn NAME)" nil nil)
-
+(fn NAME)" nil nil)
 (register-definition-prefixes "data-debug" '("data-debug-"))
 
-;;;***
 
-;;;### (autoloads nil "dbus" "net/dbus.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/db.el
+
+(register-definition-prefixes "semantic/db" '("semanticdb-"))
+
+
+;;; Generated autoloads from cedet/semantic/db-debug.el
+
+(register-definition-prefixes "semantic/db-debug" '("semanticdb-"))
+
+
+;;; Generated autoloads from cedet/semantic/db-ebrowse.el
+
+(register-definition-prefixes "semantic/db-ebrowse" '("c++-mode" 
"semanticdb-"))
+
+
+;;; Generated autoloads from cedet/semantic/db-el.el
+
+(register-definition-prefixes "semantic/db-el" '("emacs-lisp-mode" 
"semanticdb-"))
+
+
+;;; Generated autoloads from cedet/semantic/db-file.el
+
+(register-definition-prefixes "semantic/db-file" '("semanticdb-"))
+
+
+;;; Generated autoloads from cedet/semantic/db-find.el
+
+(register-definition-prefixes "semantic/db-find" '("semanticdb-"))
+
+
+;;; Generated autoloads from cedet/semantic/db-global.el
+
+(register-definition-prefixes "semantic/db-global" '("semanticdb-"))
+
+
+;;; Generated autoloads from cedet/semantic/db-javascript.el
+
+(register-definition-prefixes "semantic/db-javascript" '("javascript-mode" 
"semanticdb-"))
+
+
+;;; Generated autoloads from cedet/semantic/db-mode.el
+
+(register-definition-prefixes "semantic/db-mode" '("semanticdb-"))
+
+
+;;; Generated autoloads from cedet/semantic/db-ref.el
+
+(register-definition-prefixes "semantic/db-ref" '("semanticdb-ref-"))
+
+
+;;; Generated autoloads from cedet/semantic/db-typecache.el
+
+(register-definition-prefixes "semantic/db-typecache" '("semanticdb-"))
+
+
 ;;; Generated autoloads from net/dbus.el
 
 (autoload 'dbus-handle-event "dbus" "\
@@ -6948,22 +6311,17 @@ EVENT is a D-Bus event, see `dbus-check-event'.  
HANDLER, being
 part of the event, is called with arguments ARGS (without type information).
 If the HANDLER returns a `dbus-error', it is propagated as return message.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (function-put 'dbus-handle-event 'completion-predicate #'ignore)
-
 (autoload 'dbus-monitor "dbus" "\
 Invoke `dbus-register-monitor' interactively, and switch to the buffer.
 BUS is either a Lisp keyword, `:system' or `:session', or a
 string denoting the bus address.  The value nil defaults to `:session'.
 
-\(fn &optional BUS)" t nil)
-
+(fn &optional BUS)" t nil)
 (register-definition-prefixes "dbus" '("dbus-"))
 
-;;;***
 
-;;;### (autoloads nil "dcl-mode" "progmodes/dcl-mode.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/dcl-mode.el
 
 (autoload 'dcl-mode "dcl-mode" "\
@@ -7084,17 +6442,13 @@ $
 There is some minimal font-lock support (see vars
 `dcl-font-lock-defaults' and `dcl-font-lock-keywords').
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "dcl-mode" '("dcl-"))
 
-;;;***
 
-;;;### (autoloads nil "debug" "emacs-lisp/debug.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/debug.el
 
 (setq debugger 'debug)
-
 (autoload 'debug "debug" "\
 Enter debugger.  \\<debugger-mode-map>`\\[debugger-continue]' returns from the 
debugger.
 Arguments are mainly for use when this is called from the internals
@@ -7107,8 +6461,7 @@ first will be printed into the backtrace buffer.
 If `inhibit-redisplay' is non-nil when this function is called,
 the debugger will not be entered.
 
-\(fn &rest ARGS)" t nil)
-
+(fn &rest ARGS)" t nil)
 (autoload 'debug-on-entry "debug" "\
 Request FUNCTION to invoke debugger each time it is called.
 
@@ -7124,16 +6477,14 @@ primitive functions only works when that function is 
called from Lisp.
 Use \\[cancel-debug-on-entry] to cancel the effect of this command.
 Redefining FUNCTION also cancels it.
 
-\(fn FUNCTION)" t nil)
-
+(fn FUNCTION)" t nil)
 (autoload 'cancel-debug-on-entry "debug" "\
 Undo effect of \\[debug-on-entry] on FUNCTION.
 If FUNCTION is nil, cancel `debug-on-entry' for all functions.
 When called interactively, prompt for FUNCTION in the minibuffer.
 To specify a nil argument interactively, exit with an empty minibuffer.
 
-\(fn &optional FUNCTION)" t nil)
-
+(fn &optional FUNCTION)" t nil)
 (autoload 'debug-on-variable-change "debug" "\
 Trigger a debugger invocation when VARIABLE is changed.
 
@@ -7152,30 +6503,38 @@ Use \\[cancel-debug-on-variable-change] to cancel the 
effect of
 this command.  Uninterning VARIABLE or making it an alias of
 another symbol also cancels it.
 
-\(fn VARIABLE)" t nil)
-
+(fn VARIABLE)" t nil)
 (defalias 'debug-watch #'debug-on-variable-change)
-
 (autoload 'cancel-debug-on-variable-change "debug" "\
 Undo effect of \\[debug-on-variable-change] on VARIABLE.
 If VARIABLE is nil, cancel `debug-on-variable-change' for all variables.
 When called interactively, prompt for VARIABLE in the minibuffer.
 To specify a nil argument interactively, exit with an empty minibuffer.
 
-\(fn &optional VARIABLE)" t nil)
-
+(fn &optional VARIABLE)" t nil)
 (defalias 'cancel-debug-watch #'cancel-debug-on-variable-change)
-
 (register-definition-prefixes "debug" '("debug" "inhibit-debug-on-entry"))
 
-;;;***
 
-;;;### (autoloads nil "decipher" "play/decipher.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/bovine/debug.el
+
+(register-definition-prefixes "semantic/bovine/debug" '("semantic-"))
+
+
+;;; Generated autoloads from cedet/semantic/analyze/debug.el
+
+(register-definition-prefixes "semantic/analyze/debug" '("semantic-analyze"))
+
+
+;;; Generated autoloads from cedet/semantic/debug.el
+
+(register-definition-prefixes "semantic/debug" '("semantic-debug-"))
+
+
 ;;; Generated autoloads from play/decipher.el
 
 (autoload 'decipher "decipher" "\
 Format a buffer of ciphertext for cryptanalysis and enter Decipher mode." t 
nil)
-
 (autoload 'decipher-mode "decipher" "\
 Major mode for decrypting monoalphabetic substitution ciphers.
 Lower-case letters enter plaintext.
@@ -7192,18 +6551,19 @@ The most useful commands are:
 \\[decipher-make-checkpoint]  Save the current cipher alphabet (checkpoint)
 \\[decipher-restore-checkpoint]  Restore a saved cipher alphabet (checkpoint)
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "decipher" '("decipher-"))
 
-;;;***
 
-;;;### (autoloads nil "delim-col" "delim-col.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/decorate.el
+
+(register-definition-prefixes "semantic/decorate" '("semantic-"))
+
+
 ;;; Generated autoloads from delim-col.el
 
 (autoload 'delimit-columns-customize "delim-col" "\
 Customize the `columns' group." t nil)
-
 (autoload 'delimit-columns-region "delim-col" "\
 Prettify all columns in a text region.
 
@@ -7227,8 +6587,7 @@ See the `delimit-columns-str-before',
 `delimit-columns-extra' variables for customization of the
 look.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'delimit-columns-rectangle "delim-col" "\
 Prettify all columns in a text rectangle.
 
@@ -7236,17 +6595,13 @@ See `delimit-columns-region' for what this entails.
 
 START and END delimit the corners of the text rectangle.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (register-definition-prefixes "delim-col" '("delimit-columns-"))
 
-;;;***
 
-;;;### (autoloads nil "delsel" "delsel.el" (0 0 0 0))
 ;;; Generated autoloads from delsel.el
 
 (defalias 'pending-delete-mode 'delete-selection-mode)
-
 (defvar delete-selection-mode nil "\
 Non-nil if Delete-Selection mode is enabled.
 See the `delete-selection-mode' command
@@ -7254,9 +6609,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `delete-selection-mode'.")
-
 (custom-autoload 'delete-selection-mode "delsel" nil)
-
 (autoload 'delete-selection-mode "delsel" "\
 Toggle Delete Selection mode.
 
@@ -7282,20 +6635,21 @@ evaluate `(default-value \\='delete-selection-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'delete-active-region "delsel" "\
 Delete the active region.
 If KILLP is non-nil, or if called interactively with a prefix argument,
 the active region is killed instead of deleted.
 
-\(fn &optional KILLP)" t nil)
-
+(fn &optional KILLP)" t nil)
 (register-definition-prefixes "delsel" '("del" "minibuffer-keyboard-quit"))
 
-;;;***
 
-;;;### (autoloads nil "derived" "emacs-lisp/derived.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/dep.el
+
+(register-definition-prefixes "semantic/dep" 
'("defcustom-mode-local-semantic-dependency-system-include-path" "semantic-"))
+
+
 ;;; Generated autoloads from emacs-lisp/derived.el
 
 (autoload 'define-derived-mode "derived" "\
@@ -7357,25 +6711,19 @@ the hook will be named `foo-mode-hook'.
 
 See Info node `(elisp)Derived Modes' for more details.
 
-\(fn CHILD PARENT NAME [DOCSTRING] [KEYWORD-ARGS...] &rest BODY)" nil t)
-
+(fn CHILD PARENT NAME [DOCSTRING] [KEYWORD-ARGS...] &rest BODY)" nil t)
 (function-put 'define-derived-mode 'doc-string-elt '4)
-
 (function-put 'define-derived-mode 'lisp-indent-function 'defun)
-
 (autoload 'derived-mode-init-mode-variables "derived" "\
 Initialize variables for a new MODE.
 Right now, if they don't already exist, set up a blank keymap, an
 empty syntax table, and an empty abbrev table -- these will be merged
 the first time the mode is used.
 
-\(fn MODE)" nil nil)
-
+(fn MODE)" nil nil)
 (register-definition-prefixes "derived" '("derived-mode-"))
 
-;;;***
 
-;;;### (autoloads nil "descr-text" "descr-text.el" (0 0 0 0))
 ;;; Generated autoloads from descr-text.el
 
 (autoload 'describe-text-properties "descr-text" "\
@@ -7386,8 +6734,7 @@ If optional second argument OUTPUT-BUFFER is non-nil,
 insert the output into that buffer, and don't initialize or clear it
 otherwise.
 
-\(fn POS &optional OUTPUT-BUFFER BUFFER)" t nil)
-
+(fn POS &optional OUTPUT-BUFFER BUFFER)" t nil)
 (autoload 'describe-char "descr-text" "\
 Describe position POS (interactively, point) and the char after POS.
 POS is taken to be in BUFFER, or the current buffer if BUFFER is nil.
@@ -7414,8 +6761,7 @@ The character information includes:
    Unicode Data Base;
  and widgets, buttons, overlays, and text properties relevant to POS.
 
-\(fn POS &optional BUFFER)" t nil)
-
+(fn POS &optional BUFFER)" t nil)
 (autoload 'describe-char-eldoc "descr-text" "\
 Return a description of character at point for use by ElDoc mode.
 
@@ -7429,13 +6775,10 @@ minibuffer window for width limit.
 This function can be used as a value of
 `eldoc-documentation-functions' variable.
 
-\(fn CALLBACK &rest _)" nil nil)
-
+(fn CALLBACK &rest _)" nil nil)
 (register-definition-prefixes "descr-text" '("describe-"))
 
-;;;***
 
-;;;### (autoloads nil "desktop" "desktop.el" (0 0 0 0))
 ;;; Generated autoloads from desktop.el
 
 (defvar desktop-save-mode nil "\
@@ -7445,9 +6788,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `desktop-save-mode'.")
-
 (custom-autoload 'desktop-save-mode "desktop" nil)
-
 (autoload 'desktop-save-mode "desktop" "\
 Toggle desktop saving (Desktop Save mode).
 
@@ -7480,15 +6821,12 @@ evaluate `(default-value \\='desktop-save-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar desktop-locals-to-save '(desktop-locals-to-save truncate-lines 
case-fold-search case-replace fill-column overwrite-mode 
change-log-default-name line-number-mode column-number-mode 
size-indication-mode buffer-file-coding-system buffer-display-time 
indent-tabs-mode tab-width indicate-buffer-boundaries indicate-empty-lines 
show-trailing-whitespace) "\
 List of local variables to save for each buffer.
 The variables are saved only when they really are local.  Conventional minor
 modes are restored automatically; they should not be listed here.")
-
 (custom-autoload 'desktop-locals-to-save "desktop" t)
-
 (defvar-local desktop-save-buffer nil "\
 When non-nil, save buffer status in desktop file.
 
@@ -7502,7 +6840,6 @@ When file names are returned, they should be formatted 
using the call
 Later, when `desktop-read' evaluates the desktop file, auxiliary information
 is passed as the argument DESKTOP-BUFFER-MISC to functions in
 `desktop-buffer-mode-handlers'.")
-
 (defvar desktop-buffer-mode-handlers nil "\
 Alist of major mode specific functions to restore a desktop buffer.
 Functions listed are called by `desktop-create-buffer' when `desktop-read'
@@ -7541,9 +6878,7 @@ code like
 The major mode function must either be autoloaded, or of the form
 \"foobar-mode\" and defined in library \"foobar\", so that desktop
 can guess how to load the mode's definition.")
-
 (put 'desktop-buffer-mode-handlers 'risky-local-variable t)
-
 (defvar desktop-minor-mode-handlers nil "\
 Alist of functions to restore non-standard minor modes.
 Functions are called by `desktop-create-buffer' to restore minor modes.
@@ -7587,9 +6922,7 @@ The minor mode function must either be autoloaded, or of 
the form
 can guess how to load the mode's definition.
 
 See also `desktop-minor-mode-table'.")
-
 (put 'desktop-minor-mode-handlers 'risky-local-variable t)
-
 (autoload 'desktop-clear "desktop" "\
 Empty the Desktop.
 This kills all buffers except for internal ones and those with names matched by
@@ -7598,7 +6931,6 @@ Furthermore, it clears the variables listed in 
`desktop-globals-to-clear'.
 When called interactively and `desktop-restore-frames' is non-nil, it also
 deletes all frames except the selected one (and its minibuffer frame,
 if different)." t nil)
-
 (autoload 'desktop-save "desktop" "\
 Save the state of Emacs in a desktop file in directory DIRNAME.
 Optional argument RELEASE non-nil says we're done with this
@@ -7634,12 +6966,10 @@ In a non-interactive call, VERSION can be given as an 
integer, either
 206 or 208, to specify the format version in which to save the file,
 no questions asked.
 
-\(fn DIRNAME &optional RELEASE ONLY-IF-CHANGED VERSION)" t nil)
-
+(fn DIRNAME &optional RELEASE ONLY-IF-CHANGED VERSION)" t nil)
 (autoload 'desktop-remove "desktop" "\
 Delete desktop file in `desktop-dirname'.
 This function also sets `desktop-dirname' to nil." t nil)
-
 (autoload 'desktop-read "desktop" "\
 Read and process the desktop file in directory DIRNAME.
 Look for a desktop file in DIRNAME, or if DIRNAME is omitted, look in
@@ -7650,27 +6980,26 @@ Interactively, with prefix arg \\[universal-argument], 
ask for DIRNAME.
 This function is a no-op when Emacs is running in batch mode.
 It returns t if a desktop file was loaded, nil otherwise.
 
-\(fn DIRNAME)" t nil)
-
+(fn DIRNAME)" t nil)
 (autoload 'desktop-change-dir "desktop" "\
 Change to desktop saved in DIRNAME.
 Kill the desktop as specified by variables `desktop-save-mode' and
 `desktop-save', then clear the desktop and load the desktop file in
 directory DIRNAME.
 
-\(fn DIRNAME)" t nil)
-
+(fn DIRNAME)" t nil)
 (autoload 'desktop-save-in-desktop-dir "desktop" "\
 Save the desktop in directory `desktop-dirname'." t nil)
-
 (autoload 'desktop-revert "desktop" "\
 Revert to the last loaded desktop." t nil)
-
 (register-definition-prefixes "desktop" '("desktop-"))
 
-;;;***
 
-;;;### (autoloads nil "deuglify" "gnus/deuglify.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/detect.el
+
+(register-definition-prefixes "ede/detect" '("ede-"))
+
+
 ;;; Generated autoloads from gnus/deuglify.el
 
 (autoload 'gnus-article-outlook-unwrap-lines "deuglify" "\
@@ -7680,44 +7009,34 @@ You can control what lines will be unwrapped by frobbing
 indicating the minimum and maximum length of an unwrapped citation line.  If
 NODISPLAY is non-nil, don't redisplay the article buffer.
 
-\(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
-
+(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
 (autoload 'gnus-article-outlook-repair-attribution "deuglify" "\
 Repair a broken attribution line.
 If NODISPLAY is non-nil, don't redisplay the article buffer.
 
-\(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
-
+(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
 (autoload 'gnus-article-outlook-rearrange-citation "deuglify" "\
 Repair broken citations.
 If NODISPLAY is non-nil, don't redisplay the article buffer.
 
-\(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
-
+(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
 (autoload 'gnus-outlook-deuglify-article "deuglify" "\
 Full deuglify of broken Outlook (Express) articles.
 Treat \"smartquotes\", unwrap lines, repair attribution and
 rearrange citation.  If NODISPLAY is non-nil, don't redisplay the
 article buffer.
 
-\(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
-
+(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
 (autoload 'gnus-article-outlook-deuglify-article "deuglify" "\
 Deuglify broken Outlook (Express) articles and redisplay." '(gnus-article-mode 
gnus-summary-mode) nil)
-
 (register-definition-prefixes "deuglify" '("gnus-outlook-"))
 
-;;;***
 
-;;;### (autoloads nil "dframe" "dframe.el" (0 0 0 0))
 ;;; Generated autoloads from dframe.el
 
 (register-definition-prefixes "dframe" '("dframe-"))
 
-;;;***
 
-;;;### (autoloads nil "diary-lib" "calendar/diary-lib.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from calendar/diary-lib.el
 
 (autoload 'diary "diary-lib" "\
@@ -7726,8 +7045,7 @@ If no argument is provided, the number of days of diary 
entries is governed
 by the variable `diary-number-of-entries'.  A value of ARG less than 1
 does nothing.  This function is suitable for execution in an init file.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'diary-mail-entries "diary-lib" "\
 Send a mail message showing diary entries for next NDAYS days.
 If no prefix argument is given, NDAYS is set to `diary-mail-days'.
@@ -7741,27 +7059,23 @@ ensure that all relevant variables are set.
 #!/usr/bin/emacs -script
 ;; diary-rem.el - run the Emacs diary-reminder
 
-\(setq diary-mail-days 3
+(setq diary-mail-days 3
       diary-file \"/path/to/diary.file\"
       calendar-date-style \\='european
       diary-mail-addr \"user@host.name\")
 
-\(diary-mail-entries)
+(diary-mail-entries)
 
 # diary-rem.el ends here
 
-\(fn &optional NDAYS)" t nil)
-
+(fn &optional NDAYS)" t nil)
 (autoload 'diary-mode "diary-lib" "\
 Major mode for editing the diary file.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "diary-lib" '("calendar-mark-" "diary-"))
 
-;;;***
 
-;;;### (autoloads nil "dictionary" "net/dictionary.el" (0 0 0 0))
 ;;; Generated autoloads from net/dictionary.el
 
 (autoload 'dictionary-mode "dictionary" "\
@@ -7783,35 +7097,28 @@ This is a quick reference to this mode describing the 
default key bindings:
 * \\[dictionary-select-strategy] select the default search strategy
 
 * RET or <mouse-2> visit that link" nil nil)
-
 (autoload 'dictionary "dictionary" "\
 Create a new dictionary buffer and install `dictionary-mode'." t nil)
-
 (autoload 'dictionary-search "dictionary" "\
 Search the WORD in DICTIONARY if given or in all if nil.
 It presents the selection or word at point as default input and
 allows editing it.
 
-\(fn WORD &optional DICTIONARY)" t nil)
-
+(fn WORD &optional DICTIONARY)" t nil)
 (autoload 'dictionary-lookup-definition "dictionary" "\
 Unconditionally lookup the word at point." t nil)
-
 (autoload 'dictionary-match-words "dictionary" "\
 Search PATTERN in current default dictionary using default strategy.
 
-\(fn &optional PATTERN &rest IGNORED)" t nil)
-
+(fn &optional PATTERN &rest IGNORED)" t nil)
 (autoload 'dictionary-mouse-popup-matching-words "dictionary" "\
 Display entries matching the word at the cursor retrieved using EVENT.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (autoload 'dictionary-popup-matching-words "dictionary" "\
 Display entries matching WORD or the current word if not given.
 
-\(fn &optional WORD)" t nil)
-
+(fn &optional WORD)" t nil)
 (autoload 'dictionary-tooltip-mode "dictionary" "\
 Display tooltips for the current word.
 
@@ -7819,8 +7126,7 @@ This function can be used to enable or disable the 
tooltip mode
 for the current buffer (based on ARG).  If global-tooltip-mode is
 active it will overwrite that mode for the current buffer.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'global-dictionary-tooltip-mode "dictionary" "\
 Enable/disable `dictionary-tooltip-mode' for all buffers.
 
@@ -7830,29 +7136,27 @@ It can be overwritten for each buffer using 
`dictionary-tooltip-mode'.
 Note: (global-dictionary-tooltip-mode 0) will not disable the mode
 any buffer where (dictionary-tooltip-mode 1) has been called.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'dictionary-context-menu "dictionary" "\
 Populate MENU with dictionary commands at CLICK.
 When you add this function to `context-menu-functions',
 the context menu will contain an item that searches
 the word at mouse click.
 
-\(fn MENU CLICK)" nil nil)
-
+(fn MENU CLICK)" nil nil)
 (register-definition-prefixes "dictionary" '("dictionary-" 
"global-dictionary-tooltip-mode"))
 
-;;;***
 
-;;;### (autoloads nil "dictionary-connection" "net/dictionary-connection.el"
-;;;;;;  (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/dictionary.el
+
+(register-definition-prefixes "srecode/dictionary" '("srecode-"))
+
+
 ;;; Generated autoloads from net/dictionary-connection.el
 
 (register-definition-prefixes "dictionary-connection" 
'("dictionary-connection-"))
 
-;;;***
 
-;;;### (autoloads nil "diff" "vc/diff.el" (0 0 0 0))
 ;;; Generated autoloads from vc/diff.el
 
 (defvar diff-switches (purecopy "-u") "\
@@ -7862,14 +7166,10 @@ This variable is also used in the `vc-diff' command 
(and related
 commands) if the backend-specific diff switch variable isn't
 set (`vc-git-diff-switches' for git, for instance), and
 `vc-diff-switches' isn't set.")
-
 (custom-autoload 'diff-switches "diff" t)
-
 (defvar diff-command (purecopy "diff") "\
 The command to use to run diff.")
-
 (custom-autoload 'diff-command "diff" t)
-
 (autoload 'diff "diff" "\
 Find and display the differences between OLD and NEW files.
 When called interactively, read NEW, then OLD, using the
@@ -7884,8 +7184,7 @@ command.
 
 Non-interactively, OLD and NEW may each be a file or a buffer.
 
-\(fn OLD NEW &optional SWITCHES NO-ASYNC)" t nil)
-
+(fn OLD NEW &optional SWITCHES NO-ASYNC)" t nil)
 (autoload 'diff-backup "diff" "\
 Diff this file with its backup file or vice versa.
 Uses the latest backup, if there are several numerical backups.
@@ -7893,19 +7192,16 @@ If this file is a backup, diff it with its original.
 The backup file is the first file given to `diff'.
 With prefix arg SWITCHES, prompt for diff switches.
 
-\(fn FILE &optional SWITCHES)" t nil)
-
+(fn FILE &optional SWITCHES)" t nil)
 (autoload 'diff-latest-backup-file "diff" "\
 Return the latest existing backup of file FN, or nil.
 
-\(fn FN)" nil nil)
-
+(fn FN)" nil nil)
 (autoload 'diff-buffer-with-file "diff" "\
 View the differences between BUFFER and its associated file.
 This requires the external program `diff' to be in your `exec-path'.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (autoload 'diff-buffers "diff" "\
 Find and display the differences between OLD and NEW buffers.
 
@@ -7923,13 +7219,10 @@ OLD and NEW may each be a buffer or a buffer name.
 
 Also see the `diff-entire-buffers' variable.
 
-\(fn OLD NEW &optional SWITCHES NO-ASYNC)" t nil)
-
+(fn OLD NEW &optional SWITCHES NO-ASYNC)" t nil)
 (register-definition-prefixes "diff" '("diff-"))
 
-;;;***
 
-;;;### (autoloads nil "diff-mode" "vc/diff-mode.el" (0 0 0 0))
 ;;; Generated autoloads from vc/diff-mode.el
 
 (autoload 'diff-mode "diff-mode" "\
@@ -7947,8 +7240,7 @@ a diff with \\[diff-reverse-direction].
 
 \\{diff-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'diff-minor-mode "diff-mode" "\
 Toggle Diff minor mode.
 
@@ -7968,13 +7260,10 @@ evaluate `diff-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "diff-mode" '("diff-"))
 
-;;;***
 
-;;;### (autoloads nil "dig" "net/dig.el" (0 0 0 0))
 ;;; Generated autoloads from net/dig.el
 
 (autoload 'dig "dig" "\
@@ -7983,13 +7272,15 @@ See `dig-invoke' for an explanation for the parameters.
 When called interactively, DOMAIN is prompted for.  If given a prefix,
 also prompt for the QUERY-TYPE parameter.
 
-\(fn DOMAIN &optional QUERY-TYPE QUERY-CLASS QUERY-OPTION DIG-OPTION SERVER)" 
t nil)
-
+(fn DOMAIN &optional QUERY-TYPE QUERY-CLASS QUERY-OPTION DIG-OPTION SERVER)" t 
nil)
 (register-definition-prefixes "dig" '("dig-" "query-dig"))
 
-;;;***
 
-;;;### (autoloads nil "dired" "dired.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/dired.el
+
+(register-definition-prefixes "ede/dired" '("ede-dired-"))
+
+
 ;;; Generated autoloads from dired.el
 
 (defvar dired-listing-switches (purecopy "-al") "\
@@ -8009,16 +7300,13 @@ each option.
 On systems such as MS-DOS and MS-Windows, which use `ls' emulation in Lisp,
 some of the `ls' switches are not supported; see the doc string of
 `insert-directory' in `ls-lisp.el' for more details.")
-
 (custom-autoload 'dired-listing-switches "dired" t)
-
 (defvar-local dired-directory nil "\
 The directory name or wildcard spec that this Dired directory lists.
 Local to each Dired buffer.  May be a list, in which case the car is the
 directory name and the cdr is the list of files to mention.
 The directory name must be absolute, but need not be fully expanded.")
  (define-key ctl-x-map "d" 'dired)
-
 (autoload 'dired "dired" "\
 \"Edit\" directory DIRNAME--delete, rename, print, etc. some files in it.
 Optional second argument SWITCHES specifies the options to be used
@@ -8042,31 +7330,26 @@ Type \\[describe-mode] after entering Dired for more 
info.
 
 If DIRNAME is already in a Dired buffer, that buffer is used without refresh.
 
-\(fn DIRNAME &optional SWITCHES)" t nil)
+(fn DIRNAME &optional SWITCHES)" t nil)
  (define-key ctl-x-4-map "d" 'dired-other-window)
-
 (autoload 'dired-other-window "dired" "\
 \"Edit\" directory DIRNAME.  Like `dired' but select in another window.
 
-\(fn DIRNAME &optional SWITCHES)" t nil)
+(fn DIRNAME &optional SWITCHES)" t nil)
  (define-key ctl-x-5-map "d" 'dired-other-frame)
-
 (autoload 'dired-other-frame "dired" "\
 \"Edit\" directory DIRNAME.  Like `dired' but make a new frame.
 
-\(fn DIRNAME &optional SWITCHES)" t nil)
+(fn DIRNAME &optional SWITCHES)" t nil)
  (define-key tab-prefix-map "d" 'dired-other-tab)
-
 (autoload 'dired-other-tab "dired" "\
 \"Edit\" directory DIRNAME.  Like `dired' but make a new tab.
 
-\(fn DIRNAME &optional SWITCHES)" t nil)
-
+(fn DIRNAME &optional SWITCHES)" t nil)
 (autoload 'dired-noselect "dired" "\
 Like `dired' but return the Dired buffer as value, do not select it.
 
-\(fn DIR-OR-LIST &optional SWITCHES)" nil nil)
-
+(fn DIR-OR-LIST &optional SWITCHES)" nil nil)
 (autoload 'dired-mode "dired" "\
 Mode for \"editing\" directory listings.
 In Dired, you are \"editing\" a list of the files in a directory and
@@ -8117,9 +7400,8 @@ This mode runs the following hooks:
 Keybindings:
 \\{dired-mode-map}
 
-\(fn &optional DIRNAME SWITCHES)" nil nil)
+(fn &optional DIRNAME SWITCHES)" nil nil)
  (put 'dired-find-alternate-file 'disabled t)
-
 (autoload 'dired-jump "dired" "\
 Jump to Dired buffer corresponding to current buffer.
 If in a buffer visiting a file, Dired that file's directory and
@@ -8136,18 +7418,24 @@ When OTHER-WINDOW is non-nil, jump to Dired buffer in 
other window.
 When FILE-NAME is non-nil, jump to its line in Dired.
 Interactively with prefix argument, read FILE-NAME.
 
-\(fn &optional OTHER-WINDOW FILE-NAME)" t nil)
-
+(fn &optional OTHER-WINDOW FILE-NAME)" t nil)
 (autoload 'dired-jump-other-window "dired" "\
 Like \\[dired-jump] (`dired-jump') but in other window.
 
-\(fn &optional FILE-NAME)" t nil)
-
+(fn &optional FILE-NAME)" t nil)
 (register-definition-prefixes "dired" '("dired-"))
 
-;;;***
 
-;;;### (autoloads nil "dirtrack" "dirtrack.el" (0 0 0 0))
+;;; Generated autoloads from dired-aux.el
+
+(register-definition-prefixes "dired-aux" '("dired-" 
"minibuffer-default-add-dired-shell-commands"))
+
+
+;;; Generated autoloads from dired-x.el
+
+(register-definition-prefixes "dired-x" '("dired-" "virtual-dired"))
+
+
 ;;; Generated autoloads from dirtrack.el
 
 (autoload 'dirtrack-mode "dirtrack" "\
@@ -8175,8 +7463,7 @@ evaluate `dirtrack-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'dirtrack "dirtrack" "\
 Determine the current directory from the process output for a prompt.
 This filter function is used by `dirtrack-mode'.  It looks for
@@ -8184,58 +7471,47 @@ the prompt specified by `dirtrack-list', and calls
 `shell-process-cd' if the directory seems to have changed away
 from `default-directory'.
 
-\(fn INPUT)" nil nil)
-
+(fn INPUT)" nil nil)
 (register-definition-prefixes "dirtrack" '("dirtrack-"))
 
-;;;***
 
-;;;### (autoloads nil "disass" "emacs-lisp/disass.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/disass.el
 
 (autoload 'disassemble "disass" "\
 Print disassembled code for OBJECT in (optional) BUFFER.
 OBJECT can be a symbol defined as a function, or a function itself
-\(a lambda expression or a compiled-function object).
+(a lambda expression or a compiled-function object).
 If OBJECT is not already compiled, we compile it, but do not
 redefine OBJECT if it is a symbol.
 
-\(fn OBJECT &optional BUFFER INDENT INTERACTIVE-P)" t nil)
-
+(fn OBJECT &optional BUFFER INDENT INTERACTIVE-P)" t nil)
 (register-definition-prefixes "disass" '("disassemble-"))
 
-;;;***
 
-;;;### (autoloads nil "disp-table" "disp-table.el" (0 0 0 0))
 ;;; Generated autoloads from disp-table.el
 
 (autoload 'make-display-table "disp-table" "\
 Return a new, empty display table." nil nil)
-
 (autoload 'display-table-slot "disp-table" "\
 Return the value of the extra slot in DISPLAY-TABLE named SLOT.
 SLOT may be a number from 0 to 5 inclusive, or a slot name (symbol).
 Valid symbols are `truncation', `wrap', `escape', `control',
 `selective-display', and `vertical-border'.
 
-\(fn DISPLAY-TABLE SLOT)" nil nil)
-
+(fn DISPLAY-TABLE SLOT)" nil nil)
 (autoload 'set-display-table-slot "disp-table" "\
 Set the value of the extra slot in DISPLAY-TABLE named SLOT to VALUE.
 SLOT may be a number from 0 to 5 inclusive, or a name (symbol).
 Valid symbols are `truncation', `wrap', `escape', `control',
 `selective-display', and `vertical-border'.
 
-\(fn DISPLAY-TABLE SLOT VALUE)" nil nil)
-
+(fn DISPLAY-TABLE SLOT VALUE)" nil nil)
 (autoload 'describe-display-table "disp-table" "\
 Describe the display table DT in a help buffer.
 
-\(fn DT)" nil nil)
-
+(fn DT)" nil nil)
 (autoload 'describe-current-display-table "disp-table" "\
 Describe the display table in use in the selected window and buffer." t nil)
-
 (autoload 'standard-display-8bit "disp-table" "\
 Display characters representing raw bytes in the range L to H literally.
 
@@ -8249,57 +7525,47 @@ byte.
 Note that ASCII printable characters (SPC to TILDA) are displayed
 in the default way after this call.
 
-\(fn L H)" nil nil)
-
+(fn L H)" nil nil)
 (autoload 'standard-display-default "disp-table" "\
 Display characters in the range L to H using the default notation.
 
-\(fn L H)" nil nil)
-
+(fn L H)" nil nil)
 (autoload 'standard-display-ascii "disp-table" "\
 Display character C using printable string S.
 
-\(fn C S)" nil nil)
-
+(fn C S)" nil nil)
 (autoload 'standard-display-g1 "disp-table" "\
 Display character C as character SC in the g1 character set.
 This function assumes that your terminal uses the SO/SI characters;
 it is meaningless for a graphical frame.
 
-\(fn C SC)" nil nil)
-
+(fn C SC)" nil nil)
 (autoload 'standard-display-graphic "disp-table" "\
 Display character C as character GC in graphics character set.
 This function assumes VT100-compatible escapes; it is meaningless
 for a graphical frame.
 
-\(fn C GC)" nil nil)
-
+(fn C GC)" nil nil)
 (autoload 'standard-display-underline "disp-table" "\
 Display character C as character UC plus underlining.
 
-\(fn C UC)" nil nil)
-
+(fn C UC)" nil nil)
 (autoload 'create-glyph "disp-table" "\
 Allocate a glyph code to display by sending STRING to the terminal.
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (autoload 'make-glyph-code "disp-table" "\
 Return a glyph code representing char CHAR with face FACE.
 
-\(fn CHAR &optional FACE)" nil nil)
-
+(fn CHAR &optional FACE)" nil nil)
 (autoload 'glyph-char "disp-table" "\
 Return the character of glyph code GLYPH.
 
-\(fn GLYPH)" nil nil)
-
+(fn GLYPH)" nil nil)
 (autoload 'glyph-face "disp-table" "\
 Return the face of glyph code GLYPH, or nil if glyph has default face.
 
-\(fn GLYPH)" nil nil)
-
+(fn GLYPH)" nil nil)
 (autoload 'standard-display-european "disp-table" "\
 Semi-obsolete way to toggle display of ISO 8859 European characters.
 
@@ -8319,14 +7585,10 @@ from Lisp code also selects Latin-1 as the language 
environment.
 This provides increased compatibility for users who call this function
 in `.emacs'.
 
-\(fn ARG)" nil nil)
-
+(fn ARG)" nil nil)
 (register-definition-prefixes "disp-table" '("display-table-print-array"))
 
-;;;***
 
-;;;### (autoloads nil "display-fill-column-indicator" 
"display-fill-column-indicator.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from display-fill-column-indicator.el
 
 (autoload 'display-fill-column-indicator-mode "display-fill-column-indicator" 
"\
@@ -8356,10 +7618,8 @@ evaluate `display-fill-column-indicator-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (put 'global-display-fill-column-indicator-mode 'globalized-minor-mode t)
-
 (defvar global-display-fill-column-indicator-mode nil "\
 Non-nil if Global Display-Fill-Column-Indicator mode is enabled.
 See the `global-display-fill-column-indicator-mode' command
@@ -8367,9 +7627,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-display-fill-column-indicator-mode'.")
-
 (custom-autoload 'global-display-fill-column-indicator-mode 
"display-fill-column-indicator" nil)
-
 (autoload 'global-display-fill-column-indicator-mode 
"display-fill-column-indicator" "\
 Toggle Display-Fill-Column-Indicator mode in all buffers.
 With prefix ARG, enable Global Display-Fill-Column-Indicator mode if
@@ -8388,8 +7646,7 @@ Display-Fill-Column-Indicator mode.
 `global-display-fill-column-indicator-modes' is used to control which
 modes this minor mode is used in.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar global-display-fill-column-indicator-modes '((not special-mode) t) "\
 Which major modes `display-fill-column-indicator-mode' is switched on in.
 This variable can be either t (all major modes), nil (no major modes),
@@ -8403,15 +7660,10 @@ modes derived from `message-mode' or `mail-mode', but 
do use in other
 modes derived from `text-mode'\".  An element with value t means \"use\"
 and nil means \"don't use\".  There's an implicit nil at the end of the
 list.")
-
 (custom-autoload 'global-display-fill-column-indicator-modes 
"display-fill-column-indicator" t)
-
 (register-definition-prefixes "display-fill-column-indicator" 
'("display-fill-column-indicator--turn-on"))
 
-;;;***
 
-;;;### (autoloads nil "display-line-numbers" "display-line-numbers.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from display-line-numbers.el
 
 (autoload 'display-line-numbers-mode "display-line-numbers" "\
@@ -8438,10 +7690,8 @@ evaluate `display-line-numbers-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (put 'global-display-line-numbers-mode 'globalized-minor-mode t)
-
 (defvar global-display-line-numbers-mode nil "\
 Non-nil if Global Display-Line-Numbers mode is enabled.
 See the `global-display-line-numbers-mode' command
@@ -8449,9 +7699,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-display-line-numbers-mode'.")
-
 (custom-autoload 'global-display-line-numbers-mode "display-line-numbers" nil)
-
 (autoload 'global-display-line-numbers-mode "display-line-numbers" "\
 Toggle Display-Line-Numbers mode in all buffers.
 With prefix ARG, enable Global Display-Line-Numbers mode if ARG is
@@ -8467,13 +7715,57 @@ Display-Line-Numbers mode is enabled in all buffers 
where
 See `display-line-numbers-mode' for more information on
 Display-Line-Numbers mode.
 
-\(fn &optional ARG)" t nil)
+(fn &optional ARG)" t nil)
+(defvar header-line-indent "" "\
+String to indent at the start if the header line.
+This is used in `header-line-indent-mode', and buffers that have
+this switched on should have a `header-line-format' that look like:
+
+  (\"\" header-line-indent THE-REST...)
+
+Also see `header-line-indent-width'.")
+(defvar header-line-indent-width 0 "\
+The width of the current line numbers displayed.
+This is updated when `header-line-indent-mode' is switched on.
 
-(register-definition-prefixes "display-line-numbers" 
'("display-line-numbers-"))
+Also see `header-line-indent'.")
+(autoload 'header-line-indent-mode "display-line-numbers" "\
+Mode to indent the header line in `display-line-numbers-mode' buffers.
+
+This means that the header line will be kept indented so that it
+has blank space that's as wide as the displayed line numbers in
+the buffer.
+
+Buffers that have this switched on should have a
+`header-line-format' that look like:
+
+  (\"\" header-line-indent THE-REST...)
+
+The `header-line-indent-width' variable is also kept updated, and
+has the width of `header-line-format'.  This can be used, for
+instance, in `:align-to' specs, like:
+
+  (space :align-to (+ header-line-indent-width 10))
+
+This is a minor mode.  If called interactively, toggle the
+`Header-Line-Indent mode' mode.  If the prefix argument is
+positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.
+Disable the mode if ARG is a negative number.
+
+To check whether the minor mode is enabled in the current buffer,
+evaluate `header-line-indent-mode'.
+
+The mode's hook is called both when the mode is enabled and when
+it is disabled.
+
+(fn &optional ARG)" t nil)
+(register-definition-prefixes "display-line-numbers" '("display-line-numbers-" 
"header-line-indent--"))
 
-;;;***
 
-;;;### (autoloads nil "dissociate" "play/dissociate.el" (0 0 0 0))
 ;;; Generated autoloads from play/dissociate.el
 
 (autoload 'dissociated-press "dissociate" "\
@@ -8485,11 +7777,9 @@ If ARG is positive, require ARG chars of continuity.
 If ARG is negative, require -ARG words of continuity.
 Default is 2.
 
-\(fn &optional ARG)" t nil)
+(fn &optional ARG)" t nil)
 
-;;;***
 
-;;;### (autoloads nil "dnd" "dnd.el" (0 0 0 0))
 ;;; Generated autoloads from dnd.el
 
 (defvar dnd-protocol-alist `((,(purecopy "^file:///") . dnd-open-local-file) 
(,(purecopy "^file://") . dnd-open-file) (,(purecopy "^file:") . 
dnd-open-local-file) (,(purecopy "^\\(https?\\|ftp\\|file\\|nfs\\)://") . 
dnd-open-file)) "\
@@ -8504,14 +7794,10 @@ is a pair of (REGEXP . FUNCTION), those regexps are 
tried for a match.
 If no match is found, the URL is inserted as text by calling `dnd-insert-text'.
 The function shall return the action done (move, copy, link or private)
 if some action was made, or nil if the URL is ignored.")
-
 (custom-autoload 'dnd-protocol-alist "dnd" t)
-
 (register-definition-prefixes "dnd" '("dnd-"))
 
-;;;***
 
-;;;### (autoloads nil "dns" "net/dns.el" (0 0 0 0))
 ;;; Generated autoloads from net/dns.el
 
 (autoload 'dns-query "dns" "\
@@ -8519,18 +7805,15 @@ Query a DNS server for NAME of TYPE.
 If FULL, return the entire record returned.
 If REVERSE, look up an IP address.
 
-\(fn NAME &optional TYPE FULL REVERSE)" nil nil)
-
+(fn NAME &optional TYPE FULL REVERSE)" nil nil)
 (register-definition-prefixes "dns" '("dns-"))
 
-;;;***
 
-;;;### (autoloads nil "dns-mode" "textmodes/dns-mode.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/dns-mode.el
 
 (autoload 'dns-mode "dns-mode" "\
 Major mode for viewing and editing DNS master files.
-This mode is inherited from text mode.  It add syntax
+This mode is derived from text mode.  It adds syntax
 highlighting, and some commands for handling DNS master files.
 Its keymap inherits from `text-mode' and it has the same
 variables for customizing indentation.  It has its own abbrev
@@ -8538,17 +7821,18 @@ table and its own syntax table.
 
 Turning on DNS mode runs `dns-mode-hook'.
 
-\(fn)" t nil)
+(fn)" t nil)
  (defalias 'zone-mode 'dns-mode)
-
 (autoload 'dns-mode-soa-increment-serial "dns-mode" "\
 Locate SOA record and increment the serial field." t nil)
-
 (register-definition-prefixes "dns-mode" '("dns-mode-"))
 
-;;;***
 
-;;;### (autoloads nil "doc-view" "doc-view.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/doc.el
+
+(register-definition-prefixes "semantic/doc" '("semantic-doc"))
+
+
 ;;; Generated autoloads from doc-view.el
 
 (autoload 'doc-view-mode-p "doc-view" "\
@@ -8556,8 +7840,7 @@ Return non-nil if document type TYPE is available for 
`doc-view'.
 Document types are symbols like `dvi', `ps', `pdf', `epub',
 `cbz', `fb2', `xps', `oxps', or`odf' (any OpenDocument format).
 
-\(fn TYPE)" nil nil)
-
+(fn TYPE)" nil nil)
 (autoload 'doc-view-mode "doc-view" "\
 Major mode in DocView buffers.
 
@@ -8567,12 +7850,10 @@ and DVI files (as PNG images) in Emacs buffers.
 You can use \\<doc-view-mode-map>\\[doc-view-toggle-display] to
 toggle between displaying the document or editing it as text.
 \\{doc-view-mode-map}" t nil)
-
 (autoload 'doc-view-mode-maybe "doc-view" "\
 Switch to `doc-view-mode' if possible.
 If the required external tools are not available, then fallback
 to the next best mode." nil nil)
-
 (autoload 'doc-view-minor-mode "doc-view" "\
 Toggle displaying buffer via Doc View (Doc View minor mode).
 
@@ -8592,56 +7873,46 @@ evaluate `doc-view-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'doc-view-bookmark-jump "doc-view" "\
 
 
-\(fn BMK)" nil nil)
-
+(fn BMK)" nil nil)
 (register-definition-prefixes "doc-view" '("doc-view-"))
 
-;;;***
 
-;;;### (autoloads nil "doctor" "play/doctor.el" (0 0 0 0))
 ;;; Generated autoloads from play/doctor.el
 
 (autoload 'doctor "doctor" "\
 Switch to *doctor* buffer and start giving psychotherapy." t nil)
-
 (register-definition-prefixes "doctor" '("doc" "make-doctor-variables"))
 
-;;;***
 
-;;;### (autoloads nil "dom" "dom.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/document.el
+
+(register-definition-prefixes "srecode/document" '("srecode-document-"))
+
+
 ;;; Generated autoloads from dom.el
 
 (register-definition-prefixes "dom" '("dom-"))
 
-;;;***
 
-;;;### (autoloads nil "dos-fns" "dos-fns.el" (0 0 0 0))
 ;;; Generated autoloads from dos-fns.el
 
 (register-definition-prefixes "dos-fns" '("dos"))
 
-;;;***
 
-;;;### (autoloads nil "dos-vars" "dos-vars.el" (0 0 0 0))
 ;;; Generated autoloads from dos-vars.el
 
 (register-definition-prefixes "dos-vars" '("dos-codepage-setup-hook" 
"msdos-shells"))
 
-;;;***
 
-;;;### (autoloads nil "dos-w32" "dos-w32.el" (0 0 0 0))
 ;;; Generated autoloads from dos-w32.el
 
 (register-definition-prefixes "dos-w32" '("file-name-buffer-file-type-alist" 
"find-" "w32-"))
 
-;;;***
 
-;;;### (autoloads nil "double" "double.el" (0 0 0 0))
 ;;; Generated autoloads from double.el
 
 (autoload 'double-mode "double" "\
@@ -8664,36 +7935,25 @@ evaluate `double-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "double" '("double-"))
 
-;;;***
 
-;;;### (autoloads nil "dunnet" "play/dunnet.el" (0 0 0 0))
 ;;; Generated autoloads from play/dunnet.el
 
 (autoload 'dunnet "dunnet" "\
 Switch to *dungeon* buffer and start game." t nil)
-
 (register-definition-prefixes "dunnet" '("dun" "obj-special"))
 
-;;;***
 
-;;;### (autoloads nil "dynamic-setting" "dynamic-setting.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from dynamic-setting.el
 
 (register-definition-prefixes "dynamic-setting" 
'("dynamic-setting-handle-config-changed-event" 
"font-setting-change-default-font"))
 
-;;;***
 
-;;;### (autoloads nil "easy-mmode" "emacs-lisp/easy-mmode.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/easy-mmode.el
 
 (defalias 'easy-mmode-define-minor-mode #'define-minor-mode)
-
 (autoload 'define-minor-mode "easy-mmode" "\
 Define a new minor mode MODE.
 This defines the toggle command MODE and (by default) a control variable
@@ -8765,16 +8025,11 @@ For backward compatibility with the Emacs<21 calling 
convention,
 the keywords can also be preceded by the obsolete triplet
 INIT-VALUE LIGHTER KEYMAP.
 
-\(fn MODE DOC [KEYWORD VAL ... &rest BODY])" nil t)
-
+(fn MODE DOC [KEYWORD VAL ... &rest BODY])" nil t)
 (function-put 'define-minor-mode 'doc-string-elt '2)
-
 (function-put 'define-minor-mode 'lisp-indent-function 'defun)
-
 (defalias 'easy-mmode-define-global-mode #'define-globalized-minor-mode)
-
 (defalias 'define-global-minor-mode #'define-globalized-minor-mode)
-
 (autoload 'define-globalized-minor-mode "easy-mmode" "\
 Make a global mode GLOBAL-MODE corresponding to buffer-local minor MODE.
 TURN-ON is a function that will be called with no args in every buffer
@@ -8804,12 +8059,9 @@ When a major mode is initialized, MODE is actually 
turned on just
 after running the major mode's hook.  However, MODE is not turned
 on if the hook has explicitly disabled it.
 
-\(fn GLOBAL-MODE MODE TURN-ON [KEY VALUE]... BODY...)" nil t)
-
+(fn GLOBAL-MODE MODE TURN-ON [KEY VALUE]... BODY...)" nil t)
 (function-put 'define-globalized-minor-mode 'doc-string-elt '2)
-
 (function-put 'define-globalized-minor-mode 'lisp-indent-function 'defun)
-
 (autoload 'easy-mmode-define-keymap "easy-mmode" "\
 Return a keymap built from bindings BS.
 BS must be a list of (KEY . BINDING) where
@@ -8827,8 +8079,7 @@ Valid keywords and arguments are:
   :suppress  Non-nil to call `suppress-keymap' on keymap,
              `nodigits' to suppress digits as prefix arguments.
 
-\(fn BS &optional NAME M ARGS)" nil nil)
-
+(fn BS &optional NAME M ARGS)" nil nil)
 (autoload 'easy-mmode-defmap "easy-mmode" "\
 Define a constant M whose value is the result of `easy-mmode-define-keymap'.
 The M, BS, and ARGS arguments are as per that function.  DOC is
@@ -8836,82 +8087,59 @@ the constant's documentation.
 
 This macro is deprecated; use `defvar-keymap' instead.
 
-\(fn M BS DOC &rest ARGS)" nil t)
-
+(fn M BS DOC &rest ARGS)" nil t)
 (function-put 'easy-mmode-defmap 'doc-string-elt '3)
-
 (function-put 'easy-mmode-defmap 'lisp-indent-function '1)
-
 (autoload 'easy-mmode-defsyntax "easy-mmode" "\
 Define variable ST as a syntax-table.
 CSS contains a list of syntax specifications of the form (CHAR . SYNTAX).
 
-\(fn ST CSS DOC &rest ARGS)" nil t)
-
+(fn ST CSS DOC &rest ARGS)" nil t)
 (function-put 'easy-mmode-defsyntax 'doc-string-elt '3)
-
 (function-put 'easy-mmode-defsyntax 'lisp-indent-function '1)
-
 (register-definition-prefixes "easy-mmode" '("easy-mmode-"))
 
-;;;***
 
-;;;### (autoloads nil "ebnf-abn" "progmodes/ebnf-abn.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/ebnf-abn.el
 
 (register-definition-prefixes "ebnf-abn" '("ebnf-abn-"))
 
-;;;***
 
-;;;### (autoloads nil "ebnf-bnf" "progmodes/ebnf-bnf.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/ebnf-bnf.el
 
 (register-definition-prefixes "ebnf-bnf" '("ebnf-"))
 
-;;;***
 
-;;;### (autoloads nil "ebnf-dtd" "progmodes/ebnf-dtd.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/ebnf-dtd.el
 
 (register-definition-prefixes "ebnf-dtd" '("ebnf-dtd-"))
 
-;;;***
 
-;;;### (autoloads nil "ebnf-ebx" "progmodes/ebnf-ebx.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/ebnf-ebx.el
 
 (register-definition-prefixes "ebnf-ebx" '("ebnf-ebx-"))
 
-;;;***
 
-;;;### (autoloads nil "ebnf-iso" "progmodes/ebnf-iso.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/ebnf-iso.el
 
 (register-definition-prefixes "ebnf-iso" '("ebnf-"))
 
-;;;***
 
-;;;### (autoloads nil "ebnf-otz" "progmodes/ebnf-otz.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/ebnf-otz.el
 
 (register-definition-prefixes "ebnf-otz" '("ebnf-"))
 
-;;;***
 
-;;;### (autoloads nil "ebnf-yac" "progmodes/ebnf-yac.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/ebnf-yac.el
 
 (register-definition-prefixes "ebnf-yac" '("ebnf-yac-"))
 
-;;;***
 
-;;;### (autoloads nil "ebnf2ps" "progmodes/ebnf2ps.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/ebnf2ps.el
-(push (purecopy '(ebnf2ps 4 4)) package--builtin-versions)
 
+(push (purecopy '(ebnf2ps 4 4)) package--builtin-versions)
 (autoload 'ebnf-customize "ebnf2ps" "\
 Customization for ebnf group." t nil)
-
 (autoload 'ebnf-print-directory "ebnf2ps" "\
 Generate and print a PostScript syntactic chart image of DIRECTORY.
 
@@ -8922,8 +8150,7 @@ processed.
 
 See also `ebnf-print-buffer'.
 
-\(fn &optional DIRECTORY)" t nil)
-
+(fn &optional DIRECTORY)" t nil)
 (autoload 'ebnf-print-file "ebnf2ps" "\
 Generate and print a PostScript syntactic chart image of the file FILE.
 
@@ -8932,8 +8159,7 @@ killed after process termination.
 
 See also `ebnf-print-buffer'.
 
-\(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
-
+(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
 (autoload 'ebnf-print-buffer "ebnf2ps" "\
 Generate and print a PostScript syntactic chart image of the buffer.
 
@@ -8946,14 +8172,12 @@ is nil, send the image to the printer.  If FILENAME is 
a string, save
 the PostScript image in a file with that name.  If FILENAME is a
 number, prompt the user for the name of the file to save in.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (autoload 'ebnf-print-region "ebnf2ps" "\
 Generate and print a PostScript syntactic chart image of the region.
 Like `ebnf-print-buffer', but prints just the current region.
 
-\(fn FROM TO &optional FILENAME)" t nil)
-
+(fn FROM TO &optional FILENAME)" t nil)
 (autoload 'ebnf-spool-directory "ebnf2ps" "\
 Generate and spool a PostScript syntactic chart image of DIRECTORY.
 
@@ -8964,8 +8188,7 @@ processed.
 
 See also `ebnf-spool-buffer'.
 
-\(fn &optional DIRECTORY)" t nil)
-
+(fn &optional DIRECTORY)" t nil)
 (autoload 'ebnf-spool-file "ebnf2ps" "\
 Generate and spool a PostScript syntactic chart image of the file FILE.
 
@@ -8974,23 +8197,20 @@ killed after process termination.
 
 See also `ebnf-spool-buffer'.
 
-\(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
-
+(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
 (autoload 'ebnf-spool-buffer "ebnf2ps" "\
 Generate and spool a PostScript syntactic chart image of the buffer.
 Like `ebnf-print-buffer' except that the PostScript image is saved in a
 local buffer to be sent to the printer later.
 
 Use the command `ebnf-despool' to send the spooled images to the printer." t 
nil)
-
 (autoload 'ebnf-spool-region "ebnf2ps" "\
 Generate a PostScript syntactic chart image of the region and spool locally.
 Like `ebnf-spool-buffer', but spools just the current region.
 
 Use the command `ebnf-despool' to send the spooled images to the printer.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'ebnf-eps-directory "ebnf2ps" "\
 Generate EPS files from EBNF files in DIRECTORY.
 
@@ -9001,8 +8221,7 @@ processed.
 
 See also `ebnf-eps-buffer'.
 
-\(fn &optional DIRECTORY)" t nil)
-
+(fn &optional DIRECTORY)" t nil)
 (autoload 'ebnf-eps-file "ebnf2ps" "\
 Generate an EPS file from EBNF file FILE.
 
@@ -9011,8 +8230,7 @@ killed after EPS generation.
 
 See also `ebnf-eps-buffer'.
 
-\(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
-
+(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
 (autoload 'ebnf-eps-buffer "ebnf2ps" "\
 Generate a PostScript syntactic chart image of the buffer in an EPS file.
 
@@ -9032,7 +8250,6 @@ The EPS file name has the following form:
 
 WARNING: This function does *NOT* ask any confirmation to override existing
         files." t nil)
-
 (autoload 'ebnf-eps-region "ebnf2ps" "\
 Generate a PostScript syntactic chart image of the region in an EPS file.
 
@@ -9053,10 +8270,8 @@ The EPS file name has the following form:
 WARNING: This function does *NOT* ask any confirmation to override existing
         files.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (defalias 'ebnf-despool #'ps-despool)
-
 (autoload 'ebnf-syntax-directory "ebnf2ps" "\
 Do a syntactic analysis of the files in DIRECTORY.
 
@@ -9067,8 +8282,7 @@ are processed.
 
 See also `ebnf-syntax-buffer'.
 
-\(fn &optional DIRECTORY)" t nil)
-
+(fn &optional DIRECTORY)" t nil)
 (autoload 'ebnf-syntax-file "ebnf2ps" "\
 Do a syntactic analysis of the named FILE.
 
@@ -9077,47 +8291,39 @@ killed after syntax checking.
 
 See also `ebnf-syntax-buffer'.
 
-\(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
-
+(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
 (autoload 'ebnf-syntax-buffer "ebnf2ps" "\
 Do a syntactic analysis of the current buffer." t nil)
-
 (autoload 'ebnf-syntax-region "ebnf2ps" "\
 Do a syntactic analysis of a region.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'ebnf-setup "ebnf2ps" "\
 Return the current ebnf2ps setup." nil nil)
-
 (autoload 'ebnf-find-style "ebnf2ps" "\
 Return style definition if NAME is already defined; otherwise, return nil.
 
 See `ebnf-style-database' documentation.
 
-\(fn NAME)" t nil)
-
+(fn NAME)" t nil)
 (autoload 'ebnf-insert-style "ebnf2ps" "\
 Insert a new style NAME with inheritance INHERITS and values VALUES.
 
 See `ebnf-style-database' documentation.
 
-\(fn NAME INHERITS &rest VALUES)" t nil)
-
+(fn NAME INHERITS &rest VALUES)" t nil)
 (autoload 'ebnf-delete-style "ebnf2ps" "\
 Delete style NAME.
 
 See `ebnf-style-database' documentation.
 
-\(fn NAME)" t nil)
-
+(fn NAME)" t nil)
 (autoload 'ebnf-merge-style "ebnf2ps" "\
 Merge values of style NAME with style VALUES.
 
 See `ebnf-style-database' documentation.
 
-\(fn NAME &rest VALUES)" t nil)
-
+(fn NAME &rest VALUES)" t nil)
 (autoload 'ebnf-apply-style "ebnf2ps" "\
 Set STYLE as the current style.
 
@@ -9125,8 +8331,7 @@ Returns the old style symbol.
 
 See `ebnf-style-database' documentation.
 
-\(fn STYLE)" t nil)
-
+(fn STYLE)" t nil)
 (autoload 'ebnf-reset-style "ebnf2ps" "\
 Reset current style.
 
@@ -9134,8 +8339,7 @@ Returns the old style symbol.
 
 See `ebnf-style-database' documentation.
 
-\(fn &optional STYLE)" t nil)
-
+(fn &optional STYLE)" t nil)
 (autoload 'ebnf-push-style "ebnf2ps" "\
 Push the current style onto a stack and set STYLE as the current style.
 
@@ -9145,8 +8349,7 @@ See also `ebnf-pop-style'.
 
 See `ebnf-style-database' documentation.
 
-\(fn &optional STYLE)" t nil)
-
+(fn &optional STYLE)" t nil)
 (autoload 'ebnf-pop-style "ebnf2ps" "\
 Pop a style from the stack of pushed styles and set it as the current style.
 
@@ -9155,12 +8358,9 @@ Returns the old style symbol.
 See also `ebnf-push-style'.
 
 See `ebnf-style-database' documentation." t nil)
-
 (register-definition-prefixes "ebnf2ps" '("ebnf-"))
 
-;;;***
 
-;;;### (autoloads nil "ebrowse" "progmodes/ebrowse.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/ebrowse.el
 
 (autoload 'ebrowse-tree-mode "ebrowse" "\
@@ -9173,68 +8373,52 @@ E.g.\\[save-buffer] writes the tree to the file it was 
loaded from.
 Tree mode key bindings:
 \\{ebrowse-tree-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'ebrowse-electric-choose-tree "ebrowse" "\
 Return a buffer containing a tree or nil if no tree found or canceled." t nil)
-
 (autoload 'ebrowse-member-mode "ebrowse" "\
 Major mode for Ebrowse member buffers.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'ebrowse-tags-view-declaration "ebrowse" "\
 View declaration of member at point." t nil)
-
 (autoload 'ebrowse-tags-find-declaration "ebrowse" "\
 Find declaration of member at point." t nil)
-
 (autoload 'ebrowse-tags-view-definition "ebrowse" "\
 View definition of member at point." t nil)
-
 (autoload 'ebrowse-tags-find-definition "ebrowse" "\
 Find definition of member at point." t nil)
-
 (autoload 'ebrowse-tags-find-declaration-other-window "ebrowse" "\
 Find declaration of member at point in other window." t nil)
-
 (autoload 'ebrowse-tags-view-definition-other-window "ebrowse" "\
 View definition of member at point in other window." t nil)
-
 (autoload 'ebrowse-tags-find-definition-other-window "ebrowse" "\
 Find definition of member at point in other window." t nil)
-
 (autoload 'ebrowse-tags-find-declaration-other-frame "ebrowse" "\
 Find definition of member at point in other frame." t nil)
-
 (autoload 'ebrowse-tags-view-definition-other-frame "ebrowse" "\
 View definition of member at point in other frame." t nil)
-
 (autoload 'ebrowse-tags-find-definition-other-frame "ebrowse" "\
 Find definition of member at point in other frame." t nil)
-
 (autoload 'ebrowse-tags-complete-symbol "ebrowse" "\
 Perform completion on the C++ symbol preceding point.
 A second call of this function without changing point inserts the next match.
 A call with prefix PREFIX reads the symbol to insert from the minibuffer with
 completion.
 
-\(fn PREFIX)" t nil)
-
+(fn PREFIX)" '("P") nil)
 (autoload 'ebrowse-tags-loop-continue "ebrowse" "\
 Repeat last operation on files in tree.
 FIRST-TIME non-nil means this is not a repetition, but the first time.
 TREE-BUFFER if indirectly specifies which files to loop over.
 
-\(fn &optional FIRST-TIME TREE-BUFFER)" t nil)
-
+(fn &optional FIRST-TIME TREE-BUFFER)" t nil)
 (autoload 'ebrowse-tags-search "ebrowse" "\
 Search for REGEXP in all files in a tree.
 If marked classes exist, process marked classes, only.
 If regular expression is nil, repeat last search.
 
-\(fn REGEXP)" t nil)
-
+(fn REGEXP)" t nil)
 (autoload 'ebrowse-tags-query-replace "ebrowse" "\
 Query replace FROM with TO in all files of a class tree.
 With prefix arg, process files of marked classes only.
@@ -9244,8 +8428,7 @@ what to do with it.  Type SPC or `y' to replace the match,
 DEL or `n' to skip and go to the next match.  For more directions,
 type \\[help-command] at that time.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'ebrowse-tags-search-member-use "ebrowse" "\
 Search for call sites of a member.
 If FIX-NAME is specified, search uses of that member.
@@ -9253,41 +8436,32 @@ Otherwise, read a member name from the minibuffer.
 Searches in all files mentioned in a class tree for something that
 looks like a function call to the member.
 
-\(fn &optional FIX-NAME)" t nil)
-
+(fn &optional FIX-NAME)" t nil)
 (autoload 'ebrowse-back-in-position-stack "ebrowse" "\
 Move backward in the position stack.
 Prefix arg ARG says how much.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'ebrowse-forward-in-position-stack "ebrowse" "\
 Move forward in the position stack.
 Prefix arg ARG says how much.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'ebrowse-electric-position-menu "ebrowse" "\
 List positions in the position stack in an electric buffer." t nil)
-
 (autoload 'ebrowse-save-tree "ebrowse" "\
 Save current tree in same file it was loaded from." t nil)
-
 (autoload 'ebrowse-save-tree-as "ebrowse" "\
 Write the current tree data structure to a file.
 Read the file name from the minibuffer if interactive.
 Otherwise, FILE-NAME specifies the file to save the tree in.
 
-\(fn &optional FILE-NAME)" t nil)
-
+(fn &optional FILE-NAME)" t nil)
 (autoload 'ebrowse-statistics "ebrowse" "\
 Display statistics for a class tree." t nil)
-
 (register-definition-prefixes "ebrowse" '("ebrowse-" 
"electric-buffer-menu-mode-hook"))
 
-;;;***
 
-;;;### (autoloads nil "ebuff-menu" "ebuff-menu.el" (0 0 0 0))
 ;;; Generated autoloads from ebuff-menu.el
 
 (autoload 'electric-buffer-list "ebuff-menu" "\
@@ -9316,39 +8490,30 @@ Run hooks in `electric-buffer-menu-mode-hook' on entry.
 \\[Electric-buffer-menu-mode-view-buffer] -- view buffer, returning when done.
 \\[Buffer-menu-backup-unmark] -- back up a line and remove marks.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (register-definition-prefixes "ebuff-menu" '("Electric-buffer-menu-" 
"electric-buffer-"))
 
-;;;***
 
-;;;### (autoloads nil "echistory" "echistory.el" (0 0 0 0))
 ;;; Generated autoloads from echistory.el
 
 (autoload 'Electric-command-history-redo-expression "echistory" "\
 Edit current history line in minibuffer and execute result.
 With prefix arg NOCONFIRM, execute current line as-is without editing.
 
-\(fn &optional NOCONFIRM)" t nil)
-
+(fn &optional NOCONFIRM)" t nil)
 (register-definition-prefixes "echistory" '("Electric-history-" "electric-"))
 
-;;;***
 
-;;;### (autoloads nil "ecomplete" "ecomplete.el" (0 0 0 0))
 ;;; Generated autoloads from ecomplete.el
 
 (autoload 'ecomplete-setup "ecomplete" "\
 Read the .ecompleterc file." nil nil)
-
 (register-definition-prefixes "ecomplete" '("ecomplete-"))
 
-;;;***
 
-;;;### (autoloads nil "ede" "cedet/ede.el" (0 0 0 0))
 ;;; Generated autoloads from cedet/ede.el
-(push (purecopy '(ede 1 2)) package--builtin-versions)
 
+(push (purecopy '(ede 1 2)) package--builtin-versions)
 (defvar global-ede-mode nil "\
 Non-nil if Global Ede mode is enabled.
 See the `global-ede-mode' command
@@ -9356,9 +8521,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-ede-mode'.")
-
 (custom-autoload 'global-ede-mode "ede" nil)
-
 (autoload 'global-ede-mode "ede" "\
 Toggle global EDE (Emacs Development Environment) mode.
 
@@ -9379,174 +8542,15 @@ evaluate `(default-value \\='global-ede-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "ede" '("ede" "global-ede-mode-map" 
"project-try-ede"))
 
-;;;***
-
-;;;### (autoloads nil "ede/auto" "cedet/ede/auto.el" (0 0 0 0))
-;;; Generated autoloads from cedet/ede/auto.el
-
-(register-definition-prefixes "ede/auto" '("ede-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/autoconf-edit" "cedet/ede/autoconf-edit.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/autoconf-edit.el
-
-(register-definition-prefixes "ede/autoconf-edit" '("autoconf-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/detect" "cedet/ede/detect.el" (0 0 0 0))
-;;; Generated autoloads from cedet/ede/detect.el
-
-(register-definition-prefixes "ede/detect" '("ede-"))
-
-;;;***
 
-;;;### (autoloads nil "ede/makefile-edit" "cedet/ede/makefile-edit.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/makefile-edit.el
-
-(register-definition-prefixes "ede/makefile-edit" '("makefile-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/pconf" "cedet/ede/pconf.el" (0 0 0 0))
-;;; Generated autoloads from cedet/ede/pconf.el
-
-(register-definition-prefixes "ede/pconf" '("ede-pconf-create-file-query"))
-
-;;;***
-
-;;;### (autoloads nil "ede/pmake" "cedet/ede/pmake.el" (0 0 0 0))
-;;; Generated autoloads from cedet/ede/pmake.el
-
-(register-definition-prefixes "ede/pmake" '("ede-pmake-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj" "cedet/ede/proj.el" (0 0 0 0))
-;;; Generated autoloads from cedet/ede/proj.el
-
-(register-definition-prefixes "ede/proj" '("ede-proj-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj-archive" "cedet/ede/proj-archive.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/proj-archive.el
-
-(register-definition-prefixes "ede/proj-archive" '("ede-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj-aux" "cedet/ede/proj-aux.el" (0 0
-;;;;;;  0 0))
-;;; Generated autoloads from cedet/ede/proj-aux.el
-
-(register-definition-prefixes "ede/proj-aux" '("ede-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj-comp" "cedet/ede/proj-comp.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from cedet/ede/proj-comp.el
-
-(register-definition-prefixes "ede/proj-comp" '("ede-" 
"proj-comp-insert-variable-once"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj-elisp" "cedet/ede/proj-elisp.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/proj-elisp.el
-
-(register-definition-prefixes "ede/proj-elisp" '("ede-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj-info" "cedet/ede/proj-info.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from cedet/ede/proj-info.el
-
-(register-definition-prefixes "ede/proj-info" '("ede-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj-misc" "cedet/ede/proj-misc.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from cedet/ede/proj-misc.el
-
-(register-definition-prefixes "ede/proj-misc" '("ede-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj-obj" "cedet/ede/proj-obj.el" (0 0
-;;;;;;  0 0))
-;;; Generated autoloads from cedet/ede/proj-obj.el
-
-(register-definition-prefixes "ede/proj-obj" '("ede-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj-prog" "cedet/ede/proj-prog.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from cedet/ede/proj-prog.el
-
-(register-definition-prefixes "ede/proj-prog" 
'("ede-proj-target-makefile-program"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj-scheme" "cedet/ede/proj-scheme.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/proj-scheme.el
-
-(register-definition-prefixes "ede/proj-scheme" '("ede-proj-target-scheme"))
-
-;;;***
-
-;;;### (autoloads nil "ede/proj-shared" "cedet/ede/proj-shared.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/proj-shared.el
-
-(register-definition-prefixes "ede/proj-shared" '("ede-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/project-am" "cedet/ede/project-am.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/project-am.el
-
-(register-definition-prefixes "ede/project-am" '("project-am-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/simple" "cedet/ede/simple.el" (0 0 0 0))
-;;; Generated autoloads from cedet/ede/simple.el
-
-(register-definition-prefixes "ede/simple" '("ede-simple-"))
-
-;;;***
-
-;;;### (autoloads nil "ede/source" "cedet/ede/source.el" (0 0 0 0))
-;;; Generated autoloads from cedet/ede/source.el
-
-(register-definition-prefixes "ede/source" '("ede-source"))
-
-;;;***
-
-;;;### (autoloads nil "ede/srecode" "cedet/ede/srecode.el" (0 0 0
-;;;;;;  0))
-;;; Generated autoloads from cedet/ede/srecode.el
+;;; Generated autoloads from cedet/semantic/ede-grammar.el
 
-(register-definition-prefixes "ede/srecode" '("ede-srecode-"))
+(register-definition-prefixes "semantic/ede-grammar" '("semantic-ede-"))
 
-;;;***
 
-;;;### (autoloads nil "edebug" "emacs-lisp/edebug.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/edebug.el
 
 (defvar edebug-all-defs nil "\
@@ -9557,30 +8561,24 @@ This applies to `eval-defun', `eval-region', 
`eval-buffer', and
 
 You can use the command `edebug-all-defs' to toggle the value of this
 variable.  You may wish to make it local to each buffer with
-\(make-local-variable \\='edebug-all-defs) in your
+(make-local-variable \\='edebug-all-defs) in your
 `emacs-lisp-mode-hook'.
 
 Note that this user option has no effect unless the edebug
 package has been loaded.")
-
 (custom-autoload 'edebug-all-defs "edebug" t)
-
 (defvar edebug-all-forms nil "\
 Non-nil means evaluation of all forms will instrument for Edebug.
 This doesn't apply to loading or evaluations in the minibuffer.
 Use the command `edebug-all-forms' to toggle the value of this option.")
-
 (custom-autoload 'edebug-all-forms "edebug" t)
-
 (autoload 'edebug-basic-spec "edebug" "\
 Return t if SPEC uses only extant spec symbols.
 An extant spec symbol is a symbol that is not a function and has a
 `edebug-form-spec' property.
 
-\(fn SPEC)" nil nil)
-
+(fn SPEC)" nil nil)
 (defalias 'edebug-defun 'edebug-eval-top-level-form)
-
 (autoload 'edebug-eval-top-level-form "edebug" "\
 Evaluate the top level form point is in, stepping through with Edebug.
 This is like `eval-defun' except that it steps the code for Edebug
@@ -9596,53 +8594,42 @@ instrumented for Edebug.
 If the current defun is actually a call to `defvar' or `defcustom',
 evaluating it this way resets the variable using its initial value
 expression even if the variable already has some other value.
-\(Normally `defvar' and `defcustom' do not alter the value if there
+(Normally `defvar' and `defcustom' do not alter the value if there
 already is one.)" t nil)
-
 (autoload 'edebug-all-defs "edebug" "\
 Toggle edebugging of all definitions." t nil)
-
 (autoload 'edebug-all-forms "edebug" "\
 Toggle edebugging of all forms." t nil)
-
 (register-definition-prefixes "edebug" '("arglist" "backquote-form" 
"def-declarations" "edebug" "function-form" "interactive" "lambda-" "name" 
"nested-backquote-form"))
 
-;;;***
 
-;;;### (autoloads nil "ediff" "vc/ediff.el" (0 0 0 0))
 ;;; Generated autoloads from vc/ediff.el
-(push (purecopy '(ediff 2 81 6)) package--builtin-versions)
 
+(push (purecopy '(ediff 2 81 6)) package--builtin-versions)
 (autoload 'ediff-files "ediff" "\
 Run Ediff on a pair of files, FILE-A and FILE-B.
 STARTUP-HOOKS is a list of functions that Emacs calls without
 arguments after setting up the Ediff buffers.
 
-\(fn FILE-A FILE-B &optional STARTUP-HOOKS)" t nil)
-
+(fn FILE-A FILE-B &optional STARTUP-HOOKS)" t nil)
 (autoload 'ediff-files3 "ediff" "\
 Run Ediff on three files, FILE-A, FILE-B, and FILE-C.
 STARTUP-HOOKS is a list of functions that Emacs calls without
 arguments after setting up the Ediff buffers.
 
-\(fn FILE-A FILE-B FILE-C &optional STARTUP-HOOKS)" t nil)
-
+(fn FILE-A FILE-B FILE-C &optional STARTUP-HOOKS)" t nil)
 (defalias 'ediff3 #'ediff-files3)
-
 (defalias 'ediff #'ediff-files)
-
 (autoload 'ediff-current-file "ediff" "\
 Start ediff between current buffer and its file on disk.
 This command can be used instead of `revert-buffer'.  If there is
 nothing to revert then this command fails." t nil)
-
 (autoload 'ediff-backup "ediff" "\
 Run Ediff on FILE and its backup file.
 Uses the latest backup, if there are several numerical backups.
 If this file is a backup, `ediff' it with its original.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'ediff-buffers "ediff" "\
 Run Ediff on a pair of buffers, BUFFER-A and BUFFER-B.
 STARTUP-HOOKS is a list of functions that Emacs calls without
@@ -9653,10 +8640,8 @@ symbol describing the Ediff job type; it defaults to
 `ediff-last-dir-C', `ediff-buffers3', `ediff-merge-buffers', or
 `ediff-merge-buffers-with-ancestor'.
 
-\(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS JOB-NAME)" t nil)
-
+(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS JOB-NAME)" t nil)
 (defalias 'ebuffers #'ediff-buffers)
-
 (autoload 'ediff-buffers3 "ediff" "\
 Run Ediff on three buffers, BUFFER-A, BUFFER-B, and BUFFER-C.
 STARTUP-HOOKS is a list of functions that Emacs calls without
@@ -9667,10 +8652,8 @@ symbol describing the Ediff job type; it defaults to
 `ediff-last-dir-C', `ediff-buffers', `ediff-merge-buffers', or
 `ediff-merge-buffers-with-ancestor'.
 
-\(fn BUFFER-A BUFFER-B BUFFER-C &optional STARTUP-HOOKS JOB-NAME)" t nil)
-
+(fn BUFFER-A BUFFER-B BUFFER-C &optional STARTUP-HOOKS JOB-NAME)" t nil)
 (defalias 'ebuffers3 #'ediff-buffers3)
-
 (autoload 'ediff-directories "ediff" "\
 Run Ediff on directories DIR1 and DIR2, comparing files.
 Consider only files that have the same name in both directories.
@@ -9678,19 +8661,15 @@ Consider only files that have the same name in both 
directories.
 REGEXP is nil or a regular expression; only file names that match
 the regexp are considered.
 
-\(fn DIR1 DIR2 REGEXP)" t nil)
-
+(fn DIR1 DIR2 REGEXP)" t nil)
 (defalias 'edirs #'ediff-directories)
-
 (autoload 'ediff-directory-revisions "ediff" "\
 Run Ediff on a directory, DIR1, comparing its files with their revisions.
 The second argument, REGEXP, is a regular expression that filters the file
 names.  Only the files that are under revision control are taken into account.
 
-\(fn DIR1 REGEXP)" t nil)
-
+(fn DIR1 REGEXP)" t nil)
 (defalias 'edir-revisions #'ediff-directory-revisions)
-
 (autoload 'ediff-directories3 "ediff" "\
 Run Ediff on directories DIR1, DIR2, and DIR3, comparing files.
 Consider only files that have the same name in all three directories.
@@ -9698,20 +8677,16 @@ Consider only files that have the same name in all 
three directories.
 REGEXP is nil or a regular expression; only file names that match
 the regexp are considered.
 
-\(fn DIR1 DIR2 DIR3 REGEXP)" t nil)
-
+(fn DIR1 DIR2 DIR3 REGEXP)" t nil)
 (defalias 'edirs3 #'ediff-directories3)
-
 (autoload 'ediff-merge-directories "ediff" "\
 Run Ediff on a pair of directories, DIR1 and DIR2, merging files that have
 the same name in both.  The third argument, REGEXP, is nil or a regular
 expression; only file names that match the regexp are considered.
 MERGE-AUTOSTORE-DIR is the directory in which to store merged files.
 
-\(fn DIR1 DIR2 REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
-
+(fn DIR1 DIR2 REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
 (defalias 'edirs-merge #'ediff-merge-directories)
-
 (autoload 'ediff-merge-directories-with-ancestor "ediff" "\
 Merge files in DIR1 and DIR2 using files in ANCESTOR-DIR as ancestors.
 Ediff merges files that have identical names in DIR1, DIR2.  If a pair of files
@@ -9720,30 +8695,24 @@ without ancestor.  The fourth argument, REGEXP, is nil 
or a regular expression;
 only file names that match the regexp are considered.
 MERGE-AUTOSTORE-DIR is the directory in which to store merged files.
 
-\(fn DIR1 DIR2 ANCESTOR-DIR REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
-
+(fn DIR1 DIR2 ANCESTOR-DIR REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
 (autoload 'ediff-merge-directory-revisions "ediff" "\
 Run Ediff on a directory, DIR1, merging its files with their revisions.
 The second argument, REGEXP, is a regular expression that filters the file
 names.  Only the files that are under revision control are taken into account.
 MERGE-AUTOSTORE-DIR is the directory in which to store merged files.
 
-\(fn DIR1 REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
-
+(fn DIR1 REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
 (defalias 'edir-merge-revisions #'ediff-merge-directory-revisions)
-
 (autoload 'ediff-merge-directory-revisions-with-ancestor "ediff" "\
 Run Ediff on DIR1 and merge its files with their revisions and ancestors.
 The second argument, REGEXP, is a regular expression that filters the file
 names.  Only the files that are under revision control are taken into account.
 MERGE-AUTOSTORE-DIR is the directory in which to store merged files.
 
-\(fn DIR1 REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
-
+(fn DIR1 REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
 (defalias 'edir-merge-revisions-with-ancestor 
'ediff-merge-directory-revisions-with-ancestor)
-
 (defalias 'edirs-merge-with-ancestor 'ediff-merge-directories-with-ancestor)
-
 (autoload 'ediff-windows-wordwise "ediff" "\
 Compare WIND-A and WIND-B, which are selected by clicking, wordwise.
 This compares the portions of text visible in each of the two windows.
@@ -9754,8 +8723,7 @@ If WIND-B is nil, use window next to WIND-A.
 STARTUP-HOOKS is a list of functions that Emacs calls without
 arguments after setting up the Ediff buffers.
 
-\(fn DUMB-MODE &optional WIND-A WIND-B STARTUP-HOOKS)" t nil)
-
+(fn DUMB-MODE &optional WIND-A WIND-B STARTUP-HOOKS)" t nil)
 (autoload 'ediff-windows-linewise "ediff" "\
 Compare WIND-A and WIND-B, which are selected by clicking, linewise.
 This compares the portions of text visible in each of the two windows.
@@ -9766,8 +8734,7 @@ If WIND-B is nil, use window next to WIND-A.
 STARTUP-HOOKS is a list of functions that Emacs calls without
 arguments after setting up the Ediff buffers.
 
-\(fn DUMB-MODE &optional WIND-A WIND-B STARTUP-HOOKS)" t nil)
-
+(fn DUMB-MODE &optional WIND-A WIND-B STARTUP-HOOKS)" t nil)
 (autoload 'ediff-regions-wordwise "ediff" "\
 Run Ediff on a pair of regions in specified buffers.
 BUFFER-A and BUFFER-B are the buffers to be compared.
@@ -9777,8 +8744,7 @@ use `ediff-regions-linewise' instead.
 STARTUP-HOOKS is a list of functions that Emacs calls without
 arguments after setting up the Ediff buffers.
 
-\(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS)" t nil)
-
+(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS)" t nil)
 (autoload 'ediff-regions-linewise "ediff" "\
 Run Ediff on a pair of regions in specified buffers.
 BUFFER-A and BUFFER-B are the buffers to be compared.
@@ -9789,10 +8755,8 @@ lines.  For small regions, use `ediff-regions-wordwise'.
 STARTUP-HOOKS is a list of functions that Emacs calls without
 arguments after setting up the Ediff buffers.
 
-\(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS)" t nil)
-
+(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS)" t nil)
 (defalias 'ediff-merge 'ediff-merge-files)
-
 (autoload 'ediff-merge-files "ediff" "\
 Merge two files without ancestor.
 FILE-A and FILE-B are the names of the files to be merged.
@@ -9800,8 +8764,7 @@ STARTUP-HOOKS is a list of functions that Emacs calls 
without
 arguments after setting up the Ediff buffers.  MERGE-BUFFER-FILE
 is the name of the file to be associated with the merge buffer..
 
-\(fn FILE-A FILE-B &optional STARTUP-HOOKS MERGE-BUFFER-FILE)" t nil)
-
+(fn FILE-A FILE-B &optional STARTUP-HOOKS MERGE-BUFFER-FILE)" t nil)
 (autoload 'ediff-merge-files-with-ancestor "ediff" "\
 Merge two files with ancestor.
 FILE-A and FILE-B are the names of the files to be merged, and
@@ -9810,10 +8773,8 @@ a list of functions that Emacs calls without arguments 
after
 setting up the Ediff buffers.  MERGE-BUFFER-FILE is the name of
 the file to be associated with the merge buffer.
 
-\(fn FILE-A FILE-B FILE-ANCESTOR &optional STARTUP-HOOKS MERGE-BUFFER-FILE)" t 
nil)
-
+(fn FILE-A FILE-B FILE-ANCESTOR &optional STARTUP-HOOKS MERGE-BUFFER-FILE)" t 
nil)
 (defalias 'ediff-merge-with-ancestor 'ediff-merge-files-with-ancestor)
-
 (autoload 'ediff-merge-buffers "ediff" "\
 Merge buffers without ancestor.
 BUFFER-A and BUFFER-B are the buffers to be merged.
@@ -9826,8 +8787,7 @@ symbol describing the Ediff job type; it defaults to
 `ediff-merge-buffers-with-ancestor'.  MERGE-BUFFER-FILE is the
 name of the file to be associated with the merge buffer.
 
-\(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS JOB-NAME MERGE-BUFFER-FILE)" t 
nil)
-
+(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS JOB-NAME MERGE-BUFFER-FILE)" t 
nil)
 (autoload 'ediff-merge-buffers-with-ancestor "ediff" "\
 Merge buffers with ancestor.
 BUFFER-A and BUFFER-B are the buffers to be merged, and
@@ -9840,8 +8800,7 @@ also be one of `ediff-merge-files-with-ancestor',
 `ediff-buffers3', or `ediff-merge-buffers'.  MERGE-BUFFER-FILE is
 the name of the file to be associated with the merge buffer.
 
-\(fn BUFFER-A BUFFER-B BUFFER-ANCESTOR &optional STARTUP-HOOKS JOB-NAME 
MERGE-BUFFER-FILE)" t nil)
-
+(fn BUFFER-A BUFFER-B BUFFER-ANCESTOR &optional STARTUP-HOOKS JOB-NAME 
MERGE-BUFFER-FILE)" t nil)
 (autoload 'ediff-merge-revisions "ediff" "\
 Run Ediff by merging two revisions of a file.
 The file is the optional FILE argument or the file visited by the
@@ -9850,8 +8809,7 @@ calls without arguments after setting up the Ediff 
buffers.
 MERGE-BUFFER-FILE is the name of the file to be associated with
 the merge buffer.
 
-\(fn &optional FILE STARTUP-HOOKS MERGE-BUFFER-FILE)" t nil)
-
+(fn &optional FILE STARTUP-HOOKS MERGE-BUFFER-FILE)" t nil)
 (autoload 'ediff-merge-revisions-with-ancestor "ediff" "\
 Run Ediff by merging two revisions of a file with a common ancestor.
 The file is the optional FILE argument or the file visited by the
@@ -9860,8 +8818,7 @@ calls without arguments after setting up the Ediff 
buffers.
 MERGE-BUFFER-FILE is the name of the file to be associated with
 the merge buffer.
 
-\(fn &optional FILE STARTUP-HOOKS MERGE-BUFFER-FILE)" t nil)
-
+(fn &optional FILE STARTUP-HOOKS MERGE-BUFFER-FILE)" t nil)
 (autoload 'ediff-patch-file "ediff" "\
 Query for a file name, and then run Ediff by patching that file.
 If optional PATCH-BUF is given, use the patch in that buffer
@@ -9869,8 +8826,7 @@ and don't ask the user.
 If prefix argument ARG, then: if even argument, assume that the
 patch is in a buffer.  If odd -- assume it is in a file.
 
-\(fn &optional ARG PATCH-BUF)" t nil)
-
+(fn &optional ARG PATCH-BUF)" t nil)
 (autoload 'ediff-patch-buffer "ediff" "\
 Run Ediff by patching the buffer specified at prompt.
 Without the optional prefix ARG, asks if the patch is in some buffer and
@@ -9880,12 +8836,9 @@ With ARG=2, assumes the patch is in a buffer and prompts 
for the buffer.
 PATCH-BUF is an optional argument, which specifies the buffer that contains the
 patch.  If not given, the user is prompted according to the prefix argument.
 
-\(fn &optional ARG PATCH-BUF)" t nil)
-
+(fn &optional ARG PATCH-BUF)" t nil)
 (defalias 'epatch 'ediff-patch-file)
-
 (defalias 'epatch-buffer 'ediff-patch-buffer)
-
 (autoload 'ediff-revision "ediff" "\
 Run Ediff by comparing versions of a file.
 The file is an optional FILE argument or the file entered at the prompt.
@@ -9894,130 +8847,98 @@ Uses `vc.el' or `rcs.el' depending on 
`ediff-version-control-package'.
 STARTUP-HOOKS is a list of functions that Emacs calls without
 arguments after setting up the Ediff buffers.
 
-\(fn &optional FILE STARTUP-HOOKS)" t nil)
-
+(fn &optional FILE STARTUP-HOOKS)" t nil)
 (defalias 'erevision 'ediff-revision)
-
 (autoload 'ediff-version "ediff" "\
 Return string describing the version of Ediff.
 When called interactively, displays the version." t nil)
-
 (autoload 'ediff-documentation "ediff" "\
 Display Ediff's manual.
 With optional NODE, goes to that node.
 
-\(fn &optional NODE)" t nil)
-
+(fn &optional NODE)" t nil)
 (autoload 'ediff-files-command "ediff" "\
 Call `ediff-files' with the next two command line arguments." nil nil)
-
 (autoload 'ediff3-files-command "ediff" "\
 Call `ediff3-files' with the next three command line arguments." nil nil)
-
 (autoload 'ediff-merge-command "ediff" "\
 Call `ediff-merge-files' with the next two command line arguments." nil nil)
-
 (autoload 'ediff-merge-with-ancestor-command "ediff" "\
 Call `ediff-merge-files-with-ancestor' with next three command line 
arguments." nil nil)
-
 (autoload 'ediff-directories-command "ediff" "\
 Call `ediff-directories' with the next three command line arguments." nil nil)
-
 (autoload 'ediff-directories3-command "ediff" "\
 Call `ediff-directories3' with the next four command line arguments." nil nil)
-
 (autoload 'ediff-merge-directories-command "ediff" "\
 Call `ediff-merge-directories' with the next three command line arguments." 
nil nil)
-
 (autoload 'ediff-merge-directories-with-ancestor-command "ediff" "\
 Call `ediff-merge-directories-with-ancestor' with the next four command line
 arguments." nil nil)
-
 (register-definition-prefixes "ediff" '("ediff-"))
 
-;;;***
 
-;;;### (autoloads nil "ediff-diff" "vc/ediff-diff.el" (0 0 0 0))
 ;;; Generated autoloads from vc/ediff-diff.el
 
 (register-definition-prefixes "ediff-diff" '("ediff-"))
 
-;;;***
 
-;;;### (autoloads nil "ediff-help" "vc/ediff-help.el" (0 0 0 0))
 ;;; Generated autoloads from vc/ediff-help.el
 
 (autoload 'ediff-customize "ediff-help" nil t nil)
-
 (register-definition-prefixes "ediff-help" '("ediff-"))
 
-;;;***
 
-;;;### (autoloads nil "ediff-init" "vc/ediff-init.el" (0 0 0 0))
 ;;; Generated autoloads from vc/ediff-init.el
 
 (register-definition-prefixes "ediff-init" '("ediff-" "stipple-pixmap"))
 
-;;;***
 
-;;;### (autoloads nil "ediff-merg" "vc/ediff-merg.el" (0 0 0 0))
 ;;; Generated autoloads from vc/ediff-merg.el
 
 (register-definition-prefixes "ediff-merg" '("ediff-"))
 
-;;;***
 
-;;;### (autoloads nil "ediff-mult" "vc/ediff-mult.el" (0 0 0 0))
 ;;; Generated autoloads from vc/ediff-mult.el
 
 (autoload 'ediff-show-registry "ediff-mult" "\
 Display Ediff's registry." t nil)
-
 (defalias 'eregistry #'ediff-show-registry)
-
 (register-definition-prefixes "ediff-mult" '("ediff-"))
 
-;;;***
 
-;;;### (autoloads nil "ediff-ptch" "vc/ediff-ptch.el" (0 0 0 0))
 ;;; Generated autoloads from vc/ediff-ptch.el
 
 (register-definition-prefixes "ediff-ptch" '("ediff-"))
 
-;;;***
 
-;;;### (autoloads nil "ediff-util" "vc/ediff-util.el" (0 0 0 0))
 ;;; Generated autoloads from vc/ediff-util.el
 
 (autoload 'ediff-toggle-multiframe "ediff-util" "\
 Switch from multiframe display to single-frame display and back.
 To change the default, set the variable `ediff-window-setup-function',
 which see." t nil)
-
 (autoload 'ediff-toggle-use-toolbar "ediff-util" "\
 Enable or disable Ediff toolbar.
 Works only in versions of Emacs that support toolbars.
 To change the default, set the variable `ediff-use-toolbar-p', which see." t 
nil)
-
 (register-definition-prefixes "ediff-util" '("ediff-"))
 
-;;;***
 
-;;;### (autoloads nil "ediff-vers" "vc/ediff-vers.el" (0 0 0 0))
 ;;; Generated autoloads from vc/ediff-vers.el
 
 (register-definition-prefixes "ediff-vers" '("ediff-" 
"rcs-ediff-view-revision"))
 
-;;;***
 
-;;;### (autoloads nil "ediff-wind" "vc/ediff-wind.el" (0 0 0 0))
 ;;; Generated autoloads from vc/ediff-wind.el
 
 (register-definition-prefixes "ediff-wind" '("ediff-"))
 
-;;;***
 
-;;;### (autoloads nil "edmacro" "edmacro.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/edit.el
+
+(register-definition-prefixes "semantic/edit" '("semantic-"))
+
+
 ;;; Generated autoloads from edmacro.el
 
 (autoload 'edit-kbd-macro "edmacro" "\
@@ -10029,18 +8950,15 @@ keystrokes as a keyboard macro, or 
`\\[execute-extended-command]'
 to edit a macro by its command name.
 With a prefix argument, format the macro in a more concise way.
 
-\(fn KEYS &optional PREFIX FINISH-HOOK STORE-HOOK)" t nil)
-
+(fn KEYS &optional PREFIX FINISH-HOOK STORE-HOOK)" t nil)
 (autoload 'edit-last-kbd-macro "edmacro" "\
 Edit the most recently defined keyboard macro.
 
-\(fn &optional PREFIX)" t nil)
-
+(fn &optional PREFIX)" t nil)
 (autoload 'edit-named-kbd-macro "edmacro" "\
 Edit a keyboard macro which has been given a name by `name-last-kbd-macro'.
 
-\(fn &optional PREFIX)" t nil)
-
+(fn &optional PREFIX)" t nil)
 (autoload 'read-kbd-macro "edmacro" "\
 Read the region as a keyboard macro definition.
 The region is interpreted as spelled-out keystrokes, e.g., \"M-x abc RET\".
@@ -10053,8 +8971,7 @@ the result is returned rather than being installed as 
the current macro.
 The result will be a string if possible, otherwise an event vector.
 Second argument NEED-VECTOR means to return an event vector always.
 
-\(fn START &optional END)" t nil)
-
+(fn START &optional END)" t nil)
 (autoload 'format-kbd-macro "edmacro" "\
 Return the keyboard macro MACRO as a human-readable string.
 This string is suitable for passing to `read-kbd-macro'.
@@ -10062,13 +8979,10 @@ Second argument VERBOSE means to put one command per 
line with comments.
 If VERBOSE is `1', put everything on one line.  If VERBOSE is omitted
 or nil, use a compact 80-column format.
 
-\(fn &optional MACRO VERBOSE)" nil nil)
-
+(fn &optional MACRO VERBOSE)" nil nil)
 (register-definition-prefixes "edmacro" '("edmacro-"))
 
-;;;***
 
-;;;### (autoloads nil "edt" "emulation/edt.el" (0 0 0 0))
 ;;; Generated autoloads from emulation/edt.el
 
 (autoload 'edt-set-scroll-margins "edt" "\
@@ -10076,47 +8990,32 @@ Set scroll margins.
 Argument TOP is the top margin in number of lines or percent of window.
 Argument BOTTOM is the bottom margin in number of lines or percent of window.
 
-\(fn TOP BOTTOM)" t nil)
-
+(fn TOP BOTTOM)" t nil)
 (autoload 'edt-emulation-on "edt" "\
 Turn on EDT Emulation." t nil)
-
 (register-definition-prefixes "edt" '("edt-"))
 
-;;;***
 
-;;;### (autoloads nil "edt-lk201" "emulation/edt-lk201.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from emulation/edt-lk201.el
 
 (register-definition-prefixes "edt-lk201" '("*EDT-keys*"))
 
-;;;***
 
-;;;### (autoloads nil "edt-mapper" "emulation/edt-mapper.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emulation/edt-mapper.el
 
 (register-definition-prefixes "edt-mapper" '("edt-"))
 
-;;;***
 
-;;;### (autoloads nil "edt-pc" "emulation/edt-pc.el" (0 0 0 0))
 ;;; Generated autoloads from emulation/edt-pc.el
 
 (register-definition-prefixes "edt-pc" '("*EDT-keys*"))
 
-;;;***
 
-;;;### (autoloads nil "edt-vt100" "emulation/edt-vt100.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from emulation/edt-vt100.el
 
 (register-definition-prefixes "edt-vt100" '("edt-set-term-width-"))
 
-;;;***
 
-;;;### (autoloads nil "ehelp" "ehelp.el" (0 0 0 0))
 ;;; Generated autoloads from ehelp.el
 
 (autoload 'with-electric-help "ehelp" "\
@@ -10143,38 +9042,28 @@ When the user exits (with `electric-help-exit', or 
otherwise), the help
 buffer's window disappears (i.e., we use `save-window-excursion'), and
 BUFFER is put back into its original major mode.
 
-\(fn THUNK &optional BUFFER NOERASE MINHEIGHT)" nil nil)
-
+(fn THUNK &optional BUFFER NOERASE MINHEIGHT)" nil nil)
 (autoload 'electric-helpify "ehelp" "\
 
 
-\(fn FUN &optional NAME)" nil nil)
-
+(fn FUN &optional NAME)" nil nil)
 (register-definition-prefixes "ehelp" '("ehelp-" "electric-"))
 
-;;;***
 
-;;;### (autoloads nil "eieio" "emacs-lisp/eieio.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/eieio.el
-(push (purecopy '(eieio 1 4)) package--builtin-versions)
 
+(push (purecopy '(eieio 1 4)) package--builtin-versions)
 (register-definition-prefixes "eieio" '("child-of-class-p" "defclass" "eieio-" 
"find-class" "obj" "oref" "oset" "same-class-p" "set-slot-value" "slot-" 
"with-slots"))
 
-;;;***
 
-;;;### (autoloads nil "eieio-base" "emacs-lisp/eieio-base.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/eieio-base.el
 
 (register-definition-prefixes "eieio-base" '("eieio-"))
 
-;;;***
 
-;;;### (autoloads nil "eieio-core" "emacs-lisp/eieio-core.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/eieio-core.el
-(push (purecopy '(eieio-core 1 4)) package--builtin-versions)
 
+(push (purecopy '(eieio-core 1 4)) package--builtin-versions)
 (autoload 'eieio-defclass-autoload "eieio-core" "\
 Create autoload symbols for the EIEIO class CNAME.
 SUPERCLASSES are the superclasses that CNAME inherits from.
@@ -10183,35 +9072,45 @@ This function creates a mock-class for CNAME and adds 
it into
 SUPERCLASSES as children.
 It creates an autoload function for CNAME's constructor.
 
-\(fn CNAME SUPERCLASSES FILENAME DOC)" nil nil)
-
+(fn CNAME SUPERCLASSES FILENAME DOC)" nil nil)
 (register-definition-prefixes "eieio-core" '("class-" "eieio-" 
"inconsistent-class-hierarchy" "invalid-slot-" "unbound-slot"))
 
-;;;***
 
-;;;### (autoloads nil "eieio-datadebug" "emacs-lisp/eieio-datadebug.el"
-;;;;;;  (0 0 0 0))
+;;; Generated autoloads from emacs-lisp/eieio-custom.el
+
+(register-definition-prefixes "eieio-custom" '("eieio-"))
+
+
 ;;; Generated autoloads from emacs-lisp/eieio-datadebug.el
 
 (register-definition-prefixes "eieio-datadebug" '("data-debug-insert-object-"))
 
-;;;***
 
-;;;### (autoloads nil "eieio-speedbar" "emacs-lisp/eieio-speedbar.el"
-;;;;;;  (0 0 0 0))
+;;; Generated autoloads from emacs-lisp/eieio-opt.el
+
+(register-definition-prefixes "eieio-opt" '("eieio-"))
+
+
 ;;; Generated autoloads from emacs-lisp/eieio-speedbar.el
 
 (register-definition-prefixes "eieio-speedbar" '("eieio-speedbar"))
 
-;;;***
 
-;;;### (autoloads nil "eldoc" "emacs-lisp/eldoc.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/el.el
+
+(register-definition-prefixes "srecode/el" 
'("srecode-semantic-apply-tag-to-dict"))
+
+
+;;; Generated autoloads from cedet/semantic/bovine/el.el
+
+(register-definition-prefixes "semantic/bovine/el" '("emacs-lisp-mode" 
"semantic-"))
+
+
 ;;; Generated autoloads from emacs-lisp/eldoc.el
-(push (purecopy '(eldoc 1 11 1)) package--builtin-versions)
 
-;;;***
+(push (purecopy '(eldoc 1 12 0)) package--builtin-versions)
+
 
-;;;### (autoloads nil "elec-pair" "elec-pair.el" (0 0 0 0))
 ;;; Generated autoloads from elec-pair.el
 
 (defvar electric-pair-mode nil "\
@@ -10221,9 +9120,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `electric-pair-mode'.")
-
 (custom-autoload 'electric-pair-mode "elec-pair" nil)
-
 (autoload 'electric-pair-mode "elec-pair" "\
 Toggle automatic parens pairing (Electric Pair mode).
 
@@ -10249,8 +9146,7 @@ evaluate `(default-value \\='electric-pair-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'electric-pair-local-mode "elec-pair" "\
 Toggle `electric-pair-mode' only in this buffer.
 
@@ -10265,18 +9161,15 @@ Disable the mode if ARG is a negative number.
 
 To check whether the minor mode is enabled in the current buffer,
 evaluate `(buffer-local-value \\='electric-pair-mode
-\(current-buffer))'.
+(current-buffer))'.
 
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "elec-pair" '("electric-pair-"))
 
-;;;***
 
-;;;### (autoloads nil "elide-head" "elide-head.el" (0 0 0 0))
 ;;; Generated autoloads from elide-head.el
 
 (autoload 'elide-head-mode "elide-head" "\
@@ -10302,8 +9195,7 @@ evaluate `elide-head-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'elide-head "elide-head" "\
 Hide header material in buffer according to `elide-head-headers-to-hide'.
 
@@ -10312,64 +9204,51 @@ an elided material again.
 
 This is suitable as an entry on `find-file-hook' or appropriate mode hooks.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (make-obsolete 'elide-head 'elide-head-mode '"29.1")
-
 (register-definition-prefixes "elide-head" '("elide-head-"))
 
-;;;***
 
-;;;### (autoloads nil "elint" "emacs-lisp/elint.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/elint.el
 
 (autoload 'elint-file "elint" "\
 Lint the file FILE.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'elint-directory "elint" "\
 Lint all the .el files in DIRECTORY.
 A complicated directory may require a lot of memory.
 
-\(fn DIRECTORY)" t nil)
-
+(fn DIRECTORY)" t nil)
 (autoload 'elint-current-buffer "elint" "\
 Lint the current buffer.
 If necessary, this first calls `elint-initialize'." t nil)
-
 (autoload 'elint-defun "elint" "\
 Lint the function at point.
 If necessary, this first calls `elint-initialize'." t nil)
-
 (autoload 'elint-initialize "elint" "\
 Initialize elint.
 If elint is already initialized, this does nothing, unless
 optional prefix argument REINIT is non-nil.
 
-\(fn &optional REINIT)" t nil)
-
+(fn &optional REINIT)" t nil)
 (register-definition-prefixes "elint" '("elint-"))
 
-;;;***
 
-;;;### (autoloads nil "elp" "emacs-lisp/elp.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/elp.el
 
 (autoload 'elp-instrument-function "elp" "\
 Instrument FUNSYM for profiling.
 FUNSYM must be a symbol of a defined function.
 
-\(fn FUNSYM)" t nil)
-
+(fn FUNSYM)" t nil)
 (autoload 'elp-instrument-list "elp" "\
 Instrument, for profiling, all functions in `elp-function-list'.
 Use optional LIST if provided instead.
 If called interactively, prompt for LIST in the minibuffer;
 type \"nil\" to use `elp-function-list'.
 
-\(fn &optional LIST)" t nil)
-
+(fn &optional LIST)" t nil)
 (autoload 'elp-instrument-package "elp" "\
 Instrument for profiling, all functions which start with PREFIX.
 For example, to instrument all ELP functions, do the following:
@@ -10381,27 +9260,115 @@ instrumented.  If you run this function, and then 
later load
 further functions that start with PREFIX, they will not be
 instrumented automatically.
 
-\(fn PREFIX)" t nil)
-
+(fn PREFIX)" t nil)
 (autoload 'elp-results "elp" "\
 Display current profiling results.
 If `elp-reset-after-results' is non-nil, then current profiling
 information for all instrumented functions is reset after results are
 displayed." t nil)
-
 (register-definition-prefixes "elp" '("elp-"))
 
-;;;***
 
-;;;### (autoloads nil "em-extpipe" "eshell/em-extpipe.el" (0 0 0
-;;;;;;  0))
+;;; Generated autoloads from eshell/em-alias.el
+
+(register-definition-prefixes "em-alias" '("eshell" 
"pcomplete/eshell-mode/alias"))
+
+
+;;; Generated autoloads from eshell/em-banner.el
+
+(register-definition-prefixes "em-banner" '("eshell-banner-"))
+
+
+;;; Generated autoloads from eshell/em-basic.el
+
+(register-definition-prefixes "em-basic" '("eshell"))
+
+
+;;; Generated autoloads from eshell/em-cmpl.el
+
+(register-definition-prefixes "em-cmpl" '("eshell-"))
+
+
+;;; Generated autoloads from eshell/em-dirs.el
+
+(register-definition-prefixes "em-dirs" '("eshell"))
+
+
+;;; Generated autoloads from eshell/em-elecslash.el
+
+(register-definition-prefixes "em-elecslash" '("eshell-elec"))
+
+
 ;;; Generated autoloads from eshell/em-extpipe.el
 
 (register-definition-prefixes "em-extpipe" '("em-extpipe--or-with-catch" 
"eshell-"))
 
-;;;***
 
-;;;### (autoloads nil "emacs-lock" "emacs-lock.el" (0 0 0 0))
+;;; Generated autoloads from eshell/em-glob.el
+
+(register-definition-prefixes "em-glob" '("eshell-"))
+
+
+;;; Generated autoloads from eshell/em-hist.el
+
+(register-definition-prefixes "em-hist" '("eshell"))
+
+
+;;; Generated autoloads from eshell/em-ls.el
+
+(register-definition-prefixes "em-ls" '("eshell"))
+
+
+;;; Generated autoloads from eshell/em-pred.el
+
+(register-definition-prefixes "em-pred" '("eshell-"))
+
+
+;;; Generated autoloads from eshell/em-prompt.el
+
+(register-definition-prefixes "em-prompt" '("eshell-"))
+
+
+;;; Generated autoloads from eshell/em-rebind.el
+
+(register-definition-prefixes "em-rebind" '("eshell-"))
+
+
+;;; Generated autoloads from eshell/em-script.el
+
+(register-definition-prefixes "em-script" '("eshell"))
+
+
+;;; Generated autoloads from eshell/em-smart.el
+
+(register-definition-prefixes "em-smart" '("eshell-"))
+
+
+;;; Generated autoloads from eshell/em-term.el
+
+(register-definition-prefixes "em-term" '("eshell-"))
+
+
+;;; Generated autoloads from eshell/em-tramp.el
+
+(register-definition-prefixes "em-tramp" '("eshell"))
+
+
+;;; Generated autoloads from eshell/em-unix.el
+
+(register-definition-prefixes "em-unix" '("eshell" "nil-blank-string"))
+
+
+;;; Generated autoloads from eshell/em-xtra.el
+
+(register-definition-prefixes "em-xtra" '("eshell/"))
+
+
+;;; Generated autoloads from cedet/ede/emacs.el
+
+(register-definition-prefixes "ede/emacs" '("ede-emacs-"))
+
+
 ;;; Generated autoloads from emacs-lock.el
 
 (autoload 'emacs-lock-mode "emacs-lock" "\
@@ -10425,31 +9392,23 @@ Other values are interpreted as usual.
 See also `emacs-lock-unlockable-modes', which exempts buffers under
 some major modes from being locked under some circumstances.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "emacs-lock" '("emacs-lock-" 
"toggle-emacs-lock"))
 
-;;;***
 
-;;;### (autoloads nil "emacs-news-mode" "textmodes/emacs-news-mode.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from textmodes/emacs-news-mode.el
 
 (autoload 'emacs-news-mode "emacs-news-mode" "\
 Major mode for editing the Emacs NEWS file.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'emacs-news-view-mode "emacs-news-mode" "\
 Major mode for viewing the Emacs NEWS file.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "emacs-news-mode" '("emacs-news-"))
 
-;;;***
 
-;;;### (autoloads nil "emacsbug" "mail/emacsbug.el" (0 0 0 0))
 ;;; Generated autoloads from mail/emacsbug.el
 
 (autoload 'report-emacs-bug "emacsbug" "\
@@ -10460,79 +9419,61 @@ Already submitted bugs can be found in the Emacs bug 
tracker:
 
   
https://debbugs.gnu.org/cgi/pkgreport.cgi?package=emacs;max-bugs=100;base-order=1;bug-rev=1
 
-\(fn TOPIC &optional UNUSED)" t nil)
-
+(fn TOPIC &optional UNUSED)" t nil)
 (set-advertised-calling-convention 'report-emacs-bug '(topic) '"24.5")
-
 (autoload 'submit-emacs-patch "emacsbug" "\
 Send an Emacs patch to the Emacs maintainers.
 Interactively, you will be prompted for SUBJECT and a patch FILE
 name (which will be attached to the mail).  You will end up in a
 Message buffer where you can explain more about the patch.
 
-\(fn SUBJECT FILE)" t nil)
-
+(fn SUBJECT FILE)" t nil)
 (register-definition-prefixes "emacsbug" '("emacs-bug--system-description" 
"report-emacs-bug-"))
 
-;;;***
 
-;;;### (autoloads nil "emerge" "vc/emerge.el" (0 0 0 0))
 ;;; Generated autoloads from vc/emerge.el
 
 (autoload 'emerge-files "emerge" "\
 Run Emerge on two files FILE-A and FILE-B.
 
-\(fn ARG FILE-A FILE-B FILE-OUT &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
-
+(fn ARG FILE-A FILE-B FILE-OUT &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
 (autoload 'emerge-files-with-ancestor "emerge" "\
 Run Emerge on two files, giving another file as the ancestor.
 
-\(fn ARG FILE-A FILE-B FILE-ANCESTOR FILE-OUT &optional STARTUP-HOOKS 
QUIT-HOOKS)" t nil)
-
+(fn ARG FILE-A FILE-B FILE-ANCESTOR FILE-OUT &optional STARTUP-HOOKS 
QUIT-HOOKS)" t nil)
 (autoload 'emerge-buffers "emerge" "\
 Run Emerge on two buffers BUFFER-A and BUFFER-B.
 
-\(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
-
+(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
 (autoload 'emerge-buffers-with-ancestor "emerge" "\
 Run Emerge on two buffers, giving another buffer as the ancestor.
 
-\(fn BUFFER-A BUFFER-B BUFFER-ANCESTOR &optional STARTUP-HOOKS QUIT-HOOKS)" t 
nil)
-
+(fn BUFFER-A BUFFER-B BUFFER-ANCESTOR &optional STARTUP-HOOKS QUIT-HOOKS)" t 
nil)
 (autoload 'emerge-files-command "emerge" nil nil nil)
-
 (autoload 'emerge-files-with-ancestor-command "emerge" nil nil nil)
-
 (autoload 'emerge-files-remote "emerge" "\
 
 
-\(fn FILE-A FILE-B FILE-OUT)" nil nil)
-
+(fn FILE-A FILE-B FILE-OUT)" nil nil)
 (autoload 'emerge-files-with-ancestor-remote "emerge" "\
 
 
-\(fn FILE-A FILE-B FILE-ANC FILE-OUT)" nil nil)
-
+(fn FILE-A FILE-B FILE-ANC FILE-OUT)" nil nil)
 (autoload 'emerge-revisions "emerge" "\
 Emerge two RCS revisions of a file.
 
-\(fn ARG FILE REVISION-A REVISION-B &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
-
+(fn ARG FILE REVISION-A REVISION-B &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
 (autoload 'emerge-revisions-with-ancestor "emerge" "\
 Emerge two RCS revisions of a file, with another revision as ancestor.
 
-\(fn ARG FILE REVISION-A REVISION-B ANCESTOR &optional STARTUP-HOOKS 
QUIT-HOOKS)" t nil)
-
+(fn ARG FILE REVISION-A REVISION-B ANCESTOR &optional STARTUP-HOOKS 
QUIT-HOOKS)" t nil)
 (autoload 'emerge-merge-directories "emerge" "\
 
 
-\(fn A-DIR B-DIR ANCESTOR-DIR OUTPUT-DIR)" t nil)
-
+(fn A-DIR B-DIR ANCESTOR-DIR OUTPUT-DIR)" t nil)
 (register-definition-prefixes "emerge" '("emerge-"))
 
-;;;***
 
-;;;### (autoloads nil "emoji" "international/emoji.el" (0 0 0 0))
 ;;; Generated autoloads from international/emoji.el
 
 (autoload 'emoji-insert "emoji" "\
@@ -10541,23 +9482,19 @@ If TEXT (interactively, the prefix argument), choose 
the emoji
 by typing its Unicode Standard name (with completion), instead
 of selecting from emoji display.
 
-\(fn &optional TEXT)" t nil)
-
+(fn &optional TEXT)" t nil)
 (autoload 'emoji-recent "emoji" "\
 Choose and insert one of the recently-used emoji glyphs." t nil)
-
 (autoload 'emoji-search "emoji" "\
 Choose and insert an emoji glyph by typing its Unicode name.
 This command prompts for an emoji name, with completion, and
 inserts it.  It recognizes the Unicode Standard names of emoji,
 and also consults the `emoji-alternate-names' alist." t nil)
-
 (autoload 'emoji-list "emoji" "\
 List emojis and insert the one that's selected.
 Select the emoji by typing \\<emoji-list-mode-map>\\[emoji-list-select] on its 
picture.
 The glyph will be inserted into the buffer that was current
 when the command was invoked." t nil)
-
 (autoload 'emoji-describe "emoji" "\
 Display the name of the grapheme cluster composed from GLYPH.
 GLYPH should be a string of one or more characters which together
@@ -10567,13 +9504,10 @@ could also be any character, not just emoji).
 If called from Lisp, return the name as a string; return nil if
 the name is not known.
 
-\(fn GLYPH &optional INTERACTIVE)" t nil)
-
+(fn GLYPH &optional INTERACTIVE)" t nil)
 (register-definition-prefixes "emoji" '("emoji-"))
 
-;;;***
 
-;;;### (autoloads nil "enriched" "textmodes/enriched.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/enriched.el
 
 (autoload 'enriched-mode "enriched" "\
@@ -10605,35 +9539,28 @@ evaluate `enriched-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'enriched-encode "enriched" "\
 
 
-\(fn FROM TO ORIG-BUF)" nil nil)
-
+(fn FROM TO ORIG-BUF)" nil nil)
 (autoload 'enriched-decode "enriched" "\
 
 
-\(fn FROM TO)" nil nil)
-
+(fn FROM TO)" nil nil)
 (register-definition-prefixes "enriched" '("enriched-"))
 
-;;;***
 
-;;;### (autoloads nil "epa" "epa.el" (0 0 0 0))
 ;;; Generated autoloads from epa.el
 
 (autoload 'epa-list-keys "epa" "\
 List all keys matched with NAME from the public keyring.
 
-\(fn &optional NAME)" t nil)
-
+(fn &optional NAME)" t nil)
 (autoload 'epa-list-secret-keys "epa" "\
 List all keys matched with NAME from the private keyring.
 
-\(fn &optional NAME)" t nil)
-
+(fn &optional NAME)" t nil)
 (autoload 'epa-select-keys "epa" "\
 Display a user's keyring and ask him to select keys.
 CONTEXT is an `epg-context'.
@@ -10642,29 +9569,24 @@ NAMES is a list of strings to be matched with keys.  
If it is nil, all
 the keys are listed.
 If SECRET is non-nil, list secret keys instead of public keys.
 
-\(fn CONTEXT PROMPT &optional NAMES SECRET)" nil nil)
-
+(fn CONTEXT PROMPT &optional NAMES SECRET)" nil nil)
 (autoload 'epa-decrypt-file "epa" "\
 Decrypt DECRYPT-FILE into PLAIN-FILE.
 If you do not specify PLAIN-FILE, this functions prompts for the value to use.
 
-\(fn DECRYPT-FILE &optional PLAIN-FILE)" t nil)
-
+(fn DECRYPT-FILE &optional PLAIN-FILE)" t nil)
 (autoload 'epa-verify-file "epa" "\
 Verify FILE.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'epa-sign-file "epa" "\
 Sign FILE by SIGNERS keys selected.
 
-\(fn FILE SIGNERS MODE)" t nil)
-
+(fn FILE SIGNERS MODE)" t nil)
 (autoload 'epa-encrypt-file "epa" "\
 Encrypt FILE for RECIPIENTS.
 
-\(fn FILE RECIPIENTS)" t nil)
-
+(fn FILE RECIPIENTS)" t nil)
 (autoload 'epa-decrypt-region "epa" "\
 Decrypt the current region between START and END.
 
@@ -10683,23 +9605,20 @@ should consider using the string based counterpart
 
 For example:
 
-\(let ((context (epg-make-context \\='OpenPGP)))
+(let ((context (epg-make-context \\='OpenPGP)))
   (decode-coding-string
     (epg-decrypt-string context (buffer-substring start end))
     \\='utf-8))
 
-\(fn START END &optional MAKE-BUFFER-FUNCTION)" t nil)
-
+(fn START END &optional MAKE-BUFFER-FUNCTION)" t nil)
 (autoload 'epa-decrypt-armor-in-region "epa" "\
 Decrypt OpenPGP armors in the current region between START and END.
 
 Don't use this command in Lisp programs!
 See the reason described in the `epa-decrypt-region' documentation.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (function-put 'epa-decrypt-armor-in-region 'interactive-only 't)
-
 (autoload 'epa-verify-region "epa" "\
 Verify the current region between START and END.
 
@@ -10713,25 +9632,21 @@ should consider using the string based counterpart
 
 For example:
 
-\(let ((context (epg-make-context \\='OpenPGP)))
+(let ((context (epg-make-context \\='OpenPGP)))
   (decode-coding-string
     (epg-verify-string context (buffer-substring start end))
     \\='utf-8))
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (function-put 'epa-verify-region 'interactive-only 't)
-
 (autoload 'epa-verify-cleartext-in-region "epa" "\
 Verify OpenPGP cleartext signed messages in current region from START to END.
 
 Don't use this command in Lisp programs!
 See the reason described in the `epa-verify-region' documentation.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (function-put 'epa-verify-cleartext-in-region 'interactive-only 't)
-
 (autoload 'epa-sign-region "epa" "\
 Sign the current region between START and END by SIGNERS keys selected.
 
@@ -10744,15 +9659,13 @@ based counterpart `epg-sign-file' instead.
 
 For example:
 
-\(let ((context (epg-make-context \\='OpenPGP)))
+(let ((context (epg-make-context \\='OpenPGP)))
   (epg-sign-string
     context
     (encode-coding-string (buffer-substring start end) \\='utf-8)))
 
-\(fn START END SIGNERS MODE)" t nil)
-
+(fn START END SIGNERS MODE)" t nil)
 (function-put 'epa-sign-region 'interactive-only 't)
-
 (autoload 'epa-encrypt-region "epa" "\
 Encrypt the current region between START and END for RECIPIENTS.
 
@@ -10765,84 +9678,64 @@ file based counterpart `epg-encrypt-file' instead.
 
 For example:
 
-\(let ((context (epg-make-context \\='OpenPGP)))
+(let ((context (epg-make-context \\='OpenPGP)))
   (epg-encrypt-string
     context
     (encode-coding-string (buffer-substring start end) \\='utf-8)
     nil))
 
-\(fn START END RECIPIENTS SIGN SIGNERS)" t nil)
-
+(fn START END RECIPIENTS SIGN SIGNERS)" t nil)
 (function-put 'epa-encrypt-region 'interactive-only 't)
-
 (autoload 'epa-delete-keys "epa" "\
 Delete selected KEYS.
 
-\(fn KEYS &optional ALLOW-SECRET)" t nil)
-
+(fn KEYS &optional ALLOW-SECRET)" t nil)
 (autoload 'epa-import-keys "epa" "\
 Import keys from FILE.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'epa-import-keys-region "epa" "\
 Import keys from the region.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'epa-import-armor-in-region "epa" "\
 Import keys in the OpenPGP armor format in the current region from START to 
END.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'epa-export-keys "epa" "\
 Export selected KEYS to FILE.
 
-\(fn KEYS FILE)" t nil)
-
+(fn KEYS FILE)" t nil)
 (autoload 'epa-insert-keys "epa" "\
 Insert selected KEYS after the point.
 
-\(fn KEYS)" t nil)
-
+(fn KEYS)" t nil)
 (register-definition-prefixes "epa" '("epa-"))
 
-;;;***
 
-;;;### (autoloads nil "epa-dired" "epa-dired.el" (0 0 0 0))
 ;;; Generated autoloads from epa-dired.el
 
 (autoload 'epa-dired-do-decrypt "epa-dired" "\
 Decrypt marked files." t nil)
-
 (autoload 'epa-dired-do-verify "epa-dired" "\
 Verify marked files." t nil)
-
 (autoload 'epa-dired-do-sign "epa-dired" "\
 Sign marked files." t nil)
-
 (autoload 'epa-dired-do-encrypt "epa-dired" "\
 Encrypt marked files." t nil)
 
-;;;***
 
-;;;### (autoloads nil "epa-file" "epa-file.el" (0 0 0 0))
 ;;; Generated autoloads from epa-file.el
 
 (autoload 'epa-file-handler "epa-file" "\
 
 
-\(fn OPERATION &rest ARGS)" nil nil)
-
+(fn OPERATION &rest ARGS)" nil nil)
 (autoload 'epa-file-enable "epa-file" nil t nil)
-
 (autoload 'epa-file-disable "epa-file" nil t nil)
-
 (register-definition-prefixes "epa-file" '("epa-"))
 
-;;;***
 
-;;;### (autoloads nil "epa-ks" "epa-ks.el" (0 0 0 0))
 ;;; Generated autoloads from epa-ks.el
 
 (autoload 'epa-search-keys "epa-ks" "\
@@ -10856,13 +9749,10 @@ exact matches.
 Note that the request may fail if the query is not specific
 enough, since keyservers have strict timeout settings.
 
-\(fn QUERY EXACT)" t nil)
-
+(fn QUERY EXACT)" t nil)
 (register-definition-prefixes "epa-ks" '("epa-k"))
 
-;;;***
 
-;;;### (autoloads nil "epa-mail" "epa-mail.el" (0 0 0 0))
 ;;; Generated autoloads from epa-mail.el
 
 (autoload 'epa-mail-mode "epa-mail" "\
@@ -10882,20 +9772,15 @@ evaluate `epa-mail-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'epa-mail-decrypt "epa-mail" "\
 Decrypt OpenPGP armors in the current buffer.
 The buffer is expected to contain a mail message." t nil)
-
 (function-put 'epa-mail-decrypt 'interactive-only 't)
-
 (autoload 'epa-mail-verify "epa-mail" "\
 Verify OpenPGP cleartext signed messages in the current buffer.
 The buffer is expected to contain a mail message." t nil)
-
 (function-put 'epa-mail-verify 'interactive-only 't)
-
 (autoload 'epa-mail-sign "epa-mail" "\
 Sign the current buffer.
 The buffer is expected to contain a mail message, and signing is
@@ -10903,10 +9788,8 @@ performed with your default key.
 With prefix argument, asks you to select interactively the key to
 use from your key ring.
 
-\(fn START END SIGNERS MODE)" t nil)
-
+(fn START END SIGNERS MODE)" t nil)
 (function-put 'epa-mail-sign 'interactive-only 't)
-
 (autoload 'epa-mail-encrypt "epa-mail" "\
 Encrypt the outgoing mail message in the current buffer.
 Takes the recipients from the text in the header in the buffer
@@ -10920,14 +9803,11 @@ or nil meaning use the defaults.
 
 SIGNERS is a list of keys to sign the message with.
 
-\(fn &optional RECIPIENTS SIGNERS)" t nil)
-
+(fn &optional RECIPIENTS SIGNERS)" t nil)
 (autoload 'epa-mail-import-keys "epa-mail" "\
 Import keys in the OpenPGP armor format in the current buffer.
 The buffer is expected to contain a mail message." t nil)
-
 (function-put 'epa-mail-import-keys 'interactive-only 't)
-
 (defvar epa-global-mail-mode nil "\
 Non-nil if Epa-Global-Mail mode is enabled.
 See the `epa-global-mail-mode' command
@@ -10935,9 +9815,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `epa-global-mail-mode'.")
-
 (custom-autoload 'epa-global-mail-mode "epa-mail" nil)
-
 (autoload 'epa-global-mail-mode "epa-mail" "\
 Minor mode to hook EasyPG into Mail mode.
 
@@ -10955,26 +9833,20 @@ evaluate `(default-value \\='epa-global-mail-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "epa-mail" '("epa-mail-"))
 
-;;;***
 
-;;;### (autoloads nil "epg" "epg.el" (0 0 0 0))
 ;;; Generated autoloads from epg.el
-(push (purecopy '(epg 1 0 0)) package--builtin-versions)
 
+(push (purecopy '(epg 1 0 0)) package--builtin-versions)
 (autoload 'epg-make-context "epg" "\
 Return a context object.
 
-\(fn &optional PROTOCOL ARMOR TEXTMODE INCLUDE-CERTS CIPHER-ALGORITHM 
DIGEST-ALGORITHM COMPRESS-ALGORITHM)" nil nil)
-
+(fn &optional PROTOCOL ARMOR TEXTMODE INCLUDE-CERTS CIPHER-ALGORITHM 
DIGEST-ALGORITHM COMPRESS-ALGORITHM)" nil nil)
 (register-definition-prefixes "epg" '("epg-"))
 
-;;;***
 
-;;;### (autoloads nil "epg-config" "epg-config.el" (0 0 0 0))
 ;;; Generated autoloads from epg-config.el
 
 (autoload 'epg-find-configuration "epg-config" "\
@@ -10988,13 +9860,10 @@ Then it walks through PROGRAM-ALIST or
 Otherwise, it tries the programs listed in the entry until the
 version requirement is met.
 
-\(fn PROTOCOL &optional NO-CACHE PROGRAM-ALIST)" nil nil)
-
+(fn PROTOCOL &optional NO-CACHE PROGRAM-ALIST)" nil nil)
 (autoload 'epg-configuration "epg-config" "\
 Return a list of internal configuration parameters of `epg-gpg-program'." nil 
nil)
-
 (make-obsolete 'epg-configuration 'epg-find-configuration '"25.1")
-
 (autoload 'epg-check-configuration "epg-config" "\
 Verify that a sufficient version of GnuPG is installed.
 CONFIG should be a `epg-configuration' object (a plist).
@@ -11003,24 +9872,19 @@ REQ-VERSIONS should be a list with elements of the 
form (MIN
 semi-open range of acceptable versions.  REQ-VERSIONS may also be
 a single minimum version string.
 
-\(fn CONFIG &optional REQ-VERSIONS)" nil nil)
-
+(fn CONFIG &optional REQ-VERSIONS)" nil nil)
 (autoload 'epg-expand-group "epg-config" "\
 Look at CONFIG and try to expand GROUP.
 
-\(fn CONFIG GROUP)" nil nil)
-
+(fn CONFIG GROUP)" nil nil)
 (register-definition-prefixes "epg-config" '("epg-"))
 
-;;;***
 
-;;;### (autoloads nil "erc" "erc/erc.el" (0 0 0 0))
 ;;; Generated autoloads from erc/erc.el
-(push (purecopy '(erc 5 4 1)) package--builtin-versions)
 
+(push (purecopy '(erc 5 4 1)) package--builtin-versions)
 (autoload 'erc-select-read-args "erc" "\
 Prompt the user for values of nick, server, port, and password." nil nil)
-
 (autoload 'erc "erc" "\
 ERC is a powerful, modular, and extensible IRC client.
 This function is the main entry point for ERC.
@@ -11042,10 +9906,8 @@ then the server and full-name will be set to those 
values,
 whereas `erc-compute-port' and `erc-compute-nick' will be invoked
 for the values of the other parameters.
 
-\(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK 
(erc-compute-nick)) PASSWORD (FULL-NAME (erc-compute-full-name)))" t nil)
-
+(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK 
(erc-compute-nick)) PASSWORD (FULL-NAME (erc-compute-full-name)))" 
'((erc-select-read-args)) nil)
 (defalias 'erc-select #'erc)
-
 (autoload 'erc-tls "erc" "\
 ERC is a powerful, modular, and extensible IRC client.
 This function is the main entry point for ERC over TLS.
@@ -11084,64 +9946,197 @@ Example usage:
              \\='(\"/home/bandali/my-cert.key\"
                \"/home/bandali/my-cert.crt\"))
 
-\(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK 
(erc-compute-nick)) PASSWORD (FULL-NAME (erc-compute-full-name)) 
CLIENT-CERTIFICATE)" t nil)
-
+(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK 
(erc-compute-nick)) PASSWORD (FULL-NAME (erc-compute-full-name)) 
CLIENT-CERTIFICATE)" '((let ((erc-default-port erc-default-port-tls)) 
(erc-select-read-args))) nil)
 (autoload 'erc-handle-irc-url "erc" "\
 Use ERC to IRC on HOST:PORT in CHANNEL as USER with PASSWORD.
 If ERC is already connected to HOST:PORT, simply /join CHANNEL.
 Otherwise, connect to HOST:PORT as USER and /join CHANNEL.
 
-\(fn HOST PORT CHANNEL USER PASSWORD)" nil nil)
-
+(fn HOST PORT CHANNEL USER PASSWORD)" nil nil)
 (register-definition-prefixes "erc" '("define-erc-module" "erc-"))
 
-;;;***
 
-;;;### (autoloads nil "erc-backend" "erc/erc-backend.el" (0 0 0 0))
+;;; Generated autoloads from erc/erc-autoaway.el
+
+(register-definition-prefixes "erc-autoaway" '("erc-auto"))
+
+
 ;;; Generated autoloads from erc/erc-backend.el
 
 (register-definition-prefixes "erc-backend" '("erc-"))
 
-;;;***
 
-;;;### (autoloads nil "erc-goodies" "erc/erc-goodies.el" (0 0 0 0))
+;;; Generated autoloads from erc/erc-button.el
+
+(register-definition-prefixes "erc-button" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-capab.el
+
+(register-definition-prefixes "erc-capab" '("erc-capab-identify-"))
+
+
+;;; Generated autoloads from erc/erc-compat.el
+
+(register-definition-prefixes "erc-compat" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-dcc.el
+
+(register-definition-prefixes "erc-dcc" '("erc-" "pcomplete/erc-mode/"))
+
+
+;;; Generated autoloads from erc/erc-desktop-notifications.el
+
+(register-definition-prefixes "erc-desktop-notifications" 
'("erc-notifications-"))
+
+
+;;; Generated autoloads from erc/erc-ezbounce.el
+
+(register-definition-prefixes "erc-ezbounce" '("erc-ezb-"))
+
+
+;;; Generated autoloads from erc/erc-fill.el
+
+(register-definition-prefixes "erc-fill" '("erc-"))
+
+
 ;;; Generated autoloads from erc/erc-goodies.el
 
 (register-definition-prefixes "erc-goodies" '("erc-"))
 
-;;;***
 
-;;;### (autoloads nil "erc-ibuffer" "erc/erc-ibuffer.el" (0 0 0 0))
 ;;; Generated autoloads from erc/erc-ibuffer.el
 
 (register-definition-prefixes "erc-ibuffer" '("erc-"))
 
-;;;***
 
-;;;### (autoloads nil "erc-lang" "erc/erc-lang.el" (0 0 0 0))
+;;; Generated autoloads from erc/erc-identd.el
+
+(register-definition-prefixes "erc-identd" '("erc-identd-"))
+
+
+;;; Generated autoloads from erc/erc-imenu.el
+
+(register-definition-prefixes "erc-imenu" '("erc-unfill-notice"))
+
+
+;;; Generated autoloads from erc/erc-join.el
+
+(register-definition-prefixes "erc-join" '("erc-"))
+
+
 ;;; Generated autoloads from erc/erc-lang.el
 
-(register-definition-prefixes "erc-lang" '("erc-cmd-LANG" "iso-638-languages" 
"language"))
+(register-definition-prefixes "erc-lang" '("erc-cmd-LANG" 
"iso-639-1-languages" "language"))
+
+
+;;; Generated autoloads from erc/erc-list.el
+
+(register-definition-prefixes "erc-list" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-log.el
+
+(register-definition-prefixes "erc-log" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-match.el
+
+(register-definition-prefixes "erc-match" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-menu.el
+
+(register-definition-prefixes "erc-menu" '("erc-menu-"))
+
+
+;;; Generated autoloads from erc/erc-netsplit.el
+
+(register-definition-prefixes "erc-netsplit" '("erc-"))
 
-;;;***
 
-;;;### (autoloads nil "erc-networks" "erc/erc-networks.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from erc/erc-networks.el
 
 (autoload 'erc-determine-network "erc-networks" "\
 Return the name of the network or \"Unknown\" as a symbol.
 Use the server parameter NETWORK if provided, otherwise parse the
 server name and search for a match in `erc-networks-alist'." nil nil)
-
 (autoload 'erc-server-select "erc-networks" "\
 Interactively select a server to connect to using `erc-server-alist'." t nil)
-
 (register-definition-prefixes "erc-networks" '("erc-"))
 
-;;;***
 
-;;;### (autoloads nil "ert" "emacs-lisp/ert.el" (0 0 0 0))
+;;; Generated autoloads from erc/erc-notify.el
+
+(register-definition-prefixes "erc-notify" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-page.el
+
+(register-definition-prefixes "erc-page" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-pcomplete.el
+
+(register-definition-prefixes "erc-pcomplete" '("erc-pcomplet" "pcomplete"))
+
+
+;;; Generated autoloads from erc/erc-replace.el
+
+(register-definition-prefixes "erc-replace" '("erc-replace-"))
+
+
+;;; Generated autoloads from erc/erc-ring.el
+
+(register-definition-prefixes "erc-ring" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-services.el
+
+(register-definition-prefixes "erc-services" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-sound.el
+
+(register-definition-prefixes "erc-sound" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-speedbar.el
+
+(register-definition-prefixes "erc-speedbar" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-spelling.el
+
+(register-definition-prefixes "erc-spelling" '("erc-spelling-"))
+
+
+;;; Generated autoloads from erc/erc-stamp.el
+
+(register-definition-prefixes "erc-stamp" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-status-sidebar.el
+
+(register-definition-prefixes "erc-status-sidebar" '("erc-status-sidebar-"))
+
+
+;;; Generated autoloads from erc/erc-track.el
+
+(register-definition-prefixes "erc-track" '("erc-"))
+
+
+;;; Generated autoloads from erc/erc-truncate.el
+
+(register-definition-prefixes "erc-truncate" '("erc-max-buffer-size"))
+
+
+;;; Generated autoloads from erc/erc-xdcc.el
+
+(register-definition-prefixes "erc-xdcc" '("erc-"))
+
+
 ;;; Generated autoloads from emacs-lisp/ert.el
 
 (autoload 'ert-deftest "ert" "\
@@ -11166,12 +10161,7 @@ it has to be wrapped in `(eval (quote ...))'.
 If NAME is already defined as a test and Emacs is running
 in batch mode, an error is signalled.
 
-\(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] 
BODY...)" nil t)
-
-(function-put 'ert-deftest 'doc-string-elt '3)
-
-(function-put 'ert-deftest 'lisp-indent-function '2)
-
+(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] 
BODY...)" nil 'macro)
 (autoload 'ert-run-tests-batch "ert" "\
 Run the tests specified by SELECTOR, printing results to the terminal.
 
@@ -11182,8 +10172,7 @@ ert-run-tests-batch-and-exit\" useful.
 
 Returns the stats object.
 
-\(fn &optional SELECTOR)" nil nil)
-
+(fn &optional SELECTOR)" nil nil)
 (autoload 'ert-run-tests-batch-and-exit "ert" "\
 Like `ert-run-tests-batch', but exits Emacs when done.
 
@@ -11192,38 +10181,28 @@ on unexpected results, or 2 if the tool detected an 
error outside
 of the tests (e.g. invalid SELECTOR or bug in the code that runs
 the tests).
 
-\(fn &optional SELECTOR)" nil nil)
-
+(fn &optional SELECTOR)" nil nil)
 (autoload 'ert-run-tests-interactively "ert" "\
 Run the tests specified by SELECTOR and display the results in a buffer.
 
 SELECTOR works as described in `ert-select-tests'.
 
-\(fn SELECTOR)" t nil)
-
+(fn SELECTOR)" t nil)
 (defalias 'ert #'ert-run-tests-interactively)
-
 (autoload 'ert-describe-test "ert" "\
 Display the documentation for TEST-OR-TEST-NAME (a symbol or ert-test).
 
-\(fn TEST-OR-TEST-NAME)" t nil)
-
+(fn TEST-OR-TEST-NAME)" t nil)
 (register-definition-prefixes "ert" '("ert-"))
 
-;;;***
 
-;;;### (autoloads nil "ert-x" "emacs-lisp/ert-x.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/ert-x.el
 
 (autoload 'ert-kill-all-test-buffers "ert-x" "\
 Kill all test buffers that are still live." t nil)
-
 (register-definition-prefixes "ert-x" '("ert-"))
 
-;;;***
 
-;;;### (autoloads nil "erts-mode" "progmodes/erts-mode.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/erts-mode.el
 
 (autoload 'erts-mode "erts-mode" "\
@@ -11232,97 +10211,71 @@ This mode mainly provides some font locking.
 
 \\{erts-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "erts-mode" '("erts-"))
 
-;;;***
 
-;;;### (autoloads nil "esh-arg" "eshell/esh-arg.el" (0 0 0 0))
 ;;; Generated autoloads from eshell/esh-arg.el
 
 (register-definition-prefixes "esh-arg" '("eshell-"))
 
-;;;***
 
-;;;### (autoloads nil "esh-cmd" "eshell/esh-cmd.el" (0 0 0 0))
 ;;; Generated autoloads from eshell/esh-cmd.el
 
 (register-definition-prefixes "esh-cmd" '("eshell" 
"pcomplete/eshell-mode/eshell-debug"))
 
-;;;***
 
-;;;### (autoloads nil "esh-ext" "eshell/esh-ext.el" (0 0 0 0))
 ;;; Generated autoloads from eshell/esh-ext.el
 
 (register-definition-prefixes "esh-ext" '("eshell"))
 
-;;;***
 
-;;;### (autoloads nil "esh-io" "eshell/esh-io.el" (0 0 0 0))
 ;;; Generated autoloads from eshell/esh-io.el
 
 (register-definition-prefixes "esh-io" '("eshell-"))
 
-;;;***
 
-;;;### (autoloads nil "esh-mode" "eshell/esh-mode.el" (0 0 0 0))
 ;;; Generated autoloads from eshell/esh-mode.el
 
 (autoload 'eshell-mode "esh-mode" "\
 Emacs shell interactive mode.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'eshell-bookmark-jump "esh-mode" "\
 Default bookmark handler for Eshell buffers.
 
-\(fn BOOKMARK)" nil nil)
-
+(fn BOOKMARK)" nil nil)
 (register-definition-prefixes "esh-mode" '("eshell"))
 
-;;;***
 
-;;;### (autoloads nil "esh-module" "eshell/esh-module.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from eshell/esh-module.el
 
 (register-definition-prefixes "esh-module" '("eshell-"))
 
-;;;***
 
-;;;### (autoloads nil "esh-opt" "eshell/esh-opt.el" (0 0 0 0))
 ;;; Generated autoloads from eshell/esh-opt.el
 
 (register-definition-prefixes "esh-opt" '("eshell-"))
 
-;;;***
 
-;;;### (autoloads nil "esh-proc" "eshell/esh-proc.el" (0 0 0 0))
 ;;; Generated autoloads from eshell/esh-proc.el
 
 (register-definition-prefixes "esh-proc" '("eshell"))
 
-;;;***
 
-;;;### (autoloads nil "esh-util" "eshell/esh-util.el" (0 0 0 0))
 ;;; Generated autoloads from eshell/esh-util.el
 
 (register-definition-prefixes "esh-util" '("eshell-"))
 
-;;;***
 
-;;;### (autoloads nil "esh-var" "eshell/esh-var.el" (0 0 0 0))
 ;;; Generated autoloads from eshell/esh-var.el
 
 (register-definition-prefixes "esh-var" '("eshell" "pcomplete/eshell-mode/"))
 
-;;;***
 
-;;;### (autoloads nil "eshell" "eshell/eshell.el" (0 0 0 0))
 ;;; Generated autoloads from eshell/eshell.el
-(push (purecopy '(eshell 2 4 2)) package--builtin-versions)
 
+(push (purecopy '(eshell 2 4 2)) package--builtin-versions)
 (autoload 'eshell "eshell" "\
 Create an interactive Eshell buffer.
 Start a new Eshell session, or switch to an already active
@@ -11340,14 +10293,12 @@ value of `eshell-buffer-name', which see.
 Eshell is a shell-like command interpreter.  For more
 information on Eshell, see Info node `(eshell)Top'.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'eshell-command "eshell" "\
 Execute the Eshell command string COMMAND.
 With prefix ARG, insert output into the current buffer at point.
 
-\(fn &optional COMMAND ARG)" t nil)
-
+(fn &optional COMMAND ARG)" t nil)
 (autoload 'eshell-command-result "eshell" "\
 Execute the given Eshell COMMAND, and return the result.
 The result might be any Lisp object.
@@ -11355,13 +10306,10 @@ If STATUS-VAR is a symbol, it will be set to the exit 
status of the
 command.  This is the only way to determine whether the value returned
 corresponding to a successful execution.
 
-\(fn COMMAND &optional STATUS-VAR)" nil nil)
-
+(fn COMMAND &optional STATUS-VAR)" nil nil)
 (register-definition-prefixes "eshell" '("eshell-"))
 
-;;;***
 
-;;;### (autoloads nil "etags" "progmodes/etags.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/etags.el
 
 (defvar tags-file-name nil "\
@@ -11372,59 +10320,44 @@ setting the value of this variable, whether 
buffer-local or global.
 Use the `etags' program to make a tags table file.")
  (put 'tags-file-name 'variable-interactive (purecopy "fVisit tags table: "))
  (put 'tags-file-name 'safe-local-variable 'stringp)
-
 (defvar tags-case-fold-search 'default "\
 Whether tags operations should be case-sensitive.
 A value of t means case-insensitive, a value of nil means case-sensitive.
 Any other value means use the setting of `case-fold-search'.")
-
 (custom-autoload 'tags-case-fold-search "etags" t)
-
 (put 'tags-case-fold-search 'safe-local-variable 'symbolp)
-
 (defvar tags-table-list nil "\
 List of file names of tags tables to search.
 An element that is a directory means the file \"TAGS\" in that directory.
 To switch to a new list of tags tables, setting this variable is sufficient.
 If you set this variable, do not also set `tags-file-name'.
 Use the `etags' program to make a tags table file.")
-
 (custom-autoload 'tags-table-list "etags" t)
-
 (defvar tags-compression-info-list (purecopy '("" ".Z" ".bz2" ".gz" ".xz" 
".tgz")) "\
 List of extensions tried by etags when `auto-compression-mode' is on.
 An empty string means search the non-compressed file.")
-
 (custom-autoload 'tags-compression-info-list "etags" t)
-
 (defvar tags-add-tables 'ask-user "\
 Control whether to add a new tags table to the current list.
 t means do; nil means don't (always start a new list).
 Any other value means ask the user whether to add a new tags table
 to the current list (as opposed to starting a new list).")
-
 (custom-autoload 'tags-add-tables "etags" t)
-
 (defvar find-tag-hook nil "\
 Hook to be run by \\[find-tag] after finding a tag.  See `run-hooks'.
 The value in the buffer in which \\[find-tag] is done is used,
 not the value in the buffer \\[find-tag] goes to.")
-
 (custom-autoload 'find-tag-hook "etags" t)
-
 (defvar find-tag-default-function nil "\
 A function of no arguments used by \\[find-tag] to pick a default tag.
 If nil, and the symbol that is the value of `major-mode'
 has a `find-tag-default-function' property (see `put'), that is used.
 Otherwise, `find-tag-default' is used.")
-
 (custom-autoload 'find-tag-default-function "etags" t)
-
 (autoload 'tags-table-mode "etags" "\
 Major mode for tags table file buffers.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'visit-tags-table "etags" "\
 Tell tags commands to use tags table file FILE.
 FILE should be the name of a file created with the `etags' program.
@@ -11437,8 +10370,7 @@ When you find a tag with \\[find-tag], the buffer it 
finds the tag
 in is given a local value of this variable which is the name of the tags
 file the tag was in.
 
-\(fn FILE &optional LOCAL)" t nil)
-
+(fn FILE &optional LOCAL)" t nil)
 (autoload 'visit-tags-table-buffer "etags" "\
 Select the buffer containing the current tags table.
 Optional arg CONT specifies which tags table to visit.
@@ -11452,21 +10384,18 @@ Optional second arg CBUF, if non-nil, specifies the 
initial buffer,
 which is important if that buffer has a local value of `tags-file-name'.
 Returns t if it visits a tags table, or nil if there are no more in the list.
 
-\(fn &optional CONT CBUF)" nil nil)
-
+(fn &optional CONT CBUF)" nil nil)
 (autoload 'tags-table-files "etags" "\
 Return a list of files in the current tags table.
 Assumes the tags table is the current buffer.  The file names are returned
 as they appeared in the `etags' command that created the table, usually
 without directory names." nil nil)
-
 (autoload 'tags-lazy-completion-table "etags" nil nil nil)
  (defun tags-completion-at-point-function ()
   (if (or tags-table-list tags-file-name)
       (progn
         (load "etags")
         (tags-completion-at-point-function))))
-
 (autoload 'find-tag-noselect "etags" "\
 Find tag (in current tags table) whose name contains TAGNAME.
 Returns the buffer containing the tag's definition and moves its point there,
@@ -11487,8 +10416,7 @@ Contrast this with the ring of marks gone to by the 
command.
 
 See documentation of variable `tags-file-name'.
 
-\(fn TAGNAME &optional NEXT-P REGEXP-P)" t nil)
-
+(fn TAGNAME &optional NEXT-P REGEXP-P)" t nil)
 (autoload 'find-tag "etags" "\
 Find tag (in current tags table) whose name contains TAGNAME.
 Select the buffer containing the tag's definition, and move point there.
@@ -11508,10 +10436,8 @@ Contrast this with the ring of marks gone to by the 
command.
 
 See documentation of variable `tags-file-name'.
 
-\(fn TAGNAME &optional NEXT-P REGEXP-P)" t nil)
-
+(fn TAGNAME &optional NEXT-P REGEXP-P)" t nil)
 (make-obsolete 'find-tag 'xref-find-definitions '"25.1")
-
 (autoload 'find-tag-other-window "etags" "\
 Find tag (in current tags table) whose name contains TAGNAME.
 Select the buffer containing the tag's definition in another window, and
@@ -11532,10 +10458,8 @@ Contrast this with the ring of marks gone to by the 
command.
 
 See documentation of variable `tags-file-name'.
 
-\(fn TAGNAME &optional NEXT-P REGEXP-P)" t nil)
-
+(fn TAGNAME &optional NEXT-P REGEXP-P)" t nil)
 (make-obsolete 'find-tag-other-window 'xref-find-definitions-other-window 
'"25.1")
-
 (autoload 'find-tag-other-frame "etags" "\
 Find tag (in current tags table) whose name contains TAGNAME.
 Select the buffer containing the tag's definition in another frame, and
@@ -11556,10 +10480,8 @@ Contrast this with the ring of marks gone to by the 
command.
 
 See documentation of variable `tags-file-name'.
 
-\(fn TAGNAME &optional NEXT-P)" t nil)
-
+(fn TAGNAME &optional NEXT-P)" t nil)
 (make-obsolete 'find-tag-other-frame 'xref-find-definitions-other-frame 
'"25.1")
-
 (autoload 'find-tag-regexp "etags" "\
 Find tag (in current tags table) whose name matches REGEXP.
 Select the buffer containing the tag's definition and move point there.
@@ -11578,14 +10500,10 @@ Contrast this with the ring of marks gone to by the 
command.
 
 See documentation of variable `tags-file-name'.
 
-\(fn REGEXP &optional NEXT-P OTHER-WINDOW)" t nil)
-
+(fn REGEXP &optional NEXT-P OTHER-WINDOW)" t nil)
 (make-obsolete 'find-tag-regexp 'xref-find-apropos '"25.1")
-
 (defalias 'pop-tag-mark 'xref-go-back)
-
 (defalias 'next-file 'tags-next-file)
-
 (autoload 'tags-next-file "etags" "\
 Select next file among files in current tags table.
 
@@ -11599,17 +10517,14 @@ Non-nil second argument NOVISIT means use a temporary 
buffer
 Value is nil if the file was already visited;
 if the file was newly read in, the value is the filename.
 
-\(fn &optional INITIALIZE NOVISIT)" t nil)
-
+(fn &optional INITIALIZE NOVISIT)" t nil)
 (autoload 'tags-loop-continue "etags" "\
 Continue last \\[tags-search] or \\[tags-query-replace] command.
 Used noninteractively with non-nil argument to begin such a command (the
 argument is passed to `next-file', which see).
 
-\(fn &optional FIRST-TIME)" t nil)
-
+(fn &optional FIRST-TIME)" t nil)
 (make-obsolete 'tags-loop-continue 'fileloop-continue '"27.1")
-
 (autoload 'tags-search "etags" "\
 Search through all files listed in tags table for match for REGEXP.
 Stops when a match is found.
@@ -11620,8 +10535,7 @@ files to search.  The search will be restricted to 
these files.
 
 Also see the documentation of the `tags-file-name' variable.
 
-\(fn REGEXP &optional FILES)" t nil)
-
+(fn REGEXP &optional FILES)" t nil)
 (autoload 'tags-query-replace "etags" "\
 Do `query-replace-regexp' of FROM with TO on all files listed in tags table.
 Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
@@ -11635,10 +10549,8 @@ type \\[help-command] at that time.
 
 For non-interactive use, this is superseded by `fileloop-initialize-replace'.
 
-\(fn FROM TO &optional DELIMITED FILES)" t nil)
-
+(fn FROM TO &optional DELIMITED FILES)" t nil)
 (set-advertised-calling-convention 'tags-query-replace '(from to &optional 
delimited) '"27.1")
-
 (autoload 'list-tags "etags" "\
 Display list of tags in file FILE.
 This searches only the first table in the list, and no included
@@ -11647,52 +10559,38 @@ usually without a directory specification.  If called
 interactively, FILE defaults to the file name of the current
 buffer.
 
-\(fn FILE &optional NEXT-MATCH)" t nil)
-
+(fn FILE &optional NEXT-MATCH)" t nil)
 (autoload 'tags-apropos "etags" "\
 Display list of all tags in tags table REGEXP matches.
 
-\(fn REGEXP)" t nil)
-
+(fn REGEXP)" t nil)
 (make-obsolete 'tags-apropos 'xref-find-apropos '"25.1")
-
 (autoload 'select-tags-table "etags" "\
 Select a tags table file from a menu of those you have already used.
 The list of tags tables to select from is stored in `tags-table-set-list';
 see the doc of that variable if you want to add names to the list." t nil)
-
 (autoload 'complete-tag "etags" "\
 Perform tags completion on the text around point.
 Completes to the set of names listed in the current tags table.
 The string to complete is chosen in the same way as the default
 for \\[find-tag] (which see)." t nil)
-
 (autoload 'etags--xref-backend "etags" nil nil nil)
-
 (register-definition-prefixes "etags" '("default-tags-table-function" "etags-" 
"file-of-tag" "find-tag-" "goto-tag-location-function" 
"initialize-new-tags-table" "last-tag" "list-tags-function" 
"select-tags-table-" "snarf-tag-function" "tag" "verify-tags-table-function"))
 
-;;;***
 
-;;;### (autoloads nil "etc-authors-mode" "textmodes/etc-authors-mode.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from textmodes/etc-authors-mode.el
 
 (autoload 'etc-authors-mode "etc-authors-mode" "\
 Major mode for viewing \"etc/AUTHORS\" from the Emacs distribution.
 Provides some basic font locking and not much else.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "etc-authors-mode" '("etc-authors-"))
 
-;;;***
 
-;;;### (autoloads nil "ethio-util" "language/ethio-util.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from language/ethio-util.el
 
 (autoload 'setup-ethiopic-environment-internal "ethio-util" nil nil nil)
-
 (autoload 'ethio-sera-to-fidel-buffer "ethio-util" "\
 Convert the current buffer from SERA to FIDEL.
 
@@ -11709,8 +10607,7 @@ even if the buffer is read-only.
 See also the descriptions of the variables
 `ethio-use-colon-for-colon' and `ethio-use-three-dot-question'.
 
-\(fn &optional SECONDARY FORCE)" t nil)
-
+(fn &optional SECONDARY FORCE)" t nil)
 (autoload 'ethio-sera-to-fidel-region "ethio-util" "\
 Convert the characters in region from SERA to FIDEL.
 
@@ -11727,15 +10624,13 @@ conversion even if the buffer is read-only.
 See also the descriptions of the variables
 `ethio-use-colon-for-colon' and `ethio-use-three-dot-question'.
 
-\(fn BEGIN END &optional SECONDARY FORCE)" t nil)
-
+(fn BEGIN END &optional SECONDARY FORCE)" t nil)
 (autoload 'ethio-sera-to-fidel-marker "ethio-util" "\
 Convert the regions surrounded by \"<sera>\" and \"</sera>\" from SERA to 
FIDEL.
 Assume that each region begins with `ethio-primary-language'.
 The markers \"<sera>\" and \"</sera>\" themselves are not deleted.
 
-\(fn &optional FORCE)" t nil)
-
+(fn &optional FORCE)" t nil)
 (autoload 'ethio-fidel-to-sera-buffer "ethio-util" "\
 Replace all the FIDEL characters in the current buffer to the SERA format.
 The variable `ethio-primary-language' specifies the primary
@@ -11752,8 +10647,7 @@ See also the descriptions of the variables
 `ethio-use-colon-for-colon', `ethio-use-three-dot-question',
 `ethio-quote-vowel-always' and `ethio-numeric-reduction'.
 
-\(fn &optional SECONDARY FORCE)" t nil)
-
+(fn &optional SECONDARY FORCE)" t nil)
 (autoload 'ethio-fidel-to-sera-region "ethio-util" "\
 Replace all the FIDEL characters in the region to the SERA format.
 
@@ -11771,17 +10665,14 @@ See also the descriptions of the variables
 `ethio-use-colon-for-colon', `ethio-use-three-dot-question',
 `ethio-quote-vowel-always' and `ethio-numeric-reduction'.
 
-\(fn BEGIN END &optional SECONDARY FORCE)" t nil)
-
+(fn BEGIN END &optional SECONDARY FORCE)" t nil)
 (autoload 'ethio-fidel-to-sera-marker "ethio-util" "\
 Convert the regions surrounded by \"<sera>\" and \"</sera>\" from FIDEL to 
SERA.
 The markers \"<sera>\" and \"</sera>\" themselves are not deleted.
 
-\(fn &optional FORCE)" t nil)
-
+(fn &optional FORCE)" t nil)
 (autoload 'ethio-modify-vowel "ethio-util" "\
 Modify the vowel of the FIDEL that is under the cursor." t nil)
-
 (autoload 'ethio-replace-space "ethio-util" "\
 Replace ASCII spaces with Ethiopic word separators in the region.
 
@@ -11795,19 +10686,15 @@ If CH = 3, with the Ethiopic colon-like word 
separator.
 
 The 2nd and 3rd arguments BEGIN and END specify the region.
 
-\(fn CH BEGIN END)" t nil)
-
+(fn CH BEGIN END)" t nil)
 (autoload 'ethio-input-special-character "ethio-util" "\
 This function is deprecated.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'ethio-fidel-to-tex-buffer "ethio-util" "\
 Convert each fidel characters in the current buffer into a fidel-tex command." 
t nil)
-
 (autoload 'ethio-tex-to-fidel-buffer "ethio-util" "\
 Convert fidel-tex commands in the current buffer into fidel chars." t nil)
-
 (autoload 'ethio-fidel-to-java-buffer "ethio-util" "\
 Convert Ethiopic characters into the Java escape sequences.
 
@@ -11816,32 +10703,29 @@ character's codepoint (in hex) in Unicode.
 
 If `ethio-java-save-lowercase' is non-nil, use [0-9a-f].
 Otherwise, [0-9A-F]." nil nil)
-
 (autoload 'ethio-java-to-fidel-buffer "ethio-util" "\
 Convert the Java escape sequences into corresponding Ethiopic characters." nil 
nil)
-
 (autoload 'ethio-find-file "ethio-util" "\
 Transliterate file content into Ethiopic depending on filename suffix." nil 
nil)
-
 (autoload 'ethio-write-file "ethio-util" "\
 Transliterate Ethiopic characters in ASCII depending on the file extension." 
nil nil)
-
 (autoload 'ethio-insert-ethio-space "ethio-util" "\
 Insert the Ethiopic word delimiter (the colon-like character).
 With ARG, insert that many delimiters.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'ethio-composition-function "ethio-util" "\
 
 
-\(fn POS TO FONT-OBJECT STRING DIRECTION)" nil nil)
-
+(fn POS TO FONT-OBJECT STRING DIRECTION)" nil nil)
 (register-definition-prefixes "ethio-util" '("ethio-" 
"exit-ethiopic-environment"))
 
-;;;***
 
-;;;### (autoloads nil "eudc" "net/eudc.el" (0 0 0 0))
+;;; Generated autoloads from leim/quail/ethiopic.el
+
+(register-definition-prefixes "quail/ethiopic" '("ethio-select-a-translation"))
+
+
 ;;; Generated autoloads from net/eudc.el
 
 (autoload 'eudc-set-server "eudc" "\
@@ -11849,20 +10733,17 @@ Set the directory server to SERVER using PROTOCOL.
 Unless NO-SAVE is non-nil, the server is saved as the default
 server for future sessions.
 
-\(fn SERVER PROTOCOL &optional NO-SAVE)" t nil)
-
+(fn SERVER PROTOCOL &optional NO-SAVE)" t nil)
 (autoload 'eudc-get-email "eudc" "\
 Get the email field of NAME from the directory server.
 If ERROR is non-nil, report an error if there is none.
 
-\(fn NAME &optional ERROR)" t nil)
-
+(fn NAME &optional ERROR)" t nil)
 (autoload 'eudc-get-phone "eudc" "\
 Get the phone field of NAME from the directory server.
 If ERROR is non-nil, report an error if there is none.
 
-\(fn NAME &optional ERROR)" t nil)
-
+(fn NAME &optional ERROR)" t nil)
 (autoload 'eudc-expand-try-all "eudc" "\
 Wrap `eudc-expand-inline' with a prefix argument.
 If TRY-ALL-SERVERS -- the prefix argument when called
@@ -11870,8 +10751,7 @@ interactively -- is non-nil, collect results from all 
servers.
 If TRY-ALL-SERVERS is nil, do not try subsequent servers after
 one server returns any match.
 
-\(fn &optional TRY-ALL-SERVERS)" t nil)
-
+(fn &optional TRY-ALL-SERVERS)" t nil)
 (autoload 'eudc-expand-inline "eudc" "\
 Query the directory server, and expand the query string before point.
 The query string consists of the buffer substring from the point back to
@@ -11887,13 +10767,11 @@ Multiple servers can be tried with the same query 
until one finds a match,
 see `eudc-inline-expansion-servers'.  If TRY-ALL-SERVERS is
 non-nil, collect results from all servers.
 
-\(fn &optional SAVE-QUERY-AS-KILL TRY-ALL-SERVERS)" t nil)
-
+(fn &optional SAVE-QUERY-AS-KILL TRY-ALL-SERVERS)" t nil)
 (autoload 'eudc-format-inline-expansion-result "eudc" "\
 Format a query result according to `eudc-inline-expansion-format'.
 
-\(fn RES QUERY-ATTRS)" nil nil)
-
+(fn RES QUERY-ATTRS)" nil nil)
 (autoload 'eudc-query-with-words "eudc" "\
 Query the directory server, and return the matching responses.
 The variable `eudc-inline-query-format' controls how to associate the
@@ -11905,126 +10783,119 @@ Multiple servers can be tried with the same query 
until one finds a match,
 see `eudc-inline-expansion-servers'.   When TRY-ALL-SERVERS is non-nil,
 keep collecting results from subsequent servers after the first match.
 
-\(fn QUERY-WORDS &optional TRY-ALL-SERVERS)" nil nil)
-
+(fn QUERY-WORDS &optional TRY-ALL-SERVERS)" nil nil)
 (autoload 'eudc-query-form "eudc" "\
 Display a form to query the directory server.
 If given a non-nil argument GET-FIELDS-FROM-SERVER, the function first
 queries the server for the existing fields and displays a corresponding form.
 
-\(fn &optional GET-FIELDS-FROM-SERVER)" t nil)
-
+(fn &optional GET-FIELDS-FROM-SERVER)" t nil)
 (autoload 'eudc-load-eudc "eudc" "\
 Load the Emacs Unified Directory Client.
 This does nothing except loading eudc by autoload side-effect." t nil)
-
 (defvar eudc-tools-menu (let ((map (make-sparse-keymap "Directory Servers"))) 
(define-key map [phone] `(menu-item ,(purecopy "Get Phone") eudc-get-phone 
:help ,(purecopy "Get the phone field of name from the directory server"))) 
(define-key map [email] `(menu-item ,(purecopy "Get Email") eudc-get-email 
:help ,(purecopy "Get the email field of NAME from the directory server"))) 
(define-key map [separator-eudc-email] menu-bar-separator) (define-key map 
[expand-inline] `(menu-item ,(purecop [...]
-
 (fset 'eudc-tools-menu (symbol-value 'eudc-tools-menu))
-
 (register-definition-prefixes "eudc" '("eudc-"))
 
-;;;***
 
-;;;### (autoloads nil "eudc-bob" "net/eudc-bob.el" (0 0 0 0))
 ;;; Generated autoloads from net/eudc-bob.el
 
 (autoload 'eudc-display-generic-binary "eudc-bob" "\
 Display a button for unidentified binary DATA.
 
-\(fn DATA)" nil nil)
-
+(fn DATA)" nil nil)
 (autoload 'eudc-display-url "eudc-bob" "\
 Display URL and make it clickable.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (autoload 'eudc-display-mail "eudc-bob" "\
 Display e-mail address and make it clickable.
 
-\(fn MAIL)" nil nil)
-
+(fn MAIL)" nil nil)
 (autoload 'eudc-display-sound "eudc-bob" "\
 Display a button to play the sound DATA.
 
-\(fn DATA)" nil nil)
-
+(fn DATA)" nil nil)
 (autoload 'eudc-display-jpeg-inline "eudc-bob" "\
 Display the JPEG DATA inline at point if possible.
 
-\(fn DATA)" nil nil)
-
+(fn DATA)" nil nil)
 (autoload 'eudc-display-jpeg-as-button "eudc-bob" "\
 Display a button for the JPEG DATA.
 
-\(fn DATA)" nil nil)
-
+(fn DATA)" nil nil)
 (register-definition-prefixes "eudc-bob" '("eudc-bob-"))
 
-;;;***
 
-;;;### (autoloads nil "eudc-export" "net/eudc-export.el" (0 0 0 0))
+;;; Generated autoloads from net/eudc-capf.el
+
+(autoload 'eudc-capf-complete "eudc-capf" "\
+Email address completion function for `completion-at-point-functions'.
+
+This function checks whether the current major mode is one of the
+modes listed in `eudc-capf-modes', and whether point is on a line
+with a message header listing email recipients, that is, a line
+whose beginning matches `message-email-recipient-header-regexp',
+and, if the check succeeds, searches for records matching the
+words before point.
+
+The return value is either nil when no match is found, or a
+completion table as required for functions listed in
+`completion-at-point-functions'." nil nil)
+(autoload 'eudc-capf-message-expand-name "eudc-capf" "\
+Email address completion function for `message-completion-alist'.
+
+When this function is added to `message-completion-alist',
+replacing any existing entry for `message-expand-name' there,
+with an appropriate regular expression such as for example
+`message-email-recipient-header-regexp', then EUDC will be
+queried for email addresses, and the results delivered to
+`completion-at-point'." nil nil)
+(register-definition-prefixes "eudc-capf" '("eudc-capf-modes"))
+
+
 ;;; Generated autoloads from net/eudc-export.el
 
 (autoload 'eudc-insert-record-at-point-into-bbdb "eudc-export" "\
 Insert record at point into the BBDB database.
 This function can only be called from a directory query result buffer." t nil)
-
 (autoload 'eudc-try-bbdb-insert "eudc-export" "\
 Call `eudc-insert-record-at-point-into-bbdb' if on a record." t nil)
-
 (register-definition-prefixes "eudc-export" '("eudc-"))
 
-;;;***
 
-;;;### (autoloads nil "eudc-hotlist" "net/eudc-hotlist.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from net/eudc-hotlist.el
 
 (autoload 'eudc-edit-hotlist "eudc-hotlist" "\
 Edit the hotlist of directory servers in a specialized buffer." t nil)
-
 (register-definition-prefixes "eudc-hotlist" '("eudc-hotlist-"))
 
-;;;***
 
-;;;### (autoloads nil "eudc-vars" "net/eudc-vars.el" (0 0 0 0))
 ;;; Generated autoloads from net/eudc-vars.el
 
 (register-definition-prefixes "eudc-vars" '("eudc-"))
 
-;;;***
 
-;;;### (autoloads nil "eudcb-bbdb" "net/eudcb-bbdb.el" (0 0 0 0))
 ;;; Generated autoloads from net/eudcb-bbdb.el
 
 (register-definition-prefixes "eudcb-bbdb" '("eudc-bbdb-"))
 
-;;;***
 
-;;;### (autoloads nil "eudcb-ldap" "net/eudcb-ldap.el" (0 0 0 0))
 ;;; Generated autoloads from net/eudcb-ldap.el
 
 (register-definition-prefixes "eudcb-ldap" '("eudc-"))
 
-;;;***
 
-;;;### (autoloads nil "eudcb-mab" "net/eudcb-mab.el" (0 0 0 0))
 ;;; Generated autoloads from net/eudcb-mab.el
 
 (register-definition-prefixes "eudcb-mab" '("eudc-"))
 
-;;;***
 
-;;;### (autoloads nil "eudcb-macos-contacts" "net/eudcb-macos-contacts.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from net/eudcb-macos-contacts.el
 
 (register-definition-prefixes "eudcb-macos-contacts" '("eudc-macos-contacts-"))
 
-;;;***
 
-;;;### (autoloads nil "ewoc" "emacs-lisp/ewoc.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/ewoc.el
 
 (autoload 'ewoc-create "ewoc" "\
@@ -12046,13 +10917,10 @@ Normally, a newline is automatically inserted after 
the header,
 the footer and every node's printed representation.  Optional
 fourth arg NOSEP non-nil inhibits this.
 
-\(fn PRETTY-PRINTER &optional HEADER FOOTER NOSEP)" nil nil)
-
+(fn PRETTY-PRINTER &optional HEADER FOOTER NOSEP)" nil nil)
 (register-definition-prefixes "ewoc" '("ewoc-"))
 
-;;;***
 
-;;;### (autoloads nil "eww" "net/eww.el" (0 0 0 0))
 ;;; Generated autoloads from net/eww.el
 
 (defvar eww-suggest-uris '(eww-links-at-point thing-at-point-url-at-point 
eww-current-url) "\
@@ -12060,9 +10928,7 @@ List of functions called to form the list of default 
URIs for `eww'.
 Each of the elements is a function returning either a string or a list
 of strings.  The results will be joined into a single list with
 duplicate entries (if any) removed.")
-
 (custom-autoload 'eww-suggest-uris "eww" t)
-
 (autoload 'eww-browse "eww" "\
 Function to be run to parse command line URLs.
 This is meant to be used for MIME handlers or command line use.
@@ -12076,7 +10942,6 @@ This can also be used on the command line directly:
  emacs -f eww-browse https://gnu.org
 
 will start Emacs and browse the GNU web site." t nil)
-
 (autoload 'eww "eww" "\
 Fetch URL and render the page.
 If the input doesn't look like an URL or a domain name, the
@@ -12089,28 +10954,24 @@ If BUFFER, the data to be rendered is in that buffer. 
 In that
 case, this function doesn't actually fetch URL.  BUFFER will be
 killed after rendering.
 
-\(fn URL &optional NEW-BUFFER BUFFER)" t nil)
+(fn URL &optional NEW-BUFFER BUFFER)" t nil)
  (defalias 'browse-web 'eww)
-
 (autoload 'eww-open-file "eww" "\
 Render FILE using EWW.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'eww-search-words "eww" "\
 Search the web for the text in the region.
 If region is active (and not whitespace), search the web for
 the text between region beginning and end.  Else, prompt the
 user for a search string.  See the variable `eww-search-prefix'
 for the search engine used." t nil)
-
 (autoload 'eww-mode "eww" "\
 Mode for browsing the web.
 
 \\{eww-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'eww-browse-url "eww" "\
 Ask the EWW browser to load URL.
 
@@ -12126,38 +10987,30 @@ in the tab-bar on an existing frame.  See more 
options in
 Non-interactively, this uses the optional second argument NEW-WINDOW
 instead of `browse-url-new-window-flag'.
 
-\(fn URL &optional NEW-WINDOW)" nil nil)
-
+(fn URL &optional NEW-WINDOW)" nil nil)
 (autoload 'eww-list-bookmarks "eww" "\
 Display the bookmarks." t nil)
-
 (autoload 'eww-bookmark-jump "eww" "\
 Default bookmark handler for EWW buffers.
 
-\(fn BOOKMARK)" nil nil)
-
+(fn BOOKMARK)" nil nil)
 (register-definition-prefixes "eww" '("erc--download-directory" "eww-"))
 
-;;;***
 
-;;;### (autoloads nil "executable" "progmodes/executable.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from progmodes/executable.el
 
 (autoload 'executable-command-find-posix-p "executable" "\
 Check if PROGRAM handles arguments Posix-style.
 If PROGRAM is non-nil, use that instead of \"find\".
 
-\(fn &optional PROGRAM)" nil nil)
-
+(fn &optional PROGRAM)" nil nil)
 (autoload 'executable-interpret "executable" "\
 Run script with user-specified args, and collect output in a buffer.
 While script runs asynchronously, you can use the \\[next-error]
 command to find the next error.  The buffer is also in `comint-mode' and
 `compilation-shell-minor-mode', so that you can answer any prompts.
 
-\(fn COMMAND)" t nil)
-
+(fn COMMAND)" t nil)
 (autoload 'executable-set-magic "executable" "\
 Set this buffer's interpreter to INTERPRETER with optional ARGUMENT.
 The variables `executable-magicless-file-regexp', `executable-prefix-env',
@@ -12165,25 +11018,19 @@ The variables `executable-magicless-file-regexp', 
`executable-prefix-env',
 when and how magic numbers are inserted or replaced and scripts made
 executable.
 
-\(fn INTERPRETER &optional ARGUMENT NO-QUERY-FLAG INSERT-FLAG)" t nil)
-
+(fn INTERPRETER &optional ARGUMENT NO-QUERY-FLAG INSERT-FLAG)" t nil)
 (autoload 'executable-make-buffer-file-executable-if-script-p "executable" "\
 Make file executable according to umask if not already executable.
 If file already has any execute bits set at all, do not change existing
 file modes." nil nil)
-
 (register-definition-prefixes "executable" '("executable-"))
 
-;;;***
 
-;;;### (autoloads nil "exif" "image/exif.el" (0 0 0 0))
 ;;; Generated autoloads from image/exif.el
 
 (register-definition-prefixes "exif" '("exif-"))
 
-;;;***
 
-;;;### (autoloads nil "expand" "expand.el" (0 0 0 0))
 ;;; Generated autoloads from expand.el
 
 (autoload 'expand-add-abbrevs "expand" "\
@@ -12208,34 +11055,36 @@ cyclically with the functions 
`expand-jump-to-previous-slot' and
 
 If ARG is omitted, point is placed at the end of the expanded text.
 
-\(fn TABLE ABBREVS)" nil nil)
-
+(fn TABLE ABBREVS)" nil nil)
 (autoload 'expand-abbrev-hook "expand" "\
 Abbrev hook used to do the expansion job of expand abbrevs.
 See `expand-add-abbrevs'.  Value is non-nil if expansion was done." nil nil)
-
 (autoload 'expand-jump-to-previous-slot "expand" "\
 Move the cursor to the previous slot in the last abbrev expansion.
 This is used only in conjunction with `expand-add-abbrevs'." t nil)
-
 (autoload 'expand-jump-to-next-slot "expand" "\
 Move the cursor to the next slot in the last abbrev expansion.
 This is used only in conjunction with `expand-add-abbrevs'." t nil)
  (define-key abbrev-map "p" 'expand-jump-to-previous-slot)
  (define-key abbrev-map "n" 'expand-jump-to-next-slot)
-
 (register-definition-prefixes "expand" '("expand-"))
 
-;;;***
 
-;;;### (autoloads nil "ezimage" "ezimage.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/expandproto.el
+
+(register-definition-prefixes "srecode/expandproto" '("srecode-"))
+
+
+;;; Generated autoloads from cedet/srecode/extract.el
+
+(register-definition-prefixes "srecode/extract" '("srecode-extract"))
+
+
 ;;; Generated autoloads from ezimage.el
 
 (register-definition-prefixes "ezimage" '("defezimage" "ezimage-"))
 
-;;;***
 
-;;;### (autoloads nil "f90" "progmodes/f90.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/f90.el
 
 (autoload 'f90-mode "f90" "\
@@ -12298,13 +11147,10 @@ Variables controlling indentation style and extra 
features:
 Turning on F90 mode calls the value of the variable `f90-mode-hook'
 with no args, if that value is non-nil.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "f90" '("f90-"))
 
-;;;***
 
-;;;### (autoloads nil "face-remap" "face-remap.el" (0 0 0 0))
 ;;; Generated autoloads from face-remap.el
 
 (autoload 'face-remap-add-relative "face-remap" "\
@@ -12329,15 +11175,13 @@ attributes.
 The base (lowest priority) remapping may be set to something
 other than the normal definition of FACE via `face-remap-set-base'.
 
-\(fn FACE &rest SPECS)" nil nil)
-
+(fn FACE &rest SPECS)" nil nil)
 (autoload 'face-remap-reset-base "face-remap" "\
 Set the base remapping of FACE to the normal definition of FACE.
 This causes the remappings specified by `face-remap-add-relative'
 to apply on top of the normal definition of FACE.
 
-\(fn FACE)" nil nil)
-
+(fn FACE)" nil nil)
 (autoload 'face-remap-set-base "face-remap" "\
 Set the base remapping of FACE in the current buffer to SPECS.
 This causes the remappings specified by `face-remap-add-relative'
@@ -12352,8 +11196,7 @@ to use the normal definition of FACE as the base 
remapping; note that
 this is different from SPECS containing a single value nil, which means
 not to inherit from the global definition of FACE at all.
 
-\(fn FACE &rest SPECS)" nil nil)
-
+(fn FACE &rest SPECS)" nil nil)
 (autoload 'text-scale-set "face-remap" "\
 Set the scale factor of the default face in the current buffer to LEVEL.
 If LEVEL is non-zero, `text-scale-mode' is enabled, otherwise it is disabled.
@@ -12363,8 +11206,7 @@ Each step scales the height of the default face by the 
variable
 `text-scale-mode-step' (a negative number decreases the height by
 the same amount).
 
-\(fn LEVEL)" t nil)
-
+(fn LEVEL)" t nil)
 (autoload 'text-scale-increase "face-remap" "\
 Increase the height of the default face in the current buffer by INC steps.
 If the new height is other than the default, `text-scale-mode' is enabled.
@@ -12374,18 +11216,16 @@ Each step scales the height of the default face by 
the variable
 height by the same amount).  As a special case, an argument of 0
 will remove any scaling currently active.
 
-\(fn INC)" t nil)
-
+(fn INC)" t nil)
 (autoload 'text-scale-decrease "face-remap" "\
 Decrease the height of the default face in the current buffer by DEC steps.
 See `text-scale-increase' for more details.
 
-\(fn DEC)" t nil)
+(fn DEC)" t nil)
  (define-key ctl-x-map [(control ?+)] 'text-scale-adjust)
  (define-key ctl-x-map [(control ?-)] 'text-scale-adjust)
  (define-key ctl-x-map [(control ?=)] 'text-scale-adjust)
  (define-key ctl-x-map [(control ?0)] 'text-scale-adjust)
-
 (autoload 'text-scale-adjust "face-remap" "\
 Adjust the height of the default face by INC.
 
@@ -12400,7 +11240,7 @@ keybinding used to invoke the command, with all 
modifiers removed:
 
 After adjusting, continue to read input events and further adjust
 the face height as long as the input event read
-\(with all modifiers removed) is one of the above characters.
+(with all modifiers removed) is one of the above characters.
 
 Each step scales the height of the default face by the variable
 `text-scale-mode-step' (a negative number of steps decreases the
@@ -12413,14 +11253,12 @@ even when it is bound in a non-top-level keymap.  For 
binding in
 a top-level keymap, `text-scale-increase' or
 `text-scale-decrease' may be more appropriate.
 
-\(fn INC)" t nil)
+(fn INC)" t nil)
  (define-key global-map [pinch] 'text-scale-pinch)
-
 (autoload 'text-scale-pinch "face-remap" "\
 Adjust the height of the default face by the scale in the pinch event EVENT.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (autoload 'buffer-face-mode "face-remap" "\
 Minor mode for a buffer-specific default face.
 
@@ -12441,8 +11279,7 @@ evaluate `buffer-face-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'buffer-face-set "face-remap" "\
 Enable `buffer-face-mode', using face specs SPECS.
 Each argument in SPECS should be a face, i.e. either a face name
@@ -12454,8 +11291,7 @@ one face is listed, that specifies an aggregate face, 
like in a
 This function makes the variable `buffer-face-mode-face' buffer
 local, and sets it to FACE.
 
-\(fn &rest SPECS)" t nil)
-
+(fn &rest SPECS)" t nil)
 (autoload 'buffer-face-toggle "face-remap" "\
 Toggle `buffer-face-mode', using face specs SPECS.
 Each argument in SPECS should be a face, i.e. either a face name
@@ -12471,25 +11307,20 @@ face, then is left enabled, but the face changed to 
reflect SPECS.
 This function will make the variable `buffer-face-mode-face'
 buffer local, and set it to SPECS.
 
-\(fn &rest SPECS)" t nil)
-
+(fn &rest SPECS)" t nil)
 (autoload 'variable-pitch-mode "face-remap" "\
 Variable-pitch default-face mode.
 An interface to `buffer-face-mode' which uses the `variable-pitch' face.
 Besides the choice of face, it is the same as `buffer-face-mode'.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "face-remap" '("buffer-face-mode-" "face-" 
"internal-lisp-face-attributes" "text-scale-"))
 
-;;;***
 
-;;;### (autoloads nil "facemenu" "facemenu.el" (0 0 0 0))
 ;;; Generated autoloads from facemenu.el
- (autoload 'facemenu-menu "facemenu" nil nil 'keymap)
 
+ (autoload 'facemenu-menu "facemenu" nil nil 'keymap)
 (define-key global-map [C-down-mouse-2] 'facemenu-menu)
-
 (autoload 'list-colors-display "facemenu" "\
 Display names of defined colors, and show what they look like.
 If the optional argument LIST is non-nil, it should be a list of
@@ -12505,19 +11336,15 @@ If the optional argument CALLBACK is non-nil, it 
should be a
 function to call each time the user types RET or clicks on a
 color.  The function should accept a single argument, the color name.
 
-\(fn &optional LIST BUFFER-NAME CALLBACK)" t nil)
-
+(fn &optional LIST BUFFER-NAME CALLBACK)" t nil)
 (register-definition-prefixes "facemenu" '("facemenu-" "list-colors-"))
 
-;;;***
 
-;;;### (autoloads nil "faceup" "emacs-lisp/faceup.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/faceup.el
-(push (purecopy '(faceup 0 0 6)) package--builtin-versions)
 
+(push (purecopy '(faceup 0 0 6)) package--builtin-versions)
 (autoload 'faceup-view-buffer "faceup" "\
 Display the faceup representation of the current buffer." t nil)
-
 (autoload 'faceup-write-file "faceup" "\
 Save the faceup representation of the current buffer to the file FILE-NAME.
 
@@ -12528,57 +11355,52 @@ If optional second arg CONFIRM is non-nil, this 
function
 asks for confirmation before overwriting an existing file.
 Interactively, confirmation is required unless you supply a prefix argument.
 
-\(fn &optional FILE-NAME CONFIRM)" t nil)
-
+(fn &optional FILE-NAME CONFIRM)" t nil)
 (autoload 'faceup-render-view-buffer "faceup" "\
 Convert BUFFER containing Faceup markup to a new buffer and display it.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (autoload 'faceup-clean-buffer "faceup" "\
 Remove faceup markup from buffer." t nil)
-
 (autoload 'faceup-defexplainer "faceup" "\
 Define an Ert explainer function for FUNCTION.
 
 FUNCTION must return an explanation when the test fails and
 `faceup-test-explain' is set.
 
-\(fn FUNCTION)" nil t)
-
+(fn FUNCTION)" nil t)
 (register-definition-prefixes "faceup" '("faceup-"))
 
-;;;***
 
-;;;### (autoloads nil "feedmail" "mail/feedmail.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/analyze/fcn.el
+
+(register-definition-prefixes "semantic/analyze/fcn" '("semantic-analyze-"))
+
+
 ;;; Generated autoloads from mail/feedmail.el
-(push (purecopy '(feedmail 11)) package--builtin-versions)
 
+(push (purecopy '(feedmail 11)) package--builtin-versions)
 (autoload 'feedmail-send-it "feedmail" "\
 Send the current mail buffer using the Feedmail package.
 This is a suitable value for `send-mail-function'.  It can be used
 with various lower-level mechanisms to provide features such as queueing." nil 
nil)
-
 (autoload 'feedmail-run-the-queue-no-prompts "feedmail" "\
 Like `feedmail-run-the-queue', but suppress confirmation prompts.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'feedmail-run-the-queue-global-prompt "feedmail" "\
 Like `feedmail-run-the-queue', but with a global confirmation prompt.
 This is generally most useful if run non-interactively, since you can
 bail out with an appropriate answer to the global confirmation prompt.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'feedmail-run-the-queue "feedmail" "\
 Visit each message in the feedmail queue directory and send it out.
 Return value is a list of three things: number of messages sent, number of
 messages skipped, and number of non-message things in the queue (commonly
 backup file names and the like).
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'feedmail-queue-reminder "feedmail" "\
 Perform some kind of reminder activity about queued and draft messages.
 Called with an optional symbol argument which says what kind of event
@@ -12598,20 +11420,15 @@ expected to perform the reminder activity.  You can 
supply your own reminder
 functions by redefining `feedmail-queue-reminder-alist'.  If you don't want any
 reminders, you can set `feedmail-queue-reminder-alist' to nil.
 
-\(fn &optional WHAT-EVENT)" t nil)
-
+(fn &optional WHAT-EVENT)" t nil)
 (register-definition-prefixes "feedmail" '("feedmail-"))
 
-;;;***
 
-;;;### (autoloads nil "ffap" "ffap.el" (0 0 0 0))
 ;;; Generated autoloads from ffap.el
 
 (defvar ffap-file-finder 'find-file "\
 The command called by `find-file-at-point' to find a file.")
-
 (custom-autoload 'ffap-file-finder "ffap" t)
-
 (autoload 'ffap-next "ffap" "\
 Search buffer for next file or URL, and run ffap.
 Optional argument BACK says to search backwards.
@@ -12620,8 +11437,7 @@ Interactively: use a single prefix 
\\[universal-argument] to search backwards,
 double prefix to wrap forward, triple to wrap backwards.
 Actual search is done by the function `ffap-next-guess'.
 
-\(fn &optional BACK WRAP)" t nil)
-
+(fn &optional BACK WRAP)" t nil)
 (autoload 'find-file-at-point "ffap" "\
 Find FILENAME, guessing a default from text around point.
 If `ffap-url-regexp' is not nil, the FILENAME may also be an URL.
@@ -12632,10 +11448,8 @@ See also the variables `ffap-dired-wildcards', 
`ffap-newfile-prompt',
 `ffap-file-name-with-spaces', and the functions `ffap-file-at-point'
 and `ffap-url-at-point'.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (defalias 'ffap 'find-file-at-point)
-
 (autoload 'ffap-menu "ffap" "\
 Put up a menu of files and URLs mentioned in this buffer.
 Then set mark, jump to choice, and try to fetch it.  The menu is
@@ -12643,8 +11457,7 @@ cached in `ffap-menu-alist', and rebuilt by 
`ffap-menu-rescan'.
 The optional RESCAN argument (a prefix, interactively) forces
 a rebuild.  Searches with `ffap-menu-regexp'.
 
-\(fn &optional RESCAN)" t nil)
-
+(fn &optional RESCAN)" t nil)
 (autoload 'ffap-at-mouse "ffap" "\
 Find file or URL guessed from text around mouse click.
 Interactively, calls `ffap-at-mouse-fallback' if no guess is found.
@@ -12653,26 +11466,25 @@ Return value:
   * if the fallback is called, return whatever it returns
   * otherwise, nil
 
-\(fn E)" t nil)
-
+(fn E)" t nil)
 (autoload 'dired-at-point "ffap" "\
 Start Dired, defaulting to file at point.  See `ffap'.
 If `dired-at-point-require-prefix' is set, the prefix meaning is reversed.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (autoload 'ffap-guess-file-name-at-point "ffap" "\
 Try to get a file name at point.
 This hook is intended to be put in `file-name-at-point-functions'." nil nil)
-
 (autoload 'ffap-bindings "ffap" "\
 Evaluate the forms in variable `ffap-bindings'." t nil)
-
 (register-definition-prefixes "ffap" '("dired-at-point-" "ffap-" 
"find-file-literally-at-point"))
 
-;;;***
 
-;;;### (autoloads nil "filecache" "filecache.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/fields.el
+
+(register-definition-prefixes "srecode/fields" '("srecode-"))
+
+
 ;;; Generated autoloads from filecache.el
 
 (autoload 'file-cache-add-directory "filecache" "\
@@ -12680,8 +11492,7 @@ Add all files in DIRECTORY to the file cache.
 If called from Lisp with a non-nil REGEXP argument is non-nil,
 only add files whose names match REGEXP.
 
-\(fn DIRECTORY &optional REGEXP)" t nil)
-
+(fn DIRECTORY &optional REGEXP)" t nil)
 (autoload 'file-cache-add-directory-list "filecache" "\
 Add DIRECTORIES (a list of directory names) to the file cache.
 If called interactively, read the directory names one by one.
@@ -12689,25 +11500,21 @@ If the optional REGEXP argument is non-nil, only 
files which match it
 will be added to the cache.  Note that the REGEXP is applied to the
 files in each directory, not to the directory list itself.
 
-\(fn DIRECTORIES &optional REGEXP)" t nil)
-
+(fn DIRECTORIES &optional REGEXP)" t nil)
 (autoload 'file-cache-add-file "filecache" "\
 Add FILE to the file cache.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'file-cache-add-directory-using-find "filecache" "\
 Use the `find' command to add files to the file cache.
 Find is run in DIRECTORY.
 
-\(fn DIRECTORY)" t nil)
-
+(fn DIRECTORY)" t nil)
 (autoload 'file-cache-add-directory-using-locate "filecache" "\
 Use the `locate' command to add files to the file cache.
 STRING is passed as an argument to the locate command.
 
-\(fn STRING)" t nil)
-
+(fn STRING)" t nil)
 (autoload 'file-cache-add-directory-recursively "filecache" "\
 Add DIR and any subdirectories to the file-cache.
 This function does not use any external programs.
@@ -12715,23 +11522,19 @@ If the optional REGEXP argument is non-nil, only 
files which match it
 will be added to the cache.  Note that the REGEXP is applied to the
 files in each directory, not to the directory list itself.
 
-\(fn DIR &optional REGEXP)" t nil)
-
+(fn DIR &optional REGEXP)" t nil)
 (autoload 'file-cache-minibuffer-complete "filecache" "\
 Complete a filename in the minibuffer using a preloaded cache.
 Filecache does two kinds of substitution: it completes on names in
 the cache, and, once it has found a unique name, it cycles through
 the directories that the name is available in.  With a prefix argument,
 the name is considered already unique; only the second substitution
-\(directories) is done.
-
-\(fn ARG)" t nil)
+(directories) is done.
 
+(fn ARG)" t nil)
 (register-definition-prefixes "filecache" '("file-cache-"))
 
-;;;***
 
-;;;### (autoloads nil "fileloop" "fileloop.el" (0 0 0 0))
 ;;; Generated autoloads from fileloop.el
 
 (autoload 'fileloop-initialize "fileloop" "\
@@ -12745,13 +11548,11 @@ to perform the operation on the current file buffer 
and when done
 should return non-nil to mean that we should immediately continue
 operating on the next file and nil otherwise.
 
-\(fn FILES SCAN-FUNCTION OPERATE-FUNCTION)" nil nil)
-
+(fn FILES SCAN-FUNCTION OPERATE-FUNCTION)" nil nil)
 (autoload 'fileloop-initialize-search "fileloop" "\
 
 
-\(fn REGEXP FILES CASE-FOLD)" nil nil)
-
+(fn REGEXP FILES CASE-FOLD)" nil nil)
 (autoload 'fileloop-initialize-replace "fileloop" "\
 Initialize a new round of query&replace on several files.
 FROM is a regexp and TO is the replacement to use.
@@ -12765,13 +11566,10 @@ CASE-FOLD can be t, nil, or `default':
      `case-fold-search' instead.
 DELIMITED if non-nil means replace only word-delimited matches.
 
-\(fn FROM TO FILES CASE-FOLD &optional DELIMITED)" nil nil)
-
+(fn FROM TO FILES CASE-FOLD &optional DELIMITED)" nil nil)
 (register-definition-prefixes "fileloop" '("fileloop-"))
 
-;;;***
 
-;;;### (autoloads nil "filenotify" "filenotify.el" (0 0 0 0))
 ;;; Generated autoloads from filenotify.el
 
 (autoload 'file-notify-handle-event "filenotify" "\
@@ -12779,15 +11577,16 @@ Handle a file system monitoring event, coming from 
backends.
 If OBJECT is a filewatch event, call its callback.
 Otherwise, signal a `file-notify-error'.
 
-\(fn OBJECT)" t nil)
-
+(fn OBJECT)" t nil)
 (function-put 'file-notify-handle-event 'completion-predicate #'ignore)
-
 (register-definition-prefixes "filenotify" '("file-notify-"))
 
-;;;***
 
-;;;### (autoloads nil "files-x" "files-x.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/files.el
+
+(register-definition-prefixes "ede/files" '("ede-"))
+
+
 ;;; Generated autoloads from files-x.el
 
 (autoload 'add-file-local-variable "files-x" "\
@@ -12801,13 +11600,11 @@ If there is no Local Variables list in the current 
file buffer
 then this function adds the first line containing the string
 `Local Variables:' and the last line containing the string `End:'.
 
-\(fn VARIABLE VALUE &optional INTERACTIVE)" t nil)
-
+(fn VARIABLE VALUE &optional INTERACTIVE)" t nil)
 (autoload 'delete-file-local-variable "files-x" "\
 Delete all settings of file-local VARIABLE from the Local Variables list.
 
-\(fn VARIABLE &optional INTERACTIVE)" t nil)
-
+(fn VARIABLE &optional INTERACTIVE)" t nil)
 (autoload 'add-file-local-variable-prop-line "files-x" "\
 Add file-local VARIABLE with its VALUE to the -*- line.
 
@@ -12818,35 +11615,27 @@ the -*- line.
 If there is no -*- line at the beginning of the current file buffer
 then this function adds it.
 
-\(fn VARIABLE VALUE &optional INTERACTIVE)" t nil)
-
+(fn VARIABLE VALUE &optional INTERACTIVE)" t nil)
 (autoload 'delete-file-local-variable-prop-line "files-x" "\
 Delete all settings of file-local VARIABLE from the -*- line.
 
-\(fn VARIABLE &optional INTERACTIVE)" t nil)
-
+(fn VARIABLE &optional INTERACTIVE)" t nil)
 (autoload 'add-dir-local-variable "files-x" "\
 Add directory-local VARIABLE with its VALUE and MODE to .dir-locals.el.
 
-\(fn MODE VARIABLE VALUE)" t nil)
-
+(fn MODE VARIABLE VALUE)" t nil)
 (autoload 'delete-dir-local-variable "files-x" "\
 Delete all MODE settings of file-local VARIABLE from .dir-locals.el.
 
-\(fn MODE VARIABLE)" t nil)
-
+(fn MODE VARIABLE)" t nil)
 (autoload 'copy-file-locals-to-dir-locals "files-x" "\
 Copy file-local variables to .dir-locals.el." t nil)
-
 (autoload 'copy-dir-locals-to-file-locals "files-x" "\
 Copy directory-local variables to the Local Variables list." t nil)
-
 (autoload 'copy-dir-locals-to-file-locals-prop-line "files-x" "\
 Copy directory-local variables to the -*- line." t nil)
-
 (defvar enable-connection-local-variables t "\
 Non-nil means enable use of connection-local variables.")
-
 (autoload 'connection-local-set-profiles "files-x" "\
 Add PROFILES for CRITERIA.
 CRITERIA is a plist identifying a connection and the application
@@ -12859,8 +11648,7 @@ PROFILES are applied to the corresponding process 
buffer.  The
 variables for a connection profile are defined using
 `connection-local-set-profile-variables'.
 
-\(fn CRITERIA &rest PROFILES)" nil nil)
-
+(fn CRITERIA &rest PROFILES)" nil nil)
 (autoload 'connection-local-set-profile-variables "files-x" "\
 Map the symbol PROFILE to a list of variable settings.
 VARIABLES is a list that declares connection-local variables for
@@ -12874,51 +11662,66 @@ variables are set in the server's process buffer 
according to the
 VARIABLES list of the connection profile.  The list is processed
 in order.
 
-\(fn PROFILE VARIABLES)" nil nil)
-
+(fn PROFILE VARIABLES)" nil nil)
 (autoload 'hack-connection-local-variables-apply "files-x" "\
 Apply connection-local variables identified by CRITERIA.
 Other local variables, like file-local and dir-local variables,
 will not be changed.
 
-\(fn CRITERIA)" nil nil)
-
+(fn CRITERIA)" nil nil)
 (autoload 'with-connection-local-variables "files-x" "\
 Apply connection-local variables according to `default-directory'.
 Execute BODY, and unwind connection-local variables.
 
-\(fn &rest BODY)" nil t)
+(fn &rest BODY)" nil t)
+(autoload 'with-connection-local-variables-1 "files-x" "\
+Apply connection-local variables according to `default-directory'.
+Call BODY-FUN with no args, and then unwind connection-local variables.
 
+(fn BODY-FUN)" nil nil)
 (autoload 'path-separator "files-x" "\
 The connection-local value of `path-separator'." nil nil)
-
 (autoload 'null-device "files-x" "\
 The connection-local value of `null-device'." nil nil)
-
 (register-definition-prefixes "files-x" '("connection-local-" 
"dir-locals-to-string" "hack-connection-local-variables" "modify-" 
"read-file-local-variable"))
 
-;;;***
 
-;;;### (autoloads nil "filesets" "filesets.el" (0 0 0 0))
 ;;; Generated autoloads from filesets.el
 
 (autoload 'filesets-init "filesets" "\
 Filesets initialization.
 Set up hooks, load the cache file -- if existing -- and build the menu." nil 
nil)
-
 (register-definition-prefixes "filesets" '("filesets-"))
 
-;;;***
 
-;;;### (autoloads nil "find-cmd" "find-cmd.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/symref/filter.el
+
+(register-definition-prefixes "semantic/symref/filter" '("semantic-symref-"))
+
+
+;;; Generated autoloads from cedet/srecode/filters.el
+
+(register-definition-prefixes "srecode/filters" '("srecode-comment-prefix"))
+
+
+;;; Generated autoloads from cedet/srecode/find.el
+
+(register-definition-prefixes "srecode/find" '("srecode-"))
+
+
+;;; Generated autoloads from cedet/semantic/find.el
+
+(register-definition-prefixes "semantic/find" '("semantic-"))
+
+
 ;;; Generated autoloads from find-cmd.el
-(push (purecopy '(find-cmd 0 6)) package--builtin-versions)
 
+(push (purecopy '(find-cmd 0 6)) package--builtin-versions)
 (autoload 'find-cmd "find-cmd" "\
 Initiate the building of a find command.
 For example:
 
-\(find-cmd \\='(prune (name \".svn\" \".git\" \".CVS\"))
+(find-cmd \\='(prune (name \".svn\" \".git\" \".CVS\"))
           \\='(and (or (name \"*.pl\" \"*.pm\" \"*.t\")
                     (mtime \"+1\"))
                 (fstype \"nfs\" \"ufs\"))))
@@ -12926,13 +11729,10 @@ For example:
 `default-directory' is used as the initial search path.  The
 result is a string that should be ready for the command line.
 
-\(fn &rest SUBFINDS)" nil nil)
-
+(fn &rest SUBFINDS)" nil nil)
 (register-definition-prefixes "find-cmd" '("find-"))
 
-;;;***
 
-;;;### (autoloads nil "find-dired" "find-dired.el" (0 0 0 0))
 ;;; Generated autoloads from find-dired.el
 
 (autoload 'find-dired "find-dired" "\
@@ -12947,8 +11747,7 @@ use in place of \"-ls\" as the final argument.
 Collect output in the \"*Find*\" buffer.  To kill the job before
 it finishes, type \\[kill-find].
 
-\(fn DIR ARGS)" t nil)
-
+(fn DIR ARGS)" t nil)
 (autoload 'find-name-dired "find-dired" "\
 Search DIR recursively for files matching the globbing PATTERN,
 and run Dired on those files.
@@ -12959,8 +11758,7 @@ The default command run (after changing into DIR) is
 
 See `find-name-arg' to customize the arguments.
 
-\(fn DIR PATTERN)" t nil)
-
+(fn DIR PATTERN)" t nil)
 (autoload 'find-grep-dired "find-dired" "\
 Find files in DIR that contain matches for REGEXP and start Dired on output.
 The command run (after changing into DIR) is
@@ -12971,13 +11769,10 @@ The command run (after changing into DIR) is
 where the first string in the value of the variable `find-ls-option'
 specifies what to use in place of \"-ls\" as the final argument.
 
-\(fn DIR REGEXP)" t nil)
-
+(fn DIR REGEXP)" t nil)
 (register-definition-prefixes "find-dired" '("find-" "kill-find" 
"lookfor-dired"))
 
-;;;***
 
-;;;### (autoloads nil "find-file" "find-file.el" (0 0 0 0))
 ;;; Generated autoloads from find-file.el
 
 (defvar ff-special-constructs `((,(purecopy "^#\\s *\\(include\\|import\\)\\s 
+[<\"]\\(.*\\)[>\"]") \, (lambda nil (match-string 2)))) "\
@@ -12987,19 +11782,15 @@ If REGEXP matches the current line (from the 
beginning of the line),
 `ff-treat-as-special' calls function EXTRACT with no args.
 If EXTRACT returns nil, keep trying.  Otherwise, return the
 filename that EXTRACT returned.")
-
 (custom-autoload 'ff-special-constructs "find-file" t)
-
 (autoload 'ff-get-other-file "find-file" "\
 Find the header or source file corresponding to this file.
 See also the documentation for `ff-find-other-file'.
 
 If optional IN-OTHER-WINDOW is non-nil, find the file in another window.
 
-\(fn &optional IN-OTHER-WINDOW)" t nil)
-
+(fn &optional IN-OTHER-WINDOW)" t nil)
 (defalias 'ff-find-related-file #'ff-find-other-file)
-
 (autoload 'ff-find-other-file "find-file" "\
 Find the header or source file corresponding to this file.
 Being on a `#include' line pulls in that file.
@@ -13057,23 +11848,18 @@ Variables of interest include:
  - `ff-file-created-hook'
    List of functions to be called if the other file has been created.
 
-\(fn &optional IN-OTHER-WINDOW IGNORE-INCLUDE EVENT)" t nil)
-
-(define-obsolete-function-alias 'ff-mouse-find-other-file #'ff-find-other-file 
"28.1")
-
-(define-obsolete-function-alias 'ff-mouse-find-other-file-other-window 
#'ff-find-other-file-other-window "28.1")
-
+(fn &optional IN-OTHER-WINDOW IGNORE-INCLUDE EVENT)" t nil)
+(define-obsolete-function-alias 'ff-mouse-find-other-file #'ff-find-other-file 
"\
+28.1")
+(define-obsolete-function-alias 'ff-mouse-find-other-file-other-window 
#'ff-find-other-file-other-window "\
+28.1")
 (autoload 'ff-find-other-file-other-window "find-file" "\
 Visit the file you point at in another window.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (register-definition-prefixes "find-file" '("cc-" "ff-" 
"modula2-other-file-alist"))
 
-;;;***
 
-;;;### (autoloads nil "find-func" "emacs-lisp/find-func.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emacs-lisp/find-func.el
 
 (autoload 'find-library "find-func" "\
@@ -13087,29 +11873,25 @@ This function searches `find-library-source-path' if 
non-nil, and
 See the `find-library-include-other-files' user option for
 customizing the candidate completions.
 
-\(fn LIBRARY)" t nil)
-
+(fn LIBRARY)" t nil)
 (autoload 'read-library-name "find-func" "\
 Read and return a library name, defaulting to the one near point.
 
 A library name is the filename of an Emacs Lisp library located
 in a directory under `load-path' (or `find-library-source-path',
 if non-nil)." nil nil)
-
 (autoload 'find-library-other-window "find-func" "\
 Find the Emacs Lisp source of LIBRARY in another window.
 
 See `find-library' for more details.
 
-\(fn LIBRARY)" t nil)
-
+(fn LIBRARY)" t nil)
 (autoload 'find-library-other-frame "find-func" "\
 Find the Emacs Lisp source of LIBRARY in another frame.
 
 See `find-library' for more details.
 
-\(fn LIBRARY)" t nil)
-
+(fn LIBRARY)" t nil)
 (autoload 'find-function-search-for-symbol "find-func" "\
 Search for SYMBOL's definition of type TYPE in LIBRARY.
 Visit the library in a buffer, and return a cons cell (BUFFER . POSITION),
@@ -13120,8 +11902,7 @@ Otherwise, TYPE specifies the kind of definition,
 and it is interpreted via `find-function-regexp-alist'.
 The search is done in the source for library LIBRARY.
 
-\(fn SYMBOL TYPE LIBRARY)" nil nil)
-
+(fn SYMBOL TYPE LIBRARY)" nil nil)
 (autoload 'find-function-noselect "find-func" "\
 Return a pair (BUFFER . POINT) pointing to the definition of FUNCTION.
 
@@ -13134,8 +11915,7 @@ If FUNCTION is a built-in function, this function 
normally
 attempts to find it in the Emacs C sources; however, if LISP-ONLY
 is non-nil, signal an error instead.
 
-\(fn FUNCTION &optional LISP-ONLY)" nil nil)
-
+(fn FUNCTION &optional LISP-ONLY)" nil nil)
 (autoload 'find-function "find-func" "\
 Find the definition of the FUNCTION near point.
 
@@ -13146,22 +11926,19 @@ Set mark before moving, if the buffer already existed.
 
 See also `find-function-recenter-line' and `find-function-after-hook'.
 
-\(fn FUNCTION)" t nil)
-
+(fn FUNCTION)" t nil)
 (autoload 'find-function-other-window "find-func" "\
 Find, in another window, the definition of FUNCTION near point.
 
 See `find-function' for more details.
 
-\(fn FUNCTION)" t nil)
-
+(fn FUNCTION)" t nil)
 (autoload 'find-function-other-frame "find-func" "\
 Find, in another frame, the definition of FUNCTION near point.
 
 See `find-function' for more details.
 
-\(fn FUNCTION)" t nil)
-
+(fn FUNCTION)" t nil)
 (autoload 'find-variable-noselect "find-func" "\
 Return a pair `(BUFFER . POINT)' pointing to the definition of VARIABLE.
 
@@ -13169,8 +11946,7 @@ Finds the library containing the definition of VARIABLE 
in a buffer and
 the point of the definition.  The buffer is not selected.
 If the variable's definition can't be found in the buffer, return (BUFFER).
 
-\(fn VARIABLE &optional FILE)" nil nil)
-
+(fn VARIABLE &optional FILE)" nil nil)
 (autoload 'find-variable "find-func" "\
 Find the definition of the VARIABLE at or before point.
 
@@ -13182,22 +11958,19 @@ Set mark before moving, if the buffer already existed.
 
 See also `find-function-recenter-line' and `find-function-after-hook'.
 
-\(fn VARIABLE)" t nil)
-
+(fn VARIABLE)" t nil)
 (autoload 'find-variable-other-window "find-func" "\
 Find, in another window, the definition of VARIABLE near point.
 
 See `find-variable' for more details.
 
-\(fn VARIABLE)" t nil)
-
+(fn VARIABLE)" t nil)
 (autoload 'find-variable-other-frame "find-func" "\
 Find, in another frame, the definition of VARIABLE near point.
 
 See `find-variable' for more details.
 
-\(fn VARIABLE)" t nil)
-
+(fn VARIABLE)" t nil)
 (autoload 'find-definition-noselect "find-func" "\
 Return a pair `(BUFFER . POINT)' pointing to the definition of SYMBOL.
 If the definition can't be found in the buffer, return (BUFFER).
@@ -13205,8 +11978,7 @@ TYPE says what type of definition: nil for a function, 
`defvar' for a
 variable, `defface' for a face.  This function does not switch to the
 buffer nor display it.
 
-\(fn SYMBOL TYPE &optional FILE)" nil nil)
-
+(fn SYMBOL TYPE &optional FILE)" nil nil)
 (autoload 'find-face-definition "find-func" "\
 Find the definition of FACE.  FACE defaults to the name near point.
 
@@ -13218,81 +11990,62 @@ Set mark before moving, if the buffer already existed.
 
 See also `find-function-recenter-line' and `find-function-after-hook'.
 
-\(fn FACE)" t nil)
-
+(fn FACE)" t nil)
 (autoload 'find-function-on-key "find-func" "\
 Find the function that KEY invokes.  KEY is a string.
 Set mark before moving, if the buffer already existed.
 
-\(fn KEY)" t nil)
-
+(fn KEY)" t nil)
 (autoload 'find-function-on-key-other-window "find-func" "\
 Find, in the other window, the function that KEY invokes.
 See `find-function-on-key'.
 
-\(fn KEY)" t nil)
-
+(fn KEY)" t nil)
 (autoload 'find-function-on-key-other-frame "find-func" "\
 Find, in the other frame, the function that KEY invokes.
 See `find-function-on-key'.
 
-\(fn KEY)" t nil)
-
+(fn KEY)" t nil)
 (autoload 'find-function-at-point "find-func" "\
 Find directly the function at point in the other window." t nil)
-
 (autoload 'find-variable-at-point "find-func" "\
 Find directly the variable at point in the other window." t nil)
-
 (autoload 'find-function-setup-keys "find-func" "\
 Define some key bindings for the `find-function' family of functions." nil nil)
-
 (register-definition-prefixes "find-func" '("find-" 
"read-library-name--find-files"))
 
-;;;***
 
-;;;### (autoloads nil "find-lisp" "find-lisp.el" (0 0 0 0))
 ;;; Generated autoloads from find-lisp.el
 
 (autoload 'find-lisp-find-dired "find-lisp" "\
 Find files in DIR, matching REGEXP.
 
-\(fn DIR REGEXP)" t nil)
-
+(fn DIR REGEXP)" t nil)
 (autoload 'find-lisp-find-dired-subdirectories "find-lisp" "\
 Find all subdirectories of DIR.
 
-\(fn DIR)" t nil)
-
+(fn DIR)" t nil)
 (autoload 'find-lisp-find-dired-filter "find-lisp" "\
 Change the filter on a `find-lisp-find-dired' buffer to REGEXP.
 
-\(fn REGEXP)" t nil)
-
+(fn REGEXP)" t nil)
 (register-definition-prefixes "find-lisp" '("find-lisp-"))
 
-;;;***
 
-;;;### (autoloads nil "finder" "finder.el" (0 0 0 0))
 ;;; Generated autoloads from finder.el
 
 (autoload 'finder-list-keywords "finder" "\
 Display descriptions of the keywords in the Finder buffer." t nil)
-
 (autoload 'finder-commentary "finder" "\
 Display FILE's commentary section.
 FILE should be in a form suitable for passing to `locate-library'.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'finder-by-keyword "finder" "\
 Find packages matching a given keyword." t nil)
-
 (register-definition-prefixes "finder" '("finder-" 
"generated-finder-keywords-file"))
 
-;;;***
 
-;;;### (autoloads nil "flow-ctrl" "flow-ctrl.el" (0 0 0 0))
 ;;; Generated autoloads from flow-ctrl.el
 
 (autoload 'enable-flow-control "flow-ctrl" "\
@@ -13300,8 +12053,7 @@ Toggle flow control handling.
 When handling is enabled, user can type C-s as C-\\, and C-q as C-^.
 With arg, enable flow control mode if arg is positive, otherwise disable.
 
-\(fn &optional ARGUMENT)" t nil)
-
+(fn &optional ARGUMENT)" t nil)
 (autoload 'enable-flow-control-on "flow-ctrl" "\
 Enable flow control if using one of a specified set of terminal types.
 Use `(enable-flow-control-on \"vt100\" \"h19\")' to enable flow control
@@ -13309,20 +12061,16 @@ on VT-100 and H19 terminals.  When flow control is 
enabled,
 you must type C-\\ to get the effect of a C-s, and type C-^
 to get the effect of a C-q.
 
-\(fn &rest LOSING-TERMINAL-TYPES)" nil nil)
-
+(fn &rest LOSING-TERMINAL-TYPES)" nil nil)
 (register-definition-prefixes "flow-ctrl" '("flow-control-c-"))
 
-;;;***
 
-;;;### (autoloads nil "flow-fill" "mail/flow-fill.el" (0 0 0 0))
 ;;; Generated autoloads from mail/flow-fill.el
 
 (autoload 'fill-flowed-encode "flow-fill" "\
 
 
-\(fn &optional BUFFER)" nil nil)
-
+(fn &optional BUFFER)" nil nil)
 (autoload 'fill-flowed "flow-fill" "\
 Apply RFC2646 decoding to BUFFER.
 If BUFFER is nil, default to the current buffer.
@@ -13330,16 +12078,13 @@ If BUFFER is nil, default to the current buffer.
 If DELETE-SPACE, delete RFC2646 spaces padding at the end of
 lines.
 
-\(fn &optional BUFFER DELETE-SPACE)" nil nil)
-
+(fn &optional BUFFER DELETE-SPACE)" nil nil)
 (register-definition-prefixes "flow-fill" '("fill-flowed-"))
 
-;;;***
 
-;;;### (autoloads nil "flymake" "progmodes/flymake.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/flymake.el
-(push (purecopy '(flymake 1 2 2)) package--builtin-versions)
 
+(push (purecopy '(flymake 1 2 2)) package--builtin-versions)
 (autoload 'flymake-log "flymake" "\
 Log, at level LEVEL, the message MSG formatted with ARGS.
 LEVEL is passed to `display-warning', which is used to display
@@ -13347,8 +12092,7 @@ the warning.  If this form is included in a file,
 the generated warning contains an indication of the file that
 generated it.
 
-\(fn LEVEL MSG &rest ARGS)" nil t)
-
+(fn LEVEL MSG &rest ARGS)" nil t)
 (autoload 'flymake-make-diagnostic "flymake" "\
 Make a Flymake diagnostic for LOCUS's region from BEG to END.
 LOCUS is a buffer object or a string designating a file name.
@@ -13370,8 +12114,7 @@ created diagnostic, overriding the default properties 
and any
 properties listed in the `flymake-overlay-control' property of
 the diagnostic's type symbol.
 
-\(fn LOCUS BEG END TYPE TEXT &optional DATA OVERLAY-PROPERTIES)" nil nil)
-
+(fn LOCUS BEG END TYPE TEXT &optional DATA OVERLAY-PROPERTIES)" nil nil)
 (autoload 'flymake-diagnostics "flymake" "\
 Get Flymake diagnostics in region determined by BEG and END.
 
@@ -13379,15 +12122,13 @@ If neither BEG or END is supplied, use whole 
accessible buffer,
 otherwise if BEG is non-nil and END is nil, consider only
 diagnostics at BEG.
 
-\(fn &optional BEG END)" nil nil)
-
+(fn &optional BEG END)" nil nil)
 (autoload 'flymake-diag-region "flymake" "\
 Compute BUFFER's region (BEG . END) corresponding to LINE and COL.
 If COL is nil, return a region just for LINE.  Return nil if the
 region is invalid.  This function saves match data.
 
-\(fn BUFFER LINE &optional COL)" nil nil)
-
+(fn BUFFER LINE &optional COL)" nil nil)
 (autoload 'flymake-mode "flymake" "\
 Toggle Flymake mode on or off.
 
@@ -13405,6 +12146,13 @@ The commands `flymake-goto-next-error' and
 `flymake-goto-prev-error' can be used to navigate among Flymake
 diagnostics annotated in the buffer.
 
+By default, `flymake-mode' doesn't override the \\[next-error] command, but
+if you're using Flymake a lot (and don't use the regular compilation
+mechanisms that often), it can be useful to put something like
+the following in your init file:
+
+  (setq next-error-function \\='flymake-goto-next-error)
+
 The visual appearance of each type of diagnostic can be changed
 by setting properties `flymake-overlay-control', `flymake-bitmap'
 and `flymake-severity' on the symbols of diagnostic types (like
@@ -13435,20 +12183,14 @@ evaluate `flymake-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'flymake-mode-on "flymake" "\
 Turn Flymake mode on." nil nil)
-
 (autoload 'flymake-mode-off "flymake" "\
 Turn Flymake mode off." nil nil)
-
 (register-definition-prefixes "flymake" '("flymake-"))
 
-;;;***
 
-;;;### (autoloads nil "flymake-cc" "progmodes/flymake-cc.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from progmodes/flymake-cc.el
 
 (autoload 'flymake-cc "flymake-cc" "\
@@ -13457,28 +12199,21 @@ This backend uses `flymake-cc-command' (which see) to 
launch a
 process that is passed the current buffer's contents via stdin.
 REPORT-FN is Flymake's callback.
 
-\(fn REPORT-FN &rest ARGS)" nil nil)
-
+(fn REPORT-FN &rest ARGS)" nil nil)
 (register-definition-prefixes "flymake-cc" '("flymake-cc-"))
 
-;;;***
 
-;;;### (autoloads nil "flymake-proc" "progmodes/flymake-proc.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from progmodes/flymake-proc.el
-(push (purecopy '(flymake-proc 1 0)) package--builtin-versions)
 
+(push (purecopy '(flymake-proc 1 0)) package--builtin-versions)
 (register-definition-prefixes "flymake-proc" '("flymake-proc-"))
 
-;;;***
 
-;;;### (autoloads nil "flyspell" "textmodes/flyspell.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/flyspell.el
 
 (autoload 'flyspell-prog-mode "flyspell" "\
 Turn on `flyspell-mode' for comments and strings." t nil)
 (defvar flyspell-mode nil "Non-nil if Flyspell mode is enabled.")
-
 (autoload 'flyspell-mode "flyspell" "\
 Toggle on-the-fly spell checking (Flyspell mode).
 
@@ -13505,7 +12240,7 @@ invoking `ispell-change-dictionary'.
 
 Consider using the `ispell-parser' to check your text.  For instance
 consider adding:
-\(add-hook \\='tex-mode-hook (lambda () (setq ispell-parser \\='tex)))
+(add-hook \\='tex-mode-hook (lambda () (setq ispell-parser \\='tex)))
 in your init file.
 
 \\[flyspell-region] checks all words inside a region.
@@ -13525,49 +12260,37 @@ evaluate `flyspell-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'turn-on-flyspell "flyspell" "\
 Unconditionally turn on Flyspell mode." nil nil)
-
 (autoload 'turn-off-flyspell "flyspell" "\
 Unconditionally turn off Flyspell mode." nil nil)
-
 (autoload 'flyspell-mode-off "flyspell" "\
 Turn Flyspell mode off." nil nil)
-
 (autoload 'flyspell-region "flyspell" "\
 Flyspell text between BEG and END.
 
 Make sure `flyspell-mode' is turned on if you want the highlight
 of a misspelled word removed when you've corrected it.
 
-\(fn BEG END)" t nil)
-
+(fn BEG END)" t nil)
 (autoload 'flyspell-buffer "flyspell" "\
 Flyspell whole buffer." t nil)
-
 (register-definition-prefixes "flyspell" '("flyspell-" 
"mail-mode-flyspell-verify" "make-flyspell-overlay" "sgml-mode-flyspell-verify" 
"tex"))
 
-;;;***
 
-;;;### (autoloads nil "foldout" "foldout.el" (0 0 0 0))
 ;;; Generated autoloads from foldout.el
-(push (purecopy '(foldout 1 10)) package--builtin-versions)
 
+(push (purecopy '(foldout 1 10)) package--builtin-versions)
 (register-definition-prefixes "foldout" '("foldout-"))
 
-;;;***
 
-;;;### (autoloads nil "follow" "follow.el" (0 0 0 0))
 ;;; Generated autoloads from follow.el
 
 (autoload 'turn-on-follow-mode "follow" "\
 Turn on Follow mode.  Please see the function `follow-mode'." nil nil)
-
 (autoload 'turn-off-follow-mode "follow" "\
 Turn off Follow mode.  Please see the function `follow-mode'." nil nil)
-
 (autoload 'follow-mode "follow" "\
 Toggle Follow mode.
 
@@ -13614,8 +12337,7 @@ evaluate `follow-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'follow-scroll-up-window "follow" "\
 Scroll text in a Follow mode window up by that window's size.
 The other windows in the window chain will scroll synchronously.
@@ -13628,8 +12350,7 @@ Negative ARG means scroll downward.
 
 Works like `scroll-up' when not in Follow mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'follow-scroll-down-window "follow" "\
 Scroll text in a Follow mode window down by that window's size.
 The other windows in the window chain will scroll synchronously.
@@ -13642,8 +12363,7 @@ Negative ARG means scroll upward.
 
 Works like `scroll-down' when not in Follow mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'follow-scroll-up "follow" "\
 Scroll text in a Follow mode window chain up.
 
@@ -13655,8 +12375,7 @@ Negative ARG means scroll downward.
 
 Works like `scroll-up' when not in Follow mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'follow-scroll-down "follow" "\
 Scroll text in a Follow mode window chain down.
 
@@ -13668,8 +12387,7 @@ Negative ARG means scroll upward.
 
 Works like `scroll-down' when not in Follow mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'follow-delete-other-windows-and-split "follow" "\
 Create two side by side windows and enter Follow mode.
 
@@ -13678,27 +12396,21 @@ in the selected window.  All other windows, in the 
current
 frame, are deleted and the selected window is split in two
 side-by-side windows.  Follow mode is activated, hence the
 two windows always will display two successive pages.
-\(If one window is moved, the other one will follow.)
+(If one window is moved, the other one will follow.)
 
 If ARG is positive, the leftmost window is selected.  If negative,
 the rightmost is selected.  If ARG is nil, the leftmost window is
 selected if the original window is the first one in the frame.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "follow" '("follow-"))
 
-;;;***
 
-;;;### (autoloads nil "fontset" "international/fontset.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from international/fontset.el
 
-(register-definition-prefixes "fontset" '("charset-script-alist" "create-" 
"fontset-" "generate-fontset-menu" "set" "standard-fontset-spec" "x-" "xlfd-"))
+(register-definition-prefixes "fontset" '("build-default-fontset-data" 
"charset-script-alist" "create-" "fontset-" "generate-fontset-menu" "set" 
"standard-fontset-spec" "x-" "xlfd-"))
 
-;;;***
 
-;;;### (autoloads nil "footnote" "mail/footnote.el" (0 0 0 0))
 ;;; Generated autoloads from mail/footnote.el
 
 (autoload 'footnote-mode "footnote" "\
@@ -13723,13 +12435,15 @@ evaluate `footnote-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "footnote" '("footnote-"))
 
-;;;***
 
-;;;### (autoloads nil "format-spec" "format-spec.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/format.el
+
+(register-definition-prefixes "semantic/format" '("semantic-"))
+
+
 ;;; Generated autoloads from format-spec.el
 
 (autoload 'format-spec "format-spec" "\
@@ -13780,13 +12494,10 @@ any occurrences of \"%%\" in FORMAT verbatim in the 
result.
 If SPLIT, instead of returning a single string, a list of strings
 is returned, where each format spec is its own element.
 
-\(fn FORMAT SPECIFICATION &optional IGNORE-MISSING SPLIT)" nil nil)
-
+(fn FORMAT SPECIFICATION &optional IGNORE-MISSING SPLIT)" nil nil)
 (register-definition-prefixes "format-spec" '("format-spec-"))
 
-;;;***
 
-;;;### (autoloads nil "forms" "forms.el" (0 0 0 0))
 ;;; Generated autoloads from forms.el
 
 (autoload 'forms-mode "forms" "\
@@ -13808,23 +12519,18 @@ Commands:                        Equivalent keys in 
read-only mode:
  C-c C-s        forms-search-forward       s
  C-c C-x        forms-exit                 x
 
-\(fn &optional PRIMARY)" t nil)
-
+(fn &optional PRIMARY)" t nil)
 (autoload 'forms-find-file "forms" "\
 Visit a file in Forms mode.
 
-\(fn FN)" t nil)
-
+(fn FN)" t nil)
 (autoload 'forms-find-file-other-window "forms" "\
 Visit a file in Forms mode in other window.
 
-\(fn FN)" t nil)
-
+(fn FN)" t nil)
 (register-definition-prefixes "forms" '("forms-"))
 
-;;;***
 
-;;;### (autoloads nil "fortran" "progmodes/fortran.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/fortran.el
 
 (autoload 'fortran-mode "fortran" "\
@@ -13897,13 +12603,10 @@ Variables controlling indentation style and extra 
features:
 Turning on Fortran mode calls the value of the variable `fortran-mode-hook'
 with no args, if that value is non-nil.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "fortran" '("fortran-"))
 
-;;;***
 
-;;;### (autoloads nil "fortune" "play/fortune.el" (0 0 0 0))
 ;;; Generated autoloads from play/fortune.el
 
 (autoload 'fortune-add-fortune "fortune" "\
@@ -13912,24 +12615,21 @@ Add STRING to a fortune file FILE.
 Interactively, if called with a prefix argument,
 read the file name to use.  Otherwise use the value of `fortune-file'.
 
-\(fn STRING FILE)" t nil)
-
+(fn STRING FILE)" t nil)
 (autoload 'fortune-from-region "fortune" "\
 Append the current region to a local fortune-like data file.
 
 Interactively, if called with a prefix argument,
 read the file name to use.  Otherwise use the value of `fortune-file'.
 
-\(fn BEG END FILE)" t nil)
-
+(fn BEG END FILE)" t nil)
 (autoload 'fortune-compile "fortune" "\
 Compile fortune file.
 
 If called with a prefix asks for the FILE to compile, otherwise uses
 the value of `fortune-file'.  This currently cannot handle directories.
 
-\(fn &optional FILE)" t nil)
-
+(fn &optional FILE)" t nil)
 (autoload 'fortune-to-signature "fortune" "\
 Create signature from output of the fortune program.
 
@@ -13938,15 +12638,13 @@ otherwise uses the value of `fortune-file'.  If you 
want to have fortune
 choose from a set of files in a directory, call interactively with prefix
 and choose the directory as the fortune-file.
 
-\(fn &optional FILE)" t nil)
-
+(fn &optional FILE)" t nil)
 (autoload 'fortune-message "fortune" "\
 Display a fortune cookie to the mini-buffer.
 If called with a prefix, it has the same behavior as `fortune'.
 Optional FILE is a fortune file from which a cookie will be selected.
 
-\(fn &optional FILE)" t nil)
-
+(fn &optional FILE)" t nil)
 (autoload 'fortune "fortune" "\
 Display a fortune cookie.
 If called with a prefix asks for the FILE to choose the fortune from,
@@ -13954,23 +12652,18 @@ otherwise uses the value of `fortune-file'.  If you 
want to have fortune
 choose from a set of files in a directory, call interactively with prefix
 and choose the directory as the fortune-file.
 
-\(fn &optional FILE)" t nil)
-
+(fn &optional FILE)" t nil)
 (register-definition-prefixes "fortune" '("fortune-"))
 
-;;;***
 
-;;;### (autoloads nil "frameset" "frameset.el" (0 0 0 0))
 ;;; Generated autoloads from frameset.el
 
 (defvar frameset-session-filter-alist (append '((left . 
frameset-filter-iconified) (minibuffer . frameset-filter-minibuffer) (top . 
frameset-filter-iconified)) (mapcar (lambda (p) (cons p :never)) 
frame-internal-parameters)) "\
 Minimum set of parameters to filter for live (on-session) framesets.
 DO NOT MODIFY.  See `frameset-filter-alist' for a full description.")
-
 (defvar frameset-persistent-filter-alist (append '((background-color . 
frameset-filter-sanitize-color) (bottom . frameset-filter-shelve-param) 
(buffer-list . :never) (buffer-predicate . :never) (buried-buffer-list . 
:never) (client . :never) (delete-before . :never) (font . 
frameset-filter-font-param) (font-backend . :never) (foreground-color . 
frameset-filter-sanitize-color) (frameset--text-pixel-height . :save) 
(frameset--text-pixel-width . :save) (fullscreen . frameset-filter-shelve-p 
[...]
 Parameters to filter for persistent framesets.
 DO NOT MODIFY.  See `frameset-filter-alist' for a full description.")
-
 (defvar frameset-filter-alist frameset-persistent-filter-alist "\
 Alist of frame parameters and filtering functions.
 
@@ -14026,7 +12719,6 @@ It must return:
 
 Frame parameters not on this alist are passed intact, as if they were
 defined with ACTION = nil.")
-
 (autoload 'frameset-frame-id "frameset" "\
 Return the frame id of FRAME, if it has one; else, return nil.
 A frame id is a string that uniquely identifies a frame.
@@ -14035,20 +12727,17 @@ invocations, and once assigned is never changed 
unless the same
 frame is duplicated (via `frameset-restore'), in which case the
 newest frame keeps the id and the old frame's is set to nil.
 
-\(fn FRAME)" nil nil)
-
+(fn FRAME)" nil nil)
 (autoload 'frameset-frame-id-equal-p "frameset" "\
 Return non-nil if FRAME's id matches ID.
 
-\(fn FRAME ID)" nil nil)
-
+(fn FRAME ID)" nil nil)
 (autoload 'frameset-frame-with-id "frameset" "\
 Return the live frame with id ID, if exists; else nil.
 If FRAME-LIST is a list of frames, check these frames only.
 If nil, check all live frames.
 
-\(fn ID &optional FRAME-LIST)" nil nil)
-
+(fn ID &optional FRAME-LIST)" nil nil)
 (autoload 'frameset-save "frameset" "\
 Return a frameset for FRAME-LIST, a list of frames.
 Dead frames and non-frame objects are silently removed from the list.
@@ -14061,8 +12750,7 @@ PREDICATE is a predicate function, which must return 
non-nil for frames that
 should be saved; if PREDICATE is nil, all frames from FRAME-LIST are saved.
 PROPERTIES is a user-defined property list to add to the frameset.
 
-\(fn FRAME-LIST &key APP NAME DESCRIPTION FILTERS PREDICATE PROPERTIES)" nil 
nil)
-
+(fn FRAME-LIST &key APP NAME DESCRIPTION FILTERS PREDICATE PROPERTIES)" nil 
nil)
 (autoload 'frameset-restore "frameset" "\
 Restore a FRAMESET into the current display(s).
 
@@ -14122,8 +12810,7 @@ restoration, including those that have been reused or 
created anew.
 
 All keyword parameters default to nil.
 
-\(fn FRAMESET &key PREDICATE FILTERS REUSE-FRAMES FORCE-DISPLAY FORCE-ONSCREEN 
CLEANUP-FRAMES)" nil nil)
-
+(fn FRAMESET &key PREDICATE FILTERS REUSE-FRAMES FORCE-DISPLAY FORCE-ONSCREEN 
CLEANUP-FRAMES)" nil nil)
 (autoload 'frameset-to-register "frameset" "\
 Store the current frameset in register REGISTER.
 Use \\[jump-to-register] to restore the frameset.
@@ -14131,45 +12818,53 @@ Argument is a character, naming the register.
 
 Interactively, reads the register using `register-read-with-preview'.
 
-\(fn REGISTER)" t nil)
-
+(fn REGISTER)" t nil)
 (register-definition-prefixes "frameset" '("frameset-"))
 
-;;;***
 
-;;;### (autoloads nil "fringe" "fringe.el" (0 0 0 0))
 ;;; Generated autoloads from fringe.el
 
-(unless (fboundp 'define-fringe-bitmap) (defun define-fringe-bitmap (_bitmap 
_bits &optional _height _width _align) "Define fringe bitmap BITMAP from BITS 
of size HEIGHT x WIDTH.\nBITMAP is a symbol identifying the new fringe 
bitmap.\nBITS is either a string or a vector of integers.\nHEIGHT is height of 
bitmap.  If HEIGHT is nil, use length of BITS.\nWIDTH must be an integer 
between 1 and 16, or nil which defaults to 8.\nOptional fifth arg ALIGN may be 
one of ‘top’, ‘center’, or ‘bottom’ [...]
-
+(unless (fboundp 'define-fringe-bitmap) (defun define-fringe-bitmap (_bitmap 
_bits &optional _height _width _align) "Define fringe bitmap BITMAP from BITS 
of size HEIGHT x WIDTH.
+BITMAP is a symbol identifying the new fringe bitmap.
+BITS is either a string or a vector of integers.
+HEIGHT is height of bitmap.  If HEIGHT is nil, use length of BITS.
+WIDTH must be an integer between 1 and 16, or nil which defaults to 8.
+Optional fifth arg ALIGN may be one of `top', `center', or `bottom',
+indicating the positioning of the bitmap relative to the rows where it
+is used; the default is to center the bitmap.  Fifth arg may also be a
+list (ALIGN PERIODIC) where PERIODIC non-nil specifies that the bitmap
+should be repeated.
+If BITMAP already exists, the existing definition is replaced."))
 (register-definition-prefixes "fringe" '("fringe-" "set-fringe-"))
 
-;;;***
 
-;;;### (autoloads nil "gamegrid" "play/gamegrid.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/fw.el
+
+(register-definition-prefixes "semantic/fw" '("semantic"))
+
+
 ;;; Generated autoloads from play/gamegrid.el
 
 (register-definition-prefixes "gamegrid" '("gamegrid-"))
 
-;;;***
 
-;;;### (autoloads nil "gametree" "play/gametree.el" (0 0 0 0))
 ;;; Generated autoloads from play/gametree.el
 
 (register-definition-prefixes "gametree" '("gametree-"))
 
-;;;***
 
-;;;### (autoloads nil "gdb-mi" "progmodes/gdb-mi.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/bovine/gcc.el
+
+(register-definition-prefixes "semantic/bovine/gcc" '("semantic-"))
+
+
 ;;; Generated autoloads from progmodes/gdb-mi.el
 
 (defvar gdb-enable-debug nil "\
 Non-nil if Gdb-Enable-Debug mode is enabled.
 See the `gdb-enable-debug' command
 for a description of this minor mode.")
-
 (custom-autoload 'gdb-enable-debug "gdb-mi" nil)
-
 (autoload 'gdb-enable-debug "gdb-mi" "\
 Toggle logging of transaction between Emacs and Gdb.
 
@@ -14194,8 +12889,7 @@ evaluate `(default-value \\='gdb-enable-debug)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'gdb "gdb-mi" "\
 Run gdb passing it COMMAND-LINE as arguments.
 
@@ -14254,28 +12948,21 @@ detailed description of this mode.
 |                                   | D      gdb-delete-breakpoint     |
 +-----------------------------------+----------------------------------+
 
-\(fn COMMAND-LINE)" t nil)
-
+(fn COMMAND-LINE)" t nil)
 (register-definition-prefixes "gdb-mi" '("breakpoint" "def-gdb-" "gdb" "gud-" 
"hollow-right-triangle" "nil"))
 
-;;;***
 
-;;;### (autoloads nil "generator" "emacs-lisp/generator.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emacs-lisp/generator.el
 
 (register-definition-prefixes "generator" '("cps-" "iter-"))
 
-;;;***
 
-;;;### (autoloads nil "generic" "emacs-lisp/generic.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/generic.el
 
 (defvar generic-mode-list nil "\
 A list of mode names for `generic-mode'.
 Do not add entries to this list directly; use `define-generic-mode'
 instead (which see).")
-
 (autoload 'define-generic-mode "generic" "\
 Create a new generic mode MODE.
 
@@ -14314,17 +13001,13 @@ mode hook `MODE-hook'.
 
 See the file generic-x.el for some examples of `define-generic-mode'.
 
-\(fn MODE COMMENT-LIST KEYWORD-LIST FONT-LOCK-LIST AUTO-MODE-LIST 
FUNCTION-LIST &optional DOCSTRING)" nil t)
-
+(fn MODE COMMENT-LIST KEYWORD-LIST FONT-LOCK-LIST AUTO-MODE-LIST FUNCTION-LIST 
&optional DOCSTRING)" nil t)
 (function-put 'define-generic-mode 'lisp-indent-function '1)
-
 (function-put 'define-generic-mode 'doc-string-elt '7)
-
 (autoload 'generic-mode-internal "generic" "\
 Go into the generic mode MODE.
 
-\(fn MODE COMMENT-LIST KEYWORD-LIST FONT-LOCK-LIST FUNCTION-LIST)" nil nil)
-
+(fn MODE COMMENT-LIST KEYWORD-LIST FONT-LOCK-LIST FUNCTION-LIST)" nil nil)
 (autoload 'generic-mode "generic" "\
 Enter generic mode MODE.
 
@@ -14335,8 +13018,7 @@ own mode, but have comment characters, keywords, and 
the like.)
 To define a generic-mode, use the function `define-generic-mode'.
 Some generic modes are defined in `generic-x.el'.
 
-\(fn MODE)" t nil)
-
+(fn MODE)" t nil)
 (autoload 'generic-make-keywords-list "generic" "\
 Return a `font-lock-keywords' construct that highlights KEYWORD-LIST.
 KEYWORD-LIST is a list of keyword strings that should be
@@ -14346,22 +13028,21 @@ PREFIX and SUFFIX.  Then it returns a construct based 
on this
 regular expression that can be used as an element of
 `font-lock-keywords'.
 
-\(fn KEYWORD-LIST FACE &optional PREFIX SUFFIX)" nil nil)
-
+(fn KEYWORD-LIST FACE &optional PREFIX SUFFIX)" nil nil)
 (make-obsolete 'generic-make-keywords-list 'regexp-opt '"24.4")
-
 (register-definition-prefixes "generic" '("generic-"))
 
-;;;***
 
-;;;### (autoloads nil "generic-x" "generic-x.el" (0 0 0 0))
-;;; Generated autoloads from generic-x.el
+;;; Generated autoloads from cedet/ede/generic.el
 
-(register-definition-prefixes "generic-x" '("default-generic-mode" "generic-"))
+(register-definition-prefixes "ede/generic" '("ede-generic-"))
+
+
+;;; Generated autoloads from cedet/srecode/getset.el
+
+(register-definition-prefixes "srecode/getset" '("srecode-"))
 
-;;;***
 
-;;;### (autoloads nil "glasses" "progmodes/glasses.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/glasses.el
 
 (autoload 'glasses-mode "glasses" "\
@@ -14384,14 +13065,15 @@ evaluate `glasses-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "glasses" '("glasses-"))
 
-;;;***
 
-;;;### (autoloads nil "glyphless-mode" "textmodes/glyphless-mode.el"
-;;;;;;  (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/symref/global.el
+
+(register-definition-prefixes "semantic/symref/global" 
'("semantic-symref-global--line-re"))
+
+
 ;;; Generated autoloads from textmodes/glyphless-mode.el
 
 (autoload 'glyphless-display-mode "glyphless-mode" "\
@@ -14415,21 +13097,17 @@ evaluate `glyphless-display-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "glyphless-mode" '("glyphless-mode-"))
 
-;;;***
 
-;;;### (autoloads nil "gmm-utils" "gnus/gmm-utils.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gmm-utils.el
 
 (autoload 'gmm-regexp-concat "gmm-utils" "\
 Potentially concat a list of regexps into a single one.
 The concatenation is done with logical ORs.
 
-\(fn REGEXP)" nil nil)
-
+(fn REGEXP)" nil nil)
 (autoload 'gmm-message "gmm-utils" "\
 If LEVEL is lower than `gmm-verbose' print ARGS using `message'.
 
@@ -14440,19 +13118,16 @@ Guideline for numbers:
 7 - not very important messages on stuff
 9 - messages inside loops.
 
-\(fn LEVEL &rest ARGS)" nil nil)
-
+(fn LEVEL &rest ARGS)" nil nil)
 (autoload 'gmm-error "gmm-utils" "\
 Beep an error if LEVEL is equal to or less than `gmm-verbose'.
 ARGS are passed to `message'.
 
-\(fn LEVEL &rest ARGS)" nil nil)
-
+(fn LEVEL &rest ARGS)" nil nil)
 (autoload 'gmm-widget-p "gmm-utils" "\
 Non-nil if SYMBOL is a widget.
 
-\(fn SYMBOL)" nil nil)
-
+(fn SYMBOL)" nil nil)
 (autoload 'gmm-tool-bar-from-list "gmm-utils" "\
 Make a tool bar from ICON-LIST.
 
@@ -14471,27 +13146,22 @@ runs the command find-file\", then use `new-file' in 
ZAP-LIST.
 
 DEFAULT-MAP specifies the default key map for ICON-LIST.
 
-\(fn ICON-LIST ZAP-LIST DEFAULT-MAP)" nil nil)
-
+(fn ICON-LIST ZAP-LIST DEFAULT-MAP)" nil nil)
 (register-definition-prefixes "gmm-utils" '("defun-gmm" "gmm-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus" "gnus/gnus.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus.el
+
 (push (purecopy '(gnus 5 13)) package--builtin-versions)
 (custom-autoload 'gnus-select-method "gnus")
-
 (autoload 'gnus-child-no-server "gnus" "\
 Read network news as a child, without connecting to the local server.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'gnus-slave-no-server "gnus" "\
 Read network news as a child, without connecting to the local server.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'gnus-no-server "gnus" "\
 Read network news.
 If ARG is a positive number, Gnus will use that as the startup level.
@@ -14501,18 +13171,15 @@ an NNTP server to use.
 As opposed to `gnus', this command will not connect to the local
 server.
 
-\(fn &optional ARG CHILD)" t nil)
-
+(fn &optional ARG CHILD)" t nil)
 (autoload 'gnus-child "gnus" "\
 Read news as a child.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'gnus-slave "gnus" "\
 Read news as a child.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'gnus-other-frame "gnus" "\
 Pop up a frame to read news.
 This will call one of the Gnus commands which is specified by the user
@@ -14524,39 +13191,31 @@ such as \"unix:0\" to specify where to pop up a 
frame.  If DISPLAY is
 omitted or the function `make-frame-on-display' is not available, the
 current display is used.
 
-\(fn &optional ARG DISPLAY)" t nil)
-
+(fn &optional ARG DISPLAY)" t nil)
 (autoload 'gnus "gnus" "\
 Read network news.
 If ARG is non-nil and a positive number, Gnus will use that as the
 startup level.  If ARG is non-nil and not a positive number, Gnus will
 prompt the user for the name of an NNTP server to use.
 
-\(fn &optional ARG DONT-CONNECT CHILD)" t nil)
-
+(fn &optional ARG DONT-CONNECT CHILD)" t nil)
 (register-definition-prefixes "gnus" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-agent" "gnus/gnus-agent.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-agent.el
 
 (autoload 'gnus-unplugged "gnus-agent" "\
 Start Gnus unplugged." t nil)
-
 (autoload 'gnus-plugged "gnus-agent" "\
 Start Gnus plugged." t nil)
-
 (autoload 'gnus-child-unplugged "gnus-agent" "\
 Read news as a child unplugged.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'gnus-slave-unplugged "gnus-agent" "\
 Read news as a child unplugged.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'gnus-agentize "gnus-agent" "\
 Allow Gnus to be an offline newsreader.
 
@@ -14567,10 +13226,8 @@ customize `gnus-agent' to nil.
 This will modify the `gnus-setup-news-hook', and
 `message-send-mail-real-function' variables, and install the Gnus agent
 minor mode in all Gnus buffers." t nil)
-
 (autoload 'gnus-agent-possibly-save-gcc "gnus-agent" "\
 Save GCC if Gnus is unplugged." nil nil)
-
 (autoload 'gnus-agent-rename-group "gnus-agent" "\
 Rename fully-qualified OLD-GROUP as NEW-GROUP.
 Always updates the agent, even when disabled, as the old agent
@@ -14578,8 +13235,7 @@ files would corrupt gnus when the agent was next 
enabled.
 Depends upon the caller to determine whether group renaming is
 supported.
 
-\(fn OLD-GROUP NEW-GROUP)" nil nil)
-
+(fn OLD-GROUP NEW-GROUP)" nil nil)
 (autoload 'gnus-agent-delete-group "gnus-agent" "\
 Delete fully-qualified GROUP.
 Always updates the agent, even when disabled, as the old agent
@@ -14587,87 +13243,65 @@ files would corrupt gnus when the agent was next 
enabled.
 Depends upon the caller to determine whether group deletion is
 supported.
 
-\(fn GROUP)" nil nil)
-
+(fn GROUP)" nil nil)
 (autoload 'gnus-agent-get-undownloaded-list "gnus-agent" "\
 Construct list of articles that have not been downloaded." nil nil)
-
 (autoload 'gnus-agent-possibly-alter-active "gnus-agent" "\
 Possibly expand a group's active range to include articles
 downloaded into the agent.
 
-\(fn GROUP ACTIVE &optional INFO)" nil nil)
-
+(fn GROUP ACTIVE &optional INFO)" nil nil)
 (autoload 'gnus-agent-find-parameter "gnus-agent" "\
 Search for GROUPs SYMBOL in the group's parameters, the group's
 topic parameters, the group's category, or the customizable
 variables.  Returns the first non-nil value found.
 
-\(fn GROUP SYMBOL)" nil nil)
-
+(fn GROUP SYMBOL)" nil nil)
 (autoload 'gnus-agent-batch-fetch "gnus-agent" "\
 Start Gnus and fetch session." t nil)
-
 (autoload 'gnus-agent-batch "gnus-agent" "\
 Start Gnus, send queue and fetch session." t nil)
-
 (autoload 'gnus-agent-regenerate "gnus-agent" "\
 Regenerate all agent covered files.
 CLEAN is obsolete and ignored.
 
-\(fn &optional CLEAN REREAD)" t nil)
-
+(fn &optional CLEAN REREAD)" t nil)
 (register-definition-prefixes "gnus-agent" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-art" "gnus/gnus-art.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-art.el
 
 (autoload 'gnus-article-prepare-display "gnus-art" "\
 Make the current buffer look like a nice article." nil nil)
-
 (register-definition-prefixes "gnus-art" '(":keymap" "article-" "gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-async" "gnus/gnus-async.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-async.el
 
 (register-definition-prefixes "gnus-async" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-bcklg" "gnus/gnus-bcklg.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-bcklg.el
 
 (register-definition-prefixes "gnus-bcklg" '("gnus-backlog-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-bookmark" "gnus/gnus-bookmark.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from gnus/gnus-bookmark.el
 
 (autoload 'gnus-bookmark-set "gnus-bookmark" "\
 Set a bookmark for this article." '(gnus-article-mode gnus-summary-mode) nil)
-
 (autoload 'gnus-bookmark-jump "gnus-bookmark" "\
 Jump to a Gnus bookmark (BMK-NAME).
 
-\(fn &optional BMK-NAME)" t nil)
-
+(fn &optional BMK-NAME)" t nil)
 (autoload 'gnus-bookmark-bmenu-list "gnus-bookmark" "\
 Display a list of existing Gnus bookmarks.
 The list is displayed in a buffer named `*Gnus Bookmark List*'.
 The leftmost column displays a D if the bookmark is flagged for
 deletion, or > if it is flagged for displaying." t nil)
-
 (register-definition-prefixes "gnus-bookmark" '("gnus-bookmark-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-cache" "gnus/gnus-cache.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-cache.el
 
 (autoload 'gnus-jog-cache "gnus-cache" "\
@@ -14675,17 +13309,14 @@ Go through all groups and put the articles into the 
cache.
 
 Usage:
 $ emacs -batch -l ~/.emacs -l gnus -f gnus-jog-cache" t nil)
-
 (autoload 'gnus-cache-generate-active "gnus-cache" "\
 Generate the cache active file.
 
-\(fn &optional DIRECTORY)" t nil)
-
+(fn &optional DIRECTORY)" t nil)
 (autoload 'gnus-cache-generate-nov-databases "gnus-cache" "\
 Generate NOV files recursively starting in DIR.
 
-\(fn DIR)" t nil)
-
+(fn DIR)" t nil)
 (autoload 'gnus-cache-rename-group "gnus-cache" "\
 Rename OLD-GROUP as NEW-GROUP.
 Always updates the cache, even when disabled, as the old cache
@@ -14693,8 +13324,7 @@ files would corrupt Gnus when the cache was next 
enabled.  It
 depends on the caller to determine whether group renaming is
 supported.
 
-\(fn OLD-GROUP NEW-GROUP)" nil nil)
-
+(fn OLD-GROUP NEW-GROUP)" nil nil)
 (autoload 'gnus-cache-delete-group "gnus-cache" "\
 Delete GROUP from the cache.
 Always updates the cache, even when disabled, as the old cache
@@ -14702,41 +13332,30 @@ files would corrupt gnus when the cache was next 
enabled.
 Depends upon the caller to determine whether group deletion is
 supported.
 
-\(fn GROUP)" nil nil)
-
+(fn GROUP)" nil nil)
 (register-definition-prefixes "gnus-cache" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-cite" "gnus/gnus-cite.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-cite.el
 
 (register-definition-prefixes "gnus-cite" '("gnus-" "turn-o"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-cloud" "gnus/gnus-cloud.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-cloud.el
 
 (register-definition-prefixes "gnus-cloud" '("gnus-cloud-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-cus" "gnus/gnus-cus.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-cus.el
 
 (register-definition-prefixes "gnus-cus" '("category-fields" "gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-dbus" "gnus/gnus-dbus.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-dbus.el
 
 (register-definition-prefixes "gnus-dbus" '("gnus-dbus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-delay" "gnus/gnus-delay.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-delay.el
 
 (autoload 'gnus-delay-article "gnus-delay" "\
@@ -14756,11 +13375,9 @@ The value of `message-draft-headers' determines which 
headers are
 generated when the article is delayed.  Remaining headers are
 generated when the article is sent.
 
-\(fn DELAY)" '(message-mode) nil)
-
+(fn DELAY)" '(message-mode) nil)
 (autoload 'gnus-delay-send-queue "gnus-delay" "\
 Send all the delayed messages that are due now." t nil)
-
 (autoload 'gnus-delay-initialize "gnus-delay" "\
 Initialize the gnus-delay package.
 This sets up a key binding in `message-mode' to delay a message.
@@ -14769,151 +13386,115 @@ This tells Gnus to look for delayed messages after 
getting new news.
 The optional arg NO-KEYMAP is ignored.
 Checking delayed messages is skipped if optional arg NO-CHECK is non-nil.
 
-\(fn &optional NO-KEYMAP NO-CHECK)" nil nil)
-
+(fn &optional NO-KEYMAP NO-CHECK)" nil nil)
 (register-definition-prefixes "gnus-delay" '("gnus-delay-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-demon" "gnus/gnus-demon.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-demon.el
 
 (register-definition-prefixes "gnus-demon" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-diary" "gnus/gnus-diary.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-diary.el
 
 (autoload 'gnus-user-format-function-d "gnus-diary" "\
 
 
-\(fn HEADER)" nil nil)
-
+(fn HEADER)" nil nil)
 (autoload 'gnus-user-format-function-D "gnus-diary" "\
 
 
-\(fn HEADER)" nil nil)
-
+(fn HEADER)" nil nil)
 (register-definition-prefixes "gnus-diary" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-dired" "gnus/gnus-dired.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-dired.el
 
 (autoload 'turn-on-gnus-dired-mode "gnus-dired" "\
 Convenience method to turn on `gnus-dired-mode'." t nil)
-
 (register-definition-prefixes "gnus-dired" '("gnus-dired-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-draft" "gnus/gnus-draft.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-draft.el
 
 (autoload 'gnus-draft-reminder "gnus-draft" "\
 Reminder user if there are unsent drafts." t nil)
-
 (register-definition-prefixes "gnus-draft" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-dup" "gnus/gnus-dup.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-dup.el
 
 (register-definition-prefixes "gnus-dup" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-eform" "gnus/gnus-eform.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-eform.el
 
 (register-definition-prefixes "gnus-eform" '("gnus-edit-form"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-fun" "gnus/gnus-fun.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-fun.el
 
 (autoload 'gnus--random-face-with-type "gnus-fun" "\
 Return file from DIR with extension EXT.
 Omit matches of OMIT, and process them by FUN.
 
-\(fn DIR EXT OMIT FUN)" nil nil)
-
+(fn DIR EXT OMIT FUN)" nil nil)
 (autoload 'message-goto-eoh "message" nil t)
-
 (autoload 'gnus-random-x-face "gnus-fun" "\
 Return X-Face header data chosen randomly from `gnus-x-face-directory'.
 
 Files matching `gnus-x-face-omit-files' are not considered." t nil)
-
 (autoload 'gnus-insert-random-x-face-header "gnus-fun" "\
 Insert a random X-Face header from `gnus-x-face-directory'." t nil)
-
 (autoload 'gnus-x-face-from-file "gnus-fun" "\
 Insert an X-Face header based on an image FILE.
 
 Depending on `gnus-convert-image-to-x-face-command' it may accept
 different input formats.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'gnus-face-from-file "gnus-fun" "\
 Return a Face header based on an image FILE.
 
 Depending on `gnus-convert-image-to-face-command' it may accept
 different input formats.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'gnus-convert-face-to-png "gnus-fun" "\
 Convert FACE (which is base64-encoded) to a PNG.
 The PNG is returned as a string.
 
-\(fn FACE)" nil nil)
-
+(fn FACE)" nil nil)
 (autoload 'gnus-convert-png-to-face "gnus-fun" "\
 Convert FILE to a Face.
 FILE should be a PNG file that's 48x48 and smaller than or equal to
 726 bytes.
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (autoload 'gnus-random-face "gnus-fun" "\
 Return randomly chosen Face from `gnus-face-directory'.
 
 Files matching `gnus-face-omit-files' are not considered." t nil)
-
 (autoload 'gnus-insert-random-face-header "gnus-fun" "\
 Insert a random Face header from `gnus-face-directory'." nil nil)
-
 (register-definition-prefixes "gnus-fun" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-gravatar" "gnus/gnus-gravatar.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from gnus/gnus-gravatar.el
 
 (autoload 'gnus-treat-from-gravatar "gnus-gravatar" "\
 Display gravatar in the From header.
 If gravatar is already displayed, remove it.
 
-\(fn &optional FORCE)" '(gnus-article-mode gnus-summary-mode) nil)
-
+(fn &optional FORCE)" '(gnus-article-mode gnus-summary-mode) nil)
 (autoload 'gnus-treat-mail-gravatar "gnus-gravatar" "\
 Display gravatars in the Cc and To headers.
 If gravatars are already displayed, remove them.
 
-\(fn &optional FORCE)" '(gnus-article-mode gnus-summary-mode) nil)
-
+(fn &optional FORCE)" '(gnus-article-mode gnus-summary-mode) nil)
 (register-definition-prefixes "gnus-gravatar" '("gnus-gravatar-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-group" "gnus/gnus-group.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-group.el
 
 (autoload 'gnus-fetch-group "gnus-group" "\
@@ -14921,99 +13502,74 @@ Start Gnus if necessary and enter GROUP.
 If ARTICLES, display those articles.
 Returns whether the fetching was successful or not.
 
-\(fn GROUP &optional ARTICLES)" t nil)
-
+(fn GROUP &optional ARTICLES)" t nil)
 (autoload 'gnus-fetch-group-other-frame "gnus-group" "\
 Pop up a frame and enter GROUP.
 
-\(fn GROUP)" t nil)
-
+(fn GROUP)" t nil)
 (autoload 'gnus-read-ephemeral-emacs-bug-group "gnus-group" "\
 Browse Emacs bug reports with IDS in an ephemeral group.
 The arguments have the same meaning as those of
 `gnus-read-ephemeral-bug-group', which see.
 
-\(fn IDS &optional WINDOW-CONF)" t nil)
-
+(fn IDS &optional WINDOW-CONF)" t nil)
 (register-definition-prefixes "gnus-group" '(":keymap" "gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-html" "gnus/gnus-html.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-html.el
 
 (autoload 'gnus-article-html "gnus-html" "\
 
 
-\(fn &optional HANDLE)" nil nil)
-
+(fn &optional HANDLE)" nil nil)
 (autoload 'gnus-html-prefetch-images "gnus-html" "\
 
 
-\(fn SUMMARY)" nil nil)
-
+(fn SUMMARY)" nil nil)
 (register-definition-prefixes "gnus-html" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-icalendar" "gnus/gnus-icalendar.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from gnus/gnus-icalendar.el
 
 (autoload 'gnus-icalendar-mm-inline "gnus-icalendar" "\
 
 
-\(fn HANDLE)" nil nil)
-
+(fn HANDLE)" nil nil)
 (register-definition-prefixes "gnus-icalendar" '("gnus-icalendar"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-int" "gnus/gnus-int.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-int.el
 
 (register-definition-prefixes "gnus-int" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-kill" "gnus/gnus-kill.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-kill.el
 
 (defalias 'gnus-batch-kill 'gnus-batch-score)
-
 (autoload 'gnus-batch-score "gnus-kill" "\
 Run batched scoring.
 Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score" t nil)
-
 (register-definition-prefixes "gnus-kill" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-logic" "gnus/gnus-logic.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-logic.el
 
 (register-definition-prefixes "gnus-logic" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-mh" "gnus/gnus-mh.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-mh.el
 
 (register-definition-prefixes "gnus-mh" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-ml" "gnus/gnus-ml.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-ml.el
 
 (autoload 'turn-on-gnus-mailing-list-mode "gnus-ml" nil nil nil)
-
 (autoload 'gnus-mailing-list-insinuate "gnus-ml" "\
 Setup group parameters from List-Post header.
 If FORCE is non-nil, replace the old ones.
 
-\(fn &optional FORCE)" t nil)
-
+(fn &optional FORCE)" t nil)
 (autoload 'gnus-mailing-list-mode "gnus-ml" "\
 Minor mode for providing mailing-list commands.
 
@@ -15034,13 +13590,10 @@ evaluate `gnus-mailing-list-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "gnus-ml" '("gnus-mailing-list-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-mlspl" "gnus/gnus-mlspl.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-mlspl.el
 
 (autoload 'gnus-group-split-setup "gnus-mlspl" "\
@@ -15065,8 +13618,7 @@ elaborate fancy splits may also be useful to split mail 
that doesn't
 match any of the group-specified splitting rules.  See
 `gnus-group-split-fancy' for details.
 
-\(fn &optional AUTO-UPDATE CATCH-ALL)" t nil)
-
+(fn &optional AUTO-UPDATE CATCH-ALL)" t nil)
 (autoload 'gnus-group-split-update "gnus-mlspl" "\
 Computes `nnmail-split-fancy' from group params and CATCH-ALL.
 It does this by calling (gnus-group-split-fancy nil nil CATCH-ALL).
@@ -15074,19 +13626,17 @@ It does this by calling (gnus-group-split-fancy nil 
nil CATCH-ALL).
 If CATCH-ALL is nil, `gnus-group-split-default-catch-all-group' is used
 instead.  This variable is set by `gnus-group-split-setup'.
 
-\(fn &optional CATCH-ALL)" t nil)
-
+(fn &optional CATCH-ALL)" t nil)
 (autoload 'gnus-group-split "gnus-mlspl" "\
 Use information from group parameters in order to split mail.
 See `gnus-group-split-fancy' for more information.
 
 `gnus-group-split' is a valid value for `nnmail-split-methods'." nil nil)
-
 (autoload 'gnus-group-split-fancy "gnus-mlspl" "\
 Uses information from group parameters in order to split mail.
 It can be embedded into `nnmail-split-fancy' lists with the SPLIT
 
-\(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL)
+(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL)
 
 GROUPS may be a regular expression or a list of group names, that will
 be used to select candidate groups.  If it is omitted or nil, all
@@ -15115,31 +13665,28 @@ as the last element of a `|' SPLIT.
 For example, given the following group parameters:
 
 nnml:mail.bar:
-\((to-address . \"bar@femail.com\")
+((to-address . \"bar@femail.com\")
  (split-regexp . \".*@femail\\\\.com\"))
 nnml:mail.foo:
-\((to-list . \"foo@nowhere.gov\")
+((to-list . \"foo@nowhere.gov\")
  (extra-aliases \"foo@localhost\" \"foo-redist@home\")
  (split-exclude \"bugs-foo\" \"rambling-foo\")
  (admin-address . \"foo-request@nowhere.gov\"))
 nnml:mail.others:
-\((split-spec . catch-all))
+((split-spec . catch-all))
 
 Calling (gnus-group-split-fancy nil nil \"mail.others\") returns:
 
-\(| (& (any \"\\\\(bar@femail\\\\.com\\\\|.*@femail\\\\.com\\\\)\"
+(| (& (any \"\\\\(bar@femail\\\\.com\\\\|.*@femail\\\\.com\\\\)\"
           \"mail.bar\")
       (any 
\"\\\\(foo@nowhere\\\\.gov\\\\|foo@localhost\\\\|foo-redist@home\\\\)\"
           - \"bugs-foo\" - \"rambling-foo\" \"mail.foo\"))
    \"mail.others\")
 
-\(fn &optional GROUPS NO-CROSSPOST CATCH-ALL)" nil nil)
-
+(fn &optional GROUPS NO-CROSSPOST CATCH-ALL)" nil nil)
 (register-definition-prefixes "gnus-mlspl" '("gnus-group-split-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-msg" "gnus/gnus-msg.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-msg.el
 
 (autoload 'gnus-msg-mail "gnus-msg" "\
@@ -15149,26 +13696,19 @@ Gcc: header for archiving purposes.
 If Gnus isn't running, a plain `message-mail' setup is used
 instead.
 
-\(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-ACTION YANK-ACTION 
SEND-ACTIONS RETURN-ACTION)" t nil)
-
+(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-ACTION YANK-ACTION 
SEND-ACTIONS RETURN-ACTION)" t nil)
 (autoload 'gnus-button-mailto "gnus-msg" "\
 Mail to ADDRESS.
 
-\(fn ADDRESS)" nil nil)
-
+(fn ADDRESS)" nil nil)
 (autoload 'gnus-button-reply "gnus-msg" "\
 Like `message-reply'.
 
-\(fn &optional TO-ADDRESS WIDE)" t nil)
-
+(fn &optional TO-ADDRESS WIDE)" t nil)
 (define-mail-user-agent 'gnus-user-agent 'gnus-msg-mail 'message-send-and-exit 
'message-kill-buffer 'message-send-hook)
-
 (register-definition-prefixes "gnus-msg" '(":prefix" "gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-notifications" "gnus/gnus-notifications.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-notifications.el
 
 (autoload 'gnus-notifications "gnus-notifications" "\
@@ -15179,31 +13719,23 @@ notification using `notifications-notify' for it.
 
 This is typically a function to add in
 `gnus-after-getting-new-news-hook'" nil nil)
-
 (register-definition-prefixes "gnus-notifications" '("gnus-notifications-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-picon" "gnus/gnus-picon.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-picon.el
 
 (autoload 'gnus-treat-from-picon "gnus-picon" "\
 Display picons in the From header.
 If picons are already displayed, remove them." '(gnus-article-mode 
gnus-summary-mode) nil)
-
 (autoload 'gnus-treat-mail-picon "gnus-picon" "\
 Display picons in the Cc and To headers.
 If picons are already displayed, remove them." '(gnus-article-mode 
gnus-summary-mode) nil)
-
 (autoload 'gnus-treat-newsgroups-picon "gnus-picon" "\
 Display picons in the Newsgroups and Followup-To headers.
 If picons are already displayed, remove them." '(gnus-article-mode 
gnus-summary-mode) nil)
-
 (register-definition-prefixes "gnus-picon" '("gnus-picon-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-range" "gnus/gnus-range.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-range.el
 
 (autoload 'gnus-sorted-difference "gnus-range" "\
@@ -15211,232 +13743,172 @@ Return a list of elements of LIST1 that do not 
appear in LIST2.
 Both lists have to be sorted over <.
 The tail of LIST1 is not copied.
 
-\(fn LIST1 LIST2)" nil nil)
-
+(fn LIST1 LIST2)" nil nil)
 (autoload 'gnus-sorted-ndifference "gnus-range" "\
 Return a list of elements of LIST1 that do not appear in LIST2.
 Both lists have to be sorted over <.
 LIST1 is modified.
 
-\(fn LIST1 LIST2)" nil nil)
-
+(fn LIST1 LIST2)" nil nil)
 (autoload 'gnus-sorted-complement "gnus-range" "\
 Return a list of elements that are in LIST1 or LIST2 but not both.
 Both lists have to be sorted over <.
 
-\(fn LIST1 LIST2)" nil nil)
-
+(fn LIST1 LIST2)" nil nil)
 (autoload 'gnus-intersection "gnus-range" "\
 
 
-\(fn LIST1 LIST2)" nil nil)
-
+(fn LIST1 LIST2)" nil nil)
 (make-obsolete 'gnus-intersection 'seq-intersection '"28.1")
-
 (autoload 'gnus-sorted-intersection "gnus-range" "\
 Return intersection of LIST1 and LIST2.
 LIST1 and LIST2 have to be sorted over <.
 
-\(fn LIST1 LIST2)" nil nil)
-
+(fn LIST1 LIST2)" nil nil)
 (defalias 'gnus-set-sorted-intersection 'gnus-sorted-nintersection)
-
 (autoload 'gnus-sorted-nintersection "gnus-range" "\
 Return intersection of LIST1 and LIST2 by modifying cdr pointers of LIST1.
 LIST1 and LIST2 have to be sorted over <.
 
-\(fn LIST1 LIST2)" nil nil)
-
+(fn LIST1 LIST2)" nil nil)
 (autoload 'gnus-sorted-union "gnus-range" "\
 Return union of LIST1 and LIST2.
 LIST1 and LIST2 have to be sorted over <.
 
-\(fn LIST1 LIST2)" nil nil)
-
+(fn LIST1 LIST2)" nil nil)
 (autoload 'gnus-sorted-nunion "gnus-range" "\
 Return union of LIST1 and LIST2 by modifying cdr pointers of LIST1.
 LIST1 and LIST2 have to be sorted over <.
 
-\(fn LIST1 LIST2)" nil nil)
-
+(fn LIST1 LIST2)" nil nil)
 (autoload 'gnus-add-to-sorted-list "gnus-range" "\
 Add NUM into sorted LIST by side effect.
 
-\(fn LIST NUM)" nil nil)
-
+(fn LIST NUM)" nil nil)
 (register-definition-prefixes "gnus-range" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-registry" "gnus/gnus-registry.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from gnus/gnus-registry.el
 
 (autoload 'gnus-registry-initialize "gnus-registry" "\
 Initialize the Gnus registry." t nil)
-
 (register-definition-prefixes "gnus-registry" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-rfc1843" "gnus/gnus-rfc1843.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from gnus/gnus-rfc1843.el
 
 (register-definition-prefixes "gnus-rfc1843" '("rfc1843-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-rmail" "gnus/gnus-rmail.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-rmail.el
 
 (register-definition-prefixes "gnus-rmail" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-salt" "gnus/gnus-salt.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-salt.el
 
 (register-definition-prefixes "gnus-salt" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-score" "gnus/gnus-score.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-score.el
 
 (register-definition-prefixes "gnus-score" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-search" "gnus/gnus-search.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from gnus/gnus-search.el
 
 (register-definition-prefixes "gnus-search" '("gnus-search-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-sieve" "gnus/gnus-sieve.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-sieve.el
 
 (autoload 'gnus-sieve-update "gnus-sieve" "\
 Update the Sieve script in gnus-sieve-file, by replacing the region
 between gnus-sieve-region-start and gnus-sieve-region-end with
-\(gnus-sieve-script gnus-sieve-select-method gnus-sieve-crosspost), then
+(gnus-sieve-script gnus-sieve-select-method gnus-sieve-crosspost), then
 execute gnus-sieve-update-shell-command.
 See the documentation for these variables and functions for details." t nil)
-
 (autoload 'gnus-sieve-generate "gnus-sieve" "\
 Generate the Sieve script in gnus-sieve-file, by replacing the region
 between gnus-sieve-region-start and gnus-sieve-region-end with
-\(gnus-sieve-script gnus-sieve-select-method gnus-sieve-crosspost).
+(gnus-sieve-script gnus-sieve-select-method gnus-sieve-crosspost).
 See the documentation for these variables and functions for details." t nil)
-
 (autoload 'gnus-sieve-article-add-rule "gnus-sieve" nil '(gnus-article-mode 
gnus-summary-mode) nil)
-
 (register-definition-prefixes "gnus-sieve" '("gnus-sieve-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-spec" "gnus/gnus-spec.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-spec.el
 
 (autoload 'gnus-update-format "gnus-spec" "\
 Update the format specification near point.
 
-\(fn VAR)" t nil)
-
+(fn VAR)" t nil)
 (register-definition-prefixes "gnus-spec" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-srvr" "gnus/gnus-srvr.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-srvr.el
 
 (register-definition-prefixes "gnus-srvr" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-start" "gnus/gnus-start.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-start.el
 
 (autoload 'gnus-declare-backend "gnus-start" "\
 Declare back end NAME with ABILITIES as a Gnus back end.
 
-\(fn NAME &rest ABILITIES)" nil nil)
-
+(fn NAME &rest ABILITIES)" nil nil)
 (register-definition-prefixes "gnus-start" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-sum" "gnus/gnus-sum.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-sum.el
 
 (autoload 'gnus-summary-bookmark-jump "gnus-sum" "\
 Handler function for record returned by `gnus-summary-bookmark-make-record'.
 BOOKMARK is a bookmark name or a bookmark record.
 
-\(fn BOOKMARK)" nil nil)
-
+(fn BOOKMARK)" nil nil)
 (register-definition-prefixes "gnus-sum" '(":keymap" "gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-topic" "gnus/gnus-topic.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-topic.el
 
 (register-definition-prefixes "gnus-topic" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-undo" "gnus/gnus-undo.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-undo.el
 
 (register-definition-prefixes "gnus-undo" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-util" "gnus/gnus-util.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-util.el
 
 (register-definition-prefixes "gnus-util" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-uu" "gnus/gnus-uu.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-uu.el
 
 (register-definition-prefixes "gnus-uu" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-vm" "gnus/gnus-vm.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-vm.el
 
 (register-definition-prefixes "gnus-vm" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnus-win" "gnus/gnus-win.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/gnus-win.el
 
 (autoload 'gnus-add-configuration "gnus-win" "\
 Add the window configuration CONF to `gnus-buffer-configuration'.
 
-\(fn CONF)" nil nil)
-
+(fn CONF)" nil nil)
 (register-definition-prefixes "gnus-win" '("gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "gnutls" "net/gnutls.el" (0 0 0 0))
 ;;; Generated autoloads from net/gnutls.el
 
 (register-definition-prefixes "gnutls" '("gnutls-" "open-gnutls-stream"))
 
-;;;***
 
-;;;### (autoloads nil "gomoku" "play/gomoku.el" (0 0 0 0))
 ;;; Generated autoloads from play/gomoku.el
 
 (autoload 'gomoku "gomoku" "\
@@ -15458,13 +13930,10 @@ Gomoku game, and ought to be upgraded to use the full 
modern rules.
 
 Use \\[describe-mode] for more info.
 
-\(fn &optional N M)" t nil)
-
+(fn &optional N M)" t nil)
 (register-definition-prefixes "gomoku" '("gomoku-"))
 
-;;;***
 
-;;;### (autoloads nil "goto-addr" "net/goto-addr.el" (0 0 0 0))
 ;;; Generated autoloads from net/goto-addr.el
 
 (autoload 'goto-address-at-point "goto-addr" "\
@@ -15473,8 +13942,7 @@ Send mail to address at point.  See documentation for
 `goto-address-find-address-at-point'.  If no address is found
 there, then load the URL at or before point.
 
-\(fn &optional EVENT)" t nil)
-
+(fn &optional EVENT)" t nil)
 (autoload 'goto-address "goto-addr" "\
 Sets up goto-address functionality in the current buffer.
 Allows user to use mouse/keyboard command to click to go to a URL
@@ -15485,7 +13953,6 @@ only on URLs and e-mail addresses.
 Also fontifies the buffer appropriately (see `goto-address-fontify-p' and
 `goto-address-highlight-p' for more information)." t nil)
 (put 'goto-address 'safe-local-eval-function t)
-
 (autoload 'goto-address-mode "goto-addr" "\
 Minor mode to buttonize URLs and e-mail addresses in the current buffer.
 
@@ -15503,10 +13970,8 @@ evaluate `goto-address-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (put 'global-goto-address-mode 'globalized-minor-mode t)
-
 (defvar global-goto-address-mode nil "\
 Non-nil if Global Goto-Address mode is enabled.
 See the `global-goto-address-mode' command
@@ -15514,9 +13979,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-goto-address-mode'.")
-
 (custom-autoload 'global-goto-address-mode "goto-addr" nil)
-
 (autoload 'global-goto-address-mode "goto-addr" "\
 Toggle Goto-Address mode in all buffers.
 With prefix ARG, enable Global Goto-Address mode if ARG is positive;
@@ -15531,8 +13994,7 @@ Goto-Address mode is enabled in all buffers where
 
 See `goto-address-mode' for more information on Goto-Address mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'goto-address-prog-mode "goto-addr" "\
 Like `goto-address-mode', but only for comments and strings.
 
@@ -15551,13 +14013,33 @@ evaluate `goto-address-prog-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "goto-addr" '("goto-addr"))
 
-;;;***
 
-;;;### (autoloads nil "gravatar" "image/gravatar.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/wisent/grammar.el
+
+(autoload 'wisent-grammar-mode "semantic/wisent/grammar" "\
+Major mode for editing Wisent grammars.
+
+(fn)" t nil)
+(register-definition-prefixes "semantic/wisent/grammar" '("semantic-grammar-" 
"wisent-"))
+
+
+;;; Generated autoloads from cedet/semantic/bovine/grammar.el
+
+(autoload 'bovine-grammar-mode "semantic/bovine/grammar" "\
+Major mode for editing Bovine grammars.
+
+(fn)" t nil)
+(register-definition-prefixes "semantic/bovine/grammar" '("bovine-" 
"semantic-grammar-"))
+
+
+;;; Generated autoloads from cedet/semantic/grammar.el
+
+(register-definition-prefixes "semantic/grammar" '("semantic-"))
+
+
 ;;; Generated autoloads from image/gravatar.el
 
 (autoload 'gravatar-retrieve "gravatar" "\
@@ -15566,27 +14048,21 @@ When finished, call CALLBACK as (apply CALLBACK 
GRAVATAR CBARGS),
 where GRAVATAR is either an image descriptor, or the symbol
 `error' if the retrieval failed.
 
-\(fn MAIL-ADDRESS CALLBACK &optional CBARGS)" nil nil)
-
+(fn MAIL-ADDRESS CALLBACK &optional CBARGS)" nil nil)
 (autoload 'gravatar-retrieve-synchronously "gravatar" "\
 Synchronously retrieve a gravatar for MAIL-ADDRESS.
 Value is either an image descriptor, or the symbol `error' if the
 retrieval failed.
 
-\(fn MAIL-ADDRESS)" nil nil)
-
+(fn MAIL-ADDRESS)" nil nil)
 (register-definition-prefixes "gravatar" '("gravatar-"))
 
-;;;***
 
-;;;### (autoloads nil "grep" "progmodes/grep.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/grep.el
 
 (defvar grep-window-height nil "\
 Number of lines in a grep window.  If nil, use `compilation-window-height'.")
-
 (custom-autoload 'grep-window-height "grep" t)
-
 (defvar grep-command nil "\
 The default grep command for \\[grep].
 If the grep program used supports an option to always include file names
@@ -15596,9 +14072,7 @@ include it when specifying `grep-command'.
 In interactive usage, the actual value of this variable is set up
 by `grep-compute-defaults'; to change the default value, use
 \\[customize] or call the function `grep-apply-setting'.")
-
 (custom-autoload 'grep-command "grep" nil)
-
 (defvar grep-find-command nil "\
 The default find command for \\[grep-find].
 In interactive usage, the actual value of this variable is set up
@@ -15609,32 +14083,24 @@ This variable can either be a string, or a cons of the
 form (COMMAND . POSITION).  In the latter case, COMMAND will be
 used as the default command, and point will be placed at POSITION
 for easier editing.")
-
 (custom-autoload 'grep-find-command "grep" nil)
-
 (defvar grep-setup-hook nil "\
 List of hook functions run by `grep-process-setup' (see `run-hooks').")
-
 (custom-autoload 'grep-setup-hook "grep" t)
-
 (defconst grep-regexp-alist `((,(concat "^\\(?:" 
"\\(?1:[^\0\n]+\\)\\(?3:\0\\)\\(?2:[0-9]+\\):" "\\|" "\\(?1:" 
"\\(?:[a-zA-Z]:\\)?" "[^\n:]+?[^\n/:]\\):[\11 ]*\\(?2:[1-9][0-9]*\\)[\11 ]*:" 
"\\)") 1 2 (,(lambda nil (when grep-highlight-matches (let* ((beg (match-end 
0)) (end (save-excursion (goto-char beg) (line-end-position))) (mbeg 
(text-property-any beg end 'font-lock-face grep-match-face))) (when mbeg (- 
mbeg beg))))) \, (lambda nil (when grep-highlight-matches (let* ((beg 
(match-end  [...]
 Regexp used to match grep hits.
 See `compilation-error-regexp-alist' for format details.")
-
 (defvar grep-program (purecopy "grep") "\
 The default grep program for `grep-command' and `grep-find-command'.
 This variable's value takes effect when `grep-compute-defaults' is called.")
-
 (defvar find-program (purecopy "find") "\
 The default find program.
 This is used by commands like `grep-find-command', `find-dired'
 and others.")
-
 (defvar xargs-program (purecopy "xargs") "\
 The default xargs program for `grep-find-command'.
 See `grep-find-use-xargs'.
 This variable's value takes effect when `grep-compute-defaults' is called.")
-
 (defvar grep-find-use-xargs nil "\
 How to invoke find and grep.
 If `exec', use `find -exec {} ;'.
@@ -15644,31 +14110,24 @@ If `gnu-sort', use `find -print0', `sort -z' and 
`xargs -0'.
 Any other value means to use `find -print' and `xargs'.
 
 This variable's value takes effect when `grep-compute-defaults' is called.")
-
 (custom-autoload 'grep-find-use-xargs "grep" nil)
-
 (defvar grep-history nil "\
 History list for grep.")
-
 (defvar grep-find-history nil "\
 History list for `grep-find'.")
-
 (autoload 'grep-process-setup "grep" "\
 Setup compilation variables and buffer for `grep'.
 Set up `compilation-exit-message-function' and run `grep-setup-hook'." nil nil)
-
 (autoload 'grep-compute-defaults "grep" "\
 Compute the defaults for the `grep' command.
 The value depends on `grep-command', `grep-template',
 `grep-use-null-device', `grep-find-command', `grep-find-template',
 `grep-use-null-filename-separator', `grep-find-use-xargs',
 `grep-highlight-matches', and `grep-quoting-style'." nil nil)
-
 (autoload 'grep-mode "grep" "\
 Sets `grep-last-buffer' and `compilation-window-height'.
 
-\(fn)" nil nil)
-
+(fn)" nil nil)
 (autoload 'grep "grep" "\
 Run Grep with user-specified COMMAND-ARGS.
 The output from the command goes to the \"*grep*\" buffer.
@@ -15691,8 +14150,7 @@ tag the cursor is over, substituting it into the last 
Grep command
 in the Grep command history (or into `grep-command' if that history
 list is empty).
 
-\(fn COMMAND-ARGS)" t nil)
-
+(fn COMMAND-ARGS)" t nil)
 (autoload 'grep-find "grep" "\
 Run grep via find, with user-specified args COMMAND-ARGS.
 Collect output in the \"*grep*\" buffer.
@@ -15702,10 +14160,8 @@ to find the text that grep hits refer to.
 This command uses a special history list for its arguments, so you can
 easily repeat a find command.
 
-\(fn COMMAND-ARGS)" t nil)
-
+(fn COMMAND-ARGS)" t nil)
 (defalias 'find-grep #'grep-find)
-
 (autoload 'lgrep "grep" "\
 Run grep, searching for REGEXP in FILES in directory DIR.
 The search is limited to file names matching shell pattern FILES.
@@ -15727,8 +14183,7 @@ This command shares argument histories with \\[rgrep] 
and \\[grep].
 If CONFIRM is non-nil, the user will be given an opportunity to edit the
 command before it's run.
 
-\(fn REGEXP &optional FILES DIR CONFIRM)" t nil)
-
+(fn REGEXP &optional FILES DIR CONFIRM)" t nil)
 (autoload 'rgrep "grep" "\
 Recursively grep for REGEXP in FILES in directory tree rooted at DIR.
 The search is limited to file names matching shell pattern FILES.
@@ -15754,8 +14209,7 @@ to specify a command to run.
 If CONFIRM is non-nil, the user will be given an opportunity to edit the
 command before it's run.
 
-\(fn REGEXP &optional FILES DIR CONFIRM)" t nil)
-
+(fn REGEXP &optional FILES DIR CONFIRM)" t nil)
 (autoload 'zrgrep "grep" "\
 Recursively grep for REGEXP in gzipped FILES in tree rooted at DIR.
 Like `rgrep' but uses `zgrep' for `grep-program', sets the default
@@ -15764,22 +14218,21 @@ file name to `*.gz', and sets 
`grep-highlight-matches' to `always'.
 If CONFIRM is non-nil, the user will be given an opportunity to edit the
 command before it's run.
 
-\(fn REGEXP &optional FILES DIR CONFIRM TEMPLATE)" t nil)
-
+(fn REGEXP &optional FILES DIR CONFIRM TEMPLATE)" t nil)
 (defalias 'rzgrep #'zrgrep)
-
 (register-definition-prefixes "grep" '("grep-" "kill-grep" "rgrep-"))
 
-;;;***
 
-;;;### (autoloads nil "gssapi" "gnus/gssapi.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/symref/grep.el
+
+(register-definition-prefixes "semantic/symref/grep" '("semantic-symref-"))
+
+
 ;;; Generated autoloads from gnus/gssapi.el
 
 (register-definition-prefixes "gssapi" '("gssapi-program" 
"open-gssapi-stream"))
 
-;;;***
 
-;;;### (autoloads nil "gud" "progmodes/gud.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/gud.el
 
 (autoload 'gud-gdb "gud" "\
@@ -15793,22 +14246,19 @@ will run in *gud-PID*, otherwise it will run in 
*gud*; in these
 cases the initial working directory is the `default-directory' of
 the buffer in which this command was invoked.
 
-\(fn COMMAND-LINE)" t nil)
-
+(fn COMMAND-LINE)" t nil)
 (autoload 'sdb "gud" "\
 Run sdb on program FILE in buffer *gud-FILE*.
 The directory containing FILE becomes the initial working directory
 and source-file directory for your debugger.
 
-\(fn COMMAND-LINE)" t nil)
-
+(fn COMMAND-LINE)" t nil)
 (autoload 'dbx "gud" "\
 Run dbx on program FILE in buffer *gud-FILE*.
 The directory containing FILE becomes the initial working directory
 and source-file directory for your debugger.
 
-\(fn COMMAND-LINE)" t nil)
-
+(fn COMMAND-LINE)" t nil)
 (autoload 'xdb "gud" "\
 Run xdb on program FILE in buffer *gud-FILE*.
 The directory containing FILE becomes the initial working directory
@@ -15817,8 +14267,7 @@ and source-file directory for your debugger.
 You can set the variable `gud-xdb-directories' to a list of program source
 directories if your program contains sources from more than one directory.
 
-\(fn COMMAND-LINE)" t nil)
-
+(fn COMMAND-LINE)" t nil)
 (autoload 'perldb "gud" "\
 Debug a perl program with gud.
 Interactively, this will prompt you for a command line.
@@ -15829,8 +14278,7 @@ Noninteractively, COMMAND-LINE should be on the form
 The directory containing the perl program becomes the initial
 working directory and source-file directory for your debugger.
 
-\(fn COMMAND-LINE)" t nil)
-
+(fn COMMAND-LINE)" t nil)
 (autoload 'pdb "gud" "\
 Run COMMAND-LINE in the `*gud-FILE*' buffer to debug Python programs.
 
@@ -15842,15 +14290,13 @@ If called interactively, the command line will be 
prompted for.
 The directory containing this file becomes the initial working
 directory and source-file directory for your debugger.
 
-\(fn COMMAND-LINE)" t nil)
-
+(fn COMMAND-LINE)" t nil)
 (autoload 'guiler "gud" "\
 Run guiler on program FILE in buffer `*gud-FILE*'.
 The directory containing FILE becomes the initial working directory
 and source-file directory for your debugger.
 
-\(fn COMMAND-LINE)" t nil)
-
+(fn COMMAND-LINE)" t nil)
 (autoload 'jdb "gud" "\
 Run jdb with command line COMMAND-LINE in a buffer.
 The buffer is named \"*gud*\" if no initial class is given or
@@ -15865,13 +14311,11 @@ original source file access method.
 For general information about commands available to control jdb from
 gud, see `gud-mode'.
 
-\(fn COMMAND-LINE)" t nil)
-
+(fn COMMAND-LINE)" t nil)
 (autoload 'gdb-script-mode "gud" "\
 Major mode for editing GDB scripts.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (defvar gud-tooltip-mode nil "\
 Non-nil if Gud-Tooltip mode is enabled.
 See the `gud-tooltip-mode' command
@@ -15879,9 +14323,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `gud-tooltip-mode'.")
-
 (custom-autoload 'gud-tooltip-mode "gud" nil)
-
 (autoload 'gud-tooltip-mode "gud" "\
 Toggle the display of GUD tooltips.
 
@@ -15899,13 +14341,10 @@ evaluate `(default-value \\='gud-tooltip-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "gud" '("gdb-" "gud-"))
 
-;;;***
 
-;;;### (autoloads nil "gv" "emacs-lisp/gv.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/gv.el
 
 (autoload 'gv-get "gv" "\
@@ -15918,8 +14357,7 @@ with a (not necessarily copyable) Elisp expression that 
returns the value to
 set it to.
 DO must return an Elisp expression.
 
-\(fn PLACE DO)" nil nil)
-
+(fn PLACE DO)" nil nil)
 (autoload 'gv-letplace "gv" "\
 Build the code manipulating the generalized variable PLACE.
 GETTER will be bound to a copyable expression that returns the value
@@ -15931,35 +14369,25 @@ and SETTER.
 The returned value will then be an Elisp expression that first evaluates
 all the parts of PLACE that can be evaluated and then runs E.
 
-\(fn (GETTER SETTER) PLACE &rest BODY)" nil t)
-
+(fn (GETTER SETTER) PLACE &rest BODY)" nil t)
 (function-put 'gv-letplace 'lisp-indent-function '2)
-
 (autoload 'gv-define-expander "gv" "\
 Use HANDLER to handle NAME as a generalized var.
 NAME is a symbol: the name of a function, macro, or special form.
 HANDLER is a function which takes an argument DO followed by the same
 arguments as NAME.  DO is a function as defined in `gv-get'.
 
-\(fn NAME HANDLER)" nil t)
-
+(fn NAME HANDLER)" nil t)
 (function-put 'gv-define-expander 'lisp-indent-function '1)
-
 (autoload 'gv--defun-declaration "gv" "\
 
 
-\(fn SYMBOL NAME ARGS HANDLER &optional FIX)" nil nil)
-
+(fn SYMBOL NAME ARGS HANDLER &optional FIX)" nil nil)
 (defsubst gv--expander-defun-declaration (&rest args) (apply 
#'gv--defun-declaration 'gv-expander args))
-
 (defsubst gv--setter-defun-declaration (&rest args) (apply 
#'gv--defun-declaration 'gv-setter args))
-
 (or (assq 'gv-expander defun-declarations-alist) (let ((x (list 'gv-expander 
#'gv--expander-defun-declaration))) (push x macro-declarations-alist) (push x 
defun-declarations-alist)))
-
 (or (assq 'gv-setter defun-declarations-alist) (push (list 'gv-setter 
#'gv--setter-defun-declaration) defun-declarations-alist))
-
 (let ((spec (get 'compiler-macro 'edebug-declaration-spec))) (put 'gv-expander 
'edebug-declaration-spec spec) (put 'gv-setter 'edebug-declaration-spec spec))
-
 (autoload 'gv-define-setter "gv" "\
 Define a setter method for generalized variable NAME.
 This macro is an easy-to-use substitute for `gv-define-expander' that works
@@ -15972,10 +14400,8 @@ which can do arbitrary things, whereas the other 
arguments are all guaranteed
 to be pure and copyable.  Example use:
   (gv-define-setter aref (v a i) \\=`(aset ,a ,i ,v))
 
-\(fn NAME ARGLIST &rest BODY)" nil t)
-
+(fn NAME ARGLIST &rest BODY)" nil t)
 (function-put 'gv-define-setter 'lisp-indent-function '2)
-
 (autoload 'gv-define-simple-setter "gv" "\
 Define a simple setter method for generalized variable NAME.
 This macro is an easy-to-use substitute for `gv-define-expander' that works
@@ -15989,8 +14415,7 @@ instead the assignment is turned into something 
equivalent to
     temp)
 so as to preserve the semantics of `setf'.
 
-\(fn NAME SETTER &optional FIX-RETURN)" nil t)
-
+(fn NAME SETTER &optional FIX-RETURN)" nil t)
 (autoload 'setf "gv" "\
 Set each PLACE to the value of its VAL.
 This is a generalized version of `setq'; the PLACEs may be symbolic
@@ -15998,10 +14423,8 @@ references such as (car x) or (aref x i), as well as 
plain symbols.
 For example, (setf (cadr x) y) is equivalent to (setcar (cdr x) y).
 The return value is the last VAL in the list.
 
-\(fn PLACE VAL PLACE VAL ...)" nil t)
-
+(fn PLACE VAL PLACE VAL ...)" nil t)
 (def-edebug-elem-spec 'gv-place '(form))
-
 (autoload 'gv-ref "gv" "\
 Return a reference to PLACE.
 This is like the `&' operator of the C language.
@@ -16009,13 +14432,10 @@ Note: this only works reliably with lexical binding 
mode, except for very
 simple PLACEs such as (symbol-function \\='foo) which will also work in dynamic
 binding mode.
 
-\(fn PLACE)" nil t)
-
+(fn PLACE)" nil t)
 (register-definition-prefixes "gv" '("gv-"))
 
-;;;***
 
-;;;### (autoloads nil "handwrite" "play/handwrite.el" (0 0 0 0))
 ;;; Generated autoloads from play/handwrite.el
 
 (autoload 'handwrite "handwrite" "\
@@ -16027,89 +14447,81 @@ Variables: `handwrite-linespace'     (default 12)
            `handwrite-fontsize'      (default 11)
            `handwrite-numlines'      (default 60)
            `handwrite-pagenumbering' (default nil)" t nil)
-
 (register-definition-prefixes "handwrite" '("handwrite-" 
"menu-bar-handwrite-map"))
 
-;;;***
 
-;;;### (autoloads nil "hanja-util" "language/hanja-util.el" (0 0
-;;;;;;  0 0))
+;;; Generated autoloads from leim/quail/hangul.el
+
+(autoload 'hangul-input-method-activate "quail/hangul" "\
+Activate Hangul input method INPUT-METHOD.
+FUNC is a function to handle input key.
+HELP-TEXT is a text set in `hangul-input-method-help-text'.
+
+(fn INPUT-METHOD FUNC HELP-TEXT &rest ARGS)" nil nil)
+(register-definition-prefixes "quail/hangul" '("alphabetp" "hangul" 
"notzerop"))
+
+
 ;;; Generated autoloads from language/hanja-util.el
 
 (register-definition-prefixes "hanja-util" '("han"))
 
-;;;***
 
-;;;### (autoloads nil "hanoi" "play/hanoi.el" (0 0 0 0))
 ;;; Generated autoloads from play/hanoi.el
 
 (autoload 'hanoi "hanoi" "\
 Towers of Hanoi diversion.  Use NRINGS rings.
 
-\(fn NRINGS)" t nil)
-
+(fn NRINGS)" t nil)
 (autoload 'hanoi-unix "hanoi" "\
 Towers of Hanoi, UNIX doomsday version.
 Displays 32-ring towers that have been progressing at one move per
 second since 1970-01-01 00:00:00 GMT.
 
 Repent before ring 31 moves." t nil)
-
 (autoload 'hanoi-unix-64 "hanoi" "\
 Like `hanoi-unix', but pretend to have a 64-bit clock.
 This is, necessarily (as of Emacs 20.3), a crock.  When the
 `current-time' interface is made s2G-compliant, hanoi.el will need
 to be updated." t nil)
-
 (register-definition-prefixes "hanoi" '("hanoi-"))
 
-;;;***
 
-;;;### (autoloads nil "hashcash" "mail/hashcash.el" (0 0 0 0))
 ;;; Generated autoloads from mail/hashcash.el
 
 (autoload 'hashcash-insert-payment "hashcash" "\
 Insert X-Payment and X-Hashcash headers with a payment for ARG.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'hashcash-insert-payment-async "hashcash" "\
 Insert X-Payment and X-Hashcash headers with a payment for ARG
 Only start calculation.  Results are inserted when ready.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'hashcash-verify-payment "hashcash" "\
 Verify a hashcash payment.
 
-\(fn TOKEN &optional RESOURCE AMOUNT)" nil nil)
-
+(fn TOKEN &optional RESOURCE AMOUNT)" nil nil)
 (autoload 'mail-add-payment "hashcash" "\
 Add X-Payment: and X-Hashcash: headers with a hashcash payment
 for each recipient address.  Prefix arg sets default payment temporarily.
 Set ASYNC to t to start asynchronous calculation.  (See
 `mail-add-payment-async').
 
-\(fn &optional ARG ASYNC)" t nil)
-
+(fn &optional ARG ASYNC)" t nil)
 (autoload 'mail-add-payment-async "hashcash" "\
 Add X-Payment: and X-Hashcash: headers with a hashcash payment
 for each recipient address.  Prefix arg sets default payment temporarily.
 Calculation is asynchronous.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'mail-check-payment "hashcash" "\
 Look for a valid X-Payment: or X-Hashcash: header.
 Prefix arg sets default accept amount temporarily.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "hashcash" '("hashcash-"))
 
-;;;***
 
-;;;### (autoloads nil "help-at-pt" "help-at-pt.el" (0 0 0 0))
 ;;; Generated autoloads from help-at-pt.el
 
 (autoload 'help-at-pt-string "help-at-pt" "\
@@ -16120,14 +14532,12 @@ If KBD is non-nil, `kbd-help' is used instead, and any
 `help-echo' property is ignored.  In this case, the return value
 can also be t, if that is the value of the `kbd-help' property.
 
-\(fn &optional KBD)" nil nil)
-
+(fn &optional KBD)" nil nil)
 (autoload 'help-at-pt-kbd-string "help-at-pt" "\
 Return the keyboard help string at point.
 If the `kbd-help' text or overlay property at point produces a
 string, return it.  Otherwise, use the `help-echo' property.
 If this produces no string either, return nil." nil nil)
-
 (autoload 'display-local-help "help-at-pt" "\
 Display local help in the echo area.
 This command, by default, displays a short help message, namely
@@ -16145,16 +14555,13 @@ If DESCRIBE-BUTTON in non-nil (interactively, the 
prefix arg), and
 there's a button/widget at point, pop a buffer describing that
 button/widget instead.
 
-\(fn &optional INHIBIT-WARNING DESCRIBE-BUTTON)" t nil)
-
+(fn &optional INHIBIT-WARNING DESCRIBE-BUTTON)" t nil)
 (autoload 'help-at-pt-cancel-timer "help-at-pt" "\
 Cancel any timer set by `help-at-pt-set-timer'.
 This disables `help-at-pt-display-when-idle'." t nil)
-
 (autoload 'help-at-pt-set-timer "help-at-pt" "\
 Enable `help-at-pt-display-when-idle'.
 This is done by setting a timer, if none is currently active." t nil)
-
 (defvar help-at-pt-display-when-idle 'never "\
 Automatically show local help on point-over.
 If the value is t, the string obtained from any `kbd-help' or
@@ -16185,9 +14592,7 @@ enabling buffer local values.  It sets the actual value 
to nil.
 Thus, Custom distinguishes between a nil value and other values
 that disable the feature, which Custom identifies with `never'.
 The default is `never'.")
-
 (custom-autoload 'help-at-pt-display-when-idle "help-at-pt" nil)
-
 (autoload 'scan-buf-move-to-region "help-at-pt" "\
 Go to the start of the next region with non-nil PROP property.
 Then run HOOK, which should be a quoted symbol that is a normal
@@ -16205,8 +14610,7 @@ do not run HOOK.  If there are not enough regions to 
move over,
 an error results and the number of available regions is mentioned
 in the error message.  Point is not moved and HOOK is not run.
 
-\(fn PROP &optional ARG HOOK)" nil nil)
-
+(fn PROP &optional ARG HOOK)" nil nil)
 (autoload 'scan-buf-next-region "help-at-pt" "\
 Go to the start of the next region with non-nil help-echo.
 Print the help found there using `display-local-help'.  Adjacent
@@ -16227,8 +14631,7 @@ help-echo region without any local help being 
available.  This is
 because `help-echo' can be a function evaluating to nil.  This
 rarely happens in practice.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'scan-buf-previous-region "help-at-pt" "\
 Go to the start of the previous region with non-nil help-echo.
 Print the help found there using `display-local-help'.  Adjacent
@@ -16236,13 +14639,10 @@ areas with different non-nil help-echo properties are 
considered
 different regions.  With numeric argument ARG, behaves like
 `scan-buf-next-region' with argument -ARG.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "help-at-pt" '("help-at-pt-" 
"scan-buf-move-hook"))
 
-;;;***
 
-;;;### (autoloads nil "help-fns" "help-fns.el" (0 0 0 0))
 ;;; Generated autoloads from help-fns.el
 
 (autoload 'describe-function "help-fns" "\
@@ -16252,21 +14652,18 @@ When called from Lisp, FUNCTION may also be a 
function object.
 See the `help-enable-symbol-autoload' variable for special
 handling of autoloaded functions.
 
-\(fn FUNCTION)" t nil)
-
+(fn FUNCTION)" t nil)
 (autoload 'describe-command "help-fns" "\
 Display the full documentation of COMMAND (a symbol).
 When called from Lisp, COMMAND may also be a function object.
 
-\(fn COMMAND)" t nil)
-
+(fn COMMAND)" t nil)
 (autoload 'help-C-file-name "help-fns" "\
 Return the name of the C file where SUBR-OR-VAR is defined.
 KIND should be `var' for a variable or `subr' for a subroutine.
 If we can't find the file name, nil is returned.
 
-\(fn SUBR-OR-VAR KIND)" nil nil)
-
+(fn SUBR-OR-VAR KIND)" nil nil)
 (autoload 'find-lisp-object-file-name "help-fns" "\
 Guess the file that defined the Lisp object OBJECT, of type TYPE.
 OBJECT should be a symbol associated with a function, variable, or face;
@@ -16286,29 +14683,25 @@ If ALSO-C-SOURCE is non-nil, instead of returning 
`C-source',
 this function will attempt to locate the definition of OBJECT in
 the C sources, too.
 
-\(fn OBJECT TYPE &optional ALSO-C-SOURCE)" nil nil)
-
+(fn OBJECT TYPE &optional ALSO-C-SOURCE)" nil nil)
 (autoload 'describe-function-1 "help-fns" "\
 
 
-\(fn FUNCTION)" nil nil)
-
+(fn FUNCTION)" nil nil)
 (autoload 'variable-at-point "help-fns" "\
 Return the bound variable symbol found at or before point.
 Return 0 if there is no such symbol.
 If ANY-SYMBOL is non-nil, don't insist the symbol be bound.
 
-\(fn &optional ANY-SYMBOL)" nil nil)
-
+(fn &optional ANY-SYMBOL)" nil nil)
 (autoload 'describe-variable "help-fns" "\
 Display the full documentation of VARIABLE (a symbol).
 Returns the documentation as a string, also.
 If VARIABLE has a buffer-local value in BUFFER or FRAME
-\(default to the current buffer and current frame),
+(default to the current buffer and current frame),
 it is displayed along with the global value.
 
-\(fn VARIABLE &optional BUFFER FRAME)" t nil)
-
+(fn VARIABLE &optional BUFFER FRAME)" t nil)
 (autoload 'describe-face "help-fns" "\
 Display the properties of face FACE on FRAME.
 Interactively, FACE defaults to the faces of the character after point
@@ -16318,8 +14711,7 @@ If the optional argument FRAME is given, report on face 
FACE in that frame.
 If FRAME is t, report on the defaults for face FACE (for new frames).
 If FRAME is omitted or nil, use the selected frame.
 
-\(fn FACE &optional FRAME)" t nil)
-
+(fn FACE &optional FRAME)" t nil)
 (autoload 'describe-symbol "help-fns" "\
 Display the full documentation of SYMBOL.
 Will show the info of SYMBOL as a function, variable, and/or face.
@@ -16327,30 +14719,26 @@ Optional arguments BUFFER and FRAME specify for which 
buffer and
 frame to show the information about SYMBOL; they default to the
 current buffer and the selected frame, respectively.
 
-\(fn SYMBOL &optional BUFFER FRAME)" t nil)
-
+(fn SYMBOL &optional BUFFER FRAME)" t nil)
 (autoload 'describe-syntax "help-fns" "\
 Describe the syntax specifications in the syntax table of BUFFER.
 The descriptions are inserted in a help buffer, which is then displayed.
 BUFFER defaults to the current buffer.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (autoload 'describe-categories "help-fns" "\
 Describe the category specifications in the current category table.
 The descriptions are inserted in a buffer, which is then displayed.
 If BUFFER is non-nil, then describe BUFFER's category table instead.
 BUFFER should be a buffer or a buffer name.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (autoload 'describe-keymap "help-fns" "\
 Describe key bindings in KEYMAP.
 When called interactively, prompt for a variable that has a
 keymap value.
 
-\(fn KEYMAP)" t nil)
-
+(fn KEYMAP)" t nil)
 (autoload 'describe-mode "help-fns" "\
 Display documentation of current major mode and minor modes.
 A brief summary of the minor modes comes first, followed by the
@@ -16364,8 +14752,7 @@ whose documentation describes the minor mode.
 If called from Lisp with a non-nil BUFFER argument, display
 documentation for the major and minor modes of that buffer.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (autoload 'describe-widget "help-fns" "\
 Display a buffer with information about a widget.
 You can use this command to describe buttons (e.g., the links in a *Help*
@@ -16379,23 +14766,18 @@ When called from Lisp, POS may be a buffer position 
or a mouse position list.
 Calls each function of the list `describe-widget-functions' in turn, until
 one of them returns non-nil.
 
-\(fn &optional POS)" t nil)
-
+(fn &optional POS)" t nil)
 (autoload 'doc-file-to-man "help-fns" "\
 Produce an nroff buffer containing the doc-strings from the DOC file.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'doc-file-to-info "help-fns" "\
 Produce a texinfo buffer with sorted doc-strings from the DOC file.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (register-definition-prefixes "help-fns" '("describe-" "help-" 
"keymap-name-history"))
 
-;;;***
 
-;;;### (autoloads nil "help-macro" "help-macro.el" (0 0 0 0))
 ;;; Generated autoloads from help-macro.el
 
 (defvar three-step-help nil "\
@@ -16404,36 +14786,30 @@ The three steps are simple prompt, prompt with all 
options, and
 window listing and describing the options.
 A value of nil means skip the middle step, so that \\[help-command] 
\\[help-command]
 gives the window that lists the options.")
-
 (custom-autoload 'three-step-help "help-macro" t)
-
 (register-definition-prefixes "help-macro" '("make-help-screen"))
 
-;;;***
 
-;;;### (autoloads nil "help-mode" "help-mode.el" (0 0 0 0))
 ;;; Generated autoloads from help-mode.el
 
 (autoload 'help-mode--add-function-link "help-mode" "\
 
 
-\(fn STR FUN)" nil nil)
-
+(fn STR FUN)" nil nil)
 (autoload 'help-mode "help-mode" "\
 Major mode for viewing help text and navigating references in it.
-Also see the `help-enable-editing' variable.
+Also see the `help-enable-variable-value-editing' variable.
 
 Commands:
 \\{help-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'help-mode-setup "help-mode" "\
 Enter Help mode in the current buffer." nil nil)
-
+(make-obsolete 'help-mode-setup 'nil '"29.1")
 (autoload 'help-mode-finish "help-mode" "\
 Finalize Help mode setup in current buffer." nil nil)
-
+(make-obsolete 'help-mode-finish 'nil '"29.1")
 (autoload 'help-setup-xref "help-mode" "\
 Invoked from commands using the \"*Help*\" buffer to install some xref info.
 
@@ -16446,16 +14822,14 @@ This should be called very early, before the output 
buffer is cleared,
 because we want to record the \"previous\" position of point so we can
 restore it properly when going back.
 
-\(fn ITEM INTERACTIVE-P)" nil nil)
-
+(fn ITEM INTERACTIVE-P)" nil nil)
 (autoload 'help-buffer "help-mode" "\
 Return the name of a buffer for inserting help.
-If `help-xref-following' is non-nil, this is the name of the
-current buffer.  Signal an error if this buffer is not derived
-from `help-mode'.
+If `help-xref-following' is non-nil and the current buffer is
+derived from `help-mode', this is the name of the current buffer.
+
 Otherwise, return \"*Help*\", creating a buffer with that name if
 it does not already exist." nil nil)
-
 (autoload 'help-make-xrefs "help-mode" "\
 Parse and hyperlink documentation cross-references in the given BUFFER.
 
@@ -16470,15 +14844,14 @@ preceded by the word `variable' or `option'.
 
 If the variable `help-xref-mule-regexp' is non-nil, find also
 cross-reference information related to multilingual environment
-\(e.g., coding-systems).  This variable is also used to disambiguate
+(e.g., coding-systems).  This variable is also used to disambiguate
 the type of reference as the same way as `help-xref-symbol-regexp'.
 
 A special reference `back' is made to return back through a stack of
 help buffers.  Variable `help-back-label' specifies the text for
 that.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (autoload 'help-xref-button "help-mode" "\
 Make a hyperlink for cross-reference text previously matched.
 MATCH-NUMBER is the subexpression of interest in the last matched
@@ -16486,55 +14859,43 @@ regexp.  TYPE is the type of button to use.  Any 
remaining arguments are
 passed to the button's help-function when it is invoked.
 See `help-make-xrefs'.
 
-\(fn MATCH-NUMBER TYPE &rest ARGS)" nil nil)
-
+(fn MATCH-NUMBER TYPE &rest ARGS)" nil nil)
 (autoload 'help-insert-xref-button "help-mode" "\
 Insert STRING and make a hyperlink from cross-reference text on it.
 TYPE is the type of button to use.  Any remaining arguments are passed
 to the button's help-function when it is invoked.
 See `help-make-xrefs'.
 
-\(fn STRING TYPE &rest ARGS)" nil nil)
-
+(fn STRING TYPE &rest ARGS)" nil nil)
 (autoload 'help-xref-on-pp "help-mode" "\
 Add xrefs for symbols in `pp's output between FROM and TO.
 
-\(fn FROM TO)" nil nil)
-
-(define-obsolete-function-alias 'help-xref-interned 'describe-symbol "25.1")
-
+(fn FROM TO)" nil nil)
+(define-obsolete-function-alias 'help-xref-interned 'describe-symbol "\
+25.1")
 (autoload 'help-bookmark-jump "help-mode" "\
 Jump to `help-mode' bookmark BOOKMARK.
 Handler function for record returned by `help-bookmark-make-record'.
 BOOKMARK is a bookmark name or a bookmark record.
 
-\(fn BOOKMARK)" nil nil)
-
+(fn BOOKMARK)" nil nil)
 (register-definition-prefixes "help-mode" '("describe-symbol-backends" 
"help-"))
 
-;;;***
 
-;;;### (autoloads nil "helper" "emacs-lisp/helper.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/helper.el
 
 (autoload 'Helper-describe-bindings "helper" "\
 Describe local key bindings of current mode." t nil)
-
 (autoload 'Helper-help "helper" "\
 Provide help for current mode." t nil)
-
 (register-definition-prefixes "helper" '("Helper-"))
 
-;;;***
 
-;;;### (autoloads nil "hex-util" "hex-util.el" (0 0 0 0))
 ;;; Generated autoloads from hex-util.el
 
 (register-definition-prefixes "hex-util" '("decode-hex-string" 
"encode-hex-string"))
 
-;;;***
 
-;;;### (autoloads nil "hexl" "hexl.el" (0 0 0 0))
 ;;; Generated autoloads from hexl.el
 
 (autoload 'hexl-mode "hexl" "\
@@ -16619,25 +14980,36 @@ You can use \\[hexl-find-file] to visit a file in 
Hexl mode.
 
 \\[describe-bindings] for advanced commands.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'hexl-find-file "hexl" "\
 Edit file FILENAME as a binary file in hex dump format.
 Switch to a buffer visiting file FILENAME, creating one if none exists,
 and edit the file in `hexl-mode'.  The buffer's coding-system will be
 no-conversion, unlike if you visit it normally and then invoke `hexl-mode'.
 
-\(fn FILENAME)" t nil)
-
+(fn FILENAME)" t nil)
 (autoload 'hexlify-buffer "hexl" "\
 Convert a binary buffer to hexl format.
 This discards the buffer's undo information." t nil)
-
 (register-definition-prefixes "hexl" '("dehexlify-buffer" "hexl-"))
 
-;;;***
 
-;;;### (autoloads nil "hi-lock" "hi-lock.el" (0 0 0 0))
+;;; Generated autoloads from hfy-cmap.el
+
+(autoload 'htmlfontify-load-rgb-file "hfy-cmap" "\
+Load an X11 style rgb.txt FILE.
+Search `hfy-rgb-load-path' if FILE is not specified.
+Loads the variable `hfy-rgb-txt-color-map', which is used by
+`hfy-fallback-color-values'.
+
+(fn &optional FILE)" t nil)
+(autoload 'hfy-fallback-color-values "hfy-cmap" "\
+Use a fallback method for obtaining the rgb values for a color.
+
+(fn COLOR-STRING)" nil nil)
+(register-definition-prefixes "hfy-cmap" '("hfy-" 
"htmlfontify-unload-rgb-file"))
+
+
 ;;; Generated autoloads from hi-lock.el
 
 (autoload 'hi-lock-mode "hi-lock" "\
@@ -16717,10 +15089,8 @@ evaluate `hi-lock-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (put 'global-hi-lock-mode 'globalized-minor-mode t)
-
 (defvar global-hi-lock-mode nil "\
 Non-nil if Global Hi-Lock mode is enabled.
 See the `global-hi-lock-mode' command
@@ -16728,9 +15098,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-hi-lock-mode'.")
-
 (custom-autoload 'global-hi-lock-mode "hi-lock" nil)
-
 (autoload 'global-hi-lock-mode "hi-lock" "\
 Toggle Hi-Lock mode in all buffers.
 With prefix ARG, enable Global Hi-Lock mode if ARG is positive;
@@ -16745,10 +15113,8 @@ Hi-Lock mode is enabled in all buffers where
 
 See `hi-lock-mode' for more information on Hi-Lock mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defalias 'highlight-lines-matching-regexp 'hi-lock-line-face-buffer)
-
 (autoload 'hi-lock-line-face-buffer "hi-lock" "\
 Highlight all lines that match REGEXP using FACE.
 The lines that match REGEXP will be displayed by merging
@@ -16765,10 +15131,8 @@ Use Font lock mode, if enabled, to highlight REGEXP.  
Otherwise,
 use overlays for highlighting.  If overlays are used, the
 highlighting will not update as you type.
 
-\(fn REGEXP &optional FACE)" t nil)
-
+(fn REGEXP &optional FACE)" t nil)
 (defalias 'highlight-regexp 'hi-lock-face-buffer)
-
 (autoload 'hi-lock-face-buffer "hi-lock" "\
 Set face of each match of REGEXP to FACE.
 Interactively, prompt for REGEXP using `read-regexp', then FACE.
@@ -16790,10 +15154,8 @@ is considered \"enabled\" in a buffer if its 
`major-mode'
 causes `font-lock-specified-p' to return non-nil, which means
 the major mode specifies support for Font Lock.
 
-\(fn REGEXP &optional FACE SUBEXP LIGHTER)" t nil)
-
+(fn REGEXP &optional FACE SUBEXP LIGHTER)" t nil)
 (defalias 'highlight-phrase 'hi-lock-face-phrase-buffer)
-
 (autoload 'hi-lock-face-phrase-buffer "hi-lock" "\
 Set face of each match of phrase REGEXP to FACE.
 Interactively, prompt for REGEXP using `read-regexp', then FACE.
@@ -16810,10 +15172,8 @@ is considered \"enabled\" in a buffer if its 
`major-mode'
 causes `font-lock-specified-p' to return non-nil, which means
 the major mode specifies support for Font Lock.
 
-\(fn REGEXP &optional FACE)" t nil)
-
+(fn REGEXP &optional FACE)" t nil)
 (defalias 'highlight-symbol-at-point 'hi-lock-face-symbol-at-point)
-
 (autoload 'hi-lock-face-symbol-at-point "hi-lock" "\
 Highlight each instance of the symbol at point.
 Uses the next face from `hi-lock-face-defaults' without prompting,
@@ -16828,9 +15188,7 @@ in which case the highlighting will not update as you 
type.  The Font
 Lock mode is considered \"enabled\" in a buffer if its `major-mode'
 causes `font-lock-specified-p' to return non-nil, which means
 the major mode specifies support for Font Lock." t nil)
-
 (defalias 'unhighlight-regexp 'hi-lock-unface-buffer)
-
 (autoload 'hi-lock-unface-buffer "hi-lock" "\
 Remove highlighting of each match to REGEXP set by hi-lock.
 Interactively, prompt for REGEXP, accepting only regexps
@@ -16838,28 +15196,22 @@ previously inserted by hi-lock interactive functions.
 If REGEXP is t (or if \\[universal-argument] was specified interactively),
 then remove all hi-lock highlighting.
 
-\(fn REGEXP)" t nil)
-
+(fn REGEXP)" t nil)
 (autoload 'hi-lock-write-interactive-patterns "hi-lock" "\
 Write interactively added patterns, if any, into buffer at point.
 
 Interactively added patterns are those normally specified using
 `highlight-regexp' and `highlight-lines-matching-regexp'; they can
 be found in variable `hi-lock-interactive-patterns'." t nil)
-
 (autoload 'hi-lock-find-patterns "hi-lock" "\
 Add patterns from the current buffer to the list of hi-lock patterns." t nil)
-
 (autoload 'hi-lock-context-menu "hi-lock" "\
 Populate MENU with a menu item to highlight symbol at CLICK.
 
-\(fn MENU CLICK)" nil nil)
-
+(fn MENU CLICK)" nil nil)
 (register-definition-prefixes "hi-lock" '("hi-lock-" 
"highlight-symbol-at-mouse" "turn-on-hi-lock-if-enabled"))
 
-;;;***
 
-;;;### (autoloads nil "hideif" "progmodes/hideif.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/hideif.el
 
 (autoload 'hide-ifdef-mode "hideif" "\
@@ -16913,13 +15265,10 @@ evaluate `hide-ifdef-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "hideif" '("backward-ifdef" "down-ifdef" 
"forward-ifdef" "hide-ifdef" "hif-" "intern-safe" "next-ifdef" "previous-ifdef" 
"show-ifdef" "up-ifdef"))
 
-;;;***
 
-;;;### (autoloads nil "hideshow" "progmodes/hideshow.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/hideshow.el
 
 (defvar hs-special-modes-alist (mapcar 'purecopy '((c-mode "{" "}" "/[*/]" nil 
nil) (c++-mode "{" "}" "/[*/]" nil nil) (bibtex-mode ("@\\S(*\\(\\s(\\)" 1)) 
(java-mode "{" "}" "/[*/]" nil nil) (js-mode "{" "}" "/[*/]" nil) (mhtml-mode 
"{\\|<[^/>]*?" "}\\|</[^/>]*[^/]>" "<!--" mhtml-forward nil))) "\
@@ -16949,7 +15298,6 @@ use of ADJUST-BEG-FUNC.
 If any of the elements is left nil or omitted, hideshow tries to guess
 appropriate values.  The regexps should not contain leading or trailing
 whitespace.  Case does not matter.")
-
 (autoload 'hs-minor-mode "hideshow" "\
 Minor mode to selectively hide/show code and comment blocks.
 
@@ -16983,24 +15331,17 @@ evaluate `hs-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'turn-off-hideshow "hideshow" "\
 Unconditionally turn off `hs-minor-mode'." nil nil)
-
 (register-definition-prefixes "hideshow" '("hs-"))
 
-;;;***
 
-;;;### (autoloads nil "hierarchy" "emacs-lisp/hierarchy.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emacs-lisp/hierarchy.el
 
 (register-definition-prefixes "hierarchy" '("hierarchy-"))
 
-;;;***
 
-;;;### (autoloads nil "hilit-chg" "hilit-chg.el" (0 0 0 0))
 ;;; Generated autoloads from hilit-chg.el
 
 (autoload 'highlight-changes-mode "hilit-chg" "\
@@ -17036,8 +15377,7 @@ evaluate `highlight-changes-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'highlight-changes-visible-mode "hilit-chg" "\
 Toggle visibility of highlighting due to Highlight Changes mode.
 
@@ -17065,22 +15405,18 @@ evaluate `highlight-changes-visible-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'highlight-changes-remove-highlight "hilit-chg" "\
 Remove the change face from the region between BEG and END.
 This allows you to manually remove highlighting from uninteresting changes.
 
-\(fn BEG END)" t nil)
-
+(fn BEG END)" t nil)
 (autoload 'highlight-changes-next-change "hilit-chg" "\
 Move to the beginning of the next change, if in Highlight Changes mode." t nil)
-
 (autoload 'highlight-changes-previous-change "hilit-chg" "\
 Move to the beginning of the previous change, if in Highlight Changes mode." t 
nil)
-
 (autoload 'highlight-changes-rotate-faces "hilit-chg" "\
-Rotate the faces if in Highlight Changes mode and the changes are visible.
+\"Age\" changes if in Highlight Changes mode and the changes are visible.
 
 Current changes are displayed in the face described by the first element
 of `highlight-changes-face-list', one level older changes are shown in
@@ -17092,7 +15428,6 @@ this function to `write-file-functions' as a 
buffer-local value.  To do
 this, eval the following in the buffer to be saved:
 
   (add-hook \\='write-file-functions \\='highlight-changes-rotate-faces nil 
t)" t nil)
-
 (autoload 'highlight-compare-buffers "hilit-chg" "\
 Compare two buffers and highlight the differences.
 
@@ -17108,8 +15443,7 @@ If a buffer is read-only, differences will be 
highlighted but no property
 changes are made, so \\[highlight-changes-next-change] and
 \\[highlight-changes-previous-change] will not work.
 
-\(fn BUF-A BUF-B)" t nil)
-
+(fn BUF-A BUF-B)" t nil)
 (autoload 'highlight-compare-with-file "hilit-chg" "\
 Compare this buffer with a file, and highlight differences.
 
@@ -17124,10 +15458,8 @@ If the buffer is read-only, differences will be 
highlighted but no property
 changes are made, so \\[highlight-changes-next-change] and
 \\[highlight-changes-previous-change] will not work.
 
-\(fn FILE-B)" t nil)
-
+(fn FILE-B)" t nil)
 (put 'global-highlight-changes-mode 'globalized-minor-mode t)
-
 (defvar global-highlight-changes-mode nil "\
 Non-nil if Global Highlight-Changes mode is enabled.
 See the `global-highlight-changes-mode' command
@@ -17135,9 +15467,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-highlight-changes-mode'.")
-
 (custom-autoload 'global-highlight-changes-mode "hilit-chg" nil)
-
 (autoload 'global-highlight-changes-mode "hilit-chg" "\
 Toggle Highlight-Changes mode in all buffers.
 With prefix ARG, enable Global Highlight-Changes mode if ARG is
@@ -17153,22 +15483,17 @@ Highlight-Changes mode is enabled in all buffers where
 See `highlight-changes-mode' for more information on Highlight-Changes
 mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "hilit-chg" '("highlight-" "hilit-chg-"))
 
-;;;***
 
-;;;### (autoloads nil "hippie-exp" "hippie-exp.el" (0 0 0 0))
 ;;; Generated autoloads from hippie-exp.el
 
 (defvar hippie-expand-try-functions-list '(try-complete-file-name-partially 
try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line 
try-expand-dabbrev try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill 
try-complete-lisp-symbol-partially try-complete-lisp-symbol) "\
 The list of expansion functions tried in order by `hippie-expand'.
 To change the behavior of `hippie-expand', remove, change the order of,
 or insert functions in this list.")
-
 (custom-autoload 'hippie-expand-try-functions-list "hippie-exp" t)
-
 (autoload 'hippie-expand "hippie-exp" "\
 Try to expand text before point, using multiple methods.
 The expansion functions in `hippie-expand-try-functions-list' are
@@ -17179,20 +15504,16 @@ With a positive numeric argument, jumps directly to 
the ARG next
 function in this list.  With a negative argument or just 
\\[universal-argument],
 undoes the expansion.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'make-hippie-expand-function "hippie-exp" "\
 Construct a function similar to `hippie-expand'.
 Make it use the expansion functions in TRY-LIST.  An optional second
 argument VERBOSE non-nil makes the function verbose.
 
-\(fn TRY-LIST &optional VERBOSE)" nil nil)
-
+(fn TRY-LIST &optional VERBOSE)" nil nil)
 (register-definition-prefixes "hippie-exp" '("he-" "hippie-expand-" "try-"))
 
-;;;***
 
-;;;### (autoloads nil "hl-line" "hl-line.el" (0 0 0 0))
 ;;; Generated autoloads from hl-line.el
 
 (autoload 'hl-line-mode "hl-line" "\
@@ -17222,8 +15543,7 @@ evaluate `hl-line-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar global-hl-line-mode nil "\
 Non-nil if Global Hl-Line mode is enabled.
 See the `global-hl-line-mode' command
@@ -17231,9 +15551,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-hl-line-mode'.")
-
 (custom-autoload 'global-hl-line-mode "hl-line" nil)
-
 (autoload 'global-hl-line-mode "hl-line" "\
 Toggle line highlighting in all buffers (Global Hl-Line mode).
 
@@ -17258,110 +15576,74 @@ evaluate `(default-value \\='global-hl-line-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "hl-line" '("global-hl-line-" "hl-line-"))
 
-;;;***
 
-;;;### (autoloads nil "hmac-def" "net/hmac-def.el" (0 0 0 0))
 ;;; Generated autoloads from net/hmac-def.el
 
 (register-definition-prefixes "hmac-def" '("define-hmac-function"))
 
-;;;***
 
-;;;### (autoloads nil "hmac-md5" "net/hmac-md5.el" (0 0 0 0))
 ;;; Generated autoloads from net/hmac-md5.el
 
 (register-definition-prefixes "hmac-md5" '("hmac-md5" "md5-binary"))
 
-;;;***
 
-;;;### (autoloads nil "holidays" "calendar/holidays.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/holidays.el
 
 (defvar holiday-general-holidays (mapcar 'purecopy '((holiday-fixed 1 1 "New 
Year's Day") (holiday-float 1 1 3 "Martin Luther King Day") (holiday-fixed 2 2 
"Groundhog Day") (holiday-fixed 2 14 "Valentine's Day") (holiday-float 2 1 3 
"President's Day") (holiday-fixed 3 17 "St. Patrick's Day") (holiday-fixed 4 1 
"April Fools' Day") (holiday-float 5 0 2 "Mother's Day") (holiday-float 5 1 -1 
"Memorial Day") (holiday-fixed 6 14 "Flag Day") (holiday-float 6 0 3 "Father's 
Day") (holiday-fixed 7 [...]
 General holidays.  Default value is for the United States.
 See the documentation for `calendar-holidays' for details.")
-
 (custom-autoload 'holiday-general-holidays "holidays" t)
-
 (put 'holiday-general-holidays 'risky-local-variable t)
-
 (defvar holiday-oriental-holidays (mapcar 'purecopy 
'((holiday-chinese-new-year) (if calendar-chinese-all-holidays-flag (append 
(holiday-chinese 1 15 "Lantern Festival") (holiday-chinese-qingming) 
(holiday-chinese 5 5 "Dragon Boat Festival") (holiday-chinese 7 7 "Double 
Seventh Festival") (holiday-chinese 8 15 "Mid-Autumn Festival") 
(holiday-chinese 9 9 "Double Ninth Festival") 
(holiday-chinese-winter-solstice))))) "\
 Oriental holidays.
 See the documentation for `calendar-holidays' for details.")
-
 (custom-autoload 'holiday-oriental-holidays "holidays" t)
-
 (put 'holiday-oriental-holidays 'risky-local-variable t)
-
 (defvar holiday-local-holidays nil "\
 Local holidays.
 See the documentation for `calendar-holidays' for details.")
-
 (custom-autoload 'holiday-local-holidays "holidays" t)
-
 (put 'holiday-local-holidays 'risky-local-variable t)
-
 (defvar holiday-other-holidays nil "\
 User defined holidays.
 See the documentation for `calendar-holidays' for details.")
-
 (custom-autoload 'holiday-other-holidays "holidays" t)
-
 (put 'holiday-other-holidays 'risky-local-variable t)
-
 (defvar holiday-hebrew-holidays (mapcar 'purecopy '((holiday-hebrew-passover) 
(holiday-hebrew-rosh-hashanah) (holiday-hebrew-hanukkah) (if 
calendar-hebrew-all-holidays-flag (append (holiday-hebrew-tisha-b-av) 
(holiday-hebrew-misc))))) "\
 Jewish holidays.
 See the documentation for `calendar-holidays' for details.")
-
 (custom-autoload 'holiday-hebrew-holidays "holidays" t)
-
 (put 'holiday-hebrew-holidays 'risky-local-variable t)
-
 (defvar holiday-christian-holidays (mapcar 'purecopy '((holiday-easter-etc) 
(holiday-fixed 12 25 "Christmas") (if calendar-christian-all-holidays-flag 
(append (holiday-fixed 1 6 "Epiphany") (holiday-julian 12 25 "Christmas (Julian 
calendar)") (holiday-greek-orthodox-easter) (holiday-fixed 8 15 "Assumption") 
(holiday-advent 0 "Advent"))))) "\
 Christian holidays.
 See the documentation for `calendar-holidays' for details.")
-
 (custom-autoload 'holiday-christian-holidays "holidays" t)
-
 (put 'holiday-christian-holidays 'risky-local-variable t)
-
 (defvar holiday-islamic-holidays (mapcar 'purecopy 
'((holiday-islamic-new-year) (holiday-islamic 9 1 "Ramadan Begins") (if 
calendar-islamic-all-holidays-flag (append (holiday-islamic 1 10 "Ashura") 
(holiday-islamic 3 12 "Mulad-al-Nabi") (holiday-islamic 7 26 "Shab-e-Mi'raj") 
(holiday-islamic 8 15 "Shab-e-Bara't") (holiday-islamic 9 27 "Shab-e Qadr") 
(holiday-islamic 10 1 "Id-al-Fitr") (holiday-islamic 12 10 "Id-al-Adha"))))) "\
 Islamic holidays.
 See the documentation for `calendar-holidays' for details.")
-
 (custom-autoload 'holiday-islamic-holidays "holidays" t)
-
 (put 'holiday-islamic-holidays 'risky-local-variable t)
-
 (defvar holiday-bahai-holidays (mapcar 'purecopy '((holiday-bahai-new-year) 
(holiday-bahai-ridvan) (holiday-fixed 5 23 "Declaration of the Báb") 
(holiday-fixed 5 29 "Ascension of Bahá’u’lláh") (holiday-fixed 7 9 "Martyrdom 
of the Báb") (holiday-fixed 10 20 "Birth of the Báb") (holiday-fixed 11 12 
"Birth of Bahá’u’lláh") (if calendar-bahai-all-holidays-flag (append 
(holiday-fixed 11 26 "Day of the Covenant") (holiday-fixed 11 28 "Ascension of 
`Abdu’l-Bahá"))))) "\
 Bahá’í holidays.
 See the documentation for `calendar-holidays' for details.")
-
 (custom-autoload 'holiday-bahai-holidays "holidays" t)
-
 (put 'holiday-bahai-holidays 'risky-local-variable t)
-
 (defvar holiday-solar-holidays (mapcar 'purecopy '((solar-equinoxes-solstices) 
(holiday-sexp calendar-daylight-savings-starts (format "Daylight Saving Time 
Begins %s" (solar-time-string (/ calendar-daylight-savings-starts-time (float 
60)) calendar-standard-time-zone-name))) (holiday-sexp 
calendar-daylight-savings-ends (format "Daylight Saving Time Ends %s" 
(solar-time-string (/ calendar-daylight-savings-ends-time (float 60)) 
calendar-daylight-time-zone-name))))) "\
 Sun-related holidays.
 See the documentation for `calendar-holidays' for details.")
-
 (custom-autoload 'holiday-solar-holidays "holidays" t)
-
 (put 'holiday-solar-holidays 'risky-local-variable t)
-
 (put 'calendar-holidays 'risky-local-variable t)
-
 (autoload 'holidays "holidays" "\
 Display the holidays for last month, this month, and next month.
 If called with an optional prefix argument ARG, prompts for month and year.
 This function is suitable for execution in an init file.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'list-holidays "holidays" "\
 Display holidays for years Y1 to Y2 (inclusive).
 Y2 defaults to Y1.  The optional list of holidays L defaults to
@@ -17387,18 +15669,19 @@ The list of holiday lists is computed by the
 by redefining that function, or use `add-function' to add
 values.
 
-\(fn Y1 &optional Y2 L LABEL)" t nil)
-
+(fn Y1 &optional Y2 L LABEL)" t nil)
 (defalias 'holiday-list 'list-holidays)
-
 (register-definition-prefixes "holidays" '("calendar-" "holiday-"))
 
-;;;***
 
-;;;### (autoloads nil "htmlfontify" "htmlfontify.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/html.el
+
+(register-definition-prefixes "semantic/html" '("semantic-"))
+
+
 ;;; Generated autoloads from htmlfontify.el
-(push (purecopy '(htmlfontify 0 21)) package--builtin-versions)
 
+(push (purecopy '(htmlfontify 0 21)) package--builtin-versions)
 (autoload 'htmlfontify-buffer "htmlfontify" "\
 Create a new buffer, named for the current buffer + a .html extension,
 containing an inline CSS-stylesheet and formatted CSS-markup HTML
@@ -17417,21 +15700,32 @@ If the SRCDIR and FILE arguments are set, lookup 
etags derived
 entries in the `hfy-tags-cache' and add HTML anchors and
 hyperlinks as appropriate.
 
-\(fn &optional SRCDIR FILE)" t nil)
-
+(fn &optional SRCDIR FILE)" t nil)
 (autoload 'htmlfontify-copy-and-link-dir "htmlfontify" "\
 Trawl SRCDIR and write fontified-and-hyperlinked output in DSTDIR.
 F-EXT and L-EXT specify values for `hfy-extn' and `hfy-link-extn'.
 
 You may also want to set `hfy-page-header' and `hfy-page-footer'.
 
-\(fn SRCDIR DSTDIR &optional F-EXT L-EXT)" t nil)
-
+(fn SRCDIR DSTDIR &optional F-EXT L-EXT)" t nil)
 (register-definition-prefixes "htmlfontify" '("hfy-" "htmlfontify-"))
 
-;;;***
 
-;;;### (autoloads nil "ibuf-macs" "ibuf-macs.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/ia.el
+
+(register-definition-prefixes "semantic/ia" '("semantic-ia-"))
+
+
+;;; Generated autoloads from cedet/semantic/ia-sb.el
+
+(register-definition-prefixes "semantic/ia-sb" '("semantic-ia-s"))
+
+
+;;; Generated autoloads from ibuf-ext.el
+
+(register-definition-prefixes "ibuf-ext" '("ibuffer-"))
+
+
 ;;; Generated autoloads from ibuf-macs.el
 
 (autoload 'define-ibuffer-column "ibuf-macs" "\
@@ -17457,10 +15751,7 @@ inlined into the compiled format versions.  This means 
that if you
 change its definition, you should explicitly call
 `ibuffer-recompile-formats'.
 
-\(fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)" nil t)
-
-(function-put 'define-ibuffer-column 'lisp-indent-function 'defun)
-
+(fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)" nil 'macro)
 (autoload 'define-ibuffer-sorter "ibuf-macs" "\
 Define a method of sorting named NAME.
 DOCUMENTATION is the documentation of the function, which will be called
@@ -17471,12 +15762,7 @@ For sorting, the forms in BODY will be evaluated with 
`a' bound to one
 buffer object, and `b' bound to another.  BODY should return a non-nil
 value if and only if `a' is \"less than\" `b'.
 
-\(fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)" nil t)
-
-(function-put 'define-ibuffer-sorter 'lisp-indent-function '1)
-
-(function-put 'define-ibuffer-sorter 'doc-string-elt '2)
-
+(fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)" nil 'macro)
 (autoload 'define-ibuffer-op "ibuf-macs" "\
 Generate a function which operates on a buffer.
 OP becomes the name of the function; if it doesn't begin with
@@ -17515,12 +15801,7 @@ BODY define the operation; they are forms to evaluate 
per each
 marked buffer.  BODY is evaluated with `buf' bound to the
 buffer object.
 
-\(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS 
OPSTRING ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" nil t)
-
-(function-put 'define-ibuffer-op 'lisp-indent-function '2)
-
-(function-put 'define-ibuffer-op 'doc-string-elt '3)
-
+(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING 
ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" nil 'macro)
 (autoload 'define-ibuffer-filter "ibuf-macs" "\
 Define a filter named NAME.
 DOCUMENTATION is the documentation of the function.
@@ -17535,17 +15816,10 @@ not a particular buffer should be displayed or not.  
The forms in BODY
 will be evaluated with BUF bound to the buffer object, and QUALIFIER
 bound to the current value of the filter.
 
-\(fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)" nil t)
-
-(function-put 'define-ibuffer-filter 'lisp-indent-function '2)
-
-(function-put 'define-ibuffer-filter 'doc-string-elt '2)
-
+(fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)" nil 'macro)
 (register-definition-prefixes "ibuf-macs" '("ibuffer-"))
 
-;;;***
 
-;;;### (autoloads nil "ibuffer" "ibuffer.el" (0 0 0 0))
 ;;; Generated autoloads from ibuffer.el
 
 (autoload 'ibuffer-list-buffers "ibuffer" "\
@@ -17553,15 +15827,13 @@ Display a list of buffers, in another window.
 If optional argument FILES-ONLY is non-nil, then add a filter for
 buffers which are visiting a file.
 
-\(fn &optional FILES-ONLY)" t nil)
-
+(fn &optional FILES-ONLY)" t nil)
 (autoload 'ibuffer-other-window "ibuffer" "\
 Like `ibuffer', but displayed in another window by default.
 If optional argument FILES-ONLY is non-nil, then add a filter for
 buffers which are visiting a file.
 
-\(fn &optional FILES-ONLY)" t nil)
-
+(fn &optional FILES-ONLY)" t nil)
 (autoload 'ibuffer "ibuffer" "\
 Begin using Ibuffer to edit a list of buffers.
 Type \\<ibuffer-mode-map>\\[describe-mode] after entering ibuffer for more 
information.
@@ -17580,20 +15852,15 @@ FORMATS is the value to use for `ibuffer-formats'.
   If specified, then the variable `ibuffer-formats' will have
   that value locally in this buffer.
 
-\(fn &optional OTHER-WINDOW-P NAME QUALIFIERS NOSELECT SHRINK FILTER-GROUPS 
FORMATS)" t nil)
-
+(fn &optional OTHER-WINDOW-P NAME QUALIFIERS NOSELECT SHRINK FILTER-GROUPS 
FORMATS)" t nil)
 (autoload 'ibuffer-jump "ibuffer" "\
 Call Ibuffer and set point at the line listing the current buffer.
 If optional arg OTHER-WINDOW is non-nil, then use another window.
 
-\(fn &optional OTHER-WINDOW)" t nil)
-
+(fn &optional OTHER-WINDOW)" t nil)
 (register-definition-prefixes "ibuffer" '("filename" "ibuffer-" "locked" 
"mark" "mod" "name" "process" "read-only" "recency" "size"))
 
-;;;***
 
-;;;### (autoloads nil "icalendar" "calendar/icalendar.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from calendar/icalendar.el
 
 (autoload 'icalendar-export-file "icalendar" "\
@@ -17601,8 +15868,7 @@ Export diary file to iCalendar format.
 All diary entries in the file DIARY-FILENAME are converted to iCalendar
 format.  The result is appended to the file ICAL-FILENAME.
 
-\(fn DIARY-FILENAME ICAL-FILENAME)" t nil)
-
+(fn DIARY-FILENAME ICAL-FILENAME)" t nil)
 (autoload 'icalendar-export-region "icalendar" "\
 Export region in diary file to iCalendar format.
 All diary entries in the region from MIN to MAX in the current buffer are
@@ -17612,8 +15878,7 @@ This function attempts to return t if something goes 
wrong.  In this
 case an error string which describes all the errors and problems is
 written into the buffer `*icalendar-errors*'.
 
-\(fn MIN MAX ICAL-FILENAME)" t nil)
-
+(fn MIN MAX ICAL-FILENAME)" t nil)
 (autoload 'icalendar-import-file "icalendar" "\
 Import an iCalendar file and append to a diary file.
 Argument ICAL-FILENAME output iCalendar file.
@@ -17621,8 +15886,7 @@ Argument DIARY-FILENAME input `diary-file'.
 Optional argument NON-MARKING determines whether events are created as
 non-marking or not.
 
-\(fn ICAL-FILENAME DIARY-FILENAME &optional NON-MARKING)" t nil)
-
+(fn ICAL-FILENAME DIARY-FILENAME &optional NON-MARKING)" t nil)
 (autoload 'icalendar-import-buffer "icalendar" "\
 Extract iCalendar events from current buffer.
 
@@ -17641,13 +15905,10 @@ Return code t means that importing worked well, 
return code nil
 means that an error has occurred.  Error messages will be in the
 buffer `*icalendar-errors*'.
 
-\(fn &optional DIARY-FILENAME DO-NOT-ASK NON-MARKING)" t nil)
-
+(fn &optional DIARY-FILENAME DO-NOT-ASK NON-MARKING)" t nil)
 (register-definition-prefixes "icalendar" '("icalendar-"))
 
-;;;***
 
-;;;### (autoloads nil "icomplete" "icomplete.el" (0 0 0 0))
 ;;; Generated autoloads from icomplete.el
 
 (defvar fido-mode nil "\
@@ -17657,9 +15918,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `fido-mode'.")
-
 (custom-autoload 'fido-mode "icomplete" nil)
-
 (autoload 'fido-mode "icomplete" "\
 An enhanced `icomplete-mode' that emulates `ido-mode'.
 
@@ -17680,8 +15939,7 @@ evaluate `(default-value \\='fido-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar icomplete-mode nil "\
 Non-nil if Icomplete mode is enabled.
 See the `icomplete-mode' command
@@ -17689,9 +15947,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `icomplete-mode'.")
-
 (custom-autoload 'icomplete-mode "icomplete" nil)
-
 (autoload 'icomplete-mode "icomplete" "\
 Toggle incremental minibuffer completion (Icomplete mode).
 
@@ -17722,8 +15978,7 @@ evaluate `(default-value \\='icomplete-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar icomplete-vertical-mode nil "\
 Non-nil if Icomplete-Vertical mode is enabled.
 See the `icomplete-vertical-mode' command
@@ -17731,9 +15986,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `icomplete-vertical-mode'.")
-
 (custom-autoload 'icomplete-vertical-mode "icomplete" nil)
-
 (autoload 'icomplete-vertical-mode "icomplete" "\
 Toggle vertical candidate display in `icomplete-mode' or `fido-mode'.
 
@@ -17758,8 +16011,7 @@ evaluate `(default-value \\='icomplete-vertical-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar fido-vertical-mode nil "\
 Non-nil if Fido-Vertical mode is enabled.
 See the `fido-vertical-mode' command
@@ -17767,9 +16019,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `fido-vertical-mode'.")
-
 (custom-autoload 'fido-vertical-mode "icomplete" nil)
-
 (autoload 'fido-vertical-mode "icomplete" "\
 Toggle vertical candidate display in `fido-mode'.
 
@@ -17790,17 +16040,14 @@ evaluate `(default-value \\='fido-vertical-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
+(fn &optional ARG)" t nil)
 (when (locate-library "obsolete/iswitchb")
  (autoload 'iswitchb-mode "iswitchb" "Toggle Iswitchb mode." t)
  (make-obsolete 'iswitchb-mode
    "use `icomplete-mode' or `ido-mode' instead." "24.4"))
-
 (register-definition-prefixes "icomplete" '("icomplete-"))
 
-;;;***
 
-;;;### (autoloads nil "icon" "progmodes/icon.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/icon.el
 
 (autoload 'icon-mode "icon" "\
@@ -17836,30 +16083,25 @@ Variables controlling indentation style:
 Turning on Icon mode calls the value of the variable `icon-mode-hook'
 with no args, if that value is non-nil.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "icon" '("beginning-of-icon-defun" 
"calculate-icon-indent" "electric-icon-brace" "end-of-icon-defun" "icon-" 
"indent-icon-exp" "mark-icon-function"))
 
-;;;***
 
-;;;### (autoloads nil "idlw-complete-structtag" 
"progmodes/idlw-complete-structtag.el"
-;;;;;;  (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/idle.el
+
+(register-definition-prefixes "semantic/idle" '("define-semantic-idle-service" 
"global-semantic-idle-summary-mode" "semantic-"))
+
+
 ;;; Generated autoloads from progmodes/idlw-complete-structtag.el
 
 (register-definition-prefixes "idlw-complete-structtag" '("idlwave-"))
 
-;;;***
 
-;;;### (autoloads nil "idlw-help" "progmodes/idlw-help.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/idlw-help.el
 
 (register-definition-prefixes "idlw-help" '("idlwave-"))
 
-;;;***
 
-;;;### (autoloads nil "idlw-shell" "progmodes/idlw-shell.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from progmodes/idlw-shell.el
 
 (autoload 'idlwave-shell "idlw-shell" "\
@@ -17878,26 +16120,20 @@ The buffer is put in `idlwave-shell-mode', providing 
commands for sending
 input and controlling the IDL job.  See help on `idlwave-shell-mode'.
 See also the variable `idlwave-shell-prompt-pattern'.
 
-\(Type \\[describe-mode] in the shell buffer for a list of commands.)
-
-\(fn &optional ARG)" t nil)
+(Type \\[describe-mode] in the shell buffer for a list of commands.)
 
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "idlw-shell" '("idlwave-"))
 
-;;;***
 
-;;;### (autoloads nil "idlw-toolbar" "progmodes/idlw-toolbar.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from progmodes/idlw-toolbar.el
 
-(register-definition-prefixes "idlw-toolbar" '("idlwave-toolbar-"))
+(register-definition-prefixes "idlw-toolbar" '("idlwave-toolbar"))
 
-;;;***
 
-;;;### (autoloads nil "idlwave" "progmodes/idlwave.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/idlwave.el
-(push (purecopy '(idlwave 6 1 22)) package--builtin-versions)
 
+(push (purecopy '(idlwave 6 1 22)) package--builtin-versions)
 (autoload 'idlwave-mode "idlwave" "\
 Major mode for editing IDL source files (version 6.1_em22).
 
@@ -18018,13 +16254,10 @@ The main features of this mode are
 
 \\{idlwave-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "idlwave" '("idlwave-"))
 
-;;;***
 
-;;;### (autoloads nil "ido" "ido.el" (0 0 0 0))
 ;;; Generated autoloads from ido.el
 
 (defvar ido-mode nil "\
@@ -18038,9 +16271,7 @@ The following values are possible:
 
 Setting this variable directly does not take effect;
 use either \\[customize] or the function `ido-mode'.")
-
 (custom-autoload 'ido-mode "ido" nil)
-
 (autoload 'ido-mode "ido" "\
 Toggle Ido mode on or off.
 With ARG, turn Ido mode on if arg is positive, off otherwise.
@@ -18051,8 +16282,7 @@ However, if ARG arg equals `files', remap only commands 
for files, or
 if it equals `buffers', remap only commands for buffer switching.
 This function also adds a hook to the minibuffer.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'ido-switch-buffer "ido" "\
 Switch to another buffer.
 The buffer is displayed according to `ido-default-buffer-method' -- the
@@ -18085,12 +16315,10 @@ RET   Select the buffer at the front of the list of 
matches.
 \\[ido-enter-find-file]        Drop into `ido-find-file'.
 \\[ido-kill-buffer-at-head]    Kill buffer at head of buffer list.
 \\[ido-toggle-ignore]  Toggle ignoring buffers listed in 
`ido-ignore-buffers'." t nil)
-
 (autoload 'ido-switch-buffer-other-window "ido" "\
 Switch to another buffer and show it in another window.
 The buffer name is selected interactively by typing a substring.
 For details of keybindings, see `ido-switch-buffer'." t nil)
-
 (autoload 'ido-display-buffer "ido" "\
 Display a buffer in another window but don't select it.
 
@@ -18101,33 +16329,27 @@ window.
 The buffer name is selected interactively by typing a substring.
 For details of keybindings, see `ido-switch-buffer'.
 
-\(fn &optional ACTION)" t nil)
-
+(fn &optional ACTION)" t nil)
 (autoload 'ido-display-buffer-other-frame "ido" "\
 Display a buffer preferably in another frame.
 The buffer name is selected interactively by typing a substring.
 For details of keybindings, see `ido-switch-buffer'." t nil)
-
 (autoload 'ido-kill-buffer "ido" "\
 Kill a buffer.
 The buffer name is selected interactively by typing a substring.
 For details of keybindings, see `ido-switch-buffer'." t nil)
-
 (autoload 'ido-insert-buffer "ido" "\
 Insert contents of a buffer in current buffer after point.
 The buffer name is selected interactively by typing a substring.
 For details of keybindings, see `ido-switch-buffer'." t nil)
-
 (autoload 'ido-switch-buffer-other-frame "ido" "\
 Switch to another buffer and show it in another frame.
 The buffer name is selected interactively by typing a substring.
 For details of keybindings, see `ido-switch-buffer'." t nil)
-
 (autoload 'ido-find-file-in-dir "ido" "\
 Switch to another file starting from DIR.
 
-\(fn DIR)" t nil)
-
+(fn DIR)" t nil)
 (autoload 'ido-find-file "ido" "\
 Edit file with name obtained via minibuffer.
 The file is displayed according to `ido-default-file-method' -- the
@@ -18171,72 +16393,58 @@ RET   Select the file at the front of the list of 
matches.
 \\[ido-completion-help]        Show list of matching files in separate window.
 \\[ido-toggle-ignore]  Toggle ignoring files listed in `ido-ignore-files'.
 \\[ido-reread-directory]       Reread the current directory." t nil)
-
 (autoload 'ido-find-file-other-window "ido" "\
 Switch to another file and show it in another window.
 The file name is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-find-alternate-file "ido" "\
 Find another file, select its buffer, kill previous buffer.
 The file name is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-find-alternate-file-other-window "ido" "\
 Find file as a replacement for the file in the next window.
 The file name is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-find-file-read-only "ido" "\
 Edit file read-only with name obtained via minibuffer.
 The file name is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-find-file-read-only-other-window "ido" "\
 Edit file read-only in other window with name obtained via minibuffer.
 The file name is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-find-file-read-only-other-frame "ido" "\
 Edit file read-only in other frame with name obtained via minibuffer.
 The file name is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-display-file "ido" "\
 Display a file in another window but don't select it.
 The file name is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-find-file-other-frame "ido" "\
 Switch to another file and show it in another frame.
 The file name is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-write-file "ido" "\
 Write current buffer to a file.
 The file name is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-insert-file "ido" "\
 Insert contents of file in current buffer.
 The file name is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-dired "ido" "\
 Call `dired' the Ido way.
 The directory is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-dired-other-window "ido" "\
 \"Edit\" a directory.  Like `ido-dired' but select in another window.
 The directory is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-dired-other-frame "ido" "\
 \"Edit\" a directory.  Like `ido-dired' but make a new frame.
 The directory is selected interactively by typing a substring.
 For details of keybindings, see `ido-find-file'." t nil)
-
 (autoload 'ido-read-buffer "ido" "\
 Ido replacement for the built-in `read-buffer'.
 Return the name of a buffer selected.
@@ -18246,22 +16454,19 @@ If REQUIRE-MATCH is non-nil, an existing buffer must 
be selected.
 Optional arg PREDICATE if non-nil is a function limiting the
 buffers that can be considered.
 
-\(fn PROMPT &optional DEFAULT REQUIRE-MATCH PREDICATE)" nil nil)
-
+(fn PROMPT &optional DEFAULT REQUIRE-MATCH PREDICATE)" nil nil)
 (autoload 'ido-read-file-name "ido" "\
 Ido replacement for the built-in `read-file-name'.
 Read file name, prompting with PROMPT and completing in directory DIR.
 See `read-file-name' for additional parameters.
 
-\(fn PROMPT &optional DIR DEFAULT-FILENAME MUSTMATCH INITIAL PREDICATE)" nil 
nil)
-
+(fn PROMPT &optional DIR DEFAULT-FILENAME MUSTMATCH INITIAL PREDICATE)" nil 
nil)
 (autoload 'ido-read-directory-name "ido" "\
 Ido replacement for the built-in `read-directory-name'.
 Read directory name, prompting with PROMPT and completing in directory DIR.
 See `read-directory-name' for additional parameters.
 
-\(fn PROMPT &optional DIR DEFAULT-DIRNAME MUSTMATCH INITIAL)" nil nil)
-
+(fn PROMPT &optional DIR DEFAULT-DIRNAME MUSTMATCH INITIAL)" nil nil)
 (autoload 'ido-completing-read "ido" "\
 Ido replacement for the built-in `completing-read'.
 Read a string in the minibuffer with Ido-style completion.
@@ -18278,13 +16483,15 @@ If INITIAL-INPUT is non-nil, insert it in the 
minibuffer initially,
 HIST, if non-nil, specifies a history list.
 DEF, if non-nil, is the default value.
 
-\(fn PROMPT CHOICES &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF 
INHERIT-INPUT-METHOD)" nil nil)
-
+(fn PROMPT CHOICES &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF 
INHERIT-INPUT-METHOD)" nil nil)
 (register-definition-prefixes "ido" '("ido-"))
 
-;;;***
 
-;;;### (autoloads nil "ielm" "ielm.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/symref/idutils.el
+
+(register-definition-prefixes "semantic/symref/idutils" 
'("semantic-symref-idutils--line-re"))
+
+
 ;;; Generated autoloads from ielm.el
 
 (autoload 'ielm "ielm" "\
@@ -18293,32 +16500,24 @@ Switches to the buffer named BUF-NAME if provided 
(`*ielm*' by default),
 or creates it if it does not exist.
 See `inferior-emacs-lisp-mode' for details.
 
-\(fn &optional BUF-NAME)" t nil)
-
+(fn &optional BUF-NAME)" t nil)
 (register-definition-prefixes "ielm" '("ielm-" "inferior-emacs-lisp-mode"))
 
-;;;***
 
-;;;### (autoloads nil "ietf-drums" "mail/ietf-drums.el" (0 0 0 0))
 ;;; Generated autoloads from mail/ietf-drums.el
 
 (register-definition-prefixes "ietf-drums" '("ietf-drums-"))
 
-;;;***
 
-;;;### (autoloads nil "ietf-drums-date" "mail/ietf-drums-date.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from mail/ietf-drums-date.el
 
 (register-definition-prefixes "ietf-drums-date" '("date-parse-error" 
"ietf-drums-"))
 
-;;;***
 
-;;;### (autoloads nil "iimage" "iimage.el" (0 0 0 0))
 ;;; Generated autoloads from iimage.el
 
-(define-obsolete-function-alias 'turn-on-iimage-mode 'iimage-mode "24.1")
-
+(define-obsolete-function-alias 'turn-on-iimage-mode 'iimage-mode "\
+24.1")
 (autoload 'iimage-mode "iimage" "\
 Toggle Iimage mode on or off.
 
@@ -18336,13 +16535,10 @@ evaluate `iimage-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "iimage" '("iimage-" "turn-off-iimage-mode"))
 
-;;;***
 
-;;;### (autoloads nil "image" "image.el" (0 0 0 0))
 ;;; Generated autoloads from image.el
 
 (autoload 'image-type-from-data "image" "\
@@ -18350,37 +16546,24 @@ Determine the image type from image data DATA.
 Value is a symbol specifying the image type or nil if type cannot
 be determined.
 
-\(fn DATA)" nil nil)
-
+(fn DATA)" nil nil)
 (autoload 'image-type-from-buffer "image" "\
 Determine the image type from data in the current buffer.
 Value is a symbol specifying the image type or nil if type cannot
 be determined." nil nil)
-
 (autoload 'image-type-from-file-header "image" "\
 Determine the type of image file FILE from its first few bytes.
 Value is a symbol specifying the image type, or nil if type cannot
 be determined.
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (autoload 'image-type-from-file-name "image" "\
 Determine the type of image file FILE from its name.
 Value is a symbol specifying the image type, or nil if type cannot
 be determined.
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (make-obsolete 'image-type-from-file-name 'image-supported-file-p '"29.1")
-
-(autoload 'image-supported-file-p "image" "\
-Say whether Emacs has native support for displaying TYPE.
-The value is a symbol specifying the image type, or nil if type
-cannot be determined (or if Emacs doesn't have built-in support
-for the image type).
-
-\(fn FILE)" nil nil)
-
 (autoload 'image-type "image" "\
 Determine and return image type.
 SOURCE is an image file name or image data.
@@ -18394,14 +16577,12 @@ data.  If DATA-P is a symbol with a name on the format
 `image/jpeg', that may be used as a hint to determine the image
 type if we can't otherwise guess it.
 
-\(fn SOURCE &optional TYPE DATA-P)" nil nil)
-
+(fn SOURCE &optional TYPE DATA-P)" nil nil)
 (autoload 'image-type-available-p "image" "\
 Return t if image type TYPE is available.
 Image types are symbols like `xbm' or `jpeg'.
 
-\(fn TYPE)" nil nil)
-
+(fn TYPE)" nil nil)
 (autoload 'image-type-auto-detected-p "image" "\
 Return t if the current buffer contains an auto-detectable image.
 This function is intended to be used from `magic-fallback-mode-alist'.
@@ -18411,7 +16592,6 @@ its beginning matches an image type in 
`image-type-header-regexps',
 and that image type is present in `image-type-auto-detectable' with a
 non-nil value.  If that value is non-nil, but not t, then the image type
 must be available." nil nil)
-
 (autoload 'create-image "image" "\
 Create an image.
 FILE-OR-DATA is an image file name or image data.
@@ -18437,8 +16617,7 @@ Image file names that are not absolute are searched for 
in the
 \"images\" sub-directory of `data-directory' and
 `x-bitmap-file-path' (in that order).
 
-\(fn FILE-OR-DATA &optional TYPE DATA-P &rest PROPS)" nil nil)
-
+(fn FILE-OR-DATA &optional TYPE DATA-P &rest PROPS)" nil nil)
 (autoload 'put-image "image" "\
 Put image IMAGE in front of POS in the current buffer.
 IMAGE must be an image created with `create-image' or `defimage'.
@@ -18452,8 +16631,7 @@ display it in the text area, a value of `left-margin' 
means
 display it in the left marginal area, a value of `right-margin'
 means display it in the right marginal area.
 
-\(fn IMAGE POS &optional STRING AREA)" nil nil)
-
+(fn IMAGE POS &optional STRING AREA)" nil nil)
 (autoload 'insert-image "image" "\
 Insert IMAGE into current buffer at point.
 IMAGE is displayed by inserting STRING into the current buffer
@@ -18477,8 +16655,7 @@ Normally `isearch' is able to search for STRING in the 
buffer
 even if it's hidden behind a displayed image.  If INHIBIT-ISEARCH
 is non-nil, this is inhibited.
 
-\(fn IMAGE &optional STRING AREA SLICE INHIBIT-ISEARCH)" nil nil)
-
+(fn IMAGE &optional STRING AREA SLICE INHIBIT-ISEARCH)" nil nil)
 (autoload 'insert-sliced-image "image" "\
 Insert IMAGE into current buffer at point.
 IMAGE is displayed by inserting STRING into the current buffer
@@ -18490,15 +16667,13 @@ display it in the left marginal area, a value of 
`right-margin'
 means display it in the right marginal area.
 The image is automatically split into ROWS x COLS slices.
 
-\(fn IMAGE &optional STRING AREA ROWS COLS)" nil nil)
-
+(fn IMAGE &optional STRING AREA ROWS COLS)" nil nil)
 (autoload 'remove-images "image" "\
 Remove images between START and END in BUFFER.
 Remove only images that were put in BUFFER with calls to `put-image'.
 BUFFER nil or omitted means use the current buffer.
 
-\(fn START END &optional BUFFER)" nil nil)
-
+(fn START END &optional BUFFER)" nil nil)
 (autoload 'find-image "image" "\
 Find an image, choosing one of a list of image specifications.
 
@@ -18520,8 +16695,7 @@ The image is looked for in `image-load-path'.
 
 Image files should not be larger than specified by `max-image-size'.
 
-\(fn SPECS &optional CACHE)" nil nil)
-
+(fn SPECS &optional CACHE)" nil nil)
 (autoload 'defimage "image" "\
 Define SYMBOL as an image, and return SYMBOL.
 
@@ -18542,12 +16716,9 @@ Example:
    (defimage test-image ((:type xpm :file \"~/test1.xpm\")
                          (:type xbm :file \"~/test1.xbm\")))
 
-\(fn SYMBOL SPECS &optional DOC)" nil t)
-
+(fn SYMBOL SPECS &optional DOC)" nil t)
 (function-put 'defimage 'doc-string-elt '3)
-
 (function-put 'defimage 'lisp-indent-function 'defun)
-
 (autoload 'imagemagick-register-types "image" "\
 Register file types that can be handled by ImageMagick.
 This function is called at startup, after loading the init file.
@@ -18559,26 +16730,19 @@ Emacs visits them in Image mode.  They are also added 
to
 recognizes these files as having image type `imagemagick'.
 
 If Emacs is compiled without ImageMagick support, this does nothing." nil nil)
-
 (autoload 'image-at-point-p "image" "\
 Return non-nil if there is an image at point." nil nil)
-
 (register-definition-prefixes "image" '("find-image--cache" "image" 
"unknown-image-type"))
 
-;;;***
 
-;;;### (autoloads nil "image-converter" "image/image-converter.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from image/image-converter.el
 
 (register-definition-prefixes "image-converter" '("image-convert"))
 
-;;;***
 
-;;;### (autoloads nil "image-dired" "image-dired.el" (0 0 0 0))
 ;;; Generated autoloads from image-dired.el
-(push (purecopy '(image-dired 0 4 11)) package--builtin-versions)
 
+(push (purecopy '(image-dired 0 4 11)) package--builtin-versions)
 (autoload 'image-dired-dired-toggle-marked-thumbs "image-dired" "\
 Toggle thumbnails in front of file names in the Dired buffer.
 If no marked file could be found, insert or hide thumbnails on the
@@ -18586,8 +16750,7 @@ current line.  ARG, if non-nil, specifies the files to 
use instead
 of the marked files.  If ARG is an integer, use the next ARG (or
 previous -ARG, if ARG<0) files.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'image-dired-dired-with-window-configuration "image-dired" "\
 Open directory DIR and create a default window configuration.
 
@@ -18606,8 +16769,7 @@ If called with prefix argument ARG, skip splitting of 
windows.
 The current window configuration is saved and can be restored by
 calling `image-dired-restore-window-configuration'.
 
-\(fn DIR &optional ARG)" t nil)
-
+(fn DIR &optional ARG)" t nil)
 (autoload 'image-dired-display-thumbs "image-dired" "\
 Display thumbnails of all marked files, in `image-dired-thumbnail-buffer'.
 If a thumbnail image does not exist for a file, it is created on the
@@ -18629,8 +16791,7 @@ used or not.  If non-nil, use `display-buffer' instead 
of
 `image-dired-previous-line-and-display' where we do not want the
 thumbnail buffer to be selected.
 
-\(fn &optional ARG APPEND DO-NOT-POP)" t nil)
-
+(fn &optional ARG APPEND DO-NOT-POP)" t nil)
 (autoload 'image-dired-show-all-from-dir "image-dired" "\
 Make a thumbnail buffer for all images in DIR and display it.
 Any file matching `image-file-name-regexp' is considered an image
@@ -18641,24 +16802,19 @@ If the number of image files in DIR exceeds
 before creating the thumbnail buffer.  If that variable is nil,
 never ask for confirmation.
 
-\(fn DIR)" t nil)
-
+(fn DIR)" t nil)
 (defalias 'image-dired 'image-dired-show-all-from-dir)
-
 (autoload 'image-dired-tag-files "image-dired" "\
 Tag marked file(s) in Dired.  With prefix ARG, tag file at point.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'image-dired-delete-tag "image-dired" "\
 Remove tag for selected file(s).
 With prefix argument ARG, remove tag from file at point.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'image-dired-jump-thumbnail-buffer "image-dired" "\
 Jump to thumbnail buffer." t nil)
-
 (autoload 'image-dired-minor-mode "image-dired" "\
 Setup easy-to-use keybindings for the commands to be used in Dired mode.
 
@@ -18680,54 +16836,45 @@ evaluate `image-dired-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'image-dired-display-thumbs-append "image-dired" "\
 Append thumbnails to `image-dired-thumbnail-buffer'." t nil)
-
 (autoload 'image-dired-display-thumb "image-dired" "\
 Shorthand for `image-dired-display-thumbs' with prefix argument." t nil)
-
 (autoload 'image-dired-dired-display-external "image-dired" "\
 Display file at point using an external viewer." t nil)
-
 (autoload 'image-dired-dired-display-image "image-dired" "\
 Display current image file.
 See documentation for `image-dired-display-image' for more information.
 With prefix argument ARG, display image in its original size.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'image-dired-dired-comment-files "image-dired" "\
 Add comment to current or marked files in Dired." t nil)
-
 (autoload 'image-dired-mark-tagged-files "image-dired" "\
-Use regexp to mark files with matching tag.
+Use REGEXP to mark files with matching tag.
 A `tag' is a keyword, a piece of meta data, associated with an
 image file and stored in image-dired's database file.  This command
 lets you input a regexp and this will be matched against all tags
 on all image files in the database file.  The files that have a
-matching tag will be marked in the Dired buffer." t nil)
+matching tag will be marked in the Dired buffer.
 
+(fn REGEXP)" t nil)
 (autoload 'image-dired-dired-edit-comment-and-tags "image-dired" "\
 Edit comment and tags of current or marked image files.
 Edit comment and tags for all marked image files in an
 easy-to-use form." t nil)
-
 (autoload 'image-dired-bookmark-jump "image-dired" "\
 Default bookmark handler for Image-Dired buffers.
 
-\(fn BOOKMARK)" nil nil)
-
-(define-obsolete-function-alias 'tumme #'image-dired "24.4")
-
-(define-obsolete-function-alias 'image-dired-setup-dired-keybindings 
#'image-dired-minor-mode "26.1")
-
+(fn BOOKMARK)" nil nil)
+(define-obsolete-function-alias 'tumme #'image-dired "\
+24.4")
+(define-obsolete-function-alias 'image-dired-setup-dired-keybindings 
#'image-dired-minor-mode "\
+26.1")
 (register-definition-prefixes "image-dired" '("image-dired-"))
 
-;;;***
 
-;;;### (autoloads nil "image-file" "image-file.el" (0 0 0 0))
 ;;; Generated autoloads from image-file.el
 
 (defvar image-file-name-extensions (purecopy '("png" "jpeg" "jpg" "gif" "tiff" 
"tif" "xbm" "xpm" "pbm" "pgm" "ppm" "pnm" "svg" "webp")) "\
@@ -18739,9 +16886,7 @@ See `auto-image-file-mode'; if `auto-image-file-mode' 
is enabled,
 setting this variable directly does not take effect unless
 `auto-image-file-mode' is re-enabled; this happens automatically when
 the variable is set using \\[customize].")
-
 (custom-autoload 'image-file-name-extensions "image-file" nil)
-
 (defvar image-file-name-regexps nil "\
 List of regexps matching image-file filenames.
 Filenames matching one of these regexps are considered image files,
@@ -18751,20 +16896,16 @@ See function `auto-image-file-mode'; if 
`auto-image-file-mode' is
 enabled, setting this variable directly does not take effect unless
 `auto-image-file-mode' is re-enabled; this happens automatically when
 the variable is set using \\[customize].")
-
 (custom-autoload 'image-file-name-regexps "image-file" nil)
-
 (autoload 'image-file-name-regexp "image-file" "\
 Return a regular expression matching image-file filenames." nil nil)
-
 (autoload 'insert-image-file "image-file" "\
 Insert the image file FILE into the current buffer.
 Optional arguments VISIT, BEG, END, and REPLACE are interpreted
 as for the command `insert-file-contents'.  Return list of
 absolute file name and number of characters inserted.
 
-\(fn FILE &optional VISIT BEG END REPLACE)" nil nil)
-
+(fn FILE &optional VISIT BEG END REPLACE)" nil nil)
 (defvar auto-image-file-mode nil "\
 Non-nil if Auto-Image-File mode is enabled.
 See the `auto-image-file-mode' command
@@ -18772,9 +16913,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `auto-image-file-mode'.")
-
 (custom-autoload 'auto-image-file-mode "image-file" nil)
-
 (autoload 'auto-image-file-mode "image-file" "\
 Toggle visiting of image files as images (Auto Image File mode).
 
@@ -18796,13 +16935,10 @@ evaluate `(default-value \\='auto-image-file-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "image-file" '("image-file-"))
 
-;;;***
 
-;;;### (autoloads nil "image-mode" "image-mode.el" (0 0 0 0))
 ;;; Generated autoloads from image-mode.el
 
 (autoload 'image-mode "image-mode" "\
@@ -18812,7 +16948,6 @@ as an image and display as text or hex.
 
 Key bindings:
 \\{image-mode-map}" t nil)
-
 (autoload 'image-minor-mode "image-mode" "\
 Toggle Image minor mode in this buffer.
 
@@ -18834,30 +16969,28 @@ evaluate `image-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'image-mode-to-text "image-mode" "\
 Set a non-image mode as major mode in combination with image minor mode.
 A non-mage major mode found from `auto-mode-alist' or fundamental mode
 displays an image file as text." nil nil)
-
 (autoload 'image-bookmark-jump "image-mode" "\
 
 
-\(fn BMK)" nil nil)
-
+(fn BMK)" nil nil)
 (register-definition-prefixes "image-mode" '("image-"))
 
-;;;***
 
-;;;### (autoloads nil "imap" "net/imap.el" (0 0 0 0))
 ;;; Generated autoloads from net/imap.el
 
 (register-definition-prefixes "imap" '("imap-"))
 
-;;;***
 
-;;;### (autoloads nil "imenu" "imenu.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/imenu.el
+
+(register-definition-prefixes "semantic/imenu" '("semantic-"))
+
+
 ;;; Generated autoloads from imenu.el
 
 (defvar imenu-sort-function nil "\
@@ -18873,10 +17006,8 @@ Set it to `imenu--sort-by-name' if you want alphabetic 
sorting.
 
 The function should take two arguments and return t if the first
 element should come before the second.  The arguments are cons cells;
-\(NAME . POSITION).  Look at `imenu--sort-by-name' for an example.")
-
+(NAME . POSITION).  Look at `imenu--sort-by-name' for an example.")
 (custom-autoload 'imenu-sort-function "imenu" t)
-
 (defvar-local imenu-generic-expression nil "\
 List of definition matchers for creating an Imenu index.
 Each element of this list should have the form
@@ -18912,7 +17043,6 @@ used by `fortran-mode' with `imenu-syntax-alist' set 
locally so that
 characters which normally have \"symbol\" syntax are considered to have
 \"word\" syntax during matching.")
 (put 'imenu-generic-expression 'risky-local-variable t)
-
 (defvar-local imenu-create-index-function 'imenu-default-create-index-function 
"\
 The function to use for creating an index alist of the current buffer.
 
@@ -18921,7 +17051,6 @@ an index alist of the current buffer.  The function is
 called within a `save-excursion'.
 
 See `imenu--index-alist' for the format of the buffer index alist.")
-
 (defvar-local imenu-prev-index-position-function 'beginning-of-defun "\
 Function for finding the next index position.
 
@@ -18932,14 +17061,12 @@ file.
 
 The function should leave point at the place to be connected to the
 index and it should return nil when it doesn't find another index.")
-
 (defvar-local imenu-extract-index-name-function nil "\
 Function for extracting the index item name, given a position.
 
 This function is called after `imenu-prev-index-position-function'
 finds a position for an index item, with point at that position.
 It should return the name for that index item.")
-
 (defvar-local imenu-name-lookup-function nil "\
 Function to compare string with index item.
 
@@ -18950,12 +17077,10 @@ If nil, comparison is done with `string='.
 Set this to some other function for more advanced comparisons,
 such as \"begins with\" or \"name matches and number of
 arguments match\".")
-
 (defvar-local imenu-default-goto-function 'imenu-default-goto-function "\
 The default function called when selecting an Imenu item.
 The function in this variable is called when selecting a normal index-item.")
 (put 'imenu--index-alist 'risky-local-variable t)
-
 (defvar-local imenu-syntax-alist nil "\
 Alist of syntax table modifiers to use while in `imenu--generic-function'.
 
@@ -18966,70 +17091,66 @@ a string, all the characters in the string get the 
specified syntax.
 This is typically used to give word syntax to characters which
 normally have symbol syntax to simplify `imenu-expression'
 and speed-up matching.")
-
 (defvar-local imenu-case-fold-search t "\
 Defines whether `imenu--generic-function' should fold case when matching.
 
 This variable should be set (only) by initialization code
 for modes which use `imenu--generic-function'.  If it is not set, but
 `font-lock-defaults' is set, then font-lock's setting is used.")
-
 (autoload 'imenu-add-to-menubar "imenu" "\
 Add an `imenu' entry to the menu bar for the current buffer.
 NAME is a string used to name the menu bar item.
 See the command `imenu' for more information.
 
-\(fn NAME)" t nil)
-
+(fn NAME)" t nil)
 (autoload 'imenu-add-menubar-index "imenu" "\
 Add an Imenu \"Index\" entry on the menu bar for the current buffer.
 
 A trivial interface to `imenu-add-to-menubar' suitable for use in a hook." t 
nil)
-
 (autoload 'imenu "imenu" "\
 Jump to a place in the buffer chosen using a buffer menu or mouse menu.
 INDEX-ITEM specifies the position.  See `imenu-choose-buffer-index'
 for more information.
 
-\(fn INDEX-ITEM)" t nil)
-
+(fn INDEX-ITEM)" t nil)
 (register-definition-prefixes "imenu" '("imenu-"))
 
-;;;***
 
-;;;### (autoloads nil "ind-util" "language/ind-util.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/decorate/include.el
+
+(register-definition-prefixes "semantic/decorate/include" 
'("semantic-decoration-"))
+
+
 ;;; Generated autoloads from language/ind-util.el
 
 (autoload 'indian-compose-region "ind-util" "\
 Compose the region according to `composition-function-table'.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'indian-compose-string "ind-util" "\
 
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (autoload 'in-is13194-post-read-conversion "ind-util" "\
 
 
-\(fn LEN)" nil nil)
-
+(fn LEN)" nil nil)
 (autoload 'in-is13194-pre-write-conversion "ind-util" "\
 
 
-\(fn FROM TO)" nil nil)
-
+(fn FROM TO)" nil nil)
 (autoload 'indian-2-column-to-ucs-region "ind-util" "\
 Convert old Emacs Devanagari characters to UCS.
 
-\(fn FROM TO)" t nil)
+(fn FROM TO)" t nil)
+(register-definition-prefixes "ind-util" '("combinatorial" "indian-" 
"is13194-"))
+
+
+;;; Generated autoloads from leim/quail/indian.el
 
-(register-definition-prefixes "ind-util" '("indian-" "is13194-"))
+(register-definition-prefixes "quail/indian" '("indian-mlm-mozhi-u" 
"inscript-" "quail-"))
 
-;;;***
 
-;;;### (autoloads nil "inf-lisp" "progmodes/inf-lisp.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/inf-lisp.el
 
 (autoload 'inferior-lisp "inf-lisp" "\
@@ -19044,17 +17165,13 @@ of `inferior-lisp-program').  Runs the hooks from
 If any parts of the command name contains spaces, they should be
 quoted using shell quote syntax.
 
-\(Type \\[describe-mode] in the process buffer for a list of commands.)
-
-\(fn CMD)" t nil)
+(Type \\[describe-mode] in the process buffer for a list of commands.)
 
+(fn CMD)" t nil)
 (defalias 'run-lisp 'inferior-lisp)
-
 (register-definition-prefixes "inf-lisp" '("inferior-lisp-" "lisp-" 
"switch-to-lisp"))
 
-;;;***
 
-;;;### (autoloads nil "info" "info.el" (0 0 0 0))
 ;;; Generated autoloads from info.el
 
 (defvar Info-default-directory-list nil "\
@@ -19072,15 +17189,12 @@ comes from the variable `Info-directory-list'.
 This variable is used as the default for initializing
 `Info-directory-list' when Info is started, unless the
 environment variable INFOPATH is set.")
-
 (custom-autoload 'Info-default-directory-list "info" t)
-
 (autoload 'info-other-window "info" "\
 Like `info' but show the Info buffer in another window.
 
-\(fn &optional FILE-OR-NODE BUFFER)" t nil)
+(fn &optional FILE-OR-NODE BUFFER)" t nil)
  (put 'info 'info-file (purecopy "emacs"))
-
 (autoload 'info "info" "\
 Enter Info, the documentation browser.
 Optional argument FILE-OR-NODE specifies the file to examine;
@@ -19103,29 +17217,23 @@ in all the directories in that path.
 
 See a list of available Info commands in `Info-mode'.
 
-\(fn &optional FILE-OR-NODE BUFFER)" t nil)
-
+(fn &optional FILE-OR-NODE BUFFER)" t nil)
 (autoload 'info-emacs-manual "info" "\
 Display the Emacs manual in Info mode." t nil)
-
 (autoload 'info-emacs-bug "info" "\
 Display the \"Reporting Bugs\" section of the Emacs manual in Info mode." t 
nil)
-
 (autoload 'info-standalone "info" "\
 Run Emacs as a standalone Info reader.
 Usage:  emacs -f info-standalone [filename]
 In standalone mode, \\<Info-mode-map>\\[quit-window] exits Emacs itself." nil 
nil)
-
 (autoload 'Info-on-current-buffer "info" "\
 Use Info mode to browse the current Info buffer.
 With a prefix arg, this queries for the node name to visit first;
 otherwise, that defaults to `Top'.
 
-\(fn &optional NODENAME)" t nil)
-
+(fn &optional NODENAME)" t nil)
 (autoload 'Info-directory "info" "\
 Go to the Info directory node." t nil)
-
 (autoload 'Info-index "info" "\
 Look up a string TOPIC in the index for this manual and go to that entry.
 If there are no exact matches to the specified topic, this chooses
@@ -19133,24 +17241,21 @@ the first match which is a case-insensitive substring 
of a topic.
 Use the \\<Info-mode-map>\\[Info-index-next] command to see the other matches.
 Give an empty topic name to go to the Index node itself.
 
-\(fn TOPIC)" t nil)
-
+(fn TOPIC)" t nil)
 (autoload 'info-apropos "info" "\
 Search indices of all known Info files on your system for STRING.
 If REGEXP (interactively, the prefix), use a regexp match.
 
 Display a menu of the possible matches.
 
-\(fn STRING &optional REGEXP)" t nil)
-
+(fn STRING &optional REGEXP)" t nil)
 (autoload 'info-finder "info" "\
 Display descriptions of the keywords in the Finder virtual manual.
 In interactive use, a prefix argument directs this command to read
 a list of keywords separated by comma.  After that, it displays a node
 with a list of packages that contain all specified keywords.
 
-\(fn &optional KEYWORDS)" t nil)
-
+(fn &optional KEYWORDS)" t nil)
 (autoload 'Info-mode "info" "\
 Info mode provides commands for browsing through the Info documentation tree.
 Documentation in Info is divided into \"nodes\", each of which discusses
@@ -19214,9 +17319,8 @@ Advanced commands:
 \\[universal-argument] \\[info]        Move to new Info file with completion.
 \\[universal-argument] N \\[info]      Select Info buffer with prefix number 
in the name *info*<N>.
 
-\(fn)" t nil)
+(fn)" t nil)
  (put 'Info-goto-emacs-command-node 'info-file (purecopy "emacs"))
-
 (autoload 'Info-goto-emacs-command-node "info" "\
 Go to the Info node in the Emacs manual for command COMMAND.
 The command is found by looking up in Emacs manual's indices
@@ -19224,9 +17328,8 @@ or in another manual found via COMMAND's `info-file' 
property or
 the variable `Info-file-list-for-emacs'.
 COMMAND must be a symbol or string.
 
-\(fn COMMAND)" t nil)
+(fn COMMAND)" t nil)
  (put 'Info-goto-emacs-key-command-node 'info-file (purecopy "emacs"))
-
 (autoload 'Info-goto-emacs-key-command-node "info" "\
 Go to the node in the Emacs manual which describes the command bound to KEY.
 KEY is a string.
@@ -19235,18 +17338,15 @@ The command is found by looking up in Emacs manual's 
indices
 or in another manual found via COMMAND's `info-file' property or
 the variable `Info-file-list-for-emacs'.
 
-\(fn KEY)" t nil)
-
+(fn KEY)" t nil)
 (autoload 'Info-speedbar-browser "info" "\
 Initialize speedbar to display an Info node browser.
 This will add a speedbar major display mode." t nil)
-
 (autoload 'Info-bookmark-jump "info" "\
 This implements the `handler' function interface for the record
 type returned by `Info-bookmark-make-record', which see.
 
-\(fn BMK)" nil nil)
-
+(fn BMK)" nil nil)
 (autoload 'info-display-manual "info" "\
 Display an Info buffer displaying MANUAL.
 If there is an existing Info buffer for MANUAL, display it.
@@ -19254,13 +17354,10 @@ Otherwise, visit the manual in a new Info buffer.  In 
interactive
 use, a prefix argument directs this command to limit the
 completion alternatives to currently visited manuals.
 
-\(fn MANUAL)" t nil)
-
+(fn MANUAL)" t nil)
 (register-definition-prefixes "info" '("Info-" "info-"))
 
-;;;***
 
-;;;### (autoloads nil "info-look" "info-look.el" (0 0 0 0))
 ;;; Generated autoloads from info-look.el
 
 (autoload 'info-lookup-reset "info-look" "\
@@ -19269,7 +17366,6 @@ This command is useful if the user wants to start at 
the beginning without
 quitting Emacs, for example, after some Info documents were updated on the
 system." t nil)
  (put 'info-lookup-symbol 'info-file "emacs")
-
 (autoload 'info-lookup-symbol "info-look" "\
 Look up and display documentation of SYMBOL in the relevant Info manual.
 SYMBOL should be an identifier: a function or method, a macro, a variable,
@@ -19288,9 +17384,8 @@ always prompts for MODE.
 Is SAME-WINDOW, try to reuse the current window instead of
 popping up a new one.
 
-\(fn SYMBOL &optional MODE SAME-WINDOW)" t nil)
+(fn SYMBOL &optional MODE SAME-WINDOW)" t nil)
  (put 'info-lookup-file 'info-file "emacs")
-
 (autoload 'info-lookup-file "info-look" "\
 Look up and display documentation of FILE in the relevant Info manual.
 FILE should be the name of a file; a notable example is a standard header
@@ -19306,26 +17401,21 @@ mode doesn't have any Info manuals known to Emacs, 
the command will
 prompt for MODE to use, with completion.  With prefix arg, the command
 always prompts for MODE.
 
-\(fn FILE &optional MODE)" t nil)
-
+(fn FILE &optional MODE)" t nil)
 (autoload 'info-complete-symbol "info-look" "\
 Perform completion on symbol preceding point.
 
-\(fn &optional MODE)" t nil)
-
+(fn &optional MODE)" t nil)
 (autoload 'info-complete-file "info-look" "\
 Perform completion on file preceding point.
 
-\(fn &optional MODE)" t nil)
-
+(fn &optional MODE)" t nil)
 (register-definition-prefixes "info-look" '("info-"))
 
-;;;***
 
-;;;### (autoloads nil "info-xref" "info-xref.el" (0 0 0 0))
 ;;; Generated autoloads from info-xref.el
-(push (purecopy '(info-xref 3)) package--builtin-versions)
 
+(push (purecopy '(info-xref 3)) package--builtin-versions)
 (autoload 'info-xref-check "info-xref" "\
 Check external references in FILENAME, an info document.
 Interactively from an `Info-mode' or `texinfo-mode' buffer the
@@ -19352,8 +17442,7 @@ not external references, which makes it rather easy for 
mistakes
 to creep in or node name changes to go unnoticed.
 `Info-validate' doesn't check external references either.
 
-\(fn FILENAME)" t nil)
-
+(fn FILENAME)" t nil)
 (autoload 'info-xref-check-all "info-xref" "\
 Check external references in all info documents in the info path.
 `Info-directory-list' and `Info-additional-directory-list' are
@@ -19366,7 +17455,6 @@ particular the Emacs manuals normally don't.  If you 
have a
 source code directory in `Info-directory-list' then a lot of
 extraneous files might be read.  This will be time consuming but
 should be harmless." t nil)
-
 (autoload 'info-xref-check-all-custom "info-xref" "\
 Check info references in all customize groups and variables.
 Info references can be in `custom-manual' or `info-link' entries
@@ -19375,7 +17463,6 @@ of the `custom-links' for a variable.
 Any `custom-load' autoloads in variables are loaded in order to
 get full link information.  This will be a lot of Lisp packages
 and can take a long time." t nil)
-
 (autoload 'info-xref-docstrings "info-xref" "\
 Check docstring info node references in source files.
 The given files are searched for docstring hyperlinks like
@@ -19397,25 +17484,19 @@ and links can be in the file commentary or elsewhere 
too.  Even
 .elc files can usually be checked successfully if you don't have
 the sources handy.
 
-\(fn FILENAME-LIST)" t nil)
-
+(fn FILENAME-LIST)" t nil)
 (register-definition-prefixes "info-xref" '("info-xref-"))
 
-;;;***
 
-;;;### (autoloads nil "informat" "informat.el" (0 0 0 0))
 ;;; Generated autoloads from informat.el
 
 (autoload 'Info-tagify "informat" "\
 Create or update Info file tag table in current buffer or in a region.
 
-\(fn &optional INPUT-BUFFER-NAME)" t nil)
-
+(fn &optional INPUT-BUFFER-NAME)" t nil)
 (defvar Info-split-threshold 262144 "\
 The number of characters by which `Info-split' splits an info file.")
-
 (custom-autoload 'Info-split-threshold "informat" t)
-
 (autoload 'Info-split "informat" "\
 Split an info file into an indirect file plus bounded-size subfiles.
 Each subfile will be up to the number of characters that
@@ -19429,22 +17510,17 @@ The subfiles are written in the same directory the 
original file is
 in, with names generated by appending `-' and a number to the original
 file name.  The indirect file still functions as an Info file, but it
 contains just the tag table and a directory of subfiles." t nil)
-
 (autoload 'Info-validate "informat" "\
 Check current buffer for validity as an Info file.
 Check that every node pointer points to an existing node." t nil)
-
 (autoload 'batch-info-validate "informat" "\
 Run `Info-validate' on the files remaining on the command line.
 Must be used only with -batch, and kills Emacs on completion.
 Each file will be processed even if an error occurred previously.
 For example, invoke \"emacs -batch -f batch-info-validate $info/ ~/*.info\"" 
nil nil)
-
 (register-definition-prefixes "informat" '("Info-validate-"))
 
-;;;***
 
-;;;### (autoloads nil "inline" "emacs-lisp/inline.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/inline.el
 
 (autoload 'define-inline "inline" "\
@@ -19453,62 +17529,53 @@ Define an inline function NAME with arguments ARGS 
and body in BODY.
 This is like `defmacro', but has several advantages.
 See Info node `(elisp)Defining Functions' for more details.
 
-\(fn NAME ARGS &rest BODY)" nil t)
-
+(fn NAME ARGS &rest BODY)" nil t)
 (function-put 'define-inline 'lisp-indent-function 'defun)
-
 (function-put 'define-inline 'doc-string-elt '3)
-
 (register-definition-prefixes "inline" '("inline-"))
 
-;;;***
 
-;;;### (autoloads nil "isearch-x" "international/isearch-x.el" (0
-;;;;;;  0 0 0))
+;;; Generated autoloads from cedet/srecode/insert.el
+
+(register-definition-prefixes "srecode/insert" '("srecode-"))
+
+
+;;; Generated autoloads from leim/quail/ipa.el
+
+(register-definition-prefixes "quail/ipa" '("ipa-x-sampa-"))
+
+
 ;;; Generated autoloads from international/isearch-x.el
 
 (autoload 'isearch-toggle-specified-input-method "isearch-x" "\
 Select an input method and turn it on in interactive search." t nil)
-
 (autoload 'isearch-toggle-input-method "isearch-x" "\
 Toggle input method in interactive search." t nil)
-
 (autoload 'isearch-transient-input-method "isearch-x" "\
 Activate transient input method in interactive search." t nil)
-
 (autoload 'isearch-process-search-multibyte-characters "isearch-x" "\
 
 
-\(fn LAST-CHAR &optional COUNT)" nil nil)
-
+(fn LAST-CHAR &optional COUNT)" nil nil)
 (register-definition-prefixes "isearch-x" '("isearch-"))
 
-;;;***
 
-;;;### (autoloads nil "isearchb" "isearchb.el" (0 0 0 0))
 ;;; Generated autoloads from isearchb.el
-(push (purecopy '(isearchb 1 5)) package--builtin-versions)
 
+(push (purecopy '(isearchb 1 5)) package--builtin-versions)
 (autoload 'isearchb-activate "isearchb" "\
 Active isearchb mode for subsequent alphanumeric keystrokes.
 Executing this command again will terminate the search; or, if
 the search has not yet begun, will toggle to the last buffer
 accessed via isearchb." t nil)
-
 (register-definition-prefixes "isearchb" '("isearchb"))
 
-;;;***
 
-;;;### (autoloads nil "iso-ascii" "international/iso-ascii.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from international/iso-ascii.el
 
 (register-definition-prefixes "iso-ascii" '("iso-ascii-"))
 
-;;;***
 
-;;;### (autoloads nil "iso-cvt" "international/iso-cvt.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from international/iso-cvt.el
 
 (autoload 'iso-spanish "iso-cvt" "\
@@ -19517,112 +17584,90 @@ Translate the region between FROM and TO using the 
table
 `iso-spanish-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist').
 
-\(fn FROM TO &optional BUFFER)" t nil)
-
+(fn FROM TO &optional BUFFER)" t nil)
 (autoload 'iso-german "iso-cvt" "\
 Translate net conventions for German to ISO 8859-1.
 Translate the region FROM and TO using the table
 `iso-german-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist').
 
-\(fn FROM TO &optional BUFFER)" t nil)
-
+(fn FROM TO &optional BUFFER)" t nil)
 (autoload 'iso-iso2tex "iso-cvt" "\
 Translate ISO 8859-1 characters to TeX sequences.
 Translate the region between FROM and TO using the table
 `iso-iso2tex-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist').
 
-\(fn FROM TO &optional BUFFER)" t nil)
-
+(fn FROM TO &optional BUFFER)" t nil)
 (autoload 'iso-tex2iso "iso-cvt" "\
 Translate TeX sequences to ISO 8859-1 characters.
 Translate the region between FROM and TO using the table
 `iso-tex2iso-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist').
 
-\(fn FROM TO &optional BUFFER)" t nil)
-
+(fn FROM TO &optional BUFFER)" t nil)
 (autoload 'iso-gtex2iso "iso-cvt" "\
 Translate German TeX sequences to ISO 8859-1 characters.
 Translate the region between FROM and TO using the table
 `iso-gtex2iso-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist').
 
-\(fn FROM TO &optional BUFFER)" t nil)
-
+(fn FROM TO &optional BUFFER)" t nil)
 (autoload 'iso-iso2gtex "iso-cvt" "\
 Translate ISO 8859-1 characters to German TeX sequences.
 Translate the region between FROM and TO using the table
 `iso-iso2gtex-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist').
 
-\(fn FROM TO &optional BUFFER)" t nil)
-
+(fn FROM TO &optional BUFFER)" t nil)
 (autoload 'iso-iso2duden "iso-cvt" "\
 Translate ISO 8859-1 characters to Duden sequences.
 Translate the region between FROM and TO using the table
 `iso-iso2duden-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist').
 
-\(fn FROM TO &optional BUFFER)" t nil)
-
+(fn FROM TO &optional BUFFER)" t nil)
 (autoload 'iso-iso2sgml "iso-cvt" "\
 Translate ISO 8859-1 characters in the region to SGML entities.
 Use entities from \"ISO 8879:1986//ENTITIES Added Latin 1//EN\".
 Optional arg BUFFER is ignored (for use in `format-alist').
 
-\(fn FROM TO &optional BUFFER)" t nil)
-
+(fn FROM TO &optional BUFFER)" t nil)
 (autoload 'iso-sgml2iso "iso-cvt" "\
 Translate SGML entities in the region to ISO 8859-1 characters.
 Use entities from \"ISO 8879:1986//ENTITIES Added Latin 1//EN\".
 Optional arg BUFFER is ignored (for use in `format-alist').
 
-\(fn FROM TO &optional BUFFER)" t nil)
-
+(fn FROM TO &optional BUFFER)" t nil)
 (autoload 'iso-cvt-read-only "iso-cvt" "\
 Warn that format is read-only.
 
-\(fn &rest IGNORE)" t nil)
-
+(fn &rest IGNORE)" t nil)
 (autoload 'iso-cvt-write-only "iso-cvt" "\
 Warn that format is write-only.
 
-\(fn &rest IGNORE)" t nil)
-
+(fn &rest IGNORE)" t nil)
 (autoload 'iso-cvt-define-menu "iso-cvt" "\
 Add submenus to the File menu, to convert to and from various formats." t nil)
-
 (register-definition-prefixes "iso-cvt" '("iso-"))
 
-;;;***
 
-;;;### (autoloads nil "iso8601" "calendar/iso8601.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/iso8601.el
 
 (register-definition-prefixes "iso8601" '("iso8601-"))
 
-;;;***
 
-;;;### (autoloads nil "ispell" "textmodes/ispell.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/ispell.el
 
 (put 'ispell-check-comments 'safe-local-variable (lambda (a) (memq a '(nil t 
exclusive))))
-
 (defvar ispell-personal-dictionary nil "\
 File name of your personal spelling dictionary, or nil.
 If nil, the default personal dictionary for your spelling checker is used.")
-
 (custom-autoload 'ispell-personal-dictionary "ispell" t)
-
 (put 'ispell-local-dictionary 'safe-local-variable 'string-or-null-p)
-
 (defconst ispell-menu-map (let ((map (make-sparse-keymap "Spell"))) 
(define-key map [ispell-change-dictionary] `(menu-item ,(purecopy "Change 
Dictionary...") ispell-change-dictionary :help ,(purecopy "Supply explicit 
dictionary file name"))) (define-key map [ispell-kill-ispell] `(menu-item 
,(purecopy "Kill Process") (lambda nil (interactive) (ispell-kill-ispell nil 
'clear)) :enable (and (boundp 'ispell-process) ispell-process (eq 
(ispell-process-status) 'run)) :help ,(purecopy "Terminate [...]
 Key map for ispell menu.")
-
 (fset 'ispell-menu-map (symbol-value 'ispell-menu-map))
-
 (defvar ispell-skip-region-alist `((ispell-words-keyword forward-line) 
(ispell-dictionary-keyword forward-line) (ispell-pdict-keyword forward-line) 
(ispell-parsing-keyword forward-line) (,(purecopy "^---*BEGIN PGP [A-Z ]*--*") 
\, (purecopy "^---*END PGP [A-Z ]*--*")) (,(purecopy "^begin [0-9][0-9][0-9] [^ 
\11]+$") \, (purecopy "\nend\n")) (,(purecopy "^%!PS-Adobe-[123].0") \, 
(purecopy "\n%%EOF\n")) (,(purecopy "^---* \\(Start of \\)?[Ff]orwarded 
[Mm]essage") \, (purecopy "^---* End of [ [...]
 Alist expressing beginning and end of regions not to spell check.
 The alist key must be a regular expression.
@@ -19631,7 +17676,6 @@ Valid forms include:
   (KEY . REGEXP) - skip to the end of REGEXP.  REGEXP may be string or symbol.
   (KEY REGEXP) - skip to end of REGEXP.  REGEXP must be a string.
   (KEY FUNCTION ARGS) - FUNCTION called with ARGS returns end of region.")
-
 (defvar ispell-tex-skip-alists (purecopy '((("\\\\addcontentsline" 
ispell-tex-arg-end 2) ("\\\\add\\(tocontents\\|vspace\\)" ispell-tex-arg-end) 
("\\\\\\([aA]lph\\|arabic\\)" ispell-tex-arg-end) ("\\\\cref" 
ispell-tex-arg-end) ("\\\\bibliographystyle" ispell-tex-arg-end) ("\\\\makebox" 
ispell-tex-arg-end 0) ("\\\\e?psfig" ispell-tex-arg-end) 
("\\\\document\\(class\\|style\\)" . "\\\\begin[ \11\n]*{document}")) 
(("\\(figure\\|table\\)\\*?" ispell-tex-arg-end 0) ("list" ispell-tex-arg-end  
[...]
 Lists of regions to be skipped in TeX mode.
 First list is used raw.
@@ -19639,7 +17683,6 @@ Second list has key placed inside \\begin{}.
 
 Delete or add any regions you want to be automatically selected
 for skipping in latex mode.")
-
 (defconst ispell-html-skip-alists '(("<[cC][oO][dD][eE]\\>[^>]*>" 
"</[cC][oO][dD][eE]*>") ("<[sS][cC][rR][iI][pP][tT]\\>[^>]*>" 
"</[sS][cC][rR][iI][pP][tT]>") ("<[aA][pP][pP][lL][eE][tT]\\>[^>]*>" 
"</[aA][pP][pP][lL][eE][tT]>") ("<[vV][eE][rR][bB]\\>[^>]*>" 
"<[vV][eE][rR][bB]\\>[^>]*>") ("<[tT][tT]/" "/") ("<[^ \11\n>]" ">") ("&[^ 
\11\n;]" "[; \11\n]")) "\
 Lists of start and end keys to skip in HTML buffers.
 Same format as `ispell-skip-region-alist'.
@@ -19647,7 +17690,6 @@ Note - substrings of other matches must come last
  (e.g. \"<[tT][tT]/\" and \"<[^ \\t\\n>]\").")
 (put 'ispell-local-pdict 'safe-local-variable 'stringp)
  (define-key esc-map "$" 'ispell-word)
-
 (autoload 'ispell-word "ispell" "\
 Check spelling of word under or before the cursor.
 If the word is not found in dictionary, display possible corrections
@@ -19655,7 +17697,7 @@ in a window allowing you to choose one.
 
 If optional argument FOLLOWING is non-nil or if `ispell-following-word'
 is non-nil when called interactively, then the following word
-\(rather than preceding) is checked when the cursor is not over a word.
+(rather than preceding) is checked when the cursor is not over a word.
 When the optional argument QUIETLY is non-nil or `ispell-quietly' is non-nil
 when called interactively, non-corrective messages are suppressed.
 
@@ -19675,17 +17717,15 @@ Return values:
 nil           word is correct or spelling is accepted.
 0             word is inserted into buffer-local definitions.
 \"word\"        word corrected from word list.
-\(\"word\" arg)  word is hand entered.
+(\"word\" arg)  word is hand entered.
 quit          spell session exited.
 
-\(fn &optional FOLLOWING QUIETLY CONTINUE REGION)" t nil)
-
+(fn &optional FOLLOWING QUIETLY CONTINUE REGION)" t nil)
 (autoload 'ispell-pdict-save "ispell" "\
 Check to see if the personal dictionary has been modified.
 If so, ask if it needs to be saved.
 
-\(fn &optional NO-QUERY FORCE-SAVE)" t nil)
-
+(fn &optional NO-QUERY FORCE-SAVE)" t nil)
 (autoload 'ispell-help "ispell" "\
 Display a list of the options available when a misspelling is encountered.
 
@@ -19709,14 +17749,12 @@ Selections are:
 \\`C-l'   Redraw screen.
 \\`C-r'   Recursive edit.
 \\`C-z'   Suspend Emacs or iconify frame." nil nil)
-
 (autoload 'ispell-kill-ispell "ispell" "\
 Kill current Ispell process (so that you may start a fresh one).
 With NO-ERROR, just return non-nil if there was no Ispell running.
 With CLEAR, buffer session localwords are cleaned.
 
-\(fn &optional NO-ERROR CLEAR)" t nil)
-
+(fn &optional NO-ERROR CLEAR)" t nil)
 (autoload 'ispell-change-dictionary "ispell" "\
 Change to dictionary DICT for Ispell.
 With a prefix arg, set it \"globally\", for all buffers.
@@ -19724,15 +17762,15 @@ Without a prefix arg, set it \"locally\", just for 
this buffer.
 
 By just answering RET you can find out what the current dictionary is.
 
-\(fn DICT &optional ARG)" t nil)
-
+(fn DICT &optional ARG)" t nil)
 (autoload 'ispell-region "ispell" "\
 Interactively check a region for spelling errors.
+Leave the mark at the last misspelled word that the user was queried about.
+
 Return nil if spell session was terminated, otherwise returns shift offset
 amount for last line processed.
 
-\(fn REG-START REG-END &optional RECHECKP SHIFT)" t nil)
-
+(fn REG-START REG-END &optional RECHECKP SHIFT)" t nil)
 (autoload 'ispell-comments-and-strings "ispell" "\
 Check comments and strings in the current buffer for spelling errors.
 If called interactively with an active region, check only comments and
@@ -19740,23 +17778,19 @@ strings in the region.
 When called from Lisp, START and END buffer positions can be provided
 to limit the check.
 
-\(fn &optional START END)" t nil)
-
+(fn &optional START END)" t nil)
 (autoload 'ispell-comment-or-string-at-point "ispell" "\
 Check the comment or string containing point for spelling errors." t nil)
-
 (autoload 'ispell-buffer "ispell" "\
-Check the current buffer for spelling errors interactively." t nil)
-
+Check the current buffer for spelling errors interactively.
+Leave the mark at the last misspelled word that the user was queried about." t 
nil)
 (autoload 'ispell-buffer-with-debug "ispell" "\
 `ispell-buffer' with some output sent to `ispell-debug-buffer'.
 If APPEND is non-nil, don't erase previous debugging output.
 
-\(fn &optional APPEND)" t nil)
-
+(fn &optional APPEND)" t nil)
 (autoload 'ispell-continue "ispell" "\
 Continue a halted spelling session beginning with the current word." t nil)
-
 (autoload 'ispell-complete-word "ispell" "\
 Try to complete the word before or at point.
 If optional INTERIOR-FRAG is non-nil, then the word may be a character
@@ -19764,11 +17798,9 @@ sequence inside of a word.
 
 Standard ispell choices are then available.
 
-\(fn &optional INTERIOR-FRAG)" t nil)
-
+(fn &optional INTERIOR-FRAG)" t nil)
 (autoload 'ispell-complete-word-interior-frag "ispell" "\
 Completes word matching character sequence inside a word." t nil)
-
 (autoload 'ispell "ispell" "\
 Interactively check a region or buffer for spelling errors.
 If `transient-mark-mode' is on, and a region is active, spell-check
@@ -19778,7 +17810,6 @@ Ispell dictionaries are not distributed with Emacs.  If 
you are
 looking for a dictionary, please see the distribution of the GNU ispell
 program, or do an Internet search; there are various dictionaries
 available on the net." t nil)
-
 (autoload 'ispell-minor-mode "ispell" "\
 Toggle last-word spell checking (Ispell minor mode).
 
@@ -19807,8 +17838,7 @@ evaluate `ispell-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'ispell-message "ispell" "\
 Check the spelling of a mail message or news post.
 Don't check spelling of message headers except the Subject field.
@@ -19828,136 +17858,128 @@ in your init file:
 You can bind this to the key C-c i in GNUS or mail by adding to
 `news-reply-mode-hook' or `mail-mode-hook' the following lambda expression:
    (lambda () (local-set-key \"\\C-ci\" \\='ispell-message))" t nil)
-
 (register-definition-prefixes "ispell" '("check-ispell-version" "ispell-"))
 
-;;;***
 
-;;;### (autoloads nil "ja-dic-cnv" "international/ja-dic-cnv.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from international/ja-dic-cnv.el
 
 (register-definition-prefixes "ja-dic-cnv" '("batch-skkdic-convert" 
"ja-dic-filename" "skkdic-"))
 
-;;;***
 
-;;;### (autoloads nil "ja-dic-utl" "international/ja-dic-utl.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from international/ja-dic-utl.el
 
 (register-definition-prefixes "ja-dic-utl" '("skkdic-"))
 
-;;;***
 
-;;;### (autoloads nil "japan-util" "language/japan-util.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from language/japan-util.el
 
 (autoload 'setup-japanese-environment-internal "japan-util" nil nil nil)
-
 (autoload 'japanese-katakana "japan-util" "\
 Convert argument to Katakana and return that.
 The argument may be a character or string.  The result has the same type.
 The argument object is not altered--the value is a copy.
 Optional argument HANKAKU t means to convert to `hankaku' Katakana
-\(`japanese-jisx0201-kana'), in which case return value
+(`japanese-jisx0201-kana'), in which case return value
 may be a string even if OBJ is a character if two Katakanas are
 necessary to represent OBJ.
 
-\(fn OBJ &optional HANKAKU)" nil nil)
-
+(fn OBJ &optional HANKAKU)" nil nil)
 (autoload 'japanese-hiragana "japan-util" "\
 Convert argument to Hiragana and return that.
 The argument may be a character or string.  The result has the same type.
 The argument object is not altered--the value is a copy.
 
-\(fn OBJ)" nil nil)
-
+(fn OBJ)" nil nil)
 (autoload 'japanese-hankaku "japan-util" "\
 Convert argument to `hankaku' and return that.
 The argument may be a character or string.  The result has the same type.
 The argument object is not altered--the value is a copy.
 Optional argument ASCII-ONLY non-nil means to return only ASCII character.
 
-\(fn OBJ &optional ASCII-ONLY)" nil nil)
-
+(fn OBJ &optional ASCII-ONLY)" nil nil)
 (autoload 'japanese-zenkaku "japan-util" "\
 Convert argument to `zenkaku' and return that.
 The argument may be a character or string.  The result has the same type.
 The argument object is not altered--the value is a copy.
 
-\(fn OBJ)" nil nil)
-
+(fn OBJ)" nil nil)
 (autoload 'japanese-katakana-region "japan-util" "\
 Convert Japanese `hiragana' chars in the region to `katakana' chars.
 Optional argument HANKAKU t means to convert to `hankaku katakana' character
 of which charset is `japanese-jisx0201-kana'.
 
-\(fn FROM TO &optional HANKAKU)" t nil)
-
+(fn FROM TO &optional HANKAKU)" t nil)
 (autoload 'japanese-hiragana-region "japan-util" "\
 Convert Japanese `katakana' chars in the region to `hiragana' chars.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'japanese-hankaku-region "japan-util" "\
 Convert Japanese `zenkaku' chars in the region to `hankaku' chars.
 `Zenkaku' chars belong to `japanese-jisx0208'
 `Hankaku' chars belong to `ascii' or `japanese-jisx0201-kana'.
 Optional argument ASCII-ONLY non-nil means to convert only to ASCII char.
 
-\(fn FROM TO &optional ASCII-ONLY)" t nil)
-
+(fn FROM TO &optional ASCII-ONLY)" t nil)
 (autoload 'japanese-zenkaku-region "japan-util" "\
 Convert hankaku' chars in the region to Japanese `zenkaku' chars.
 `Zenkaku' chars belong to `japanese-jisx0208'
 `Hankaku' chars belong to `ascii' or `japanese-jisx0201-kana'.
 Optional argument KATAKANA-ONLY non-nil means to convert only KATAKANA char.
 
-\(fn FROM TO &optional KATAKANA-ONLY)" t nil)
-
+(fn FROM TO &optional KATAKANA-ONLY)" t nil)
 (autoload 'read-hiragana-string "japan-util" "\
 Read a Hiragana string from the minibuffer, prompting with string PROMPT.
 If non-nil, second arg INITIAL-INPUT is a string to insert before reading.
 
-\(fn PROMPT &optional INITIAL-INPUT)" nil nil)
-
+(fn PROMPT &optional INITIAL-INPUT)" nil nil)
 (register-definition-prefixes "japan-util" '("japanese-"))
 
-;;;***
 
-;;;### (autoloads nil "jka-compr" "jka-compr.el" (0 0 0 0))
+;;; Generated autoloads from leim/quail/japanese.el
+
+(register-definition-prefixes "quail/japanese" '("quail-japanese-"))
+
+
+;;; Generated autoloads from cedet/semantic/java.el
+
+(register-definition-prefixes "semantic/java" '("semantic-"))
+
+
+;;; Generated autoloads from cedet/semantic/wisent/java-tags.el
+
+(register-definition-prefixes "semantic/wisent/java-tags" '("semantic-" 
"wisent-java-parse-error"))
+
+
+;;; Generated autoloads from cedet/semantic/wisent/javascript.el
+
+(register-definition-prefixes "semantic/wisent/javascript" '("semantic-" 
"wisent-javascript-jv-expand-tag"))
+
+
 ;;; Generated autoloads from jka-compr.el
 
 (defvar jka-compr-inhibit nil "\
 Non-nil means inhibit automatic uncompression temporarily.
 Lisp programs can bind this to t to do that.
 It is not recommended to set this variable permanently to anything but nil.")
-
 (autoload 'jka-compr-handler "jka-compr" "\
 
 
-\(fn OPERATION &rest ARGS)" nil nil)
-
+(fn OPERATION &rest ARGS)" nil nil)
 (autoload 'jka-compr-uninstall "jka-compr" "\
 Uninstall jka-compr.
 This removes the entries in `file-name-handler-alist' and `auto-mode-alist'
 and `inhibit-local-variables-suffixes' that were added
 by `jka-compr-install'." nil nil)
-
 (register-definition-prefixes "jka-compr" '("compression-error" "jka-compr-"))
 
-;;;***
 
-;;;### (autoloads nil "js" "progmodes/js.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/js.el
-(push (purecopy '(js 9)) package--builtin-versions)
 
+(push (purecopy '(js 9)) package--builtin-versions)
 (autoload 'js-mode "js" "\
 Major mode for editing JavaScript.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'js-jsx-mode "js" "\
 Major mode for editing JavaScript+JSX.
 
@@ -19971,69 +17993,51 @@ could set `js-jsx-syntax' to t in your init file, or 
in a
 `js-jsx-enable' in `js-mode-hook'.  You may be better served by
 one of the aforementioned options instead of using this mode.
 
-\(fn)" t nil)
+(fn)" t nil)
  (defalias 'javascript-mode 'js-mode)
-
 (dolist (name (list "node" "nodejs" "gjs" "rhino")) (add-to-list 
'interpreter-mode-alist (cons (purecopy name) 'js-mode)))
-
 (register-definition-prefixes "js" '("js-"))
 
-;;;***
 
-;;;### (autoloads nil "json" "json.el" (0 0 0 0))
 ;;; Generated autoloads from json.el
-(push (purecopy '(json 1 5)) package--builtin-versions)
 
+(push (purecopy '(json 1 5)) package--builtin-versions)
 (register-definition-prefixes "json" '("json-"))
 
-;;;***
 
-;;;### (autoloads nil "jsonrpc" "jsonrpc.el" (0 0 0 0))
 ;;; Generated autoloads from jsonrpc.el
-(push (purecopy '(jsonrpc 1 0 15)) package--builtin-versions)
 
+(push (purecopy '(jsonrpc 1 0 15)) package--builtin-versions)
 (register-definition-prefixes "jsonrpc" '("jsonrpc-"))
 
-;;;***
 
-;;;### (autoloads nil "kermit" "kermit.el" (0 0 0 0))
 ;;; Generated autoloads from kermit.el
 
 (register-definition-prefixes "kermit" '("kermit-"))
 
-;;;***
 
-;;;### (autoloads nil "keypad" "emulation/keypad.el" (0 0 0 0))
 ;;; Generated autoloads from emulation/keypad.el
 
 (defvar keypad-setup nil "\
 Specifies the keypad setup for unshifted keypad keys when NumLock is off.
 When selecting the plain numeric keypad setup, the character returned by the
 decimal key must be specified.")
-
 (custom-autoload 'keypad-setup "keypad" nil)
-
 (defvar keypad-numlock-setup nil "\
 Specifies the keypad setup for unshifted keypad keys when NumLock is on.
 When selecting the plain numeric keypad setup, the character returned by the
 decimal key must be specified.")
-
 (custom-autoload 'keypad-numlock-setup "keypad" nil)
-
 (defvar keypad-shifted-setup nil "\
 Specifies the keypad setup for shifted keypad keys when NumLock is off.
 When selecting the plain numeric keypad setup, the character returned by the
 decimal key must be specified.")
-
 (custom-autoload 'keypad-shifted-setup "keypad" nil)
-
 (defvar keypad-numlock-shifted-setup nil "\
 Specifies the keypad setup for shifted keypad keys when NumLock is off.
 When selecting the plain numeric keypad setup, the character returned by the
 decimal key must be specified.")
-
 (custom-autoload 'keypad-numlock-shifted-setup "keypad" nil)
-
 (autoload 'keypad-setup "keypad" "\
 Set keypad bindings in `function-key-map' according to SETUP.
 If optional second argument NUMLOCK is non-nil, the NumLock On bindings
@@ -20054,12 +18058,9 @@ keys are bound.
 If SETUP is `numeric' and the optional fourth argument DECIMAL is non-nil,
 the decimal key on the keypad is mapped to DECIMAL instead of `.'
 
-\(fn SETUP &optional NUMLOCK SHIFT DECIMAL)" nil nil)
+(fn SETUP &optional NUMLOCK SHIFT DECIMAL)" nil nil)
 
-;;;***
 
-;;;### (autoloads nil "kinsoku" "international/kinsoku.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from international/kinsoku.el
 
 (autoload 'kinsoku "kinsoku" "\
@@ -20076,13 +18077,10 @@ shorter.
 in one place, and is used for the text processing described above in
 the context of text formatting.
 
-\(fn LINEBEG)" nil nil)
-
+(fn LINEBEG)" nil nil)
 (register-definition-prefixes "kinsoku" '("kinsoku-"))
 
-;;;***
 
-;;;### (autoloads nil "kkc" "international/kkc.el" (0 0 0 0))
 ;;; Generated autoloads from international/kkc.el
 
 (defvar kkc-after-update-conversion-functions nil "\
@@ -20091,7 +18089,6 @@ With this input method, a user can select a proper 
conversion from
 candidate list.  Each time he changes the selection, functions in this
 list are called with two arguments; starting and ending buffer
 positions that contains the current selection.")
-
 (autoload 'kkc-region "kkc" "\
 Convert Kana string in the current region to Kanji-Kana mixed string.
 Users can select a desirable conversion interactively.
@@ -20100,14 +18097,12 @@ positions FROM and TO (integers or markers) 
specifying the target region.
 When it returns, the point is at the tail of the selected conversion,
 and the return value is the length of the conversion.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (register-definition-prefixes "kkc" '("kkc-"))
 
-;;;***
 
-;;;### (autoloads nil "kmacro" "kmacro.el" (0 0 0 0))
 ;;; Generated autoloads from kmacro.el
+
  (global-set-key "\C-x(" #'kmacro-start-macro)
  (global-set-key "\C-x)" #'kmacro-end-macro)
  (global-set-key "\C-xe" #'kmacro-end-and-call-macro)
@@ -20115,11 +18110,9 @@ and the return value is the length of the conversion.
  (global-set-key [f4] #'kmacro-end-or-call-macro)
  (global-set-key "\C-x\C-k" #'kmacro-keymap)
  (autoload 'kmacro-keymap "kmacro" "Keymap for keyboard macro commands." t 
'keymap)
-
-(define-obsolete-function-alias 'kmacro-exec-ring-item #'funcall "29.1" "\
-Execute item ITEM from the macro ring.
+(define-obsolete-function-alias 'kmacro-exec-ring-item #'funcall "\
+29.1" "Execute item ITEM from the macro ring.
 ARG is the number of times to execute the item.")
-
 (autoload 'kmacro-start-macro "kmacro" "\
 Record subsequent keyboard input, defining a keyboard macro.
 The commands are recorded even as they are executed.
@@ -20143,8 +18136,7 @@ Use \\[kmacro-name-last-macro] to give it a name that 
will remain valid even
 after another macro is defined.
 Use \\[kmacro-bind-to-key] to bind it to a key sequence.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'kmacro-end-macro "kmacro" "\
 Finish defining a keyboard macro.
 The definition was started by \\[kmacro-start-macro].
@@ -20156,8 +18148,7 @@ With numeric arg, repeat macro now that many times,
 counting the definition just completed as the first repetition.
 An argument of zero means repeat until error.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'kmacro-call-macro "kmacro" "\
 Call the keyboard MACRO that you defined with \\[kmacro-start-macro].
 A prefix argument serves as a repeat count.  Zero means repeat until error.
@@ -20171,8 +18162,7 @@ for details on how to adjust or disable this behavior.
 To give a macro a name so you can call it even after defining others,
 use \\[kmacro-name-last-macro].
 
-\(fn ARG &optional NO-REPEAT END-MACRO MACRO)" t nil)
-
+(fn ARG &optional NO-REPEAT END-MACRO MACRO)" t nil)
 (autoload 'kmacro-start-macro-or-insert-counter "kmacro" "\
 Record subsequent keyboard input, defining a keyboard macro.
 The commands are recorded even as they are executed.
@@ -20194,15 +18184,13 @@ The macro counter can be set directly via 
\\[kmacro-set-counter] and \\[kmacro-a
 The format of the inserted value of the counter can be controlled
 via \\[kmacro-set-format].
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'kmacro-end-or-call-macro "kmacro" "\
 End kbd macro if currently being defined; else call last kbd macro.
 With numeric prefix ARG, repeat macro that many times.
 With \\[universal-argument], call second macro in macro ring.
 
-\(fn ARG &optional NO-REPEAT)" t nil)
-
+(fn ARG &optional NO-REPEAT)" t nil)
 (autoload 'kmacro-end-and-call-macro "kmacro" "\
 Call last keyboard macro, ending it first if currently being defined.
 With numeric prefix ARG, repeat macro that many times.
@@ -20211,53 +18199,45 @@ Zero argument means repeat until there is an error.
 To give a macro a name, so you can call it even after defining other
 macros, use \\[kmacro-name-last-macro].
 
-\(fn ARG &optional NO-REPEAT)" t nil)
-
+(fn ARG &optional NO-REPEAT)" t nil)
 (autoload 'kmacro-end-call-mouse "kmacro" "\
 Move point to the position clicked with the mouse and call last kbd macro.
 If kbd macro currently being defined end it before activating it.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (autoload 'kmacro "kmacro" "\
 Create a `kmacro' for macro bound to symbol or key.
 KEYS should be a vector or a string that obeys `key-valid-p'.
 
-\(fn KEYS &optional COUNTER FORMAT)" nil nil)
-
+(fn KEYS &optional COUNTER FORMAT)" nil nil)
 (autoload 'kmacro-lambda-form "kmacro" "\
 
 
-\(fn MAC &optional COUNTER FORMAT)" nil nil)
-
+(fn MAC &optional COUNTER FORMAT)" nil nil)
 (make-obsolete 'kmacro-lambda-form 'kmacro '"29.1")
+(register-definition-prefixes "kmacro" '("kmacro-"))
 
-(register-definition-prefixes "kmacro" '("kdb-macro-redisplay" "kmacro-"))
-
-;;;***
 
-;;;### (autoloads nil "korea-util" "language/korea-util.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from language/korea-util.el
 
 (defvar default-korean-keyboard (purecopy (if (string-search "3" (or (getenv 
"HANGUL_KEYBOARD_TYPE") "")) "3" "")) "\
 The kind of Korean keyboard for Korean (Hangul) input method.
 \"\" for 2, \"3\" for 3, and \"3f\" for 3f.")
-
 (autoload 'setup-korean-environment-internal "korea-util" nil nil nil)
-
 (register-definition-prefixes "korea-util" '("exit-korean-environment" 
"isearch-" "korean-key-bindings" "quail-hangul-switch-" 
"toggle-korean-input-method"))
 
-;;;***
 
-;;;### (autoloads nil "lao-util" "language/lao-util.el" (0 0 0 0))
+;;; Generated autoloads from leim/quail/lao.el
+
+(register-definition-prefixes "quail/lao" '("lao-" 
"quail-lao-update-translation"))
+
+
 ;;; Generated autoloads from language/lao-util.el
 
 (autoload 'lao-compose-string "lao-util" "\
 
 
-\(fn STR)" nil nil)
-
+(fn STR)" nil nil)
 (autoload 'lao-transcribe-single-roman-syllable-to-lao "lao-util" "\
 Transcribe a Romanized Lao syllable in the region FROM and TO to Lao string.
 Only the first syllable is transcribed.
@@ -20268,63 +18248,48 @@ LAO-STRING is the Lao character transcription of it.
 Optional 3rd arg STR, if non-nil, is a string to search for Roman Lao
 syllable.  In that case, FROM and TO are indexes to STR.
 
-\(fn FROM TO &optional STR)" nil nil)
-
+(fn FROM TO &optional STR)" nil nil)
 (autoload 'lao-transcribe-roman-to-lao-string "lao-util" "\
 Transcribe Romanized Lao string STR to Lao character string.
 
-\(fn STR)" nil nil)
-
+(fn STR)" nil nil)
 (autoload 'lao-composition-function "lao-util" "\
 
 
-\(fn GSTRING DIRECTION)" nil nil)
-
+(fn GSTRING DIRECTION)" nil nil)
 (autoload 'lao-compose-region "lao-util" "\
 
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (register-definition-prefixes "lao-util" '("lao-"))
 
-;;;***
 
-;;;### (autoloads nil "latexenc" "international/latexenc.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from international/latexenc.el
 
 (defvar latex-inputenc-coding-alist (purecopy '(("ansinew" . windows-1252) 
("applemac" . mac-roman) ("ascii" . us-ascii) ("cp1250" . windows-1250) 
("cp1252" . windows-1252) ("cp1257" . cp1257) ("cp437de" . cp437) ("cp437" . 
cp437) ("cp850" . cp850) ("cp852" . cp852) ("cp858" . cp858) ("cp865" . cp865) 
("latin1" . iso-8859-1) ("latin2" . iso-8859-2) ("latin3" . iso-8859-3) 
("latin4" . iso-8859-4) ("latin5" . iso-8859-9) ("latin9" . iso-8859-15) 
("latin10" . iso-8859-16) ("next" . next) (" [...]
 Mapping from LaTeX encodings in \"inputenc.sty\" to Emacs coding systems.
 LaTeX encodings are specified with \"\\usepackage[encoding]{inputenc}\".
 Used by the function `latexenc-find-file-coding-system'.")
-
 (custom-autoload 'latex-inputenc-coding-alist "latexenc" t)
-
 (autoload 'latexenc-inputenc-to-coding-system "latexenc" "\
 Return the corresponding coding-system for the specified input encoding.
 Return nil if no matching coding system can be found.
 
-\(fn INPUTENC)" nil nil)
-
+(fn INPUTENC)" nil nil)
 (autoload 'latexenc-coding-system-to-inputenc "latexenc" "\
 Return the corresponding input encoding for the specified coding system.
 Return nil if no matching input encoding can be found.
 
-\(fn CS)" nil nil)
-
+(fn CS)" nil nil)
 (autoload 'latexenc-find-file-coding-system "latexenc" "\
 Determine the coding system of a LaTeX file if it uses \"inputenc.sty\".
 The mapping from LaTeX's \"inputenc.sty\" encoding names to Emacs
 coding system names is determined from `latex-inputenc-coding-alist'.
 
-\(fn ARG-LIST)" nil nil)
-
+(fn ARG-LIST)" nil nil)
 (register-definition-prefixes "latexenc" '("latexenc-dont-use-"))
 
-;;;***
 
-;;;### (autoloads nil "latin1-disp" "international/latin1-disp.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from international/latin1-disp.el
 
 (defvar latin1-display nil "\
@@ -20341,9 +18306,7 @@ charsets if you don't have a Unicode font with which to 
display them.
 
 Setting this variable directly does not take effect;
 use either \\[customize] or the function `latin1-display'.")
-
 (custom-autoload 'latin1-display "latin1-disp" nil)
-
 (autoload 'latin1-display "latin1-disp" "\
 Set up Latin-1/ASCII display for the arguments character SETS.
 See option `latin1-display' for the method.  The members of the list
@@ -20351,8 +18314,7 @@ must be in `latin1-display-sets'.  With no arguments, 
reset the
 display for all of `latin1-display-sets'.  See also
 `latin1-display-setup'.
 
-\(fn &rest SETS)" nil nil)
-
+(fn &rest SETS)" nil nil)
 (defvar latin1-display-ucs-per-lynx nil "\
 Set up Latin-1/ASCII display for Unicode characters.
 This uses the transliterations of the Lynx browser.  The display isn't
@@ -20360,70 +18322,48 @@ changed if the display can render Unicode characters.
 
 Setting this variable directly does not take effect;
 use either \\[customize] or the function `latin1-display'.")
-
 (custom-autoload 'latin1-display-ucs-per-lynx "latin1-disp" nil)
-
 (register-definition-prefixes "latin1-disp" '("latin1-display-"))
 
-;;;***
 
-;;;### (autoloads nil "ld-script" "progmodes/ld-script.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/ld-script.el
 
 (autoload 'ld-script-mode "ld-script" "\
 A major mode to edit GNU ld script files.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "ld-script" '("ld-script-"))
 
-;;;***
 
-;;;### (autoloads nil "ldap" "net/ldap.el" (0 0 0 0))
 ;;; Generated autoloads from net/ldap.el
 
 (register-definition-prefixes "ldap" '("ldap-"))
 
-;;;***
 
-;;;### (autoloads nil "legacy-gnus-agent" "gnus/legacy-gnus-agent.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from gnus/legacy-gnus-agent.el
 
 (register-definition-prefixes "legacy-gnus-agent" '("gnus-agent-"))
 
-;;;***
 
-;;;### (autoloads nil "less-css-mode" "textmodes/less-css-mode.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from textmodes/less-css-mode.el
 
 (put 'less-css-compile-at-save 'safe-local-variable #'booleanp)
-
 (put 'less-css-lessc-options 'safe-local-variable t)
-
 (put 'less-css-output-directory 'safe-local-variable #'stringp)
-
 (put 'less-css-input-file-name 'safe-local-variable #'stringp)
  (add-to-list 'auto-mode-alist '("\\.less\\'" . less-css-mode))
-
 (autoload 'less-css-mode "less-css-mode" "\
 Major mode for editing Less files (http://lesscss.org/).
 Special commands:
 \\{less-css-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "less-css-mode" '("less-css-"))
 
-;;;***
 
-;;;### (autoloads nil "let-alist" "emacs-lisp/let-alist.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emacs-lisp/let-alist.el
-(push (purecopy '(let-alist 1 0 6)) package--builtin-versions)
 
+(push (purecopy '(let-alist 1 0 6)) package--builtin-versions)
 (autoload 'let-alist "let-alist" "\
 Let-bind dotted symbols to their cdrs in ALIST and execute BODY.
 Dotted symbol is any symbol starting with a `.'.  Only those present
@@ -20453,15 +18393,21 @@ the variables of the outer one.  You can, however, 
access alists
 inside the original alist by using dots inside the symbol, as
 displayed in the example above.
 
-\(fn ALIST &rest BODY)" nil t)
-
+(fn ALIST &rest BODY)" nil t)
 (function-put 'let-alist 'lisp-indent-function '1)
-
 (register-definition-prefixes "let-alist" '("let-alist--"))
 
-;;;***
 
-;;;### (autoloads nil "life" "play/life.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/lex.el
+
+(register-definition-prefixes "semantic/lex" '("define-lex" "semantic-"))
+
+
+;;; Generated autoloads from cedet/semantic/lex-spp.el
+
+(register-definition-prefixes "semantic/lex-spp" '("define-lex-spp-" 
"semantic-lex-"))
+
+
 ;;; Generated autoloads from play/life.el
 
 (autoload 'life "life" "\
@@ -20474,20 +18420,17 @@ generations (the default is `life-step-time').
 When called from Lisp, optional argument STEP-TIME is the time to
 sleep in seconds.
 
-\(fn &optional STEP-TIME)" t nil)
-
+(fn &optional STEP-TIME)" t nil)
 (register-definition-prefixes "life" '("life-"))
 
-;;;***
 
-;;;### (autoloads nil "linum" "linum.el" (0 0 0 0))
 ;;; Generated autoloads from linum.el
 
 (autoload 'linum-mode "linum" "\
 Toggle display of line numbers in the left margin (Linum mode).
 
 This mode has been largely replaced by `display-line-numbers-mode'
-\(which is much faster and has fewer interaction problems with other
+(which is much faster and has fewer interaction problems with other
 modes).
 
 Linum mode is a buffer-local minor mode.
@@ -20506,10 +18449,8 @@ evaluate `linum-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (put 'global-linum-mode 'globalized-minor-mode t)
-
 (defvar global-linum-mode nil "\
 Non-nil if Global Linum mode is enabled.
 See the `global-linum-mode' command
@@ -20517,9 +18458,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-linum-mode'.")
-
 (custom-autoload 'global-linum-mode "linum" nil)
-
 (autoload 'global-linum-mode "linum" "\
 Toggle Linum mode in all buffers.
 With prefix ARG, enable Global Linum mode if ARG is positive;
@@ -20533,21 +18472,57 @@ Linum mode is enabled in all buffers where `linum-on' 
would do it.
 
 See `linum-mode' for more information on Linum mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "linum" '("linum-"))
 
-;;;***
 
-;;;### (autoloads nil "lisp-mnt" "emacs-lisp/lisp-mnt.el" (0 0 0
-;;;;;;  0))
+;;; Generated autoloads from cedet/ede/linux.el
+
+(register-definition-prefixes "ede/linux" '("ede-linux-" "project-linux-"))
+
+
 ;;; Generated autoloads from emacs-lisp/lisp-mnt.el
 
 (register-definition-prefixes "lisp-mnt" '("lm-"))
 
-;;;***
 
-;;;### (autoloads nil "loadhist" "loadhist.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/symref/list.el
+
+(register-definition-prefixes "semantic/symref/list" '("semantic-symref-"))
+
+
+;;; Generated autoloads from emacs-lisp/loaddefs-gen.el
+
+(put 'generated-autoload-file 'safe-local-variable 'stringp)
+(put 'generated-autoload-load-name 'safe-local-variable 'stringp)
+(autoload 'loaddefs-generate "loaddefs-gen" "\
+Generate loaddefs files for Lisp files in the directories DIRS.
+DIR can be either a single directory or a list of directories.
+
+The autoloads will be written to OUTPUT-FILE.  If any Lisp file
+binds `generated-autoload-file' as a file-local variable, write
+its autoloads into the specified file instead.
+
+The function does NOT recursively descend into subdirectories of the
+directory or directories specified.
+
+If EXTRA-DATA, include this string at the start of the generated file.
+
+If INCLUDE-PACKAGE-VERSION, include package version data.
+
+If GENERATE-FULL, don't update, but regenerate all the loaddefs files.
+
+(fn DIR OUTPUT-FILE &optional EXCLUDED-FILES EXTRA-DATA 
INCLUDE-PACKAGE-VERSION GENERATE-FULL)" nil nil)
+(autoload 'loaddefs-generate-batch "loaddefs-gen" "\
+Generate loaddefs.el files in batch mode.
+This scans for ;;;###autoload forms and related things.
+
+The first element on the command line should be the (main)
+loaddefs.el output file, and the rest are the directories to
+use." nil nil)
+(register-definition-prefixes "loaddefs-gen" '("autoload-" 
"generated-autoload-" "loaddefs-generate--"))
+
+
 ;;; Generated autoloads from loadhist.el
 
 (autoload 'unload-feature "loadhist" "\
@@ -20573,21 +18548,21 @@ definitions in the variable 
`unload-function-defs-list' and could
 remove symbols from it in the event that the package has done
 something strange, such as redefining an Emacs function.
 
-\(fn FEATURE &optional FORCE)" t nil)
-
+(fn FEATURE &optional FORCE)" t nil)
 (register-definition-prefixes "loadhist" '("feature-" "file-" "loadhist-" 
"read-feature" "unload-"))
 
-;;;***
 
-;;;### (autoloads nil "locate" "locate.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/locate.el
+
+(register-definition-prefixes "ede/locate" '("ede-locate-"))
+
+
 ;;; Generated autoloads from locate.el
 
 (defvar locate-ls-subdir-switches (purecopy "-al") "\
 `ls' switches for inserting subdirectories in `*Locate*' buffers.
 This should contain the \"-l\" switch, but not the \"-F\" or \"-b\" switches.")
-
 (custom-autoload 'locate-ls-subdir-switches "locate" t)
-
 (autoload 'locate "locate" "\
 Run the program `locate', putting results in `*Locate*' buffer.
 Pass it SEARCH-STRING as argument.  Interactively, prompt for SEARCH-STRING.
@@ -20610,8 +18585,7 @@ the docstring of that function for its meaning.
 After preparing the results buffer, this runs `dired-mode-hook' and
 then `locate-post-command-hook'.
 
-\(fn SEARCH-STRING &optional FILTER ARG)" t nil)
-
+(fn SEARCH-STRING &optional FILTER ARG)" t nil)
 (autoload 'locate-with-filter "locate" "\
 Run the executable program `locate' with a filter.
 This function is similar to the function `locate', which see.
@@ -20627,13 +18601,10 @@ ARG is the interactive prefix arg, which has the same 
effect as in `locate'.
 When called from Lisp, this function is identical with `locate',
 except that FILTER is not optional.
 
-\(fn SEARCH-STRING FILTER &optional ARG)" t nil)
-
+(fn SEARCH-STRING FILTER &optional ARG)" t nil)
 (register-definition-prefixes "locate" '("locate-"))
 
-;;;***
 
-;;;### (autoloads nil "log-edit" "vc/log-edit.el" (0 0 0 0))
 ;;; Generated autoloads from vc/log-edit.el
 
 (autoload 'log-edit "log-edit" "\
@@ -20660,36 +18631,28 @@ If BUFFER is non-nil, `log-edit' will switch to that 
buffer, use it
 to edit the log message and go back to the current buffer when
 done.  Otherwise, this function will use the current buffer.
 
-\(fn CALLBACK &optional SETUP PARAMS BUFFER MODE &rest IGNORE)" nil nil)
-
+(fn CALLBACK &optional SETUP PARAMS BUFFER MODE &rest IGNORE)" nil nil)
 (register-definition-prefixes "log-edit" '("log-edit-"))
 
-;;;***
 
-;;;### (autoloads nil "log-view" "vc/log-view.el" (0 0 0 0))
 ;;; Generated autoloads from vc/log-view.el
 
 (autoload 'log-view-mode "log-view" "\
 Major mode for browsing CVS log output.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "log-view" '("log-view-"))
 
-;;;***
 
-;;;### (autoloads nil "lpr" "lpr.el" (0 0 0 0))
 ;;; Generated autoloads from lpr.el
 
 (defvar lpr-windows-system (memq system-type '(ms-dos windows-nt)) "\
 Non-nil if running on MS-DOS or MS Windows.")
-
 (defvar lpr-lp-system (memq system-type '(usg-unix-v hpux)) "\
 Non-nil if running on a system type that uses the \"lp\" command.")
-
 (defvar printer-name (and (eq system-type 'ms-dos) "PRN") "\
 The name of a local printer to which data is sent for printing.
-\(Note that PostScript files are sent to `ps-printer-name', which see.)
+(Note that PostScript files are sent to `ps-printer-name', which see.)
 
 On Unix-like systems, a string value should be a name understood by
 lpr's -P option; otherwise the value should be nil.
@@ -20701,17 +18664,13 @@ printers, or \"COM1\" to \"COM4\" or \"AUX\" for 
serial printers, or
 \"//hostname/printer\" for a shared network printer.  You can also set
 it to the name of a file, in which case the output gets appended to that
 file.  If you want to discard the printed output, set this to \"NUL\".")
-
 (custom-autoload 'printer-name "lpr" t)
-
 (defvar lpr-switches nil "\
 List of strings to pass as extra options for the printer program.
 It is recommended to set `printer-name' instead of including an explicit
 switch on this list.
 See `lpr-command'.")
-
 (custom-autoload 'lpr-switches "lpr" t)
-
 (defvar lpr-command (purecopy (cond (lpr-windows-system "") (lpr-lp-system 
"lp") (t "lpr"))) "\
 Name of program for printing a file.
 
@@ -20722,14 +18681,11 @@ Windows NT and Novell Netware respectively) are 
handled specially, using
 `printer-name' as the destination for output; any other program is
 treated like `lpr' except that an explicit filename is given as the last
 argument.")
-
 (custom-autoload 'lpr-command "lpr" t)
-
 (autoload 'lpr-buffer "lpr" "\
 Print buffer contents without pagination or page headers.
 See the variables `lpr-switches' and `lpr-command'
 for customization of the printer command." t nil)
-
 (autoload 'print-buffer "lpr" "\
 Paginate and print buffer contents.
 
@@ -20743,14 +18699,12 @@ in the print command itself; we expect them to 
request pagination.
 
 See the variables `lpr-switches' and `lpr-command'
 for further customization of the printer command." t nil)
-
 (autoload 'lpr-region "lpr" "\
 Print region contents without pagination or page headers.
 See the variables `lpr-switches' and `lpr-command'
 for customization of the printer command.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'print-region "lpr" "\
 Paginate and print the region contents.
 
@@ -20765,26 +18719,24 @@ in the print command itself; we expect them to 
request pagination.
 See the variables `lpr-switches' and `lpr-command'
 for further customization of the printer command.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (register-definition-prefixes "lpr" '("lpr-" "print"))
 
-;;;***
 
-;;;### (autoloads nil "ls-lisp" "ls-lisp.el" (0 0 0 0))
+;;; Generated autoloads from leim/quail/lrt.el
+
+(register-definition-prefixes "quail/lrt" '("quail-lrt-update-translation"))
+
+
 ;;; Generated autoloads from ls-lisp.el
 
 (defvar ls-lisp-support-shell-wildcards t "\
 Non-nil means ls-lisp treats file patterns as shell wildcards.
 Otherwise they are treated as Emacs regexps (for backward compatibility).")
-
 (custom-autoload 'ls-lisp-support-shell-wildcards "ls-lisp" t)
-
 (register-definition-prefixes "ls-lisp" '("ls-lisp-"))
 
-;;;***
 
-;;;### (autoloads nil "lunar" "calendar/lunar.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/lunar.el
 
 (autoload 'lunar-phases "lunar" "\
@@ -20792,34 +18744,27 @@ Display the quarters of the moon for last month, this 
month, and next month.
 If called with an optional prefix argument ARG, prompts for month and year.
 This function is suitable for execution in an init file.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "lunar" '("calendar-lunar-phases" 
"diary-lunar-phases" "eclipse-check" "lunar-"))
 
-;;;***
 
-;;;### (autoloads nil "m4-mode" "progmodes/m4-mode.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/m4-mode.el
 
 (autoload 'm4-mode "m4-mode" "\
 A major mode to edit m4 macro files.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "m4-mode" '("m4-"))
 
-;;;***
 
-;;;### (autoloads nil "macros" "macros.el" (0 0 0 0))
 ;;; Generated autoloads from macros.el
 
 (defalias 'name-last-kbd-macro #'kmacro-name-last-macro)
-
 (autoload 'insert-kbd-macro "macros" "\
 Insert in buffer the definition of kbd macro MACRONAME, as Lisp code.
 MACRONAME should be a symbol.
 Optional second arg KEYS means also record the keys it is on
-\(this is the prefix argument, when calling interactively).
+(this is the prefix argument, when calling interactively).
 
 This Lisp code will, when executed, define the kbd macro with the same
 definition it has now.  If you say to record the keys, the Lisp code
@@ -20830,8 +18775,7 @@ bindings.
 To save a kbd macro, visit a file of Lisp code such as your `~/.emacs',
 use this command, and then save the file.
 
-\(fn MACRONAME &optional KEYS)" t nil)
-
+(fn MACRONAME &optional KEYS)" t nil)
 (autoload 'kbd-macro-query "macros" "\
 Query user during kbd macro execution.
 
@@ -20850,8 +18794,7 @@ Your options are: \\<query-replace-map>
 \\[recenter]   Redisplay the screen, then ask again.
 \\[edit]       Enter recursive edit; ask again when you exit from that.
 
-\(fn FLAG)" t nil)
-
+(fn FLAG)" t nil)
 (autoload 'apply-macro-to-region-lines "macros" "\
 Apply last keyboard macro to all lines in the region.
 For each line that begins in the region, move to the beginning of
@@ -20893,14 +18836,11 @@ and write a macro to massage a word into a table 
entry:
 and then select the region of un-tablified names and use
 `\\[apply-macro-to-region-lines]' to build the table from the names.
 
-\(fn TOP BOTTOM &optional MACRO)" t nil)
+(fn TOP BOTTOM &optional MACRO)" t nil)
  (define-key ctl-x-map "q" 'kbd-macro-query)
-
 (register-definition-prefixes "macros" '("macro"))
 
-;;;***
 
-;;;### (autoloads nil "mail-extr" "mail/mail-extr.el" (0 0 0 0))
 ;;; Generated autoloads from mail/mail-extr.el
 
 (autoload 'mail-extract-address-components "mail-extr" "\
@@ -20918,8 +18858,8 @@ each recipient.  If ALL is nil, then if ADDRESS 
contains more than
 one recipients, all but the first is ignored.
 
 ADDRESS may be a string or a buffer.  If it is a buffer, the visible
-\(narrowed) portion of the buffer will be interpreted as the address.
-\(This feature exists so that the clever caller might be able to avoid
+(narrowed) portion of the buffer will be interpreted as the address.
+(This feature exists so that the clever caller might be able to avoid
 consing a string.)
 
 This function is primarily meant for when you're displaying the
@@ -20931,73 +18871,53 @@ non-display use, you should probably use
 than `mail-header-parse-address', but does less post-processing
 to the results.
 
-\(fn ADDRESS &optional ALL)" nil nil)
-
+(fn ADDRESS &optional ALL)" nil nil)
 (autoload 'what-domain "mail-extr" "\
 Convert mail domain DOMAIN to the country it corresponds to.
 
-\(fn DOMAIN)" t nil)
-
+(fn DOMAIN)" t nil)
 (register-definition-prefixes "mail-extr" '("mail-extr-"))
 
-;;;***
 
-;;;### (autoloads nil "mail-hist" "mail/mail-hist.el" (0 0 0 0))
 ;;; Generated autoloads from mail/mail-hist.el
 
 (autoload 'mail-hist-define-keys "mail-hist" "\
 Define keys for accessing mail header history.  For use in hooks." nil nil)
-
 (autoload 'mail-hist-enable "mail-hist" nil nil nil)
-
 (defvar mail-hist-keep-history t "\
 Non-nil means keep a history for headers and text of outgoing mail.")
-
 (custom-autoload 'mail-hist-keep-history "mail-hist" t)
-
 (autoload 'mail-hist-put-headers-into-history "mail-hist" "\
 Put headers and contents of this message into mail header history.
 Each header has its own independent history, as does the body of the
 message.
 
 This function normally would be called when the message is sent." nil nil)
-
 (register-definition-prefixes "mail-hist" '("mail-hist-"))
 
-;;;***
 
-;;;### (autoloads nil "mail-parse" "mail/mail-parse.el" (0 0 0 0))
 ;;; Generated autoloads from mail/mail-parse.el
 
 (register-definition-prefixes "mail-parse" '("mail-"))
 
-;;;***
 
-;;;### (autoloads nil "mail-prsvr" "mail/mail-prsvr.el" (0 0 0 0))
 ;;; Generated autoloads from mail/mail-prsvr.el
 
 (register-definition-prefixes "mail-prsvr" '("mail-parse-"))
 
-;;;***
 
-;;;### (autoloads nil "mail-source" "gnus/mail-source.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from gnus/mail-source.el
 
 (register-definition-prefixes "mail-source" '("mail-source"))
 
-;;;***
 
-;;;### (autoloads nil "mail-utils" "mail/mail-utils.el" (0 0 0 0))
 ;;; Generated autoloads from mail/mail-utils.el
 
 (defvar mail-use-rfc822 nil "\
 If non-nil, use a full, hairy RFC 822 (or later) parser on mail addresses.
 Otherwise, (the default) use a smaller, somewhat faster, and
 often correct parser.")
-
 (custom-autoload 'mail-use-rfc822 "mail-utils" t)
-
 (defvar mail-dont-reply-to-names nil "\
 Regexp specifying addresses to prune from a reply message.
 If this is nil, it is set the first time you compose a reply, to
@@ -21005,14 +18925,11 @@ a value which excludes your own email address.
 
 Matching addresses are excluded from the Cc field in replies, and
 also the To field, unless this would leave an empty To field.")
-
 (custom-autoload 'mail-dont-reply-to-names "mail-utils" t)
-
 (autoload 'mail-file-babyl-p "mail-utils" "\
 Return non-nil if FILE is a Babyl file.
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (autoload 'mail-quote-printable "mail-utils" "\
 Convert a string to the \"quoted printable\" Q encoding if necessary.
 If the string contains only ASCII characters and no troublesome ones,
@@ -21021,22 +18938,19 @@ we return it unconverted.
 If the optional argument WRAPPER is non-nil,
 we add the wrapper characters =?ISO-8859-1?Q?....?=.
 
-\(fn STRING &optional WRAPPER)" nil nil)
-
+(fn STRING &optional WRAPPER)" nil nil)
 (autoload 'mail-quote-printable-region "mail-utils" "\
 Convert the region to the \"quoted printable\" Q encoding.
 If the optional argument WRAPPER is non-nil,
 we add the wrapper characters =?ISO-8859-1?Q?....?=.
 
-\(fn BEG END &optional WRAPPER)" t nil)
-
+(fn BEG END &optional WRAPPER)" t nil)
 (autoload 'mail-unquote-printable "mail-utils" "\
 Undo the \"quoted printable\" encoding.
 If the optional argument WRAPPER is non-nil,
 we expect to find and remove the wrapper characters =?ISO-8859-1?Q?....?=.
 
-\(fn STRING &optional WRAPPER)" nil nil)
-
+(fn STRING &optional WRAPPER)" nil nil)
 (autoload 'mail-unquote-printable-region "mail-utils" "\
 Undo the \"quoted printable\" encoding in buffer from BEG to END.
 If the optional argument WRAPPER is non-nil,
@@ -21048,8 +18962,7 @@ If UNIBYTE is non-nil, insert converted characters as 
unibyte.
 That is useful if you are going to character code decoding afterward,
 as Rmail does.
 
-\(fn BEG END &optional WRAPPER NOERROR UNIBYTE)" t nil)
-
+(fn BEG END &optional WRAPPER NOERROR UNIBYTE)" t nil)
 (autoload 'mail-fetch-field "mail-utils" "\
 Return the value of the header field whose type is FIELD-NAME.
 If second arg LAST is non-nil, use the last field of type FIELD-NAME.
@@ -21060,13 +18973,10 @@ included in the result.
 The buffer should be narrowed to just the header, else false
 matches may be returned from the message body.
 
-\(fn FIELD-NAME &optional LAST ALL LIST DELETE)" nil nil)
-
+(fn FIELD-NAME &optional LAST ALL LIST DELETE)" nil nil)
 (register-definition-prefixes "mail-utils" '("mail-"))
 
-;;;***
 
-;;;### (autoloads nil "mailabbrev" "mail/mailabbrev.el" (0 0 0 0))
 ;;; Generated autoloads from mail/mailabbrev.el
 
 (defvar mail-abbrevs-mode nil "\
@@ -21076,9 +18986,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `mail-abbrevs-mode'.")
-
 (custom-autoload 'mail-abbrevs-mode "mailabbrev" nil)
-
 (autoload 'mail-abbrevs-mode "mailabbrev" "\
 Toggle abbrev expansion of mail aliases (Mail Abbrevs mode).
 
@@ -21101,17 +19009,14 @@ evaluate `(default-value \\='mail-abbrevs-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'mail-abbrevs-setup "mailabbrev" "\
 Initialize use of the `mailabbrev' package." nil nil)
-
 (autoload 'build-mail-abbrevs "mailabbrev" "\
 Read mail aliases from personal mail alias file and set `mail-abbrevs'.
 By default this is the file specified by `mail-personal-alias-file'.
 
-\(fn &optional FILE RECURSIVEP)" nil nil)
-
+(fn &optional FILE RECURSIVEP)" nil nil)
 (autoload 'define-mail-abbrev "mailabbrev" "\
 Define NAME as a mail alias abbrev that translates to DEFINITION.
 If DEFINITION contains multiple addresses, separate them with commas.
@@ -21121,13 +19026,10 @@ from a mailrc file.  In that case, addresses are 
separated with
 spaces and addresses with embedded spaces are surrounded by
 double-quotes.
 
-\(fn NAME DEFINITION &optional FROM-MAILRC-FILE)" t nil)
-
+(fn NAME DEFINITION &optional FROM-MAILRC-FILE)" t nil)
 (register-definition-prefixes "mailabbrev" '("mail-" "merge-mail-abbrevs" 
"rebuild-mail-abbrevs"))
 
-;;;***
 
-;;;### (autoloads nil "mailalias" "mail/mailalias.el" (0 0 0 0))
 ;;; Generated autoloads from mail/mailalias.el
 
 (defvar mail-complete-style 'angles "\
@@ -21138,9 +19040,7 @@ If `parens', they look like:
        king@grassland.com (Elvis Parsley)
 If `angles', they look like:
        Elvis Parsley <king@grassland.com>")
-
 (custom-autoload 'mail-complete-style "mailalias" t)
-
 (autoload 'expand-mail-aliases "mailalias" "\
 Expand all mail aliases in suitable header fields found between BEG and END.
 If interactive, expand in header fields.
@@ -21150,8 +19050,7 @@ their `Resent-' variants.
 Optional second arg EXCLUDE may be a regular expression defining text to be
 removed from alias expansions.
 
-\(fn BEG END &optional EXCLUDE)" t nil)
-
+(fn BEG END &optional EXCLUDE)" t nil)
 (autoload 'define-mail-alias "mailalias" "\
 Define NAME as a mail alias that translates to DEFINITION.
 This means that sending a message to NAME will actually send to DEFINITION.
@@ -21161,58 +19060,44 @@ If FROM-MAILRC-FILE is non-nil, then addresses in 
DEFINITION
 can be separated by spaces; an address can contain spaces
 if it is quoted with double-quotes.
 
-\(fn NAME DEFINITION &optional FROM-MAILRC-FILE)" t nil)
-
+(fn NAME DEFINITION &optional FROM-MAILRC-FILE)" t nil)
 (autoload 'mail-completion-at-point-function "mailalias" "\
 Compute completion data for mail aliases.
 For use on `completion-at-point-functions'." nil nil)
-
 (autoload 'mail-complete "mailalias" "\
 Perform completion on header field or word preceding point.
 Completable headers are according to `mail-complete-alist'.  If none matches
 current header, calls `mail-complete-function' and passes prefix ARG if any.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (make-obsolete 'mail-complete 'mail-completion-at-point-function '"24.1")
-
 (register-definition-prefixes "mailalias" '("build-mail-aliases" "mail-"))
 
-;;;***
 
-;;;### (autoloads nil "mailcap" "net/mailcap.el" (0 0 0 0))
 ;;; Generated autoloads from net/mailcap.el
 
 (autoload 'mailcap-mime-type-to-extension "mailcap" "\
 Return a file name extension based on a MIME-TYPE.
 For instance, `image/png' will result in `png'.
 
-\(fn MIME-TYPE)" nil nil)
-
+(fn MIME-TYPE)" nil nil)
 (register-definition-prefixes "mailcap" '("mailcap-"))
 
-;;;***
 
-;;;### (autoloads nil "mailclient" "mail/mailclient.el" (0 0 0 0))
 ;;; Generated autoloads from mail/mailclient.el
 
 (autoload 'mailclient-send-it "mailclient" "\
 Pass current buffer on to the system's mail client.
 Suitable value for `send-mail-function'.
 The mail client is taken to be the handler of mailto URLs." nil nil)
-
 (register-definition-prefixes "mailclient" '("mailclient-"))
 
-;;;***
 
-;;;### (autoloads nil "mailheader" "mail/mailheader.el" (0 0 0 0))
 ;;; Generated autoloads from mail/mailheader.el
 
 (register-definition-prefixes "mailheader" '("mail-header"))
 
-;;;***
 
-;;;### (autoloads nil "mairix" "net/mairix.el" (0 0 0 0))
 ;;; Generated autoloads from net/mairix.el
 
 (autoload 'mairix-search "mairix" "\
@@ -21220,51 +19105,49 @@ Call Mairix with SEARCH.
 If THREADS is non-nil, also display whole threads of found
 messages.  Results will be put into the default search file.
 
-\(fn SEARCH THREADS)" t nil)
-
+(fn SEARCH THREADS)" t nil)
 (autoload 'mairix-use-saved-search "mairix" "\
 Use a saved search for querying Mairix." t nil)
-
 (autoload 'mairix-edit-saved-searches-customize "mairix" "\
 Edit the list of saved searches in a customization buffer." t nil)
-
 (autoload 'mairix-search-from-this-article "mairix" "\
 Search messages from sender of the current article.
 This is effectively a shortcut for calling `mairix-search' with
 f:current_from.  If prefix THREADS is non-nil, include whole
 threads.
 
-\(fn THREADS)" t nil)
-
+(fn THREADS)" t nil)
 (autoload 'mairix-search-thread-this-article "mairix" "\
 Search thread for the current article.
 This is effectively a shortcut for calling `mairix-search'
 with m:msgid of the current article and enabled threads." t nil)
-
 (autoload 'mairix-widget-search-based-on-article "mairix" "\
 Create mairix query based on current article using widgets." t nil)
-
 (autoload 'mairix-edit-saved-searches "mairix" "\
 Edit current mairix searches." t nil)
-
 (autoload 'mairix-widget-search "mairix" "\
 Create mairix query interactively using graphical widgets.
 MVALUES may contain values from current article.
 
-\(fn &optional MVALUES)" t nil)
-
+(fn &optional MVALUES)" t nil)
 (autoload 'mairix-update-database "mairix" "\
 Call mairix for updating the database for SERVERS.
 Mairix will be called asynchronously unless
 `mairix-synchronous-update' is t.  Mairix will be called with
 `mairix-update-options'." t nil)
-
 (register-definition-prefixes "mairix" '("mairix-"))
 
-;;;***
 
-;;;### (autoloads nil "make-mode" "progmodes/make-mode.el" (0 0 0
-;;;;;;  0))
+;;; Generated autoloads from cedet/semantic/bovine/make.el
+
+(register-definition-prefixes "semantic/bovine/make" '("makefile-mode" 
"semantic-"))
+
+
+;;; Generated autoloads from cedet/ede/make.el
+
+(register-definition-prefixes "ede/make" '("ede-"))
+
+
 ;;; Generated autoloads from progmodes/make-mode.el
 
 (autoload 'makefile-mode "make-mode" "\
@@ -21352,53 +19235,51 @@ Makefile mode can be configured by modifying the 
following variables:
    on one of those in the minibuffer whenever you enter a `.'.
    at the beginning of a line in Makefile mode.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'makefile-automake-mode "make-mode" "\
 An adapted `makefile-mode' that knows about automake.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'makefile-gmake-mode "make-mode" "\
 An adapted `makefile-mode' that knows about gmake.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'makefile-makepp-mode "make-mode" "\
 An adapted `makefile-mode' that knows about makepp.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'makefile-bsdmake-mode "make-mode" "\
 An adapted `makefile-mode' that knows about BSD make.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'makefile-imake-mode "make-mode" "\
 An adapted `makefile-mode' that knows about imake.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "make-mode" '("makefile-"))
 
-;;;***
 
-;;;### (autoloads nil "makesum" "makesum.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/makefile-edit.el
+
+(register-definition-prefixes "ede/makefile-edit" '("makefile-"))
+
+
+;;; Generated autoloads from textmodes/makeinfo.el
+
+(register-definition-prefixes "makeinfo" '("makeinfo-"))
+
+
 ;;; Generated autoloads from makesum.el
 
 (autoload 'make-command-summary "makesum" "\
 Make a summary of current key bindings in the buffer *Summary*.
 Previous contents of that buffer are killed first." t nil)
-
 (register-definition-prefixes "makesum" '("double-column"))
 
-;;;***
 
-;;;### (autoloads nil "man" "man.el" (0 0 0 0))
 ;;; Generated autoloads from man.el
 
 (defalias 'manual-entry 'man)
-
 (autoload 'man "man" "\
 Get a Un*x manual page and put it in a buffer.
 This command is the top-level command in the man package.
@@ -21440,36 +19321,33 @@ Note that in some cases you will need to use 
\\[quoted-insert] to quote the
 SPC character in the above examples, because this command attempts
 to auto-complete your input based on the installed manual pages.
 
-\(fn MAN-ARGS)" t nil)
-
+(fn MAN-ARGS)" t nil)
 (autoload 'man-follow "man" "\
 Get a Un*x manual page of the item under point and put it in a buffer.
 
-\(fn MAN-ARGS)" '(man-common) nil)
-
+(fn MAN-ARGS)" '(man-common) nil)
 (autoload 'Man-bookmark-jump "man" "\
 Default bookmark handler for Man buffers.
 
-\(fn BOOKMARK)" nil nil)
-
+(fn BOOKMARK)" nil nil)
 (autoload 'Man-context-menu "man" "\
 Populate MENU with commands that open a man page at point.
 
-\(fn MENU CLICK)" nil nil)
-
+(fn MENU CLICK)" nil nil)
 (register-definition-prefixes "man" '("Man-" "man"))
 
-;;;***
 
-;;;### (autoloads nil "map" "emacs-lisp/map.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/map.el
-(push (purecopy '(map 3 2 1)) package--builtin-versions)
 
+(push (purecopy '(map 3 2 1)) package--builtin-versions)
 (register-definition-prefixes "map" '("map-"))
 
-;;;***
 
-;;;### (autoloads nil "master" "master.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/map.el
+
+(register-definition-prefixes "srecode/map" '("srecode-"))
+
+
 ;;; Generated autoloads from master.el
 
 (autoload 'master-mode "master" "\
@@ -21498,13 +19376,10 @@ evaluate `master-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "master" '("master-"))
 
-;;;***
 
-;;;### (autoloads nil "mb-depth" "mb-depth.el" (0 0 0 0))
 ;;; Generated autoloads from mb-depth.el
 
 (defvar minibuffer-depth-indicate-mode nil "\
@@ -21514,9 +19389,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `minibuffer-depth-indicate-mode'.")
-
 (custom-autoload 'minibuffer-depth-indicate-mode "mb-depth" nil)
-
 (autoload 'minibuffer-depth-indicate-mode "mb-depth" "\
 Toggle Minibuffer Depth Indication mode.
 
@@ -21540,21 +19413,15 @@ evaluate `(default-value 
\\='minibuffer-depth-indicate-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "mb-depth" '("minibuffer-depth-"))
 
-;;;***
 
-;;;### (autoloads nil "md4" "md4.el" (0 0 0 0))
 ;;; Generated autoloads from md4.el
 
 (register-definition-prefixes "md4" '("md4"))
 
-;;;***
 
-;;;### (autoloads nil "memory-report" "emacs-lisp/memory-report.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/memory-report.el
 
 (autoload 'memory-report "memory-report" "\
@@ -21563,133 +19430,108 @@ Generate a report of how Emacs is using memory.
 This report is approximate, and will commonly over-count memory
 usage by variables, because shared data structures will usually
 by counted more than once." t nil)
-
 (register-definition-prefixes "memory-report" '("memory-report-"))
 
-;;;***
 
-;;;### (autoloads nil "message" "gnus/message.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/message.el
 
 (define-mail-user-agent 'message-user-agent 'message-mail 
'message-send-and-exit 'message-kill-buffer 'message-send-hook)
-
 (autoload 'message-mode "message" "\
 Major mode for editing mail and news to be sent.
 Like `text-mode', but with these additional commands:
 
 \\{message-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'message-mail "message" "\
 Start editing a mail message to be sent.
 OTHER-HEADERS is an alist of header/value pairs.  CONTINUE says whether
 to continue editing a message already being composed.  SWITCH-FUNCTION
 is a function used to switch to and display the mail buffer.
 
-\(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION 
SEND-ACTIONS RETURN-ACTION &rest _)" t nil)
-
+(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION 
SEND-ACTIONS RETURN-ACTION &rest _)" t nil)
 (autoload 'message-news "message" "\
 Start editing a news article to be sent.
 
-\(fn &optional NEWSGROUPS SUBJECT)" t nil)
-
+(fn &optional NEWSGROUPS SUBJECT)" t nil)
 (autoload 'message-reply "message" "\
 Start editing a reply to the article in the current buffer.
 
-\(fn &optional TO-ADDRESS WIDE SWITCH-FUNCTION)" t nil)
-
+(fn &optional TO-ADDRESS WIDE SWITCH-FUNCTION)" t nil)
 (autoload 'message-wide-reply "message" "\
 Make a \"wide\" reply to the message in the current buffer.
 
-\(fn &optional TO-ADDRESS)" t nil)
-
+(fn &optional TO-ADDRESS)" t nil)
 (autoload 'message-followup "message" "\
 Follow up to the message in the current buffer.
 If TO-NEWSGROUPS, use that as the new Newsgroups line.
 
-\(fn &optional TO-NEWSGROUPS)" t nil)
-
+(fn &optional TO-NEWSGROUPS)" t nil)
 (autoload 'message-cancel-news "message" "\
 Cancel an article you posted.
 If ARG, allow editing of the cancellation message.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'message-supersede "message" "\
 Start composing a message to supersede the current message.
 This is done simply by taking the old article and adding a Supersedes
 header line with the old Message-ID." t nil)
-
 (autoload 'message-recover "message" "\
 Reread contents of current buffer from its last auto-save file." t nil)
-
 (autoload 'message-forward "message" "\
 Forward the current message via mail.
 Optional NEWS will use news to forward instead of mail.
 Optional DIGEST will use digest to forward.
 
-\(fn &optional NEWS DIGEST)" t nil)
-
+(fn &optional NEWS DIGEST)" t nil)
 (autoload 'message-forward-make-body "message" "\
 
 
-\(fn FORWARD-BUFFER &optional DIGEST)" nil nil)
-
+(fn FORWARD-BUFFER &optional DIGEST)" nil nil)
 (autoload 'message-forward-rmail-make-body "message" "\
 
 
-\(fn FORWARD-BUFFER)" nil nil)
-
+(fn FORWARD-BUFFER)" nil nil)
 (autoload 'message-insinuate-rmail "message" "\
 Let RMAIL use message to forward." t nil)
-
 (autoload 'message-resend "message" "\
 Resend the current article to ADDRESS.
 
-\(fn ADDRESS)" t nil)
-
+(fn ADDRESS)" t nil)
 (autoload 'message-bounce "message" "\
 Re-mail the current message.
 This only makes sense if the current message is a bounce message that
 contains some mail you have written which has been bounced back to
 you." t nil)
-
 (autoload 'message-mail-other-window "message" "\
 Like `message-mail' command, but display mail buffer in another window.
 
-\(fn &optional TO SUBJECT)" t nil)
-
+(fn &optional TO SUBJECT)" t nil)
 (autoload 'message-mail-other-frame "message" "\
 Like `message-mail' command, but display mail buffer in another frame.
 
-\(fn &optional TO SUBJECT)" t nil)
-
+(fn &optional TO SUBJECT)" t nil)
 (autoload 'message-news-other-window "message" "\
 Start editing a news article to be sent.
 
-\(fn &optional NEWSGROUPS SUBJECT)" t nil)
-
+(fn &optional NEWSGROUPS SUBJECT)" t nil)
 (autoload 'message-news-other-frame "message" "\
 Start editing a news article to be sent.
 
-\(fn &optional NEWSGROUPS SUBJECT)" t nil)
-
+(fn &optional NEWSGROUPS SUBJECT)" t nil)
 (autoload 'message-bold-region "message" "\
 Bold all nonblank characters in the region.
 Works by overstriking characters.
 Called from program, takes two arguments START and END
 which specify the range to operate on.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'message-unbold-region "message" "\
 Remove all boldness (overstruck characters) in the region.
 Called from program, takes two arguments START and END
 which specify the range to operate on.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'message-mailto "message" "\
 Command to parse command line mailto: links.
 This is meant to be used for MIME handlers: Setting the handler
@@ -21697,63 +19539,47 @@ for \"x-scheme-handler/mailto;\" to \"emacs -f 
message-mailto %u\"
 will then start up Emacs ready to compose mail.  For emacsclient use
   emacsclient -e \\='(message-mailto \"%u\")'
 
-\(fn &optional URL)" t nil)
-
+(fn &optional URL)" t nil)
 (register-definition-prefixes "message" '("message-"))
 
-;;;***
 
-;;;### (autoloads nil "meta-mode" "progmodes/meta-mode.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/meta-mode.el
-(push (purecopy '(meta-mode 1 0)) package--builtin-versions)
 
+(push (purecopy '(meta-mode 1 0)) package--builtin-versions)
 (autoload 'metafont-mode "meta-mode" "\
 Major mode for editing Metafont sources.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'metapost-mode "meta-mode" "\
 Major mode for editing MetaPost sources.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "meta-mode" 
'("font-lock-match-meta-declaration-item-and-skip-to-next" "meta"))
 
-;;;***
 
-;;;### (autoloads nil "mh-acros" "mh-e/mh-acros.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-acros.el
 
 (register-definition-prefixes "mh-acros" '("defmacro-mh" "defun-mh" "mh-" 
"with-mh-folder-updating"))
 
-;;;***
 
-;;;### (autoloads nil "mh-alias" "mh-e/mh-alias.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-alias.el
 
 (register-definition-prefixes "mh-alias" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-buffers" "mh-e/mh-buffers.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-buffers.el
 
 (register-definition-prefixes "mh-buffers" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-comp" "mh-e/mh-comp.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-comp.el
 
 (autoload 'mh-smail "mh-comp" "\
 Compose a message with the MH mail system.
 See `mh-send' for more details on composing mail." t nil)
-
 (autoload 'mh-smail-other-window "mh-comp" "\
 Compose a message with the MH mail system in other window.
 See `mh-send' for more details on composing mail." t nil)
-
 (autoload 'mh-smail-batch "mh-comp" "\
 Compose a message with the MH mail system.
 
@@ -21767,10 +19593,8 @@ SUBJECT, and OTHER-HEADERS. Additional arguments are 
IGNORED.
 This function remains for Emacs 21 compatibility. New
 applications should use `mh-user-agent-compose'.
 
-\(fn &optional TO SUBJECT OTHER-HEADERS &rest IGNORED)" nil nil)
-
+(fn &optional TO SUBJECT OTHER-HEADERS &rest IGNORED)" nil nil)
 (define-mail-user-agent 'mh-e-user-agent 'mh-user-agent-compose 
'mh-send-letter 'mh-fully-kill-draft 'mh-before-send-letter-hook)
-
 (autoload 'mh-user-agent-compose "mh-comp" "\
 Set up mail composition draft with the MH mail system.
 This is the `mail-user-agent' entry point to MH-E. This function
@@ -21787,8 +19611,7 @@ are strings.
 
 Any additional arguments are IGNORED.
 
-\(fn &optional TO SUBJECT OTHER-HEADERS &rest IGNORED)" nil nil)
-
+(fn &optional TO SUBJECT OTHER-HEADERS &rest IGNORED)" nil nil)
 (autoload 'mh-send-letter "mh-comp" "\
 Save draft and send message.
 
@@ -21814,8 +19637,7 @@ use `mh-send-prog' to tell MH-E the name.
 The hook `mh-annotate-msg-hook' is run after annotating the
 message and scan line.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'mh-fully-kill-draft "mh-comp" "\
 Quit editing and delete draft message.
 
@@ -21823,36 +19645,25 @@ If for some reason you are not happy with the draft, 
you can use
 this command to kill the draft buffer and delete the draft
 message. Use the command \\[kill-buffer] if you don't want to
 delete the draft message." t nil)
-
 (register-definition-prefixes "mh-comp" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-compat" "mh-e/mh-compat.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-compat.el
 
 (register-definition-prefixes "mh-compat" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-e" "mh-e/mh-e.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-e.el
-(push (purecopy '(mh-e 8 6 -4)) package--builtin-versions)
 
+(push (purecopy '(mh-e 8 6 -4)) package--builtin-versions)
 (put 'mh-progs 'risky-local-variable t)
-
 (put 'mh-lib 'risky-local-variable t)
-
 (put 'mh-lib-progs 'risky-local-variable t)
-
 (autoload 'mh-version "mh-e" "\
 Display version information about MH-E and the MH mail handling system." t nil)
-
 (register-definition-prefixes "mh-e" '("defcustom-mh" "defface-mh" 
"defgroup-mh" "mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-folder" "mh-e/mh-folder.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-folder.el
 
 (autoload 'mh-rmail "mh-folder" "\
@@ -21862,8 +19673,7 @@ Scan an MH folder if ARG is non-nil.
 This function is an entry point to MH-E, the Emacs interface to
 the MH mail system.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'mh-nmail "mh-folder" "\
 Check for new mail in inbox folder.
 Scan an MH folder if ARG is non-nil.
@@ -21871,8 +19681,7 @@ Scan an MH folder if ARG is non-nil.
 This function is an entry point to MH-E, the Emacs interface to
 the MH mail system.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'mh-folder-mode "mh-folder" "\
 Major MH-E mode for \"editing\" an MH folder scan 
listing.\\<mh-folder-mode-map>
 
@@ -21929,135 +19738,95 @@ perform the operation on all messages in that region.
 
 \\{mh-folder-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "mh-folder" '(":keymap" "mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-funcs" "mh-e/mh-funcs.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-funcs.el
 
 (register-definition-prefixes "mh-funcs" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-identity" "mh-e/mh-identity.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from mh-e/mh-identity.el
 
 (register-definition-prefixes "mh-identity" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-inc" "mh-e/mh-inc.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-inc.el
 
 (register-definition-prefixes "mh-inc" '("mh-inc-spool-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-junk" "mh-e/mh-junk.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-junk.el
 
 (register-definition-prefixes "mh-junk" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-letter" "mh-e/mh-letter.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-letter.el
 
 (register-definition-prefixes "mh-letter" '(":keymap" "mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-limit" "mh-e/mh-limit.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-limit.el
 
 (register-definition-prefixes "mh-limit" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-mime" "mh-e/mh-mime.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-mime.el
 
 (register-definition-prefixes "mh-mime" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-print" "mh-e/mh-print.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-print.el
 
 (register-definition-prefixes "mh-print" '("mh-p"))
 
-;;;***
 
-;;;### (autoloads nil "mh-scan" "mh-e/mh-scan.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-scan.el
 
 (register-definition-prefixes "mh-scan" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-search" "mh-e/mh-search.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-search.el
 
 (register-definition-prefixes "mh-search" '(":keymap" "mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-seq" "mh-e/mh-seq.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-seq.el
 
 (register-definition-prefixes "mh-seq" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-show" "mh-e/mh-show.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-show.el
 
 (register-definition-prefixes "mh-show" '(":keymap" "mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-speed" "mh-e/mh-speed.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-speed.el
 
 (register-definition-prefixes "mh-speed" '(":keymap" "mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-thread" "mh-e/mh-thread.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-thread.el
 
 (register-definition-prefixes "mh-thread" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-tool-bar" "mh-e/mh-tool-bar.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from mh-e/mh-tool-bar.el
 
 (register-definition-prefixes "mh-tool-bar" '("mh-tool-bar-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-utils" "mh-e/mh-utils.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-utils.el
 
 (register-definition-prefixes "mh-utils" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mh-xface" "mh-e/mh-xface.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-xface.el
 
 (register-definition-prefixes "mh-xface" '("mh-"))
 
-;;;***
 
-;;;### (autoloads nil "mhtml-mode" "textmodes/mhtml-mode.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from textmodes/mhtml-mode.el
 
 (autoload 'mhtml-mode "mhtml-mode" "\
@@ -22067,13 +19836,10 @@ Code inside a <script> element is indented using the 
rules from
 `js-mode'; and code inside a <style> element is indented using
 the rules from `css-mode'.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "mhtml-mode" '("mhtml-"))
 
-;;;***
 
-;;;### (autoloads nil "midnight" "midnight.el" (0 0 0 0))
 ;;; Generated autoloads from midnight.el
 
 (defvar midnight-mode nil "\
@@ -22083,9 +19849,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `midnight-mode'.")
-
 (custom-autoload 'midnight-mode "midnight" nil)
-
 (autoload 'midnight-mode "midnight" "\
 Non-nil means run `midnight-hook' at midnight.
 
@@ -22103,8 +19867,7 @@ evaluate `(default-value \\='midnight-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'clean-buffer-list "midnight" "\
 Kill old buffers that have not been displayed recently.
 The relevant variables are `clean-buffer-list-delay-general',
@@ -22116,19 +19879,15 @@ While processing buffers, this procedure displays 
messages containing
 the current date/time, buffer name, how many seconds ago it was
 displayed (can be nil if the buffer was never displayed) and its
 lifetime, i.e., its \"age\" when it will be purged." t nil)
-
 (autoload 'midnight-delay-set "midnight" "\
 Modify `midnight-timer' according to `midnight-delay'.
 Sets the first argument SYMB (which must be symbol `midnight-delay')
 to its second argument TM.
 
-\(fn SYMB TM)" nil nil)
-
+(fn SYMB TM)" nil nil)
 (register-definition-prefixes "midnight" '("clean-buffer-list-" "midnight-"))
 
-;;;***
 
-;;;### (autoloads nil "minibuf-eldef" "minibuf-eldef.el" (0 0 0 0))
 ;;; Generated autoloads from minibuf-eldef.el
 
 (defvar minibuffer-electric-default-mode nil "\
@@ -22138,9 +19897,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `minibuffer-electric-default-mode'.")
-
 (custom-autoload 'minibuffer-electric-default-mode "minibuf-eldef" nil)
-
 (autoload 'minibuffer-electric-default-mode "minibuf-eldef" "\
 Toggle Minibuffer Electric Default mode.
 
@@ -22166,13 +19923,10 @@ evaluate `(default-value 
\\='minibuffer-electric-default-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "minibuf-eldef" '("minibuf"))
 
-;;;***
 
-;;;### (autoloads nil "misc" "misc.el" (0 0 0 0))
 ;;; Generated autoloads from misc.el
 
 (autoload 'copy-from-above-command "misc" "\
@@ -22181,39 +19935,35 @@ Copy ARG characters, but not past the end of that 
line.
 If no argument given, copy the entire rest of the line.
 The characters copied are inserted in the buffer before point.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'zap-up-to-char "misc" "\
 Kill up to, but not including ARGth occurrence of CHAR.
+When run interactively, the argument INTERACTIVE is non-nil.
 Case is ignored if `case-fold-search' is non-nil in the current buffer.
 Goes backward if ARG is negative; error if CHAR not found.
 Ignores CHAR at point.
+If called interactively, do a case sensitive search if CHAR
+is an upper-case character.
 
-\(fn ARG CHAR)" t nil)
-
+(fn ARG CHAR &optional INTERACTIVE)" t nil)
 (autoload 'mark-beginning-of-buffer "misc" "\
 Set mark at the beginning of the buffer." t nil)
-
 (autoload 'mark-end-of-buffer "misc" "\
 Set mark at the end of the buffer." t nil)
-
 (autoload 'upcase-char "misc" "\
 Uppercasify ARG chars starting from point.  Point doesn't move.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'forward-to-word "misc" "\
 Move forward until encountering the beginning of a word.
 With argument, do this that many times.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'backward-to-word "misc" "\
 Move backward until encountering the end of a word.
 With argument, do this that many times.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'butterfly "misc" "\
 Use butterflies to flip the desired bit on the drive platter.
 Open hands and let the delicate wings flap once.  The disturbance
@@ -22223,26 +19973,22 @@ air to form, which act as lenses that deflect 
incoming cosmic rays,
 focusing them to strike the drive platter and flip the desired bit.
 You can type `M-x butterfly C-M-c' to run it.  This is a permuted
 variation of `C-x M-c M-butterfly' from url `https://xkcd.com/378/'." t nil)
-
 (autoload 'list-dynamic-libraries "misc" "\
 Display a list of all dynamic libraries known to Emacs.
-\(These are the libraries listed in `dynamic-library-alist'.)
+(These are the libraries listed in `dynamic-library-alist'.)
 If optional argument LOADED-ONLY-P (interactively, prefix arg)
 is non-nil, only libraries already loaded are listed.
 Optional argument BUFFER specifies a buffer to use, instead of
 \"*Dynamic Libraries*\".
 The return value is always nil.
 
-\(fn &optional LOADED-ONLY-P BUFFER)" t nil)
-
+(fn &optional LOADED-ONLY-P BUFFER)" t nil)
 (register-definition-prefixes "misc" '("list-dynamic-libraries--"))
 
-;;;***
 
-;;;### (autoloads nil "misearch" "misearch.el" (0 0 0 0))
 ;;; Generated autoloads from misearch.el
- (add-hook 'isearch-mode-hook 'multi-isearch-setup)
 
+ (add-hook 'isearch-mode-hook 'multi-isearch-setup)
 (defvar multi-isearch-next-buffer-function nil "\
 Function to call to get the next buffer to search.
 
@@ -22264,30 +20010,23 @@ should return the previous buffer to search.
 If the second argument of this function WRAP is non-nil, then it
 should return the first buffer in the series; and for the backward
 search, it should return the last buffer in the series.")
-
 (defvar multi-isearch-next-buffer-current-function nil "\
 The currently active function to get the next buffer to search.
 Initialized from `multi-isearch-next-buffer-function' when
 Isearch starts.")
-
 (defvar multi-isearch-current-buffer nil "\
 The buffer where the search is currently searching.
 The value is nil when the search still is in the initial buffer.")
-
 (defvar multi-isearch-buffer-list nil "\
 Sequence of buffers visited by multiple buffers Isearch.
 This is nil if Isearch is not currently searching more than one buffer.")
-
 (defvar multi-isearch-file-list nil "\
 Sequence of files visited by multiple file buffers Isearch.")
-
 (autoload 'multi-isearch-setup "misearch" "\
 Set up isearch to search multiple buffers.
 Intended to be added to `isearch-mode-hook'." nil nil)
-
 (autoload 'multi-isearch-switch-buffer "misearch" "\
 Switch to the next buffer in multi-buffer search." nil nil)
-
 (autoload 'multi-isearch-buffers "misearch" "\
 Start multi-buffer Isearch on a list of BUFFERS.
 This list can contain live buffers or their names.
@@ -22295,8 +20034,7 @@ Interactively read buffer names to search, one by one, 
ended with RET.
 With a prefix argument, ask for a regexp, and search in buffers
 whose names match the specified regexp.
 
-\(fn BUFFERS)" t nil)
-
+(fn BUFFERS)" t nil)
 (autoload 'multi-isearch-buffers-regexp "misearch" "\
 Start multi-buffer regexp Isearch on a list of BUFFERS.
 This list can contain live buffers or their names.
@@ -22304,8 +20042,7 @@ Interactively read buffer names to search, one by one, 
ended with RET.
 With a prefix argument, ask for a regexp, and search in buffers
 whose names match the specified regexp.
 
-\(fn BUFFERS)" t nil)
-
+(fn BUFFERS)" t nil)
 (autoload 'multi-isearch-files "misearch" "\
 Start multi-buffer Isearch on a list of FILES.
 Relative file names in this list are expanded to absolute
@@ -22314,8 +20051,7 @@ Interactively read file names to search, one by one, 
ended with RET.
 With a prefix argument, ask for a wildcard, and search in file buffers
 whose file names match the specified wildcard.
 
-\(fn FILES)" t nil)
-
+(fn FILES)" t nil)
 (autoload 'multi-isearch-files-regexp "misearch" "\
 Start multi-buffer regexp Isearch on a list of FILES.
 Relative file names in this list are expanded to absolute
@@ -22324,82 +20060,62 @@ Interactively read file names to search, one by one, 
ended with RET.
 With a prefix argument, ask for a wildcard, and search in file buffers
 whose file names match the specified wildcard.
 
-\(fn FILES)" t nil)
-
+(fn FILES)" t nil)
 (register-definition-prefixes "misearch" '("misearch-unload-function" 
"multi-isearch-"))
 
-;;;***
 
-;;;### (autoloads nil "mixal-mode" "progmodes/mixal-mode.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from progmodes/mixal-mode.el
-(push (purecopy '(mixal-mode 0 4)) package--builtin-versions)
 
+(push (purecopy '(mixal-mode 0 4)) package--builtin-versions)
 (autoload 'mixal-mode "mixal-mode" "\
 Major mode for the mixal asm language.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "mixal-mode" '("mixal-"))
 
-;;;***
 
-;;;### (autoloads nil "mm-archive" "gnus/mm-archive.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mm-archive.el
 
 (register-definition-prefixes "mm-archive" '("mm-"))
 
-;;;***
 
-;;;### (autoloads nil "mm-bodies" "gnus/mm-bodies.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mm-bodies.el
 
 (register-definition-prefixes "mm-bodies" '("mm-"))
 
-;;;***
 
-;;;### (autoloads nil "mm-decode" "gnus/mm-decode.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mm-decode.el
 
 (register-definition-prefixes "mm-decode" '("mm-"))
 
-;;;***
 
-;;;### (autoloads nil "mm-encode" "gnus/mm-encode.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mm-encode.el
 
-(define-obsolete-function-alias 'mm-default-file-encoding 
#'mm-default-file-type "28.1")
-
+(define-obsolete-function-alias 'mm-default-file-encoding 
#'mm-default-file-type "\
+28.1")
 (autoload 'mm-default-file-type "mm-encode" "\
 Return a default content type for FILE.
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (register-definition-prefixes "mm-encode" '("mm-"))
 
-;;;***
 
-;;;### (autoloads nil "mm-extern" "gnus/mm-extern.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mm-extern.el
 
 (autoload 'mm-extern-cache-contents "mm-extern" "\
 Put the external-body part of HANDLE into its cache.
 
-\(fn HANDLE)" nil nil)
-
+(fn HANDLE)" nil nil)
 (autoload 'mm-inline-external-body "mm-extern" "\
 Show the external-body part of HANDLE.
 This function replaces the buffer of HANDLE with a buffer contains
 the entire message.
 If NO-DISPLAY is nil, display it.  Otherwise, do nothing after replacing.
 
-\(fn HANDLE &optional NO-DISPLAY)" nil nil)
-
+(fn HANDLE &optional NO-DISPLAY)" nil nil)
 (register-definition-prefixes "mm-extern" '("mm-extern-"))
 
-;;;***
 
-;;;### (autoloads nil "mm-partial" "gnus/mm-partial.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mm-partial.el
 
 (autoload 'mm-inline-partial "mm-partial" "\
@@ -22408,38 +20124,29 @@ This function replaces the buffer of HANDLE with a 
buffer contains
 the entire message.
 If NO-DISPLAY is nil, display it.  Otherwise, do nothing after replacing.
 
-\(fn HANDLE &optional NO-DISPLAY)" nil nil)
-
+(fn HANDLE &optional NO-DISPLAY)" nil nil)
 (register-definition-prefixes "mm-partial" '("mm-partial-find-parts"))
 
-;;;***
 
-;;;### (autoloads nil "mm-url" "gnus/mm-url.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mm-url.el
 
 (autoload 'mm-url-insert-file-contents "mm-url" "\
 Insert file contents of URL.
 If `mm-url-use-external' is non-nil, use `mm-url-program'.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (autoload 'mm-url-insert-file-contents-external "mm-url" "\
 Insert file contents of URL using `mm-url-program'.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "mm-url" '("mm-url-"))
 
-;;;***
 
-;;;### (autoloads nil "mm-util" "gnus/mm-util.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mm-util.el
 
 (register-definition-prefixes "mm-util" '("mm-"))
 
-;;;***
 
-;;;### (autoloads nil "mm-uu" "gnus/mm-uu.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mm-uu.el
 
 (autoload 'mm-uu-dissect "mm-uu" "\
@@ -22448,31 +20155,24 @@ The optional NOHEADER means there's no header in the 
buffer.
 MIME-TYPE specifies a MIME type and parameters, which defaults to the
 value of `mm-uu-text-plain-type'.
 
-\(fn &optional NOHEADER MIME-TYPE)" nil nil)
-
+(fn &optional NOHEADER MIME-TYPE)" nil nil)
 (autoload 'mm-uu-dissect-text-parts "mm-uu" "\
 Dissect text parts and put uu handles into HANDLE.
 Assume text has been decoded if DECODED is non-nil.
 
-\(fn HANDLE &optional DECODED)" nil nil)
-
+(fn HANDLE &optional DECODED)" nil nil)
 (register-definition-prefixes "mm-uu" '("mm-"))
 
-;;;***
 
-;;;### (autoloads nil "mm-view" "gnus/mm-view.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mm-view.el
 
 (register-definition-prefixes "mm-view" '("mm-"))
 
-;;;***
 
-;;;### (autoloads nil "mml" "gnus/mml.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mml.el
 
 (autoload 'mml-to-mime "mml" "\
 Translate the current buffer from MML to MIME." nil nil)
-
 (autoload 'mml-attach-file "mml" "\
 Attach a file to the outgoing MIME message.
 The file is not inserted or encoded until you send the message with
@@ -22492,96 +20192,82 @@ If given a prefix interactively, no prompting will be 
done for
 the TYPE, DESCRIPTION or DISPOSITION values.  Instead defaults
 will be computed and used.
 
-\(fn FILE &optional TYPE DESCRIPTION DISPOSITION)" t nil)
-
+(fn FILE &optional TYPE DESCRIPTION DISPOSITION)" t nil)
 (register-definition-prefixes "mml" '("mime-to-mml" "mml-"))
 
-;;;***
 
-;;;### (autoloads nil "mml-sec" "gnus/mml-sec.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mml-sec.el
 
 (register-definition-prefixes "mml-sec" '("mml-"))
 
-;;;***
 
-;;;### (autoloads nil "mml-smime" "gnus/mml-smime.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mml-smime.el
 
 (register-definition-prefixes "mml-smime" '("mml-smime-"))
 
-;;;***
 
-;;;### (autoloads nil "mml1991" "gnus/mml1991.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mml1991.el
 
 (autoload 'mml1991-encrypt "mml1991" "\
 
 
-\(fn CONT &optional SIGN)" nil nil)
-
+(fn CONT &optional SIGN)" nil nil)
 (autoload 'mml1991-sign "mml1991" "\
 
 
-\(fn CONT)" nil nil)
-
+(fn CONT)" nil nil)
 (register-definition-prefixes "mml1991" '("mml1991-"))
 
-;;;***
 
-;;;### (autoloads nil "mml2015" "gnus/mml2015.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/mml2015.el
 
 (autoload 'mml2015-decrypt "mml2015" "\
 
 
-\(fn HANDLE CTL)" nil nil)
-
+(fn HANDLE CTL)" nil nil)
 (autoload 'mml2015-decrypt-test "mml2015" "\
 
 
-\(fn HANDLE CTL)" nil nil)
-
+(fn HANDLE CTL)" nil nil)
 (autoload 'mml2015-verify "mml2015" "\
 
 
-\(fn HANDLE CTL)" nil nil)
-
+(fn HANDLE CTL)" nil nil)
 (autoload 'mml2015-verify-test "mml2015" "\
 
 
-\(fn HANDLE CTL)" nil nil)
-
+(fn HANDLE CTL)" nil nil)
 (autoload 'mml2015-encrypt "mml2015" "\
 
 
-\(fn CONT &optional SIGN)" nil nil)
-
+(fn CONT &optional SIGN)" nil nil)
 (autoload 'mml2015-sign "mml2015" "\
 
 
-\(fn CONT)" nil nil)
-
+(fn CONT)" nil nil)
 (autoload 'mml2015-self-encrypt "mml2015" nil nil nil)
-
 (register-definition-prefixes "mml2015" '("mml2015-"))
 
-;;;***
 
-;;;### (autoloads nil "mode-local" "cedet/mode-local.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/mode.el
+
+(register-definition-prefixes "srecode/mode" '("srecode-"))
+
+
+;;; Generated autoloads from cedet/semantic/decorate/mode.el
+
+(register-definition-prefixes "semantic/decorate/mode" 
'("define-semantic-decoration-style" "semantic-"))
+
+
 ;;; Generated autoloads from cedet/mode-local.el
 
 (put 'define-overloadable-function 'doc-string-elt 3)
-
 (register-definition-prefixes "mode-local" '("def" 
"describe-mode-local-bindings" "fetch-overload" "get-mode-local-parent" 
"make-obsolete-overload" "mode-local-" "setq-mode-local" "with-mode-local" 
"xref-mode-local-"))
 
-;;;***
 
-;;;### (autoloads nil "modula2" "progmodes/modula2.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/modula2.el
 
 (defalias 'modula-2-mode 'm2-mode)
-
 (autoload 'm2-mode "modula2" "\
 This is a mode intended to support program development in Modula-2.
 All control constructs of Modula-2 can be reached by typing C-c
@@ -22606,47 +20292,37 @@ followed by the first character of the construct.
    `m2-compile-command' holds the command to compile a Modula-2 program.
    `m2-link-command' holds the command to link a Modula-2 program.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "modula2" '("m2-" "m3-font-lock-keywords"))
 
-;;;***
 
-;;;### (autoloads nil "morse" "play/morse.el" (0 0 0 0))
 ;;; Generated autoloads from play/morse.el
 
 (autoload 'morse-region "morse" "\
-Convert all text in a given region to morse code.
-
-\(fn BEG END)" t nil)
+Convert plain text in region to Morse code.
+See <https://en.wikipedia.org/wiki/Morse_code>.
 
+(fn BEG END)" t nil)
 (autoload 'unmorse-region "morse" "\
-Convert morse coded text in region to ordinary ASCII text.
-
-\(fn BEG END)" t nil)
+Convert Morse coded text in region to plain text.
 
+(fn BEG END)" t nil)
 (autoload 'nato-region "morse" "\
-Convert all text in a given region to NATO phonetic alphabet.
-
-\(fn BEG END)" t nil)
+Convert plain text in region to NATO spelling alphabet.
 
+(fn BEG END)" t nil)
 (autoload 'denato-region "morse" "\
-Convert NATO phonetic alphabet in region to ordinary ASCII text.
-
-\(fn BEG END)" t nil)
+Convert NATO spelling alphabet text in region to plain text.
 
+(fn BEG END)" t nil)
 (register-definition-prefixes "morse" '("morse-code" "nato-alphabet"))
 
-;;;***
 
-;;;### (autoloads nil "mouse-copy" "mouse-copy.el" (0 0 0 0))
 ;;; Generated autoloads from mouse-copy.el
 
 (register-definition-prefixes "mouse-copy" '("mouse-"))
 
-;;;***
 
-;;;### (autoloads nil "mouse-drag" "mouse-drag.el" (0 0 0 0))
 ;;; Generated autoloads from mouse-drag.el
 
 (autoload 'mouse-drag-throw "mouse-drag" "\
@@ -22671,8 +20347,7 @@ hemisphere you're in.)
 To test this function, evaluate:
     (global-set-key [down-mouse-2] \\='mouse-drag-throw)
 
-\(fn START-EVENT)" t nil)
-
+(fn START-EVENT)" t nil)
 (autoload 'mouse-drag-drag "mouse-drag" "\
 \"Drag\" the page according to a mouse drag.
 
@@ -22689,33 +20364,29 @@ middle button in Tk text widgets.
 To test this function, evaluate:
     (global-set-key [down-mouse-2] \\='mouse-drag-drag)
 
-\(fn START-EVENT)" t nil)
-
+(fn START-EVENT)" t nil)
 (register-definition-prefixes "mouse-drag" '("mouse-"))
 
-;;;***
 
-;;;### (autoloads nil "mpc" "mpc.el" (0 0 0 0))
 ;;; Generated autoloads from mpc.el
 
 (autoload 'mpc "mpc" "\
 Main entry point for MPC." t nil)
-
 (register-definition-prefixes "mpc" '("mpc-" "tag-browser-tagtypes"))
 
-;;;***
 
-;;;### (autoloads nil "mpuz" "play/mpuz.el" (0 0 0 0))
 ;;; Generated autoloads from play/mpuz.el
 
 (autoload 'mpuz "mpuz" "\
 Multiplication puzzle with GNU Emacs." t nil)
-
 (register-definition-prefixes "mpuz" '("mpuz-"))
 
-;;;***
 
-;;;### (autoloads nil "msb" "msb.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/mru-bookmark.el
+
+(register-definition-prefixes "semantic/mru-bookmark" 
'("global-semantic-mru-bookmark-mode" "semantic-"))
+
+
 ;;; Generated autoloads from msb.el
 
 (defvar msb-mode nil "\
@@ -22725,9 +20396,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `msb-mode'.")
-
 (custom-autoload 'msb-mode "msb" nil)
-
 (autoload 'msb-mode "msb" "\
 Toggle Msb mode.
 
@@ -22748,27 +20417,20 @@ evaluate `(default-value \\='msb-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "msb" '("mouse-select-buffer" "msb"))
 
-;;;***
 
-;;;### (autoloads nil "mspools" "mail/mspools.el" (0 0 0 0))
 ;;; Generated autoloads from mail/mspools.el
 
 (autoload 'mspools-show "mspools" "\
 Show the list of non-empty spool files in the *spools* buffer.
 Buffer is not displayed if SHOW is non-nil.
 
-\(fn &optional NOSHOW)" t nil)
-
+(fn &optional NOSHOW)" t nil)
 (register-definition-prefixes "mspools" '("mspools-"))
 
-;;;***
 
-;;;### (autoloads nil "mule-diag" "international/mule-diag.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from international/mule-diag.el
 
 (autoload 'list-character-sets "mule-diag" "\
@@ -22783,8 +20445,7 @@ ISO-2022-based coding systems.
 With prefix ARG, the output format gets more cryptic,
 but still shows the full information.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'read-charset "mule-diag" "\
 Read a character set from the minibuffer, prompting with string PROMPT.
 It must be an Emacs character set listed in the variable `charset-list'.
@@ -22795,23 +20456,19 @@ INITIAL-INPUT, if non-nil, is a string inserted in 
the minibuffer initially.
 See the documentation of the function `completing-read' for the detailed
 meanings of these arguments.
 
-\(fn PROMPT &optional DEFAULT-VALUE INITIAL-INPUT)" nil nil)
-
+(fn PROMPT &optional DEFAULT-VALUE INITIAL-INPUT)" nil nil)
 (autoload 'list-charset-chars "mule-diag" "\
 Display a list of characters in character set CHARSET.
 
-\(fn CHARSET)" t nil)
-
+(fn CHARSET)" t nil)
 (autoload 'describe-character-set "mule-diag" "\
 Display information about built-in character set CHARSET.
 
-\(fn CHARSET)" t nil)
-
+(fn CHARSET)" t nil)
 (autoload 'describe-coding-system "mule-diag" "\
 Display information about CODING-SYSTEM.
 
-\(fn CODING-SYSTEM)" t nil)
-
+(fn CODING-SYSTEM)" t nil)
 (autoload 'describe-current-coding-system-briefly "mule-diag" "\
 Display coding systems currently used in a brief format in echo area.
 
@@ -22834,10 +20491,8 @@ in place of `..':
   eol-type of `default-process-coding-system' for read
   `default-process-coding-system' for write
   eol-type of `default-process-coding-system'" t nil)
-
 (autoload 'describe-current-coding-system "mule-diag" "\
 Display coding systems currently used, in detail." t nil)
-
 (autoload 'list-coding-systems "mule-diag" "\
 Display a list of all coding systems.
 This shows the mnemonic letter, name, and description of each coding system.
@@ -22845,33 +20500,27 @@ This shows the mnemonic letter, name, and description 
of each coding system.
 With prefix ARG, the output format gets more cryptic,
 but still contains full information about each coding system.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'list-coding-categories "mule-diag" "\
 Display a list of all coding categories." nil nil)
-
 (autoload 'describe-font "mule-diag" "\
 Display information about a font whose name is FONTNAME.
 
-\(fn FONTNAME)" t nil)
-
+(fn FONTNAME)" t nil)
 (autoload 'describe-fontset "mule-diag" "\
 Display information about FONTSET.
 This shows which font is used for which character(s).
 
-\(fn FONTSET)" t nil)
-
+(fn FONTSET)" t nil)
 (autoload 'list-fontsets "mule-diag" "\
 Display a list of all fontsets.
 This shows the name, size, and style of each fontset.
 With prefix arg, also list the fonts contained in each fontset;
 see the function `describe-fontset' for the format of the list.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'list-input-methods "mule-diag" "\
 Display information about all input methods." t nil)
-
 (autoload 'mule-diag "mule-diag" "\
 Display diagnosis of the multilingual environment (Mule).
 
@@ -22879,27 +20528,21 @@ This shows various information related to the current 
multilingual
 environment, including lists of input methods, coding systems,
 character sets, and fontsets (if Emacs is running under a window
 system which uses fontsets)." t nil)
-
 (autoload 'font-show-log "mule-diag" "\
 Show log of font listing and opening.
 Prefix arg LIMIT says how many fonts to show for each listing.
 The default is 20.  If LIMIT is negative, do not limit the listing.
 
-\(fn &optional LIMIT)" t nil)
-
+(fn &optional LIMIT)" t nil)
 (register-definition-prefixes "mule-diag" '("charset-history" 
"describe-font-internal" "insert-section" "list-" "mule--kbd-at" "print-" 
"sort-listed-character-sets"))
 
-;;;***
 
-;;;### (autoloads nil "mule-util" "international/mule-util.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from international/mule-util.el
 
 (autoload 'store-substring "mule-util" "\
 Embed OBJ (string or character) at index IDX of STRING.
 
-\(fn STRING IDX OBJ)" nil nil)
-
+(fn STRING IDX OBJ)" nil nil)
 (autoload 'truncate-string-to-width "mule-util" "\
 Truncate string STR to end at column END-COLUMN.
 The optional 3rd arg START-COLUMN, if non-nil, specifies the starting
@@ -22933,19 +20576,17 @@ If ELLIPSIS-TEXT-PROPERTY is non-nil, a too-long 
string will not
 be truncated, but instead the elided parts will be covered by a
 `display' text property showing the ellipsis.
 
-\(fn STR END-COLUMN &optional START-COLUMN PADDING ELLIPSIS 
ELLIPSIS-TEXT-PROPERTY)" nil nil)
-
+(fn STR END-COLUMN &optional START-COLUMN PADDING ELLIPSIS 
ELLIPSIS-TEXT-PROPERTY)" nil nil)
 (defsubst nested-alist-p (obj) "\
 Return t if OBJ is a nested alist.
 
 Nested alist is a list of the form (ENTRY . BRANCHES), where ENTRY is
 any Lisp object, and BRANCHES is a list of cons cells of the form
-\(KEY-ELEMENT . NESTED-ALIST).
+(KEY-ELEMENT . NESTED-ALIST).
 
 You can use a nested alist to store any Lisp object (ENTRY) for a key
 sequence KEYSEQ, where KEYSEQ is a sequence of KEY-ELEMENT.  KEYSEQ
 can be a string, a vector, or a list." (and obj (listp obj) (listp (cdr obj))))
-
 (autoload 'set-nested-alist "mule-util" "\
 Set ENTRY for KEYSEQ in a nested alist ALIST.
 Optional 4th arg LEN non-nil means the first LEN elements in KEYSEQ
@@ -22954,8 +20595,7 @@ Optional 5th argument BRANCHES if non-nil is branches 
for a keyseq
 longer than KEYSEQ.
 See the documentation of `nested-alist-p' for more detail.
 
-\(fn KEYSEQ ENTRY ALIST &optional LEN BRANCHES)" nil nil)
-
+(fn KEYSEQ ENTRY ALIST &optional LEN BRANCHES)" nil nil)
 (autoload 'lookup-nested-alist "mule-util" "\
 Look up key sequence KEYSEQ in nested alist ALIST.  Return the definition.
 Optional 3rd argument LEN specifies the length of KEYSEQ.
@@ -22968,45 +20608,37 @@ If ALIST is not deep enough for KEYSEQ, return number 
which is
 Optional 5th argument NIL-FOR-TOO-LONG non-nil means return nil
  even if ALIST is not deep enough.
 
-\(fn KEYSEQ ALIST &optional LEN START NIL-FOR-TOO-LONG)" nil nil)
-
+(fn KEYSEQ ALIST &optional LEN START NIL-FOR-TOO-LONG)" nil nil)
 (autoload 'coding-system-post-read-conversion "mule-util" "\
 Return the value of CODING-SYSTEM's `post-read-conversion' property.
 
-\(fn CODING-SYSTEM)" nil nil)
-
+(fn CODING-SYSTEM)" nil nil)
 (autoload 'coding-system-pre-write-conversion "mule-util" "\
 Return the value of CODING-SYSTEM's `pre-write-conversion' property.
 
-\(fn CODING-SYSTEM)" nil nil)
-
+(fn CODING-SYSTEM)" nil nil)
 (autoload 'coding-system-translation-table-for-decode "mule-util" "\
 Return the value of CODING-SYSTEM's `decode-translation-table' property.
 
-\(fn CODING-SYSTEM)" nil nil)
-
+(fn CODING-SYSTEM)" nil nil)
 (autoload 'coding-system-translation-table-for-encode "mule-util" "\
 Return the value of CODING-SYSTEM's `encode-translation-table' property.
 
-\(fn CODING-SYSTEM)" nil nil)
-
+(fn CODING-SYSTEM)" nil nil)
 (autoload 'with-coding-priority "mule-util" "\
 Execute BODY like `progn' with CODING-SYSTEMS at the front of priority list.
 CODING-SYSTEMS is a list of coding systems.  See `set-coding-system-priority'.
 This affects the implicit sorting of lists of coding systems returned by
 operations such as `find-coding-systems-region'.
 
-\(fn CODING-SYSTEMS &rest BODY)" nil t)
-
+(fn CODING-SYSTEMS &rest BODY)" nil t)
 (function-put 'with-coding-priority 'lisp-indent-function '1)
-
 (autoload 'detect-coding-with-language-environment "mule-util" "\
 Detect a coding system for the text between FROM and TO with LANG-ENV.
 The detection takes into account the coding system priorities for the
 language environment LANG-ENV.
 
-\(fn FROM TO LANG-ENV)" nil nil)
-
+(fn FROM TO LANG-ENV)" nil nil)
 (autoload 'filepos-to-bufferpos "mule-util" "\
 Try to return the buffer position corresponding to a particular file position.
 The file position is given as a (0-based) BYTE count.
@@ -23021,8 +20653,7 @@ QUALITY can be:
     EOL format is not yet decided.)
   nil, in which case we may return nil rather than an approximation.
 
-\(fn BYTE &optional QUALITY CODING-SYSTEM)" nil nil)
-
+(fn BYTE &optional QUALITY CODING-SYSTEM)" nil nil)
 (autoload 'bufferpos-to-filepos "mule-util" "\
 Try to return the file byte corresponding to a particular buffer POSITION.
 Value is the file position given as a (0-based) byte count.
@@ -23037,14 +20668,10 @@ QUALITY can be:
     EOL format is not yet decided.)
   nil, in which case we may return nil rather than an approximation.
 
-\(fn POSITION &optional QUALITY CODING-SYSTEM)" nil nil)
-
+(fn POSITION &optional QUALITY CODING-SYSTEM)" nil nil)
 (register-definition-prefixes "mule-util" '("filepos-to-bufferpos--dos" 
"truncate-string-ellipsis"))
 
-;;;***
 
-;;;### (autoloads nil "multisession" "emacs-lisp/multisession.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/multisession.el
 
 (autoload 'define-multisession-variable "multisession" "\
@@ -23052,22 +20679,17 @@ Make NAME into a multisession variable initialized 
from INITIAL-VALUE.
 DOC should be a doc string, and ARGS are keywords as applicable to
 `make-multisession'.
 
-\(fn NAME INITIAL-VALUE &optional DOC &rest ARGS)" nil t)
-
+(fn NAME INITIAL-VALUE &optional DOC &rest ARGS)" nil t)
 (function-put 'define-multisession-variable 'lisp-indent-function 'defun)
-
 (autoload 'list-multisession-values "multisession" "\
 List all values in the \"multisession\" database.
 If CHOOSE-STORAGE (interactively, the prefix), query for the
 storage method to list.
 
-\(fn &optional CHOOSE-STORAGE)" t nil)
-
+(fn &optional CHOOSE-STORAGE)" t nil)
 (register-definition-prefixes "multisession" '("multisession-"))
 
-;;;***
 
-;;;### (autoloads nil "mwheel" "mwheel.el" (0 0 0 0))
 ;;; Generated autoloads from mwheel.el
 
 (defvar mouse-wheel-mode t "\
@@ -23077,9 +20699,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `mouse-wheel-mode'.")
-
 (custom-autoload 'mouse-wheel-mode "mwheel" nil)
-
 (autoload 'mouse-wheel-mode "mwheel" "\
 Toggle mouse wheel support (Mouse Wheel mode).
 
@@ -23097,42 +20717,32 @@ evaluate `(default-value \\='mouse-wheel-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "mwheel" '("mouse-wheel-" "mwheel-"))
 
-;;;***
 
-;;;### (autoloads nil "net-utils" "net/net-utils.el" (0 0 0 0))
 ;;; Generated autoloads from net/net-utils.el
 
 (autoload 'ifconfig "net-utils" "\
 Run `ifconfig-program' and display diagnostic output." t nil)
-
 (autoload 'iwconfig "net-utils" "\
 Run `iwconfig-program' and display diagnostic output." t nil)
-
 (autoload 'netstat "net-utils" "\
 Run `netstat-program' and display diagnostic output." t nil)
-
 (autoload 'arp "net-utils" "\
 Run `arp-program' and display diagnostic output." t nil)
-
 (autoload 'route "net-utils" "\
 Run `route-program' and display diagnostic output." t nil)
-
 (autoload 'traceroute "net-utils" "\
 Run `traceroute-program' for TARGET.
 
-\(fn TARGET)" t nil)
-
+(fn TARGET)" t nil)
 (autoload 'ping "net-utils" "\
 Ping HOST.
 If your system's ping continues until interrupted, you can try setting
 `ping-program-options'.
 
-\(fn HOST)" t nil)
-
+(fn HOST)" t nil)
 (autoload 'nslookup-host "net-utils" "\
 Look up the DNS information for HOST (name or IP address).
 Optional argument NAME-SERVER says which server to use for
@@ -23145,8 +20755,7 @@ See also: `nslookup-host-ipv4', `nslookup-host-ipv6' for
 non-interactive versions of this function more suitable for use
 in Lisp code.
 
-\(fn HOST &optional NAME-SERVER)" t nil)
-
+(fn HOST &optional NAME-SERVER)" t nil)
 (autoload 'nslookup-host-ipv4 "net-utils" "\
 Return the IPv4 address for HOST (name or IP address).
 Optional argument NAME-SERVER says which server to use for DNS
@@ -23158,8 +20767,7 @@ vector of octets.
 
 This command uses `nslookup-program' to look up DNS records.
 
-\(fn HOST &optional NAME-SERVER FORMAT)" nil nil)
-
+(fn HOST &optional NAME-SERVER FORMAT)" nil nil)
 (autoload 'nslookup-host-ipv6 "net-utils" "\
 Return the IPv6 address for HOST (name or IP address).
 Optional argument NAME-SERVER says which server to use for DNS
@@ -23171,11 +20779,9 @@ vector of hextets.
 
 This command uses `nslookup-program' to look up DNS records.
 
-\(fn HOST &optional NAME-SERVER FORMAT)" nil nil)
-
+(fn HOST &optional NAME-SERVER FORMAT)" nil nil)
 (autoload 'nslookup "net-utils" "\
 Run `nslookup-program'." t nil)
-
 (autoload 'dns-lookup-host "net-utils" "\
 Look up the DNS information for HOST (name or IP address).
 Optional argument NAME-SERVER says which server to use for
@@ -23184,8 +20790,7 @@ Interactively, prompt for NAME-SERVER if invoked with 
prefix argument.
 
 This command uses `dns-lookup-program' for looking up the DNS information.
 
-\(fn HOST &optional NAME-SERVER)" t nil)
-
+(fn HOST &optional NAME-SERVER)" t nil)
 (autoload 'run-dig "net-utils" "\
 Look up DNS information for HOST (name or IP address).
 Optional argument NAME-SERVER says which server to use for
@@ -23194,46 +20799,37 @@ Interactively, prompt for NAME-SERVER if invoked with 
prefix argument.
 
 This command uses `dig-program' for looking up the DNS information.
 
-\(fn HOST &optional NAME-SERVER)" t nil)
-
+(fn HOST &optional NAME-SERVER)" t nil)
 (autoload 'ftp "net-utils" "\
 Run `ftp-program' to connect to HOST.
 
-\(fn HOST)" t nil)
-
+(fn HOST)" t nil)
 (autoload 'finger "net-utils" "\
 Finger USER on HOST.
 This command uses `finger-X.500-host-regexps'
 and `network-connection-service-alist', which see.
 
-\(fn USER HOST)" t nil)
-
+(fn USER HOST)" t nil)
 (autoload 'whois "net-utils" "\
 Send SEARCH-STRING to server defined by the `whois-server-name' variable.
 If `whois-guess-server' is non-nil, then try to deduce the correct server
 from SEARCH-STRING.  With argument, prompt for whois server.
 The port is deduced from `network-connection-service-alist'.
 
-\(fn ARG SEARCH-STRING)" t nil)
-
+(fn ARG SEARCH-STRING)" t nil)
 (autoload 'whois-reverse-lookup "net-utils" nil t nil)
-
 (autoload 'network-connection-to-service "net-utils" "\
 Open a network connection to SERVICE on HOST.
 This command uses `network-connection-service-alist', which see.
 
-\(fn HOST SERVICE)" t nil)
-
+(fn HOST SERVICE)" t nil)
 (autoload 'network-connection "net-utils" "\
 Open a network connection to HOST on PORT.
 
-\(fn HOST PORT)" t nil)
-
+(fn HOST PORT)" t nil)
 (register-definition-prefixes "net-utils" '("arp-program" "dig-program" 
"dns-lookup-program" "finger-X.500-host-regexps" "ftp-" "ifconfig-program" 
"ipconfig" "iwconfig-program" "net" "nslookup-" "ping-program" "route-program" 
"run-network-program" "smbclient" "traceroute-program" "whois-"))
 
-;;;***
 
-;;;### (autoloads nil "netrc" "net/netrc.el" (0 0 0 0))
 ;;; Generated autoloads from net/netrc.el
 
 (autoload 'netrc-credentials "netrc" "\
@@ -23241,14 +20837,10 @@ Return a user name/password pair.
 Port specifications will be prioritized in the order they are
 listed in the PORTS list.
 
-\(fn MACHINE &rest PORTS)" nil nil)
-
+(fn MACHINE &rest PORTS)" nil nil)
 (register-definition-prefixes "netrc" '("netrc-"))
 
-;;;***
 
-;;;### (autoloads nil "network-stream" "net/network-stream.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from net/network-stream.el
 
 (autoload 'open-network-stream "network-stream" "\
@@ -23357,23 +20949,18 @@ type (either `gnutls-x509pki' or `gnutls-anon'), and 
the
 remaining elements should be a keyword list accepted by
 gnutls-boot (as returned by `gnutls-boot-parameters').
 
-\(fn NAME BUFFER HOST SERVICE &rest PARAMETERS)" nil nil)
-
-(define-obsolete-function-alias 'open-protocol-stream #'open-network-stream 
"26.1")
-
+(fn NAME BUFFER HOST SERVICE &rest PARAMETERS)" nil nil)
+(define-obsolete-function-alias 'open-protocol-stream #'open-network-stream "\
+26.1")
 (register-definition-prefixes "network-stream" '("network-stream-"))
 
-;;;***
 
-;;;### (autoloads nil "newst-backend" "net/newst-backend.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from net/newst-backend.el
 
 (autoload 'newsticker-running-p "newst-backend" "\
 Check whether newsticker is running.
 Return t if newsticker is running, nil otherwise.  Newsticker is
 considered to be running if the newsticker timer list is not empty." nil nil)
-
 (autoload 'newsticker-start "newst-backend" "\
 Start the newsticker.
 Start the timers for display and retrieval.  If the newsticker, i.e. the
@@ -23381,36 +20968,24 @@ timers, are running already a warning message is 
printed unless
 DO-NOT-COMPLAIN-IF-RUNNING is not nil.
 Run `newsticker-start-hook' if newsticker was not running already.
 
-\(fn &optional DO-NOT-COMPLAIN-IF-RUNNING)" t nil)
-
+(fn &optional DO-NOT-COMPLAIN-IF-RUNNING)" t nil)
 (register-definition-prefixes "newst-backend" '("newsticker-"))
 
-;;;***
 
-;;;### (autoloads nil "newst-plainview" "net/newst-plainview.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from net/newst-plainview.el
 
 (autoload 'newsticker-plainview "newst-plainview" "\
 Start newsticker plainview." t nil)
-
 (register-definition-prefixes "newst-plainview" '("newsticker-"))
 
-;;;***
 
-;;;### (autoloads nil "newst-reader" "net/newst-reader.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from net/newst-reader.el
 
 (autoload 'newsticker-show-news "newst-reader" "\
 Start reading news.  You may want to bind this to a key." t nil)
-
 (register-definition-prefixes "newst-reader" '("newsticker-"))
 
-;;;***
 
-;;;### (autoloads nil "newst-ticker" "net/newst-ticker.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from net/newst-ticker.el
 
 (autoload 'newsticker-ticker-running-p "newst-ticker" "\
@@ -23418,68 +20993,49 @@ Check whether newsticker's actual ticker is running.
 Return t if ticker is running, nil otherwise.  Newsticker is
 considered to be running if the newsticker timer list is not
 empty." nil nil)
-
 (autoload 'newsticker-start-ticker "newst-ticker" "\
 Start newsticker's ticker (but not the news retrieval).
 Start display timer for the actual ticker if wanted and not
 running already." t nil)
-
 (register-definition-prefixes "newst-ticker" '("newsticker-"))
 
-;;;***
 
-;;;### (autoloads nil "newst-treeview" "net/newst-treeview.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from net/newst-treeview.el
 
 (autoload 'newsticker-treeview "newst-treeview" "\
 Start newsticker treeview." t nil)
-
 (register-definition-prefixes "newst-treeview" '("newsticker-"))
 
-;;;***
 
-;;;### (autoloads nil "newsticker" "net/newsticker.el" (0 0 0 0))
 ;;; Generated autoloads from net/newsticker.el
 
 (register-definition-prefixes "newsticker" '("newsticker-version"))
 
-;;;***
 
-;;;### (autoloads nil "nnagent" "gnus/nnagent.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnagent.el
 
 (register-definition-prefixes "nnagent" '("nnagent-"))
 
-;;;***
 
-;;;### (autoloads nil "nnbabyl" "gnus/nnbabyl.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnbabyl.el
 
 (register-definition-prefixes "nnbabyl" '("nnbabyl-"))
 
-;;;***
 
-;;;### (autoloads nil "nndiary" "gnus/nndiary.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nndiary.el
 
 (autoload 'nndiary-generate-nov-databases "nndiary" "\
 Generate NOV databases in all nndiary directories.
 
-\(fn &optional SERVER)" t nil)
-
+(fn &optional SERVER)" t nil)
 (register-definition-prefixes "nndiary" '("nndiary-"))
 
-;;;***
 
-;;;### (autoloads nil "nndir" "gnus/nndir.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nndir.el
 
 (register-definition-prefixes "nndir" '("nndir-"))
 
-;;;***
 
-;;;### (autoloads nil "nndoc" "gnus/nndoc.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nndoc.el
 
 (autoload 'nndoc-add-type "nndoc" "\
@@ -23489,209 +21045,153 @@ as the last checked definition, if t or `first', 
add as the
 first definition, and if any other symbol, add after that
 symbol in the alist.
 
-\(fn DEFINITION &optional POSITION)" nil nil)
-
+(fn DEFINITION &optional POSITION)" nil nil)
 (register-definition-prefixes "nndoc" '("nndoc-"))
 
-;;;***
 
-;;;### (autoloads nil "nndraft" "gnus/nndraft.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nndraft.el
 
 (register-definition-prefixes "nndraft" '("nndraft-"))
 
-;;;***
 
-;;;### (autoloads nil "nneething" "gnus/nneething.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nneething.el
 
 (register-definition-prefixes "nneething" '("nneething-"))
 
-;;;***
 
-;;;### (autoloads nil "nnfolder" "gnus/nnfolder.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnfolder.el
 
 (autoload 'nnfolder-generate-active-file "nnfolder" "\
 Look for mbox folders in the nnfolder directory and make them into groups.
 This command does not work if you use short group names." t nil)
-
 (register-definition-prefixes "nnfolder" '("nnfolder-"))
 
-;;;***
 
-;;;### (autoloads nil "nngateway" "gnus/nngateway.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nngateway.el
 
 (register-definition-prefixes "nngateway" '("nngateway-"))
 
-;;;***
 
-;;;### (autoloads nil "nnheader" "gnus/nnheader.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnheader.el
 
 (register-definition-prefixes "nnheader" '("gnus-" "mail-header-" 
"make-mail-header" "nnheader-" "nntp-"))
 
-;;;***
 
-;;;### (autoloads nil "nnimap" "gnus/nnimap.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnimap.el
 
 (register-definition-prefixes "nnimap" '("nnimap-"))
 
-;;;***
 
-;;;### (autoloads nil "nnmail" "gnus/nnmail.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnmail.el
 
 (register-definition-prefixes "nnmail" '("nnmail-"))
 
-;;;***
 
-;;;### (autoloads nil "nnmaildir" "gnus/nnmaildir.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnmaildir.el
 
 (register-definition-prefixes "nnmaildir" '("nnmaildir-"))
 
-;;;***
 
-;;;### (autoloads nil "nnmairix" "gnus/nnmairix.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnmairix.el
 
 (register-definition-prefixes "nnmairix" '("nnmairix-"))
 
-;;;***
 
-;;;### (autoloads nil "nnmbox" "gnus/nnmbox.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnmbox.el
 
 (register-definition-prefixes "nnmbox" '("nnmbox-"))
 
-;;;***
 
-;;;### (autoloads nil "nnmh" "gnus/nnmh.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnmh.el
 
 (register-definition-prefixes "nnmh" '("nnmh-"))
 
-;;;***
 
-;;;### (autoloads nil "nnml" "gnus/nnml.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnml.el
 
 (autoload 'nnml-generate-nov-databases "nnml" "\
 Generate NOV databases in all nnml directories.
 
-\(fn &optional SERVER)" t nil)
-
+(fn &optional SERVER)" t nil)
 (register-definition-prefixes "nnml" '("nnml-"))
 
-;;;***
 
-;;;### (autoloads nil "nnnil" "gnus/nnnil.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnnil.el
 
 (register-definition-prefixes "nnnil" '("nnnil-"))
 
-;;;***
 
-;;;### (autoloads nil "nnoo" "gnus/nnoo.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnoo.el
 
 (register-definition-prefixes "nnoo" '("deffoo" "defvoo" "nnoo-" 
"noo--defalias"))
 
-;;;***
 
-;;;### (autoloads nil "nnregistry" "gnus/nnregistry.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnregistry.el
 
 (register-definition-prefixes "nnregistry" '("nnregistry-"))
 
-;;;***
 
-;;;### (autoloads nil "nnrss" "gnus/nnrss.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnrss.el
 
 (register-definition-prefixes "nnrss" '("nnrss-"))
 
-;;;***
 
-;;;### (autoloads nil "nnselect" "gnus/nnselect.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnselect.el
 
 (register-definition-prefixes "nnselect" '("gnus-" "ids-by-group" "nnselect-" 
"numbers-by-group"))
 
-;;;***
 
-;;;### (autoloads nil "nnspool" "gnus/nnspool.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnspool.el
 
 (register-definition-prefixes "nnspool" '("news-inews-program" "nnspool-"))
 
-;;;***
 
-;;;### (autoloads nil "nntp" "gnus/nntp.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nntp.el
 
 (register-definition-prefixes "nntp" '("nntp-"))
 
-;;;***
 
-;;;### (autoloads nil "nnvirtual" "gnus/nnvirtual.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnvirtual.el
 
 (register-definition-prefixes "nnvirtual" '("nnvirtual-"))
 
-;;;***
 
-;;;### (autoloads nil "nnweb" "gnus/nnweb.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/nnweb.el
 
 (register-definition-prefixes "nnweb" '("nnweb-"))
 
-;;;***
 
-;;;### (autoloads nil "notifications" "notifications.el" (0 0 0 0))
 ;;; Generated autoloads from notifications.el
 
 (register-definition-prefixes "notifications" '("notifications-"))
 
-;;;***
 
-;;;### (autoloads nil "novice" "novice.el" (0 0 0 0))
 ;;; Generated autoloads from novice.el
 
 (defvar disabled-command-function 'disabled-command-function "\
 Function to call to handle disabled commands.
 If nil, the feature is disabled, i.e., all commands work normally.")
-
 (autoload 'disabled-command-function "novice" "\
 
 
-\(fn &optional CMD KEYS)" nil nil)
-
+(fn &optional CMD KEYS)" nil nil)
 (autoload 'enable-command "novice" "\
 Allow COMMAND to be executed without special confirmation from now on.
 COMMAND must be a symbol.
 This command alters the user's .emacs file so that this will apply
 to future sessions.
 
-\(fn COMMAND)" t nil)
-
+(fn COMMAND)" t nil)
 (autoload 'disable-command "novice" "\
 Require special confirmation to execute COMMAND from now on.
 COMMAND must be a symbol.
 This command alters your init file so that this choice applies to
 future sessions.
 
-\(fn COMMAND)" t nil)
-
+(fn COMMAND)" t nil)
 (register-definition-prefixes "novice" '("en/disable-command"))
 
-;;;***
 
-;;;### (autoloads nil "nroff-mode" "textmodes/nroff-mode.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from textmodes/nroff-mode.el
 
 (autoload 'nroff-mode "nroff-mode" "\
@@ -23701,42 +21201,31 @@ Turning on Nroff mode runs `text-mode-hook', then 
`nroff-mode-hook'.
 Also, try `nroff-electric-mode', for automatically inserting
 closing requests for requests that are used in matched pairs.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "nroff-mode" '("nroff-"))
 
-;;;***
 
-;;;### (autoloads nil "nsm" "net/nsm.el" (0 0 0 0))
 ;;; Generated autoloads from net/nsm.el
 
 (register-definition-prefixes "nsm" '("network-security-" "nsm-"))
 
-;;;***
 
-;;;### (autoloads nil "ntlm" "net/ntlm.el" (0 0 0 0))
 ;;; Generated autoloads from net/ntlm.el
-(push (purecopy '(ntlm 2 1 0)) package--builtin-versions)
 
+(push (purecopy '(ntlm 2 1 0)) package--builtin-versions)
 (register-definition-prefixes "ntlm" '("ntlm-"))
 
-;;;***
 
-;;;### (autoloads nil "nxml-enc" "nxml/nxml-enc.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/nxml-enc.el
 
 (register-definition-prefixes "nxml-enc" '("nxml-"))
 
-;;;***
 
-;;;### (autoloads nil "nxml-maint" "nxml/nxml-maint.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/nxml-maint.el
 
 (register-definition-prefixes "nxml-maint" 
'("nxml-insert-target-repertoire-glyph-set"))
 
-;;;***
 
-;;;### (autoloads nil "nxml-mode" "nxml/nxml-mode.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/nxml-mode.el
 
 (autoload 'nxml-mode "nxml-mode" "\
@@ -23791,359 +21280,271 @@ to nil.  For more details, see the function 
`nxml-forward-balanced-item'.
 Many aspects this mode can be customized using
 \\[customize-group] nxml RET.
 
-\(fn)" t nil)
+(fn)" t nil)
 (defalias 'xml-mode 'nxml-mode)
-
 (register-definition-prefixes "nxml-mode" '("nxml-"))
 
-;;;***
 
-;;;### (autoloads nil "nxml-ns" "nxml/nxml-ns.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/nxml-ns.el
 
 (register-definition-prefixes "nxml-ns" '("nxml-ns-"))
 
-;;;***
 
-;;;### (autoloads nil "nxml-outln" "nxml/nxml-outln.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/nxml-outln.el
 
 (register-definition-prefixes "nxml-outln" '("nxml-"))
 
-;;;***
 
-;;;### (autoloads nil "nxml-parse" "nxml/nxml-parse.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/nxml-parse.el
 
 (register-definition-prefixes "nxml-parse" '("nxml-"))
 
-;;;***
 
-;;;### (autoloads nil "nxml-rap" "nxml/nxml-rap.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/nxml-rap.el
 
 (register-definition-prefixes "nxml-rap" '("nxml-"))
 
-;;;***
 
-;;;### (autoloads nil "nxml-util" "nxml/nxml-util.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/nxml-util.el
 
 (register-definition-prefixes "nxml-util" '("nxml-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-C" "org/ob-C.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-C.el
 
 (register-definition-prefixes "ob-C" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-R" "org/ob-R.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-R.el
 
 (register-definition-prefixes "ob-R" '("ob-" "org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-awk" "org/ob-awk.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-awk.el
 
 (register-definition-prefixes "ob-awk" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-calc" "org/ob-calc.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-calc.el
 
 (register-definition-prefixes "ob-calc" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-clojure" "org/ob-clojure.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-clojure.el
 
 (register-definition-prefixes "ob-clojure" '("ob-clojure-" "org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-comint" "org/ob-comint.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-comint.el
 
 (register-definition-prefixes "ob-comint" '("org-babel-comint-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-css" "org/ob-css.el" (0 0 0 0))
+;;; Generated autoloads from org/ob-core.el
+
+(register-definition-prefixes "ob-core" '("org-"))
+
+
 ;;; Generated autoloads from org/ob-css.el
 
 (register-definition-prefixes "ob-css" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-ditaa" "org/ob-ditaa.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-ditaa.el
 
 (register-definition-prefixes "ob-ditaa" '("org-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-dot" "org/ob-dot.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-dot.el
 
 (register-definition-prefixes "ob-dot" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-emacs-lisp" "org/ob-emacs-lisp.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from org/ob-emacs-lisp.el
 
 (register-definition-prefixes "ob-emacs-lisp" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-eshell" "org/ob-eshell.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-eshell.el
 
 (register-definition-prefixes "ob-eshell" '("ob-eshell-session-live-p" 
"org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-eval" "org/ob-eval.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-eval.el
 
 (register-definition-prefixes "ob-eval" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-exp" "org/ob-exp.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-exp.el
 
 (register-definition-prefixes "ob-exp" '("org-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-forth" "org/ob-forth.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-forth.el
 
 (register-definition-prefixes "ob-forth" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-fortran" "org/ob-fortran.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-fortran.el
 
 (register-definition-prefixes "ob-fortran" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-gnuplot" "org/ob-gnuplot.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-gnuplot.el
 
 (register-definition-prefixes "ob-gnuplot" '("*org-babel-gnuplot-" 
"org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-groovy" "org/ob-groovy.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-groovy.el
 
 (register-definition-prefixes "ob-groovy" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-haskell" "org/ob-haskell.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-haskell.el
 
 (register-definition-prefixes "ob-haskell" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-java" "org/ob-java.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-java.el
 
 (register-definition-prefixes "ob-java" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-js" "org/ob-js.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-js.el
 
 (register-definition-prefixes "ob-js" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-julia" "org/ob-julia.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-julia.el
 
 (register-definition-prefixes "ob-julia" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-latex" "org/ob-latex.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-latex.el
 
 (register-definition-prefixes "ob-latex" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-lilypond" "org/ob-lilypond.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-lilypond.el
 
 (register-definition-prefixes "ob-lilypond" '("lilypond-mode" 
"ob-lilypond-header-args" "org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-lisp" "org/ob-lisp.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-lisp.el
 
 (register-definition-prefixes "ob-lisp" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-lua" "org/ob-lua.el" (0 0 0 0))
+;;; Generated autoloads from org/ob-lob.el
+
+(register-definition-prefixes "ob-lob" '("org-babel-"))
+
+
 ;;; Generated autoloads from org/ob-lua.el
 
 (register-definition-prefixes "ob-lua" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-makefile" "org/ob-makefile.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-makefile.el
 
 (register-definition-prefixes "ob-makefile" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-maxima" "org/ob-maxima.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-maxima.el
 
 (register-definition-prefixes "ob-maxima" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-ocaml" "org/ob-ocaml.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-ocaml.el
 
 (register-definition-prefixes "ob-ocaml" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-octave" "org/ob-octave.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-octave.el
 
 (register-definition-prefixes "ob-octave" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-org" "org/ob-org.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-org.el
 
 (register-definition-prefixes "ob-org" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-perl" "org/ob-perl.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-perl.el
 
 (register-definition-prefixes "ob-perl" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-plantuml" "org/ob-plantuml.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-plantuml.el
 
 (register-definition-prefixes "ob-plantuml" '("org-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-processing" "org/ob-processing.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from org/ob-processing.el
 
 (register-definition-prefixes "ob-processing" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-python" "org/ob-python.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-python.el
 
 (register-definition-prefixes "ob-python" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-ref" "org/ob-ref.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-ref.el
 
 (register-definition-prefixes "ob-ref" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-ruby" "org/ob-ruby.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-ruby.el
 
 (register-definition-prefixes "ob-ruby" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-sass" "org/ob-sass.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-sass.el
 
 (register-definition-prefixes "ob-sass" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-scheme" "org/ob-scheme.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-scheme.el
 
 (register-definition-prefixes "ob-scheme" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-screen" "org/ob-screen.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-screen.el
 
 (register-definition-prefixes "ob-screen" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-sed" "org/ob-sed.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-sed.el
 
 (register-definition-prefixes "ob-sed" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-shell" "org/ob-shell.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-shell.el
 
 (register-definition-prefixes "ob-shell" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-sql" "org/ob-sql.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-sql.el
 
 (register-definition-prefixes "ob-sql" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-sqlite" "org/ob-sqlite.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-sqlite.el
 
 (register-definition-prefixes "ob-sqlite" '("org-babel-"))
 
-;;;***
 
-;;;### (autoloads nil "ob-table" "org/ob-table.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-table.el
 
 (register-definition-prefixes "ob-table" '("org-"))
 
-;;;***
 
-;;;### (autoloads nil "oc" "org/oc.el" (0 0 0 0))
+;;; Generated autoloads from org/ob-tangle.el
+
+(register-definition-prefixes "ob-tangle" '("org-babel-"))
+
+
 ;;; Generated autoloads from org/oc.el
 
 (autoload 'org-cite-insert "oc" "\
@@ -24151,47 +21552,35 @@ Insert a citation at point.
 Insertion is done according to the processor set in 
`org-cite-insert-processor'.
 ARG is the prefix argument received when calling interactively the function.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (register-definition-prefixes "oc" '("org-cite-"))
 
-;;;***
 
-;;;### (autoloads nil "oc-basic" "org/oc-basic.el" (0 0 0 0))
 ;;; Generated autoloads from org/oc-basic.el
 
 (register-definition-prefixes "oc-basic" '("org-cite-basic-"))
 
-;;;***
 
-;;;### (autoloads nil "oc-biblatex" "org/oc-biblatex.el" (0 0 0 0))
 ;;; Generated autoloads from org/oc-biblatex.el
 
 (register-definition-prefixes "oc-biblatex" '("org-cite-biblatex-"))
 
-;;;***
 
-;;;### (autoloads nil "oc-csl" "org/oc-csl.el" (0 0 0 0))
 ;;; Generated autoloads from org/oc-csl.el
 
 (register-definition-prefixes "oc-csl" '("org-cite-csl-"))
 
-;;;***
 
-;;;### (autoloads nil "oc-natbib" "org/oc-natbib.el" (0 0 0 0))
 ;;; Generated autoloads from org/oc-natbib.el
 
 (register-definition-prefixes "oc-natbib" '("org-cite-natbib-"))
 
-;;;***
 
-;;;### (autoloads nil "octave" "progmodes/octave.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/octave.el
- (add-to-list 'auto-mode-alist '("\\.m\\'" . octave-maybe-mode))
 
+ (add-to-list 'auto-mode-alist '("\\.m\\'" . octave-maybe-mode))
 (autoload 'octave-maybe-mode "octave" "\
 Select `octave-mode' if the current buffer seems to hold Octave code." nil nil)
-
 (autoload 'octave-mode "octave" "\
 Major mode for editing Octave code.
 
@@ -24205,8 +21594,7 @@ See Info node `(octave-mode) Using Octave Mode' for 
more details.
 Key bindings:
 \\{octave-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'inferior-octave "octave" "\
 Run an inferior Octave process, I/O via `inferior-octave-buffer'.
 This buffer is put in Inferior Octave mode.  See `inferior-octave-mode'.
@@ -24220,103 +21608,90 @@ Additional commands to be executed on startup can be 
provided either in
 the file specified by `inferior-octave-startup-file' or by the default
 startup file, `~/.emacs-octave'.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defalias 'run-octave 'inferior-octave)
-
 (register-definition-prefixes "octave" '("inferior-octave-" "octave-"))
 
-;;;***
 
-;;;### (autoloads nil "ogonek" "international/ogonek.el" (0 0 0 0))
 ;;; Generated autoloads from international/ogonek.el
 
 (register-definition-prefixes "ogonek" '("ogonek-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-bibtex" "org/ol-bibtex.el" (0 0 0 0))
+;;; Generated autoloads from org/ol.el
+
+(register-definition-prefixes "ol" '("org-"))
+
+
+;;; Generated autoloads from org/ol-bbdb.el
+
+(register-definition-prefixes "ol-bbdb" '("org-bbdb-"))
+
+
 ;;; Generated autoloads from org/ol-bibtex.el
 
 (register-definition-prefixes "ol-bibtex" '("org-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-docview" "org/ol-docview.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-docview.el
 
 (register-definition-prefixes "ol-docview" '("org-docview-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-doi" "org/ol-doi.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-doi.el
 
 (register-definition-prefixes "ol-doi" '("org-link-doi-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-eshell" "org/ol-eshell.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-eshell.el
 
 (register-definition-prefixes "ol-eshell" '("org-eshell-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-eww" "org/ol-eww.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-eww.el
 
 (register-definition-prefixes "ol-eww" '("org-eww-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-gnus" "org/ol-gnus.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-gnus.el
 
 (register-definition-prefixes "ol-gnus" '("org-gnus-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-info" "org/ol-info.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-info.el
 
 (register-definition-prefixes "ol-info" '("org-info-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-man" "org/ol-man.el" (0 0 0 0))
+;;; Generated autoloads from org/ol-irc.el
+
+(register-definition-prefixes "ol-irc" '("org-irc-"))
+
+
 ;;; Generated autoloads from org/ol-man.el
 
 (register-definition-prefixes "ol-man" '("org-man-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-mhe" "org/ol-mhe.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-mhe.el
 
 (register-definition-prefixes "ol-mhe" '("org-mhe-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-rmail" "org/ol-rmail.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-rmail.el
 
 (register-definition-prefixes "ol-rmail" '("org-rmail-"))
 
-;;;***
 
-;;;### (autoloads nil "ol-w3m" "org/ol-w3m.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-w3m.el
 
 (register-definition-prefixes "ol-w3m" '("org-w3m-"))
 
-;;;***
 
-;;;### (autoloads nil "opascal" "progmodes/opascal.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/opascal.el
 
-(define-obsolete-function-alias 'delphi-mode #'opascal-mode "24.4")
-
+(define-obsolete-function-alias 'delphi-mode #'opascal-mode "\
+24.4")
 (autoload 'opascal-mode "opascal" "\
 Major mode for editing OPascal code.
 \\<opascal-mode-map>
@@ -24344,21 +21719,17 @@ Coloring:
  `opascal-keyword-face'                (default `font-lock-keyword-face')
     Face used to color OPascal keywords.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "opascal" '("opascal-"))
 
-;;;***
 
-;;;### (autoloads nil "org" "org/org.el" (0 0 0 0))
 ;;; Generated autoloads from org/org.el
-(push (purecopy '(org 9 5 3)) package--builtin-versions)
 
+(push (purecopy '(org 9 5 4)) package--builtin-versions)
 (autoload 'org-babel-do-load-languages "org" "\
 Load the languages defined in `org-babel-load-languages'.
 
-\(fn SYM VALUE)" nil nil)
-
+(fn SYM VALUE)" nil nil)
 (autoload 'org-babel-load-file "org" "\
 Load Emacs Lisp source code blocks in the Org FILE.
 This function exports the source code using `org-babel-tangle'
@@ -24366,8 +21737,7 @@ and then loads the resulting file using `load-file'.  
With
 optional prefix argument COMPILE, the tangled Emacs Lisp file is
 byte-compiled before it is loaded.
 
-\(fn FILE &optional COMPILE)" t nil)
-
+(fn FILE &optional COMPILE)" t nil)
 (autoload 'org-version "org" "\
 Show the Org version.
 Interactively, or when MESSAGE is non-nil, show it in echo area.
@@ -24375,16 +21745,13 @@ With prefix argument, or when HERE is non-nil, insert 
it at point.
 In non-interactive uses, a reduced version string is output unless
 FULL is given.
 
-\(fn &optional HERE FULL MESSAGE)" t nil)
-
+(fn &optional HERE FULL MESSAGE)" t nil)
 (autoload 'org-load-modules-maybe "org" "\
 Load all extensions listed in `org-modules'.
 
-\(fn &optional FORCE)" nil nil)
-
+(fn &optional FORCE)" nil nil)
 (autoload 'org-clock-persistence-insinuate "org" "\
 Set up hooks for clock persistence." nil nil)
-
 (autoload 'org-mode "org" "\
 Outline-based notes management and organizer, alias
 \"Carsten's outline-mode for keeping track of everything.\"
@@ -24404,8 +21771,7 @@ The following commands are available:
 
 \\{org-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'org-cycle "org" "\
 TAB-action and visibility cycling for Org mode.
 
@@ -24456,23 +21822,20 @@ there is no headline there, and if the variable 
`org-cycle-global-at-bob'
 is non-nil, this function acts as if called with prefix argument 
(`\\[universal-argument] TAB',
 same as `S-TAB') also when called without prefix argument.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'org-global-cycle "org" "\
 Cycle the global visibility.  For details see `org-cycle'.
 With `\\[universal-argument]' prefix ARG, switch to startup visibility.
 With a numeric prefix, show all headlines up to that level.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'org-run-like-in-org-mode "org" "\
 Run a command, pretending that the current buffer is in Org mode.
 This will temporarily bind local variables that are typically bound in
 Org mode to the values they have in Org mode, and then interactively
 call CMD.
 
-\(fn CMD)" nil nil)
-
+(fn CMD)" nil nil)
 (autoload 'org-open-file "org" "\
 Open the file at PATH.
 First, this expands any special file name abbreviations.  Then the
@@ -24495,8 +21858,7 @@ link, please customize `org-link-frame-setup'.
 
 If the file does not exist, throw an error.
 
-\(fn PATH &optional IN-EMACS LINE SEARCH)" nil nil)
-
+(fn PATH &optional IN-EMACS LINE SEARCH)" nil nil)
 (autoload 'org-open-at-point-global "org" "\
 Follow a link or a time-stamp like Org mode does.
 Also follow links and emails as seen by `thing-at-point'.
@@ -24504,7 +21866,6 @@ This command can be called in any mode to follow an 
external
 link or a time-stamp that has Org mode syntax.  Its behavior
 is undefined when called on internal links like fuzzy links.
 Raise a user error when there is nothing to follow." t nil)
-
 (autoload 'org-offer-links-in-entry "org" "\
 Offer links in the current entry and return the selected link.
 If there is only one link, return it.
@@ -24512,8 +21873,7 @@ If NTH is an integer, return the NTH link found.
 If ZERO is a string, check also this string for a link, and if
 there is one, return it.
 
-\(fn BUFFER MARKER &optional NTH ZERO)" nil nil)
-
+(fn BUFFER MARKER &optional NTH ZERO)" nil nil)
 (autoload 'org-switchb "org" "\
 Switch between Org buffers.
 
@@ -24521,13 +21881,11 @@ With `\\[universal-argument]' prefix, restrict 
available buffers to files.
 
 With `\\[universal-argument] \\[universal-argument]' prefix, restrict 
available buffers to agenda files.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'org-cycle-agenda-files "org" "\
 Cycle through the files in `org-agenda-files'.
 If the current buffer visits an agenda file, find the next one in the list.
 If the current buffer does not, find the first agenda file." t nil)
-
 (autoload 'org-submit-bug-report "org" "\
 Submit a bug report on Org via mail.
 
@@ -24536,28 +21894,22 @@ Don't hesitate to report any problems or inaccurate 
documentation.
 If you don't have setup sending mail from (X)Emacs, please copy the
 output buffer into your mail program, as it gives us important
 information about your Org version and configuration." t nil)
-
 (autoload 'org-reload "org" "\
 Reload all Org Lisp files.
 With prefix arg UNCOMPILED, load the uncompiled versions.
 
-\(fn &optional UNCOMPILED)" t nil)
-
+(fn &optional UNCOMPILED)" t nil)
 (autoload 'org-customize "org" "\
 Call the customize function with org as argument." t nil)
-
 (register-definition-prefixes "org" '("org-" "turn-on-org-cdlatex"))
 
-;;;***
 
-;;;### (autoloads nil "org-agenda" "org/org-agenda.el" (0 0 0 0))
 ;;; Generated autoloads from org/org-agenda.el
 
 (autoload 'org-toggle-sticky-agenda "org-agenda" "\
 Toggle `org-agenda-sticky'.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'org-agenda "org-agenda" "\
 Dispatch agenda commands to collect entries to the agenda buffer.
 Prompts for a command to execute.  Any prefix arg will be passed
@@ -24588,12 +21940,11 @@ searches can be pre-defined in this way.
 
 If the current buffer is in Org mode and visiting a file, you can also
 first press `<' once to indicate that the agenda should be temporarily
-\(until the next use of `\\[org-agenda]') restricted to the current file.
+(until the next use of `\\[org-agenda]') restricted to the current file.
 Pressing `<' twice means to restrict to the current subtree or region
-\(if active).
-
-\(fn &optional ARG KEYS RESTRICTION)" t nil)
+(if active).
 
+(fn &optional ARG KEYS RESTRICTION)" t nil)
 (autoload 'org-batch-agenda "org-agenda" "\
 Run an agenda command in batch mode and send the result to STDOUT.
 If CMD-KEY is a string of length 1, it is used as a key in
@@ -24602,8 +21953,7 @@ longer string it is used as a tags/todo match string.
 Parameters are alternating variable names and values that will be bound
 before running the agenda command.
 
-\(fn CMD-KEY &rest PARAMETERS)" nil t)
-
+(fn CMD-KEY &rest PARAMETERS)" nil t)
 (autoload 'org-batch-agenda-csv "org-agenda" "\
 Run an agenda command in batch mode and send the result to STDOUT.
 If CMD-KEY is a string of length 1, it is used as a key in
@@ -24639,18 +21989,15 @@ priority-l   The priority letter if any was given
 priority-n   The computed numerical priority
 agenda-day   The day in the agenda where this is listed
 
-\(fn CMD-KEY &rest PARAMETERS)" nil t)
-
+(fn CMD-KEY &rest PARAMETERS)" nil t)
 (autoload 'org-store-agenda-views "org-agenda" "\
 Store agenda views.
 
-\(fn &rest PARAMETERS)" t nil)
-
+(fn &rest PARAMETERS)" t nil)
 (autoload 'org-batch-store-agenda-views "org-agenda" "\
 Run all custom agenda commands that have a file argument.
 
-\(fn &rest PARAMETERS)" nil t)
-
+(fn &rest PARAMETERS)" nil t)
 (autoload 'org-agenda-list "org-agenda" "\
 Produce a daily/weekly view from all files in variable `org-agenda-files'.
 The view will be for the current day or week, but from the overview buffer
@@ -24666,8 +22013,7 @@ given in `org-agenda-start-on-weekday'.
 When WITH-HOUR is non-nil, only include scheduled and deadline
 items if they have an hour specification like [h]h:mm.
 
-\(fn &optional ARG START-DAY SPAN WITH-HOUR)" t nil)
-
+(fn &optional ARG START-DAY SPAN WITH-HOUR)" t nil)
 (autoload 'org-search-view "org-agenda" "\
 Show all entries that contain a phrase or words or regular expressions.
 
@@ -24713,8 +22059,7 @@ This command searches the agenda files, and in addition 
the files
 listed in `org-agenda-text-search-extra-files' unless a restriction lock
 is active.
 
-\(fn &optional TODO-ONLY STRING EDIT-AT)" t nil)
-
+(fn &optional TODO-ONLY STRING EDIT-AT)" t nil)
 (autoload 'org-todo-list "org-agenda" "\
 Show all (not done) TODO entries from all agenda files in a single list.
 The prefix arg can be used to select a specific TODO keyword and limit
@@ -24722,22 +22067,19 @@ the list to these.  When using 
`\\[universal-argument]', you will be prompted
 for a keyword.  A numeric prefix directly selects the Nth keyword in
 `org-todo-keywords-1'.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'org-tags-view "org-agenda" "\
 Show all headlines for all `org-agenda-files' matching a TAGS criterion.
 The prefix arg TODO-ONLY limits the search to TODO entries.
 
-\(fn &optional TODO-ONLY MATCH)" t nil)
-
+(fn &optional TODO-ONLY MATCH)" t nil)
 (autoload 'org-agenda-list-stuck-projects "org-agenda" "\
 Create agenda view for projects that are stuck.
 Stuck projects are project that have no next actions.  For the definitions
 of what a project is and how to check if it stuck, customize the variable
 `org-stuck-projects'.
 
-\(fn &rest IGNORE)" t nil)
-
+(fn &rest IGNORE)" t nil)
 (autoload 'org-diary "org-agenda" "\
 Return diary information from org files.
 This function can be used in a \"sexp\" diary entry in the Emacs calendar.
@@ -24765,13 +22107,11 @@ The function expects the lisp variables `entry' and 
`date' to be provided
 by the caller, because this is how the calendar works.  Don't use this
 function from a program - use `org-agenda-get-day-entries' instead.
 
-\(fn &rest ARGS)" nil nil)
-
+(fn &rest ARGS)" nil nil)
 (autoload 'org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item 
"org-agenda" "\
 Do we have a reason to ignore this TODO entry because it has a time stamp?
 
-\(fn &optional END)" nil nil)
-
+(fn &optional END)" nil nil)
 (autoload 'org-agenda-set-restriction-lock "org-agenda" "\
 Set restriction lock for agenda to current subtree or file.
 When in a restricted subtree, remove it.
@@ -24781,12 +22121,10 @@ or if type is \\='(4), or if the cursor is before the 
first headline
 in the file.  Otherwise, only apply the restriction to the current
 subtree.
 
-\(fn &optional TYPE)" t nil)
-
+(fn &optional TYPE)" t nil)
 (autoload 'org-calendar-goto-agenda "org-agenda" "\
 Compute the Org agenda for the calendar date displayed at the cursor.
 This is a command that has to be installed in `calendar-mode-map'." t nil)
-
 (autoload 'org-agenda-to-appt "org-agenda" "\
 Activate appointments found in `org-agenda-files'.
 
@@ -24813,35 +22151,38 @@ belonging to the \"Work\" category.
 
 ARGS are symbols indicating what kind of entries to consider.
 By default `org-agenda-to-appt' will use :deadline*, :scheduled*
-\(i.e., deadlines and scheduled items with a hh:mm specification)
+(i.e., deadlines and scheduled items with a hh:mm specification)
 and :timestamp entries.  See the docstring of `org-diary' for
 details and examples.
 
 If an entry has a APPT_WARNTIME property, its value will be used
 to override `appt-message-warning-time'.
 
-\(fn &optional REFRESH FILTER &rest ARGS)" t nil)
-
+(fn &optional REFRESH FILTER &rest ARGS)" t nil)
 (register-definition-prefixes "org-agenda" '("org-"))
 
-;;;***
 
-;;;### (autoloads nil "org-attach-git" "org/org-attach-git.el" (0
-;;;;;;  0 0 0))
+;;; Generated autoloads from org/org-archive.el
+
+(register-definition-prefixes "org-archive" '("org-a"))
+
+
+;;; Generated autoloads from org/org-attach.el
+
+(register-definition-prefixes "org-attach" '("org-attach-"))
+
+
 ;;; Generated autoloads from org/org-attach-git.el
 
 (register-definition-prefixes "org-attach-git" '("org-attach-git-"))
 
-;;;***
 
-;;;### (autoloads nil "org-capture" "org/org-capture.el" (0 0 0 0))
 ;;; Generated autoloads from org/org-capture.el
 
 (autoload 'org-capture-string "org-capture" "\
 Capture STRING with the template selected by KEYS.
 
-\(fn STRING &optional KEYS)" t nil)
-
+(fn STRING &optional KEYS)" t nil)
 (autoload 'org-capture "org-capture" "\
 Capture something.
 \\<org-capture-mode-map>
@@ -24871,137 +22212,202 @@ agenda will use the date at point as the default 
date.  Then, a
 `C-1' prefix will tell the capture process to use the HH:MM time
 of the day at point (if any) or the current HH:MM time.
 
-\(fn &optional GOTO KEYS)" t nil)
-
+(fn &optional GOTO KEYS)" t nil)
 (autoload 'org-capture-import-remember-templates "org-capture" "\
 Set `org-capture-templates' to be similar to `org-remember-templates'." t nil)
-
 (register-definition-prefixes "org-capture" '("org-capture-"))
 
-;;;***
 
-;;;### (autoloads nil "org-crypt" "org/org-crypt.el" (0 0 0 0))
+;;; Generated autoloads from org/org-clock.el
+
+(register-definition-prefixes "org-clock" '("org-"))
+
+
+;;; Generated autoloads from org/org-colview.el
+
+(register-definition-prefixes "org-colview" '("org-"))
+
+
+;;; Generated autoloads from org/org-compat.el
+
+(register-definition-prefixes "org-compat" '("org-"))
+
+
 ;;; Generated autoloads from org/org-crypt.el
 
 (autoload 'org-encrypt-entry "org-crypt" "\
 Encrypt the content of the current headline." t nil)
-
 (autoload 'org-decrypt-entry "org-crypt" "\
 Decrypt the content of the current headline." t nil)
-
 (autoload 'org-encrypt-entries "org-crypt" "\
 Encrypt all top-level entries in the current buffer." t nil)
-
 (autoload 'org-decrypt-entries "org-crypt" "\
 Decrypt all entries in the current buffer." t nil)
-
 (autoload 'org-crypt-use-before-save-magic "org-crypt" "\
 Add a hook to automatically encrypt entries before a file is saved to disk." 
nil nil)
-
 (register-definition-prefixes "org-crypt" '("org-"))
 
-;;;***
 
-;;;### (autoloads nil "org-ctags" "org/org-ctags.el" (0 0 0 0))
 ;;; Generated autoloads from org/org-ctags.el
 
 (register-definition-prefixes "org-ctags" '("org-ctags-"))
 
-;;;***
 
-;;;### (autoloads nil "org-entities" "org/org-entities.el" (0 0 0
-;;;;;;  0))
+;;; Generated autoloads from org/org-datetree.el
+
+(register-definition-prefixes "org-datetree" '("org-datetree-"))
+
+
+;;; Generated autoloads from org/org-duration.el
+
+(register-definition-prefixes "org-duration" '("org-duration-"))
+
+
+;;; Generated autoloads from org/org-element.el
+
+(register-definition-prefixes "org-element" '("org-element-"))
+
+
 ;;; Generated autoloads from org/org-entities.el
 
 (register-definition-prefixes "org-entities" '("org-entit"))
 
-;;;***
 
-;;;### (autoloads nil "org-faces" "org/org-faces.el" (0 0 0 0))
 ;;; Generated autoloads from org/org-faces.el
 
 (register-definition-prefixes "org-faces" '("org-"))
 
-;;;***
 
-;;;### (autoloads nil "org-habit" "org/org-habit.el" (0 0 0 0))
+;;; Generated autoloads from org/org-feed.el
+
+(register-definition-prefixes "org-feed" '("org-feed-"))
+
+
+;;; Generated autoloads from org/org-footnote.el
+
+(register-definition-prefixes "org-footnote" '("org-footnote-"))
+
+
+;;; Generated autoloads from org/org-goto.el
+
+(register-definition-prefixes "org-goto" '("org-goto-"))
+
+
 ;;; Generated autoloads from org/org-habit.el
 
 (register-definition-prefixes "org-habit" '("org-"))
 
-;;;***
 
-;;;### (autoloads nil "org-inlinetask" "org/org-inlinetask.el" (0
-;;;;;;  0 0 0))
+;;; Generated autoloads from org/org-id.el
+
+(register-definition-prefixes "org-id" '("org-id-"))
+
+
+;;; Generated autoloads from org/org-indent.el
+
+(register-definition-prefixes "org-indent" '("org-indent-"))
+
+
 ;;; Generated autoloads from org/org-inlinetask.el
 
 (register-definition-prefixes "org-inlinetask" '("org-inlinetask-"))
 
-;;;***
 
-;;;### (autoloads nil "org-macro" "org/org-macro.el" (0 0 0 0))
+;;; Generated autoloads from org/org-keys.el
+
+(register-definition-prefixes "org-keys" '("org-"))
+
+
+;;; Generated autoloads from org/org-lint.el
+
+(register-definition-prefixes "org-lint" '("org-lint-"))
+
+
+;;; Generated autoloads from org/org-list.el
+
+(register-definition-prefixes "org-list" '("org-"))
+
+
 ;;; Generated autoloads from org/org-macro.el
 
 (register-definition-prefixes "org-macro" '("org-macro-"))
 
-;;;***
 
-;;;### (autoloads nil "org-mouse" "org/org-mouse.el" (0 0 0 0))
+;;; Generated autoloads from org/org-macs.el
+
+(register-definition-prefixes "org-macs" '("org-"))
+
+
+;;; Generated autoloads from org/org-mobile.el
+
+(register-definition-prefixes "org-mobile" '("org-mobile-"))
+
+
 ;;; Generated autoloads from org/org-mouse.el
 
 (register-definition-prefixes "org-mouse" '("org-mouse-"))
 
-;;;***
 
-;;;### (autoloads nil "org-pcomplete" "org/org-pcomplete.el" (0 0
-;;;;;;  0 0))
+;;; Generated autoloads from org/org-num.el
+
+(register-definition-prefixes "org-num" '("org-num-"))
+
+
 ;;; Generated autoloads from org/org-pcomplete.el
 
 (register-definition-prefixes "org-pcomplete" '("org-" "pcomplete/org-mode/"))
 
-;;;***
 
-;;;### (autoloads nil "org-protocol" "org/org-protocol.el" (0 0 0
-;;;;;;  0))
+;;; Generated autoloads from org/org-plot.el
+
+(register-definition-prefixes "org-plot" '("org-"))
+
+
 ;;; Generated autoloads from org/org-protocol.el
 
 (register-definition-prefixes "org-protocol" '("org-protocol-"))
 
-;;;***
 
-;;;### (autoloads nil "org-src" "org/org-src.el" (0 0 0 0))
+;;; Generated autoloads from org/org-refile.el
+
+(register-definition-prefixes "org-refile" '("org-"))
+
+
 ;;; Generated autoloads from org/org-src.el
 
 (register-definition-prefixes "org-src" '("org-"))
 
-;;;***
 
-;;;### (autoloads nil "org-tempo" "org/org-tempo.el" (0 0 0 0))
+;;; Generated autoloads from org/org-table.el
+
+(register-definition-prefixes "org-table" '("org"))
+
+
 ;;; Generated autoloads from org/org-tempo.el
 
 (register-definition-prefixes "org-tempo" '("org-tempo-"))
 
-;;;***
 
-;;;### (autoloads nil "org-version" "org/org-version.el" (0 0 0 0))
+;;; Generated autoloads from org/org-timer.el
+
+(register-definition-prefixes "org-timer" '("org-timer-"))
+
+
 ;;; Generated autoloads from org/org-version.el
 
 (autoload 'org-release "org-version" "\
 The release version of Org.
 Inserted by installing Org mode or when a release is made." nil nil)
-
 (autoload 'org-git-version "org-version" "\
 The Git version of Org mode.
 Inserted by installing Org or when a release is made." nil nil)
 
-;;;***
 
-;;;### (autoloads nil "outline" "outline.el" (0 0 0 0))
 ;;; Generated autoloads from outline.el
+
 (put 'outline-regexp 'safe-local-variable 'stringp)
 (put 'outline-heading-end-regexp 'safe-local-variable 'stringp)
 (put 'outline-level 'risky-local-variable t)
-
 (autoload 'outline-mode "outline" "\
 Set major mode for editing outlines with selective display.
 Headings are lines which start with asterisks: one for major headings,
@@ -25025,8 +22431,7 @@ beginning of the line.  The longer the match, the 
deeper the level.
 Turning on outline mode calls the value of `text-mode-hook' and then of
 `outline-mode-hook', if they are non-nil.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'outline-minor-mode "outline" "\
 Toggle Outline minor mode.
 
@@ -25046,14 +22451,35 @@ evaluate `outline-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "outline" '("outline-"))
 
-;;;***
 
-;;;### (autoloads nil "ox-koma-letter" "org/ox-koma-letter.el" (0
-;;;;;;  0 0 0))
+;;; Generated autoloads from org/ox.el
+
+(register-definition-prefixes "ox" '("org-export-"))
+
+
+;;; Generated autoloads from org/ox-ascii.el
+
+(register-definition-prefixes "ox-ascii" '("org-ascii-"))
+
+
+;;; Generated autoloads from org/ox-beamer.el
+
+(register-definition-prefixes "ox-beamer" '("org-beamer-"))
+
+
+;;; Generated autoloads from org/ox-html.el
+
+(register-definition-prefixes "ox-html" '("org-html-"))
+
+
+;;; Generated autoloads from org/ox-icalendar.el
+
+(register-definition-prefixes "ox-icalendar" '("org-icalendar-"))
+
+
 ;;; Generated autoloads from org/ox-koma-letter.el
 
 (autoload 'org-koma-letter-export-as-latex "ox-koma-letter" "\
@@ -25086,8 +22512,7 @@ Export is done in a buffer named \"*Org KOMA-LETTER 
Export*\".  It
 will be displayed if `org-export-show-temporary-export-buffer' is
 non-nil.
 
-\(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil)
-
+(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil)
 (autoload 'org-koma-letter-export-to-latex "ox-koma-letter" "\
 Export current buffer as a KOMA Scrlttr2 letter (tex).
 
@@ -25119,8 +22544,7 @@ directory.
 
 Return output file's name.
 
-\(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil)
-
+(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil)
 (autoload 'org-koma-letter-export-to-pdf "ox-koma-letter" "\
 Export current buffer as a KOMA Scrlttr2 letter (pdf).
 
@@ -25149,23 +22573,48 @@ file-local settings.
 
 Return PDF file's name.
 
-\(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil)
-
+(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil)
 (register-definition-prefixes "ox-koma-letter" '("org-koma-letter-"))
 
-;;;***
 
-;;;### (autoloads nil "ox-man" "org/ox-man.el" (0 0 0 0))
+;;; Generated autoloads from org/ox-latex.el
+
+(register-definition-prefixes "ox-latex" '("org-latex-"))
+
+
 ;;; Generated autoloads from org/ox-man.el
 
 (register-definition-prefixes "ox-man" '("org-man-"))
 
-;;;***
 
-;;;### (autoloads nil "package" "emacs-lisp/package.el" (0 0 0 0))
+;;; Generated autoloads from org/ox-md.el
+
+(register-definition-prefixes "ox-md" '("org-md-"))
+
+
+;;; Generated autoloads from org/ox-odt.el
+
+(register-definition-prefixes "ox-odt" '("org-odt-"))
+
+
+;;; Generated autoloads from org/ox-org.el
+
+(register-definition-prefixes "ox-org" '("org-org-"))
+
+
+;;; Generated autoloads from org/ox-publish.el
+
+(register-definition-prefixes "ox-publish" '("org-publish-"))
+
+
+;;; Generated autoloads from org/ox-texinfo.el
+
+(register-definition-prefixes "ox-texinfo" '("org-texinfo-"))
+
+
 ;;; Generated autoloads from emacs-lisp/package.el
-(push (purecopy '(package 1 1 0)) package--builtin-versions)
 
+(push (purecopy '(package 1 1 0)) package--builtin-versions)
 (defvar package-enable-at-startup t "\
 Whether to make installed packages available when Emacs starts.
 If non-nil, packages are made available before reading the init
@@ -25178,29 +22627,22 @@ with \"-q\").
 Even if the value is nil, you can type \\[package-initialize] to
 make installed packages available at any time, or you can
 call (package-activate-all) in your init-file.")
-
 (custom-autoload 'package-enable-at-startup "package" t)
-
 (defcustom package-user-dir (locate-user-emacs-file "elpa") "\
 Directory containing the user's Emacs Lisp packages.
 The directory name should be absolute.
 Apart from this directory, Emacs also looks for system-wide
 packages in `package-directory-list'." :type 'directory :initialize 
#'custom-initialize-delay :risky t :version "24.1")
-
 (custom-autoload 'package-user-dir "package" t)
-
 (defcustom package-directory-list (let (result) (dolist (f load-path) (and 
(stringp f) (equal (file-name-nondirectory f) "site-lisp") (push 
(expand-file-name "elpa" f) result))) (nreverse result)) "\
 List of additional directories containing Emacs Lisp packages.
 Each directory name should be absolute.
 
 These directories contain packages intended for system-wide; in
 contrast, `package-user-dir' contains packages for personal use." :type 
'(repeat directory) :initialize #'custom-initialize-delay :risky t :version 
"24.1")
-
 (custom-autoload 'package-directory-list "package" t)
-
 (defvar package--activated nil "\
 Non-nil if `package-activate-all' has been run.")
-
 (autoload 'package-initialize "package" "\
 Load Emacs Lisp packages, and activate them.
 The variable `package-load-list' controls which packages to load.
@@ -25217,17 +22659,14 @@ superfluous call to `package-initialize' from your 
init-file.  If
 you have code which must run before `package-initialize', put
 that code in the early init-file.
 
-\(fn &optional NO-ACTIVATE)" t nil)
-
+(fn &optional NO-ACTIVATE)" t nil)
 (defun package-activate-all nil "\
 Activate all installed packages.
-The variable `package-load-list' controls which packages to load." (setq 
package--activated t) (let* ((elc (concat package-quickstart-file "c")) (qs (if 
(file-readable-p elc) elc (if (file-readable-p package-quickstart-file) 
package-quickstart-file)))) (if qs (let ((load-source-file-function nil)) 
(unless (boundp 'package-activated-list) (setq package-activated-list nil)) 
(load qs nil 'nomessage)) (require 'package) (package--activate-all))))
-
+The variable `package-load-list' controls which packages to load." (setq 
package--activated t) (let* ((elc (concat package-quickstart-file "c")) (qs (if 
(file-readable-p elc) elc (if (file-readable-p package-quickstart-file) 
package-quickstart-file)))) (if (and qs (not (bound-and-true-p 
package-activated-list))) (let ((load-source-file-function nil)) (unless 
(boundp 'package-activated-list) (setq package-activated-list nil)) (load qs 
nil 'nomessage)) (require 'package) (package--activate [...]
 (autoload 'package-import-keyring "package" "\
 Import keys from FILE.
 
-\(fn &optional FILE)" t nil)
-
+(fn &optional FILE)" t nil)
 (autoload 'package-refresh-contents "package" "\
 Download descriptions of all configured ELPA packages.
 For each archive configured in the variable `package-archives',
@@ -25236,8 +22675,7 @@ and make them available for download.
 Optional argument ASYNC specifies whether to perform the
 downloads in the background.
 
-\(fn &optional ASYNC)" t nil)
-
+(fn &optional ASYNC)" t nil)
 (autoload 'package-installed-p "package" "\
 Return non-nil if PACKAGE, of MIN-VERSION or newer, is installed.
 If PACKAGE is a symbol, it is the package name and MIN-VERSION
@@ -25245,8 +22683,7 @@ should be a version list.
 
 If PACKAGE is a `package-desc' object, MIN-VERSION is ignored.
 
-\(fn PACKAGE &optional MIN-VERSION)" nil nil)
-
+(fn PACKAGE &optional MIN-VERSION)" nil nil)
 (autoload 'package-install "package" "\
 Install the package PKG.
 PKG can be a `package-desc' or a symbol naming one of the
@@ -25263,13 +22700,17 @@ non-nil, install the package but do not add it to
 If PKG is a `package-desc' and it is already installed, don't try
 to install it but still mark it as selected.
 
-\(fn PKG &optional DONT-SELECT)" t nil)
-
+(fn PKG &optional DONT-SELECT)" t nil)
 (autoload 'package-update "package" "\
 Update package NAME if a newer version exists.
 
-\(fn NAME)" t nil)
+(fn NAME)" t nil)
+(autoload 'package-update-all "package" "\
+Refresh package list and upgrade all packages.
+If QUERY, ask the user before updating packages.  When called
+interactively, QUERY is always true.
 
+(fn &optional QUERY)" t nil)
 (autoload 'package-install-from-buffer "package" "\
 Install a package from the current buffer.
 The current buffer is assumed to be a single .el or .tar file or
@@ -25281,41 +22722,35 @@ description file is not mandatory, in which case the 
information
 is derived from the main .el file in the directory.
 
 Downloads and installs required packages as needed." t nil)
-
 (autoload 'package-install-file "package" "\
 Install a package from FILE.
 The file can either be a tar file, an Emacs Lisp file, or a
 directory.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'package-install-selected-packages "package" "\
 Ensure packages in `package-selected-packages' are installed.
 If some packages are not installed, propose to install them.
 If optional argument NOCONFIRM is non-nil, don't ask for
 confirmation to install packages.
 
-\(fn &optional NOCONFIRM)" t nil)
-
+(fn &optional NOCONFIRM)" t nil)
 (autoload 'package-reinstall "package" "\
 Reinstall package PKG.
 PKG should be either a symbol, the package name, or a `package-desc'
 object.
 
-\(fn PKG)" t nil)
-
+(fn PKG)" t nil)
 (autoload 'package-autoremove "package" "\
 Remove packages that are no longer needed.
 
 Packages that are no more needed by other packages in
 `package-selected-packages' and their dependencies
 will be deleted." t nil)
-
 (autoload 'describe-package "package" "\
 Display the full documentation of PACKAGE (a symbol).
 
-\(fn PACKAGE)" t nil)
-
+(fn PACKAGE)" t nil)
 (autoload 'list-packages "package" "\
 Display a list of packages.
 This first fetches the updated list of packages before
@@ -25324,10 +22759,8 @@ The list is displayed in a buffer named `*Packages*', 
and
 includes the package's version, availability status, and a
 short description.
 
-\(fn &optional NO-FETCH)" t nil)
-
+(fn &optional NO-FETCH)" t nil)
 (defalias 'package-list-packages 'list-packages)
-
 (autoload 'package-get-version "package" "\
 Return the version number of the package in which this is used.
 Assumes it is used from an Elisp file placed inside the top-level directory
@@ -25335,20 +22768,13 @@ of an installed ELPA package.
 The return value is a string (or nil in case we can't find it).
 It works in more cases if the call is in the file which contains
 the `Version:' header." nil nil)
-
 (function-put 'package-get-version 'pure 't)
-
 (defcustom package-quickstart-file (locate-user-emacs-file 
"package-quickstart.el") "\
 Location of the file used to speed up activation of packages at startup." 
:type 'file :initialize #'custom-initialize-delay :version "27.1")
-
 (custom-autoload 'package-quickstart-file "package" t)
-
 (register-definition-prefixes "package" '("bad-signature" "define-package" 
"describe-package-1" "package-"))
 
-;;;***
 
-;;;### (autoloads nil "package-x" "emacs-lisp/package-x.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emacs-lisp/package-x.el
 
 (autoload 'package-upload-file "package-x" "\
@@ -25361,27 +22787,21 @@ contents list with this information.
 If `package-archive-upload-base' does not specify a valid upload
 destination, prompt for one.  If the directory does not exist, it
 is created.  The directory need not have any initial contents
-\(i.e., you can use this command to populate an initially empty
+(i.e., you can use this command to populate an initially empty
 archive).
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (register-definition-prefixes "package-x" '("package-"))
 
-;;;***
 
-;;;### (autoloads nil "page-ext" "textmodes/page-ext.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/page-ext.el
 
 (register-definition-prefixes "page-ext" '("pages-"))
 
-;;;***
 
-;;;### (autoloads nil "parse-time" "calendar/parse-time.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from calendar/parse-time.el
-(put 'parse-time-rules 'risky-local-variable t)
 
+(put 'parse-time-rules 'risky-local-variable t)
 (autoload 'parse-time-string "parse-time" "\
 Parse the time in STRING into (SEC MIN HOUR DAY MON YEAR DOW DST TZ).
 STRING should be an ISO 8601 time string, e.g., \"2020-01-15T16:12:21-08:00\",
@@ -25393,13 +22813,10 @@ The values returned are identical to those of 
`decode-time', but
 any unknown values other than DST are returned as nil, and an
 unknown DST value is returned as -1.
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (register-definition-prefixes "parse-time" '("parse-"))
 
-;;;***
 
-;;;### (autoloads nil "pascal" "progmodes/pascal.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/pascal.el
 
 (autoload 'pascal-mode "pascal" "\
@@ -25444,37 +22861,26 @@ Variables controlling indentation/edit style:
 See also the user variables `pascal-type-keywords', `pascal-start-keywords' and
 `pascal-separator-keywords'.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "pascal" '("electric-pascal-" "pascal-"))
 
-;;;***
 
-;;;### (autoloads nil "password-cache" "password-cache.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from password-cache.el
 
 (defvar password-cache t "\
 Whether to cache passwords.")
-
 (custom-autoload 'password-cache "password-cache" t)
-
 (defvar password-cache-expiry 16 "\
 How many seconds passwords are cached, or nil to disable expiring.
 Whether passwords are cached at all is controlled by `password-cache'.")
-
 (custom-autoload 'password-cache-expiry "password-cache" t)
-
 (autoload 'password-in-cache-p "password-cache" "\
 Check if KEY is in the cache.
 
-\(fn KEY)" nil nil)
-
+(fn KEY)" nil nil)
 (register-definition-prefixes "password-cache" '("password-"))
 
-;;;***
 
-;;;### (autoloads nil "pcase" "emacs-lisp/pcase.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/pcase.el
 
 (autoload 'pcase "pcase" "\
@@ -25517,14 +22923,10 @@ Additional patterns can be defined using 
`pcase-defmacro'.
 See Info node `(elisp) Pattern-Matching Conditional' in the
 Emacs Lisp manual for more information and examples.
 
-\(fn EXP &rest CASES)" nil t)
-
+(fn EXP &rest CASES)" nil t)
 (function-put 'pcase 'lisp-indent-function '1)
-
 (put 'pcase 'function-documentation '(pcase--make-docstring))
-
 (autoload 'pcase--make-docstring "pcase" nil nil nil)
-
 (autoload 'pcase-exhaustive "pcase" "\
 The exhaustive version of `pcase' (which see).
 If EXP fails to match any of the patterns in CASES, an error is
@@ -25533,22 +22935,17 @@ signaled.
 In contrast, `pcase' will return nil if there is no match, but
 not signal an error.
 
-\(fn EXP &rest CASES)" nil t)
-
+(fn EXP &rest CASES)" nil t)
 (function-put 'pcase-exhaustive 'lisp-indent-function '1)
-
 (autoload 'pcase-lambda "pcase" "\
 Like `lambda' but allow each argument to be a pattern.
 I.e. accepts the usual &optional and &rest keywords, but every
 formal argument can be any pattern accepted by `pcase' (a mere
 variable name being but a special case of it).
 
-\(fn LAMBDA-LIST &rest BODY)" nil t)
-
+(fn LAMBDA-LIST &rest BODY)" nil t)
 (function-put 'pcase-lambda 'doc-string-elt '2)
-
 (function-put 'pcase-lambda 'lisp-indent-function 'defun)
-
 (autoload 'pcase-let* "pcase" "\
 Like `let*', but supports destructuring BINDINGS using `pcase' patterns.
 As with `pcase-let', BINDINGS are of the form (PATTERN EXP), but the
@@ -25559,10 +22956,8 @@ Each EXP should match (i.e. be of compatible 
structure) to its
 respective PATTERN; a mismatch may signal an error or may go
 undetected, binding variables to arbitrary values, such as nil.
 
-\(fn BINDINGS &rest BODY)" nil t)
-
+(fn BINDINGS &rest BODY)" nil t)
 (function-put 'pcase-let* 'lisp-indent-function '1)
-
 (autoload 'pcase-let "pcase" "\
 Like `let', but supports destructuring BINDINGS using `pcase' patterns.
 BODY should be a list of expressions, and BINDINGS should be a list of
@@ -25575,10 +22970,8 @@ Each EXP should match (i.e. be of compatible 
structure) to its
 respective PATTERN; a mismatch may signal an error or may go
 undetected, binding variables to arbitrary values, such as nil.
 
-\(fn BINDINGS &rest BODY)" nil t)
-
+(fn BINDINGS &rest BODY)" nil t)
 (function-put 'pcase-let 'lisp-indent-function '1)
-
 (autoload 'pcase-dolist "pcase" "\
 Eval BODY once for each set of bindings defined by PATTERN and LIST elements.
 PATTERN should be a `pcase' pattern describing the structure of
@@ -25590,10 +22983,8 @@ then evaluates BODY with these bindings in effect.  The
 destructuring bindings of variables in PATTERN to the subfields
 of the elements of LIST is performed as if by `pcase-let'.
 
-\(fn (PATTERN LIST) BODY...)" nil t)
-
+(fn (PATTERN LIST) BODY...)" nil t)
 (function-put 'pcase-dolist 'lisp-indent-function '1)
-
 (autoload 'pcase-setq "pcase" "\
 Assign values to variables by destructuring with `pcase'.
 PATTERNS are normal `pcase' patterns, and VALUES are expression.
@@ -25605,8 +22996,7 @@ An example: (pcase-setq \\=`((,a) [(,b)]) \\='((1) 
[(2)]))
 VAL is presumed to match PAT.  Failure to match may signal an error or go
 undetected, binding variables to arbitrary values, such as nil.
 
-\(fn PATTERNS VALUE PATTERN VALUES ...)" nil t)
-
+(fn PATTERNS VALUE PATTERN VALUES ...)" nil t)
 (autoload 'pcase-defmacro "pcase" "\
 Define a new kind of pcase PATTERN, by macro expansion.
 Patterns of the form (NAME ...) will be expanded according
@@ -25615,146 +23005,99 @@ to this macro.
 By convention, DOC should use \"EXPVAL\" to stand
 for the result of evaluating EXP (first arg to `pcase').
 
-\(fn NAME ARGS [DOC] &rest BODY...)" nil t)
-
+(fn NAME ARGS [DOC] &rest BODY...)" nil t)
 (function-put 'pcase-defmacro 'lisp-indent-function '2)
-
 (function-put 'pcase-defmacro 'doc-string-elt '3)
-
 (register-definition-prefixes "pcase" '("pcase-"))
 
-;;;***
 
-;;;### (autoloads nil "pcmpl-cvs" "pcmpl-cvs.el" (0 0 0 0))
 ;;; Generated autoloads from pcmpl-cvs.el
 
 (autoload 'pcomplete/cvs "pcmpl-cvs" "\
 Completion rules for the `cvs' command." nil nil)
-
 (register-definition-prefixes "pcmpl-cvs" '("pcmpl-cvs-"))
 
-;;;***
 
-;;;### (autoloads nil "pcmpl-gnu" "pcmpl-gnu.el" (0 0 0 0))
 ;;; Generated autoloads from pcmpl-gnu.el
 
 (autoload 'pcomplete/gzip "pcmpl-gnu" "\
 Completion for `gzip'." nil nil)
-
 (autoload 'pcomplete/bzip2 "pcmpl-gnu" "\
 Completion for `bzip2'." nil nil)
-
 (autoload 'pcomplete/make "pcmpl-gnu" "\
 Completion for GNU `make'." nil nil)
-
 (autoload 'pcomplete/tar "pcmpl-gnu" "\
 Completion for the GNU tar utility." nil nil)
-
 (autoload 'pcomplete/find "pcmpl-gnu" "\
 Completion for the GNU find utility." nil nil)
-
 (defalias 'pcomplete/gdb 'pcomplete/xargs)
+(register-definition-prefixes "pcmpl-gnu" '("pcmpl-gnu-" "pcomplete/find"))
 
-(register-definition-prefixes "pcmpl-gnu" '("pcmpl-gnu-"))
-
-;;;***
 
-;;;### (autoloads nil "pcmpl-linux" "pcmpl-linux.el" (0 0 0 0))
 ;;; Generated autoloads from pcmpl-linux.el
 
 (autoload 'pcomplete/kill "pcmpl-linux" "\
 Completion for GNU/Linux `kill', using /proc filesystem." nil nil)
-
 (autoload 'pcomplete/umount "pcmpl-linux" "\
 Completion for GNU/Linux `umount'." nil nil)
-
 (autoload 'pcomplete/mount "pcmpl-linux" "\
 Completion for GNU/Linux `mount'." nil nil)
-
 (register-definition-prefixes "pcmpl-linux" '("pcmpl-linux-" 
"pcomplete-pare-list"))
 
-;;;***
 
-;;;### (autoloads nil "pcmpl-rpm" "pcmpl-rpm.el" (0 0 0 0))
 ;;; Generated autoloads from pcmpl-rpm.el
 
 (autoload 'pcomplete/rpm "pcmpl-rpm" "\
 Completion for the `rpm' command." nil nil)
-
 (register-definition-prefixes "pcmpl-rpm" '("pcmpl-rpm-"))
 
-;;;***
 
-;;;### (autoloads nil "pcmpl-unix" "pcmpl-unix.el" (0 0 0 0))
 ;;; Generated autoloads from pcmpl-unix.el
 
 (autoload 'pcomplete/cd "pcmpl-unix" "\
 Completion for `cd'." nil nil)
-
 (defalias 'pcomplete/pushd 'pcomplete/cd)
-
 (autoload 'pcomplete/rmdir "pcmpl-unix" "\
 Completion for `rmdir'." nil nil)
-
 (autoload 'pcomplete/rm "pcmpl-unix" "\
 Completion for `rm'." nil nil)
-
 (autoload 'pcomplete/xargs "pcmpl-unix" "\
 Completion for `xargs'." nil nil)
-
 (defalias 'pcomplete/time 'pcomplete/xargs)
-
 (autoload 'pcomplete/which "pcmpl-unix" "\
 Completion for `which'." nil nil)
-
 (autoload 'pcomplete/chown "pcmpl-unix" "\
 Completion for the `chown' command." nil nil)
-
 (autoload 'pcomplete/chgrp "pcmpl-unix" "\
 Completion for the `chgrp' command." nil nil)
-
 (autoload 'pcomplete/ssh "pcmpl-unix" "\
 Completion rules for the `ssh' command." nil nil)
-
 (autoload 'pcomplete/scp "pcmpl-unix" "\
 Completion rules for the `scp' command.
 Includes files as well as host names followed by a colon." nil nil)
-
 (autoload 'pcomplete/telnet "pcmpl-unix" nil nil nil)
-
 (autoload 'pcomplete/rsh "pcmpl-unix" "\
 Complete `rsh', which, after the user and hostname, is like xargs." nil nil)
-
 (register-definition-prefixes "pcmpl-unix" '("pcmpl-" "pcomplete/"))
 
-;;;***
 
-;;;### (autoloads nil "pcmpl-x" "pcmpl-x.el" (0 0 0 0))
 ;;; Generated autoloads from pcmpl-x.el
 
 (autoload 'pcomplete/tlmgr "pcmpl-x" "\
 Completion for the `tlmgr' command." nil nil)
-
 (autoload 'pcomplete/ack "pcmpl-x" "\
 Completion for the `ack' command.
 Start an argument with `-' to complete short options and `--' for
 long options." nil nil)
-
 (defalias 'pcomplete/ack-grep 'pcomplete/ack)
-
 (autoload 'pcomplete/ag "pcmpl-x" "\
 Completion for the `ag' command." nil nil)
-
 (autoload 'pcomplete/bcc32 "pcmpl-x" "\
 Completion function for Borland's C++ compiler." nil nil)
-
 (defalias 'pcomplete/bcc 'pcomplete/bcc32)
-
 (register-definition-prefixes "pcmpl-x" '("pcmpl-x-"))
 
-;;;***
 
-;;;### (autoloads nil "pcomplete" "pcomplete.el" (0 0 0 0))
 ;;; Generated autoloads from pcomplete.el
 
 (autoload 'pcomplete "pcomplete" "\
@@ -25762,48 +23105,40 @@ Support extensible programmable completion.
 To use this function, just bind the TAB key to it, or add it to your
 completion functions list (it should occur fairly early in the list).
 
-\(fn &optional INTERACTIVELY)" t nil)
-
+(fn &optional INTERACTIVELY)" t nil)
 (make-obsolete 'pcomplete '"use completion-at-point and 
pcomplete-completions-at-point" '"27.1")
-
 (autoload 'pcomplete-reverse "pcomplete" "\
 If cycling completion is in use, cycle backwards." t nil)
-
 (autoload 'pcomplete-expand-and-complete "pcomplete" "\
 Expand the textual value of the current argument.
 This will modify the current buffer." t nil)
-
 (autoload 'pcomplete-continue "pcomplete" "\
 Complete without reference to any cycling completions." t nil)
-
 (autoload 'pcomplete-expand "pcomplete" "\
 Expand the textual value of the current argument.
 This will modify the current buffer." t nil)
-
 (autoload 'pcomplete-help "pcomplete" "\
 Display any help information relative to the current argument." t nil)
-
 (make-obsolete 'pcomplete-help '"use completion-help-at-point and 
pcomplete-completions-at-point" '"27.1")
-
 (autoload 'pcomplete-list "pcomplete" "\
 Show the list of possible completions for the current argument." t nil)
-
 (autoload 'pcomplete-comint-setup "pcomplete" "\
 Setup a comint buffer to use pcomplete.
 COMPLETEF-SYM should be the symbol where the
 dynamic-complete-functions are kept.  For comint mode itself,
 this is `comint-dynamic-complete-functions'.
 
-\(fn COMPLETEF-SYM)" nil nil)
-
+(fn COMPLETEF-SYM)" nil nil)
 (autoload 'pcomplete-shell-setup "pcomplete" "\
 Setup `shell-mode' to use pcomplete." nil nil)
-
 (register-definition-prefixes "pcomplete" '("pcomplete-"))
 
-;;;***
 
-;;;### (autoloads nil "pcvs" "vc/pcvs.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/pconf.el
+
+(register-definition-prefixes "ede/pconf" '("ede-pconf-create-file-query"))
+
+
 ;;; Generated autoloads from vc/pcvs.el
 
 (autoload 'cvs-checkout "pcvs" "\
@@ -25813,8 +23148,7 @@ and run `cvs-mode' on it.
 
 With a prefix argument, prompt for cvs FLAGS to use.
 
-\(fn MODULES DIR FLAGS &optional ROOT)" t nil)
-
+(fn MODULES DIR FLAGS &optional ROOT)" t nil)
 (autoload 'cvs-quickdir "pcvs" "\
 Open a *cvs* buffer on DIR without running cvs.
 With a prefix argument, prompt for a directory to use.
@@ -25823,8 +23157,7 @@ A prefix arg >8 (ex: \\[universal-argument] 
\\[universal-argument]),
 Optional argument NOSHOW if non-nil means not to display the buffer.
 FLAGS is ignored.
 
-\(fn DIR &optional FLAGS NOSHOW)" t nil)
-
+(fn DIR &optional FLAGS NOSHOW)" t nil)
 (autoload 'cvs-examine "pcvs" "\
 Run a `cvs -n update' in the specified DIRECTORY.
 That is, check what needs to be done, but don't change the disc.
@@ -25834,8 +23167,7 @@ A prefix arg >8 (ex: \\[universal-argument] 
\\[universal-argument]),
   prevents reuse of an existing *cvs* buffer.
 Optional argument NOSHOW if non-nil means not to display the buffer.
 
-\(fn DIRECTORY FLAGS &optional NOSHOW)" t nil)
-
+(fn DIRECTORY FLAGS &optional NOSHOW)" t nil)
 (autoload 'cvs-update "pcvs" "\
 Run a `cvs update' in the current working DIRECTORY.
 Feed the output to a *cvs* buffer and run `cvs-mode' on it.
@@ -25845,8 +23177,7 @@ A prefix arg >8 (ex: \\[universal-argument] 
\\[universal-argument]),
 The prefix is also passed to `cvs-flags-query' to select the FLAGS
   passed to cvs.
 
-\(fn DIRECTORY FLAGS)" t nil)
-
+(fn DIRECTORY FLAGS)" t nil)
 (autoload 'cvs-status "pcvs" "\
 Run a `cvs status' in the current working DIRECTORY.
 Feed the output to a *cvs* buffer and run `cvs-mode' on it.
@@ -25855,80 +23186,61 @@ A prefix arg >8 (ex: \\[universal-argument] 
\\[universal-argument]),
   prevents reuse of an existing *cvs* buffer.
 Optional argument NOSHOW if non-nil means not to display the buffer.
 
-\(fn DIRECTORY FLAGS &optional NOSHOW)" t nil)
-
+(fn DIRECTORY FLAGS &optional NOSHOW)" t nil)
 (defvar cvs-dired-action 'cvs-quickdir "\
 The action to be performed when opening a CVS directory.
 Sensible values are `cvs-examine', `cvs-status' and `cvs-quickdir'.")
-
 (custom-autoload 'cvs-dired-action "pcvs" t)
-
 (defvar cvs-dired-use-hook '(4) "\
 Whether or not opening a CVS directory should run PCL-CVS.
 A value of nil means never do it.
 `always' means to always do it unless a prefix argument is given to the
   command that prompted the opening of the directory.
 Anything else means to do it only if the prefix arg is equal to this value.")
-
 (custom-autoload 'cvs-dired-use-hook "pcvs" t)
-
 (defun cvs-dired-noselect (dir) "\
 Run `cvs-examine' if DIR is a CVS administrative directory.
 The exact behavior is determined also by `cvs-dired-use-hook'." (when (stringp 
dir) (setq dir (directory-file-name dir)) (when (and (string= "CVS" 
(file-name-nondirectory dir)) (file-readable-p (expand-file-name "Entries" 
dir)) cvs-dired-use-hook (if (eq cvs-dired-use-hook 'always) (not 
current-prefix-arg) (equal current-prefix-arg cvs-dired-use-hook))) 
(save-excursion (funcall cvs-dired-action (file-name-directory dir) t t)))))
-
 (register-definition-prefixes "pcvs" '("cvs-" "defun-cvs-mode"))
 
-;;;***
 
-;;;### (autoloads nil "pcvs-defs" "vc/pcvs-defs.el" (0 0 0 0))
 ;;; Generated autoloads from vc/pcvs-defs.el
 
 (defvar cvs-global-menu (let ((m (make-sparse-keymap "PCL-CVS"))) (define-key 
m [status] `(menu-item ,(purecopy "Directory Status") cvs-status :help 
,(purecopy "A more verbose status of a workarea"))) (define-key m [checkout] 
`(menu-item ,(purecopy "Checkout Module") cvs-checkout :help ,(purecopy "Check 
out a module from the repository"))) (define-key m [update] `(menu-item 
,(purecopy "Update Directory") cvs-update :help ,(purecopy "Fetch updates from 
the repository"))) (define-key m [ex [...]
 Global menu used by PCL-CVS.")
-
 (register-definition-prefixes "pcvs-defs" '("cvs-"))
 
-;;;***
 
-;;;### (autoloads nil "pcvs-info" "vc/pcvs-info.el" (0 0 0 0))
 ;;; Generated autoloads from vc/pcvs-info.el
 
 (register-definition-prefixes "pcvs-info" '("cvs-"))
 
-;;;***
 
-;;;### (autoloads nil "pcvs-parse" "vc/pcvs-parse.el" (0 0 0 0))
 ;;; Generated autoloads from vc/pcvs-parse.el
 
 (register-definition-prefixes "pcvs-parse" '("cvs-"))
 
-;;;***
 
-;;;### (autoloads nil "pcvs-util" "vc/pcvs-util.el" (0 0 0 0))
 ;;; Generated autoloads from vc/pcvs-util.el
 
 (register-definition-prefixes "pcvs-util" '("cvs-"))
 
-;;;***
 
-;;;### (autoloads nil "perl-mode" "progmodes/perl-mode.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/perl-mode.el
+
 (put 'perl-indent-level 'safe-local-variable 'integerp)
 (put 'perl-continued-statement-offset 'safe-local-variable 'integerp)
 (put 'perl-continued-brace-offset 'safe-local-variable 'integerp)
 (put 'perl-brace-offset 'safe-local-variable 'integerp)
 (put 'perl-brace-imaginary-offset 'safe-local-variable 'integerp)
 (put 'perl-label-offset 'safe-local-variable 'integerp)
-
 (autoload 'perl-flymake "perl-mode" "\
 Perl backend for Flymake.
 Launch `perl-flymake-command' (which see) and pass to its
 standard input the contents of the current buffer.  The output of
 this command is analyzed for error and warning messages.
 
-\(fn REPORT-FN &rest ARGS)" nil nil)
-
+(fn REPORT-FN &rest ARGS)" nil nil)
 (autoload 'perl-mode "perl-mode" "\
 Major mode for editing Perl code.
 Expression and list commands understand all Perl brackets.
@@ -25977,13 +23289,10 @@ Various indentation styles:       K&R  BSD  BLK  GNU  
LW
 
 Turning on Perl mode runs the normal hook `perl-mode-hook'.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "perl-mode" '("indent-perl-exp" 
"mark-perl-function" "perl-"))
 
-;;;***
 
-;;;### (autoloads nil "picture" "textmodes/picture.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/picture.el
 
 (autoload 'picture-mode "picture" "\
@@ -26056,29 +23365,20 @@ Entry to this mode calls the value of 
`picture-mode-hook' if non-nil.
 
 Note that Picture mode commands will work outside of Picture mode, but
 they are not by default assigned to keys." t nil)
-
 (defalias 'edit-picture 'picture-mode)
-
 (register-definition-prefixes "picture" '("picture-"))
 
-;;;***
 
-;;;### (autoloads nil "pinyin" "language/pinyin.el" (0 0 0 0))
 ;;; Generated autoloads from language/pinyin.el
 
 (register-definition-prefixes "pinyin" '("pinyin-character-map"))
 
-;;;***
 
-;;;### (autoloads nil "pixel-fill" "textmodes/pixel-fill.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from textmodes/pixel-fill.el
 
 (register-definition-prefixes "pixel-fill" '("pixel-fill-"))
 
-;;;***
 
-;;;### (autoloads nil "pixel-scroll" "pixel-scroll.el" (0 0 0 0))
 ;;; Generated autoloads from pixel-scroll.el
 
 (defvar pixel-scroll-mode nil "\
@@ -26088,9 +23388,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `pixel-scroll-mode'.")
-
 (custom-autoload 'pixel-scroll-mode "pixel-scroll" nil)
-
 (autoload 'pixel-scroll-mode "pixel-scroll" "\
 A minor mode to scroll text pixel-by-pixel.
 
@@ -26108,8 +23406,7 @@ evaluate `(default-value \\='pixel-scroll-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar pixel-scroll-precision-mode nil "\
 Non-nil if Pixel-Scroll-Precision mode is enabled.
 See the `pixel-scroll-precision-mode' command
@@ -26117,9 +23414,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `pixel-scroll-precision-mode'.")
-
 (custom-autoload 'pixel-scroll-precision-mode "pixel-scroll" nil)
-
 (autoload 'pixel-scroll-precision-mode "pixel-scroll" "\
 Toggle pixel scrolling.
 
@@ -26141,43 +23436,38 @@ evaluate `(default-value 
\\='pixel-scroll-precision-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "pixel-scroll" '("pixel-"))
 
-;;;***
 
-;;;### (autoloads nil "plstore" "plstore.el" (0 0 0 0))
 ;;; Generated autoloads from plstore.el
 
 (autoload 'plstore-open "plstore" "\
 Create a plstore instance associated with FILE.
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (autoload 'plstore-mode "plstore" "\
 Major mode for editing PLSTORE files.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "plstore" '("plstore-"))
 
-;;;***
 
-;;;### (autoloads nil "po" "textmodes/po.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/pmake.el
+
+(register-definition-prefixes "ede/pmake" '("ede-pmake-"))
+
+
 ;;; Generated autoloads from textmodes/po.el
 
 (autoload 'po-find-file-coding-system "po" "\
 Return a (DECODING . ENCODING) pair, according to PO file's charset.
 Called through `file-coding-system-alist', before the file is visited for real.
 
-\(fn ARG-LIST)" nil nil)
-
+(fn ARG-LIST)" nil nil)
 (register-definition-prefixes "po" '("po-"))
 
-;;;***
 
-;;;### (autoloads nil "pong" "play/pong.el" (0 0 0 0))
 ;;; Generated autoloads from play/pong.el
 
 (autoload 'pong "pong" "\
@@ -26188,25 +23478,19 @@ Move left and right bats and try to bounce the ball 
to your opponent.
 pong-mode keybindings:\\<pong-mode-map>
 
 \\{pong-mode-map}" t nil)
-
 (register-definition-prefixes "pong" '("pong-"))
 
-;;;***
 
-;;;### (autoloads nil "pop3" "net/pop3.el" (0 0 0 0))
 ;;; Generated autoloads from net/pop3.el
 
 (autoload 'pop3-movemail "pop3" "\
 Transfer contents of a maildrop to the specified FILE.
 Use streaming commands.
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (register-definition-prefixes "pop3" '("pop3-"))
 
-;;;***
 
-;;;### (autoloads nil "pp" "emacs-lisp/pp.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/pp.el
 
 (autoload 'pp-to-string "pp" "\
@@ -26214,11 +23498,9 @@ Return a string containing the pretty-printed 
representation of OBJECT.
 OBJECT can be any Lisp object.  Quoting characters are used as needed
 to make output that `read' can handle, whenever this is possible.
 
-\(fn OBJECT)" nil nil)
-
+(fn OBJECT)" nil nil)
 (autoload 'pp-buffer "pp" "\
 Prettify the current buffer with printed representation of a Lisp object." t 
nil)
-
 (autoload 'pp "pp" "\
 Output the pretty-printed representation of OBJECT, any Lisp object.
 Quoting characters are printed as needed to make output that `read'
@@ -26232,8 +23514,7 @@ and vectors.  Bind `pp-use-max-width' to a non-nil 
value to do so.
 
 Output stream is STREAM, or value of `standard-output' (which see).
 
-\(fn OBJECT &optional STREAM)" nil nil)
-
+(fn OBJECT &optional STREAM)" nil nil)
 (autoload 'pp-display-expression "pp" "\
 Prettify and display EXPRESSION in an appropriate way, depending on length.
 If LISP, format with `pp-emacs-lisp-code'; use `pp' otherwise.
@@ -26241,47 +23522,39 @@ If LISP, format with `pp-emacs-lisp-code'; use `pp' 
otherwise.
 If a temporary buffer is needed for representation, it will be named
 after OUT-BUFFER-NAME.
 
-\(fn EXPRESSION OUT-BUFFER-NAME &optional LISP)" nil nil)
-
+(fn EXPRESSION OUT-BUFFER-NAME &optional LISP)" nil nil)
 (autoload 'pp-eval-expression "pp" "\
 Evaluate EXPRESSION and pretty-print its value.
 Also add the value to the front of the list in the variable `values'.
 
-\(fn EXPRESSION)" t nil)
-
+(fn EXPRESSION)" t nil)
 (autoload 'pp-macroexpand-expression "pp" "\
 Macroexpand EXPRESSION and pretty-print its value.
 
-\(fn EXPRESSION)" t nil)
-
+(fn EXPRESSION)" t nil)
 (autoload 'pp-eval-last-sexp "pp" "\
 Run `pp-eval-expression' on sexp before point.
 With ARG, pretty-print output into current buffer.
 Ignores leading comment characters.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'pp-macroexpand-last-sexp "pp" "\
 Run `pp-macroexpand-expression' on sexp before point.
 With ARG, pretty-print output into current buffer.
 Ignores leading comment characters.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'pp-emacs-lisp-code "pp" "\
 Insert SEXP into the current buffer, formatted as Emacs Lisp code.
 Use the `pp-max-width' variable to control the desired line length.
 
-\(fn SEXP)" nil nil)
-
+(fn SEXP)" nil nil)
 (register-definition-prefixes "pp" '("pp-"))
 
-;;;***
 
-;;;### (autoloads nil "printing" "printing.el" (0 0 0 0))
 ;;; Generated autoloads from printing.el
-(push (purecopy '(printing 6 9 3)) package--builtin-versions)
 
+(push (purecopy '(printing 6 9 3)) package--builtin-versions)
 (autoload 'pr-interface "printing" "\
 Activate the printing interface buffer.
 
@@ -26289,8 +23562,7 @@ If BUFFER is nil, the current buffer is used for 
printing.
 
 For more information, type \\[pr-interface-help].
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (autoload 'pr-ps-directory-preview "printing" "\
 Preview directory using ghostview.
 
@@ -26308,8 +23580,7 @@ file name.
 
 See also documentation for `pr-list-directory'.
 
-\(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
-
+(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
 (autoload 'pr-ps-directory-using-ghostscript "printing" "\
 Print directory using PostScript through ghostscript.
 
@@ -26327,8 +23598,7 @@ file name.
 
 See also documentation for `pr-list-directory'.
 
-\(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
-
+(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
 (autoload 'pr-ps-directory-print "printing" "\
 Print directory using PostScript printer.
 
@@ -26346,8 +23616,7 @@ file name.
 
 See also documentation for `pr-list-directory'.
 
-\(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
-
+(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
 (autoload 'pr-ps-directory-ps-print "printing" "\
 Print directory using PostScript printer or through ghostscript.
 
@@ -26367,8 +23636,7 @@ file name.
 
 See also documentation for `pr-list-directory'.
 
-\(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
-
+(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
 (autoload 'pr-ps-buffer-preview "printing" "\
 Preview buffer using ghostview.
 
@@ -26381,8 +23649,7 @@ argument FILENAME is treated as follows: if it's nil, 
save the image in a
 temporary file.  If FILENAME is a string, save the PostScript image in a file
 with that name.  If FILENAME is t, prompts for a file name.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-buffer-using-ghostscript "printing" "\
 Print buffer using PostScript through ghostscript.
 
@@ -26395,8 +23662,7 @@ argument FILENAME is treated as follows: if it's nil, 
send the image to the
 printer.  If FILENAME is a string, save the PostScript image in a file with
 that name.  If FILENAME is t, prompts for a file name.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-buffer-print "printing" "\
 Print buffer using PostScript printer.
 
@@ -26409,8 +23675,7 @@ argument FILENAME is treated as follows: if it's nil, 
send the image to the
 printer.  If FILENAME is a string, save the PostScript image in a file with
 that name.  If FILENAME is t, prompts for a file name.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-buffer-ps-print "printing" "\
 Print buffer using PostScript printer or through ghostscript.
 
@@ -26425,64 +23690,55 @@ argument FILENAME is treated as follows: if it's nil, 
send the image to the
 printer.  If FILENAME is a string, save the PostScript image in a file with
 that name.  If FILENAME is t, prompts for a file name.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-region-preview "printing" "\
 Preview region using ghostview.
 
 See also `pr-ps-buffer-preview'.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-region-using-ghostscript "printing" "\
 Print region using PostScript through ghostscript.
 
 See also `pr-ps-buffer-using-ghostscript'.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-region-print "printing" "\
 Print region using PostScript printer.
 
 See also `pr-ps-buffer-print'.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-region-ps-print "printing" "\
 Print region using PostScript printer or through ghostscript.
 
 See also `pr-ps-buffer-ps-print'.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-mode-preview "printing" "\
 Preview major mode using ghostview.
 
 See also `pr-ps-buffer-preview'.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-mode-using-ghostscript "printing" "\
 Print major mode using PostScript through ghostscript.
 
 See also `pr-ps-buffer-using-ghostscript'.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-mode-print "printing" "\
 Print major mode using PostScript printer.
 
 See also `pr-ps-buffer-print'.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-ps-mode-ps-print "printing" "\
 Print major mode using PostScript or through ghostscript.
 
 See also `pr-ps-buffer-ps-print'.
 
-\(fn N-UP &optional FILENAME)" t nil)
-
+(fn N-UP &optional FILENAME)" t nil)
 (autoload 'pr-printify-directory "printing" "\
 Replace nonprinting characters in directory with printable representations.
 The printable representations use ^ (for ASCII control characters) or hex.
@@ -26496,18 +23752,15 @@ prompts for FILE(name)-REGEXP.
 
 See also documentation for `pr-list-directory'.
 
-\(fn &optional DIR FILE-REGEXP)" t nil)
-
+(fn &optional DIR FILE-REGEXP)" t nil)
 (autoload 'pr-printify-buffer "printing" "\
 Replace nonprinting characters in buffer with printable representations.
 The printable representations use ^ (for ASCII control characters) or hex.
 The characters tab, linefeed, space, return and formfeed are not affected." t 
nil)
-
 (autoload 'pr-printify-region "printing" "\
 Replace nonprinting characters in region with printable representations.
 The printable representations use ^ (for ASCII control characters) or hex.
 The characters tab, linefeed, space, return and formfeed are not affected." t 
nil)
-
 (autoload 'pr-txt-directory "printing" "\
 Print directory using text printer.
 
@@ -26519,17 +23772,13 @@ prompts for FILE(name)-REGEXP.
 
 See also documentation for `pr-list-directory'.
 
-\(fn &optional DIR FILE-REGEXP)" t nil)
-
+(fn &optional DIR FILE-REGEXP)" t nil)
 (autoload 'pr-txt-buffer "printing" "\
 Print buffer using text printer." t nil)
-
 (autoload 'pr-txt-region "printing" "\
 Print region using text printer." t nil)
-
 (autoload 'pr-txt-mode "printing" "\
 Print major mode using text printer." t nil)
-
 (autoload 'pr-despool-preview "printing" "\
 Preview spooled PostScript.
 
@@ -26541,8 +23790,7 @@ Noninteractively, the argument FILENAME is treated as 
follows: if it is nil,
 save the image in a temporary file.  If FILENAME is a string, save the
 PostScript image in a file with that name.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (autoload 'pr-despool-using-ghostscript "printing" "\
 Print spooled PostScript using ghostscript.
 
@@ -26554,8 +23802,7 @@ Noninteractively, the argument FILENAME is treated as 
follows: if it is nil,
 send the image to the printer.  If FILENAME is a string, save the PostScript
 image in a file with that name.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (autoload 'pr-despool-print "printing" "\
 Send the spooled PostScript to the printer.
 
@@ -26567,8 +23814,7 @@ Noninteractively, the argument FILENAME is treated as 
follows: if it is nil,
 send the image to the printer.  If FILENAME is a string, save the PostScript
 image in a file with that name.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (autoload 'pr-despool-ps-print "printing" "\
 Send the spooled PostScript to the printer or use ghostscript to print it.
 
@@ -26580,33 +23826,27 @@ Noninteractively, the argument FILENAME is treated as 
follows: if it is nil,
 send the image to the printer.  If FILENAME is a string, save the PostScript
 image in a file with that name.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (autoload 'pr-ps-file-preview "printing" "\
 Preview PostScript file FILENAME.
 
-\(fn FILENAME)" t nil)
-
+(fn FILENAME)" t nil)
 (autoload 'pr-ps-file-up-preview "printing" "\
 Preview PostScript file FILENAME.
 
-\(fn N-UP IFILENAME &optional OFILENAME)" t nil)
-
+(fn N-UP IFILENAME &optional OFILENAME)" t nil)
 (autoload 'pr-ps-file-using-ghostscript "printing" "\
 Print PostScript file FILENAME using ghostscript.
 
-\(fn FILENAME)" t nil)
-
+(fn FILENAME)" t nil)
 (autoload 'pr-ps-file-print "printing" "\
 Print PostScript file FILENAME.
 
-\(fn FILENAME)" t nil)
-
+(fn FILENAME)" t nil)
 (autoload 'pr-ps-file-ps-print "printing" "\
 Send PostScript file FILENAME to printer or use ghostscript to print it.
 
-\(fn FILENAME)" t nil)
-
+(fn FILENAME)" t nil)
 (autoload 'pr-ps-file-up-ps-print "printing" "\
 Process a PostScript file IFILENAME and send it to printer.
 
@@ -26623,11 +23863,9 @@ nil, send the image to the printer.  If OFILENAME is a 
string, save the
 PostScript image in a file with that name.  If OFILENAME is t, prompts for a
 file name.
 
-\(fn N-UP IFILENAME &optional OFILENAME)" t nil)
-
+(fn N-UP IFILENAME &optional OFILENAME)" t nil)
 (autoload 'pr-toggle-file-duplex "printing" "\
 Toggle duplex for PostScript file." t nil)
-
 (autoload 'pr-toggle-file-tumble "printing" "\
 Toggle tumble for PostScript file.
 
@@ -26635,22 +23873,16 @@ If tumble is off, produces a printing suitable for 
binding on the left or
 right.
 If tumble is on, produces a printing suitable for binding at the top or
 bottom." t nil)
-
 (autoload 'pr-toggle-file-landscape "printing" "\
 Toggle landscape for PostScript file." t nil)
-
 (autoload 'pr-toggle-ghostscript "printing" "\
 Toggle printing using ghostscript." t nil)
-
 (autoload 'pr-toggle-faces "printing" "\
 Toggle printing with faces." t nil)
-
 (autoload 'pr-toggle-spool "printing" "\
 Toggle spooling." t nil)
-
 (autoload 'pr-toggle-duplex "printing" "\
 Toggle duplex." t nil)
-
 (autoload 'pr-toggle-tumble "printing" "\
 Toggle tumble.
 
@@ -26658,73 +23890,54 @@ If tumble is off, produces a printing suitable for 
binding on the left or
 right.
 If tumble is on, produces a printing suitable for binding at the top or
 bottom." t nil)
-
 (autoload 'pr-toggle-landscape "printing" "\
 Toggle landscape." t nil)
-
 (autoload 'pr-toggle-upside-down "printing" "\
 Toggle upside-down." t nil)
-
 (autoload 'pr-toggle-line "printing" "\
 Toggle line number." t nil)
-
 (autoload 'pr-toggle-zebra "printing" "\
 Toggle zebra stripes." t nil)
-
 (autoload 'pr-toggle-header "printing" "\
 Toggle printing header." t nil)
-
 (autoload 'pr-toggle-header-frame "printing" "\
 Toggle printing header frame." t nil)
-
 (autoload 'pr-toggle-lock "printing" "\
 Toggle menu lock." t nil)
-
 (autoload 'pr-toggle-region "printing" "\
 Toggle whether the region is automagically detected." t nil)
-
 (autoload 'pr-toggle-mode "printing" "\
 Toggle auto mode." t nil)
-
 (autoload 'pr-customize "printing" "\
 Customization of the `printing' group.
 
-\(fn &rest IGNORE)" t nil)
-
+(fn &rest IGNORE)" t nil)
 (autoload 'lpr-customize "printing" "\
 Customization of the `lpr' group.
 
-\(fn &rest IGNORE)" t nil)
-
+(fn &rest IGNORE)" t nil)
 (autoload 'pr-help "printing" "\
 Help for the printing package.
 
-\(fn &rest IGNORE)" t nil)
-
+(fn &rest IGNORE)" t nil)
 (autoload 'pr-ps-name "printing" "\
 Interactively select a PostScript printer." t nil)
-
 (autoload 'pr-txt-name "printing" "\
 Interactively select a text printer." t nil)
-
 (autoload 'pr-ps-utility "printing" "\
 Interactively select a PostScript utility." t nil)
-
 (autoload 'pr-show-ps-setup "printing" "\
 Show current ps-print settings.
 
-\(fn &rest IGNORE)" t nil)
-
+(fn &rest IGNORE)" t nil)
 (autoload 'pr-show-pr-setup "printing" "\
 Show current printing settings.
 
-\(fn &rest IGNORE)" t nil)
-
+(fn &rest IGNORE)" t nil)
 (autoload 'pr-show-lpr-setup "printing" "\
 Show current lpr settings.
 
-\(fn &rest IGNORE)" t nil)
-
+(fn &rest IGNORE)" t nil)
 (autoload 'pr-ps-fast-fire "printing" "\
 Fast fire function for PostScript printing.
 
@@ -26786,8 +23999,7 @@ zero and the argument SELECT is treated as follows:
 Note that this command always behaves as if `pr-auto-region' and `pr-auto-mode'
 are both set to t.
 
-\(fn N-UP &optional SELECT)" t nil)
-
+(fn N-UP &optional SELECT)" t nil)
 (autoload 'pr-txt-fast-fire "printing" "\
 Fast fire function for text printing.
 
@@ -26812,13 +24024,10 @@ Noninteractively, the argument SELECT-PRINTER is 
treated as follows:
 Note that this command always behaves as if `pr-auto-region' and `pr-auto-mode'
 are both set to t.
 
-\(fn &optional SELECT-PRINTER)" t nil)
-
+(fn &optional SELECT-PRINTER)" t nil)
 (register-definition-prefixes "printing" '("lpr-setup" "pr-"))
 
-;;;***
 
-;;;### (autoloads nil "proced" "proced.el" (0 0 0 0))
 ;;; Generated autoloads from proced.el
 
 (autoload 'proced "proced" "\
@@ -26836,13 +24045,10 @@ This function runs the normal hook 
`proced-post-display-hook'.
 See `proced-mode' for a description of features available in
 Proced buffers.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "proced" '("proced-"))
 
-;;;***
 
-;;;### (autoloads nil "profiler" "profiler.el" (0 0 0 0))
 ;;; Generated autoloads from profiler.el
 
 (autoload 'profiler-start "profiler" "\
@@ -26855,31 +24061,80 @@ If MODE is `mem' or `cpu+mem', start profiler that 
samples CPU
    if SIGPROF is not supported, or is unreliable, or is not sampling
    at a high enough frequency.
 
-\(fn MODE)" t nil)
-
+(fn MODE)" t nil)
 (autoload 'profiler-find-profile "profiler" "\
 Open profile FILENAME.
 
-\(fn FILENAME)" t nil)
-
+(fn FILENAME)" t nil)
 (autoload 'profiler-find-profile-other-window "profiler" "\
 Open profile FILENAME.
 
-\(fn FILENAME)" t nil)
-
+(fn FILENAME)" t nil)
 (autoload 'profiler-find-profile-other-frame "profiler" "\
 Open profile FILENAME.
 
-\(fn FILENAME)" t nil)
-
+(fn FILENAME)" t nil)
 (register-definition-prefixes "profiler" '("profiler-"))
 
-;;;***
 
-;;;### (autoloads nil "project" "progmodes/project.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/proj.el
+
+(register-definition-prefixes "ede/proj" '("ede-proj-"))
+
+
+;;; Generated autoloads from cedet/ede/proj-archive.el
+
+(register-definition-prefixes "ede/proj-archive" '("ede-"))
+
+
+;;; Generated autoloads from cedet/ede/proj-aux.el
+
+(register-definition-prefixes "ede/proj-aux" '("ede-"))
+
+
+;;; Generated autoloads from cedet/ede/proj-comp.el
+
+(register-definition-prefixes "ede/proj-comp" '("ede-" 
"proj-comp-insert-variable-once"))
+
+
+;;; Generated autoloads from cedet/ede/proj-elisp.el
+
+(register-definition-prefixes "ede/proj-elisp" '("ede-"))
+
+
+;;; Generated autoloads from cedet/ede/proj-info.el
+
+(register-definition-prefixes "ede/proj-info" '("ede-"))
+
+
+;;; Generated autoloads from cedet/ede/proj-misc.el
+
+(register-definition-prefixes "ede/proj-misc" '("ede-"))
+
+
+;;; Generated autoloads from cedet/ede/proj-obj.el
+
+(register-definition-prefixes "ede/proj-obj" '("ede-"))
+
+
+;;; Generated autoloads from cedet/ede/proj-prog.el
+
+(register-definition-prefixes "ede/proj-prog" 
'("ede-proj-target-makefile-program"))
+
+
+;;; Generated autoloads from cedet/ede/proj-scheme.el
+
+(register-definition-prefixes "ede/proj-scheme" '("ede-proj-target-scheme"))
+
+
+;;; Generated autoloads from cedet/ede/proj-shared.el
+
+(register-definition-prefixes "ede/proj-shared" '("ede-"))
+
+
 ;;; Generated autoloads from progmodes/project.el
-(push (purecopy '(project 0 8 1)) package--builtin-versions)
 
+(push (purecopy '(project 0 8 1)) package--builtin-versions)
 (autoload 'project-current "project" "\
 Return the project instance in DIRECTORY, defaulting to `default-directory'.
 
@@ -26897,12 +24152,10 @@ ignored (per `project-ignores').
 See the doc string of `project-find-functions' for the general form
 of the project instance object.
 
-\(fn &optional MAYBE-PROMPT DIRECTORY)" nil nil)
-
+(fn &optional MAYBE-PROMPT DIRECTORY)" nil nil)
 (defvar project-prefix-map (let ((map (make-sparse-keymap))) (define-key map 
"!" 'project-shell-command) (define-key map "&" 'project-async-shell-command) 
(define-key map "f" 'project-find-file) (define-key map "F" 
'project-or-external-find-file) (define-key map "b" 'project-switch-to-buffer) 
(define-key map "s" 'project-shell) (define-key map "d" 'project-find-dir) 
(define-key map "D" 'project-dired) (define-key map "v" 'project-vc-dir) 
(define-key map "c" 'project-compile) (define-key  [...]
 Keymap for project commands.")
  (define-key ctl-x-map "p" project-prefix-map)
-
 (autoload 'project-other-window-command "project" "\
 Run project command, displaying resultant buffer in another window.
 
@@ -26911,7 +24164,6 @@ The following commands are available:
 \\{project-prefix-map}
 \\{project-other-window-map}" t nil)
  (define-key ctl-x-4-map "p" #'project-other-window-command)
-
 (autoload 'project-other-frame-command "project" "\
 Run project command, displaying resultant buffer in another frame.
 
@@ -26920,16 +24172,13 @@ The following commands are available:
 \\{project-prefix-map}
 \\{project-other-frame-map}" t nil)
  (define-key ctl-x-5-map "p" #'project-other-frame-command)
-
 (autoload 'project-other-tab-command "project" "\
 Run project command, displaying resultant buffer in a new tab.
 
 The following commands are available:
 
 \\{project-prefix-map}" t nil)
-
 (when (bound-and-true-p tab-prefix-map) (define-key tab-prefix-map "p" 
#'project-other-tab-command))
-
 (autoload 'project-find-regexp "project" "\
 Find all matches for REGEXP in the current project's roots.
 With \\[universal-argument] prefix, you can specify the directory
@@ -26939,15 +24188,13 @@ e.g. entering `ch' is equivalent to `*.[ch]'.  As 
whitespace
 triggers completion when entering a pattern, including it
 requires quoting, e.g. `\\[quoted-insert]<space>'.
 
-\(fn REGEXP)" t nil)
-
+(fn REGEXP)" t nil)
 (autoload 'project-or-external-find-regexp "project" "\
 Find all matches for REGEXP in the project roots or external roots.
 With \\[universal-argument] prefix, you can specify the file name
 pattern to search for.
 
-\(fn REGEXP)" t nil)
-
+(fn REGEXP)" t nil)
 (autoload 'project-find-file "project" "\
 Visit a file (with completion) in the current project.
 
@@ -26958,8 +24205,7 @@ If INCLUDE-ALL is non-nil, or with prefix argument when 
called
 interactively, include all files under the project root, except
 for VCS directories listed in `vc-directory-exclusion-list'.
 
-\(fn &optional INCLUDE-ALL)" t nil)
-
+(fn &optional INCLUDE-ALL)" t nil)
 (autoload 'project-or-external-find-file "project" "\
 Visit a file (with completion) in the current project or external roots.
 
@@ -26970,49 +24216,38 @@ If INCLUDE-ALL is non-nil, or with prefix argument 
when called
 interactively, include all files under the project root, except
 for VCS directories listed in `vc-directory-exclusion-list'.
 
-\(fn &optional INCLUDE-ALL)" t nil)
-
+(fn &optional INCLUDE-ALL)" t nil)
 (autoload 'project-find-dir "project" "\
 Start Dired in a directory inside the current project." t nil)
-
 (autoload 'project-dired "project" "\
 Start Dired in the current project's root." t nil)
-
 (autoload 'project-vc-dir "project" "\
 Run VC-Dir in the current project's root." t nil)
-
 (autoload 'project-shell "project" "\
 Start an inferior shell in the current project's root directory.
 If a buffer already exists for running a shell in the project's root,
 switch to it.  Otherwise, create a new shell buffer.
 With \\[universal-argument] prefix arg, create a new inferior shell buffer even
 if one already exists." t nil)
-
 (autoload 'project-eshell "project" "\
 Start Eshell in the current project's root directory.
 If a buffer already exists for running Eshell in the project's root,
 switch to it.  Otherwise, create a new Eshell buffer.
 With \\[universal-argument] prefix arg, create a new Eshell buffer even
 if one already exists." t nil)
-
 (autoload 'project-async-shell-command "project" "\
 Run `async-shell-command' in the current project's root directory." t nil)
-
 (function-put 'project-async-shell-command 'interactive-only 
'async-shell-command)
-
 (autoload 'project-shell-command "project" "\
 Run `shell-command' in the current project's root directory." t nil)
-
 (function-put 'project-shell-command 'interactive-only 'shell-command)
-
 (autoload 'project-search "project" "\
 Search for REGEXP in all the files of the project.
 Stops when a match is found.
 To continue searching for the next match, use the
 command \\[fileloop-continue].
 
-\(fn REGEXP)" t nil)
-
+(fn REGEXP)" t nil)
 (autoload 'project-query-replace-regexp "project" "\
 Query-replace REGEXP in all the files of the project.
 Stops when a match is found and prompts for whether to replace it.
@@ -27023,13 +24258,10 @@ type \\[help-command] at that time.
 If you exit the `query-replace', you can later continue the
 `query-replace' loop using the command \\[fileloop-continue].
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'project-compile "project" "\
 Run `compile' in the project root." t nil)
-
 (function-put 'project-compile 'interactive-only 'compile)
-
 (autoload 'project-switch-to-buffer "project" "\
 Display buffer BUFFER-OR-NAME in the selected window.
 When called interactively, prompts for a buffer belonging to the
@@ -27037,8 +24269,7 @@ current project.  Two buffers belong to the same 
project if their
 project instances, as reported by `project-current' in each
 buffer, are identical.
 
-\(fn BUFFER-OR-NAME)" t nil)
-
+(fn BUFFER-OR-NAME)" t nil)
 (autoload 'project-display-buffer "project" "\
 Display BUFFER-OR-NAME in some window, without selecting it.
 When called interactively, prompts for a buffer belonging to the
@@ -27049,8 +24280,7 @@ buffer, are identical.
 This function uses `display-buffer' as a subroutine, which see
 for how it is determined where the buffer will be displayed.
 
-\(fn BUFFER-OR-NAME)" t nil)
-
+(fn BUFFER-OR-NAME)" t nil)
 (autoload 'project-display-buffer-other-frame "project" "\
 Display BUFFER-OR-NAME preferably in another frame.
 When called interactively, prompts for a buffer belonging to the
@@ -27062,8 +24292,7 @@ This function uses `display-buffer-other-frame' as a 
subroutine,
 which see for how it is determined where the buffer will be
 displayed.
 
-\(fn BUFFER-OR-NAME)" t nil)
-
+(fn BUFFER-OR-NAME)" t nil)
 (autoload 'project-kill-buffers "project" "\
 Kill the buffers belonging to the current project.
 Two buffers belong to the same project if their project
@@ -27076,30 +24305,24 @@ interactively.
 
 Also see the `project-kill-buffers-display-buffer-list' variable.
 
-\(fn &optional NO-CONFIRM)" t nil)
-
+(fn &optional NO-CONFIRM)" t nil)
 (autoload 'project-remember-project "project" "\
 Add project PR to the front of the project list.
 Save the result in `project-list-file' if the list of projects
 has changed, and NO-WRITE is nil.
 
-\(fn PR &optional NO-WRITE)" nil nil)
-
+(fn PR &optional NO-WRITE)" nil nil)
 (autoload 'project-forget-project "project" "\
 Remove directory PROJECT-ROOT from the project list.
 PROJECT-ROOT is the root directory of a known project listed in
 the project list.
 
-\(fn PROJECT-ROOT)" t nil)
-
+(fn PROJECT-ROOT)" t nil)
 (autoload 'project-known-project-roots "project" "\
 Return the list of root directories of all known projects." nil nil)
-
 (autoload 'project-execute-extended-command "project" "\
 Execute an extended command in project root." t nil)
-
 (function-put 'project-execute-extended-command 'interactive-only 
'command-execute)
-
 (autoload 'project-switch-project "project" "\
 \"Switch\" to another project by running an Emacs command.
 The available commands are presented as a dispatch menu
@@ -27108,13 +24331,15 @@ made from `project-switch-commands'.
 When called in a program, it will use the project corresponding
 to directory DIR.
 
-\(fn DIR)" t nil)
-
+(fn DIR)" t nil)
 (register-definition-prefixes "project" '("project-"))
 
-;;;***
 
-;;;### (autoloads nil "prolog" "progmodes/prolog.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/project-am.el
+
+(register-definition-prefixes "ede/project-am" '("project-am-"))
+
+
 ;;; Generated autoloads from progmodes/prolog.el
 
 (autoload 'prolog-mode "prolog" "\
@@ -27131,48 +24356,37 @@ To find out what version of Prolog mode you are 
running, enter
 Commands:
 \\{prolog-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'mercury-mode "prolog" "\
 Major mode for editing Mercury programs.
 Actually this is just customized `prolog-mode'.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'run-prolog "prolog" "\
 Run an inferior Prolog process, input and output via buffer *prolog*.
 With prefix argument ARG, restart the Prolog process if running before.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (register-definition-prefixes "prolog" '("mercury-mode-map" "prolog-"))
 
-;;;***
 
-;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (0 0 0 0))
 ;;; Generated autoloads from ps-bdf.el
 
 (defvar bdf-directory-list (if (memq system-type '(ms-dos windows-nt)) (list 
(expand-file-name "fonts/bdf" installation-directory)) 
'("/usr/local/share/emacs/fonts/bdf")) "\
 List of directories to search for `BDF' font files.
 The default value is (\"/usr/local/share/emacs/fonts/bdf\").")
-
 (custom-autoload 'bdf-directory-list "ps-bdf" t)
-
 (register-definition-prefixes "ps-bdf" '("bdf-"))
 
-;;;***
 
-;;;### (autoloads nil "ps-def" "ps-def.el" (0 0 0 0))
 ;;; Generated autoloads from ps-def.el
 
 (register-definition-prefixes "ps-def" '("ps-"))
 
-;;;***
 
-;;;### (autoloads nil "ps-mode" "progmodes/ps-mode.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/ps-mode.el
-(push (purecopy '(ps-mode 1 1 9)) package--builtin-versions)
 
+(push (purecopy '(ps-mode 1 1 9)) package--builtin-versions)
 (autoload 'ps-mode "ps-mode" "\
 Major mode for editing PostScript with GNU Emacs.
 
@@ -27211,29 +24425,27 @@ point to the corresponding spot in the PostScript 
window, if input
 to the interpreter was sent from that window.
 Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when the cursor is at the 
number has the same effect.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "ps-mode" '("ps-"))
 
-;;;***
 
-;;;### (autoloads nil "ps-print" "ps-print.el" (0 0 0 0))
+;;; Generated autoloads from ps-mule.el
+
+(register-definition-prefixes "ps-mule" '("ps-mule-"))
+
+
 ;;; Generated autoloads from ps-print.el
-(push (purecopy '(ps-print 7 3 5)) package--builtin-versions)
 
+(push (purecopy '(ps-print 7 3 5)) package--builtin-versions)
 (defvar ps-page-dimensions-database (purecopy (list (list 'a4 (/ (* 72 21.0) 
2.54) (/ (* 72 29.7) 2.54) "A4") (list 'a3 (/ (* 72 29.7) 2.54) (/ (* 72 42.0) 
2.54) "A3") (list 'letter (* 72 8.5) (* 72 11.0) "Letter") (list 'legal (* 72 
8.5) (* 72 14.0) "Legal") (list 'letter-small (* 72 7.68) (* 72 10.16) 
"LetterSmall") (list 'tabloid (* 72 11.0) (* 72 17.0) "Tabloid") (list 'ledger 
(* 72 17.0) (* 72 11.0) "Ledger") (list 'statement (* 72 5.5) (* 72 8.5) 
"Statement") (list 'executive (* 72 [...]
 List associating a symbolic paper type to its width, height and doc media.
 See `ps-paper-type'.")
-
 (custom-autoload 'ps-page-dimensions-database "ps-print" t)
-
 (defvar ps-paper-type 'letter "\
 Specify the size of paper to format for.
 Should be one of the paper types defined in `ps-page-dimensions-database', for
 example `letter', `legal' or `a4'.")
-
 (custom-autoload 'ps-paper-type "ps-print" t)
-
 (defvar ps-print-color-p (fboundp 'x-color-values) "\
 Specify how buffer's text color is printed.
 
@@ -27247,12 +24459,9 @@ Valid values are:
                See also `ps-black-white-faces'.
 
 Any other value is treated as t.")
-
 (custom-autoload 'ps-print-color-p "ps-print" t)
-
 (autoload 'ps-print-customize "ps-print" "\
 Customization of ps-print group." t nil)
-
 (autoload 'ps-print-buffer "ps-print" "\
 Generate and print a PostScript image of the buffer.
 
@@ -27264,37 +24473,32 @@ Noninteractively, the argument FILENAME is treated as 
follows: if it is nil,
 send the image to the printer.  If FILENAME is a string, save the PostScript
 image in a file with that name.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (autoload 'ps-print-buffer-with-faces "ps-print" "\
 Generate and print a PostScript image of the buffer.
 Like `ps-print-buffer', but includes font, color, and underline information in
 the generated image.  This command works only if you are using a window system,
 so it has a way to determine color values.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (autoload 'ps-print-region "ps-print" "\
 Generate and print a PostScript image of the region.
 Like `ps-print-buffer', but prints just the current region.
 
-\(fn FROM TO &optional FILENAME)" t nil)
-
+(fn FROM TO &optional FILENAME)" t nil)
 (autoload 'ps-print-region-with-faces "ps-print" "\
 Generate and print a PostScript image of the region.
 Like `ps-print-region', but includes font, color, and underline information in
 the generated image.  This command works only if you are using a window system,
 so it has a way to determine color values.
 
-\(fn FROM TO &optional FILENAME)" t nil)
-
+(fn FROM TO &optional FILENAME)" t nil)
 (autoload 'ps-spool-buffer "ps-print" "\
 Generate and spool a PostScript image of the buffer.
 Like `ps-print-buffer' except that the PostScript image is saved in a local
 buffer to be sent to the printer later.
 
 Use the command `ps-despool' to send the spooled images to the printer." t nil)
-
 (autoload 'ps-spool-buffer-with-faces "ps-print" "\
 Generate and spool a PostScript image of the buffer.
 Like the command `ps-spool-buffer', but includes font, color, and underline
@@ -27302,15 +24506,13 @@ information in the generated image.  This command 
works only if you are using
 a window system, so it has a way to determine color values.
 
 Use the command `ps-despool' to send the spooled images to the printer." t nil)
-
 (autoload 'ps-spool-region "ps-print" "\
 Generate a PostScript image of the region and spool locally.
 Like `ps-spool-buffer', but spools just the current region.
 
 Use the command `ps-despool' to send the spooled images to the printer.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'ps-spool-region-with-faces "ps-print" "\
 Generate a PostScript image of the region and spool locally.
 Like `ps-spool-region', but includes font, color, and underline information in
@@ -27319,8 +24521,7 @@ so it has a way to determine color values.
 
 Use the command `ps-despool' to send the spooled images to the printer.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'ps-despool "ps-print" "\
 Send the spooled PostScript to the printer.
 
@@ -27332,29 +24533,24 @@ Noninteractively, the argument FILENAME is treated as 
follows: if it is nil,
 send the image to the printer.  If FILENAME is a string, save the PostScript
 image in a file with that name.
 
-\(fn &optional FILENAME)" t nil)
-
+(fn &optional FILENAME)" t nil)
 (autoload 'ps-line-lengths "ps-print" "\
 Display the correspondence between a line length and a font size.
 Done using the current ps-print setup.
 Try: pr -t file | awk \\='{printf \"%3d %s
 \", length($0), $0}\\=' | sort -r | head" t nil)
-
 (autoload 'ps-nb-pages-buffer "ps-print" "\
 Display number of pages to print this buffer, for various font heights.
 The table depends on the current ps-print setup.
 
-\(fn NB-LINES)" t nil)
-
+(fn NB-LINES)" t nil)
 (autoload 'ps-nb-pages-region "ps-print" "\
 Display number of pages to print the region, for various font heights.
 The table depends on the current ps-print setup.
 
-\(fn NB-LINES)" t nil)
-
+(fn NB-LINES)" t nil)
 (autoload 'ps-setup "ps-print" "\
 Return the current PostScript-generation setup." nil nil)
-
 (autoload 'ps-extend-face-list "ps-print" "\
 Extend face in ALIST-SYM.
 
@@ -27368,8 +24564,7 @@ The elements in FACE-EXTENSION-LIST are like those for 
`ps-extend-face'.
 
 See `ps-extend-face' for documentation.
 
-\(fn FACE-EXTENSION-LIST &optional MERGE-P ALIST-SYM)" nil nil)
-
+(fn FACE-EXTENSION-LIST &optional MERGE-P ALIST-SYM)" nil nil)
 (autoload 'ps-extend-face "ps-print" "\
 Extend face in ALIST-SYM.
 
@@ -27400,56 +24595,43 @@ EXTENSION is one of the following symbols:
 
 If EXTENSION is any other symbol, it is ignored.
 
-\(fn FACE-EXTENSION &optional MERGE-P ALIST-SYM)" nil nil)
-
+(fn FACE-EXTENSION &optional MERGE-P ALIST-SYM)" nil nil)
 (register-definition-prefixes "ps-print" '("ps-"))
 
-;;;***
 
-;;;### (autoloads nil "ps-samp" "ps-samp.el" (0 0 0 0))
 ;;; Generated autoloads from ps-samp.el
 
 (register-definition-prefixes "ps-samp" '("ps-"))
 
-;;;***
 
-;;;### (autoloads nil "pulse" "cedet/pulse.el" (0 0 0 0))
 ;;; Generated autoloads from cedet/pulse.el
-(push (purecopy '(pulse 1 0)) package--builtin-versions)
 
+(push (purecopy '(pulse 1 0)) package--builtin-versions)
 (autoload 'pulse-momentary-highlight-one-line "pulse" "\
 Highlight the line around POINT, unhighlighting before next command.
 If POINT is nil or missing, the current point is used instead.
 
 Optional argument FACE specifies the face to do the highlighting.
 
-\(fn &optional POINT FACE)" nil nil)
-
+(fn &optional POINT FACE)" nil nil)
 (autoload 'pulse-momentary-highlight-region "pulse" "\
 Highlight between START and END, unhighlighting before next command.
 Optional argument FACE specifies the face to do the highlighting.
 
-\(fn START END &optional FACE)" nil nil)
-
+(fn START END &optional FACE)" nil nil)
 (register-definition-prefixes "pulse" '("pulse-"))
 
-;;;***
 
-;;;### (autoloads nil "puny" "net/puny.el" (0 0 0 0))
 ;;; Generated autoloads from net/puny.el
 
 (register-definition-prefixes "puny" '("puny-"))
 
-;;;***
 
-;;;### (autoloads nil "python" "progmodes/python.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/python.el
-(push (purecopy '(python 0 28)) package--builtin-versions)
 
+(push (purecopy '(python 0 28)) package--builtin-versions)
 (add-to-list 'auto-mode-alist (cons (purecopy "\\.py[iw]?\\'") 'python-mode))
-
 (add-to-list 'interpreter-mode-alist (cons (purecopy "python[0-9.]*") 
'python-mode))
-
 (autoload 'run-python "python" "\
 Run an inferior Python process.
 
@@ -27468,20 +24650,21 @@ Runs the hook `inferior-python-mode-hook' after
 `comint-mode-hook' is run.  (Type \\[describe-mode] in the
 process buffer for a list of commands.)
 
-\(fn &optional CMD DEDICATED SHOW)" t nil)
-
+(fn &optional CMD DEDICATED SHOW)" t nil)
 (autoload 'python-mode "python" "\
 Major mode for editing Python files.
 
 \\{python-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "python" '("inferior-python-mode" "python-" 
"run-python-internal"))
 
-;;;***
 
-;;;### (autoloads nil "qp" "mail/qp.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/wisent/python.el
+
+(register-definition-prefixes "semantic/wisent/python" '("semantic-" 
"wisent-python-"))
+
+
 ;;; Generated autoloads from mail/qp.el
 
 (autoload 'quoted-printable-decode-region "qp" "\
@@ -27496,18 +24679,14 @@ The CODING-SYSTEM argument is a historical hangover 
and is deprecated.
 QP encodes raw bytes and should be decoded into raw bytes.  Decoding
 them into characters should be done separately.
 
-\(fn FROM TO &optional CODING-SYSTEM)" t nil)
-
+(fn FROM TO &optional CODING-SYSTEM)" t nil)
 (register-definition-prefixes "qp" '("quoted-printable-"))
 
-;;;***
 
-;;;### (autoloads nil "quail" "international/quail.el" (0 0 0 0))
 ;;; Generated autoloads from international/quail.el
 
 (autoload 'quail-title "quail" "\
 Return the title of the current Quail package." nil nil)
-
 (autoload 'quail-use-package "quail" "\
 Start using Quail package PACKAGE-NAME.
 The remaining arguments are LIBRARIES to be loaded before using the package.
@@ -27515,8 +24694,7 @@ The remaining arguments are LIBRARIES to be loaded 
before using the package.
 This activates input method defined by PACKAGE-NAME by running
 `quail-activate', which see.
 
-\(fn PACKAGE-NAME &rest LIBRARIES)" nil nil)
-
+(fn PACKAGE-NAME &rest LIBRARIES)" nil nil)
 (autoload 'quail-define-package "quail" "\
 Define NAME as a new Quail package for input LANGUAGE.
 TITLE is a string to be displayed at mode-line to indicate this package.
@@ -27597,8 +24775,7 @@ If SIMPLE is non-nil, then we do not alter the meanings 
of
 commands such as \\[forward-char], \\[backward-char], \\[next-line], 
\\[previous-line] and \\[indent-for-tab-command]; they are treated as
 non-Quail commands.
 
-\(fn NAME LANGUAGE TITLE &optional GUIDANCE DOCSTRING TRANSLATION-KEYS 
FORGET-LAST-SELECTION DETERMINISTIC KBD-TRANSLATE SHOW-LAYOUT CREATE-DECODE-MAP 
MAXIMUM-SHORTEST OVERLAY-PLIST UPDATE-TRANSLATION-FUNCTION CONVERSION-KEYS 
SIMPLE)" nil nil)
-
+(fn NAME LANGUAGE TITLE &optional GUIDANCE DOCSTRING TRANSLATION-KEYS 
FORGET-LAST-SELECTION DETERMINISTIC KBD-TRANSLATE SHOW-LAYOUT CREATE-DECODE-MAP 
MAXIMUM-SHORTEST OVERLAY-PLIST UPDATE-TRANSLATION-FUNCTION CONVERSION-KEYS 
SIMPLE)" nil nil)
 (autoload 'quail-set-keyboard-layout "quail" "\
 Set the current keyboard layout to the same as keyboard KBD-TYPE.
 
@@ -27608,16 +24785,14 @@ standard layout defined in 
`quail-keyboard-layout-standard'.  This
 function tells Quail system the layout of your keyboard so that what
 you type is correctly handled.
 
-\(fn KBD-TYPE)" t nil)
-
+(fn KBD-TYPE)" t nil)
 (autoload 'quail-show-keyboard-layout "quail" "\
 Show the physical layout of the keyboard type KEYBOARD-TYPE.
 
 The variable `quail-keyboard-layout-type' holds the currently selected
 keyboard type.
 
-\(fn &optional KEYBOARD-TYPE)" t nil)
-
+(fn &optional KEYBOARD-TYPE)" t nil)
 (autoload 'quail-define-rules "quail" "\
 Define translation rules of the current Quail package.
 Each argument is a list of KEY and TRANSLATION.
@@ -27651,8 +24826,7 @@ the following annotation types are supported.
   no-decode-map --- the value non-nil means that decoding map is not
        generated for the following translations.
 
-\(fn &rest RULES)" nil t)
-
+(fn &rest RULES)" nil t)
 (autoload 'quail-install-map "quail" "\
 Install the Quail map MAP in the current Quail package.
 
@@ -27661,8 +24835,7 @@ which to install MAP.
 
 The installed map can be referred by the function `quail-map'.
 
-\(fn MAP &optional NAME)" nil nil)
-
+(fn MAP &optional NAME)" nil nil)
 (autoload 'quail-install-decode-map "quail" "\
 Install the Quail decode map DECODE-MAP in the current Quail package.
 
@@ -27671,8 +24844,7 @@ which to install MAP.
 
 The installed decode map can be referred by the function `quail-decode-map'.
 
-\(fn DECODE-MAP &optional NAME)" nil nil)
-
+(fn DECODE-MAP &optional NAME)" nil nil)
 (autoload 'quail-defrule "quail" "\
 Add one translation rule, KEY to TRANSLATION, in the current Quail package.
 KEY is a string meaning a sequence of keystrokes to be translated.
@@ -27698,8 +24870,7 @@ current Quail package.
 Optional 4th argument APPEND, if non-nil, appends TRANSLATION
 to the current translations for KEY instead of replacing them.
 
-\(fn KEY TRANSLATION &optional NAME APPEND)" nil nil)
-
+(fn KEY TRANSLATION &optional NAME APPEND)" nil nil)
 (autoload 'quail-defrule-internal "quail" "\
 Define KEY as TRANS in a Quail map MAP.
 
@@ -27711,8 +24882,7 @@ Optional 5th arg DECODE-MAP is a Quail decode map.
 Optional 6th arg PROPS is a property list annotating TRANS.  See the
 function `quail-define-rules' for the detail.
 
-\(fn KEY TRANS MAP &optional APPEND DECODE-MAP PROPS)" nil nil)
-
+(fn KEY TRANS MAP &optional APPEND DECODE-MAP PROPS)" nil nil)
 (autoload 'quail-update-leim-list-file "quail" "\
 Update entries for Quail packages in `LEIM' list file in directory DIRNAME.
 DIRNAME is a directory containing Emacs input methods;
@@ -27726,120 +24896,10 @@ When called from a program, the remaining arguments 
are additional
 directory names to search for Quail packages under `quail' subdirectory
 of each directory.
 
-\(fn DIRNAME &rest DIRNAMES)" t nil)
-
+(fn DIRNAME &rest DIRNAMES)" t nil)
 (register-definition-prefixes "quail" '("quail-"))
 
-;;;***
-
-;;;### (autoloads nil "quail/ethiopic" "leim/quail/ethiopic.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from leim/quail/ethiopic.el
-
-(register-definition-prefixes "quail/ethiopic" '("ethio-select-a-translation"))
-
-;;;***
-
-;;;### (autoloads nil "quail/hangul" "leim/quail/hangul.el" (0 0
-;;;;;;  0 0))
-;;; Generated autoloads from leim/quail/hangul.el
-
-(autoload 'hangul-input-method-activate "quail/hangul" "\
-Activate Hangul input method INPUT-METHOD.
-FUNC is a function to handle input key.
-HELP-TEXT is a text set in `hangul-input-method-help-text'.
-
-\(fn INPUT-METHOD FUNC HELP-TEXT &rest ARGS)" nil nil)
-
-(register-definition-prefixes "quail/hangul" '("alphabetp" "hangul" 
"notzerop"))
-
-;;;***
-
-;;;### (autoloads nil "quail/indian" "leim/quail/indian.el" (0 0
-;;;;;;  0 0))
-;;; Generated autoloads from leim/quail/indian.el
-
-(register-definition-prefixes "quail/indian" '("indian-mlm-mozhi-u" 
"inscript-" "quail-"))
-
-;;;***
-
-;;;### (autoloads nil "quail/ipa" "leim/quail/ipa.el" (0 0 0 0))
-;;; Generated autoloads from leim/quail/ipa.el
-
-(register-definition-prefixes "quail/ipa" '("ipa-x-sampa-"))
-
-;;;***
-
-;;;### (autoloads nil "quail/japanese" "leim/quail/japanese.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from leim/quail/japanese.el
-
-(register-definition-prefixes "quail/japanese" '("quail-japanese-"))
-
-;;;***
-
-;;;### (autoloads nil "quail/lao" "leim/quail/lao.el" (0 0 0 0))
-;;; Generated autoloads from leim/quail/lao.el
-
-(register-definition-prefixes "quail/lao" '("lao-" 
"quail-lao-update-translation"))
-
-;;;***
-
-;;;### (autoloads nil "quail/lrt" "leim/quail/lrt.el" (0 0 0 0))
-;;; Generated autoloads from leim/quail/lrt.el
-
-(register-definition-prefixes "quail/lrt" '("quail-lrt-update-translation"))
-
-;;;***
-
-;;;### (autoloads nil "quail/sisheng" "leim/quail/sisheng.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from leim/quail/sisheng.el
-
-(register-definition-prefixes "quail/sisheng" '("quail-make-sisheng-rules" 
"sisheng-"))
-
-;;;***
-
-;;;### (autoloads nil "quail/thai" "leim/quail/thai.el" (0 0 0 0))
-;;; Generated autoloads from leim/quail/thai.el
-
-(register-definition-prefixes "quail/thai" '("thai-generate-quail-map"))
-
-;;;***
-
-;;;### (autoloads nil "quail/tibetan" "leim/quail/tibetan.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from leim/quail/tibetan.el
-
-(register-definition-prefixes "quail/tibetan" '("quail-tib" "tibetan-"))
-
-;;;***
-
-;;;### (autoloads nil "quail/uni-input" "leim/quail/uni-input.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from leim/quail/uni-input.el
-
-(autoload 'ucs-input-activate "quail/uni-input" "\
-Activate UCS input method.
-With ARG, activate UCS input method if and only if ARG is positive.
-
-While this input method is active, the variable
-`input-method-function' is bound to the function `ucs-input-method'.
-
-\(fn &optional ARG)" nil nil)
-
-(register-definition-prefixes "quail/uni-input" '("ucs-input-"))
-
-;;;***
-
-;;;### (autoloads nil "quail/viqr" "leim/quail/viqr.el" (0 0 0 0))
-;;; Generated autoloads from leim/quail/viqr.el
-
-(register-definition-prefixes "quail/viqr" '("viet-quail-define-rules"))
-
-;;;***
 
-;;;### (autoloads nil "quickurl" "net/quickurl.el" (0 0 0 0))
 ;;; Generated autoloads from net/quickurl.el
 
 (defconst quickurl-reread-hook-postfix "\n;; Local Variables:\n;; eval: (progn 
(require 'quickurl) (add-hook 'write-file-functions (lambda () (quickurl-read) 
nil) nil t))\n;; End:\n" "\
@@ -27852,7 +24912,6 @@ To make use of this do something like:
   (setq quickurl-postfix quickurl-reread-hook-postfix)
 
 in your init file (after loading/requiring quickurl).")
-
 (autoload 'quickurl "quickurl" "\
 Insert a URL based on LOOKUP.
 
@@ -27860,21 +24919,18 @@ If not supplied LOOKUP is taken to be the word at 
point in the current
 buffer, this default action can be modified via
 `quickurl-grab-lookup-function'.
 
-\(fn &optional LOOKUP)" t nil)
-
+(fn &optional LOOKUP)" t nil)
 (autoload 'quickurl-ask "quickurl" "\
 Insert a URL, with `completing-read' prompt, based on LOOKUP.
 
-\(fn LOOKUP)" t nil)
-
+(fn LOOKUP)" t nil)
 (autoload 'quickurl-add-url "quickurl" "\
 Allow the user to interactively add a new URL associated with WORD.
 
 See `quickurl-grab-url' for details on how the default word/URL combination
 is decided.
 
-\(fn WORD URL COMMENT)" t nil)
-
+(fn WORD URL COMMENT)" t nil)
 (autoload 'quickurl-browse-url "quickurl" "\
 Browse the URL associated with LOOKUP.
 
@@ -27882,16 +24938,13 @@ If not supplied LOOKUP is taken to be the word at 
point in the
 current buffer, this default action can be modified via
 `quickurl-grab-lookup-function'.
 
-\(fn &optional LOOKUP)" t nil)
-
+(fn &optional LOOKUP)" t nil)
 (autoload 'quickurl-browse-url-ask "quickurl" "\
 Browse the URL, with `completing-read' prompt, associated with LOOKUP.
 
-\(fn LOOKUP)" t nil)
-
+(fn LOOKUP)" t nil)
 (autoload 'quickurl-edit-urls "quickurl" "\
 Pull `quickurl-url-file' into a buffer for hand editing." t nil)
-
 (autoload 'quickurl-list-mode "quickurl" "\
 A mode for browsing the quickurl URL list.
 
@@ -27899,31 +24952,22 @@ The key bindings for `quickurl-list-mode' are:
 
 \\{quickurl-list-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'quickurl-list "quickurl" "\
 Display `quickurl-list' as a formatted list using `quickurl-list-mode'." t nil)
-
 (register-definition-prefixes "quickurl" '("quickurl-"))
 
-;;;***
 
-;;;### (autoloads nil "radix-tree" "emacs-lisp/radix-tree.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/radix-tree.el
 
 (register-definition-prefixes "radix-tree" '("radix-tree-"))
 
-;;;***
 
-;;;### (autoloads nil "range" "emacs-lisp/range.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/range.el
 
 (register-definition-prefixes "range" '("range-"))
 
-;;;***
 
-;;;### (autoloads nil "rcirc" "net/rcirc.el" (0 0 0 0))
 ;;; Generated autoloads from net/rcirc.el
 
 (autoload 'rcirc "rcirc" "\
@@ -27933,10 +24977,8 @@ Do not connect to a server if it is already connected.
 
 If ARG is non-nil, instead prompt for connection parameters.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (defalias 'irc 'rcirc)
-
 (autoload 'rcirc-connect "rcirc" "\
 Connect to SERVER.
 The arguments PORT, NICK, USER-NAME, FULL-NAME, PASSWORD,
@@ -27944,8 +24986,7 @@ ENCRYPTION, CERTFP, SERVER-ALIAS are interpreted as in
 `rcirc-server-alist'.  STARTUP-CHANNELS is a list of channels
 that are joined after authentication.
 
-\(fn SERVER &optional PORT NICK USER-NAME FULL-NAME STARTUP-CHANNELS PASSWORD 
ENCRYPTION CERTFP SERVER-ALIAS)" nil nil)
-
+(fn SERVER &optional PORT NICK USER-NAME FULL-NAME STARTUP-CHANNELS PASSWORD 
ENCRYPTION CERTFP SERVER-ALIAS)" nil nil)
 (defvar rcirc-track-minor-mode nil "\
 Non-nil if Rcirc-Track minor mode is enabled.
 See the `rcirc-track-minor-mode' command
@@ -27953,9 +24994,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `rcirc-track-minor-mode'.")
-
 (custom-autoload 'rcirc-track-minor-mode "rcirc" nil)
-
 (autoload 'rcirc-track-minor-mode "rcirc" "\
 Global minor mode for tracking activity in rcirc buffers.
 
@@ -27974,18 +25013,13 @@ evaluate `(default-value \\='rcirc-track-minor-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "rcirc" '("rcirc-" "with-rcirc-"))
 
-;;;***
 
-;;;### (autoloads nil "re-builder" "emacs-lisp/re-builder.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/re-builder.el
 
 (defalias 'regexp-builder 're-builder)
-
 (autoload 're-builder "re-builder" "\
 Construct a regexp interactively.
 This command makes the current buffer the \"target\" buffer of
@@ -27999,12 +25033,9 @@ Case-sensitivity can be toggled with 
\\[reb-toggle-case].  The
 regexp builder supports three different forms of input which can
 be set with \\[reb-change-syntax].  More options and details are
 provided in the Commentary section of this library." t nil)
-
 (register-definition-prefixes "re-builder" '("re-builder-unload-function" 
"reb-"))
 
-;;;***
 
-;;;### (autoloads nil "recentf" "recentf.el" (0 0 0 0))
 ;;; Generated autoloads from recentf.el
 
 (defvar recentf-mode nil "\
@@ -28014,9 +25045,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `recentf-mode'.")
-
 (custom-autoload 'recentf-mode "recentf" nil)
-
 (autoload 'recentf-mode "recentf" "\
 Toggle \"Open Recent\" menu (Recentf mode).
 
@@ -28045,13 +25074,10 @@ evaluate `(default-value \\='recentf-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "recentf" '("recentf-"))
 
-;;;***
 
-;;;### (autoloads nil "rect" "rect.el" (0 0 0 0))
 ;;; Generated autoloads from rect.el
 
 (autoload 'delete-rectangle "rect" "\
@@ -28064,8 +25090,7 @@ When called from a program the rectangle's corners are 
START and END.
 With a prefix (or a FILL) argument, also fill lines where nothing has
 to be deleted.
 
-\(fn START END &optional FILL)" t nil)
-
+(fn START END &optional FILL)" t nil)
 (autoload 'delete-extract-rectangle "rect" "\
 Delete the contents of the rectangle with corners at START and END.
 Return it as a list of strings, one for each line of the rectangle.
@@ -28074,14 +25099,12 @@ When called from a program the rectangle's corners 
are START and END.
 With an optional FILL argument, also fill lines where nothing has to be
 deleted.
 
-\(fn START END &optional FILL)" nil nil)
-
+(fn START END &optional FILL)" nil nil)
 (autoload 'extract-rectangle "rect" "\
 Return the contents of the rectangle with corners at START and END.
 Return it as a list of strings, one for each line of the rectangle.
 
-\(fn START END)" nil nil)
-
+(fn START END)" nil nil)
 (autoload 'kill-rectangle "rect" "\
 Delete the region-rectangle and save it as the last killed one.
 
@@ -28094,19 +25117,16 @@ deleted.
 If the buffer is read-only, Emacs will beep and refrain from deleting
 the rectangle, but put it in `killed-rectangle' anyway.  This means that
 you can use this command to copy text from a read-only buffer.
-\(If the variable `kill-read-only-ok' is non-nil, then this won't
+(If the variable `kill-read-only-ok' is non-nil, then this won't
 even beep.)
 
-\(fn START END &optional FILL)" t nil)
-
+(fn START END &optional FILL)" t nil)
 (autoload 'copy-rectangle-as-kill "rect" "\
 Copy the region-rectangle and save it as the last killed one.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'yank-rectangle "rect" "\
 Yank the last killed rectangle with upper left corner at point." t nil)
-
 (autoload 'insert-rectangle "rect" "\
 Insert text of RECTANGLE with upper left corner at point.
 RECTANGLE's first line is inserted at point, its second
@@ -28115,8 +25135,7 @@ RECTANGLE should be a list of strings.
 After this command, the mark is at the upper left corner
 and point is at the lower right corner.
 
-\(fn RECTANGLE)" nil nil)
-
+(fn RECTANGLE)" nil nil)
 (autoload 'open-rectangle "rect" "\
 Blank out the region-rectangle, shifting text right.
 
@@ -28127,10 +25146,8 @@ When called from a program the rectangle's corners are 
START and END.
 With a prefix (or a FILL) argument, fill with blanks even if there is
 no text on the right side of the rectangle.
 
-\(fn START END &optional FILL)" t nil)
-
+(fn START END &optional FILL)" t nil)
 (defalias 'close-rectangle 'delete-whitespace-rectangle)
-
 (autoload 'delete-whitespace-rectangle "rect" "\
 Delete all whitespace following a specified column in each line.
 The left edge of the rectangle specifies the position in each line
@@ -28140,8 +25157,7 @@ rectangle, all contiguous whitespace starting at that 
column is deleted.
 When called from a program the rectangle's corners are START and END.
 With a prefix (or a FILL) argument, also fill too short lines.
 
-\(fn START END &optional FILL)" t nil)
-
+(fn START END &optional FILL)" t nil)
 (autoload 'string-rectangle "rect" "\
 Replace rectangle contents with STRING on each line.
 The length of STRING need not be the same as the rectangle width.
@@ -28152,10 +25168,8 @@ the minibuffer.
 
 Called from a program, takes three args; START, END and STRING.
 
-\(fn START END STRING)" t nil)
-
+(fn START END STRING)" t nil)
 (defalias 'replace-rectangle 'string-rectangle)
-
 (autoload 'string-insert-rectangle "rect" "\
 Insert STRING on each line of region-rectangle, shifting text right.
 
@@ -28163,8 +25177,7 @@ When called from a program, the rectangle's corners are 
START and END.
 The left edge of the rectangle specifies the column for insertion.
 This command does not delete or overwrite any existing text.
 
-\(fn START END STRING)" t nil)
-
+(fn START END STRING)" t nil)
 (autoload 'clear-rectangle "rect" "\
 Blank out the region-rectangle.
 The text previously in the region is overwritten with blanks.
@@ -28173,8 +25186,7 @@ When called from a program the rectangle's corners are 
START and END.
 With a prefix (or a FILL) argument, also fill with blanks the parts of the
 rectangle which were empty.
 
-\(fn START END &optional FILL)" t nil)
-
+(fn START END &optional FILL)" t nil)
 (autoload 'rectangle-number-lines "rect" "\
 Insert numbers in front of the region-rectangle.
 
@@ -28183,8 +25195,7 @@ counting.  FORMAT, if non-nil, should be a format 
string to pass
 to `format' along with the line count.  When called interactively
 with a prefix argument, prompt for START-AT and FORMAT.
 
-\(fn START END START-AT &optional FORMAT)" t nil)
-
+(fn START END START-AT &optional FORMAT)" t nil)
 (autoload 'rectangle-mark-mode "rect" "\
 Toggle the region as rectangular.
 
@@ -28205,27 +25216,20 @@ evaluate `rectangle-mark-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "rect" '("apply-on-rectangle" 
"clear-rectangle-line" "delete-" "extract-rectangle-" "killed-rectangle" "ope" 
"rectangle-" "spaces-string" "string-rectangle-"))
 
-;;;***
 
-;;;### (autoloads nil "refbib" "textmodes/refbib.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/refbib.el
 
 (register-definition-prefixes "refbib" '("r2b-"))
 
-;;;***
 
-;;;### (autoloads nil "refer" "textmodes/refer.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/refer.el
 
 (register-definition-prefixes "refer" '("refer-"))
 
-;;;***
 
-;;;### (autoloads nil "refill" "textmodes/refill.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/refill.el
 
 (autoload 'refill-mode "refill" "\
@@ -28252,22 +25256,23 @@ evaluate `refill-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "refill" '("refill-"))
 
-;;;***
 
-;;;### (autoloads nil "reftex" "textmodes/reftex.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/analyze/refs.el
+
+(register-definition-prefixes "semantic/analyze/refs" '("semantic-"))
+
+
 ;;; Generated autoloads from textmodes/reftex.el
+
 (autoload 'reftex-citation "reftex-cite" nil t)
 (autoload 'reftex-all-document-files "reftex-parse")
 (autoload 'reftex-isearch-minor-mode "reftex-global" nil t)
 (autoload 'reftex-index-phrases-mode "reftex-index" nil t)
-
 (autoload 'turn-on-reftex "reftex" "\
 Turn on RefTeX mode." nil nil)
-
 (autoload 'reftex-mode "reftex" "\
 Minor mode with distinct support for \\label, \\ref and \\cite in LaTeX.
 
@@ -28313,30 +25318,67 @@ evaluate `reftex-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'reftex-reset-scanning-information "reftex" "\
 Reset the symbols containing information from buffer scanning.
 This enforces rescanning the buffer on next use." nil nil)
-
 (register-definition-prefixes "reftex" '("reftex-"))
 
-;;;***
 
-;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (0
-;;;;;;  0 0 0))
+;;; Generated autoloads from textmodes/reftex-auc.el
+
+(register-definition-prefixes "reftex-auc" '("reftex-"))
+
+
+;;; Generated autoloads from textmodes/reftex-cite.el
+
+(register-definition-prefixes "reftex-cite" '("reftex-"))
+
+
+;;; Generated autoloads from textmodes/reftex-dcr.el
+
+(register-definition-prefixes "reftex-dcr" '("reftex-"))
+
+
+;;; Generated autoloads from textmodes/reftex-global.el
+
+(register-definition-prefixes "reftex-global" '("reftex-"))
+
+
+;;; Generated autoloads from textmodes/reftex-index.el
+
+(register-definition-prefixes "reftex-index" '("reftex-"))
+
+
+;;; Generated autoloads from textmodes/reftex-parse.el
+
+(register-definition-prefixes "reftex-parse" '("reftex-"))
+
+
+;;; Generated autoloads from textmodes/reftex-ref.el
+
+(register-definition-prefixes "reftex-ref" '("reftex-"))
+
+
+;;; Generated autoloads from textmodes/reftex-sel.el
+
+(register-definition-prefixes "reftex-sel" '("reftex-"))
+
+
+;;; Generated autoloads from textmodes/reftex-toc.el
+
+(register-definition-prefixes "reftex-toc" '("reftex-"))
+
+
 ;;; Generated autoloads from textmodes/reftex-vars.el
+
 (put 'reftex-vref-is-default 'safe-local-variable (lambda (x) (or (stringp x) 
(symbolp x))))
 (put 'reftex-fref-is-default 'safe-local-variable (lambda (x) (or (stringp x) 
(symbolp x))))
 (put 'reftex-level-indent 'safe-local-variable 'integerp)
 (put 'reftex-guess-label-type 'safe-local-variable (lambda (x) (memq x '(nil 
t))))
-
 (register-definition-prefixes "reftex-vars" '("reftex-"))
 
-;;;***
 
-;;;### (autoloads nil "regexp-opt" "emacs-lisp/regexp-opt.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/regexp-opt.el
 
 (autoload 'regexp-opt "regexp-opt" "\
@@ -28386,34 +25428,26 @@ usually more efficient than that of a simplified 
version:
              (mapconcat \\='regexp-quote strings \"\\\\|\")
              (cdr parens))))
 
-\(fn STRINGS &optional PAREN)" nil nil)
-
+(fn STRINGS &optional PAREN)" nil nil)
 (autoload 'regexp-opt-depth "regexp-opt" "\
 Return the depth of REGEXP.
 This means the number of non-shy regexp grouping constructs
-\(parenthesized expressions) in REGEXP.
-
-\(fn REGEXP)" nil nil)
+(parenthesized expressions) in REGEXP.
 
+(fn REGEXP)" nil nil)
 (register-definition-prefixes "regexp-opt" '("regexp-opt-"))
 
-;;;***
 
-;;;### (autoloads nil "regi" "emacs-lisp/regi.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/regi.el
 
 (register-definition-prefixes "regi" '("regi-"))
 
-;;;***
 
-;;;### (autoloads nil "registry" "registry.el" (0 0 0 0))
 ;;; Generated autoloads from registry.el
 
 (register-definition-prefixes "registry" '("registry-"))
 
-;;;***
 
-;;;### (autoloads nil "remember" "textmodes/remember.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/remember.el
 
 (autoload 'remember "remember" "\
@@ -28423,20 +25457,16 @@ or nil to bring up a blank `remember-buffer'.
 
 With a prefix or a visible region, use the region as INITIAL.
 
-\(fn &optional INITIAL)" t nil)
-
+(fn &optional INITIAL)" t nil)
 (autoload 'remember-other-frame "remember" "\
 Call `remember' in another frame.
 
-\(fn &optional INITIAL)" t nil)
-
+(fn &optional INITIAL)" t nil)
 (autoload 'remember-clipboard "remember" "\
 Remember the contents of the current clipboard.
 Most useful for remembering things from other applications." t nil)
-
 (autoload 'remember-diary-extract-entries "remember" "\
 Extract diary entries from the region based on `remember-diary-regexp'." nil 
nil)
-
 (autoload 'remember-notes "remember" "\
 Return the notes buffer, creating it if needed, and maybe switch to it.
 This buffer is for notes that you want to preserve across Emacs sessions.
@@ -28458,13 +25488,10 @@ Set `initial-buffer-choice' to `remember-notes' to 
visit your notes buffer
 when Emacs starts.  Set `remember-notes-buffer-name' to \"*scratch*\"
 to turn the *scratch* buffer into your notes buffer.
 
-\(fn &optional SWITCH-TO)" t nil)
-
+(fn &optional SWITCH-TO)" t nil)
 (register-definition-prefixes "remember" '("remember-"))
 
-;;;***
 
-;;;### (autoloads nil "repeat" "repeat.el" (0 0 0 0))
 ;;; Generated autoloads from repeat.el
 
 (autoload 'repeat "repeat" "\
@@ -28482,13 +25509,11 @@ sequence.  This behavior can be modified by the 
global variable
 \"most recently executed command\" shall be read as \"most
 recently executed command not bound to an input event\".
 
-\(fn REPEAT-ARG)" t nil)
-
+(fn REPEAT-ARG)" t nil)
 (defvar repeat-map nil "\
 The value of the repeating transient map for the next command.
 A command called from the map can set it again to the same map when
 the map can't be set on the command symbol property `repeat-map'.")
-
 (defvar repeat-mode nil "\
 Non-nil if Repeat mode is enabled.
 See the `repeat-mode' command
@@ -28496,9 +25521,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `repeat-mode'.")
-
 (custom-autoload 'repeat-mode "repeat" nil)
-
 (autoload 'repeat-mode "repeat" "\
 Toggle Repeat mode.
 
@@ -28520,13 +25543,10 @@ evaluate `(default-value \\='repeat-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "repeat" '("describe-repeat-maps" "repeat-"))
 
-;;;***
 
-;;;### (autoloads nil "reporter" "mail/reporter.el" (0 0 0 0))
 ;;; Generated autoloads from mail/reporter.el
 
 (autoload 'reporter-submit-bug-report "reporter" "\
@@ -28550,16 +25570,13 @@ is non-nil.
 
 This function does not send a message; it uses the given information
 to initialize a message, which the user can then edit and finally send
-\(or decline to send).  The variable `mail-user-agent' controls which
+(or decline to send).  The variable `mail-user-agent' controls which
 mail-sending package is used for editing and sending the message.
 
-\(fn ADDRESS PKGNAME VARLIST &optional PRE-HOOKS POST-HOOKS SALUTATION)" nil 
nil)
-
+(fn ADDRESS PKGNAME VARLIST &optional PRE-HOOKS POST-HOOKS SALUTATION)" nil 
nil)
 (register-definition-prefixes "reporter" '("reporter-"))
 
-;;;***
 
-;;;### (autoloads nil "reposition" "reposition.el" (0 0 0 0))
 ;;; Generated autoloads from reposition.el
 
 (autoload 'reposition-window "reposition" "\
@@ -28583,13 +25600,10 @@ first comment line visible (if point is in a comment).
 If INTERACTIVE is non-nil, as it is interactively,
 report errors as appropriate for this kind of usage.
 
-\(fn &optional ARG INTERACTIVE)" t nil)
-
+(fn &optional ARG INTERACTIVE)" t nil)
 (register-definition-prefixes "reposition" '("repos-count-screen-lines"))
 
-;;;***
 
-;;;### (autoloads nil "reveal" "reveal.el" (0 0 0 0))
 ;;; Generated autoloads from reveal.el
 
 (autoload 'reveal-mode "reveal" "\
@@ -28614,8 +25628,7 @@ evaluate `reveal-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar global-reveal-mode nil "\
 Non-nil if Global Reveal mode is enabled.
 See the `global-reveal-mode' command
@@ -28623,9 +25636,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-reveal-mode'.")
-
 (custom-autoload 'global-reveal-mode "reveal" nil)
-
 (autoload 'global-reveal-mode "reveal" "\
 Toggle Reveal mode in all buffers (Global Reveal mode).
 
@@ -28645,80 +25656,58 @@ evaluate `(default-value \\='global-reveal-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "reveal" '("reveal-"))
 
-;;;***
 
-;;;### (autoloads nil "rfc1843" "international/rfc1843.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from international/rfc1843.el
 
 (register-definition-prefixes "rfc1843" '("rfc1843-"))
 
-;;;***
 
-;;;### (autoloads nil "rfc2045" "mail/rfc2045.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rfc2045.el
 
 (register-definition-prefixes "rfc2045" '("rfc2045-encode-string"))
 
-;;;***
 
-;;;### (autoloads nil "rfc2047" "mail/rfc2047.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rfc2047.el
 
 (register-definition-prefixes "rfc2047" '("rfc2047-"))
 
-;;;***
 
-;;;### (autoloads nil "rfc2104" "net/rfc2104.el" (0 0 0 0))
 ;;; Generated autoloads from net/rfc2104.el
 
 (register-definition-prefixes "rfc2104" '("rfc2104-"))
 
-;;;***
 
-;;;### (autoloads nil "rfc2231" "mail/rfc2231.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rfc2231.el
 
 (register-definition-prefixes "rfc2231" '("rfc2231-"))
 
-;;;***
 
-;;;### (autoloads nil "rfc6068" "mail/rfc6068.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rfc6068.el
 
 (register-definition-prefixes "rfc6068" '("rfc6068-"))
 
-;;;***
 
-;;;### (autoloads nil "rfc822" "mail/rfc822.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rfc822.el
 
 (register-definition-prefixes "rfc822" '("rfc822-"))
 
-;;;***
 
-;;;### (autoloads nil "ring" "emacs-lisp/ring.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/ring.el
 
 (autoload 'ring-p "ring" "\
 Return t if X is a ring; nil otherwise.
 
-\(fn X)" nil nil)
-
+(fn X)" nil nil)
 (autoload 'make-ring "ring" "\
 Make a ring that can contain SIZE elements.
 
-\(fn SIZE)" nil nil)
-
+(fn SIZE)" nil nil)
 (register-definition-prefixes "ring" '("ring-"))
 
-;;;***
 
-;;;### (autoloads nil "rlogin" "net/rlogin.el" (0 0 0 0))
 ;;; Generated autoloads from net/rlogin.el
 
 (autoload 'rlogin "rlogin" "\
@@ -28729,7 +25718,7 @@ other arguments for `rlogin'.
 Input is sent line-at-a-time to the remote connection.
 
 Communication with the remote host is recorded in a buffer `*rlogin-HOST*'
-\(or `*rlogin-USER@HOST*' if the remote username differs).
+(or `*rlogin-USER@HOST*' if the remote username differs).
 If a prefix argument is given and the buffer `*rlogin-HOST*' already exists,
 a new buffer with a different connection will be made.
 
@@ -28758,32 +25747,24 @@ If you wish to change directory tracking styles 
during a session, use the
 function `rlogin-directory-tracking-mode' rather than simply setting the
 variable.
 
-\(fn INPUT-ARGS &optional BUFFER)" t nil)
-
+(fn INPUT-ARGS &optional BUFFER)" t nil)
 (register-definition-prefixes "rlogin" '("rlogin-"))
 
-;;;***
 
-;;;### (autoloads nil "rmail" "mail/rmail.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rmail.el
 
 (defvar rmail-file-name (purecopy "~/RMAIL") "\
 Name of user's primary mail file.")
-
 (custom-autoload 'rmail-file-name "rmail" t)
-
 (defcustom rmail-spool-directory (purecopy (cond ((file-exists-p "/var/mail") 
"/var/mail/") ((file-exists-p "/var/spool/mail") "/var/spool/mail/") ((memq 
system-type '(hpux usg-unix-v)) "/usr/mail/") (t "/usr/spool/mail/"))) "\
 Name of directory used by system mailer for delivering new mail.
 Its name should end with a slash." :initialize #'custom-initialize-delay :type 
'directory :group 'rmail)
-
 (custom-autoload 'rmail-spool-directory "rmail" t)
-
 (autoload 'rmail-movemail-variant-p "rmail" "\
 Return t if the current movemail variant is any of VARIANTS.
 Currently known variants are `emacs' and `mailutils'.
 
-\(fn &rest VARIANTS)" nil nil)
-
+(fn &rest VARIANTS)" nil nil)
 (defvar rmail-user-mail-address-regexp nil "\
 Regexp matching user mail addresses.
 If non-nil, this variable is used to identify the correspondent
@@ -28797,80 +25778,59 @@ sent by you under different user names.
 Then it should be a regexp matching your mail addresses.
 
 Setting this variable has an effect only before reading a mail.")
-
 (custom-autoload 'rmail-user-mail-address-regexp "rmail" t)
-
-(define-obsolete-variable-alias 'rmail-dont-reply-to-names 
'mail-dont-reply-to-names "24.1")
-
+(define-obsolete-variable-alias 'rmail-dont-reply-to-names 
'mail-dont-reply-to-names "\
+24.1")
 (defvar rmail-default-dont-reply-to-names nil "\
 Regexp specifying part of the default value of `mail-dont-reply-to-names'.
 This is used when the user does not set `mail-dont-reply-to-names'
 explicitly.")
-
-(make-obsolete-variable 'rmail-default-dont-reply-to-names 
'mail-dont-reply-to-names "24.1")
-
+(make-obsolete-variable 'rmail-default-dont-reply-to-names 
'mail-dont-reply-to-names "\
+24.1")
 (defvar rmail-ignored-headers (purecopy (concat 
"^via:\\|^mail-from:\\|^origin:\\|^references:\\|^sender:" 
"\\|^status:\\|^received:\\|^x400-originator:\\|^x400-recipients:" 
"\\|^x400-received:\\|^x400-mts-identifier:\\|^x400-content-type:" 
"\\|^\\(resent-\\|\\)message-id:\\|^summary-line:\\|^resent-date:" 
"\\|^nntp-posting-host:\\|^path:\\|^x-char.*:\\|^x-face:\\|^face:" 
"\\|^x-mailer:\\|^delivered-to:\\|^lines:" 
"\\|^content-transfer-encoding:\\|^x-coding-system:" "\\|^return-path:\\|^ [...]
 Regexp to match header fields that Rmail should normally hide.
-\(See also `rmail-nonignored-headers', which overrides this regexp.)
+(See also `rmail-nonignored-headers', which overrides this regexp.)
 This variable is used for reformatting the message header,
 which normally happens once for each message,
 when you view the message for the first time in Rmail.
 To make a change in this variable take effect
 for a message that you have already viewed,
 go to that message and type \\[rmail-toggle-header] twice.")
-
 (custom-autoload 'rmail-ignored-headers "rmail" t)
-
 (defvar rmail-displayed-headers nil "\
 Regexp to match Header fields that Rmail should display.
 If nil, display all header fields except those matched by
 `rmail-ignored-headers'.")
-
 (custom-autoload 'rmail-displayed-headers "rmail" t)
-
 (defvar rmail-retry-ignored-headers (purecopy 
"^x-authentication-warning:\\|^x-detected-operating-system:\\|^x-spam[-a-z]*:\\|content-type:\\|content-transfer-encoding:\\|mime-version:\\|message-id:")
 "\
 Headers that should be stripped when retrying a failed message.")
-
 (custom-autoload 'rmail-retry-ignored-headers "rmail" t)
-
 (defvar rmail-highlighted-headers (purecopy "^From:\\|^Subject:") "\
 Regexp to match Header fields that Rmail should normally highlight.
 A value of nil means don't highlight.  Uses the face `rmail-highlight'.")
-
 (custom-autoload 'rmail-highlighted-headers "rmail" t)
-
 (defvar rmail-primary-inbox-list nil "\
 List of files that are inboxes for your primary mail file `rmail-file-name'.
 If this is nil, uses the environment variable MAIL.  If that is
 unset, uses a file named by the function `user-login-name' in the
 directory `rmail-spool-directory' (whose value depends on the
 operating system).  For example, \"/var/mail/USER\".")
-
 (custom-autoload 'rmail-primary-inbox-list "rmail" t)
-
 (defvar rmail-secondary-file-directory (purecopy "~/") "\
 Directory for additional secondary Rmail files.")
-
 (custom-autoload 'rmail-secondary-file-directory "rmail" t)
-
 (defvar rmail-secondary-file-regexp (purecopy "\\.xmail\\'") "\
 Regexp for which files are secondary Rmail files.")
-
 (custom-autoload 'rmail-secondary-file-regexp "rmail" t)
-
 (defvar rmail-mode-hook nil "\
 List of functions to call when Rmail is invoked.")
-
 (defvar rmail-show-message-hook nil "\
 List of functions to call when Rmail displays a message.")
-
 (custom-autoload 'rmail-show-message-hook "rmail" t)
-
 (defvar rmail-file-coding-system nil "\
 Coding system used in RMAIL file.
 
 This is set to nil by default.")
-
 (defvar rmail-insert-mime-forwarded-message-function nil "\
 Function to insert a message in MIME format so it can be forwarded.
 This function is called if `rmail-enable-mime' and
@@ -28878,7 +25838,6 @@ This function is called if `rmail-enable-mime' and
 It is called with one argument FORWARD-BUFFER, which is a
 buffer containing the message to forward.  The current buffer
 is the outgoing mail buffer.")
-
 (autoload 'rmail "rmail" "\
 Read and edit incoming mail.
 Moves messages into file named by `rmail-file-name' and edits that
@@ -28892,8 +25851,7 @@ have a chance to specify a file name with the 
minibuffer.
 
 If `rmail-display-summary' is non-nil, make a summary for this RMAIL file.
 
-\(fn &optional FILE-NAME-ARG)" t nil)
-
+(fn &optional FILE-NAME-ARG)" t nil)
 (autoload 'rmail-mode "rmail" "\
 Rmail Mode is used by \\<rmail-mode-map>\\[rmail] for editing Rmail files.
 All normal editing commands are turned off.
@@ -28944,40 +25902,29 @@ Instead, these commands are available:
 \\[rmail-summary-by-regexp]   Summarize only messages with particular 
regexp(s).
 \\[rmail-summary-by-topic]   Summarize only messages with subject line 
regexp(s).
 \\[rmail-toggle-header]        Toggle display of complete header." t nil)
-
 (autoload 'rmail-input "rmail" "\
 Run Rmail on file FILENAME.
 
-\(fn FILENAME)" t nil)
-
+(fn FILENAME)" t nil)
 (autoload 'rmail-set-remote-password "rmail" "\
 Set PASSWORD to be used for retrieving mail from a POP or IMAP server.
 
-\(fn PASSWORD)" t nil)
-
+(fn PASSWORD)" t nil)
 (register-definition-prefixes "rmail" '("mail-" "rmail-"))
 
-;;;***
 
-;;;### (autoloads nil "rmail-spam-filter" "mail/rmail-spam-filter.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from mail/rmail-spam-filter.el
 
 (register-definition-prefixes "rmail-spam-filter" '("rmail-" "rsf-"))
 
-;;;***
 
-;;;### (autoloads nil "rmailedit" "mail/rmailedit.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rmailedit.el
 
 (autoload 'rmail-edit-current-message "rmailedit" "\
 Edit the contents of this message." t nil)
-
 (register-definition-prefixes "rmailedit" '("rmail-"))
 
-;;;***
 
-;;;### (autoloads nil "rmailkwd" "mail/rmailkwd.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rmailkwd.el
 
 (autoload 'rmail-add-label "rmailkwd" "\
@@ -28985,44 +25932,37 @@ Add LABEL to labels associated with current RMAIL 
message.
 Completes (see `rmail-read-label') over known labels when reading.
 LABEL may be a symbol or string.  Only one label is allowed.
 
-\(fn LABEL)" t nil)
-
+(fn LABEL)" t nil)
 (autoload 'rmail-kill-label "rmailkwd" "\
 Remove LABEL from labels associated with current RMAIL message.
 Completes (see `rmail-read-label') over known labels when reading.
 LABEL may be a symbol or string.  Only one label is allowed.
 
-\(fn LABEL)" t nil)
-
+(fn LABEL)" t nil)
 (autoload 'rmail-read-label "rmailkwd" "\
 Read a label with completion, prompting with PROMPT.
 Completions are chosen from `rmail-label-obarray'.  The default
 is `rmail-last-label', if that is non-nil.  Updates `rmail-last-label'
 according to the choice made, and returns a symbol.
 
-\(fn PROMPT)" nil nil)
-
+(fn PROMPT)" nil nil)
 (autoload 'rmail-previous-labeled-message "rmailkwd" "\
 Show previous message with one of the labels LABELS.
 LABELS should be a comma-separated list of label names.
 If LABELS is empty, the last set of labels specified is used.
 With prefix argument N moves backward N messages with these labels.
 
-\(fn N LABELS)" t nil)
-
+(fn N LABELS)" t nil)
 (autoload 'rmail-next-labeled-message "rmailkwd" "\
 Show next message with one of the labels LABELS.
 LABELS should be a comma-separated list of label names.
 If LABELS is empty, the last set of labels specified is used.
 With prefix argument N moves forward N messages with these labels.
 
-\(fn N LABELS)" t nil)
-
+(fn N LABELS)" t nil)
 (register-definition-prefixes "rmailkwd" '("rmail-"))
 
-;;;***
 
-;;;### (autoloads nil "rmailmm" "mail/rmailmm.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rmailmm.el
 
 (autoload 'rmail-mime "rmailmm" "\
@@ -29044,13 +25984,10 @@ By default, this displays text and multipart 
messages, and offers to
 download attachments as specified by `rmail-mime-attachment-dirs-alist'.
 The arguments ARG and STATE have no effect in this case.
 
-\(fn &optional ARG STATE)" t nil)
-
+(fn &optional ARG STATE)" t nil)
 (register-definition-prefixes "rmailmm" '("rmail-"))
 
-;;;***
 
-;;;### (autoloads nil "rmailmsc" "mail/rmailmsc.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rmailmsc.el
 
 (autoload 'set-rmail-inbox-list "rmailmsc" "\
@@ -29060,14 +25997,12 @@ If FILE-NAME is empty, remove any existing inbox list.
 
 This applies only to the current session.
 
-\(fn FILE-NAME)" t nil)
+(fn FILE-NAME)" t nil)
 
-;;;***
 
-;;;### (autoloads nil "rmailout" "mail/rmailout.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rmailout.el
-(put 'rmail-output-file-alist 'risky-local-variable t)
 
+(put 'rmail-output-file-alist 'risky-local-variable t)
 (autoload 'rmail-output "rmailout" "\
 Append this message to mail file FILE-NAME.
 Writes mbox format, unless FILE-NAME exists and is Babyl format, in which
@@ -29103,8 +26038,7 @@ message (if writing a file directly).
 Set the optional fourth argument NOT-RMAIL non-nil if you call this
 from a non-Rmail buffer.  In this case, COUNT is ignored.
 
-\(fn FILE-NAME &optional COUNT NOATTRIBUTE NOT-RMAIL)" t nil)
-
+(fn FILE-NAME &optional COUNT NOATTRIBUTE NOT-RMAIL)" t nil)
 (autoload 'rmail-output-as-seen "rmailout" "\
 Append this message to mbox file named FILE-NAME.
 The details are as for `rmail-output', except that:
@@ -29116,8 +26050,7 @@ Note that if NOT-RMAIL is non-nil, there is no 
difference between this
 function and `rmail-output'.  This argument may be removed in future,
 so you should call `rmail-output' directly in that case.
 
-\(fn FILE-NAME &optional COUNT NOATTRIBUTE NOT-RMAIL)" t nil)
-
+(fn FILE-NAME &optional COUNT NOATTRIBUTE NOT-RMAIL)" t nil)
 (autoload 'rmail-output-body-to-file "rmailout" "\
 Write this message body to the file FILE-NAME.
 Interactively, the default file name comes from either the message
@@ -29130,42 +26063,35 @@ Note that this overwrites FILE-NAME (after 
confirmation), rather
 than appending to it.  Deletes the message after writing if
 `rmail-delete-after-output' is non-nil.
 
-\(fn FILE-NAME)" t nil)
-
+(fn FILE-NAME)" t nil)
 (register-definition-prefixes "rmailout" '("rmail-"))
 
-;;;***
 
-;;;### (autoloads nil "rmailsort" "mail/rmailsort.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rmailsort.el
 
 (autoload 'rmail-sort-by-date "rmailsort" "\
 Sort messages of current Rmail buffer by \"Date\" header.
 If prefix argument REVERSE is non-nil, sorts in reverse order.
 
-\(fn REVERSE)" t nil)
-
+(fn REVERSE)" t nil)
 (autoload 'rmail-sort-by-subject "rmailsort" "\
 Sort messages of current Rmail buffer by \"Subject\" header.
 Ignores any \"Re: \" prefix.  If prefix argument REVERSE is
 non-nil, sorts in reverse order.
 
-\(fn REVERSE)" t nil)
-
+(fn REVERSE)" t nil)
 (autoload 'rmail-sort-by-author "rmailsort" "\
 Sort messages of current Rmail buffer by author.
 This uses either the \"From\" or \"Sender\" header, downcased.
 If prefix argument REVERSE is non-nil, sorts in reverse order.
 
-\(fn REVERSE)" t nil)
-
+(fn REVERSE)" t nil)
 (autoload 'rmail-sort-by-recipient "rmailsort" "\
 Sort messages of current Rmail buffer by recipient.
 This uses either the \"To\" or \"Apparently-To\" header, downcased.
 If prefix argument REVERSE is non-nil, sorts in reverse order.
 
-\(fn REVERSE)" t nil)
-
+(fn REVERSE)" t nil)
 (autoload 'rmail-sort-by-correspondent "rmailsort" "\
 Sort messages of current Rmail buffer by other correspondent.
 This uses either the \"From\", \"Sender\", \"To\", or
@@ -29173,14 +26099,12 @@ This uses either the \"From\", \"Sender\", \"To\", or
 excluded by `mail-dont-reply-to-names'.  If prefix argument
 REVERSE is non-nil, sorts in reverse order.
 
-\(fn REVERSE)" t nil)
-
+(fn REVERSE)" t nil)
 (autoload 'rmail-sort-by-lines "rmailsort" "\
 Sort messages of current Rmail buffer by the number of lines.
 If prefix argument REVERSE is non-nil, sorts in reverse order.
 
-\(fn REVERSE)" t nil)
-
+(fn REVERSE)" t nil)
 (autoload 'rmail-sort-by-labels "rmailsort" "\
 Sort messages of current Rmail buffer by labels.
 LABELS is a comma-separated list of labels.  The order of these
@@ -29189,24 +26113,19 @@ label come first, messages with the second label come 
second, and
 so on.  Messages that have none of these labels come last.
 If prefix argument REVERSE is non-nil, sorts in reverse order.
 
-\(fn REVERSE LABELS)" t nil)
-
+(fn REVERSE LABELS)" t nil)
 (register-definition-prefixes "rmailsort" '("rmail-"))
 
-;;;***
 
-;;;### (autoloads nil "rmailsum" "mail/rmailsum.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rmailsum.el
 
 (autoload 'rmail-summary "rmailsum" "\
 Display a summary of all messages, one line per message." t nil)
-
 (autoload 'rmail-summary-by-labels "rmailsum" "\
 Display a summary of all messages with one or more LABELS.
 LABELS should be a string containing the desired labels, separated by commas.
 
-\(fn LABELS)" t nil)
-
+(fn LABELS)" t nil)
 (autoload 'rmail-summary-by-recipients "rmailsum" "\
 Display a summary of all messages with the given RECIPIENTS.
 Normally checks the To, From and Cc fields of headers;
@@ -29214,36 +26133,30 @@ but if PRIMARY-ONLY is non-nil (prefix arg given),
  only look in the To and From fields.
 RECIPIENTS is a regular expression.
 
-\(fn RECIPIENTS &optional PRIMARY-ONLY)" t nil)
-
+(fn RECIPIENTS &optional PRIMARY-ONLY)" t nil)
 (autoload 'rmail-summary-by-regexp "rmailsum" "\
 Display a summary of all messages according to regexp REGEXP.
 If the regular expression is found in the header of the message
-\(including in the date and other lines, as well as the subject line),
+(including in the date and other lines, as well as the subject line),
 Emacs will list the message in the summary.
 
-\(fn REGEXP)" t nil)
-
+(fn REGEXP)" t nil)
 (autoload 'rmail-summary-by-topic "rmailsum" "\
 Display a summary of all messages with the given SUBJECT.
 Normally checks just the Subject field of headers; but with prefix
 argument WHOLE-MESSAGE is non-nil, looks in the whole message.
 SUBJECT is a regular expression.
 
-\(fn SUBJECT &optional WHOLE-MESSAGE)" t nil)
-
+(fn SUBJECT &optional WHOLE-MESSAGE)" t nil)
 (autoload 'rmail-summary-by-senders "rmailsum" "\
 Display a summary of all messages whose \"From\" field matches SENDERS.
 SENDERS is a regular expression.  The default for SENDERS matches the
 sender of the current message.
 
-\(fn SENDERS)" t nil)
-
+(fn SENDERS)" t nil)
 (register-definition-prefixes "rmailsum" '("rmail-"))
 
-;;;***
 
-;;;### (autoloads nil "rmc" "emacs-lisp/rmc.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/rmc.el
 
 (autoload 'read-multiple-choice "rmc" "\
@@ -29253,7 +26166,7 @@ This function allows to ask the user a multiple-choice 
question.
 CHOICES should be a list of the form (KEY NAME [DESCRIPTION]).
 KEY is a character the user should type to select the entry.
 NAME is a short name for the entry to be displayed while prompting
-\(if there's no room, it might be shortened).
+(if there's no room, it might be shortened).
 DESCRIPTION is an optional longer description of the entry; it will
 be displayed in a help buffer if the user requests more help.  This
 help description has a fixed format in columns.  For greater
@@ -29286,99 +26199,74 @@ The return value is the matching entry from the 
CHOICES list.
 
 Usage example:
 
-\(read-multiple-choice \"Continue connecting?\"
+(read-multiple-choice \"Continue connecting?\"
                       \\='((?a \"always\")
                         (?s \"session only\")
                         (?n \"no\")))
 
-\(fn PROMPT CHOICES &optional HELP-STRING SHOW-HELP)" nil nil)
-
+(fn PROMPT CHOICES &optional HELP-STRING SHOW-HELP)" nil nil)
 (register-definition-prefixes "rmc" '("rmc--"))
 
-;;;***
 
-;;;### (autoloads nil "rng-cmpct" "nxml/rng-cmpct.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-cmpct.el
 
 (autoload 'rng-c-load-schema "rng-cmpct" "\
 Load a schema in RELAX NG compact syntax from FILENAME.
 Return a pattern.
 
-\(fn FILENAME)" nil nil)
-
+(fn FILENAME)" nil nil)
 (register-definition-prefixes "rng-cmpct" '("rng-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-dt" "nxml/rng-dt.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-dt.el
 
 (register-definition-prefixes "rng-dt" '("rng-dt-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-loc" "nxml/rng-loc.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-loc.el
 
 (register-definition-prefixes "rng-loc" '("rng-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-maint" "nxml/rng-maint.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-maint.el
 
 (register-definition-prefixes "rng-maint" '("rng-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-match" "nxml/rng-match.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-match.el
 
 (register-definition-prefixes "rng-match" '("rng-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-nxml" "nxml/rng-nxml.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-nxml.el
 
 (autoload 'rng-nxml-mode-init "rng-nxml" "\
 Initialize `nxml-mode' to take advantage of `rng-validate-mode'.
 This is typically called from `nxml-mode-hook'.
 Validation will be enabled if `rng-nxml-auto-validate-flag' is non-nil." t nil)
-
 (register-definition-prefixes "rng-nxml" '("rng-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-parse" "nxml/rng-parse.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-parse.el
 
 (register-definition-prefixes "rng-parse" '("rng-parse-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-pttrn" "nxml/rng-pttrn.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-pttrn.el
 
 (register-definition-prefixes "rng-pttrn" '("rng-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-uri" "nxml/rng-uri.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-uri.el
 
 (register-definition-prefixes "rng-uri" '("rng-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-util" "nxml/rng-util.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-util.el
 
 (register-definition-prefixes "rng-util" '("rng-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-valid" "nxml/rng-valid.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-valid.el
 
 (autoload 'rng-validate-mode "rng-valid" "\
@@ -29418,17 +26306,13 @@ evaluate `rng-validate-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "rng-valid" '("rng-"))
 
-;;;***
 
-;;;### (autoloads nil "rng-xsd" "nxml/rng-xsd.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-xsd.el
 
 (put 'http://www.w3.org/2001/XMLSchema-datatypes 'rng-dt-compile 
#'rng-xsd-compile)
-
 (autoload 'rng-xsd-compile "rng-xsd" "\
 Provide W3C XML Schema as a RELAX NG datatypes library.
 NAME is a symbol giving the local name of the datatype.  PARAMS is a
@@ -29447,13 +26331,10 @@ The object returned can be any convenient non-nil 
value, provided
 that, if two strings represent the same value, the returned objects
 must be equal.
 
-\(fn NAME PARAMS)" nil nil)
-
+(fn NAME PARAMS)" nil nil)
 (register-definition-prefixes "rng-xsd" '("rng-xsd-" 
"xsd-duration-reference-dates"))
 
-;;;***
 
-;;;### (autoloads nil "robin" "international/robin.el" (0 0 0 0))
 ;;; Generated autoloads from international/robin.el
 
 (autoload 'robin-define-package "robin" "\
@@ -29467,8 +26348,7 @@ OUTPUT is either a character or a string.  RULES are 
not evaluated.
 If there already exists a robin package whose name is NAME, the new
 one replaces the old one.
 
-\(fn NAME DOCSTRING &rest RULES)" nil t)
-
+(fn NAME DOCSTRING &rest RULES)" nil t)
 (autoload 'robin-modify-package "robin" "\
 Change a rule in an already defined robin package.
 
@@ -29476,18 +26356,14 @@ NAME is the string specifying a robin package.
 INPUT is a string that specifies the input pattern.
 OUTPUT is either a character or a string to be generated.
 
-\(fn NAME INPUT OUTPUT)" nil nil)
-
+(fn NAME INPUT OUTPUT)" nil nil)
 (autoload 'robin-use-package "robin" "\
 Start using robin package NAME, which is a string.
 
-\(fn NAME)" nil nil)
-
+(fn NAME)" nil nil)
 (register-definition-prefixes "robin" '("robin-"))
 
-;;;***
 
-;;;### (autoloads nil "rot13" "rot13.el" (0 0 0 0))
 ;;; Generated autoloads from rot13.el
 
 (autoload 'rot13 "rot13" "\
@@ -29496,18 +26372,15 @@ If OBJECT is a buffer, encrypt the region between 
START and END.
 If OBJECT is a string, encrypt it in its entirety, ignoring START
 and END, and return the encrypted string.
 
-\(fn OBJECT &optional START END)" nil nil)
-
+(fn OBJECT &optional START END)" nil nil)
 (autoload 'rot13-string "rot13" "\
 Return ROT13 encryption of STRING.
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (autoload 'rot13-region "rot13" "\
 ROT13 encrypt the region between START and END in current buffer.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'rot13-other-window "rot13" "\
 Display current buffer in ROT13 in another window.
 The text itself is not modified, only the way it is displayed is affected.
@@ -29517,18 +26390,14 @@ is not deleted, any buffer displayed in it will 
become instantly encoded
 in ROT13.
 
 See also `toggle-rot13-mode'." t nil)
-
 (autoload 'toggle-rot13-mode "rot13" "\
 Toggle the use of ROT13 encoding for the current window." t nil)
-
 (register-definition-prefixes "rot13" '("rot13-"))
 
-;;;***
 
-;;;### (autoloads nil "rst" "textmodes/rst.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/rst.el
- (add-to-list 'auto-mode-alist (purecopy '("\\.re?st\\'" . rst-mode)))
 
+ (add-to-list 'auto-mode-alist (purecopy '("\\.re?st\\'" . rst-mode)))
 (autoload 'rst-mode "rst" "\
 Major mode for editing reStructuredText documents.
 \\<rst-mode-map>
@@ -29539,8 +26408,7 @@ highlighting.
 
 \\{rst-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'rst-minor-mode "rst" "\
 Toggle ReST minor mode.
 
@@ -29562,44 +26430,32 @@ evaluate `rst-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "rst" '("rst-"))
 
-;;;***
 
-;;;### (autoloads nil "rtree" "rtree.el" (0 0 0 0))
 ;;; Generated autoloads from rtree.el
 
 (register-definition-prefixes "rtree" '("rtree-"))
 
-;;;***
 
-;;;### (autoloads nil "ruby-mode" "progmodes/ruby-mode.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/ruby-mode.el
-(push (purecopy '(ruby-mode 1 2)) package--builtin-versions)
 
+(push (purecopy '(ruby-mode 1 2)) package--builtin-versions)
 (autoload 'ruby-mode "ruby-mode" "\
 Major mode for editing Ruby code.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (add-to-list 'auto-mode-alist (cons (purecopy (concat "\\(?:\\.\\(?:" 
"rbw?\\|ru\\|rake\\|thor" "\\|jbuilder\\|rabl\\|gemspec\\|podspec" "\\)" "\\|/" 
"\\(?:Gem\\|Rake\\|Cap\\|Thor" "\\|Puppet\\|Berks\\|Brew" 
"\\|Vagrant\\|Guard\\|Pod\\)file" "\\)\\'")) 'ruby-mode))
-
 (dolist (name (list "ruby" "rbx" "jruby" "ruby1.9" "ruby1.8")) (add-to-list 
'interpreter-mode-alist (cons (purecopy name) 'ruby-mode)))
-
 (register-definition-prefixes "ruby-mode" '("ruby-"))
 
-;;;***
 
-;;;### (autoloads nil "ruler-mode" "ruler-mode.el" (0 0 0 0))
 ;;; Generated autoloads from ruler-mode.el
 
 (defvar-local ruler-mode nil "\
 Non-nil if Ruler mode is enabled.
 Use the command `ruler-mode' to change this variable.")
-
 (autoload 'ruler-mode "ruler-mode" "\
 Toggle display of ruler in header line (Ruler mode).
 
@@ -29617,13 +26473,10 @@ evaluate `ruler-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "ruler-mode" '("ruler-"))
 
-;;;***
 
-;;;### (autoloads nil "rx" "emacs-lisp/rx.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/rx.el
 
 (autoload 'rx-to-string "rx" "\
@@ -29635,8 +26488,7 @@ group.
 
 For extending the `rx' notation in FORM, use `rx-define' or `rx-let-eval'.
 
-\(fn FORM &optional NO-GROUP)" nil nil)
-
+(fn FORM &optional NO-GROUP)" nil nil)
 (autoload 'rx "rx" "\
 Translate regular expressions REGEXPS in sexp form to a regexp string.
 Each argument is one of the forms below; RX is a subform, and RX... stands
@@ -29646,34 +26498,34 @@ See `rx-to-string' for the corresponding function.
 STRING         Match a literal string.
 CHAR           Match a literal character.
 
-\(seq RX...)    Match the RXs in sequence.  Alias: :, sequence, and.
-\(or RX...)     Match one of the RXs.  Alias: |.
-
-\(zero-or-more RX...) Match RXs zero or more times.  Alias: 0+.
-\(one-or-more RX...)  Match RXs one or more times.  Alias: 1+.
-\(zero-or-one RX...)  Match RXs or the empty string.  Alias: opt, optional.
-\(* RX...)       Match RXs zero or more times; greedy.
-\(+ RX...)       Match RXs one or more times; greedy.
-\(? RX...)       Match RXs or the empty string; greedy.
-\(*? RX...)      Match RXs zero or more times; non-greedy.
-\(+? RX...)      Match RXs one or more times; non-greedy.
-\(?? RX...)      Match RXs or the empty string; non-greedy.
-\(= N RX...)     Match RXs exactly N times.
-\(>= N RX...)    Match RXs N or more times.
-\(** N M RX...)  Match RXs N to M times.  Alias: repeat.
-\(minimal-match RX)  Match RX, with zero-or-more, one-or-more, zero-or-one
+(seq RX...)    Match the RXs in sequence.  Alias: :, sequence, and.
+(or RX...)     Match one of the RXs.  Alias: |.
+
+(zero-or-more RX...) Match RXs zero or more times.  Alias: 0+.
+(one-or-more RX...)  Match RXs one or more times.  Alias: 1+.
+(zero-or-one RX...)  Match RXs or the empty string.  Alias: opt, optional.
+(* RX...)       Match RXs zero or more times; greedy.
+(+ RX...)       Match RXs one or more times; greedy.
+(? RX...)       Match RXs or the empty string; greedy.
+(*? RX...)      Match RXs zero or more times; non-greedy.
+(+? RX...)      Match RXs one or more times; non-greedy.
+(?? RX...)      Match RXs or the empty string; non-greedy.
+(= N RX...)     Match RXs exactly N times.
+(>= N RX...)    Match RXs N or more times.
+(** N M RX...)  Match RXs N to M times.  Alias: repeat.
+(minimal-match RX)  Match RX, with zero-or-more, one-or-more, zero-or-one
                 and aliases using non-greedy matching.
-\(maximal-match RX)  Match RX, with zero-or-more, one-or-more, zero-or-one
+(maximal-match RX)  Match RX, with zero-or-more, one-or-more, zero-or-one
                 and aliases using greedy matching, which is the default.
 
-\(any SET...)    Match a character from one of the SETs.  Each SET is a
+(any SET...)    Match a character from one of the SETs.  Each SET is a
                 character, a string, a range as string \"A-Z\" or cons
                 (?A . ?Z), or a character class (see below).  Alias: in, char.
-\(not CHARSPEC)  Match one character not matched by CHARSPEC.  CHARSPEC
+(not CHARSPEC)  Match one character not matched by CHARSPEC.  CHARSPEC
                 can be a character, single-char string, (any ...), (or ...),
                 (intersection ...), (syntax ...), (category ...),
                 or a character class.
-\(intersection CHARSET...) Match all CHARSETs.
+(intersection CHARSET...) Match all CHARSETs.
                 CHARSET is (any...), (not...), (or...) or (intersection...),
                 a character or a single-char string.
 not-newline     Match any character except a newline.  Alias: nonl.
@@ -29698,13 +26550,13 @@ CHARCLASS       Match a character from a character 
class.  One of:
  ascii                       ASCII characters (codes 0-127).
  nonascii                    Non-ASCII characters (but not raw bytes).
 
-\(syntax SYNTAX)  Match a character with syntax SYNTAX, being one of:
+(syntax SYNTAX)  Match a character with syntax SYNTAX, being one of:
   whitespace, punctuation, word, symbol, open-parenthesis,
   close-parenthesis, expression-prefix, string-quote,
   paired-delimiter, escape, character-quote, comment-start,
   comment-end, string-delimiter, comment-delimiter
 
-\(category CAT)   Match a character in category CAT, being one of:
+(category CAT)   Match a character in category CAT, being one of:
   space-for-indent, base, consonant, base-vowel,
   upper-diacritical-mark, lower-diacritical-mark, tone-mark, symbol,
   digit, vowel-modifying-diacritical-mark, vowel-sign,
@@ -29733,24 +26585,23 @@ Zero-width assertions: these all match the empty 
string in specific places.
  symbol-start       At the beginning of a symbol.
  symbol-end         At the end of a symbol.
 
-\(group RX...)  Match RXs and define a capture group.  Alias: submatch.
-\(group-n N RX...) Match RXs and define capture group N.  Alias: submatch-n.
-\(backref N)    Match the text that capture group N matched.
+(group RX...)  Match RXs and define a capture group.  Alias: submatch.
+(group-n N RX...) Match RXs and define capture group N.  Alias: submatch-n.
+(backref N)    Match the text that capture group N matched.
 
-\(literal EXPR) Match the literal string from evaluating EXPR at run time.
-\(regexp EXPR)  Match the string regexp from evaluating EXPR at run time.
-\(eval EXPR)    Match the rx sexp from evaluating EXPR at macro-expansion
+(literal EXPR) Match the literal string from evaluating EXPR at run time.
+(regexp EXPR)  Match the string regexp from evaluating EXPR at run time.
+(eval EXPR)    Match the rx sexp from evaluating EXPR at macro-expansion
                 (compile) time.
 
 Additional constructs can be defined using `rx-define' and `rx-let',
 which see.
 
-\(fn REGEXPS...)" nil t)
-
+(fn REGEXPS...)" nil t)
 (autoload 'rx-let-eval "rx" "\
 Evaluate BODY with local BINDINGS for `rx-to-string'.
 BINDINGS, after evaluation, is a list of definitions each on the form
-\(NAME [(ARGS...)] RX), in effect for calls to `rx-to-string'
+(NAME [(ARGS...)] RX), in effect for calls to `rx-to-string'
 in BODY.
 
 For bindings without an ARGS list, NAME is defined as an alias
@@ -29766,14 +26617,12 @@ For extensions when using the `rx' macro, use 
`rx-let'.
 To make global rx extensions, use `rx-define'.
 For more details, see Info node `(elisp) Extending Rx'.
 
-\(fn BINDINGS BODY...)" nil t)
-
+(fn BINDINGS BODY...)" nil t)
 (function-put 'rx-let-eval 'lisp-indent-function '1)
-
 (autoload 'rx-let "rx" "\
 Evaluate BODY with local BINDINGS for `rx'.
 BINDINGS is an unevaluated list of bindings each on the form
-\(NAME [(ARGS...)] RX).
+(NAME [(ARGS...)] RX).
 They are bound lexically and are available in `rx' expressions in
 BODY only.
 
@@ -29790,10 +26639,8 @@ For local extensions to `rx-to-string', use 
`rx-let-eval'.
 To make global rx extensions, use `rx-define'.
 For more details, see Info node `(elisp) Extending Rx'.
 
-\(fn BINDINGS BODY...)" nil t)
-
+(fn BINDINGS BODY...)" nil t)
 (function-put 'rx-let 'lisp-indent-function '1)
-
 (autoload 'rx-define "rx" "\
 Define NAME as a global `rx' definition.
 If the ARGS list is omitted, define NAME as an alias for the `rx'
@@ -29810,65 +26657,58 @@ To make local rx extensions, use `rx-let' for `rx',
 `rx-let-eval' for `rx-to-string'.
 For more details, see Info node `(elisp) Extending Rx'.
 
-\(fn NAME [(ARGS...)] RX)" nil t)
-
+(fn NAME [(ARGS...)] RX)" nil t)
 (function-put 'rx-define 'lisp-indent-function 'defun)
-
-(eval-and-compile (defun rx--pcase-macroexpander (&rest regexps) "A pattern 
that matches strings against `rx' REGEXPS in sexp form.\nREGEXPS are 
interpreted as in `rx'.  The pattern matches any\nstring that is a match for 
REGEXPS, as if by `string-match'.\n\nIn addition to the usual `rx' syntax, 
REGEXPS can contain the\nfollowing constructs:\n\n  (let REF RX...)  binds the 
symbol REF to a submatch that matches\n                   the regular 
expressions RX.  REF is bound in\n             [...]
-
+(eval-and-compile (defun rx--pcase-macroexpander (&rest regexps) "A pattern 
that matches strings against `rx' REGEXPS in sexp form.
+REGEXPS are interpreted as in `rx'.  The pattern matches any
+string that is a match for REGEXPS, as if by `string-match'.
+
+In addition to the usual `rx' syntax, REGEXPS can contain the
+following constructs:
+
+  (let REF RX...)  binds the symbol REF to a submatch that matches
+                   the regular expressions RX.  REF is bound in
+                   CODE to the string of the submatch or nil, but
+                   can also be used in `backref'.
+  (backref REF)    matches whatever the submatch REF matched.
+                   REF can be a number, as usual, or a name
+                   introduced by a previous (let REF ...)
+                   construct." (let* ((rx--pcase-vars nil) (regexp 
(rx--to-expr (rx--pcase-transform (cons 'seq regexps))))) `(and (pred stringp) 
,(pcase (length rx--pcase-vars) (0 `(pred (string-match ,regexp))) (1 `(app 
(lambda (s) (if (string-match ,regexp s) (match-string 1 s) 0)) (and ,(car 
rx--pcase-vars) (pred (not numberp))))) (nvars `(app (lambda (s) (and 
(string-match ,regexp s) ,(rx--reduce-right (lambda (a b) `(cons ,a ,b)) 
(mapcar (lambda (i) `(match-string ,i s)) (number-se [...]
 (define-symbol-prop 'rx--pcase-macroexpander 'edebug-form-spec 'nil)
-
 (define-symbol-prop 'rx 'pcase-macroexpander #'rx--pcase-macroexpander)
-
 (register-definition-prefixes "rx" '("rx-"))
 
-;;;***
 
-;;;### (autoloads nil "sasl" "net/sasl.el" (0 0 0 0))
 ;;; Generated autoloads from net/sasl.el
 
 (register-definition-prefixes "sasl" '("sasl-"))
 
-;;;***
 
-;;;### (autoloads nil "sasl-cram" "net/sasl-cram.el" (0 0 0 0))
 ;;; Generated autoloads from net/sasl-cram.el
 
 (register-definition-prefixes "sasl-cram" '("sasl-cram-md5-"))
 
-;;;***
 
-;;;### (autoloads nil "sasl-digest" "net/sasl-digest.el" (0 0 0 0))
 ;;; Generated autoloads from net/sasl-digest.el
 
 (register-definition-prefixes "sasl-digest" '("sasl-digest-md5-"))
 
-;;;***
 
-;;;### (autoloads nil "sasl-ntlm" "net/sasl-ntlm.el" (0 0 0 0))
 ;;; Generated autoloads from net/sasl-ntlm.el
 
 (register-definition-prefixes "sasl-ntlm" '("sasl-ntlm-"))
 
-;;;***
 
-;;;### (autoloads nil "sasl-scram-rfc" "net/sasl-scram-rfc.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from net/sasl-scram-rfc.el
 
 (register-definition-prefixes "sasl-scram-rfc" '("sasl-scram-"))
 
-;;;***
 
-;;;### (autoloads nil "sasl-scram-sha256" "net/sasl-scram-sha256.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from net/sasl-scram-sha256.el
 
 (register-definition-prefixes "sasl-scram-sha256" '("sasl-scram-sha"))
 
-;;;***
 
-;;;### (autoloads nil "savehist" "savehist.el" (0 0 0 0))
 ;;; Generated autoloads from savehist.el
 
 (defvar savehist-mode nil "\
@@ -29878,9 +26718,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `savehist-mode'.")
-
 (custom-autoload 'savehist-mode "savehist" nil)
-
 (autoload 'savehist-mode "savehist" "\
 Toggle saving of minibuffer history (Savehist mode).
 
@@ -29924,13 +26762,10 @@ evaluate `(default-value \\='savehist-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "savehist" '("savehist-"))
 
-;;;***
 
-;;;### (autoloads nil "saveplace" "saveplace.el" (0 0 0 0))
 ;;; Generated autoloads from saveplace.el
 
 (defvar save-place-mode nil "\
@@ -29940,9 +26775,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `save-place-mode'.")
-
 (custom-autoload 'save-place-mode "saveplace" nil)
-
 (autoload 'save-place-mode "saveplace" "\
 Non-nil means automatically save place in each file.
 
@@ -29963,8 +26796,7 @@ evaluate `(default-value \\='save-place-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'save-place-local-mode "saveplace" "\
 Toggle whether to save your place in this file between sessions.
 
@@ -29975,7 +26807,7 @@ even in a later Emacs session.
 To save places automatically in all files, put this in your init
 file:
 
-\(save-place-mode 1)
+(save-place-mode 1)
 
 This is a minor mode.  If called interactively, toggle the
 `Save-Place-Local mode' mode.  If the prefix argument is
@@ -29992,13 +26824,15 @@ evaluate `save-place-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "saveplace" '("load-save-place-alist-from-file" 
"save-place"))
 
-;;;***
 
-;;;### (autoloads nil "scheme" "progmodes/scheme.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/sb.el
+
+(register-definition-prefixes "semantic/sb" '("semantic-sb-"))
+
+
 ;;; Generated autoloads from progmodes/scheme.el
 
 (autoload 'scheme-mode "scheme" "\
@@ -30019,8 +26853,7 @@ Delete converts tabs to spaces as it moves back.
 Blank lines separate paragraphs.  Semicolons start comments.
 \\{scheme-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'dsssl-mode "scheme" "\
 Major mode for editing DSSSL code.
 Editing commands are similar to those of `lisp-mode'.
@@ -30033,13 +26866,20 @@ Entering this mode runs the hooks `scheme-mode-hook' 
and then
 `dsssl-mode-hook' and inserts the value of `dsssl-sgml-declaration' if
 that variable's value is a string.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "scheme" '("dsssl-" "scheme-"))
 
-;;;***
 
-;;;### (autoloads nil "score-mode" "gnus/score-mode.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/bovine/scm.el
+
+(register-definition-prefixes "semantic/bovine/scm" '("semantic-"))
+
+
+;;; Generated autoloads from cedet/semantic/scope.el
+
+(register-definition-prefixes "semantic/scope" '("semantic-"))
+
+
 ;;; Generated autoloads from gnus/score-mode.el
 
 (autoload 'gnus-score-mode "score-mode" "\
@@ -30048,13 +26888,10 @@ This mode is an extended emacs-lisp mode.
 
 \\{gnus-score-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "score-mode" '("gnus-score-" "score-mode-"))
 
-;;;***
 
-;;;### (autoloads nil "scroll-all" "scroll-all.el" (0 0 0 0))
 ;;; Generated autoloads from scroll-all.el
 
 (defvar scroll-all-mode nil "\
@@ -30064,9 +26901,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `scroll-all-mode'.")
-
 (custom-autoload 'scroll-all-mode "scroll-all" nil)
-
 (autoload 'scroll-all-mode "scroll-all" "\
 Toggle shared scrolling in same-frame windows (Scroll-All mode).
 
@@ -30087,20 +26922,15 @@ evaluate `(default-value \\='scroll-all-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "scroll-all" '("scroll-all-"))
 
-;;;***
 
-;;;### (autoloads nil "scroll-bar" "scroll-bar.el" (0 0 0 0))
 ;;; Generated autoloads from scroll-bar.el
 
 (register-definition-prefixes "scroll-bar" '("get-scroll-bar-mode" 
"horizontal-scroll-bar" "previous-scroll-bar-mode" "scroll-bar-" 
"set-scroll-bar-mode" "toggle-"))
 
-;;;***
 
-;;;### (autoloads nil "scroll-lock" "scroll-lock.el" (0 0 0 0))
 ;;; Generated autoloads from scroll-lock.el
 
 (autoload 'scroll-lock-mode "scroll-lock" "\
@@ -30128,25 +26958,25 @@ evaluate `scroll-lock-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "scroll-lock" '("scroll-lock-"))
 
-;;;***
 
-;;;### (autoloads nil "secrets" "net/secrets.el" (0 0 0 0))
 ;;; Generated autoloads from net/secrets.el
+
 (when (featurep 'dbusbind)
  (autoload 'secrets-show-secrets "secrets" nil t))
-
 (register-definition-prefixes "secrets" '("secrets-"))
 
-;;;***
 
-;;;### (autoloads nil "semantic" "cedet/semantic.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/semantic.el
+
+(register-definition-prefixes "srecode/semantic" '("srecode-semantic-"))
+
+
 ;;; Generated autoloads from cedet/semantic.el
-(push (purecopy '(semantic 2 2)) package--builtin-versions)
 
+(push (purecopy '(semantic 2 2)) package--builtin-versions)
 (defvar semantic-default-submodes '(global-semantic-idle-scheduler-mode 
global-semanticdb-minor-mode) "\
 List of auxiliary Semantic minor modes enabled by `semantic-mode'.
 The possible elements of this list include the following:
@@ -30169,9 +26999,7 @@ The following modes are more targeted at people who 
want to see
  `global-semantic-show-unmatched-syntax-mode' - Highlight unmatched lexical
                                          syntax tokens.
  `global-semantic-show-parser-state-mode' - Display the parser cache state.")
-
 (custom-autoload 'semantic-default-submodes "semantic" t)
-
 (defvar semantic-mode nil "\
 Non-nil if Semantic mode is enabled.
 See the `semantic-mode' command
@@ -30179,9 +27007,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `semantic-mode'.")
-
 (custom-autoload 'semantic-mode "semantic" nil)
-
 (autoload 'semantic-mode "semantic" "\
 Toggle parser features (Semantic mode).
 
@@ -30207,199 +27033,15 @@ evaluate `(default-value \\='semantic-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "semantic" '("bovinate" "semantic-"))
 
-;;;***
-
-;;;### (autoloads nil "semantic/analyze/debug" 
"cedet/semantic/analyze/debug.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/analyze/debug.el
-
-(register-definition-prefixes "semantic/analyze/debug" '("semantic-analyze"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/analyze/fcn" "cedet/semantic/analyze/fcn.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/analyze/fcn.el
-
-(register-definition-prefixes "semantic/analyze/fcn" '("semantic-analyze-"))
-
-;;;***
 
-;;;### (autoloads nil "semantic/bovine/debug" "cedet/semantic/bovine/debug.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/bovine/debug.el
+;;; Generated autoloads from cedet/semantic/senator.el
 
-(register-definition-prefixes "semantic/bovine/debug" '("semantic-"))
+(register-definition-prefixes "semantic/senator" '("semantic-up-reference" 
"senator-"))
 
-;;;***
 
-;;;### (autoloads nil "semantic/bovine/grammar" 
"cedet/semantic/bovine/grammar.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/bovine/grammar.el
-
-(autoload 'bovine-grammar-mode "semantic/bovine/grammar" "\
-Major mode for editing Bovine grammars.
-
-\(fn)" t nil)
-
-(register-definition-prefixes "semantic/bovine/grammar" '("bovine-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/chart" "cedet/semantic/chart.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/chart.el
-
-(register-definition-prefixes "semantic/chart" '("semantic-chart-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/db-debug" "cedet/semantic/db-debug.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db-debug.el
-
-(register-definition-prefixes "semantic/db-debug" '("semanticdb-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/db-ebrowse" "cedet/semantic/db-ebrowse.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db-ebrowse.el
-
-(register-definition-prefixes "semantic/db-ebrowse" '("c++-mode" 
"semanticdb-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/db-el" "cedet/semantic/db-el.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db-el.el
-
-(register-definition-prefixes "semantic/db-el" '("emacs-lisp-mode" 
"semanticdb-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/db-javascript" 
"cedet/semantic/db-javascript.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db-javascript.el
-
-(register-definition-prefixes "semantic/db-javascript" '("javascript-mode" 
"semanticdb-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/db-ref" "cedet/semantic/db-ref.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db-ref.el
-
-(register-definition-prefixes "semantic/db-ref" '("semanticdb-ref-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/decorate" "cedet/semantic/decorate.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/decorate.el
-
-(register-definition-prefixes "semantic/decorate" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/ede-grammar" "cedet/semantic/ede-grammar.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/ede-grammar.el
-
-(register-definition-prefixes "semantic/ede-grammar" '("semantic-ede-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/fw" "cedet/semantic/fw.el" (0 0 0
-;;;;;;  0))
-;;; Generated autoloads from cedet/semantic/fw.el
-
-(register-definition-prefixes "semantic/fw" '("semantic"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/grammar" "cedet/semantic/grammar.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/grammar.el
-
-(register-definition-prefixes "semantic/grammar" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/java" "cedet/semantic/java.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from cedet/semantic/java.el
-
-(register-definition-prefixes "semantic/java" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/sb" "cedet/semantic/sb.el" (0 0 0
-;;;;;;  0))
-;;; Generated autoloads from cedet/semantic/sb.el
-
-(register-definition-prefixes "semantic/sb" '("semantic-sb-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/symref/filter" 
"cedet/semantic/symref/filter.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/symref/filter.el
-
-(register-definition-prefixes "semantic/symref/filter" '("semantic-symref-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/util" "cedet/semantic/util.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from cedet/semantic/util.el
-
-(register-definition-prefixes "semantic/util" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/wisent" "cedet/semantic/wisent.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/wisent.el
-
-(register-definition-prefixes "semantic/wisent" '("define-wisent-lexer" 
"wisent-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/wisent/comp" "cedet/semantic/wisent/comp.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/wisent/comp.el
-
-(register-definition-prefixes "semantic/wisent/comp" '("wisent-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/wisent/grammar" 
"cedet/semantic/wisent/grammar.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/wisent/grammar.el
-
-(autoload 'wisent-grammar-mode "semantic/wisent/grammar" "\
-Major mode for editing Wisent grammars.
-
-\(fn)" t nil)
-
-(register-definition-prefixes "semantic/wisent/grammar" '("wisent-"))
-
-;;;***
-
-;;;### (autoloads nil "semantic/wisent/wisent" 
"cedet/semantic/wisent/wisent.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/wisent/wisent.el
-
-(register-definition-prefixes "semantic/wisent/wisent" '("$action" "$nterm" 
"$region" "wisent-"))
-
-;;;***
-
-;;;### (autoloads nil "sendmail" "mail/sendmail.el" (0 0 0 0))
 ;;; Generated autoloads from mail/sendmail.el
 
 (defvar mail-from-style 'angles "\
@@ -30414,9 +27056,7 @@ If `angles', they look like:
 
 Otherwise, most addresses look like `angles', but they look like
 `parens' if `angles' would need quoting and `parens' would not.")
-
 (custom-autoload 'mail-from-style "sendmail" t)
-
 (defvar mail-specify-envelope-from nil "\
 If non-nil, specify the envelope-from address when sending mail.
 The value used to specify it is whatever is found in
@@ -30426,24 +27066,18 @@ On most systems, specifying the envelope-from address 
is a
 privileged operation.  This variable affects sendmail and
 smtpmail -- if you use feedmail to send mail, see instead the
 variable `feedmail-deduce-envelope-from'.")
-
 (custom-autoload 'mail-specify-envelope-from "sendmail" t)
-
 (defvar mail-self-blind nil "\
 Non-nil means insert Bcc to self in messages to be sent.
 This is done when the message is initialized,
 so you can remove or alter the Bcc field to override the default.
 If you are using `message-mode' to compose messages, customize the
 variable `message-default-mail-headers' instead.")
-
 (custom-autoload 'mail-self-blind "sendmail" t)
-
 (defvar mail-interactive t "\
 Non-nil means when sending a message wait for and display errors.
 Otherwise, let mailer send back a message to report errors.")
-
 (custom-autoload 'mail-interactive "sendmail" t)
-
 (defvar send-mail-function (if (and (boundp 'smtpmail-smtp-server) 
smtpmail-smtp-server) #'smtpmail-send-it #'sendmail-query-once) "\
 Function to call to send the current buffer as mail.
 The headers should be delimited by a line which is
@@ -30451,65 +27085,48 @@ not a valid RFC 822 (or later) header or continuation 
line,
 that matches the variable `mail-header-separator'.
 This is used by the default mail-sending commands.  See also
 `message-send-mail-function' for use with the Message package.")
-
 (custom-autoload 'send-mail-function "sendmail" t)
-
 (defvar mail-header-separator (purecopy "--text follows this line--") "\
 Line used to separate headers from text in messages being composed.")
-
 (custom-autoload 'mail-header-separator "sendmail" t)
-
 (defvar mail-archive-file-name nil "\
 Name of file to write all outgoing messages in, or nil for none.
 This is normally an mbox file, but for backwards compatibility may also
 be a Babyl file.
 If you are using `message-mode' to compose messages, customize the
 variable `message-default-mail-headers' instead.")
-
 (custom-autoload 'mail-archive-file-name "sendmail" t)
-
 (defvar mail-default-reply-to nil "\
 Address to insert as default Reply-To field of outgoing messages.
 If nil, it will be initialized from the REPLYTO environment variable
 when you first send mail.
 If you are using `message-mode' to compose messages, customize the
 variable `message-default-mail-headers' instead.")
-
 (custom-autoload 'mail-default-reply-to "sendmail" t)
-
 (defvar mail-personal-alias-file (purecopy "~/.mailrc") "\
 If non-nil, the name of the user's personal mail alias file.
 This file typically should be in same format as the `.mailrc' file used by
 the `Mail' or `mailx' program.
 This file need not actually exist.")
-
 (custom-autoload 'mail-personal-alias-file "sendmail" t)
-
 (defvar mail-setup-hook nil "\
 Normal hook, run each time a new outgoing message is initialized.")
-
 (custom-autoload 'mail-setup-hook "sendmail" t)
-
 (defvar mail-aliases t "\
 Alist of mail address aliases,
 or t meaning should be initialized from your mail aliases file.
-\(The file's name is normally `~/.mailrc', but `mail-personal-alias-file'
+(The file's name is normally `~/.mailrc', but `mail-personal-alias-file'
 can specify a different file name.)
 The alias definitions in the file have this form:
     alias ALIAS MEANING")
-
 (defvar mail-yank-prefix "> " "\
 Prefix insert on lines of yanked message being replied to.
 If this is nil, use indentation, as specified by `mail-indentation-spaces'.")
-
 (custom-autoload 'mail-yank-prefix "sendmail" t)
-
 (defvar mail-indentation-spaces 3 "\
 Number of spaces to insert at the beginning of each cited line.
 Used by `mail-yank-original' via `mail-indent-citation'.")
-
 (custom-autoload 'mail-indentation-spaces "sendmail" t)
-
 (defvar mail-citation-hook nil "\
 Hook for modifying a citation just inserted in the mail buffer.
 Each hook function can find the citation between (point) and (mark t),
@@ -30520,17 +27137,13 @@ in the cited portion of the message.
 
 If this hook is entirely empty (nil), a default action is taken
 instead of no action.")
-
 (custom-autoload 'mail-citation-hook "sendmail" t)
-
 (defvar mail-citation-prefix-regexp (purecopy "\\([ 
\11]*\\(\\w\\|[_.]\\)+>+\\|[ \11]*[>|]\\)+") "\
 Regular expression to match a citation prefix plus whitespace.
 It should match whatever sort of citation prefixes you want to handle,
 with whitespace before and after; it should also match just whitespace.
 The default value matches citations like `foo-bar>' plus whitespace.")
-
 (custom-autoload 'mail-citation-prefix-regexp "sendmail" t)
-
 (defvar mail-signature t "\
 Text inserted at end of mail buffer when a message is initialized.
 If nil, no signature is inserted.
@@ -30540,43 +27153,32 @@ If a string, that string is inserted.
   which is the standard way to delimit a signature in a message.)
 Otherwise, it should be an expression; it is evaluated
 and should insert whatever you want to insert.")
-
 (custom-autoload 'mail-signature "sendmail" t)
-
 (defvar mail-signature-file (purecopy "~/.signature") "\
 File containing the text inserted at end of mail buffer.")
-
 (custom-autoload 'mail-signature-file "sendmail" t)
-
 (defvar mail-default-directory (purecopy "~/") "\
 Value of `default-directory' for Mail mode buffers.
 This directory is used for auto-save files of Mail mode buffers.
 
 Note that Message mode does not use this variable; it auto-saves
 in `message-auto-save-directory'.")
-
 (custom-autoload 'mail-default-directory "sendmail" t)
-
 (defvar mail-default-headers nil "\
 A string containing header lines, to be inserted in outgoing messages.
 It can contain newlines, and should end in one.  It is inserted
 before you edit the message, so you can edit or delete the lines.
 If you are using `message-mode' to compose messages, customize the
 variable `message-default-mail-headers' instead.")
-
 (custom-autoload 'mail-default-headers "sendmail" t)
-
 (autoload 'sendmail-query-once "sendmail" "\
 Query for `send-mail-function' and send mail with it.
 This also saves the value of `send-mail-function' via Customize." nil nil)
-
 (define-mail-user-agent 'sendmail-user-agent #'sendmail-user-agent-compose 
#'mail-send-and-exit)
-
 (autoload 'sendmail-user-agent-compose "sendmail" "\
 
 
-\(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION 
SEND-ACTIONS RETURN-ACTION &rest IGNORED)" nil nil)
-
+(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION 
SEND-ACTIONS RETURN-ACTION &rest IGNORED)" nil nil)
 (autoload 'mail-mode "sendmail" "\
 Major mode for editing mail to be sent.
 Like Text Mode but with these additional commands:
@@ -30599,22 +27201,18 @@ Here are commands that move to a header field (and 
create it if there isn't):
 Turning on Mail mode runs the normal hooks `text-mode-hook' and
 `mail-mode-hook' (in that order).
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (defvar mail-mailing-lists nil "\
 List of mailing list addresses the user is subscribed to.
 The variable is used to trigger insertion of the \"Mail-Followup-To\"
 header when sending a message to a mailing list.")
-
 (custom-autoload 'mail-mailing-lists "sendmail" t)
-
 (defvar sendmail-coding-system nil "\
 Coding system for encoding the outgoing mail.
 This has higher priority than the default `buffer-file-coding-system'
 and `default-sendmail-coding-system',
 but lower priority than the local value of `buffer-file-coding-system'.
 See also the function `select-message-coding-system'.")
-
 (defvar default-sendmail-coding-system 'utf-8 "\
 Default coding system for encoding the outgoing mail.
 This variable is used only when `sendmail-coding-system' is nil.
@@ -30624,7 +27222,6 @@ User should not set this variable manually,
 instead use `sendmail-coding-system' to get a constant encoding
 of outgoing mails regardless of the current language environment.
 See also the function `select-message-coding-system'.")
-
 (autoload 'mail "sendmail" "\
 Edit a message to be sent.  Prefix arg means resume editing (don't erase).
 When this function returns, the buffer `*mail*' is selected.
@@ -30673,26 +27270,21 @@ The seventh argument ACTIONS is a list of actions to 
take
  when the message is sent, we apply FUNCTION to ARGS.
  This is how Rmail arranges to mark messages `answered'.
 
-\(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER ACTIONS 
RETURN-ACTION)" t nil)
-
+(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER ACTIONS 
RETURN-ACTION)" t nil)
 (autoload 'mail-other-window "sendmail" "\
 Like `mail' command, but display mail buffer in another window.
 
-\(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER SENDACTIONS)" t 
nil)
-
+(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER SENDACTIONS)" t 
nil)
 (autoload 'mail-other-frame "sendmail" "\
 Like `mail' command, but display mail buffer in another frame.
 
-\(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER SENDACTIONS)" t 
nil)
-
+(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER SENDACTIONS)" t 
nil)
 (register-definition-prefixes "sendmail" '("mail-" "sendmail-"))
 
-;;;***
 
-;;;### (autoloads nil "seq" "emacs-lisp/seq.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/seq.el
-(push (purecopy '(seq 2 23)) package--builtin-versions)
 
+(push (purecopy '(seq 2 23)) package--builtin-versions)
 (autoload 'seq-subseq "seq" "\
 Return the sequence of elements of SEQUENCE from START to END.
 END is exclusive.
@@ -30702,8 +27294,7 @@ START or END is negative, it counts from the end.  
Signal an
 error if START or END are outside of the sequence (i.e too large
 if positive or too small if negative).
 
-\(fn SEQUENCE START &optional END)" nil nil)
-
+(fn SEQUENCE START &optional END)" nil nil)
 (autoload 'seq-take "seq" "\
 Take the first N elements of SEQUENCE and return the result.
 The result is a sequence of the same type as SEQUENCE.
@@ -30711,25 +27302,21 @@ The result is a sequence of the same type as SEQUENCE.
 If N is a negative integer or zero, an empty sequence is
 returned.
 
-\(fn SEQUENCE N)" nil nil)
-
+(fn SEQUENCE N)" nil nil)
 (autoload 'seq-sort-by "seq" "\
 Sort SEQUENCE using PRED as a comparison function.
 Elements of SEQUENCE are transformed by FUNCTION before being
 sorted.  FUNCTION must be a function of one argument.
 
-\(fn FUNCTION PRED SEQUENCE)" nil nil)
-
+(fn FUNCTION PRED SEQUENCE)" nil nil)
 (autoload 'seq-filter "seq" "\
 Return a list of all elements for which (PRED element) is non-nil in SEQUENCE.
 
-\(fn PRED SEQUENCE)" nil nil)
-
+(fn PRED SEQUENCE)" nil nil)
 (autoload 'seq-remove "seq" "\
 Return a list of all the elements for which (PRED element) is nil in SEQUENCE.
 
-\(fn PRED SEQUENCE)" nil nil)
-
+(fn PRED SEQUENCE)" nil nil)
 (autoload 'seq-reduce "seq" "\
 Reduce the function FUNCTION across SEQUENCE, starting with INITIAL-VALUE.
 
@@ -30742,19 +27329,16 @@ argument, and the elements from SEQUENCE as the 
second argument.
 
 If SEQUENCE is empty, return INITIAL-VALUE and FUNCTION is not called.
 
-\(fn FUNCTION SEQUENCE INITIAL-VALUE)" nil nil)
-
+(fn FUNCTION SEQUENCE INITIAL-VALUE)" nil nil)
 (autoload 'seq-every-p "seq" "\
 Return non-nil if (PRED element) is non-nil for all elements of SEQUENCE.
 
-\(fn PRED SEQUENCE)" nil nil)
-
+(fn PRED SEQUENCE)" nil nil)
 (autoload 'seq-some "seq" "\
 Return non-nil if PRED is satisfied for at least one element of SEQUENCE.
 If so, return the first non-nil value returned by PRED.
 
-\(fn PRED SEQUENCE)" nil nil)
-
+(fn PRED SEQUENCE)" nil nil)
 (autoload 'seq-find "seq" "\
 Return the first element for which (PRED element) is non-nil in SEQUENCE.
 If no element is found, return DEFAULT.
@@ -30763,64 +27347,51 @@ Note that `seq-find' has an ambiguity if the found 
element is
 identical to DEFAULT, as it cannot be known if an element was
 found or not.
 
-\(fn PRED SEQUENCE &optional DEFAULT)" nil nil)
-
+(fn PRED SEQUENCE &optional DEFAULT)" nil nil)
 (autoload 'seq-position "seq" "\
 Return the index of the first element in SEQUENCE that is equal to ELT.
 Equality is defined by TESTFN if non-nil or by `equal' if nil.
 
-\(fn SEQUENCE ELT &optional TESTFN)" nil nil)
-
+(fn SEQUENCE ELT &optional TESTFN)" nil nil)
 (autoload 'seq-uniq "seq" "\
 Return a list of the elements of SEQUENCE with duplicates removed.
 TESTFN is used to compare elements, or `equal' if TESTFN is nil.
 
-\(fn SEQUENCE &optional TESTFN)" nil nil)
-
+(fn SEQUENCE &optional TESTFN)" nil nil)
 (autoload 'seq-union "seq" "\
 Return a list of all elements that appear in either SEQUENCE1 or SEQUENCE2.
 Equality is defined by TESTFN if non-nil or by `equal' if nil.
 
-\(fn SEQUENCE1 SEQUENCE2 &optional TESTFN)" nil nil)
-
+(fn SEQUENCE1 SEQUENCE2 &optional TESTFN)" nil nil)
 (autoload 'seq-intersection "seq" "\
 Return a list of the elements that appear in both SEQUENCE1 and SEQUENCE2.
 Equality is defined by TESTFN if non-nil or by `equal' if nil.
 
-\(fn SEQUENCE1 SEQUENCE2 &optional TESTFN)" nil nil)
-
+(fn SEQUENCE1 SEQUENCE2 &optional TESTFN)" nil nil)
 (autoload 'seq-group-by "seq" "\
 Apply FUNCTION to each element of SEQUENCE.
 Separate the elements of SEQUENCE into an alist using the results as
 keys.  Keys are compared using `equal'.
 
-\(fn FUNCTION SEQUENCE)" nil nil)
-
+(fn FUNCTION SEQUENCE)" nil nil)
 (autoload 'seq-max "seq" "\
 Return the largest element of SEQUENCE.
 SEQUENCE must be a sequence of numbers or markers.
 
-\(fn SEQUENCE)" nil nil)
-
+(fn SEQUENCE)" nil nil)
 (autoload 'seq-random-elt "seq" "\
 Return a random element from SEQUENCE.
 Signal an error if SEQUENCE is empty.
 
-\(fn SEQUENCE)" nil nil)
-
+(fn SEQUENCE)" nil nil)
 (register-definition-prefixes "seq" '("seq-"))
 
-;;;***
 
-;;;### (autoloads nil "server" "server.el" (0 0 0 0))
 ;;; Generated autoloads from server.el
 
 (put 'server-host 'risky-local-variable t)
-
 (put 'server-port 'risky-local-variable t)
-
 (put 'server-auth-dir 'risky-local-variable t)
-
 (autoload 'server-start "server" "\
 Allow this Emacs process to be a server for client processes.
 This starts a server communications subprocess through which client
@@ -30841,15 +27412,13 @@ To force-start a server, do \\[server-force-delete] 
and then
 To check from a Lisp program whether a server is running, use
 the `server-process' variable.
 
-\(fn &optional LEAVE-DEAD INHIBIT-PROMPT)" t nil)
-
+(fn &optional LEAVE-DEAD INHIBIT-PROMPT)" t nil)
 (autoload 'server-force-delete "server" "\
 Unconditionally delete connection file for server NAME.
 If server is running, it is first stopped.
 NAME defaults to `server-name'.  With argument, ask for NAME.
 
-\(fn &optional NAME)" t nil)
-
+(fn &optional NAME)" t nil)
 (defvar server-mode nil "\
 Non-nil if Server mode is enabled.
 See the `server-mode' command
@@ -30857,9 +27426,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `server-mode'.")
-
 (custom-autoload 'server-mode "server" nil)
-
 (autoload 'server-mode "server" "\
 Toggle Server mode.
 
@@ -30881,8 +27448,7 @@ evaluate `(default-value \\='server-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'server-save-buffers-kill-terminal "server" "\
 Offer to save each buffer, then kill the current client.
 With ARG non-nil, silently save all file-visiting buffers, then kill.
@@ -30890,8 +27456,7 @@ With ARG non-nil, silently save all file-visiting 
buffers, then kill.
 If emacsclient was started with a list of filenames to edit, then
 only these files will be asked to be saved.
 
-\(fn ARG)" nil nil)
-
+(fn ARG)" nil nil)
 (autoload 'server-stop-automatically "server" "\
 Automatically stop server as specified by ARG.
 
@@ -30913,13 +27478,10 @@ Any other value of ARG will cause this function to 
signal an error.
 
 This function is meant to be called from the user init file.
 
-\(fn ARG)" nil nil)
-
+(fn ARG)" nil nil)
 (register-definition-prefixes "server" '("server-"))
 
-;;;***
 
-;;;### (autoloads nil "ses" "ses.el" (0 0 0 0))
 ;;; Generated autoloads from ses.el
 
 (autoload 'ses-mode "ses" "\
@@ -30936,7 +27498,7 @@ contents of another cell.  For example, you can sum a 
range of
 cells with `(+ A1 A2 A3)'.  There are specialized functions like
 `ses+' (addition for ranges with empty cells), `ses-average' (for
 performing calculations on cells), and `ses-range' and `ses-select'
-\(for extracting ranges of cells).
+(for extracting ranges of cells).
 
 Each cell also has a print function that controls how it is
 displayed.
@@ -30958,13 +27520,9 @@ part):
 These are active only in the minibuffer, when entering or editing a
 formula:
 \\{ses-mode-edit-map}" t nil)
-
 (register-definition-prefixes "ses" '("ses"))
 
-;;;***
 
-;;;### (autoloads nil "sgml-mode" "textmodes/sgml-mode.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from textmodes/sgml-mode.el
 
 (autoload 'sgml-mode "sgml-mode" "\
@@ -30986,8 +27544,7 @@ Do \\[describe-variable] sgml- SPC to see available 
variables.
 Do \\[describe-key] on the following bindings to discover what they do.
 \\{sgml-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'html-mode "sgml-mode" "\
 Major mode based on SGML mode for editing HTML documents.
 This allows inserting skeleton constructs used in hypertext documents with
@@ -31026,17 +27583,13 @@ To work around that, do:
 
 \\{html-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "sgml-mode" '("html-" "sgml-"))
 
-;;;***
 
-;;;### (autoloads nil "sh-script" "progmodes/sh-script.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/sh-script.el
-(put 'sh-shell 'safe-local-variable 'symbolp)
 
+(put 'sh-shell 'safe-local-variable 'symbolp)
 (autoload 'sh-mode "sh-script" "\
 Major mode for editing shell scripts.
 This mode works for many shells, since they all have roughly the same syntax,
@@ -31089,15 +27642,11 @@ indicate what shell it is use `sh-alias-alist' to 
translate.
 If your shell gives error messages with line numbers, you can use 
\\[executable-interpret]
 with your script for an edit-interpret-debug cycle.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (defalias 'shell-script-mode 'sh-mode)
-
 (register-definition-prefixes "sh-script" '("sh-"))
 
-;;;***
 
-;;;### (autoloads nil "shadow" "emacs-lisp/shadow.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/shadow.el
 
 (autoload 'list-load-path-shadows "shadow" "\
@@ -31115,11 +27664,11 @@ the earlier.
 
 For example, suppose `load-path' is set to
 
-\(\"/usr/share/emacs/site-lisp\" \"/usr/share/emacs/24.3/lisp\")
+(\"/usr/share/emacs/site-lisp\" \"/usr/share/emacs/24.3/lisp\")
 
 and that each of these directories contains a file called XXX.el.  Then
 XXX.el in the site-lisp directory is referred to by all of:
-\(require \\='XXX), (autoload .... \"XXX\"), (load-library \"XXX\") etc.
+(require \\='XXX), (autoload .... \"XXX\"), (load-library \"XXX\") etc.
 
 The first XXX.el file prevents Emacs from seeing the second (unless
 the second is loaded explicitly via `load-file').
@@ -31135,20 +27684,17 @@ Emacs version).
 
 This function performs these checks and flags all possible
 shadowings.  Because a .el file may exist without a corresponding .elc
-\(or vice-versa), these suffixes are essentially ignored.  A file
+(or vice-versa), these suffixes are essentially ignored.  A file
 XXX.elc in an early directory (that does not contain XXX.el) is
 considered to shadow a later file XXX.el, and vice-versa.
 
 Shadowings are located by calling the (non-interactive) companion
 function, `load-path-shadows-find'.
 
-\(fn &optional STRINGP)" t nil)
-
+(fn &optional STRINGP)" t nil)
 (register-definition-prefixes "shadow" '("load-path-shadows-"))
 
-;;;***
 
-;;;### (autoloads nil "shadowfile" "shadowfile.el" (0 0 0 0))
 ;;; Generated autoloads from shadowfile.el
 
 (autoload 'shadow-define-cluster "shadowfile" "\
@@ -31159,14 +27705,12 @@ defined by a name, the network address of a primary 
host (the one we copy
 files to), and a regular expression that matches the hostnames of all the
 sites in the cluster.
 
-\(fn NAME)" t nil)
-
+(fn NAME)" t nil)
 (autoload 'shadow-define-literal-group "shadowfile" "\
 Declare a single file to be shared between sites.
 It may have different filenames on each site.  When this file is edited, the
 new version will be copied to each of the other locations.  Sites can be
 specific hostnames, or names of clusters (see `shadow-define-cluster')." t nil)
-
 (autoload 'shadow-define-regexp-group "shadowfile" "\
 Make each of a group of files be shared between hosts.
 Prompts for regular expression; files matching this are shared between a list
@@ -31174,15 +27718,16 @@ of sites, which are also prompted for.  The filenames 
must be identical on all
 hosts (if they aren't, use `shadow-define-literal-group' instead of this
 function).  Each site can be either a hostname or the name of a cluster (see
 `shadow-define-cluster')." t nil)
-
 (autoload 'shadow-initialize "shadowfile" "\
 Set up file shadowing." t nil)
-
 (register-definition-prefixes "shadowfile" '("shadow"))
 
-;;;***
 
-;;;### (autoloads nil "shell" "shell.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/shell.el
+
+(register-definition-prefixes "ede/shell" '("ede-shell-run-command"))
+
+
 ;;; Generated autoloads from shell.el
 
 (defvar shell-dumb-shell-regexp (purecopy "cmd\\(proxy\\)?\\.exe") "\
@@ -31191,16 +27736,13 @@ don't handle the backslash as a quote character.  For 
shells that
 match this regexp, Emacs will write out the command history when the
 shell finishes, and won't remove backslashes when it unquotes shell
 arguments.")
-
 (custom-autoload 'shell-dumb-shell-regexp "shell" t)
-
 (autoload 'split-string-shell-command "shell" "\
 Split STRING (a shell command) into a list of strings.
 General shell syntax, like single and double quoting, as well as
 backslash quoting, is respected.
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (autoload 'shell "shell" "\
 Run an inferior shell, with I/O through BUFFER (which defaults to `*shell*').
 Interactively, a prefix arg means to prompt for BUFFER.
@@ -31212,6 +27754,8 @@ If BUFFER exists and shell process is running, just 
switch to BUFFER.
 Program used comes from variable `explicit-shell-file-name',
  or (if that is nil) from the ESHELL environment variable,
  or (if that is nil) from `shell-file-name'.
+Non-interactively, it can also be specified via the FILE-NAME arg.
+
 If a file `~/.emacs_SHELLNAME' exists, or `~/.emacs.d/init_SHELLNAME.sh',
 it is given as initial input (but this may be lost, due to a timing
 error, if the shell discards input when it starts up).
@@ -31233,105 +27777,85 @@ Otherwise, one argument `-i' is passed to the shell.
 
 Make the shell buffer the current buffer, and return it.
 
-\(Type \\[describe-mode] in the shell buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the shell buffer for a list of commands.)
 
+(fn &optional BUFFER FILE-NAME)" t nil)
 (register-definition-prefixes "shell" '("dirs" "explicit-" "shell-"))
 
-;;;***
 
-;;;### (autoloads nil "shortdoc" "emacs-lisp/shortdoc.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from emacs-lisp/shortdoc.el
 
 (autoload 'shortdoc-display-group "shortdoc" "\
 Pop to a buffer with short documentation summary for functions in GROUP.
 If FUNCTION is non-nil, place point on the entry for FUNCTION (if any).
+If SAME-WINDOW, don't pop to a new window.
 
-\(fn GROUP &optional FUNCTION)" t nil)
-
+(fn GROUP &optional FUNCTION SAME-WINDOW)" t nil)
 (defalias 'shortdoc #'shortdoc-display-group)
-
 (register-definition-prefixes "shortdoc" '("alist" "buffer" 
"define-short-documentation-group" "file" "hash-table" "keymaps" "list" 
"number" "overlay" "process" "regexp" "sequence" "shortdoc-" "string" 
"text-properties" "vector"))
 
-;;;***
 
-;;;### (autoloads nil "shr" "net/shr.el" (0 0 0 0))
 ;;; Generated autoloads from net/shr.el
 
 (autoload 'shr-render-region "shr" "\
 Display the HTML rendering of the region between BEGIN and END.
 
-\(fn BEGIN END &optional BUFFER)" t nil)
-
+(fn BEGIN END &optional BUFFER)" t nil)
 (autoload 'shr-insert-document "shr" "\
 Render the parsed document DOM into the current buffer.
 DOM should be a parse tree as generated by
 `libxml-parse-html-region' or similar.
 
-\(fn DOM)" nil nil)
-
+(fn DOM)" nil nil)
 (register-definition-prefixes "shr" '("shr-"))
 
-;;;***
 
-;;;### (autoloads nil "shr-color" "net/shr-color.el" (0 0 0 0))
 ;;; Generated autoloads from net/shr-color.el
 
 (register-definition-prefixes "shr-color" '("shr-color-"))
 
-;;;***
 
-;;;### (autoloads nil "sieve" "net/sieve.el" (0 0 0 0))
 ;;; Generated autoloads from net/sieve.el
 
 (autoload 'sieve-manage "sieve" "\
 
 
-\(fn SERVER &optional PORT)" t nil)
-
+(fn SERVER &optional PORT)" t nil)
 (autoload 'sieve-upload "sieve" "\
 
 
-\(fn &optional NAME)" t nil)
-
+(fn &optional NAME)" t nil)
 (autoload 'sieve-upload-and-bury "sieve" "\
 
 
-\(fn &optional NAME)" t nil)
-
+(fn &optional NAME)" t nil)
 (autoload 'sieve-upload-and-kill "sieve" "\
 
 
-\(fn &optional NAME)" t nil)
-
+(fn &optional NAME)" t nil)
 (register-definition-prefixes "sieve" '("sieve-"))
 
-;;;***
 
-;;;### (autoloads nil "sieve-manage" "net/sieve-manage.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from net/sieve-manage.el
 
 (register-definition-prefixes "sieve-manage" '("sieve-"))
 
-;;;***
 
-;;;### (autoloads nil "sieve-mode" "net/sieve-mode.el" (0 0 0 0))
 ;;; Generated autoloads from net/sieve-mode.el
 
 (autoload 'sieve-mode "sieve-mode" "\
 Major mode for editing Sieve code.
 Turning on Sieve mode runs `sieve-mode-hook'.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "sieve-mode" '("sieve-"))
 
-;;;***
 
-;;;### (autoloads nil "simula" "progmodes/simula.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/simple.el
+
+(register-definition-prefixes "ede/simple" '("ede-simple-"))
+
+
 ;;; Generated autoloads from progmodes/simula.el
 
 (autoload 'simula-mode "simula" "\
@@ -31372,29 +27896,27 @@ Variables controlling indentation style:
 Turning on SIMULA mode calls the value of the variable simula-mode-hook
 with no arguments, if that value is non-nil.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "simula" '("simula-"))
 
-;;;***
 
-;;;### (autoloads nil "skeleton" "skeleton.el" (0 0 0 0))
+;;; Generated autoloads from leim/quail/sisheng.el
+
+(register-definition-prefixes "quail/sisheng" '("quail-make-sisheng-rules" 
"sisheng-"))
+
+
 ;;; Generated autoloads from skeleton.el
 
 (defvar skeleton-filter-function 'identity "\
 Function for transforming a skeleton proxy's aliases' variable value.")
-
 (autoload 'define-skeleton "skeleton" "\
 Define a user-configurable COMMAND that enters a statement skeleton.
 DOCUMENTATION is that of the command.
 SKELETON is as defined under `skeleton-insert'.
 
-\(fn COMMAND DOCUMENTATION &rest SKELETON)" nil t)
-
+(fn COMMAND DOCUMENTATION &rest SKELETON)" nil t)
 (function-put 'define-skeleton 'doc-string-elt '2)
-
 (function-put 'define-skeleton 'lisp-indent-function 'defun)
-
 (autoload 'skeleton-proxy-new "skeleton" "\
 Insert SKELETON.
 Prefix ARG allows wrapping around words or regions (see `skeleton-insert').
@@ -31406,13 +27928,12 @@ This command can also be an abbrev expansion (3rd and 
4th columns in
 Optional second argument STR may also be a string which will be the value
 of `str' whereas the skeleton's interactor is then ignored.
 
-\(fn SKELETON &optional STR ARG)" nil nil)
-
+(fn SKELETON &optional STR ARG)" nil nil)
 (autoload 'skeleton-insert "skeleton" "\
 Insert the complex statement skeleton SKELETON describes very concisely.
 
 With optional second argument REGIONS, wrap first interesting point
-\(`_') in skeleton around next REGIONS words, if REGIONS is positive.
+(`_') in skeleton around next REGIONS words, if REGIONS is positive.
 If REGIONS is negative, wrap REGIONS preceding interregions into first
 REGIONS interesting positions (successive `_'s) in skeleton.
 
@@ -31479,8 +28000,7 @@ available:
        input   initial input (string or cons with index) while reading str
        v1, v2  local variables for memorizing anything you want
 
-\(fn SKELETON &optional REGIONS STR)" nil nil)
-
+(fn SKELETON &optional REGIONS STR)" nil nil)
 (autoload 'skeleton-pair-insert-maybe "skeleton" "\
 Insert the character you type ARG times.
 
@@ -31496,13 +28016,10 @@ the defaults are used.  These are (), [], {}, <> and 
(grave
 accent, apostrophe) for the paired ones, and the same character
 twice for the others.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (register-definition-prefixes "skeleton" '("skeleton-"))
 
-;;;***
 
-;;;### (autoloads nil "smerge-mode" "vc/smerge-mode.el" (0 0 0 0))
 ;;; Generated autoloads from vc/smerge-mode.el
 
 (autoload 'smerge-refine-regions "smerge-mode" "\
@@ -31520,15 +28037,13 @@ If non-nil, PREPROC is called with no argument in a 
buffer that contains
 a copy of a region, just before preparing it to for `diff'.  It can be
 used to replace chars to try and eliminate some spurious differences.
 
-\(fn BEG1 END1 BEG2 END2 PROPS-C &optional PREPROC PROPS-R PROPS-A)" nil nil)
-
+(fn BEG1 END1 BEG2 END2 PROPS-C &optional PREPROC PROPS-R PROPS-A)" nil nil)
 (autoload 'smerge-ediff "smerge-mode" "\
 Invoke ediff to resolve the conflicts.
 NAME-UPPER, NAME-LOWER, and NAME-BASE, if non-nil, are used for the
 buffer names.
 
-\(fn &optional NAME-UPPER NAME-LOWER NAME-BASE)" t nil)
-
+(fn &optional NAME-UPPER NAME-LOWER NAME-BASE)" t nil)
 (autoload 'smerge-mode "smerge-mode" "\
 Minor mode to simplify editing output from the diff3 program.
 
@@ -31548,64 +28063,48 @@ evaluate `smerge-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'smerge-start-session "smerge-mode" "\
 Turn on `smerge-mode' and move point to first conflict marker.
 If no conflict maker is found, turn off `smerge-mode'.
 
-\(fn &optional INTERACTIVELY)" t nil)
-
+(fn &optional INTERACTIVELY)" t nil)
 (register-definition-prefixes "smerge-mode" '("smerge-"))
 
-;;;***
 
-;;;### (autoloads nil "smie" "emacs-lisp/smie.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/smie.el
 
 (register-definition-prefixes "smie" '("smie-"))
 
-;;;***
 
-;;;### (autoloads nil "smiley" "gnus/smiley.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/smiley.el
 
 (autoload 'smiley-region "smiley" "\
 Replace in the region `smiley-regexp-alist' matches with corresponding images.
 A list of images is returned.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'smiley-buffer "smiley" "\
 Run `smiley-region' at the BUFFER, specified in the argument or
 interactively.  If there's no argument, do it at the current buffer.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (register-definition-prefixes "smiley" '("gnus-smiley-file-types" "smiley-"))
 
-;;;***
 
-;;;### (autoloads nil "smime" "gnus/smime.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/smime.el
 
 (register-definition-prefixes "smime" '("smime"))
 
-;;;***
 
-;;;### (autoloads nil "smtpmail" "mail/smtpmail.el" (0 0 0 0))
 ;;; Generated autoloads from mail/smtpmail.el
 
 (autoload 'smtpmail-send-it "smtpmail" nil nil nil)
-
 (autoload 'smtpmail-send-queued-mail "smtpmail" "\
 Send mail that was queued as a result of setting `smtpmail-queue-mail'." t nil)
-
 (register-definition-prefixes "smtpmail" '("smtpmail-"))
 
-;;;***
 
-;;;### (autoloads nil "snake" "play/snake.el" (0 0 0 0))
 ;;; Generated autoloads from play/snake.el
 
 (autoload 'snake "snake" "\
@@ -31623,12 +28122,9 @@ Snake mode keybindings:
 \\[snake-move-right]   Makes the snake move right
 \\[snake-move-up]      Makes the snake move up
 \\[snake-move-down]    Makes the snake move down" t nil)
-
 (register-definition-prefixes "snake" '("snake-"))
 
-;;;***
 
-;;;### (autoloads nil "snmp-mode" "net/snmp-mode.el" (0 0 0 0))
 ;;; Generated autoloads from net/snmp-mode.el
 
 (autoload 'snmp-mode "snmp-mode" "\
@@ -31640,7 +28136,6 @@ Delete converts tabs to spaces as it moves back.
 \\{snmp-mode-map}
 Turning on `snmp-mode' runs the hooks in `snmp-common-mode-hook', then
 `snmp-mode-hook'." t nil)
-
 (autoload 'snmpv2-mode "snmp-mode" "\
 Major mode for editing SNMPv2 MIBs.
 Expression and list commands understand all C brackets.
@@ -31650,21 +28145,16 @@ Delete converts tabs to spaces as it moves back.
 \\{snmp-mode-map}
 Turning on `snmp-mode' runs the hooks in `snmp-common-mode-hook',
 then `snmpv2-mode-hook'." t nil)
-
 (register-definition-prefixes "snmp-mode" '("snmp"))
 
-;;;***
 
-;;;### (autoloads nil "so-long" "so-long.el" (0 0 0 0))
 ;;; Generated autoloads from so-long.el
-(push (purecopy '(so-long 1 1 2)) package--builtin-versions)
 
+(push (purecopy '(so-long 1 1 2)) package--builtin-versions)
 (autoload 'so-long-commentary "so-long" "\
 View the `so-long' library's documentation in `outline-mode'." t nil)
-
 (autoload 'so-long-customize "so-long" "\
 Open the customization group `so-long'." t nil)
-
 (autoload 'so-long-minor-mode "so-long" "\
 This is the minor mode equivalent of `so-long-mode'.
 
@@ -31688,8 +28178,7 @@ evaluate `so-long-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'so-long-mode "so-long" "\
 This major mode is the default `so-long-action' option.
 
@@ -31717,8 +28206,7 @@ Use \\[so-long-commentary] for more information.
 Use \\[so-long-customize] to open the customization group `so-long' to
 configure the behaviour.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'so-long "so-long" "\
 Invoke `so-long-action' and run `so-long-hook'.
 
@@ -31734,13 +28222,11 @@ With a prefix argument, select the action to use 
interactively.
 If an action was already active in the buffer, it will be reverted before
 invoking the new action.
 
-\(fn &optional ACTION)" t nil)
-
+(fn &optional ACTION)" t nil)
 (autoload 'so-long-enable "so-long" "\
 Enable the `so-long' library's functionality.
 
 Equivalent to calling (global-so-long-mode 1)" t nil)
-
 (defvar global-so-long-mode nil "\
 Non-nil if Global So-Long mode is enabled.
 See the `global-so-long-mode' command
@@ -31748,9 +28234,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-so-long-mode'.")
-
 (custom-autoload 'global-so-long-mode "so-long" nil)
-
 (autoload 'global-so-long-mode "so-long" "\
 Toggle automated performance mitigations for files with long lines.
 
@@ -31783,36 +28267,26 @@ evaluate `(default-value \\='global-so-long-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "so-long" '("so-long-" "turn-o"))
 
-;;;***
 
-;;;### (autoloads nil "soap-client" "net/soap-client.el" (0 0 0 0))
 ;;; Generated autoloads from net/soap-client.el
-(push (purecopy '(soap-client 3 2 1)) package--builtin-versions)
 
+(push (purecopy '(soap-client 3 2 1)) package--builtin-versions)
 (register-definition-prefixes "soap-client" '("soap-"))
 
-;;;***
 
-;;;### (autoloads nil "soap-inspect" "net/soap-inspect.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from net/soap-inspect.el
 
 (register-definition-prefixes "soap-inspect" '("soap-"))
 
-;;;***
 
-;;;### (autoloads nil "socks" "net/socks.el" (0 0 0 0))
 ;;; Generated autoloads from net/socks.el
 
 (register-definition-prefixes "socks" '("socks-"))
 
-;;;***
 
-;;;### (autoloads nil "solar" "calendar/solar.el" (0 0 0 0))
 ;;; Generated autoloads from calendar/solar.el
 
 (autoload 'sunrise-sunset "solar" "\
@@ -31823,13 +28297,10 @@ longitude, latitude, time zone, and date, and always 
use standard time.
 
 This function is suitable for execution in an init file.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "solar" '("calendar-" "diary-sunrise-sunset" 
"solar-"))
 
-;;;***
 
-;;;### (autoloads nil "solitaire" "play/solitaire.el" (0 0 0 0))
 ;;; Generated autoloads from play/solitaire.el
 
 (autoload 'solitaire "solitaire" "\
@@ -31841,7 +28312,7 @@ Move around the board using the cursor keys.
 Move stones using \\[solitaire-move] followed by a direction key.
 Undo moves using \\[solitaire-undo].
 Check for possible moves using \\[solitaire-do-check].
-\(The variable `solitaire-auto-eval' controls whether to automatically
+(The variable `solitaire-auto-eval' controls whether to automatically
 check after each move or undo.)
 
 What is Solitaire?
@@ -31900,16 +28371,18 @@ Pick your favorite shortcuts:
 
 \\{solitaire-mode-map}
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (register-definition-prefixes "solitaire" '("solitaire-"))
 
-;;;***
 
-;;;### (autoloads nil "sort" "sort.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/sort.el
+
+(register-definition-prefixes "semantic/sort" '("semantic-"))
+
+
 ;;; Generated autoloads from sort.el
-(put 'sort-fold-case 'safe-local-variable 'booleanp)
 
+(put 'sort-fold-case 'safe-local-variable 'booleanp)
 (autoload 'sort-subr "sort" "\
 General text sorting routine to divide buffer into records and sort them.
 
@@ -31954,8 +28427,7 @@ the keys are numbers, with `compare-buffer-substrings' 
if the
 keys are cons cells (the car and cdr of each cons cell are taken
 as start and end positions), and with `string<' otherwise.
 
-\(fn REVERSE NEXTRECFUN ENDRECFUN &optional STARTKEYFUN ENDKEYFUN PREDICATE)" 
nil nil)
-
+(fn REVERSE NEXTRECFUN ENDRECFUN &optional STARTKEYFUN ENDKEYFUN PREDICATE)" 
nil nil)
 (autoload 'sort-lines "sort" "\
 Sort lines in region alphabetically; REVERSE non-nil means descending order.
 Interactively, REVERSE is the prefix argument, and BEG and END are the region.
@@ -31964,8 +28436,7 @@ REVERSE (non-nil means reverse order), BEG and END 
(region to sort).
 The variable `sort-fold-case' determines whether alphabetic case affects
 the sort order.
 
-\(fn REVERSE BEG END)" t nil)
-
+(fn REVERSE BEG END)" t nil)
 (autoload 'sort-paragraphs "sort" "\
 Sort paragraphs in region alphabetically; argument means descending order.
 Called from a program, there are three arguments:
@@ -31973,8 +28444,7 @@ REVERSE (non-nil means reverse order), BEG and END 
(region to sort).
 The variable `sort-fold-case' determines whether alphabetic case affects
 the sort order.
 
-\(fn REVERSE BEG END)" t nil)
-
+(fn REVERSE BEG END)" t nil)
 (autoload 'sort-pages "sort" "\
 Sort pages in region alphabetically; argument means descending order.
 Called from a program, there are three arguments:
@@ -31982,9 +28452,8 @@ REVERSE (non-nil means reverse order), BEG and END 
(region to sort).
 The variable `sort-fold-case' determines whether alphabetic case affects
 the sort order.
 
-\(fn REVERSE BEG END)" t nil)
+(fn REVERSE BEG END)" t nil)
 (put 'sort-numeric-base 'safe-local-variable 'integerp)
-
 (autoload 'sort-numeric-fields "sort" "\
 Sort lines in region numerically by the ARGth field of each line.
 Fields are separated by whitespace and numbered from 1 up.
@@ -31995,8 +28464,7 @@ With a negative arg, sorts by the ARGth field counted 
from the right.
 Called from a program, there are three arguments:
 FIELD, BEG and END.  BEG and END specify region to sort.
 
-\(fn FIELD BEG END)" t nil)
-
+(fn FIELD BEG END)" t nil)
 (autoload 'sort-fields "sort" "\
 Sort lines in region lexicographically by the ARGth field of each line.
 Fields are separated by whitespace and numbered from 1 up.
@@ -32006,8 +28474,7 @@ FIELD, BEG and END.  BEG and END specify region to sort.
 The variable `sort-fold-case' determines whether alphabetic case affects
 the sort order.
 
-\(fn FIELD BEG END)" t nil)
-
+(fn FIELD BEG END)" t nil)
 (autoload 'sort-regexp-fields "sort" "\
 Sort the text in the region lexicographically.
 If called interactively, prompt for two regular expressions,
@@ -32034,8 +28501,7 @@ For example: to sort lines in the region by the first 
word on each line
  starting with the letter \"f\",
  RECORD-REGEXP would be \"^.*$\" and KEY would be \"\\\\=\\<f\\\\w*\\\\>\"
 
-\(fn REVERSE RECORD-REGEXP KEY-REGEXP BEG END)" t nil)
-
+(fn REVERSE RECORD-REGEXP KEY-REGEXP BEG END)" t nil)
 (autoload 'sort-columns "sort" "\
 Sort lines in region alphabetically by a certain range of columns.
 For the purpose of this command, the region BEG...END includes
@@ -32051,8 +28517,7 @@ and it doesn't know how to handle that.  Also, when 
possible,
 it uses the `sort' utility program, which doesn't understand tabs.
 Use \\[untabify] to convert tabs to spaces before sorting.
 
-\(fn REVERSE &optional BEG END)" t nil)
-
+(fn REVERSE &optional BEG END)" t nil)
 (autoload 'reverse-region "sort" "\
 Reverse the order of lines in a region.
 When called from Lisp, takes two point or marker arguments, BEG and END.
@@ -32061,8 +28526,7 @@ to be reversed is the line starting after BEG.
 If END is not at the end of a line, the last line to be reversed
 is the one that ends before END.
 
-\(fn BEG END)" t nil)
-
+(fn BEG END)" t nil)
 (autoload 'delete-duplicate-lines "sort" "\
 Delete all but one copy of any identical lines in the region.
 Non-interactively, arguments BEG and END delimit the region.
@@ -32082,20 +28546,20 @@ If the argument KEEP-BLANKS is non-nil 
(interactively, with a
 Returns the number of deleted lines.  Interactively, or if INTERACTIVE
 is non-nil, it also prints a message describing the number of deletions.
 
-\(fn BEG END &optional REVERSE ADJACENT KEEP-BLANKS INTERACTIVE)" t nil)
-
+(fn BEG END &optional REVERSE ADJACENT KEEP-BLANKS INTERACTIVE)" t nil)
 (register-definition-prefixes "sort" '("sort-"))
 
-;;;***
 
-;;;### (autoloads nil "soundex" "soundex.el" (0 0 0 0))
 ;;; Generated autoloads from soundex.el
 
 (register-definition-prefixes "soundex" '("soundex"))
 
-;;;***
 
-;;;### (autoloads nil "spam" "gnus/spam.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/source.el
+
+(register-definition-prefixes "ede/source" '("ede-source"))
+
+
 ;;; Generated autoloads from gnus/spam.el
 
 (autoload 'spam-initialize "spam" "\
@@ -32105,14 +28569,10 @@ can call `spam-initialize' before you set spam-use-* 
variables on
 explicitly, and matters only if you need the extra headers
 installed through `spam-necessary-extra-headers'.
 
-\(fn &rest SYMBOLS)" t nil)
-
+(fn &rest SYMBOLS)" t nil)
 (register-definition-prefixes "spam" '(":keymap" "spam-"))
 
-;;;***
 
-;;;### (autoloads nil "spam-report" "gnus/spam-report.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from gnus/spam-report.el
 
 (autoload 'spam-report-process-queue "spam-report" "\
@@ -32122,55 +28582,48 @@ If FILE is given, use it instead of 
`spam-report-requests-file'.
 If KEEP is t, leave old requests in the file.  If KEEP is the
 symbol `ask', query before flushing the queue file.
 
-\(fn &optional FILE KEEP)" t nil)
-
+(fn &optional FILE KEEP)" t nil)
 (autoload 'spam-report-url-ping-mm-url "spam-report" "\
 Ping a host through HTTP, addressing a specific GET resource.
 Use the external program specified in `mm-url-program' to connect
 to server.
 
-\(fn HOST REPORT)" nil nil)
-
+(fn HOST REPORT)" nil nil)
 (autoload 'spam-report-url-to-file "spam-report" "\
 Collect spam report requests in `spam-report-requests-file'.
 Customize `spam-report-url-ping-function' to use this function.
 
-\(fn HOST REPORT)" nil nil)
-
+(fn HOST REPORT)" nil nil)
 (autoload 'spam-report-agentize "spam-report" "\
 Add spam-report support to the Agent.
 Spam reports will be queued with \\[spam-report-url-to-file] when
 the Agent is unplugged, and will be submitted in a batch when the
 Agent is plugged." t nil)
-
 (autoload 'spam-report-deagentize "spam-report" "\
 Remove spam-report support from the Agent.
 Spam reports will be queued with the method used when
 \\[spam-report-agentize] was run." t nil)
-
 (register-definition-prefixes "spam-report" '("spam-report-"))
 
-;;;***
 
-;;;### (autoloads nil "spam-stat" "gnus/spam-stat.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/spam-stat.el
 
 (register-definition-prefixes "spam-stat" '("spam-stat" 
"with-spam-stat-max-buffer-size"))
 
-;;;***
 
-;;;### (autoloads nil "spam-wash" "gnus/spam-wash.el" (0 0 0 0))
 ;;; Generated autoloads from gnus/spam-wash.el
 
 (register-definition-prefixes "spam-wash" '("spam-"))
 
-;;;***
 
-;;;### (autoloads nil "speedbar" "speedbar.el" (0 0 0 0))
+;;; Generated autoloads from cedet/ede/speedbar.el
+
+(register-definition-prefixes "ede/speedbar" '("ede-"))
+
+
 ;;; Generated autoloads from speedbar.el
 
 (defalias 'speedbar 'speedbar-frame-mode)
-
 (autoload 'speedbar-frame-mode "speedbar" "\
 Enable or disable speedbar.  Positive ARG means turn on, negative turn off.
 A nil ARG means toggle.  Once the speedbar frame is activated, a buffer in
@@ -32179,34 +28632,26 @@ supported at a time.
 `speedbar-before-popup-hook' is called before popping up the speedbar frame.
 `speedbar-before-delete-hook' is called before the frame is deleted.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'speedbar-get-focus "speedbar" "\
 Change frame focus to or from the speedbar frame.
 If the selected frame is not speedbar, then speedbar frame is
 selected.  If the speedbar frame is active, then select the attached frame." t 
nil)
-
 (register-definition-prefixes "speedbar" '("speedbar-"))
 
-;;;***
 
-;;;### (autoloads nil "spook" "play/spook.el" (0 0 0 0))
 ;;; Generated autoloads from play/spook.el
 
 (autoload 'spook "spook" "\
 Add that special touch of class to your outgoing mail." t nil)
-
 (autoload 'snarf-spooks "spook" "\
 Return a vector containing the lines from `spook-phrases-file'." nil nil)
-
 (register-definition-prefixes "spook" '("spook-phrase"))
 
-;;;***
 
-;;;### (autoloads nil "sql" "progmodes/sql.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/sql.el
-(push (purecopy '(sql 3 6)) package--builtin-versions)
 
+(push (purecopy '(sql 3 6)) package--builtin-versions)
 (autoload 'sql-add-product-keywords "sql" "\
 Add highlighting KEYWORDS for SQL PRODUCT.
 
@@ -32226,8 +28671,7 @@ For example:
 adds a fontification pattern to fontify identifiers ending in
 `_t' as data types.
 
-\(fn PRODUCT KEYWORDS &optional APPEND)" nil nil)
-
+(fn PRODUCT KEYWORDS &optional APPEND)" nil nil)
 (autoload 'sql-mode "sql" "\
 Major mode to edit SQL.
 
@@ -32252,12 +28696,11 @@ Note that SQL doesn't have an escape character unless 
you specify
 one.  If you specify backslash as escape character in SQL, you
 must tell Emacs.  Here's how to do that in your init file:
 
-\(add-hook \\='sql-mode-hook
+(add-hook \\='sql-mode-hook
           (lambda ()
            (modify-syntax-entry ?\\\\ \"\\\\\" sql-mode-syntax-table)))
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'sql-connect "sql" "\
 Connect to an interactive session using CONNECTION settings.
 
@@ -32267,8 +28710,7 @@ their settings.
 The user will not be prompted for any login parameters if a value
 is specified in the connection settings.
 
-\(fn CONNECTION &optional BUF-NAME)" t nil)
-
+(fn CONNECTION &optional BUF-NAME)" t nil)
 (autoload 'sql-product-interactive "sql" "\
 Run PRODUCT interpreter as an inferior process.
 
@@ -32280,10 +28722,9 @@ To specify the SQL product, prefix the call with
 the call to \\[sql-product-interactive] with
 \\[universal-argument] \\[universal-argument].
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional PRODUCT NEW-NAME)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional PRODUCT NEW-NAME)" t nil)
 (autoload 'sql-oracle "sql" "\
 Run sqlplus by Oracle as an inferior process.
 
@@ -32311,10 +28752,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-sybase "sql" "\
 Run isql by Sybase as an inferior process.
 
@@ -32342,10 +28782,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-informix "sql" "\
 Run dbaccess by Informix as an inferior process.
 
@@ -32371,10 +28810,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-sqlite "sql" "\
 Run sqlite as an inferior process.
 
@@ -32404,10 +28842,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-mysql "sql" "\
 Run mysql by TcX as an inferior process.
 
@@ -32437,10 +28874,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-mariadb "sql" "\
 Run mysql by MariaDB as an inferior process.
 
@@ -32470,10 +28906,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-solid "sql" "\
 Run solsql by Solid as an inferior process.
 
@@ -32500,10 +28935,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-ingres "sql" "\
 Run sql by Ingres as an inferior process.
 
@@ -32529,10 +28963,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-ms "sql" "\
 Run osql by Microsoft as an inferior process.
 
@@ -32560,10 +28993,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-postgres "sql" "\
 Run psql by Postgres as an inferior process.
 
@@ -32593,12 +29025,11 @@ The default comes from `process-coding-system-alist' 
and
 your might try undecided-dos as a coding system.  If this doesn't help,
 Try to set `comint-output-filter-functions' like this:
 
-\(add-hook \\='comint-output-filter-functions #\\='comint-strip-ctrl-m 
\\='append)
-
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
+(add-hook \\='comint-output-filter-functions #\\='comint-strip-ctrl-m 
\\='append)
 
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-interbase "sql" "\
 Run isql by Interbase as an inferior process.
 
@@ -32625,10 +29056,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-db2 "sql" "\
 Run db2 by IBM as an inferior process.
 
@@ -32659,10 +29089,9 @@ in the SQL buffer, after you start the process.
 The default comes from `process-coding-system-alist' and
 `default-process-coding-system'.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-linter "sql" "\
 Run inl by RELEX as an inferior process.
 
@@ -32690,135 +29119,56 @@ before \\[sql-linter].  Once session has started,
 \\[sql-rename-buffer] can be called separately to rename the
 buffer.
 
-\(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-
-\(fn &optional BUFFER)" t nil)
+(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
+(fn &optional BUFFER)" t nil)
 (autoload 'sql-vertica "sql" "\
 Run vsql as an inferior process.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (register-definition-prefixes "sql" '("sql-"))
 
-;;;***
 
-;;;### (autoloads nil "sqlite" "sqlite.el" (0 0 0 0))
 ;;; Generated autoloads from sqlite.el
 
 (register-definition-prefixes "sqlite" '("with-sqlite-transaction"))
 
-;;;***
 
-;;;### (autoloads nil "sqlite-mode" "sqlite-mode.el" (0 0 0 0))
 ;;; Generated autoloads from sqlite-mode.el
 
 (autoload 'sqlite-mode-open-file "sqlite-mode" "\
 Browse the contents of an sqlite file.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (register-definition-prefixes "sqlite-mode" '("sqlite-"))
 
-;;;***
-
-;;;### (autoloads nil "srecode" "cedet/srecode.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode.el
-(push (purecopy '(srecode 1 2)) package--builtin-versions)
-
-(register-definition-prefixes "srecode" '("srecode-version"))
-
-;;;***
-
-;;;### (autoloads nil "srecode/args" "cedet/srecode/args.el" (0 0
-;;;;;;  0 0))
-;;; Generated autoloads from cedet/srecode/args.el
-
-(register-definition-prefixes "srecode/args" '("srecode-"))
-
-;;;***
-
-;;;### (autoloads nil "srecode/ctxt" "cedet/srecode/ctxt.el" (0 0
-;;;;;;  0 0))
-;;; Generated autoloads from cedet/srecode/ctxt.el
-
-(register-definition-prefixes "srecode/ctxt" '("srecode-"))
-
-;;;***
-
-;;;### (autoloads nil "srecode/dictionary" "cedet/srecode/dictionary.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/dictionary.el
-
-(register-definition-prefixes "srecode/dictionary" '("srecode-"))
-
-;;;***
 
-;;;### (autoloads nil "srecode/extract" "cedet/srecode/extract.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/extract.el
-
-(register-definition-prefixes "srecode/extract" '("srecode-extract"))
-
-;;;***
-
-;;;### (autoloads nil "srecode/fields" "cedet/srecode/fields.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/fields.el
-
-(register-definition-prefixes "srecode/fields" '("srecode-"))
-
-;;;***
-
-;;;### (autoloads nil "srecode/filters" "cedet/srecode/filters.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/filters.el
+;;; Generated autoloads from cedet/ede/srecode.el
 
-(register-definition-prefixes "srecode/filters" '("srecode-comment-prefix"))
+(register-definition-prefixes "ede/srecode" '("ede-srecode-"))
 
-;;;***
 
-;;;### (autoloads nil "srecode/find" "cedet/srecode/find.el" (0 0
-;;;;;;  0 0))
-;;; Generated autoloads from cedet/srecode/find.el
+;;; Generated autoloads from cedet/srecode.el
 
-(register-definition-prefixes "srecode/find" '("srecode-"))
+(push (purecopy '(srecode 1 2)) package--builtin-versions)
+(register-definition-prefixes "srecode" '("srecode-version"))
 
-;;;***
 
-;;;### (autoloads nil "srecode/semantic" "cedet/srecode/semantic.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/semantic.el
+;;; Generated autoloads from cedet/srecode/srt.el
 
-(register-definition-prefixes "srecode/semantic" '("srecode-semantic-"))
+(register-definition-prefixes "srecode/srt" '("srecode-read-"))
 
-;;;***
 
-;;;### (autoloads nil "srecode/srt-mode" "cedet/srecode/srt-mode.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/srecode/srt-mode.el
 
 (autoload 'srecode-template-mode "srecode/srt-mode" "\
 Major-mode for writing SRecode macros.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (defalias 'srt-mode #'srecode-template-mode)
-
 (register-definition-prefixes "srecode/srt-mode" '("semantic-" "srecode-"))
 
-;;;***
-
-;;;### (autoloads nil "srecode/table" "cedet/srecode/table.el" (0
-;;;;;;  0 0 0))
-;;; Generated autoloads from cedet/srecode/table.el
-
-(register-definition-prefixes "srecode/table" '("object-sort-list" "srecode-"))
-
-;;;***
 
-;;;### (autoloads nil "string-edit" "textmodes/string-edit.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from textmodes/string-edit.el
 
 (autoload 'string-edit "string-edit" "\
@@ -32833,8 +29183,7 @@ PROMPT will be inserted at the start of the buffer, but 
won't be
 included in the resulting string.  If PROMPT is nil, no help text
 will be inserted.
 
-\(fn PROMPT STRING SUCCESS-CALLBACK &key ABORT-CALLBACK)" nil nil)
-
+(fn PROMPT STRING SUCCESS-CALLBACK &key ABORT-CALLBACK)" nil nil)
 (autoload 'read-string-from-buffer "string-edit" "\
 Switch to a new buffer to edit STRING in a recursive edit.
 The user finishes editing with \\<string-edit-mode-map>\\[string-edit-done], 
or aborts with \\<string-edit-mode-map>\\[string-edit-abort]).
@@ -32843,13 +29192,10 @@ PROMPT will be inserted at the start of the buffer, 
but won't be
 included in the resulting string.  If nil, no prompt will be
 inserted in the buffer.
 
-\(fn PROMPT STRING)" nil nil)
-
+(fn PROMPT STRING)" nil nil)
 (register-definition-prefixes "string-edit" '("string-edit-"))
 
-;;;***
 
-;;;### (autoloads nil "strokes" "strokes.el" (0 0 0 0))
 ;;; Generated autoloads from strokes.el
 
 (autoload 'strokes-global-set-stroke "strokes" "\
@@ -32861,8 +29207,7 @@ documentation for the `strokes-define-stroke' function.
 
 See also `strokes-global-set-stroke-string'.
 
-\(fn STROKE COMMAND)" t nil)
-
+(fn STROKE COMMAND)" t nil)
 (autoload 'strokes-read-stroke "strokes" "\
 Read a simple stroke (interactively) and return the stroke.
 Optional PROMPT in minibuffer displays before and during stroke reading.
@@ -32871,8 +29216,7 @@ entered in the strokes buffer if the variable
 `strokes-use-strokes-buffer' is non-nil.
 Optional EVENT is acceptable as the starting event of the stroke.
 
-\(fn &optional PROMPT EVENT)" nil nil)
-
+(fn &optional PROMPT EVENT)" nil nil)
 (autoload 'strokes-read-complex-stroke "strokes" "\
 Read a complex stroke (interactively) and return the stroke.
 Optional PROMPT in minibuffer displays before and during stroke reading.
@@ -32881,39 +29225,32 @@ is implemented by allowing the user to paint with 
button 1 or button 2 and
 then complete the stroke with button 3.
 Optional EVENT is acceptable as the starting event of the stroke.
 
-\(fn &optional PROMPT EVENT)" nil nil)
-
+(fn &optional PROMPT EVENT)" nil nil)
 (autoload 'strokes-do-stroke "strokes" "\
 Read a simple stroke from the user and then execute its command.
 This must be bound to a mouse event.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (autoload 'strokes-do-complex-stroke "strokes" "\
 Read a complex stroke from the user and then execute its command.
 This must be bound to a mouse event.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (autoload 'strokes-describe-stroke "strokes" "\
 Displays the command which STROKE maps to, reading STROKE interactively.
 
-\(fn STROKE)" t nil)
-
+(fn STROKE)" t nil)
 (autoload 'strokes-help "strokes" "\
 Get instruction on using the Strokes package." t nil)
-
 (autoload 'strokes-load-user-strokes "strokes" "\
 Load user-defined strokes from file named by `strokes-file'." t nil)
-
 (autoload 'strokes-list-strokes "strokes" "\
 Pop up a buffer containing an alphabetical listing of strokes in STROKES-MAP.
 With CHRONOLOGICAL prefix arg (\\[universal-argument]) list strokes 
chronologically
 by command name.
 If STROKES-MAP is not given, `strokes-global-map' will be used instead.
 
-\(fn &optional CHRONOLOGICAL STROKES-MAP)" t nil)
-
+(fn &optional CHRONOLOGICAL STROKES-MAP)" t nil)
 (defvar strokes-mode nil "\
 Non-nil if Strokes mode is enabled.
 See the `strokes-mode' command
@@ -32921,9 +29258,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `strokes-mode'.")
-
 (custom-autoload 'strokes-mode "strokes" nil)
-
 (autoload 'strokes-mode "strokes" "\
 Toggle Strokes mode, a global minor mode.
 
@@ -32954,67 +29289,54 @@ evaluate `(default-value \\='strokes-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'strokes-decode-buffer "strokes" "\
 Decode stroke strings in BUFFER and display their corresponding glyphs.
 Optional BUFFER defaults to the current buffer.
 Optional FORCE non-nil will ignore the buffer's read-only status.
 
-\(fn &optional BUFFER FORCE)" t nil)
-
+(fn &optional BUFFER FORCE)" t nil)
 (autoload 'strokes-compose-complex-stroke "strokes" "\
 Read a complex stroke and insert its glyph into the current buffer." t nil)
-
 (register-definition-prefixes "strokes" '("strokes-"))
 
-;;;***
 
-;;;### (autoloads nil "studly" "play/studly.el" (0 0 0 0))
 ;;; Generated autoloads from play/studly.el
 
 (autoload 'studlify-region "studly" "\
 Studlify-case the region.
 
-\(fn BEGIN END)" t nil)
-
+(fn BEGIN END)" t nil)
 (autoload 'studlify-word "studly" "\
 Studlify-case the current word, or COUNT words if given an argument.
 
-\(fn COUNT)" t nil)
-
+(fn COUNT)" t nil)
 (autoload 'studlify-buffer "studly" "\
 Studlify-case the current buffer." t nil)
 
-;;;***
 
-;;;### (autoloads nil "subr-x" "emacs-lisp/subr-x.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/subr-x.el
 
 (autoload 'string-truncate-left "subr-x" "\
 Truncate STRING to LENGTH, replacing initial surplus with \"...\".
 
-\(fn STRING LENGTH)" nil nil)
-
+(fn STRING LENGTH)" nil nil)
 (autoload 'string-clean-whitespace "subr-x" "\
 Clean up whitespace in STRING.
 All sequences of whitespaces in STRING are collapsed into a
 single space character, and leading/trailing whitespace is
 removed.
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (autoload 'string-pixel-width "subr-x" "\
 Return the width of STRING in pixels.
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (autoload 'string-glyph-split "subr-x" "\
 Split STRING into a list of strings representing separate glyphs.
 This takes into account combining characters and grapheme clusters.
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (autoload 'add-display-text-property "subr-x" "\
 Add display property PROP with VALUE to the text from START to END.
 If any text in the region has a non-nil `display' property, those
@@ -33023,22 +29345,18 @@ properties are retained.
 If OBJECT is non-nil, it should be a string or a buffer.  If nil,
 this defaults to the current buffer.
 
-\(fn START END PROP VALUE &optional OBJECT)" nil nil)
-
+(fn START END PROP VALUE &optional OBJECT)" nil nil)
 (autoload 'read-process-name "subr-x" "\
 Query the user for a process and return the process object.
 
-\(fn PROMPT)" nil nil)
-
+(fn PROMPT)" nil nil)
 (register-definition-prefixes "subr-x" '("hash-table-" 
"internal--thread-argument" "named-let" "replace-region-contents" "string-" 
"thread-" "with-"))
 
-;;;***
 
-;;;### (autoloads nil "subword" "progmodes/subword.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/subword.el
 
-(define-obsolete-function-alias 'capitalized-words-mode 'subword-mode "25.1")
-
+(define-obsolete-function-alias 'capitalized-words-mode 'subword-mode "\
+25.1")
 (autoload 'subword-mode "subword" "\
 Toggle subword movement and editing (Subword mode).
 
@@ -33074,10 +29392,8 @@ evaluate `subword-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (put 'global-subword-mode 'globalized-minor-mode t)
-
 (defvar global-subword-mode nil "\
 Non-nil if Global Subword mode is enabled.
 See the `global-subword-mode' command
@@ -33085,9 +29401,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-subword-mode'.")
-
 (custom-autoload 'global-subword-mode "subword" nil)
-
 (autoload 'global-subword-mode "subword" "\
 Toggle Subword mode in all buffers.
 With prefix ARG, enable Global Subword mode if ARG is positive;
@@ -33098,12 +29412,11 @@ Enable the mode if ARG is nil, omitted, or is a 
positive number.
 Disable the mode if ARG is a negative number.
 
 Subword mode is enabled in all buffers where `(lambda nil
-\(subword-mode 1))' would do it.
+(subword-mode 1))' would do it.
 
 See `subword-mode' for more information on Subword mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'superword-mode "subword" "\
 Toggle superword movement and editing (Superword mode).
 
@@ -33128,10 +29441,8 @@ evaluate `superword-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (put 'global-superword-mode 'globalized-minor-mode t)
-
 (defvar global-superword-mode nil "\
 Non-nil if Global Superword mode is enabled.
 See the `global-superword-mode' command
@@ -33139,9 +29450,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-superword-mode'.")
-
 (custom-autoload 'global-superword-mode "subword" nil)
-
 (autoload 'global-superword-mode "subword" "\
 Toggle Superword mode in all buffers.
 With prefix ARG, enable Global Superword mode if ARG is positive;
@@ -33152,17 +29461,14 @@ Enable the mode if ARG is nil, omitted, or is a 
positive number.
 Disable the mode if ARG is a negative number.
 
 Superword mode is enabled in all buffers where `(lambda nil
-\(superword-mode 1))' would do it.
+(superword-mode 1))' would do it.
 
 See `superword-mode' for more information on Superword mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "subword" '("subword-" "superword-mode-map"))
 
-;;;***
 
-;;;### (autoloads nil "supercite" "mail/supercite.el" (0 0 0 0))
 ;;; Generated autoloads from mail/supercite.el
 
 (autoload 'sc-cite-original "supercite" "\
@@ -33189,20 +29495,20 @@ original message but it does require a few things:
 The region need not be active (and typically isn't when this
 function is called).  Also, the hook `sc-pre-hook' is run before,
 and `sc-post-hook' is run after the guts of this function." nil nil)
-
 (register-definition-prefixes "supercite" '("sc-"))
 
-;;;***
 
-;;;### (autoloads nil "svg" "svg.el" (0 0 0 0))
 ;;; Generated autoloads from svg.el
-(push (purecopy '(svg 1 1)) package--builtin-versions)
 
+(push (purecopy '(svg 1 1)) package--builtin-versions)
 (register-definition-prefixes "svg" '("svg-"))
 
-;;;***
 
-;;;### (autoloads nil "t-mouse" "t-mouse.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/symref.el
+
+(register-definition-prefixes "semantic/symref" '("semantic-symref-"))
+
+
 ;;; Generated autoloads from t-mouse.el
 
 (defvar gpm-mouse-mode t "\
@@ -33212,9 +29518,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `gpm-mouse-mode'.")
-
 (custom-autoload 'gpm-mouse-mode "t-mouse" nil)
-
 (autoload 'gpm-mouse-mode "t-mouse" "\
 Toggle mouse support in GNU/Linux consoles (GPM Mouse mode).
 
@@ -33240,13 +29544,10 @@ evaluate `(default-value \\='gpm-mouse-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "t-mouse" '("gpm-mouse-"))
 
-;;;***
 
-;;;### (autoloads nil "tab-line" "tab-line.el" (0 0 0 0))
 ;;; Generated autoloads from tab-line.el
 
 (autoload 'tab-line-mode "tab-line" "\
@@ -33266,12 +29567,9 @@ evaluate `tab-line-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar-local tab-line-exclude nil)
-
 (put 'global-tab-line-mode 'globalized-minor-mode t)
-
 (defvar global-tab-line-mode nil "\
 Non-nil if Global Tab-Line mode is enabled.
 See the `global-tab-line-mode' command
@@ -33279,9 +29577,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-tab-line-mode'.")
-
 (custom-autoload 'global-tab-line-mode "tab-line" nil)
-
 (autoload 'global-tab-line-mode "tab-line" "\
 Toggle Tab-Line mode in all buffers.
 With prefix ARG, enable Global Tab-Line mode if ARG is positive;
@@ -33296,13 +29592,10 @@ would do it.
 
 See `tab-line-mode' for more information on Tab-Line mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "tab-line" '("tab-line-"))
 
-;;;***
 
-;;;### (autoloads nil "tabify" "tabify.el" (0 0 0 0))
 ;;; Generated autoloads from tabify.el
 
 (autoload 'untabify "tabify" "\
@@ -33314,8 +29607,7 @@ Called non-interactively, the region is specified by 
arguments
 START and END, rather than by the position of point and mark.
 The variable `tab-width' controls the spacing of tab stops.
 
-\(fn START END &optional ARG)" t nil)
-
+(fn START END &optional ARG)" t nil)
 (autoload 'tabify "tabify" "\
 Convert multiple spaces in region to tabs when possible.
 A group of spaces is partially replaced by tabs
@@ -33327,13 +29619,10 @@ Called non-interactively, the region is specified by 
arguments
 START and END, rather than by the position of point and mark.
 The variable `tab-width' controls the spacing of tab stops.
 
-\(fn START END &optional ARG)" t nil)
-
+(fn START END &optional ARG)" t nil)
 (register-definition-prefixes "tabify" '("tabify-regexp"))
 
-;;;***
 
-;;;### (autoloads nil "table" "textmodes/table.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/table.el
 
 (autoload 'table-fixed-width-mode "table" "\
@@ -33362,8 +29651,7 @@ evaluate `table-fixed-width-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'table-insert "table" "\
 Insert an editable text table.
 Insert a table of specified number of COLUMNS and ROWS.  Optional
@@ -33485,8 +29773,7 @@ Inside a table cell has a special keymap.
 
 \\{table-cell-map}
 
-\(fn COLUMNS ROWS &optional CELL-WIDTH CELL-HEIGHT)" t nil)
-
+(fn COLUMNS ROWS &optional CELL-WIDTH CELL-HEIGHT)" t nil)
 (autoload 'table-insert-row "table" "\
 Insert N table row(s).
 When point is in a table the newly inserted row(s) are placed above
@@ -33494,8 +29781,7 @@ the current row.  When point is outside of the table it 
must be below
 the table within the table width range, then the newly created row(s)
 are appended at the bottom of the table.
 
-\(fn N)" t nil)
-
+(fn N)" t nil)
 (autoload 'table-insert-column "table" "\
 Insert N table column(s).
 When point is in a table the newly inserted column(s) are placed left
@@ -33503,14 +29789,12 @@ of the current column.  When point is outside of the 
table it must be
 right side of the table within the table height range, then the newly
 created column(s) are appended at the right of the table.
 
-\(fn N)" t nil)
-
+(fn N)" t nil)
 (autoload 'table-insert-row-column "table" "\
 Insert row(s) or column(s).
 See `table-insert-row' and `table-insert-column'.
 
-\(fn ROW-COLUMN N)" t nil)
-
+(fn ROW-COLUMN N)" t nil)
 (autoload 'table-recognize "table" "\
 Recognize all tables within the current buffer and activate them.
 Scans the entire buffer and recognizes valid table cells.  If the
@@ -33518,10 +29802,8 @@ optional numeric prefix argument ARG is negative the 
tables in the
 buffer become inactive, meaning the tables become plain text and loses
 all the table specific features.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'table-unrecognize "table" nil t nil)
-
 (autoload 'table-recognize-region "table" "\
 Recognize all tables within region.
 BEG and END specify the region to work on.  If the optional numeric
@@ -33529,23 +29811,19 @@ prefix argument ARG is negative the tables in the 
region become
 inactive, meaning the tables become plain text and lose all the table
 specific features.
 
-\(fn BEG END &optional ARG)" t nil)
-
+(fn BEG END &optional ARG)" t nil)
 (autoload 'table-unrecognize-region "table" "\
 
 
-\(fn BEG END)" t nil)
-
+(fn BEG END)" t nil)
 (autoload 'table-recognize-table "table" "\
 Recognize a table at point.
 If the optional numeric prefix argument ARG is negative the table
 becomes inactive, meaning the table becomes plain text and loses all
 the table specific features.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'table-unrecognize-table "table" nil t nil)
-
 (autoload 'table-recognize-cell "table" "\
 Recognize a table cell that contains current point.
 Probe the cell dimension and prepare the cell information.  The
@@ -33554,10 +29832,8 @@ must not be specified.  When the optional numeric 
prefix argument ARG
 is negative the cell becomes inactive, meaning that the cell becomes
 plain text and loses all the table specific features.
 
-\(fn &optional FORCE NO-COPY ARG)" t nil)
-
+(fn &optional FORCE NO-COPY ARG)" t nil)
 (autoload 'table-unrecognize-cell "table" nil t nil)
-
 (autoload 'table-heighten-cell "table" "\
 Heighten the current cell by N lines by expanding the cell vertically.
 Heightening is done by adding blank lines at the bottom of the current
@@ -33566,8 +29842,7 @@ heightened in order to keep the rectangular table 
structure.  The
 optional argument NO-COPY is internal use only and must not be
 specified.
 
-\(fn N &optional NO-COPY NO-UPDATE)" t nil)
-
+(fn N &optional NO-COPY NO-UPDATE)" t nil)
 (autoload 'table-shorten-cell "table" "\
 Shorten the current cell by N lines by shrinking the cell vertically.
 Shortening is done by removing blank lines from the bottom of the cell
@@ -33577,22 +29852,19 @@ is applicable to all the cells aligned horizontally 
with the current
 one because they are also shortened in order to keep the rectangular
 table structure.
 
-\(fn N)" t nil)
-
+(fn N)" t nil)
 (autoload 'table-widen-cell "table" "\
 Widen the current cell by N columns and expand the cell horizontally.
 Some other cells in the same table are widen as well to keep the
 table's rectangle structure.
 
-\(fn N &optional NO-COPY NO-UPDATE)" t nil)
-
+(fn N &optional NO-COPY NO-UPDATE)" t nil)
 (autoload 'table-narrow-cell "table" "\
 Narrow the current cell by N columns and shrink the cell horizontally.
 Some other cells in the same table are narrowed as well to keep the
 table's rectangle structure.
 
-\(fn N)" t nil)
-
+(fn N)" t nil)
 (autoload 'table-forward-cell "table" "\
 Move point forward to the beginning of the next cell.
 With argument ARG, do it ARG times;
@@ -33632,43 +29904,36 @@ You can actually try how it works in this buffer.  
Press
 |  |6 |  |  |  |6 |  | +--+--+--+--+  +--+--+--+--+  +--+-----+--+
 +--+--+--+  +--+--+--+
 
-\(fn &optional ARG NO-RECOGNIZE UNRECOGNIZE)" t nil)
-
+(fn &optional ARG NO-RECOGNIZE UNRECOGNIZE)" t nil)
 (autoload 'table-backward-cell "table" "\
 Move backward to the beginning of the previous cell.
 With argument ARG, do it ARG times;
 a negative argument ARG = -N means move forward N cells.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'table-span-cell "table" "\
 Span current cell into adjacent cell in DIRECTION.
 DIRECTION is one of symbols; right, left, above or below.
 
-\(fn DIRECTION)" t nil)
-
+(fn DIRECTION)" t nil)
 (autoload 'table-split-cell-vertically "table" "\
 Split current cell vertically.
 Creates a cell above and a cell below the current point location." t nil)
-
 (autoload 'table-split-cell-horizontally "table" "\
 Split current cell horizontally.
 Creates a cell on the left and a cell on the right of the current
 point location." t nil)
-
 (autoload 'table-split-cell "table" "\
 Split current cell in ORIENTATION.
 ORIENTATION is a symbol either horizontally or vertically.
 
-\(fn ORIENTATION)" t nil)
-
+(fn ORIENTATION)" t nil)
 (autoload 'table-justify "table" "\
 Justify contents of a cell, a row of cells or a column of cells.
 WHAT is a symbol `cell', `row' or `column'.  JUSTIFY is a symbol
 `left', `center', `right', `top', `middle', `bottom' or `none'.
 
-\(fn WHAT JUSTIFY)" t nil)
-
+(fn WHAT JUSTIFY)" t nil)
 (autoload 'table-justify-cell "table" "\
 Justify cell contents.
 JUSTIFY is a symbol `left', `center' or `right' for horizontal, or `top',
@@ -33676,22 +29941,19 @@ JUSTIFY is a symbol `left', `center' or `right' for 
horizontal, or `top',
 non-nil the justify operation is limited to the current paragraph,
 otherwise the entire cell contents is justified.
 
-\(fn JUSTIFY &optional PARAGRAPH)" t nil)
-
+(fn JUSTIFY &optional PARAGRAPH)" t nil)
 (autoload 'table-justify-row "table" "\
 Justify cells of a row.
 JUSTIFY is a symbol `left', `center' or `right' for horizontal,
 or `top', `middle', `bottom' or `none' for vertical.
 
-\(fn JUSTIFY)" t nil)
-
+(fn JUSTIFY)" t nil)
 (autoload 'table-justify-column "table" "\
 Justify cells of a column.
 JUSTIFY is a symbol `left', `center' or `right' for horizontal,
 or `top', `middle', `bottom' or `none' for vertical.
 
-\(fn JUSTIFY)" t nil)
-
+(fn JUSTIFY)" t nil)
 (autoload 'table-query-dimension "table" "\
 Return the dimension of the current cell and the current table.
 The result is a list (cw ch tw th c r cells) where cw is the cell
@@ -33704,8 +29966,7 @@ the number tends to be larger than it appears for the 
tables with
 non-uniform cell structure (heavily spanned and split).  When optional
 WHERE is provided the cell and table at that location is reported.
 
-\(fn &optional WHERE)" t nil)
-
+(fn &optional WHERE)" t nil)
 (autoload 'table-generate-source "table" "\
 Generate source of the current table in the specified language.
 LANGUAGE is a symbol that specifies the language to describe the
@@ -33733,8 +29994,7 @@ CALS (DocBook DTD):
         URL `https://www.oasis-open.org/html/a502.htm'
         URL 
`https://www.oreilly.com/catalog/docbook/chapter/book/table.html#AEN114751'
 
-\(fn LANGUAGE &optional DEST-BUFFER CAPTION)" t nil)
-
+(fn LANGUAGE &optional DEST-BUFFER CAPTION)" t nil)
 (autoload 'table-insert-sequence "table" "\
 Travel cells forward while inserting a specified sequence string in each cell.
 STR is the base string from which the sequence starts.  When STR is an
@@ -33770,24 +30030,21 @@ Example:
     (table-forward-cell 1)
     (table-insert-sequence \"64\" 0 1 2 \\='left))
 
-\(fn STR N INCREMENT INTERVAL JUSTIFY)" t nil)
-
+(fn STR N INCREMENT INTERVAL JUSTIFY)" t nil)
 (autoload 'table-delete-row "table" "\
 Delete N row(s) of cells.
 Delete N rows of cells from current row.  The current row is the row
 contains the current cell where point is located.  Each row must
 consists from cells of same height.
 
-\(fn N)" t nil)
-
+(fn N)" t nil)
 (autoload 'table-delete-column "table" "\
 Delete N column(s) of cells.
 Delete N columns of cells from current column.  The current column is
 the column contains the current cell where point is located.  Each
 column must consists from cells of same width.
 
-\(fn N)" t nil)
-
+(fn N)" t nil)
 (autoload 'table-capture "table" "\
 Convert plain text into a table by capturing the text in the region.
 Create a table with the text in region as cell contents.  BEG and END
@@ -33899,41 +30156,56 @@ By applying `table-release', which does the opposite 
process, the
 contents become once again plain text.  `table-release' works as
 companion command to `table-capture' this way.
 
-\(fn BEG END &optional COL-DELIM-REGEXP ROW-DELIM-REGEXP JUSTIFY 
MIN-CELL-WIDTH COLUMNS)" t nil)
-
+(fn BEG END &optional COL-DELIM-REGEXP ROW-DELIM-REGEXP JUSTIFY MIN-CELL-WIDTH 
COLUMNS)" t nil)
 (autoload 'table-release "table" "\
 Convert a table into plain text by removing the frame from a table.
 Remove the frame from a table and deactivate the table.  This command
 converts a table into plain text without frames.  It is a companion to
 `table-capture' which does the opposite process." t nil)
-
 (register-definition-prefixes "table" '("*table--" "table-"))
 
-;;;***
 
-;;;### (autoloads nil "tabulated-list" "emacs-lisp/tabulated-list.el"
-;;;;;;  (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/table.el
+
+(register-definition-prefixes "srecode/table" '("object-sort-list" "srecode-"))
+
+
 ;;; Generated autoloads from emacs-lisp/tabulated-list.el
+
 (push (purecopy '(tabulated-list 1 0)) package--builtin-versions)
 
-;;;***
 
-;;;### (autoloads nil "talk" "talk.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/tag.el
+
+(register-definition-prefixes "semantic/tag" '("semantic-"))
+
+
+;;; Generated autoloads from cedet/semantic/tag-file.el
+
+(register-definition-prefixes "semantic/tag-file" '("semantic-prototype-file"))
+
+
+;;; Generated autoloads from cedet/semantic/tag-ls.el
+
+(register-definition-prefixes "semantic/tag-ls" '("semantic-"))
+
+
+;;; Generated autoloads from cedet/semantic/tag-write.el
+
+(register-definition-prefixes "semantic/tag-write" '("semantic-tag-write-"))
+
+
 ;;; Generated autoloads from talk.el
 
 (autoload 'talk-connect "talk" "\
 Connect to display DISPLAY for the Emacs talk group.
 
-\(fn DISPLAY)" t nil)
-
+(fn DISPLAY)" t nil)
 (autoload 'talk "talk" "\
 Connect to the Emacs talk group from the current X display or tty frame." t 
nil)
-
 (register-definition-prefixes "talk" '("talk-"))
 
-;;;***
 
-;;;### (autoloads nil "tar-mode" "tar-mode.el" (0 0 0 0))
 ;;; Generated autoloads from tar-mode.el
 
 (autoload 'tar-mode "tar-mode" "\
@@ -33952,13 +30224,10 @@ inside of a tar archive without extracting it and 
re-archiving it.
 See also: variables `tar-update-datestamp' and `tar-anal-blocksize'.
 \\{tar-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "tar-mode" '("tar-"))
 
-;;;***
 
-;;;### (autoloads nil "tcl" "progmodes/tcl.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/tcl.el
 
 (autoload 'tcl-mode "tcl" "\
@@ -33989,34 +30258,26 @@ Turning on Tcl mode runs `tcl-mode-hook'.  Read the 
documentation for
 `tcl-mode-hook' to see what kinds of interesting hook functions
 already exist.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'inferior-tcl "tcl" "\
 Run inferior Tcl process.
 Prefix arg means enter program name interactively.
 See documentation for function `inferior-tcl-mode' for more information.
 
-\(fn CMD)" t nil)
-
+(fn CMD)" t nil)
 (autoload 'tcl-help-on-word "tcl" "\
 Get help on Tcl command.  Default is word at point.
 Prefix argument means invert sense of `tcl-use-smart-word-finder'.
 
-\(fn COMMAND &optional ARG)" t nil)
-
+(fn COMMAND &optional ARG)" t nil)
 (register-definition-prefixes "tcl" '("inferior-tcl-" "run-tcl" 
"switch-to-tcl" "tcl-"))
 
-;;;***
 
-;;;### (autoloads nil "tcover-ses" "emacs-lisp/tcover-ses.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/tcover-ses.el
 
 (register-definition-prefixes "tcover-ses" '("ses-exercise"))
 
-;;;***
 
-;;;### (autoloads nil "telnet" "net/telnet.el" (0 0 0 0))
 ;;; Generated autoloads from net/telnet.el
 
 (autoload 'telnet "telnet" "\
@@ -34030,27 +30291,26 @@ is controlled by the contents of the global variable 
`telnet-host-properties',
 falling back on the value of the global variable `telnet-program'.
 Normally input is edited in Emacs and sent a line at a time.
 
-\(fn HOST &optional PORT)" t nil)
-
+(fn HOST &optional PORT)" t nil)
 (autoload 'rsh "telnet" "\
 Open a network login connection to host named HOST (a string).
 Communication with HOST is recorded in a buffer `*rsh-HOST*'.
 Normally input is edited in Emacs and sent a line at a time.
 
-\(fn HOST)" t nil)
-
+(fn HOST)" t nil)
 (register-definition-prefixes "telnet" '("send-process-next-char" "telnet-"))
 
-;;;***
 
-;;;### (autoloads nil "tempo" "tempo.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/template.el
+
+(register-definition-prefixes "srecode/template" '("semantic-tag-components"))
+
+
 ;;; Generated autoloads from tempo.el
 
 (register-definition-prefixes "tempo" '("tempo-"))
 
-;;;***
 
-;;;### (autoloads nil "term" "term.el" (0 0 0 0))
 ;;; Generated autoloads from term.el
 
 (autoload 'make-term "term" "\
@@ -34060,8 +30320,7 @@ If there is already a running process in that buffer, 
it is not restarted.
 Optional third arg STARTFILE is the name of a file to send the contents of to
 the process.  Any more args are arguments to PROGRAM.
 
-\(fn NAME PROGRAM &optional STARTFILE &rest SWITCHES)" nil nil)
-
+(fn NAME PROGRAM &optional STARTFILE &rest SWITCHES)" nil nil)
 (autoload 'term "term" "\
 Start a terminal-emulator in a new buffer.
 The buffer is in Term mode; see `term-mode' for the
@@ -34069,15 +30328,13 @@ commands to use in that buffer.
 
 \\<term-raw-map>Type \\[switch-to-buffer] to switch to another buffer.
 
-\(fn PROGRAM)" t nil)
-
+(fn PROGRAM)" t nil)
 (autoload 'ansi-term "term" "\
 Start a terminal-emulator in a new buffer.
 This is almost the same as `term' apart from always creating a new buffer,
 and `C-x' being marked as a `term-escape-char'.
 
-\(fn PROGRAM &optional NEW-BUFFER-NAME)" t nil)
-
+(fn PROGRAM &optional NEW-BUFFER-NAME)" t nil)
 (autoload 'serial-term "term" "\
 Start a terminal-emulator for a serial port in a new buffer.
 PORT is the path or name of the serial port.  For example, this
@@ -34097,30 +30354,22 @@ use in that buffer.
 
 \\<term-raw-map>Type \\[switch-to-buffer] to switch to another buffer.
 
-\(fn PORT SPEED &optional LINE-MODE)" t nil)
-
+(fn PORT SPEED &optional LINE-MODE)" t nil)
 (register-definition-prefixes "term" '("ansi-term-color-vector" "serial-" 
"term-"))
 
-;;;***
 
-;;;### (autoloads nil "testcover" "emacs-lisp/testcover.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emacs-lisp/testcover.el
 
 (autoload 'testcover-start "testcover" "\
 Use Edebug to instrument for coverage all macros and functions in FILENAME.
 If BYTE-COMPILE is non-nil, byte compile each function after instrumenting.
 
-\(fn FILENAME &optional BYTE-COMPILE)" t nil)
-
+(fn FILENAME &optional BYTE-COMPILE)" t nil)
 (autoload 'testcover-this-defun "testcover" "\
 Start coverage on function under point." t nil)
-
 (register-definition-prefixes "testcover" '("testcover-"))
 
-;;;***
 
-;;;### (autoloads nil "tetris" "play/tetris.el" (0 0 0 0))
 ;;; Generated autoloads from play/tetris.el
 
 (autoload 'tetris "tetris" "\
@@ -34139,103 +30388,74 @@ as to form complete rows.
 \\[tetris-rotate-prev] Rotate the shape clockwise
 \\[tetris-rotate-next] Rotate the shape anticlockwise
 \\[tetris-move-bottom] Drop the shape to the bottom of the playing area" t nil)
-
 (register-definition-prefixes "tetris" '("tetris-"))
 
-;;;***
 
-;;;### (autoloads nil "tex-mode" "textmodes/tex-mode.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/tex-mode.el
 
 (defvar tex-shell-file-name nil "\
 If non-nil, the shell file name to run in the subshell used to run TeX.")
-
 (custom-autoload 'tex-shell-file-name "tex-mode" t)
-
 (defvar tex-directory (purecopy ".") "\
 Directory in which temporary files are written.
 You can make this `/tmp' if your TEXINPUTS has no relative directories in it
 and you don't try to apply \\[tex-region] or \\[tex-buffer] when there are
 `\\input' commands with relative directories.")
-
 (custom-autoload 'tex-directory "tex-mode" t)
-
 (defvar tex-first-line-header-regexp nil "\
 Regexp for matching a first line which `tex-region' should include.
 If this is non-nil, it should be a regular expression string;
 if it matches the first line of the file,
 `tex-region' always includes the first line in the TeX run.")
-
 (custom-autoload 'tex-first-line-header-regexp "tex-mode" t)
-
 (defvar tex-main-file nil "\
 The main TeX source file which includes this buffer's file.
 The command `tex-file' runs TeX on the file specified by `tex-main-file'
 if the variable is non-nil.")
-
 (custom-autoload 'tex-main-file "tex-mode" t)
-
 (defvar tex-offer-save t "\
 If non-nil, ask about saving modified buffers before \\[tex-file] is run.")
-
 (custom-autoload 'tex-offer-save "tex-mode" t)
-
 (defvar tex-run-command (purecopy "tex") "\
 Command used to run TeX subjob.
 TeX Mode sets `tex-command' to this string.
 See the documentation of that variable.")
-
 (custom-autoload 'tex-run-command "tex-mode" t)
-
 (defvar latex-run-command (purecopy "latex") "\
 Command used to run LaTeX subjob.
 LaTeX Mode sets `tex-command' to this string.
 See the documentation of that variable.")
-
 (custom-autoload 'latex-run-command "tex-mode" t)
-
 (defvar slitex-run-command (purecopy "slitex") "\
 Command used to run SliTeX subjob.
 SliTeX Mode sets `tex-command' to this string.
 See the documentation of that variable.")
-
 (custom-autoload 'slitex-run-command "tex-mode" t)
-
 (defvar tex-start-options (purecopy "") "\
 TeX options to use when starting TeX.
 These immediately precede the commands in `tex-start-commands'
 and the input file name, with no separating space and are not shell-quoted.
 If nil, TeX runs with no options.  See the documentation of `tex-command'.")
-
 (custom-autoload 'tex-start-options "tex-mode" t)
-
 (defvar tex-start-commands (purecopy "\\nonstopmode\\input") "\
 TeX commands to use when starting TeX.
 They are shell-quoted and precede the input file name, with a separating space.
 If nil, no commands are used.  See the documentation of `tex-command'.")
-
 (custom-autoload 'tex-start-commands "tex-mode" t)
-
 (defvar latex-block-names nil "\
 User defined LaTeX block names.
 Combined with `latex-standard-block-names' for minibuffer completion.")
-
 (custom-autoload 'latex-block-names "tex-mode" t)
-
 (defvar tex-bibtex-command (purecopy "bibtex") "\
 Command used by `tex-bibtex-file' to gather bibliographic data.
 If this string contains an asterisk (`*'), that is replaced by the file name;
 otherwise, the file name, preceded by blank, is added at the end.")
-
 (custom-autoload 'tex-bibtex-command "tex-mode" t)
-
 (defvar tex-dvi-print-command (purecopy "lpr -d") "\
 Command used by \\[tex-print] to print a .dvi file.
 If this string contains an asterisk (`*'), that is replaced by the file name;
 otherwise, the file name, preceded by blank, is added at the end.")
-
 (custom-autoload 'tex-dvi-print-command "tex-mode" t)
-
 (defvar tex-alt-dvi-print-command (purecopy "lpr -d") "\
 Command used by \\[tex-print] with a prefix arg to print a .dvi file.
 If this string contains an asterisk (`*'), that is replaced by the file name;
@@ -34250,9 +30470,7 @@ for example,
 
 would tell \\[tex-print] with a prefix argument to ask you which printer to
 use.")
-
 (custom-autoload 'tex-alt-dvi-print-command "tex-mode" t)
-
 (defvar tex-dvi-view-command `(cond ((eq window-system 'x) ,(purecopy "xdvi")) 
((eq window-system 'w32) ,(purecopy "yap")) (t ,(purecopy "dvi2tty * | cat 
-s"))) "\
 Command used by \\[tex-view] to display a `.dvi' file.
 If it is a string, that specifies the command directly.
@@ -34260,33 +30478,23 @@ If this string contains an asterisk (`*'), that is 
replaced by the file name;
 otherwise, the file name, preceded by a space, is added at the end.
 
 If the value is a form, it is evaluated to get the command to use.")
-
 (custom-autoload 'tex-dvi-view-command "tex-mode" t)
-
 (defvar tex-show-queue-command (purecopy "lpq") "\
 Command used by \\[tex-show-print-queue] to show the print queue.
 Should show the queue(s) that \\[tex-print] puts jobs on.")
-
 (custom-autoload 'tex-show-queue-command "tex-mode" t)
-
 (defvar tex-default-mode #'latex-mode "\
 Mode to enter for a new file that might be either TeX or LaTeX.
 This variable is used when it can't be determined whether the file
 is plain TeX or LaTeX or what because the file contains no commands.
 Normally set to either `plain-tex-mode' or `latex-mode'.")
-
 (custom-autoload 'tex-default-mode "tex-mode" t)
-
 (defvar tex-open-quote (purecopy "``") "\
 String inserted by typing \\[tex-insert-quote] to open a quotation.")
-
 (custom-autoload 'tex-open-quote "tex-mode" t)
-
 (defvar tex-close-quote (purecopy "''") "\
 String inserted by typing \\[tex-insert-quote] to close a quotation.")
-
 (custom-autoload 'tex-close-quote "tex-mode" t)
-
 (autoload 'tex-mode "tex-mode" "\
 Major mode for editing files of input for TeX, LaTeX, or SliTeX.
 This is the shared parent mode of several submodes.
@@ -34296,14 +30504,10 @@ this file is for plain TeX, LaTeX, or SliTeX and 
calls `plain-tex-mode',
 such as if there are no commands in the file, the value of `tex-default-mode'
 says which mode to use.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (defalias 'TeX-mode #'tex-mode)
-
 (defalias 'plain-TeX-mode #'plain-tex-mode)
-
 (defalias 'LaTeX-mode #'latex-mode)
-
 (autoload 'plain-tex-mode "tex-mode" "\
 Major mode for editing files of input for plain TeX.
 Makes $ and } display the characters they match.
@@ -34345,8 +30549,7 @@ Entering Plain-tex mode runs the hook `text-mode-hook', 
then the hook
 `tex-mode-hook', and finally the hook `plain-tex-mode-hook'.  When the
 special subshell is initiated, the hook `tex-shell-hook' is run.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'latex-mode "tex-mode" "\
 Major mode for editing files of input for LaTeX.
 Makes $ and } display the characters they match.
@@ -34388,8 +30591,7 @@ Entering Latex mode runs the hook `text-mode-hook', then
 `tex-mode-hook', and finally `latex-mode-hook'.  When the special
 subshell is initiated, `tex-shell-hook' is run.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'slitex-mode "tex-mode" "\
 Major mode for editing files of input for SliTeX.
 Makes $ and } display the characters they match.
@@ -34432,20 +30634,25 @@ Entering SliTeX mode runs the hook `text-mode-hook', 
then the hook
 `slitex-mode-hook'.  When the special subshell is initiated, the hook
 `tex-shell-hook' is run.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'tex-start-shell "tex-mode" nil nil nil)
-
 (autoload 'doctex-mode "tex-mode" "\
 Major mode to edit DocTeX files.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "tex-mode" '("doctex-font-lock-" "latex-" 
"plain-tex-mode-map" "tex-"))
 
-;;;***
 
-;;;### (autoloads nil "texinfmt" "textmodes/texinfmt.el" (0 0 0 0))
+;;; Generated autoloads from cedet/srecode/texi.el
+
+(register-definition-prefixes "srecode/texi" '("semantic-insert-foreign-tag" 
"srecode-texi-"))
+
+
+;;; Generated autoloads from cedet/semantic/texi.el
+
+(register-definition-prefixes "semantic/texi" '("semantic-"))
+
+
 ;;; Generated autoloads from textmodes/texinfmt.el
 
 (autoload 'texinfo-format-buffer "texinfmt" "\
@@ -34457,16 +30664,14 @@ Non-nil argument (prefix, if interactive) means don't 
make tag table
 and don't split the file if large.  You can use `Info-tagify' and
 `Info-split' to do these manually.
 
-\(fn &optional NOSPLIT)" t nil)
-
+(fn &optional NOSPLIT)" t nil)
 (autoload 'texinfo-format-region "texinfmt" "\
 Convert the current region of the Texinfo file to Info format.
 This lets you see what that part of the file will look like in Info.
 The command is bound to \\[texinfo-format-region].  The text that is
 converted to Info is stored in a temporary buffer.
 
-\(fn REGION-BEGINNING REGION-END)" t nil)
-
+(fn REGION-BEGINNING REGION-END)" t nil)
 (autoload 'texi2info "texinfmt" "\
 Convert the current buffer (written in Texinfo code) into an Info file.
 The Info file output is generated in a buffer visiting the Info file
@@ -34480,25 +30685,18 @@ Texinfo source buffer is not changed.
 Non-nil argument (prefix, if interactive) means don't split the file
 if large.  You can use `Info-split' to do this manually.
 
-\(fn &optional NOSPLIT)" t nil)
-
+(fn &optional NOSPLIT)" t nil)
 (register-definition-prefixes "texinfmt" '("batch-texinfo-format" "texinf"))
 
-;;;***
 
-;;;### (autoloads nil "texinfo" "textmodes/texinfo.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/texinfo.el
 
 (defvar texinfo-open-quote (purecopy "``") "\
 String inserted by typing \\[texinfo-insert-quote] to open a quotation.")
-
 (custom-autoload 'texinfo-open-quote "texinfo" t)
-
 (defvar texinfo-close-quote (purecopy "''") "\
 String inserted by typing \\[texinfo-insert-quote] to close a quotation.")
-
 (custom-autoload 'texinfo-close-quote "texinfo" t)
-
 (autoload 'texinfo-mode "texinfo" "\
 Major mode for editing Texinfo files.
 
@@ -34566,30 +30764,25 @@ be the first node in the file.
 Entering Texinfo mode calls the value of `text-mode-hook', and then the
 value of `texinfo-mode-hook'.
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "texinfo" '("texinfo-"))
 
-;;;***
 
-;;;### (autoloads nil "text-property-search" 
"emacs-lisp/text-property-search.el"
-;;;;;;  (0 0 0 0))
+;;; Generated autoloads from textmodes/texnfo-upd.el
+
+(register-definition-prefixes "texnfo-upd" '("texinfo-"))
+
+
 ;;; Generated autoloads from emacs-lisp/text-property-search.el
 
 (register-definition-prefixes "text-property-search" '("text-property-"))
 
-;;;***
 
-;;;### (autoloads nil "textsec" "international/textsec.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from international/textsec.el
 
 (register-definition-prefixes "textsec" '("textsec-"))
 
-;;;***
 
-;;;### (autoloads nil "textsec-check" "international/textsec-check.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from international/textsec-check.el
 
 (autoload 'textsec-suspicious-p "textsec-check" "\
@@ -34619,14 +30812,15 @@ Available values of TYPE and corresponding OBJECTs 
are:
 If the user option `textsec-check' is nil, these checks are
 disabled, and this function always returns nil.
 
-\(fn OBJECT TYPE)" nil nil)
-
+(fn OBJECT TYPE)" nil nil)
 (register-definition-prefixes "textsec-check" '("textsec-check"))
 
-;;;***
 
-;;;### (autoloads nil "thai-util" "language/thai-util.el" (0 0 0
-;;;;;;  0))
+;;; Generated autoloads from leim/quail/thai.el
+
+(register-definition-prefixes "quail/thai" '("thai-generate-quail-map"))
+
+
 ;;; Generated autoloads from language/thai-util.el
 
 (autoload 'thai-compose-region "thai-util" "\
@@ -34634,34 +30828,25 @@ Compose Thai characters in the region.
 When called from a program, expects two arguments,
 positions (integers or markers) specifying the region.
 
-\(fn BEG END)" t nil)
-
+(fn BEG END)" t nil)
 (autoload 'thai-compose-string "thai-util" "\
 Compose Thai characters in STRING and return the resulting string.
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (autoload 'thai-compose-buffer "thai-util" "\
 Compose Thai characters in the current buffer." t nil)
-
 (autoload 'thai-composition-function "thai-util" "\
 
 
-\(fn GSTRING DIRECTION)" nil nil)
-
+(fn GSTRING DIRECTION)" nil nil)
 (register-definition-prefixes "thai-util" 
'("exit-thai-language-environment-internal" 
"setup-thai-language-environment-internal" "thai-"))
 
-;;;***
 
-;;;### (autoloads nil "thai-word" "language/thai-word.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from language/thai-word.el
 
 (register-definition-prefixes "thai-word" '("thai-"))
 
-;;;***
 
-;;;### (autoloads nil "thingatpt" "thingatpt.el" (0 0 0 0))
 ;;; Generated autoloads from thingatpt.el
 
 (autoload 'forward-thing "thingatpt" "\
@@ -34671,8 +30856,7 @@ Possibilities include `symbol', `list', `sexp', 
`defun', `number',
 `filename', `url', `email', `uuid', `word', `sentence', `whitespace',
 `line', and `page'.
 
-\(fn THING &optional N)" nil nil)
-
+(fn THING &optional N)" nil nil)
 (autoload 'bounds-of-thing-at-point "thingatpt" "\
 Determine the start and end buffer locations for the THING at point.
 THING should be a symbol specifying a type of syntactic entity.
@@ -34686,8 +30870,7 @@ valid THING.
 Return a cons cell (START . END) giving the start and end
 positions of the thing found.
 
-\(fn THING)" nil nil)
-
+(fn THING)" nil nil)
 (autoload 'thing-at-point "thingatpt" "\
 Return the THING at point.
 THING should be a symbol specifying a type of syntactic entity.
@@ -34701,45 +30884,36 @@ strip text properties from the return value.
 See the file `thingatpt.el' for documentation on how to define
 a symbol as a valid THING.
 
-\(fn THING &optional NO-PROPERTIES)" nil nil)
-
+(fn THING &optional NO-PROPERTIES)" nil nil)
 (autoload 'bounds-of-thing-at-mouse "thingatpt" "\
 Determine start and end locations for THING at mouse click given by EVENT.
 Like `bounds-of-thing-at-point', but tries to use the position in EVENT
 where the mouse button is clicked to find the thing nearby.
 
-\(fn EVENT THING)" nil nil)
-
+(fn EVENT THING)" nil nil)
 (autoload 'thing-at-mouse "thingatpt" "\
 Return the THING at mouse click specified by EVENT.
 Like `thing-at-point', but tries to use the position in EVENT
 where the mouse button is clicked to find the thing nearby.
 
-\(fn EVENT THING &optional NO-PROPERTIES)" nil nil)
-
+(fn EVENT THING &optional NO-PROPERTIES)" nil nil)
 (autoload 'sexp-at-point "thingatpt" "\
 Return the sexp at point, or nil if none is found." nil nil)
-
 (autoload 'symbol-at-point "thingatpt" "\
 Return the symbol at point, or nil if none is found." nil nil)
-
 (autoload 'number-at-point "thingatpt" "\
 Return the number at point, or nil if none is found.
 Decimal numbers like \"14\" or \"-14.5\", as well as hex numbers
 like \"0xBEEF09\" or \"#xBEEF09\", are recognized." nil nil)
-
 (autoload 'list-at-point "thingatpt" "\
 Return the Lisp list at point, or nil if none is found.
 If IGNORE-COMMENT-OR-STRING is non-nil comments and strings are
 treated as white space.
 
-\(fn &optional IGNORE-COMMENT-OR-STRING)" nil nil)
-
+(fn &optional IGNORE-COMMENT-OR-STRING)" nil nil)
 (register-definition-prefixes "thingatpt" '("beginning-of-thing" 
"define-thing-chars" "end-of-thing" "filename" "form-at-point" "in-string-p" 
"sentence-at-point" "thing-at-point-" "word-at-point"))
 
-;;;***
 
-;;;### (autoloads nil "thread" "thread.el" (0 0 0 0))
 ;;; Generated autoloads from thread.el
 
 (autoload 'thread-handle-event "thread" "\
@@ -34747,132 +30921,108 @@ Handle thread events, propagated by `thread-signal'.
 An EVENT has the format
   (thread-event THREAD ERROR-SYMBOL DATA)
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (autoload 'list-threads "thread" "\
 Display a list of threads." t nil)
  (put 'list-threads 'disabled "Beware: manually canceling threads can ruin 
your Emacs session.")
-
 (register-definition-prefixes "thread" '("thread-list-"))
 
-;;;***
 
-;;;### (autoloads nil "thumbs" "thumbs.el" (0 0 0 0))
 ;;; Generated autoloads from thumbs.el
 
 (autoload 'thumbs-find-thumb "thumbs" "\
 Display the thumbnail for IMG.
 
-\(fn IMG)" t nil)
-
+(fn IMG)" t nil)
 (autoload 'thumbs-show-from-dir "thumbs" "\
 Make a preview buffer for all images in DIR.
 Optional argument REG to select file matching a regexp,
 and SAME-WINDOW to show thumbs in the same window.
 
-\(fn DIR &optional REG SAME-WINDOW)" t nil)
-
+(fn DIR &optional REG SAME-WINDOW)" t nil)
 (autoload 'thumbs-dired-show-marked "thumbs" "\
 In dired, make a thumbs buffer with marked files." t nil)
-
 (autoload 'thumbs-dired-show "thumbs" "\
 In dired, make a thumbs buffer with all files in current directory." t nil)
-
 (defalias 'thumbs 'thumbs-show-from-dir)
-
 (autoload 'thumbs-dired-setroot "thumbs" "\
 In dired, call the setroot program on the image at point." t nil)
-
 (register-definition-prefixes "thumbs" '("thumbs-"))
 
-;;;***
 
-;;;### (autoloads nil "thunk" "emacs-lisp/thunk.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/thunk.el
-(push (purecopy '(thunk 1 0)) package--builtin-versions)
 
+(push (purecopy '(thunk 1 0)) package--builtin-versions)
 (register-definition-prefixes "thunk" '("thunk-"))
 
-;;;***
 
-;;;### (autoloads nil "tibet-util" "language/tibet-util.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from language/tibet-util.el
 
 (autoload 'tibetan-char-p "tibet-util" "\
 Check if char CH is Tibetan character.
 Returns non-nil if CH is Tibetan.  Otherwise, returns nil.
 
-\(fn CH)" nil nil)
-
+(fn CH)" nil nil)
 (autoload 'tibetan-tibetan-to-transcription "tibet-util" "\
 Transcribe Tibetan string STR and return the corresponding Roman string.
 
-\(fn STR)" nil nil)
-
+(fn STR)" nil nil)
 (autoload 'tibetan-transcription-to-tibetan "tibet-util" "\
 Convert Tibetan Roman string STR to Tibetan character string.
 The returned string has no composition information.
 
-\(fn STR)" nil nil)
-
+(fn STR)" nil nil)
 (autoload 'tibetan-compose-string "tibet-util" "\
 Compose Tibetan string STR.
 
-\(fn STR)" nil nil)
-
+(fn STR)" nil nil)
 (autoload 'tibetan-compose-region "tibet-util" "\
 Compose Tibetan text the region BEG and END.
 
-\(fn BEG END)" t nil)
-
+(fn BEG END)" t nil)
 (autoload 'tibetan-decompose-region "tibet-util" "\
 Decompose Tibetan text in the region FROM and TO.
 This is different from `decompose-region' because precomposed
 Tibetan characters are decomposed into normal Tibetan character
 sequences.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'tibetan-decompose-string "tibet-util" "\
 Decompose Tibetan string STR.
 This is different from `decompose-string' because precomposed
 Tibetan characters are decomposed into normal Tibetan character
 sequences.
 
-\(fn STR)" nil nil)
-
+(fn STR)" nil nil)
 (autoload 'tibetan-decompose-buffer "tibet-util" "\
 Decomposes Tibetan characters in the buffer into their components.
 See also the documentation of the function `tibetan-decompose-region'." t nil)
-
 (autoload 'tibetan-compose-buffer "tibet-util" "\
 Composes Tibetan character components in the buffer.
 See also docstring of the function `tibetan-compose-region'." t nil)
-
 (autoload 'tibetan-post-read-conversion "tibet-util" "\
 
 
-\(fn LEN)" nil nil)
-
+(fn LEN)" nil nil)
 (autoload 'tibetan-pre-write-conversion "tibet-util" "\
 
 
-\(fn FROM TO)" nil nil)
-
+(fn FROM TO)" nil nil)
 (autoload 'tibetan-pre-write-canonicalize-for-unicode "tibet-util" "\
 
 
-\(fn FROM TO)" nil nil)
-
+(fn FROM TO)" nil nil)
 (register-definition-prefixes "tibet-util" '("tibetan-"))
 
-;;;***
 
-;;;### (autoloads nil "tildify" "textmodes/tildify.el" (0 0 0 0))
+;;; Generated autoloads from leim/quail/tibetan.el
+
+(register-definition-prefixes "quail/tibetan" '("quail-tib" "tibetan-"))
+
+
 ;;; Generated autoloads from textmodes/tildify.el
-(push (purecopy '(tildify 4 6 1)) package--builtin-versions)
 
+(push (purecopy '(tildify 4 6 1)) package--builtin-versions)
 (autoload 'tildify-region "tildify" "\
 Add hard spaces in the region between BEG and END.
 See variables `tildify-pattern', `tildify-space-string', and
@@ -34882,8 +31032,7 @@ This function performs no refilling of the changed text.
 If DONT-ASK is set, or called interactively with prefix argument, user
 won't be prompted for confirmation of each substitution.
 
-\(fn BEG END &optional DONT-ASK)" t nil)
-
+(fn BEG END &optional DONT-ASK)" t nil)
 (autoload 'tildify-buffer "tildify" "\
 Add hard spaces in the current buffer.
 See variables `tildify-pattern', `tildify-space-string', and
@@ -34893,8 +31042,7 @@ This function performs no refilling of the changed text.
 If DONT-ASK is set, or called interactively with prefix argument, user
 won't be prompted for confirmation of each substitution.
 
-\(fn &optional DONT-ASK)" t nil)
-
+(fn &optional DONT-ASK)" t nil)
 (autoload 'tildify-space "tildify" "\
 Convert space before point into a hard space if the context is right.
 
@@ -34916,7 +31064,6 @@ Otherwise, if
 remove the hard space and leave only the space character.
 
 This function is meant to be used as a `post-self-insert-hook'." t nil)
-
 (autoload 'tildify-mode "tildify" "\
 Adds electric behavior to space character.
 
@@ -34943,28 +31090,22 @@ evaluate `tildify-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "tildify" '("tildify-"))
 
-;;;***
 
-;;;### (autoloads nil "time" "time.el" (0 0 0 0))
 ;;; Generated autoloads from time.el
 
 (defvar display-time-day-and-date nil "\
 Non-nil means \\[display-time] should display day and date as well as time.")
-
 (custom-autoload 'display-time-day-and-date "time" t)
 (put 'display-time-string 'risky-local-variable t)
-
 (autoload 'display-time "time" "\
 Enable display of time, load level, and mail flag in mode lines.
 This display updates automatically every minute.
 If `display-time-day-and-date' is non-nil, the current day and date
 are displayed as well.
 This runs the normal hook `display-time-hook' after each update." t nil)
-
 (defvar display-time-mode nil "\
 Non-nil if Display-Time mode is enabled.
 See the `display-time-mode' command
@@ -34972,9 +31113,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `display-time-mode'.")
-
 (custom-autoload 'display-time-mode "time" nil)
-
 (autoload 'display-time-mode "time" "\
 Toggle display of time, load level, and mail flag in mode lines.
 
@@ -34998,15 +31137,13 @@ evaluate `(default-value \\='display-time-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
-(define-obsolete-function-alias 'display-time-world #'world-clock "28.1")
-
+(fn &optional ARG)" t nil)
+(define-obsolete-function-alias 'display-time-world #'world-clock "\
+28.1")
 (autoload 'world-clock "time" "\
 Display a world clock buffer with times in various time zones.
 The variable `world-clock-list' specifies which time zones to use.
 To turn off the world time display, go to the window and type 
`\\[quit-window]'." t nil)
-
 (autoload 'emacs-uptime "time" "\
 Return a string giving the uptime of this instance of Emacs.
 FORMAT is a string to format the result, using `format-seconds'.
@@ -35014,21 +31151,16 @@ For example, the Unix uptime command format is \"%D, 
%z%2h:%.2m\".
 If the optional argument HERE is non-nil, insert string at
 point.
 
-\(fn &optional FORMAT HERE)" t nil)
-
+(fn &optional FORMAT HERE)" t nil)
 (autoload 'emacs-init-time "time" "\
 Return a string giving the duration of the Emacs initialization.
 FORMAT is a string to format the result, using `format'.  If nil,
 the default format \"%f seconds\" is used.
 
-\(fn &optional FORMAT)" t nil)
-
+(fn &optional FORMAT)" t nil)
 (register-definition-prefixes "time" '("display-time-" 
"legacy-style-world-list" "time--display-world-list" "world-clock-" 
"zoneinfo-style-world-list"))
 
-;;;***
 
-;;;### (autoloads nil "time-date" "calendar/time-date.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from calendar/time-date.el
 
 (autoload 'date-to-time "time-date" "\
@@ -35036,61 +31168,50 @@ Parse a string DATE that represents a date-time and 
return a time value.
 DATE should be in one of the forms recognized by `parse-time-string'.
 If DATE lacks timezone information, GMT is assumed.
 
-\(fn DATE)" nil nil)
-
+(fn DATE)" nil nil)
 (defalias 'time-to-seconds 'float-time)
-
 (defalias 'seconds-to-time 'time-convert)
-
 (autoload 'days-to-time "time-date" "\
 Convert DAYS into a time value.
 
-\(fn DAYS)" nil nil)
-
+(fn DAYS)" nil nil)
 (autoload 'time-since "time-date" "\
 Return the time elapsed since TIME.
 TIME should be either a time value or a date-time string.
 
-\(fn TIME)" nil nil)
-
-(define-obsolete-function-alias 'subtract-time 'time-subtract "26.1")
-
+(fn TIME)" nil nil)
+(define-obsolete-function-alias 'subtract-time 'time-subtract "\
+26.1")
 (autoload 'date-to-day "time-date" "\
 Return the absolute date of DATE, a date-time string.
 The absolute date is the number of days elapsed since the imaginary
 Gregorian date Sunday, December 31, 1 BC.
 
-\(fn DATE)" nil nil)
-
+(fn DATE)" nil nil)
 (autoload 'days-between "time-date" "\
 Return the number of days between DATE1 and DATE2.
 DATE1 and DATE2 should be date-time strings.
 
-\(fn DATE1 DATE2)" nil nil)
-
+(fn DATE1 DATE2)" nil nil)
 (autoload 'date-leap-year-p "time-date" "\
 Return t if YEAR is a leap year.
 
-\(fn YEAR)" nil nil)
-
+(fn YEAR)" nil nil)
 (autoload 'time-to-day-in-year "time-date" "\
 Return the day number within the year corresponding to TIME.
 
-\(fn TIME)" nil nil)
-
+(fn TIME)" nil nil)
 (autoload 'time-to-days "time-date" "\
 The absolute date corresponding to TIME, a time value.
 The absolute date is the number of days elapsed since the imaginary
 Gregorian date Sunday, December 31, 1 BC.
 
-\(fn TIME)" nil nil)
-
+(fn TIME)" nil nil)
 (autoload 'safe-date-to-time "time-date" "\
 Parse a string DATE that represents a date-time and return a time value.
 If DATE is malformed, return a time value of zeros.
 
-\(fn DATE)" nil nil)
-
+(fn DATE)" nil nil)
 (autoload 'format-seconds "time-date" "\
 Use format control STRING to format the number SECONDS.
 The valid format specifiers are:
@@ -35121,34 +31242,29 @@ The \"%x\" specifier does not print anything.  When 
it is used,
 specifiers must be given in order of decreasing size.  To the
 right of \"%x\", trailing zero units are not output.
 
-\(fn STRING SECONDS)" nil nil)
-
+(fn STRING SECONDS)" nil nil)
 (autoload 'seconds-to-string "time-date" "\
 Convert the time interval in seconds to a short string.
 
-\(fn DELAY)" nil nil)
-
+(fn DELAY)" nil nil)
 (register-definition-prefixes "time-date" '("date-" "decoded-time-" 
"encode-time-value" "seconds-to-string" "time-" "with-decoded-time-value"))
 
-;;;***
 
-;;;### (autoloads nil "time-stamp" "time-stamp.el" (0 0 0 0))
 ;;; Generated autoloads from time-stamp.el
+
 (put 'time-stamp-format 'safe-local-variable 'stringp)
 (put 'time-stamp-time-zone 'safe-local-variable 'time-stamp-zone-type-p)
-
 (autoload 'time-stamp-zone-type-p "time-stamp" "\
 Return non-nil if ZONE is of the correct type for a timezone rule.
 Valid ZONE values are described in the documentation of `format-time-string'.
 
-\(fn ZONE)" nil nil)
+(fn ZONE)" nil nil)
 (put 'time-stamp-line-limit 'safe-local-variable 'integerp)
 (put 'time-stamp-start 'safe-local-variable 'stringp)
 (put 'time-stamp-end 'safe-local-variable 'stringp)
 (put 'time-stamp-inserts-lines 'safe-local-variable 'symbolp)
 (put 'time-stamp-count 'safe-local-variable 'integerp)
 (put 'time-stamp-pattern 'safe-local-variable 'stringp)
-
 (autoload 'time-stamp "time-stamp" "\
 Update any time stamp string(s) in the buffer.
 This function looks for a time stamp template and updates it with
@@ -35181,19 +31297,14 @@ You can set `time-stamp-pattern' in a file's local 
variables list
 to customize the information in the time stamp and where it is written.
 
 The time stamp is updated only if `time-stamp-active' is non-nil." t nil)
-
 (autoload 'time-stamp-toggle-active "time-stamp" "\
 Toggle `time-stamp-active', setting whether \\[time-stamp] updates a buffer.
 With ARG, turn time stamping on if and only if ARG is positive.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "time-stamp" '("time-stamp-"))
 
-;;;***
 
-;;;### (autoloads nil "timeclock" "calendar/timeclock.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from calendar/timeclock.el
 
 (defvar timeclock-mode-line-display nil "\
@@ -35203,9 +31314,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `timeclock-mode-line-display'.")
-
 (custom-autoload 'timeclock-mode-line-display "timeclock" nil)
-
 (autoload 'timeclock-mode-line-display "timeclock" "\
 Toggle display of the amount of time left today in the mode line.
 If `timeclock-use-display-time' is non-nil (the default), then
@@ -35219,13 +31328,12 @@ display (non-nil means on).
 If using a customized `timeclock-workday' value, this should be
 set before switching this mode on.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'timeclock-in "timeclock" "\
 Clock in, recording the current time moment in the timelog.
 With a numeric prefix ARG, record the fact that today has only that
 many hours in it to be worked.  If ARG is a non-numeric prefix argument
-\(non-nil, but not a number), 0 is assumed (working on a holiday or
+(non-nil, but not a number), 0 is assumed (working on a holiday or
 weekend).  *If not called interactively, ARG should be the number of
 _seconds_ worked today*.  This feature only has effect the first time
 this function is called within a day.
@@ -35235,8 +31343,7 @@ FIND-PROJECT is non-nil -- or the user calls 
`timeclock-in'
 interactively -- call the function `timeclock-get-project-function' to
 discover the name of the project.
 
-\(fn &optional ARG PROJECT FIND-PROJECT)" t nil)
-
+(fn &optional ARG PROJECT FIND-PROJECT)" t nil)
 (autoload 'timeclock-out "timeclock" "\
 Clock out, recording the current time moment in the timelog.
 If a prefix ARG is given, the user has completed the project that was
@@ -35247,16 +31354,14 @@ FIND-REASON is non-nil -- or the user calls 
`timeclock-out'
 interactively -- call the function `timeclock-get-reason-function' to
 discover the reason.
 
-\(fn &optional ARG REASON FIND-REASON)" t nil)
-
+(fn &optional ARG REASON FIND-REASON)" t nil)
 (autoload 'timeclock-status-string "timeclock" "\
 Report the overall timeclock status at the present moment.
 If SHOW-SECONDS is non-nil, display second resolution.
 If TODAY-ONLY is non-nil, the display will be relative only to time
 worked today, ignoring the time worked on previous days.
 
-\(fn &optional SHOW-SECONDS TODAY-ONLY)" t nil)
-
+(fn &optional SHOW-SECONDS TODAY-ONLY)" t nil)
 (autoload 'timeclock-change "timeclock" "\
 Change to working on a different project.
 This clocks out of the current project, then clocks in on a new one.
@@ -35264,16 +31369,13 @@ With a prefix ARG, consider the previous project as 
finished at the
 time of changeover.  PROJECT is the name of the last project you were
 working on.
 
-\(fn &optional ARG PROJECT)" t nil)
-
+(fn &optional ARG PROJECT)" t nil)
 (autoload 'timeclock-query-out "timeclock" "\
 Ask the user whether to clock out.
 This is a useful function for adding to `kill-emacs-query-functions'." nil nil)
-
 (autoload 'timeclock-reread-log "timeclock" "\
 Re-read the timeclock, to account for external changes.
 Returns the new value of `timeclock-discrepancy'." t nil)
-
 (autoload 'timeclock-workday-remaining-string "timeclock" "\
 Return a string representing the amount of time left today.
 Display second resolution if SHOW-SECONDS is non-nil.  If TODAY-ONLY
@@ -35281,15 +31383,13 @@ is non-nil, the display will be relative only to time 
worked today.
 See `timeclock-relative' for more information about the meaning of
 \"relative to today\".
 
-\(fn &optional SHOW-SECONDS TODAY-ONLY)" t nil)
-
+(fn &optional SHOW-SECONDS TODAY-ONLY)" t nil)
 (autoload 'timeclock-workday-elapsed-string "timeclock" "\
 Return a string representing the amount of time worked today.
 Display seconds resolution if SHOW-SECONDS is non-nil.  If RELATIVE is
 non-nil, the amount returned will be relative to past time worked.
 
-\(fn &optional SHOW-SECONDS)" t nil)
-
+(fn &optional SHOW-SECONDS)" t nil)
 (autoload 'timeclock-when-to-leave-string "timeclock" "\
 Return a string representing the end of today's workday.
 This string is relative to the value of `timeclock-workday'.  If
@@ -35297,35 +31397,25 @@ SHOW-SECONDS is non-nil, the value printed/returned 
will include
 seconds.  If TODAY-ONLY is non-nil, the value returned will be
 relative only to the time worked today, and not to past time.
 
-\(fn &optional SHOW-SECONDS TODAY-ONLY)" t nil)
-
+(fn &optional SHOW-SECONDS TODAY-ONLY)" t nil)
 (register-definition-prefixes "timeclock" '("timeclock-"))
 
-;;;***
 
-;;;### (autoloads nil "timer-list" "emacs-lisp/timer-list.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/timer-list.el
 
 (autoload 'list-timers "timer-list" "\
 List all timers in a buffer.
 
-\(fn &optional IGNORE-AUTO NONCONFIRM)" t nil)
+(fn &optional IGNORE-AUTO NONCONFIRM)" t nil)
  (put 'list-timers 'disabled "Beware: manually canceling timers can ruin your 
Emacs session.")
-
 (register-definition-prefixes "timer-list" '("timer-list-"))
 
-;;;***
 
-;;;### (autoloads nil "timezone" "timezone.el" (0 0 0 0))
 ;;; Generated autoloads from timezone.el
 
 (register-definition-prefixes "timezone" '("timezone-"))
 
-;;;***
 
-;;;### (autoloads nil "titdic-cnv" "international/titdic-cnv.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from international/titdic-cnv.el
 
 (autoload 'titdic-convert "titdic-cnv" "\
@@ -35333,8 +31423,7 @@ Convert a TIT dictionary of FILENAME into a Quail 
package.
 Optional argument DIRNAME if specified is the directory name under which
 the generated Quail package is saved.
 
-\(fn FILENAME &optional DIRNAME)" t nil)
-
+(fn FILENAME &optional DIRNAME)" t nil)
 (autoload 'batch-titdic-convert "titdic-cnv" "\
 Run `titdic-convert' on the files remaining on the command line.
 Use this from the command line, with `-batch';
@@ -35343,16 +31432,13 @@ For example, invoke \"emacs -batch -f 
batch-titdic-convert XXX.tit\" to
  generate Quail package file \"xxx.el\" from TIT dictionary file \"XXX.tit\".
 To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\".
 
-\(fn &optional FORCE)" nil nil)
-
+(fn &optional FORCE)" nil nil)
 (register-definition-prefixes "titdic-cnv" '("batch-miscdic-convert" "ctlau-" 
"miscdic-convert" "pinyin-convert" "py-converter" "quail-" "quick-" "tit-" 
"tsang-" "ziranma-converter"))
 
-;;;***
 
-;;;### (autoloads nil "tmm" "tmm.el" (0 0 0 0))
 ;;; Generated autoloads from tmm.el
- (define-key global-map "\M-`" 'tmm-menubar)
 
+ (define-key global-map "\M-`" 'tmm-menubar)
 (autoload 'tmm-menubar "tmm" "\
 Text-mode emulation of looking and choosing from a menubar.
 See the documentation for `tmm-prompt'.
@@ -35363,16 +31449,14 @@ Note that \\[menu-bar-open] by default drops down TTY 
menus; if you want it
 to invoke `tmm-menubar' instead, customize the variable
 `tty-menu-open-use-tmm' to a non-nil value.
 
-\(fn &optional X-POSITION)" t nil)
-
+(fn &optional X-POSITION)" t nil)
 (autoload 'tmm-menubar-mouse "tmm" "\
 Text-mode emulation of looking and choosing from a menubar.
 This command is used when you click the mouse in the menubar
 on a console which has no window system but does have a mouse.
 See the documentation for `tmm-prompt'.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (autoload 'tmm-prompt "tmm" "\
 Text-mode emulation of calling the bindings in keymap.
 Creates a text-mode menu of possible choices.  You can access the elements
@@ -35388,14 +31472,10 @@ Its value should be an event that has a binding in 
MENU.
 NO-EXECUTE, if non-nil, means to return the command the user selects
 instead of executing it.
 
-\(fn MENU &optional IN-POPUP DEFAULT-ITEM NO-EXECUTE)" nil nil)
-
+(fn MENU &optional IN-POPUP DEFAULT-ITEM NO-EXECUTE)" nil nil)
 (register-definition-prefixes "tmm" '("tmm-"))
 
-;;;***
 
-;;;### (autoloads nil "todo-mode" "calendar/todo-mode.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from calendar/todo-mode.el
 
 (autoload 'todo-show "todo-mode" "\
@@ -35435,42 +31515,35 @@ by default.  The done items are hidden, but typing
 items.  With non-nil user option `todo-show-with-done' both todo
 and done items are always shown on visiting a category.
 
-\(fn &optional SOLICIT-FILE INTERACTIVE)" t nil)
-
+(fn &optional SOLICIT-FILE INTERACTIVE)" t nil)
 (autoload 'todo-mode "todo-mode" "\
 Major mode for displaying, navigating and editing todo lists.
 
 \\{todo-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'todo-archive-mode "todo-mode" "\
 Major mode for archived todo categories.
 
 \\{todo-archive-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (autoload 'todo-filtered-items-mode "todo-mode" "\
 Mode for displaying and reprioritizing top priority Todo.
 
 \\{todo-filtered-items-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "todo-mode" '("todo-"))
 
-;;;***
 
-;;;### (autoloads nil "tool-bar" "tool-bar.el" (0 0 0 0))
 ;;; Generated autoloads from tool-bar.el
 
 (autoload 'toggle-tool-bar-mode-from-frame "tool-bar" "\
 Toggle tool bar on or off, based on the status of the current frame.
 See `tool-bar-mode' for more information.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'tool-bar-add-item "tool-bar" "\
 Add an item to the tool bar.
 ICON names the image, DEF is the key definition and KEY is a symbol
@@ -35486,8 +31559,7 @@ ICON.xbm, using `find-image'.
 Use this function only to make bindings in the global value of `tool-bar-map'.
 To define items in any other map, use `tool-bar-local-item'.
 
-\(fn ICON DEF KEY &rest PROPS)" nil nil)
-
+(fn ICON DEF KEY &rest PROPS)" nil nil)
 (autoload 'tool-bar-local-item "tool-bar" "\
 Add an item to the tool bar in map MAP.
 ICON names the image, DEF is the key definition and KEY is a symbol
@@ -35500,8 +31572,7 @@ function will first try to use low-color/ICON.xpm if 
`display-color-cells'
 is less or equal to 256, then ICON.xpm, then ICON.pbm, and finally
 ICON.xbm, using `find-image'.
 
-\(fn ICON DEF KEY MAP &rest PROPS)" nil nil)
-
+(fn ICON DEF KEY MAP &rest PROPS)" nil nil)
 (autoload 'tool-bar-add-item-from-menu "tool-bar" "\
 Define tool bar binding for COMMAND in keymap MAP using the given ICON.
 This makes a binding for COMMAND in `tool-bar-map', copying its
@@ -35515,8 +31586,7 @@ MAP must contain appropriate binding for `[menu-bar]' 
which holds a keymap.
 Use this function only to make bindings in the global value of `tool-bar-map'.
 To define items in any other map, use `tool-bar-local-item-from-menu'.
 
-\(fn COMMAND ICON &optional MAP &rest PROPS)" nil nil)
-
+(fn COMMAND ICON &optional MAP &rest PROPS)" nil nil)
 (autoload 'tool-bar-local-item-from-menu "tool-bar" "\
 Define local tool bar binding for COMMAND using the given ICON.
 This makes a binding for COMMAND in IN-MAP, copying its binding from
@@ -35528,20 +31598,15 @@ properties to add to the binding.
 FROM-MAP must contain appropriate binding for `[menu-bar]' which
 holds a keymap.
 
-\(fn COMMAND ICON IN-MAP &optional FROM-MAP &rest PROPS)" nil nil)
-
-(register-definition-prefixes "tool-bar" '("tool-bar-"))
+(fn COMMAND ICON IN-MAP &optional FROM-MAP &rest PROPS)" nil nil)
+(register-definition-prefixes "tool-bar" '("toggle-tool-bar-mode-from-frame" 
"tool-bar-"))
 
-;;;***
 
-;;;### (autoloads nil "tooltip" "tooltip.el" (0 0 0 0))
 ;;; Generated autoloads from tooltip.el
 
 (register-definition-prefixes "tooltip" '("tooltip-"))
 
-;;;***
 
-;;;### (autoloads nil "tq" "emacs-lisp/tq.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/tq.el
 
 (autoload 'tq-create "tq" "\
@@ -35550,26 +31615,20 @@ PROCESS should be a subprocess capable of sending and 
receiving
 streams of bytes.  It may be a local process, or it may be connected
 to a tcp server on another machine.
 
-\(fn PROCESS)" nil nil)
-
+(fn PROCESS)" nil nil)
 (register-definition-prefixes "tq" '("tq-"))
 
-;;;***
 
-;;;### (autoloads nil "trace" "emacs-lisp/trace.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/trace.el
 
 (defvar trace-buffer "*trace-output*" "\
 Trace output will by default go to that buffer.")
-
 (custom-autoload 'trace-buffer "trace" t)
-
 (autoload 'trace-values "trace" "\
 Helper function to get internal values.
 You can call this function to add internal values in the trace buffer.
 
-\(fn &rest VALUES)" nil nil)
-
+(fn &rest VALUES)" nil nil)
 (autoload 'trace-function-foreground "trace" "\
 Trace calls to function FUNCTION.
 With a prefix argument, also prompt for the trace buffer (default
@@ -35590,220 +31649,155 @@ stuff - use `trace-function-background' instead.
 
 To stop tracing a function, use `untrace-function' or `untrace-all'.
 
-\(fn FUNCTION &optional BUFFER CONTEXT)" t nil)
-
+(fn FUNCTION &optional BUFFER CONTEXT)" t nil)
 (autoload 'trace-function-background "trace" "\
 Trace calls to function FUNCTION, quietly.
 This is like `trace-function-foreground', but without popping up
 the output buffer or changing the window configuration.
 
-\(fn FUNCTION &optional BUFFER CONTEXT)" t nil)
-
+(fn FUNCTION &optional BUFFER CONTEXT)" t nil)
 (defalias 'trace-function 'trace-function-foreground)
-
 (register-definition-prefixes "trace" '("inhibit-trace" "trace-" "untrace-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp" "net/tramp.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp.el
+
  (when (featurep 'tramp-compat)
   (load "tramp-compat" 'noerror 'nomessage))
-
 (defvar tramp-mode t "\
 Whether Tramp is enabled.
 If it is set to nil, all remote file names are used literally.")
-
 (custom-autoload 'tramp-mode "tramp" t)
-
 (defconst tramp-initial-file-name-regexp "\\`/[^/:]+:[^/:]*:" "\
 Value for `tramp-file-name-regexp' for autoload.
 It must match the initial `tramp-syntax' settings.")
-
 (defvar tramp-file-name-regexp tramp-initial-file-name-regexp "\
 Regular expression matching file names handled by Tramp.
 This regexp should match Tramp file names but no other file
 names.  When calling `tramp-register-file-name-handlers', the
 initial value is overwritten by the car of `tramp-file-name-structure'.")
-
 (defvar tramp-ignored-file-name-regexp nil "\
 Regular expression matching file names that are not under Tramp's control.")
-
 (custom-autoload 'tramp-ignored-file-name-regexp "tramp" t)
-
 (defconst tramp-autoload-file-name-regexp (concat "\\`/" (if (memq system-type 
'(cygwin windows-nt)) "\\(-\\|[^/|:]\\{2,\\}\\)" "[^/|:]+") ":") "\
 Regular expression matching file names handled by Tramp autoload.
 It must match the initial `tramp-syntax' settings.  It should not
 match file names at root of the underlying local file system,
 like \"/sys\" or \"/C:\".")
-
 (defun tramp-autoload-file-name-handler (operation &rest args) "\
 Load Tramp file name handler, and perform OPERATION." 
(tramp-unload-file-name-handlers) (when tramp-mode (let ((default-directory 
temporary-file-directory)) (when (bound-and-true-p tramp-archive-autoload) 
(load "tramp-archive" 'noerror 'nomessage)) (load "tramp" 'noerror 
'nomessage))) (apply operation args))
-
 (defun tramp-register-autoload-file-name-handlers nil "\
 Add Tramp file name handlers to `file-name-handler-alist' during autoload." 
(unless (rassq #'tramp-file-name-handler file-name-handler-alist) (add-to-list 
'file-name-handler-alist (cons tramp-autoload-file-name-regexp 
#'tramp-autoload-file-name-handler)) (put #'tramp-autoload-file-name-handler 
'safe-magic t)))
  (tramp-register-autoload-file-name-handlers)
-
 (defun tramp-unload-file-name-handlers nil "\
 Unload Tramp file name handlers from `file-name-handler-alist'." (dolist (fnh 
file-name-handler-alist) (when (and (symbolp (cdr fnh)) (string-prefix-p 
"tramp-" (symbol-name (cdr fnh)))) (setq file-name-handler-alist (delq fnh 
file-name-handler-alist)))))
-
 (defun tramp-unload-tramp nil "\
 Discard Tramp from loading remote files." (interactive) (ignore-errors 
(unload-feature 'tramp 'force)))
-
 (register-definition-prefixes "tramp" '("tramp-" "with-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-adb" "net/tramp-adb.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-adb.el
 
 (register-definition-prefixes "tramp-adb" '("tramp-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-archive" "net/tramp-archive.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from net/tramp-archive.el
 
 (defvar tramp-archive-enabled (featurep 'dbusbind) "\
 Non-nil when file archive support is available.")
-
-(defconst tramp-archive-suffixes '("7z" "apk" "ar" "cab" "CAB" "cpio" "crate" 
"deb" "depot" "exe" "iso" "jar" "lzh" "LZH" "msu" "MSU" "mtree" "odb" "odf" 
"odg" "odp" "ods" "odt" "pax" "rar" "rpm" "shar" "tar" "tbz" "tgz" "tlz" "txz" 
"tzst" "warc" "xar" "xpi" "xps" "zip" "ZIP") "\
+(defconst tramp-archive-suffixes '("7z" "apk" "ar" "cab" "CAB" "cpio" "crate" 
"deb" "depot" "epub" "exe" "iso" "jar" "lzh" "LZH" "msu" "MSU" "mtree" "odb" 
"odf" "odg" "odp" "ods" "odt" "pax" "rar" "rpm" "shar" "tar" "tbz" "tgz" "tlz" 
"txz" "tzst" "warc" "xar" "xpi" "xps" "zip" "ZIP") "\
 List of suffixes which indicate a file archive.
 It must be supported by libarchive(3).")
-
 (defconst tramp-archive-compression-suffixes '("bz2" "gz" "lrz" "lz" "lz4" 
"lzma" "lzo" "uu" "xz" "Z" "zst") "\
 List of suffixes which indicate a compressed file.
 It must be supported by libarchive(3).")
-
 (defmacro tramp-archive-autoload-file-name-regexp nil "\
 Regular expression matching archive file names." '(concat "\\`" "\\(" ".+" 
"\\." (regexp-opt tramp-archive-suffixes) "\\(?:" "\\." (regexp-opt 
tramp-archive-compression-suffixes) "\\)*" "\\)" "\\(" "/" ".*" "\\)" "\\'"))
-
 (defun tramp-archive-autoload-file-name-handler (operation &rest args) "\
 Load Tramp archive file name handler, and perform OPERATION." (defvar 
tramp-archive-autoload) (let ((default-directory temporary-file-directory) 
(tramp-archive-autoload tramp-archive-enabled)) (apply 
#'tramp-autoload-file-name-handler operation args)))
-
 (defun tramp-register-archive-file-name-handler nil "\
 Add archive file name handler to `file-name-handler-alist'." (when (and 
tramp-archive-enabled (not (rassq #'tramp-archive-file-name-handler 
file-name-handler-alist))) (add-to-list 'file-name-handler-alist (cons 
(tramp-archive-autoload-file-name-regexp) 
#'tramp-archive-autoload-file-name-handler)) (put 
#'tramp-archive-autoload-file-name-handler 'safe-magic t)))
-
 (add-hook 'after-init-hook #'tramp-register-archive-file-name-handler)
-
 (add-hook 'tramp-archive-unload-hook (lambda nil (remove-hook 'after-init-hook 
#'tramp-register-archive-file-name-handler)))
-
 (register-definition-prefixes "tramp-archive" '("tramp-" 
"with-parsed-tramp-archive-file-name"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-cache" "net/tramp-cache.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-cache.el
 
 (register-definition-prefixes "tramp-cache" '("tramp-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-cmds" "net/tramp-cmds.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-cmds.el
 
 (register-definition-prefixes "tramp-cmds" '("tramp-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-compat" "net/tramp-compat.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from net/tramp-compat.el
 
 (register-definition-prefixes "tramp-compat" '("tramp-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-crypt" "net/tramp-crypt.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-crypt.el
 
 (register-definition-prefixes "tramp-crypt" '("tramp-crypt-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-ftp" "net/tramp-ftp.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-ftp.el
 
 (register-definition-prefixes "tramp-ftp" '("tramp-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-fuse" "net/tramp-fuse.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-fuse.el
 
 (register-definition-prefixes "tramp-fuse" '("tramp-fuse-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-gvfs" "net/tramp-gvfs.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-gvfs.el
 
 (register-definition-prefixes "tramp-gvfs" '("tramp-" "with-tramp-dbus-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-integration" "net/tramp-integration.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from net/tramp-integration.el
 
 (register-definition-prefixes "tramp-integration" '("tramp-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-rclone" "net/tramp-rclone.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from net/tramp-rclone.el
 
 (register-definition-prefixes "tramp-rclone" '("tramp-rclone-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-sh" "net/tramp-sh.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-sh.el
 
 (register-definition-prefixes "tramp-sh" '("tramp-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-smb" "net/tramp-smb.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-smb.el
 
 (register-definition-prefixes "tramp-smb" '("tramp-smb-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-sshfs" "net/tramp-sshfs.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-sshfs.el
 
 (register-definition-prefixes "tramp-sshfs" '("tramp-sshfs-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-sudoedit" "net/tramp-sudoedit.el" (0
-;;;;;;  0 0 0))
 ;;; Generated autoloads from net/tramp-sudoedit.el
 
 (register-definition-prefixes "tramp-sudoedit" '("tramp-sudoedit-"))
 
-;;;***
 
-;;;### (autoloads nil "tramp-uu" "net/tramp-uu.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp-uu.el
 
 (register-definition-prefixes "tramp-uu" '("tramp-uu"))
 
-;;;***
 
-;;;### (autoloads nil "trampver" "net/trampver.el" (0 0 0 0))
 ;;; Generated autoloads from net/trampver.el
-(push (purecopy '(tramp 2 6 0 -1)) package--builtin-versions)
 
+(push (purecopy '(tramp 2 6 0 -1)) package--builtin-versions)
 (register-definition-prefixes "trampver" '("tramp-"))
 
-;;;***
 
-;;;### (autoloads nil "transient" "transient.el" (0 0 0 0))
 ;;; Generated autoloads from transient.el
 
 (autoload 'transient-insert-suffix "transient" "\
@@ -35816,10 +31810,8 @@ LOC is a command, a key vector, a key description (a 
string
   (whose last element may also be a command or key).
 See info node `(transient)Modifying Existing Transients'.
 
-\(fn PREFIX LOC SUFFIX)" nil nil)
-
+(fn PREFIX LOC SUFFIX)" nil nil)
 (function-put 'transient-insert-suffix 'lisp-indent-function 'defun)
-
 (autoload 'transient-append-suffix "transient" "\
 Insert a SUFFIX into PREFIX after LOC.
 PREFIX is a prefix command, a symbol.
@@ -35830,10 +31822,8 @@ LOC is a command, a key vector, a key description (a 
string
   (whose last element may also be a command or key).
 See info node `(transient)Modifying Existing Transients'.
 
-\(fn PREFIX LOC SUFFIX)" nil nil)
-
+(fn PREFIX LOC SUFFIX)" nil nil)
 (function-put 'transient-append-suffix 'lisp-indent-function 'defun)
-
 (autoload 'transient-replace-suffix "transient" "\
 Replace the suffix at LOC in PREFIX with SUFFIX.
 PREFIX is a prefix command, a symbol.
@@ -35844,10 +31834,8 @@ LOC is a command, a key vector, a key description (a 
string
   (whose last element may also be a command or key).
 See info node `(transient)Modifying Existing Transients'.
 
-\(fn PREFIX LOC SUFFIX)" nil nil)
-
+(fn PREFIX LOC SUFFIX)" nil nil)
 (function-put 'transient-replace-suffix 'lisp-indent-function 'defun)
-
 (autoload 'transient-remove-suffix "transient" "\
 Remove the suffix or group at LOC in PREFIX.
 PREFIX is a prefix command, a symbol.
@@ -35856,22 +31844,16 @@ LOC is a command, a key vector, a key description (a 
string
   (whose last element may also be a command or key).
 See info node `(transient)Modifying Existing Transients'.
 
-\(fn PREFIX LOC)" nil nil)
-
+(fn PREFIX LOC)" nil nil)
 (function-put 'transient-remove-suffix 'lisp-indent-function 'defun)
-
 (register-definition-prefixes "transient" '("magit--fit-window-to-buffer" 
"transient-"))
 
-;;;***
 
-;;;### (autoloads nil "tree-widget" "tree-widget.el" (0 0 0 0))
 ;;; Generated autoloads from tree-widget.el
 
 (register-definition-prefixes "tree-widget" '("tree-widget-"))
 
-;;;***
 
-;;;### (autoloads nil "tutorial" "tutorial.el" (0 0 0 0))
 ;;; Generated autoloads from tutorial.el
 
 (autoload 'help-with-tutorial "tutorial" "\
@@ -35891,31 +31873,24 @@ When the tutorial buffer is killed the content and 
the point
 position in the buffer is saved so that the tutorial may be
 resumed later.
 
-\(fn &optional ARG DONT-ASK-FOR-REVERT)" t nil)
-
+(fn &optional ARG DONT-ASK-FOR-REVERT)" t nil)
 (register-definition-prefixes "tutorial" '("get-lang-string" "lang-strings" 
"tutorial--"))
 
-;;;***
 
-;;;### (autoloads nil "tv-util" "language/tv-util.el" (0 0 0 0))
 ;;; Generated autoloads from language/tv-util.el
 
 (autoload 'tai-viet-composition-function "tv-util" "\
 
 
-\(fn FROM TO FONT-OBJECT STRING DIRECTION)" nil nil)
-
+(fn FROM TO FONT-OBJECT STRING DIRECTION)" nil nil)
 (register-definition-prefixes "tv-util" '("tai-viet-"))
 
-;;;***
 
-;;;### (autoloads nil "two-column" "textmodes/two-column.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from textmodes/two-column.el
+
  (autoload '2C-command "two-column" () t 'keymap)
  (global-set-key "\C-x6" #'2C-command)
  (global-set-key [f2] #'2C-command)
-
 (autoload '2C-two-columns "two-column" "\
 Split current window vertically for two-column editing.
 \\<global-map>When called the first time, associates a buffer with the current
@@ -35924,17 +31899,15 @@ for details.).  It runs `2C-other-buffer-hook' in the 
new buffer.
 When called again, restores the screen layout with the current buffer
 first and the associated buffer to its right.
 
-\(fn &optional BUFFER)" t nil)
-
+(fn &optional BUFFER)" t nil)
 (autoload '2C-associate-buffer "two-column" "\
 Associate another BUFFER with this one in two-column minor mode.
 Can also be used to associate a just previously visited file, by
 accepting the proposed default buffer.
 
-\(See  \\[describe-mode] .)
-
-\(fn BUFFER)" t nil)
+(See  \\[describe-mode] .)
 
+(fn BUFFER)" t nil)
 (autoload '2C-split "two-column" "\
 Split a two-column text at point, into two buffers in two-column minor mode.
 Point becomes the local value of `2C-window-width'.  Only lines that
@@ -35951,15 +31924,12 @@ First column's text    sSs  Second column's text
                        /    \\
    5 character Separator      You type  M-5 \\[2C-split]  with the point here.
 
-\(See  \\[describe-mode] .)
-
-\(fn ARG)" t nil)
+(See  \\[describe-mode] .)
 
+(fn ARG)" t nil)
 (register-definition-prefixes "two-column" '("2C-"))
 
-;;;***
 
-;;;### (autoloads nil "type-break" "type-break.el" (0 0 0 0))
 ;;; Generated autoloads from type-break.el
 
 (defvar type-break-mode nil "\
@@ -35969,9 +31939,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `type-break-mode'.")
-
 (custom-autoload 'type-break-mode "type-break" nil)
-
 (autoload 'type-break-mode "type-break" "\
 Enable or disable typing-break mode.
 
@@ -36058,8 +32026,7 @@ evaluate `(default-value \\='type-break-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'type-break "type-break" "\
 Take a typing break.
 
@@ -36068,12 +32035,10 @@ During the break, a demo selected from the functions 
listed in
 
 After the typing break is finished, the next break is scheduled
 as per the function `type-break-schedule'." t nil)
-
 (autoload 'type-break-statistics "type-break" "\
 Print statistics about typing breaks in a temporary buffer.
 This includes the last time a typing break was taken, when the next one is
 scheduled, the keystroke thresholds and the current keystroke count, etc." t 
nil)
-
 (autoload 'type-break-guesstimate-keystroke-threshold "type-break" "\
 Guess values for the minimum/maximum keystroke threshold for typing breaks.
 
@@ -36096,13 +32061,10 @@ fraction of the maximum threshold to which to set the 
minimum threshold.
 FRAC should be the inverse of the fractional value; for example, a value of
 2 would mean to use one half, a value of 4 would mean to use one quarter, etc.
 
-\(fn WPM &optional WORDLEN FRAC)" t nil)
-
+(fn WPM &optional WORDLEN FRAC)" t nil)
 (register-definition-prefixes "type-break" '("timep" "type-break-"))
 
-;;;***
 
-;;;### (autoloads nil "uce" "mail/uce.el" (0 0 0 0))
 ;;; Generated autoloads from mail/uce.el
 
 (autoload 'uce-reply-to-uce "uce" "\
@@ -36111,14 +32073,10 @@ Sets up a reply buffer addressed to: the sender, his 
postmaster,
 his abuse@ address, and the postmaster of the mail relay used.
 You might need to set `uce-mail-reader' before using this.
 
-\(fn &optional IGNORED)" t nil)
-
+(fn &optional IGNORED)" t nil)
 (register-definition-prefixes "uce" '("uce-"))
 
-;;;***
 
-;;;### (autoloads nil "ucs-normalize" "international/ucs-normalize.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from international/ucs-normalize.el
 
 (autoload 'string-glyph-compose "ucs-normalize" "\
@@ -36130,8 +32088,7 @@ For instance:
 
   (string-glyph-compose \"Å\") => \"Å\"
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (autoload 'string-glyph-decompose "ucs-normalize" "\
 Decompose STRING according to the Unicode NFD.
 This returns a new string that is the canonical decomposition of STRING,
@@ -36139,14 +32096,10 @@ a.k.a. the \"Unicode Normalization Form D\" of 
STRING.  For instance:
 
   (ucs-normalize-NFD-string \"Å\") => \"Å\"
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (register-definition-prefixes "ucs-normalize" '("ucs-normalize-" "utf-8-hfs"))
 
-;;;***
 
-;;;### (autoloads nil "underline" "textmodes/underline.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from textmodes/underline.el
 
 (autoload 'underline-region "underline" "\
@@ -36155,18 +32108,33 @@ Works by overstriking underscores.
 Called from program, takes two arguments START and END
 which specify the range to operate on.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'ununderline-region "underline" "\
 Remove all underlining (overstruck underscores) in the region.
 Called from program, takes two arguments START and END
 which specify the range to operate on.
 
-\(fn START END)" t nil)
+(fn START END)" t nil)
+
+
+;;; Generated autoloads from mail/undigest.el
+
+(register-definition-prefixes "undigest" '("rmail-"))
+
+
+;;; Generated autoloads from leim/quail/uni-input.el
+
+(autoload 'ucs-input-activate "quail/uni-input" "\
+Activate UCS input method.
+With ARG, activate UCS input method if and only if ARG is positive.
+
+While this input method is active, the variable
+`input-method-function' is bound to the function `ucs-input-method'.
+
+(fn &optional ARG)" nil nil)
+(register-definition-prefixes "quail/uni-input" '("ucs-input-"))
 
-;;;***
 
-;;;### (autoloads nil "unrmail" "mail/unrmail.el" (0 0 0 0))
 ;;; Generated autoloads from mail/unrmail.el
 
 (autoload 'batch-unrmail "unrmail" "\
@@ -36175,18 +32143,14 @@ Specify the input Rmail Babyl file names as command 
line arguments.
 For each Rmail file, the corresponding output file name
 is made by adding `.mail' at the end.
 For example, invoke `emacs -batch -f batch-unrmail RMAIL'." nil nil)
-
 (autoload 'unrmail "unrmail" "\
 Convert old-style Rmail Babyl file FILE to mbox format file TO-FILE.
 The variable `unrmail-mbox-format' controls which mbox format to use.
 
-\(fn FILE TO-FILE)" t nil)
-
+(fn FILE TO-FILE)" t nil)
 (register-definition-prefixes "unrmail" '("unrmail-mbox-format"))
 
-;;;***
 
-;;;### (autoloads nil "unsafep" "emacs-lisp/unsafep.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/unsafep.el
 
 (autoload 'unsafep "unsafep" "\
@@ -36194,13 +32158,10 @@ Return nil if evaluating FORM couldn't possibly do 
any harm.
 Otherwise result is a reason why FORM is unsafe.
 VARS is a list of symbols with local bindings like `unsafep-vars'.
 
-\(fn FORM &optional VARS)" nil nil)
-
+(fn FORM &optional VARS)" nil nil)
 (register-definition-prefixes "unsafep" '("safe-functions" "unsafep-"))
 
-;;;***
 
-;;;### (autoloads nil "url" "url/url.el" (0 0 0 0))
 ;;; Generated autoloads from url/url.el
 
 (autoload 'url-retrieve "url" "\
@@ -36216,9 +32177,9 @@ STATUS is a plist representing what happened during the 
request,
 with most recent events first, or an empty list if no events have
 occurred.  Each pair is one of:
 
-\(:redirect REDIRECTED-TO) - the request was redirected to this URL.
+(:redirect REDIRECTED-TO) - the request was redirected to this URL.
 
-\(:error (error type . DATA)) - an error occurred.  TYPE is a
+(:error (error type . DATA)) - an error occurred.  TYPE is a
 symbol that says something about where the error occurred, and
 DATA is a list (possibly nil) that describes the error further.
 
@@ -36237,8 +32198,7 @@ the server.
 If URL is a multibyte string, it will be encoded as utf-8 and
 URL-encoded before it's used.
 
-\(fn URL CALLBACK &optional CBARGS SILENT INHIBIT-COOKIES)" nil nil)
-
+(fn URL CALLBACK &optional CBARGS SILENT INHIBIT-COOKIES)" nil nil)
 (autoload 'url-retrieve-synchronously "url" "\
 Retrieve URL synchronously.
 Return the buffer containing the data, or nil if there are no data
@@ -36250,20 +32210,15 @@ If INHIBIT-COOKIES is non-nil, refuse to store 
cookies.  If
 TIMEOUT is passed, it should be a number that says (in seconds)
 how long to wait for a response before giving up.
 
-\(fn URL &optional SILENT INHIBIT-COOKIES TIMEOUT)" nil nil)
-
+(fn URL &optional SILENT INHIBIT-COOKIES TIMEOUT)" nil nil)
 (register-definition-prefixes "url" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-about" "url/url-about.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-about.el
 
 (register-definition-prefixes "url-about" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-auth" "url/url-auth.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-auth.el
 
 (autoload 'url-get-authentication "url-auth" "\
@@ -36285,8 +32240,7 @@ TYPE   is the type of authentication to be returned.  
This is either a string
 PROMPT is boolean - specifies whether to ask the user for a username/password
        if one cannot be found in the cache
 
-\(fn URL REALM TYPE PROMPT &optional ARGS)" nil nil)
-
+(fn URL REALM TYPE PROMPT &optional ARGS)" nil nil)
 (autoload 'url-register-auth-scheme "url-auth" "\
 Register an HTTP authentication method.
 
@@ -36299,63 +32253,49 @@ RATING   a rating between 1 and 10 of the strength of 
the authentication.
          This is used when asking for the best authentication for a specific
          URL.  The item with the highest rating is returned.
 
-\(fn TYPE &optional FUNCTION RATING)" nil nil)
-
+(fn TYPE &optional FUNCTION RATING)" nil nil)
 (register-definition-prefixes "url-auth" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-cache" "url/url-cache.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-cache.el
 
 (autoload 'url-store-in-cache "url-cache" "\
 Store buffer BUFF in the cache.
 
-\(fn &optional BUFF)" nil nil)
-
+(fn &optional BUFF)" nil nil)
 (autoload 'url-is-cached "url-cache" "\
 Return non-nil if the URL is cached.
 The actual return value is the last modification time of the cache file.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (autoload 'url-cache-extract "url-cache" "\
 Extract FNAM from the local disk cache.
 
-\(fn FNAM)" nil nil)
-
+(fn FNAM)" nil nil)
 (register-definition-prefixes "url-cache" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-cid" "url/url-cid.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-cid.el
 
 (autoload 'url-cid "url-cid" "\
 
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "url-cid" '("url-cid-gnus"))
 
-;;;***
 
-;;;### (autoloads nil "url-cookie" "url/url-cookie.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-cookie.el
 
 (register-definition-prefixes "url-cookie" '("url-cookie"))
 
-;;;***
 
-;;;### (autoloads nil "url-dav" "url/url-dav.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-dav.el
 
 (autoload 'url-dav-supported-p "url-dav" "\
 Return WebDAV protocol version supported by URL.
 Returns nil if WebDAV is not supported.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (autoload 'url-dav-request "url-dav" "\
 Perform WebDAV operation METHOD on URL.  Return the parsed responses.
 Automatically creates an XML request body if TAG is non-nil.
@@ -36372,72 +32312,54 @@ NAMESPACES is an assoc list of (NAMESPACE . 
EXPANSION), and these are
 added to the <TAG> element.  The DAV=DAV: namespace is automatically
 added to this list, so most requests can just pass in nil.
 
-\(fn URL METHOD TAG BODY &optional DEPTH HEADERS NAMESPACES)" nil nil)
-
+(fn URL METHOD TAG BODY &optional DEPTH HEADERS NAMESPACES)" nil nil)
 (autoload 'url-dav-vc-registered "url-dav" "\
 
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "url-dav" '("url-dav-"))
 
-;;;***
 
-;;;### (autoloads nil "url-dired" "url/url-dired.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-dired.el
 
 (register-definition-prefixes "url-dired" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-domsuf" "url/url-domsuf.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-domsuf.el
 
 (register-definition-prefixes "url-domsuf" '("url-domsuf-"))
 
-;;;***
 
-;;;### (autoloads nil "url-expand" "url/url-expand.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-expand.el
 
 (register-definition-prefixes "url-expand" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-file" "url/url-file.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-file.el
 
 (autoload 'url-file "url-file" "\
 Handle file: and ftp: URLs.
 
-\(fn URL CALLBACK CBARGS)" nil nil)
-
+(fn URL CALLBACK CBARGS)" nil nil)
 (register-definition-prefixes "url-file" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-ftp" "url/url-ftp.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-ftp.el
 
 (register-definition-prefixes "url-ftp" '("url-ftp"))
 
-;;;***
 
-;;;### (autoloads nil "url-future" "url/url-future.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-future.el
 
 (register-definition-prefixes "url-future" '("url-future-"))
 
-;;;***
 
-;;;### (autoloads nil "url-gw" "url/url-gw.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-gw.el
 
 (autoload 'url-gateway-nslookup-host "url-gw" "\
 Attempt to resolve the given HOST using nslookup if possible.
 
-\(fn HOST)" t nil)
-
+(fn HOST)" t nil)
 (autoload 'url-open-stream "url-gw" "\
 Open a stream to HOST, possibly via a gateway.
 Args per `open-network-stream'.
@@ -36447,14 +32369,10 @@ Might do a non-blocking connection; use 
`process-status' to check.
 Optional arg GATEWAY-METHOD specifies the gateway to be used,
 overriding the value of `url-gateway-method'.
 
-\(fn NAME BUFFER HOST SERVICE &optional GATEWAY-METHOD)" nil nil)
-
+(fn NAME BUFFER HOST SERVICE &optional GATEWAY-METHOD)" nil nil)
 (register-definition-prefixes "url-gw" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-handlers" "url/url-handlers.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from url/url-handlers.el
 
 (defvar url-handler-mode nil "\
@@ -36464,9 +32382,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `url-handler-mode'.")
-
 (custom-autoload 'url-handler-mode "url-handlers" nil)
-
 (autoload 'url-handler-mode "url-handlers" "\
 Handle URLs as if they were file names throughout Emacs.
 
@@ -36493,15 +32409,13 @@ evaluate `(default-value \\='url-handler-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'url-file-handler "url-handlers" "\
 Function called from the `file-name-handler-alist' routines.
 OPERATION is what needs to be done (`file-exists-p', etc.).
 ARGS are the arguments that would have been passed to OPERATION.
 
-\(fn OPERATION &rest ARGS)" nil nil)
-
+(fn OPERATION &rest ARGS)" nil nil)
 (autoload 'url-copy-file "url-handlers" "\
 Copy URL to NEWNAME.  Both arguments must be strings.
 Signal a `file-already-exists' error if file NEWNAME already
@@ -36509,72 +32423,56 @@ exists, unless a third argument OK-IF-ALREADY-EXISTS 
is supplied
 and non-nil.  An integer as third argument means request
 confirmation if NEWNAME already exists.
 
-\(fn URL NEWNAME &optional OK-IF-ALREADY-EXISTS &rest IGNORED)" nil nil)
-
+(fn URL NEWNAME &optional OK-IF-ALREADY-EXISTS &rest IGNORED)" nil nil)
 (autoload 'url-file-local-copy "url-handlers" "\
 Copy URL into a temporary file on this machine.
 Returns the name of the local copy, or nil, if FILE is directly
 accessible.
 
-\(fn URL &rest IGNORED)" nil nil)
-
+(fn URL &rest IGNORED)" nil nil)
 (autoload 'url-insert-buffer-contents "url-handlers" "\
 Insert the contents of BUFFER into current buffer.
 This is like `url-insert', but also decodes the current buffer as
 if it had been inserted from a file named URL.
 
-\(fn BUFFER URL &optional VISIT BEG END REPLACE)" nil nil)
-
+(fn BUFFER URL &optional VISIT BEG END REPLACE)" nil nil)
 (autoload 'url-insert-file-contents "url-handlers" "\
 
 
-\(fn URL &optional VISIT BEG END REPLACE)" nil nil)
-
+(fn URL &optional VISIT BEG END REPLACE)" nil nil)
 (register-definition-prefixes "url-handlers" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-history" "url/url-history.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-history.el
 
 (register-definition-prefixes "url-history" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-http" "url/url-http.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-http.el
- (autoload 'url-default-expander "url-expand")
 
+ (autoload 'url-default-expander "url-expand")
 (defalias 'url-https-expand-file-name 'url-default-expander)
  (autoload 'url-https "url-http")
  (autoload 'url-https-file-exists-p "url-http")
  (autoload 'url-https-file-readable-p "url-http")
  (autoload 'url-https-file-attributes "url-http")
-
 (register-definition-prefixes "url-http" '("url-h"))
 
-;;;***
 
-;;;### (autoloads nil "url-imap" "url/url-imap.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-imap.el
 
 (register-definition-prefixes "url-imap" '("url-imap"))
 
-;;;***
 
-;;;### (autoloads nil "url-irc" "url/url-irc.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-irc.el
 
 (autoload 'url-irc "url-irc" "\
 
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "url-irc" '("url-irc-"))
 
-;;;***
 
-;;;### (autoloads nil "url-ldap" "url/url-ldap.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-ldap.el
 
 (autoload 'url-ldap "url-ldap" "\
@@ -36583,101 +32481,76 @@ The return value is a buffer displaying the search 
results in HTML.
 URL can be a URL string, or a URL record of the type returned by
 `url-generic-parse-url'.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "url-ldap" '("url-ldap-"))
 
-;;;***
 
-;;;### (autoloads nil "url-mailto" "url/url-mailto.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-mailto.el
 
 (autoload 'url-mail "url-mailto" "\
 
 
-\(fn &rest ARGS)" t nil)
-
+(fn &rest ARGS)" t nil)
 (autoload 'url-mailto "url-mailto" "\
 Handle the mailto: URL syntax.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "url-mailto" '("url-mail-goto-field"))
 
-;;;***
 
-;;;### (autoloads nil "url-methods" "url/url-methods.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-methods.el
 
 (register-definition-prefixes "url-methods" '("url-scheme-"))
 
-;;;***
 
-;;;### (autoloads nil "url-misc" "url/url-misc.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-misc.el
 
 (autoload 'url-man "url-misc" "\
 Fetch a Unix manual page URL.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (autoload 'url-info "url-misc" "\
 Fetch a GNU Info URL.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (autoload 'url-generic-emulator-loader "url-misc" "\
 
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (defalias 'url-rlogin 'url-generic-emulator-loader)
-
 (defalias 'url-telnet 'url-generic-emulator-loader)
-
 (defalias 'url-tn3270 'url-generic-emulator-loader)
-
 (autoload 'url-data "url-misc" "\
 Fetch a data URL (RFC 2397).
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "url-misc" '("url-do-terminal-emulator"))
 
-;;;***
 
-;;;### (autoloads nil "url-news" "url/url-news.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-news.el
 
 (autoload 'url-news "url-news" "\
 
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (autoload 'url-snews "url-news" "\
 
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "url-news" '("url-news-"))
 
-;;;***
 
-;;;### (autoloads nil "url-nfs" "url/url-nfs.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-nfs.el
 
 (register-definition-prefixes "url-nfs" '("url-nfs"))
 
-;;;***
 
-;;;### (autoloads nil "url-parse" "url/url-parse.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-parse.el
 
 (autoload 'url-recreate-url "url-parse" "\
 Recreate a URL string from the parsed URLOBJ.
 
-\(fn URLOBJ)" nil nil)
-
+(fn URLOBJ)" nil nil)
 (autoload 'url-generic-parse-url "url-parse" "\
 Return an URL-struct of the parts of URL.
 The CL-style struct contains the following fields:
@@ -36717,30 +32590,22 @@ parses to
   ATTRIBUTES = nil
   FULLNESS = t
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "url-parse" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-privacy" "url/url-privacy.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-privacy.el
 
 (autoload 'url-setup-privacy-info "url-privacy" "\
 Setup variables that expose info about you and your system." t nil)
-
 (register-definition-prefixes "url-privacy" '("url-device-type"))
 
-;;;***
 
-;;;### (autoloads nil "url-proxy" "url/url-proxy.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-proxy.el
 
 (register-definition-prefixes "url-proxy" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-queue" "url/url-queue.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-queue.el
 
 (autoload 'url-queue-retrieve "url-queue" "\
@@ -36750,33 +32615,25 @@ but with limits on the degree of parallelism.  The 
variable
 `url-queue-parallel-processes' sets the number of concurrent processes.
 The variable `url-queue-timeout' sets a timeout.
 
-\(fn URL CALLBACK &optional CBARGS SILENT INHIBIT-COOKIES)" nil nil)
-
+(fn URL CALLBACK &optional CBARGS SILENT INHIBIT-COOKIES)" nil nil)
 (register-definition-prefixes "url-queue" '("url-queue"))
 
-;;;***
 
-;;;### (autoloads nil "url-tramp" "url/url-tramp.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-tramp.el
 
 (defvar url-tramp-protocols '("ftp" "ssh" "scp" "rsync" "telnet") "\
 List of URL protocols for which the work is handled by Tramp.
 They must also be covered by `url-handler-regexp'.")
-
 (custom-autoload 'url-tramp-protocols "url-tramp" t)
-
 (autoload 'url-tramp-file-handler "url-tramp" "\
 Function called from the `file-name-handler-alist' routines.
 OPERATION is what needs to be done.  ARGS are the arguments that
 would have been passed to OPERATION.
 
-\(fn OPERATION &rest ARGS)" nil nil)
-
+(fn OPERATION &rest ARGS)" nil nil)
 (register-definition-prefixes "url-tramp" '("url-tramp-convert-"))
 
-;;;***
 
-;;;### (autoloads nil "url-util" "url/url-util.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-util.el
 
 (defvar url-debug nil "\
@@ -36786,19 +32643,15 @@ Debug messages are logged to the *URL-DEBUG* buffer.
 If t, all messages will be logged.
 If a number, all messages will be logged, as well shown via `message'.
 If a list, it is a list of the types of messages to be logged.")
-
 (custom-autoload 'url-debug "url-util" t)
-
 (autoload 'url-debug "url-util" "\
 
 
-\(fn TAG &rest ARGS)" nil nil)
-
+(fn TAG &rest ARGS)" nil nil)
 (autoload 'url-parse-args "url-util" "\
 
 
-\(fn STR &optional NODOWNCASE)" nil nil)
-
+(fn STR &optional NODOWNCASE)" nil nil)
 (autoload 'url-insert-entities-in-string "url-util" "\
 Convert HTML markup-start characters to entity references in STRING.
 Also replaces the \" character, so that the result may be safely used as
@@ -36809,62 +32662,50 @@ conversion.  Replaces these characters as follows:
     >  ==>  &gt;
     \"  ==>  &quot;
 
-\(fn STRING)" nil nil)
-
+(fn STRING)" nil nil)
 (autoload 'url-normalize-url "url-util" "\
 Return a \"normalized\" version of URL.
 Strips out default port numbers, etc.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (autoload 'url-lazy-message "url-util" "\
 Just like `message', but is a no-op if called more than once a second.
 Will not do anything if `url-show-status' is nil.
 
-\(fn &rest ARGS)" nil nil)
-
+(fn &rest ARGS)" nil nil)
 (autoload 'url-get-normalized-date "url-util" "\
 Return a date string that most HTTP servers can understand.
 
-\(fn &optional SPECIFIED-TIME)" nil nil)
-
+(fn &optional SPECIFIED-TIME)" nil nil)
 (autoload 'url-eat-trailing-space "url-util" "\
 Remove spaces/tabs at the end of a string.
 
-\(fn X)" nil nil)
-
+(fn X)" nil nil)
 (autoload 'url-strip-leading-spaces "url-util" "\
 Remove spaces at the front of a string.
 
-\(fn X)" nil nil)
-
+(fn X)" nil nil)
 (autoload 'url-display-percentage "url-util" "\
 
 
-\(fn FMT PERC &rest ARGS)" nil nil)
-
+(fn FMT PERC &rest ARGS)" nil nil)
 (autoload 'url-percentage "url-util" "\
 
 
-\(fn X Y)" nil nil)
-
+(fn X Y)" nil nil)
 (defalias 'url-basepath 'url-file-directory)
-
 (autoload 'url-file-directory "url-util" "\
 Return the directory part of FILE, for a URL.
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (autoload 'url-file-nondirectory "url-util" "\
 Return the nondirectory part of FILE, for a URL.
 
-\(fn FILE)" nil nil)
-
+(fn FILE)" nil nil)
 (autoload 'url-parse-query-string "url-util" "\
 
 
-\(fn QUERY &optional DOWNCASE ALLOW-NEWLINES)" nil nil)
-
+(fn QUERY &optional DOWNCASE ALLOW-NEWLINES)" nil nil)
 (autoload 'url-build-query-string "url-util" "\
 Build a query-string.
 
@@ -36875,7 +32716,7 @@ Given a QUERY in the form:
   (key4)
   (key5 \"\"))
 
-\(This is the same format as produced by `url-parse-query-string')
+(This is the same format as produced by `url-parse-query-string')
 
 This will return a string
 \"key1=val1&key2=val2&key3=val1&key3=val2&key4&key5\".  Keys may
@@ -36887,8 +32728,7 @@ When SEMICOLONS is given, the separator will be \";\".
 When KEEP-EMPTY is given, empty values will show as \"key=\"
 instead of just \"key\" as in the example above.
 
-\(fn QUERY &optional SEMICOLONS KEEP-EMPTY)" nil nil)
-
+(fn QUERY &optional SEMICOLONS KEEP-EMPTY)" nil nil)
 (autoload 'url-unhex-string "url-util" "\
 Decode %XX sequences in a percent-encoded URL.
 If optional second argument ALLOW-NEWLINES is non-nil, then allow the
@@ -36898,8 +32738,7 @@ forbidden in URL encoding.
 The resulting string in general requires decoding using an
 appropriate coding-system; see `decode-coding-string'.
 
-\(fn STR &optional ALLOW-NEWLINES)" nil nil)
-
+(fn STR &optional ALLOW-NEWLINES)" nil nil)
 (autoload 'url-hexify-string "url-util" "\
 URI-encode STRING and return the result.
 If STRING is multibyte, it is first converted to a utf-8 byte
@@ -36913,8 +32752,7 @@ allowed characters.  Otherwise, ALLOWED-CHARS should be 
either a
 list of allowed chars, or a vector whose Nth element is non-nil
 if character N is allowed.
 
-\(fn STRING &optional ALLOWED-CHARS)" nil nil)
-
+(fn STRING &optional ALLOWED-CHARS)" nil nil)
 (autoload 'url-encode-url "url-util" "\
 Return a properly URI-encoded version of URL.
 This function also performs URI normalization, e.g. converting
@@ -36922,21 +32760,18 @@ the scheme to lowercase if it is uppercase.  Apart 
from
 normalization, if URL is already URI-encoded, this function
 should return it unchanged.
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (autoload 'url-file-extension "url-util" "\
 Return the filename extension of FNAME.
 If optional argument X is t, then return the basename
 of the file with the extension stripped off.
 
-\(fn FNAME &optional X)" nil nil)
-
+(fn FNAME &optional X)" nil nil)
 (autoload 'url-truncate-url-for-viewing "url-util" "\
 Return a shortened version of URL that is WIDTH characters wide or less.
 WIDTH defaults to the current frame width.
 
-\(fn URL &optional WIDTH)" nil nil)
-
+(fn URL &optional WIDTH)" nil nil)
 (autoload 'url-view-url "url-util" "\
 View the current document's URL.
 Optional argument NO-SHOW means just return the URL, don't show it in
@@ -36944,8 +32779,7 @@ the minibuffer.
 
 This uses `url-current-object', set locally to the buffer.
 
-\(fn &optional NO-SHOW)" t nil)
-
+(fn &optional NO-SHOW)" t nil)
 (autoload 'url-domain "url-util" "\
 Return the domain of the host of the URL.
 Return nil if this can't be determined.
@@ -36953,24 +32787,18 @@ Return nil if this can't be determined.
 For instance, this function will return \"fsf.co.uk\" if the host in URL
 is \"www.fsf.co.uk\".
 
-\(fn URL)" nil nil)
-
+(fn URL)" nil nil)
 (register-definition-prefixes "url-util" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "url-vars" "url/url-vars.el" (0 0 0 0))
 ;;; Generated autoloads from url/url-vars.el
 
 (register-definition-prefixes "url-vars" '("url-"))
 
-;;;***
 
-;;;### (autoloads nil "userlock" "userlock.el" (0 0 0 0))
 ;;; Generated autoloads from userlock.el
 
 (put 'create-lockfiles 'safe-local-variable 'booleanp)
-
 (autoload 'ask-user-about-lock "userlock" "\
 Ask user what to do when he wants to edit FILE but it is locked by OPPONENT.
 This function has a choice of three things to do:
@@ -36981,13 +32809,11 @@ This function has a choice of three things to do:
 You can redefine this function to choose among those three alternatives
 in any way you like.
 
-\(fn FILE OPPONENT)" nil nil)
-
+(fn FILE OPPONENT)" nil nil)
 (autoload 'userlock--ask-user-about-supersession-threat "userlock" "\
 
 
-\(fn FILENAME)" nil nil)
-
+(fn FILENAME)" nil nil)
 (autoload 'ask-user-about-supersession-threat "userlock" "\
 Ask a user who is about to modify an obsolete buffer what to do.
 This function has two choices: it can return, in which case the modification
@@ -36997,57 +32823,59 @@ in which case the proposed buffer modification will 
not be made.
 You can rewrite this to use any criterion you like to choose which one to do.
 The buffer in question is current when this function is called.
 
-\(fn FILENAME)" nil nil)
-
+(fn FILENAME)" nil nil)
 (autoload 'userlock--handle-unlock-error "userlock" "\
 Report an ERROR that occurred while unlocking a file.
 
-\(fn ERROR)" nil nil)
-
+(fn ERROR)" nil nil)
 (register-definition-prefixes "userlock" '("ask-user-about-" "file-" 
"userlock--check-content-unchanged"))
 
-;;;***
 
-;;;### (autoloads nil "utf-7" "international/utf-7.el" (0 0 0 0))
 ;;; Generated autoloads from international/utf-7.el
 
 (autoload 'utf-7-post-read-conversion "utf-7" "\
 
 
-\(fn LEN)" nil nil)
-
+(fn LEN)" nil nil)
 (autoload 'utf-7-imap-post-read-conversion "utf-7" "\
 
 
-\(fn LEN)" nil nil)
-
+(fn LEN)" nil nil)
 (autoload 'utf-7-pre-write-conversion "utf-7" "\
 
 
-\(fn FROM TO)" nil nil)
-
+(fn FROM TO)" nil nil)
 (autoload 'utf-7-imap-pre-write-conversion "utf-7" "\
 
 
-\(fn FROM TO)" nil nil)
-
+(fn FROM TO)" nil nil)
 (register-definition-prefixes "utf-7" '("utf-7-"))
 
-;;;***
 
-;;;### (autoloads nil "utf7" "international/utf7.el" (0 0 0 0))
 ;;; Generated autoloads from international/utf7.el
 
 (autoload 'utf7-encode "utf7" "\
 Encode UTF-7 STRING.  Use IMAP modification if FOR-IMAP is non-nil.
 
-\(fn STRING &optional FOR-IMAP)" nil nil)
-
+(fn STRING &optional FOR-IMAP)" nil nil)
 (register-definition-prefixes "utf7" '("utf7-"))
 
-;;;***
 
-;;;### (autoloads nil "uudecode" "mail/uudecode.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/util.el
+
+(register-definition-prefixes "semantic/util" '("semantic-"))
+
+
+;;; Generated autoloads from cedet/ede/util.el
+
+(register-definition-prefixes "ede/util" '("ede-make-buffer-writable"))
+
+
+;;; Generated autoloads from cedet/semantic/util-modes.el
+
+(register-definition-prefixes "semantic/util-modes" '("semantic-"))
+
+
 ;;; Generated autoloads from mail/uudecode.el
 
 (autoload 'uudecode-decode-region-external "uudecode" "\
@@ -37055,45 +32883,34 @@ Uudecode region between START and END using external 
program.
 If FILE-NAME is non-nil, save the result to FILE-NAME.  The program
 used is specified by `uudecode-decoder-program'.
 
-\(fn START END &optional FILE-NAME)" t nil)
-
+(fn START END &optional FILE-NAME)" t nil)
 (autoload 'uudecode-decode-region-internal "uudecode" "\
 Uudecode region between START and END without using an external program.
 If FILE-NAME is non-nil, save the result to FILE-NAME.
 
-\(fn START END &optional FILE-NAME)" t nil)
-
+(fn START END &optional FILE-NAME)" t nil)
 (autoload 'uudecode-decode-region "uudecode" "\
 Uudecode region between START and END.
 If FILE-NAME is non-nil, save the result to FILE-NAME.
 
-\(fn START END &optional FILE-NAME)" nil nil)
-
+(fn START END &optional FILE-NAME)" nil nil)
 (register-definition-prefixes "uudecode" '("uudecode-"))
 
-;;;***
 
-;;;### (autoloads nil "vc" "vc/vc.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc.el
 
 (defvar vc-checkout-hook nil "\
 Normal hook (list of functions) run after checking out a file.
 See `run-hooks'.")
-
 (custom-autoload 'vc-checkout-hook "vc" t)
-
 (defvar vc-checkin-hook nil "\
 Normal hook (list of functions) run after commit or file checkin.
 See also `log-edit-done-hook'.")
-
 (custom-autoload 'vc-checkin-hook "vc" t)
-
 (defvar vc-before-checkin-hook nil "\
 Normal hook (list of functions) run before a commit or a file checkin.
 See `run-hooks'.")
-
 (custom-autoload 'vc-before-checkin-hook "vc" t)
-
 (autoload 'vc-responsible-backend "vc" "\
 Return the name of a backend system that is responsible for FILE.
 
@@ -37109,8 +32926,7 @@ be reported.
 If NO-ERROR is nil, signal an error that no VC backend is
 responsible for the given file.
 
-\(fn FILE &optional NO-ERROR)" nil nil)
-
+(fn FILE &optional NO-ERROR)" nil nil)
 (autoload 'vc-next-action "vc" "\
 Do the next logical version control operation on the current fileset.
 This requires that all files in the current VC fileset be in the
@@ -37138,8 +32954,7 @@ When using this command to register a new file (or 
files), it
 will automatically deduce which VC repository to register it
 with, using the most specific one.
 
-\(fn VERBOSE)" t nil)
-
+(fn VERBOSE)" t nil)
 (autoload 'vc-register "vc" "\
 Register into a version control system.
 If VC-FILESET is given, register the files in that fileset.
@@ -37153,8 +32968,7 @@ directory are already registered under that backend) 
will be used to
 register the file.  If no backend declares itself responsible, the
 first backend that could register the file is used.
 
-\(fn &optional VC-FILESET COMMENT)" t nil)
-
+(fn &optional VC-FILESET COMMENT)" t nil)
 (autoload 'vc-ignore "vc" "\
 Ignore FILE under the VCS of DIRECTORY.
 
@@ -37169,8 +32983,7 @@ When called interactively, prompt for a FILE to ignore, 
unless a
 prefix argument is given, in which case prompt for a file FILE to
 remove from the list of ignored files.
 
-\(fn FILE &optional DIRECTORY REMOVE)" t nil)
-
+(fn FILE &optional DIRECTORY REMOVE)" t nil)
 (autoload 'vc-version-diff "vc" "\
 Report diffs between revisions REV1 and REV2 in the repository history.
 This compares two revisions of the current fileset.
@@ -37179,13 +32992,11 @@ of the last commit.
 If REV2 is nil, it defaults to the work tree, i.e. the current
 state of each file in the fileset.
 
-\(fn FILES REV1 REV2)" t nil)
-
+(fn FILES REV1 REV2)" t nil)
 (autoload 'vc-root-version-diff "vc" "\
 Report diffs between REV1 and REV2 revisions of the whole tree.
 
-\(fn FILES REV1 REV2)" t nil)
-
+(fn FILES REV1 REV2)" t nil)
 (autoload 'vc-diff "vc" "\
 Display diffs between file revisions.
 Normally this compares the currently selected fileset with their
@@ -37195,14 +33006,12 @@ designators specifying which revisions to compare.
 The optional argument NOT-URGENT non-nil means it is ok to say no to
 saving the buffer.
 
-\(fn &optional HISTORIC NOT-URGENT)" t nil)
-
+(fn &optional HISTORIC NOT-URGENT)" t nil)
 (autoload 'vc-diff-mergebase "vc" "\
 Report diffs between the merge base of REV1 and REV2 revisions.
 The merge base is a common ancestor between REV1 and REV2 revisions.
 
-\(fn FILES REV1 REV2)" t nil)
-
+(fn FILES REV1 REV2)" t nil)
 (autoload 'vc-version-ediff "vc" "\
 Show differences between REV1 and REV2 of FILES using ediff.
 This compares two revisions of the files in FILES.  Currently,
@@ -37213,8 +33022,7 @@ of the last commit.
 If REV2 is nil, it defaults to the work tree, i.e. the current
 state of each file in FILES.
 
-\(fn FILES REV1 REV2)" t nil)
-
+(fn FILES REV1 REV2)" t nil)
 (autoload 'vc-ediff "vc" "\
 Display diffs between file revisions using ediff.
 Normally this compares the currently selected fileset with their
@@ -37224,8 +33032,7 @@ designators specifying which revisions to compare.
 The optional argument NOT-URGENT non-nil means it is ok to say no to
 saving the buffer.
 
-\(fn HISTORIC &optional NOT-URGENT)" t nil)
-
+(fn HISTORIC &optional NOT-URGENT)" t nil)
 (autoload 'vc-root-diff "vc" "\
 Display diffs between VC-controlled whole tree revisions.
 Normally, this compares the tree corresponding to the current
@@ -37236,24 +33043,20 @@ designators specifying which revisions to compare.
 The optional argument NOT-URGENT non-nil means it is ok to say no to
 saving the buffer.
 
-\(fn HISTORIC &optional NOT-URGENT)" t nil)
-
+(fn HISTORIC &optional NOT-URGENT)" t nil)
 (autoload 'vc-root-dir "vc" "\
 Return the root directory for the current VC tree.
 Return nil if the root directory cannot be identified." nil nil)
-
 (autoload 'vc-revision-other-window "vc" "\
 Visit revision REV of the current file in another window.
 If the current file is named `F', the revision is named `F.~REV~'.
 If `F.~REV~' already exists, use it instead of checking it out again.
 
-\(fn REV)" t nil)
-
+(fn REV)" t nil)
 (autoload 'vc-insert-headers "vc" "\
 Insert headers into a file for use with a version control system.
 Headers desired are inserted at point, and are pulled from
 the variable `vc-BACKEND-header'." t nil)
-
 (autoload 'vc-merge "vc" "\
 Perform a version control merge operation.
 You must be visiting a version controlled file, or in a `vc-dir' buffer.
@@ -37267,17 +33070,13 @@ two revisions to merge from in the minibuffer.  If 
the first
 revision is a branch number, then merge all changes from that
 branch.  If the first revision is empty, merge the most recent
 changes from the current branch." t nil)
-
 (autoload 'vc-message-unresolved-conflicts "vc" "\
 Display a message indicating unresolved conflicts in FILENAME.
 
-\(fn FILENAME)" nil nil)
-
+(fn FILENAME)" nil nil)
 (defalias 'vc-resolve-conflicts 'smerge-ediff)
-
 (autoload 'vc-find-conflicted-file "vc" "\
 Visit the next conflicted file in the current project." t nil)
-
 (autoload 'vc-create-tag "vc" "\
 Descending recursively from DIR, make a tag called NAME.
 For each registered file, the working revision becomes part of
@@ -37285,8 +33084,7 @@ the named configuration.  If the prefix argument 
BRANCHP is
 given, the tag is made as a new branch and the files are
 checked out in that new branch.
 
-\(fn DIR NAME BRANCHP)" t nil)
-
+(fn DIR NAME BRANCHP)" t nil)
 (autoload 'vc-retrieve-tag "vc" "\
 For each file in or below DIR, retrieve their tagged version NAME.
 NAME can name a branch, in which case this command will switch to the
@@ -37299,8 +33097,7 @@ locked files at or below DIR (but if NAME is empty, 
locked files are
 allowed and simply skipped).
 This function runs the hook `vc-retrieve-tag-hook' when finished.
 
-\(fn DIR NAME)" t nil)
-
+(fn DIR NAME)" t nil)
 (autoload 'vc-print-log "vc" "\
 List the change log of the current fileset in a window.
 If WORKING-REVISION is non-nil, leave point at that revision.
@@ -37310,8 +33107,7 @@ number of revisions to show; the default is 
`vc-log-show-limit'.
 When called interactively with a prefix argument, prompt for
 WORKING-REVISION and LIMIT.
 
-\(fn &optional WORKING-REVISION LIMIT)" t nil)
-
+(fn &optional WORKING-REVISION LIMIT)" t nil)
 (autoload 'vc-print-root-log "vc" "\
 List the revision history for the current VC controlled tree in a window.
 If LIMIT is non-nil, it should be a number specifying the maximum
@@ -37322,25 +33118,21 @@ A special case is when the prefix argument is 1: in 
this case
 the command asks for the ID of a revision, and shows that revision
 with its diffs (if the underlying VCS supports that).
 
-\(fn &optional LIMIT REVISION)" t nil)
-
+(fn &optional LIMIT REVISION)" t nil)
 (autoload 'vc-print-branch-log "vc" "\
 Show the change log for BRANCH root in a window.
 
-\(fn BRANCH)" t nil)
-
+(fn BRANCH)" t nil)
 (autoload 'vc-log-incoming "vc" "\
 Show log of changes that will be received with pull from REMOTE-LOCATION.
 When called interactively with a prefix argument, prompt for REMOTE-LOCATION.
 
-\(fn &optional REMOTE-LOCATION)" t nil)
-
+(fn &optional REMOTE-LOCATION)" t nil)
 (autoload 'vc-log-outgoing "vc" "\
 Show log of changes that will be sent with a push operation to REMOTE-LOCATION.
 When called interactively with a prefix argument, prompt for REMOTE-LOCATION.
 
-\(fn &optional REMOTE-LOCATION)" t nil)
-
+(fn &optional REMOTE-LOCATION)" t nil)
 (autoload 'vc-log-search "vc" "\
 Search the log of changes for PATTERN.
 
@@ -37352,27 +33144,23 @@ Display all entries that match log messages in long 
format.
 With a prefix argument, ask for a command to run that will output
 log entries.
 
-\(fn PATTERN)" t nil)
-
+(fn PATTERN)" t nil)
 (autoload 'vc-log-mergebase "vc" "\
 Show a log of changes between the merge base of REV1 and REV2 revisions.
 The merge base is a common ancestor between REV1 and REV2 revisions.
 
-\(fn FILES REV1 REV2)" t nil)
-
+(fn FILES REV1 REV2)" t nil)
 (autoload 'vc-region-history "vc" "\
 Show the history of the region between FROM and TO.
 
 If called interactively, show the history between point and
 mark.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'vc-revert "vc" "\
 Revert working copies of the selected fileset to their repository contents.
 This asks for confirmation if the buffer contents are not identical
 to the working revision (except for keyword expansion)." t nil)
-
 (autoload 'vc-pull "vc" "\
 Update the current fileset or branch.
 You must be visiting a version controlled file, or in a `vc-dir' buffer.
@@ -37387,10 +33175,8 @@ file, this simply replaces the work file with the 
latest revision
 on its branch.  If the file contains changes, any changes in the
 tip revision are merged into the working file.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defalias 'vc-update 'vc-pull)
-
 (autoload 'vc-push "vc" "\
 Push the current branch.
 You must be visiting a version controlled file, or in a `vc-dir' buffer.
@@ -37402,8 +33188,7 @@ VCS command to run.
 On a non-distributed version control system, this signals an error.
 It also signals an error in a Bazaar bound branch.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'vc-switch-backend "vc" "\
 Make BACKEND the current version control system for FILE.
 FILE must already be registered in BACKEND.  The change is not
@@ -37412,36 +33197,31 @@ VC's perspective on FILE, it does not register or 
unregister it.
 By default, this command cycles through the registered backends.
 To get a prompt, use a prefix argument.
 
-\(fn FILE BACKEND)" t nil)
-
+(fn FILE BACKEND)" t nil)
 (make-obsolete 'vc-switch-backend 'nil '"28.1")
-
 (autoload 'vc-transfer-file "vc" "\
 Transfer FILE to another version control system NEW-BACKEND.
 If NEW-BACKEND has a higher precedence than FILE's current backend
-\(i.e.  it comes earlier in `vc-handled-backends'), then register FILE in
+(i.e.  it comes earlier in `vc-handled-backends'), then register FILE in
 NEW-BACKEND, using the revision number from the current backend as the
 base level.  If NEW-BACKEND has a lower precedence than the current
 backend, then commit all changes that were made under the current
 backend to NEW-BACKEND, and unregister FILE from the current backend.
-\(If FILE is not yet registered under NEW-BACKEND, register it.)
-
-\(fn FILE NEW-BACKEND)" nil nil)
+(If FILE is not yet registered under NEW-BACKEND, register it.)
 
+(fn FILE NEW-BACKEND)" nil nil)
 (autoload 'vc-delete-file "vc" "\
 Delete file and mark it as such in the version control system.
 If called interactively, read FILE, defaulting to the current
 buffer's file name if it's under version control.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'vc-rename-file "vc" "\
 Rename file OLD to NEW in both work area and repository.
 If called interactively, read OLD and NEW, defaulting OLD to the
 current buffer's file name if it's under version control.
 
-\(fn OLD NEW)" t nil)
-
+(fn OLD NEW)" t nil)
 (autoload 'vc-update-change-log "vc" "\
 Find change log file and add entries from recent version control logs.
 Normally, find log entries for all registered files in the default
@@ -37456,13 +33236,10 @@ log for the default directory, which may not be 
appropriate.
 From a program, any ARGS are assumed to be filenames for which
 log entries should be gathered.
 
-\(fn &rest ARGS)" t nil)
-
+(fn &rest ARGS)" t nil)
 (register-definition-prefixes "vc" '("vc-" "with-vc-properties"))
 
-;;;***
 
-;;;### (autoloads nil "vc-annotate" "vc/vc-annotate.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-annotate.el
 
 (autoload 'vc-annotate "vc-annotate" "\
@@ -37478,7 +33255,7 @@ everything that is older than that is shown in blue.
 With a prefix argument, this command asks two questions in the
 minibuffer.  First, you may enter a revision number REV; then the buffer
 displays and annotates that revision instead of the working revision
-\(type RET in the minibuffer to leave that default unchanged).  Then,
+(type RET in the minibuffer to leave that default unchanged).  Then,
 you are prompted for the time span in days which the color range
 should cover.  For example, a time span of 20 days means that changes
 over the past 20 days are shown in red to blue, according to their
@@ -37497,18 +33274,14 @@ mode-specific menu.  `vc-annotate-color-map' and
 `vc-annotate-background-mode' specifies whether the color map
 should be applied to the background or to the foreground.
 
-\(fn FILE REV &optional DISPLAY-MODE BUF MOVE-POINT-TO VC-BK)" t nil)
-
+(fn FILE REV &optional DISPLAY-MODE BUF MOVE-POINT-TO VC-BK)" t nil)
 (register-definition-prefixes "vc-annotate" '("vc-"))
 
-;;;***
 
-;;;### (autoloads nil "vc-bzr" "vc/vc-bzr.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-bzr.el
 
 (defconst vc-bzr-admin-dirname ".bzr" "\
 Name of the directory containing Bzr repository status files.")
-
 (defconst vc-bzr-admin-checkout-format-file (concat vc-bzr-admin-dirname 
"/checkout/format") "\
 Name of the format file in a .bzr directory.")
  (defun vc-bzr-registered (file)
@@ -37516,39 +33289,31 @@ Name of the format file in a .bzr directory.")
       (progn
         (load "vc-bzr" nil t)
         (vc-bzr-registered file))))
-
 (register-definition-prefixes "vc-bzr" '("vc-bzr-"))
 
-;;;***
 
-;;;### (autoloads nil "vc-cvs" "vc/vc-cvs.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-cvs.el
+
 (defun vc-cvs-registered (f)
   "Return non-nil if file F is registered with CVS."
   (when (file-readable-p (expand-file-name
-                         "CVS/Entries" (file-name-directory f)))
+                         "CVS/Entries" (file-name-directory f)))
       (load "vc-cvs" nil t)
       (vc-cvs-registered f)))
-
 (register-definition-prefixes "vc-cvs" '("vc-cvs-"))
 
-;;;***
 
-;;;### (autoloads nil "vc-dav" "vc/vc-dav.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-dav.el
 
 (register-definition-prefixes "vc-dav" '("vc-dav-"))
 
-;;;***
 
-;;;### (autoloads nil "vc-dir" "vc/vc-dir.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-dir.el
 
 (autoload 'vc-dir-root "vc-dir" "\
 Run `vc-dir' in the repository root directory without prompt.
 If the default directory of the current buffer is
 not under version control, prompt for a directory." t nil)
-
 (autoload 'vc-dir "vc-dir" "\
 Show the VC status for \"interesting\" files in and below DIR.
 This allows you to mark files and perform VC operations on them.
@@ -37566,21 +33331,16 @@ These are the commands available for use in the file 
status buffer:
 
 \\{vc-dir-mode-map}
 
-\(fn DIR &optional BACKEND)" t nil)
-
+(fn DIR &optional BACKEND)" t nil)
 (autoload 'vc-dir-bookmark-jump "vc-dir" "\
 Provide the `bookmark-jump' behavior for a `vc-dir' buffer.
 This implements the `handler' function interface for the record
 type returned by `vc-dir-bookmark-make-record'.
 
-\(fn BMK)" nil nil)
-
+(fn BMK)" nil nil)
 (register-definition-prefixes "vc-dir" '("vc-"))
 
-;;;***
 
-;;;### (autoloads nil "vc-dispatcher" "vc/vc-dispatcher.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from vc/vc-dispatcher.el
 
 (autoload 'vc-do-command "vc-dispatcher" "\
@@ -37599,115 +33359,73 @@ that is inserted into the command line before the 
filename.
 Return the return value of the slave command in the synchronous
 case, and the process object in the asynchronous case.
 
-\(fn BUFFER OKSTATUS COMMAND FILE-OR-LIST &rest FLAGS)" nil nil)
-
+(fn BUFFER OKSTATUS COMMAND FILE-OR-LIST &rest FLAGS)" nil nil)
 (register-definition-prefixes "vc-dispatcher" '("vc-"))
 
-;;;***
 
-;;;### (autoloads nil "vc-filewise" "vc/vc-filewise.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-filewise.el
 
 (register-definition-prefixes "vc-filewise" '("vc-"))
 
-;;;***
 
-;;;### (autoloads nil "vc-git" "vc/vc-git.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-git.el
+
  (defun vc-git-registered (file)
   "Return non-nil if FILE is registered with git."
   (if (vc-find-root file ".git")       ; Short cut.
       (progn
         (load "vc-git" nil t)
         (vc-git-registered file))))
-
 (register-definition-prefixes "vc-git" '("vc-"))
 
-;;;***
 
-;;;### (autoloads nil "vc-hg" "vc/vc-hg.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-hg.el
+
  (defun vc-hg-registered (file)
   "Return non-nil if FILE is registered with hg."
   (if (vc-find-root file ".hg")       ; short cut
       (progn
         (load "vc-hg" nil t)
         (vc-hg-registered file))))
-
 (register-definition-prefixes "vc-hg" '("vc-hg-"))
 
-;;;***
-
-;;;### (autoloads nil "vc-mtn" "vc/vc-mtn.el" (0 0 0 0))
-;;; Generated autoloads from vc/vc-mtn.el
-
-(defconst vc-mtn-admin-dir "_MTN" "\
-Name of the monotone directory.")
-
-(defconst vc-mtn-admin-format (concat vc-mtn-admin-dir "/format") "\
-Name of the monotone directory's format file.")
- (defun vc-mtn-registered (file)
-  (if (vc-find-root file vc-mtn-admin-format)
-      (progn
-        (load "vc-mtn" nil t)
-        (vc-mtn-registered file))))
-
-(register-definition-prefixes "vc-mtn" '("vc-mtn-"))
-
-;;;***
 
-;;;### (autoloads nil "vc-rcs" "vc/vc-rcs.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-rcs.el
 
 (defvar vc-rcs-master-templates (purecopy '("%sRCS/%s,v" "%s%s,v" "%sRCS/%s")) 
"\
 Where to look for RCS master files.
 For a description of possible values, see `vc-check-master-templates'.")
-
 (custom-autoload 'vc-rcs-master-templates "vc-rcs" t)
-
 (defun vc-rcs-registered (f) (vc-default-registered 'RCS f))
-
 (register-definition-prefixes "vc-rcs" '("vc-r"))
 
-;;;***
 
-;;;### (autoloads nil "vc-sccs" "vc/vc-sccs.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-sccs.el
 
 (defvar vc-sccs-master-templates (purecopy '("%sSCCS/s.%s" "%ss.%s" 
vc-sccs-search-project-dir)) "\
 Where to look for SCCS master files.
 For a description of possible values, see `vc-check-master-templates'.")
-
 (custom-autoload 'vc-sccs-master-templates "vc-sccs" t)
-
 (defun vc-sccs-registered (f) (vc-default-registered 'SCCS f))
-
 (defun vc-sccs-search-project-dir (_dirname basename) "\
 Return the name of a master file in the SCCS project directory.
 Does not check whether the file exists but returns nil if it does not
 find any project directory." (let ((project-dir (getenv "PROJECTDIR")) dirs 
dir) (when project-dir (if (file-name-absolute-p project-dir) (setq dirs 
'("SCCS" "")) (setq dirs '("src/SCCS" "src" "source/SCCS" "source")) (setq 
project-dir (expand-file-name (concat "~" project-dir)))) (while (and (not dir) 
dirs) (setq dir (expand-file-name (car dirs) project-dir)) (unless 
(file-directory-p dir) (setq dir nil) (setq dirs (cdr dirs)))) (and dir 
(expand-file-name (concat "s." basename) dir)))))
-
 (register-definition-prefixes "vc-sccs" '("vc-sccs-"))
 
-;;;***
 
-;;;### (autoloads nil "vc-src" "vc/vc-src.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-src.el
 
 (defvar vc-src-master-templates (purecopy '("%s.src/%s,v")) "\
 Where to look for SRC master files.
 For a description of possible values, see `vc-check-master-templates'.")
-
 (custom-autoload 'vc-src-master-templates "vc-src" t)
-
 (defun vc-src-registered (f) (vc-default-registered 'src f))
-
 (register-definition-prefixes "vc-src" '("vc-src-"))
 
-;;;***
 
-;;;### (autoloads nil "vc-svn" "vc/vc-svn.el" (0 0 0 0))
 ;;; Generated autoloads from vc/vc-svn.el
+
  (defun vc-svn-registered (f)
   (let ((admin-dir (cond ((and (eq system-type 'windows-nt)
                                (getenv "SVN_ASP_DOT_NET_HACK"))
@@ -37716,24 +33434,18 @@ For a description of possible values, see 
`vc-check-master-templates'.")
     (when (vc-find-root f admin-dir)
       (load "vc-svn" nil t)
       (vc-svn-registered f))))
-
 (register-definition-prefixes "vc-svn" '("vc-svn-"))
 
-;;;***
 
-;;;### (autoloads nil "vcursor" "vcursor.el" (0 0 0 0))
 ;;; Generated autoloads from vcursor.el
 
 (register-definition-prefixes "vcursor" '("vcursor-"))
 
-;;;***
 
-;;;### (autoloads nil "vera-mode" "progmodes/vera-mode.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/vera-mode.el
+
 (push (purecopy '(vera-mode 2 28)) package--builtin-versions)
  (add-to-list 'auto-mode-alist (cons (purecopy "\\.vr[hi]?\\'")  'vera-mode))
-
 (autoload 'vera-mode "vera-mode" "\
 Major mode for editing Vera code.
 
@@ -37783,17 +33495,13 @@ Key bindings:
 
 \\{vera-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "vera-mode" '("vera-"))
 
-;;;***
 
-;;;### (autoloads nil "verilog-mode" "progmodes/verilog-mode.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from progmodes/verilog-mode.el
-(push (purecopy '(verilog-mode 2021 10 14 127365406)) 
package--builtin-versions)
 
+(push (purecopy '(verilog-mode 2021 10 14 127365406)) 
package--builtin-versions)
 (autoload 'verilog-mode "verilog-mode" "\
 Major mode for editing Verilog code.
 \\<verilog-mode-map>
@@ -37929,14 +33637,10 @@ Key bindings specific to `verilog-mode-map' are:
 
 \\{verilog-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "verilog-mode" '("electric-verilog-" "verilog-" 
"vl-"))
 
-;;;***
 
-;;;### (autoloads nil "vhdl-mode" "progmodes/vhdl-mode.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from progmodes/vhdl-mode.el
 
 (autoload 'vhdl-mode "vhdl-mode" "\
@@ -38486,74 +34190,57 @@ Key bindings:
 
 \\{vhdl-mode-map}
 
-\(fn)" t nil)
-
+(fn)" t nil)
 (register-definition-prefixes "vhdl-mode" '("vhdl-"))
 
-;;;***
 
-;;;### (autoloads nil "viet-util" "language/viet-util.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from language/viet-util.el
 
 (autoload 'viet-encode-viscii-char "viet-util" "\
 Return VISCII character code of CHAR if appropriate.
 
-\(fn CHAR)" nil nil)
-
+(fn CHAR)" nil nil)
 (autoload 'viet-decode-viqr-region "viet-util" "\
 Convert `VIQR' mnemonics of the current region to Vietnamese characters.
 When called from a program, expects two arguments,
 positions (integers or markers) specifying the stretch of the region.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'viet-decode-viqr-buffer "viet-util" "\
 Convert `VIQR' mnemonics of the current buffer to Vietnamese characters." t 
nil)
-
 (autoload 'viet-encode-viqr-region "viet-util" "\
 Convert Vietnamese characters of the current region to `VIQR' mnemonics.
 When called from a program, expects two arguments,
 positions (integers or markers) specifying the stretch of the region.
 
-\(fn FROM TO)" t nil)
-
+(fn FROM TO)" t nil)
 (autoload 'viet-encode-viqr-buffer "viet-util" "\
 Convert Vietnamese characters of the current buffer to `VIQR' mnemonics." t 
nil)
-
 (autoload 'viqr-post-read-conversion "viet-util" "\
 
 
-\(fn LEN)" nil nil)
-
+(fn LEN)" nil nil)
 (autoload 'viqr-pre-write-conversion "viet-util" "\
 
 
-\(fn FROM TO)" nil nil)
-
+(fn FROM TO)" nil nil)
 (register-definition-prefixes "viet-util" '("viet-viqr-alist" "viqr-regexp"))
 
-;;;***
 
-;;;### (autoloads nil "view" "view.el" (0 0 0 0))
 ;;; Generated autoloads from view.el
 
 (defvar view-remove-frame-by-deleting t "\
 Determine how View mode removes a frame no longer needed.
 If nil, make an icon of the frame.  If non-nil, delete the frame.")
-
 (custom-autoload 'view-remove-frame-by-deleting "view" t)
-
 (defvar-local view-mode nil "\
 Non-nil if View mode is enabled.
 Don't change this variable directly, you must change it by one of the
 functions that enable or disable view mode.")
-
 (autoload 'kill-buffer-if-not-modified "view" "\
 Like `kill-buffer', but does nothing if buffer BUF is modified.
 
-\(fn BUF)" nil nil)
-
+(fn BUF)" nil nil)
 (autoload 'view-file "view" "\
 View FILE in View mode, returning to previous buffer when done.
 Emacs commands editing the buffer contents are not available; instead, a
@@ -38564,8 +34251,7 @@ For a list of all View commands, type H or h while 
viewing.
 
 This command runs the normal hook `view-mode-hook'.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'view-file-other-window "view" "\
 View FILE in View mode in another window.
 When done, return that window to its previous buffer, and kill the
@@ -38579,8 +34265,7 @@ For a list of all View commands, type H or h while 
viewing.
 
 This command runs the normal hook `view-mode-hook'.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'view-file-other-frame "view" "\
 View FILE in View mode in another frame.
 When done, kill the buffer visiting FILE if unmodified and if it wasn't
@@ -38595,8 +34280,7 @@ For a list of all View commands, type H or h while 
viewing.
 
 This command runs the normal hook `view-mode-hook'.
 
-\(fn FILE)" t nil)
-
+(fn FILE)" t nil)
 (autoload 'view-buffer "view" "\
 View BUFFER in View mode, returning to previous buffer when done.
 Emacs commands editing the buffer contents are not available; instead, a
@@ -38620,8 +34304,7 @@ This function does not enable View mode if the buffer's 
major mode
 has a `special' mode-class, because such modes usually have their
 own View-like bindings.
 
-\(fn BUFFER &optional EXIT-ACTION)" t nil)
-
+(fn BUFFER &optional EXIT-ACTION)" t nil)
 (autoload 'view-buffer-other-window "view" "\
 View BUFFER in View mode in another window.
 Emacs commands editing the buffer contents are not available;
@@ -38642,8 +34325,7 @@ This function does not enable View mode if the buffer's 
major mode
 has a `special' mode-class, because such modes usually have their
 own View-like bindings.
 
-\(fn BUFFER &optional NOT-RETURN EXIT-ACTION)" t nil)
-
+(fn BUFFER &optional NOT-RETURN EXIT-ACTION)" t nil)
 (autoload 'view-buffer-other-frame "view" "\
 View BUFFER in View mode in another frame.
 Emacs commands editing the buffer contents are not available;
@@ -38664,8 +34346,7 @@ This function does not enable View mode if the buffer's 
major mode
 has a `special' mode-class, because such modes usually have their
 own View-like bindings.
 
-\(fn BUFFER &optional NOT-RETURN EXIT-ACTION)" t nil)
-
+(fn BUFFER &optional NOT-RETURN EXIT-ACTION)" t nil)
 (autoload 'view-mode "view" "\
 Toggle View mode, a minor mode for viewing text but not editing it.
 
@@ -38760,8 +34441,7 @@ evaluate `view-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'view-return-to-alist-update "view" "\
 Update `view-return-to-alist' of buffer BUFFER.
 Remove from `view-return-to-alist' all entries referencing dead
@@ -38772,10 +34452,8 @@ function `view-mode-exit'.  If `view-return-to-alist' 
contains an
 entry for the selected window, purge that entry from
 `view-return-to-alist' before adding ITEM.
 
-\(fn BUFFER &optional ITEM)" nil nil)
-
+(fn BUFFER &optional ITEM)" nil nil)
 (make-obsolete 'view-return-to-alist-update '"this function has no effect." 
'"24.1")
-
 (autoload 'view-mode-enter "view" "\
 Enter View mode and set up exit from view mode depending on optional arguments.
 Optional argument QUIT-RESTORE if non-nil must specify a valid
@@ -38791,108 +34469,78 @@ For a list of all View commands, type H or h while 
viewing.
 
 This function runs the normal hook `view-mode-hook'.
 
-\(fn &optional QUIT-RESTORE EXIT-ACTION)" nil nil)
-
+(fn &optional QUIT-RESTORE EXIT-ACTION)" nil nil)
 (autoload 'View-exit-and-edit "view" "\
 Exit View mode and make the current buffer editable." t nil)
-
 (register-definition-prefixes "view" '("View-" "view-"))
 
-;;;***
 
-;;;### (autoloads nil "viper" "emulation/viper.el" (0 0 0 0))
 ;;; Generated autoloads from emulation/viper.el
-(push (purecopy '(viper 3 14 1)) package--builtin-versions)
 
+(push (purecopy '(viper 3 14 1)) package--builtin-versions)
 (autoload 'toggle-viper-mode "viper" "\
 Toggle Viper on/off.
 If Viper is enabled, turn it off.  Otherwise, turn it on." t nil)
-
 (autoload 'viper-mode "viper" "\
 Turn on Viper emulation of Vi in Emacs.  See Info node `(viper)Top'." t nil)
-
 (register-definition-prefixes "viper" '("set-viper-state-in-major-mode" 
"this-major-mode-requires-vi-state" "viper-"))
 
-;;;***
 
-;;;### (autoloads nil "viper-cmd" "emulation/viper-cmd.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from emulation/viper-cmd.el
 
 (register-definition-prefixes "viper-cmd" '("viper-"))
 
-;;;***
 
-;;;### (autoloads nil "viper-ex" "emulation/viper-ex.el" (0 0 0 0))
 ;;; Generated autoloads from emulation/viper-ex.el
 
 (register-definition-prefixes "viper-ex" '("ex-" "viper-"))
 
-;;;***
 
-;;;### (autoloads nil "viper-init" "emulation/viper-init.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emulation/viper-init.el
 
 (register-definition-prefixes "viper-init" '("viper-"))
 
-;;;***
 
-;;;### (autoloads nil "viper-keym" "emulation/viper-keym.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emulation/viper-keym.el
 
 (register-definition-prefixes "viper-keym" '("ex-read-filename-map" "viper-"))
 
-;;;***
 
-;;;### (autoloads nil "viper-macs" "emulation/viper-macs.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emulation/viper-macs.el
 
 (register-definition-prefixes "viper-macs" '("ex-" "viper-"))
 
-;;;***
 
-;;;### (autoloads nil "viper-mous" "emulation/viper-mous.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emulation/viper-mous.el
 
 (register-definition-prefixes "viper-mous" '("viper-"))
 
-;;;***
 
-;;;### (autoloads nil "viper-util" "emulation/viper-util.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from emulation/viper-util.el
 
 (register-definition-prefixes "viper-util" '("viper"))
 
-;;;***
 
-;;;### (autoloads nil "vtable" "emacs-lisp/vtable.el" (0 0 0 0))
+;;; Generated autoloads from leim/quail/viqr.el
+
+(register-definition-prefixes "quail/viqr" '("viet-quail-define-rules"))
+
+
 ;;; Generated autoloads from emacs-lisp/vtable.el
 
 (register-definition-prefixes "vtable" '("vtable"))
 
-;;;***
 
-;;;### (autoloads nil "w32-fns" "w32-fns.el" (0 0 0 0))
 ;;; Generated autoloads from w32-fns.el
 
 (register-definition-prefixes "w32-fns" '("w32-"))
 
-;;;***
 
-;;;### (autoloads nil "w32-vars" "w32-vars.el" (0 0 0 0))
 ;;; Generated autoloads from w32-vars.el
 
 (register-definition-prefixes "w32-vars" '("w32-"))
 
-;;;***
 
-;;;### (autoloads nil "warnings" "emacs-lisp/warnings.el" (0 0 0
-;;;;;;  0))
 ;;; Generated autoloads from emacs-lisp/warnings.el
 
 (defvar warning-prefix-function nil "\
@@ -38903,7 +34551,6 @@ and should return the entry that should actually be 
used.
 The warnings buffer is current when this function is called
 and the function can insert text in it.  This text becomes
 the beginning of the warning.")
-
 (defvar warning-series nil "\
 Non-nil means treat multiple `display-warning' calls as a series.
 A marker indicates a position in the warnings buffer
@@ -38912,24 +34559,21 @@ additional warnings in the same buffer should not 
move point.
 If t, the next warning begins a series (and stores a marker here).
 A symbol with a function definition is like t, except
 also call that function before the next warning.")
-
 (defvar warning-fill-prefix nil "\
 Non-nil means fill each warning text using this string as `fill-prefix'.")
-
 (defvar warning-type-format (purecopy " (%s)") "\
 Format for displaying the warning type in the warning message.
 The result of formatting the type this way gets included in the
 message under the control of the string in `warning-levels'.")
-
 (autoload 'display-warning "warnings" "\
 Display a warning message, MESSAGE.
 TYPE is the warning type: either a custom group name (a symbol),
 or a list of symbols whose first element is a custom group name.
-\(The rest of the symbols represent subcategories, for warning purposes
+(The rest of the symbols represent subcategories, for warning purposes
 only, and you can use whatever symbols you like.)
 
 LEVEL should be either :debug, :warning, :error, or :emergency
-\(but see `warning-minimum-level' and `warning-minimum-log-level').
+(but see `warning-minimum-level' and `warning-minimum-log-level').
 Default is :warning.
 
 :emergency -- a problem that will seriously impair Emacs operation soon
@@ -38954,8 +34598,7 @@ disable automatic display of the warning or disable the 
warning
 entirely by setting `warning-suppress-types' or
 `warning-suppress-log-types' on their behalf.
 
-\(fn TYPE MESSAGE &optional LEVEL BUFFER-NAME)" nil nil)
-
+(fn TYPE MESSAGE &optional LEVEL BUFFER-NAME)" nil nil)
 (autoload 'lwarn "warnings" "\
 Display a warning message made from (format-message MESSAGE ARGS...).
 \\<special-mode-map>
@@ -38964,11 +34607,11 @@ this is equivalent to `display-warning'.
 
 TYPE is the warning type: either a custom group name (a symbol),
 or a list of symbols whose first element is a custom group name.
-\(The rest of the symbols represent subcategories and
+(The rest of the symbols represent subcategories and
 can be whatever you like.)
 
 LEVEL should be either :debug, :warning, :error, or :emergency
-\(but see `warning-minimum-level' and `warning-minimum-log-level').
+(but see `warning-minimum-level' and `warning-minimum-log-level').
 
 :emergency -- a problem that will seriously impair Emacs operation soon
              if you do not attend to it promptly.
@@ -38976,21 +34619,17 @@ LEVEL should be either :debug, :warning, :error, or 
:emergency
 :warning   -- suspicious data or circumstances.
 :debug     -- info for debugging only.
 
-\(fn TYPE LEVEL MESSAGE &rest ARGS)" nil nil)
-
+(fn TYPE LEVEL MESSAGE &rest ARGS)" nil nil)
 (autoload 'warn "warnings" "\
 Display a warning message made from (format-message MESSAGE ARGS...).
 Aside from generating the message with `format-message',
 this is equivalent to `display-warning', using
 `emacs' as the type and `:warning' as the level.
 
-\(fn MESSAGE &rest ARGS)" nil nil)
-
+(fn MESSAGE &rest ARGS)" nil nil)
 (register-definition-prefixes "warnings" '("warning-"))
 
-;;;***
 
-;;;### (autoloads nil "wdired" "wdired.el" (0 0 0 0))
 ;;; Generated autoloads from wdired.el
 
 (autoload 'wdired-change-to-wdired-mode "wdired" "\
@@ -39002,12 +34641,9 @@ files.  After typing \\[wdired-finish-edit], Emacs 
modifies the files and
 directories to reflect your edits.
 
 See `wdired-mode'." t nil)
-
 (register-definition-prefixes "wdired" '("wdired-"))
 
-;;;***
 
-;;;### (autoloads nil "webjump" "net/webjump.el" (0 0 0 0))
 ;;; Generated autoloads from net/webjump.el
 
 (autoload 'webjump "webjump" "\
@@ -39018,19 +34654,15 @@ hotlist.
 
 Please submit bug reports and other feedback to the author, Neil W. Van Dyke
 <nwv@acm.org>." t nil)
-
 (register-definition-prefixes "webjump" '("webjump-"))
 
-;;;***
 
-;;;### (autoloads nil "which-func" "progmodes/which-func.el" (0 0
-;;;;;;  0 0))
 ;;; Generated autoloads from progmodes/which-func.el
+
  (put 'which-func-format 'risky-local-variable t)
  (put 'which-func-current 'risky-local-variable t)
-
-(define-obsolete-function-alias 'which-func-mode 'which-function-mode "24.1")
-
+(define-obsolete-function-alias 'which-func-mode 'which-function-mode "\
+24.1")
 (defvar which-function-mode nil "\
 Non-nil if Which-Function mode is enabled.
 See the `which-function-mode' command
@@ -39038,9 +34670,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `which-function-mode'.")
-
 (custom-autoload 'which-function-mode "which-func" nil)
-
 (autoload 'which-function-mode "which-func" "\
 Toggle mode line display of current function (Which Function mode).
 
@@ -39062,16 +34692,13 @@ evaluate `(default-value \\='which-function-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "which-func" '("which-func"))
 
-;;;***
 
-;;;### (autoloads nil "whitespace" "whitespace.el" (0 0 0 0))
 ;;; Generated autoloads from whitespace.el
-(push (purecopy '(whitespace 13 2 2)) package--builtin-versions)
 
+(push (purecopy '(whitespace 13 2 2)) package--builtin-versions)
 (autoload 'whitespace-mode "whitespace" "\
 Toggle whitespace visualization (Whitespace mode).
 
@@ -39095,8 +34722,7 @@ evaluate `whitespace-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'whitespace-newline-mode "whitespace" "\
 Toggle newline visualization (Whitespace Newline mode).
 
@@ -39122,8 +34748,7 @@ evaluate `whitespace-newline-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar global-whitespace-mode nil "\
 Non-nil if Global Whitespace mode is enabled.
 See the `global-whitespace-mode' command
@@ -39131,9 +34756,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-whitespace-mode'.")
-
 (custom-autoload 'global-whitespace-mode "whitespace" nil)
-
 (autoload 'global-whitespace-mode "whitespace" "\
 Toggle whitespace visualization globally (Global Whitespace mode).
 
@@ -39155,8 +34778,7 @@ evaluate `(default-value \\='global-whitespace-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar global-whitespace-newline-mode nil "\
 Non-nil if Global Whitespace-Newline mode is enabled.
 See the `global-whitespace-newline-mode' command
@@ -39164,9 +34786,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-whitespace-newline-mode'.")
-
 (custom-autoload 'global-whitespace-newline-mode "whitespace" nil)
-
 (autoload 'global-whitespace-newline-mode "whitespace" "\
 Toggle global newline visualization (Global Whitespace Newline mode).
 
@@ -39192,8 +34812,7 @@ evaluate `(default-value 
\\='global-whitespace-newline-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'whitespace-toggle-options "whitespace" "\
 Toggle local `whitespace-mode' options.
 
@@ -39264,8 +34883,7 @@ The valid symbols are:
 
 See `whitespace-style' and `indent-tabs-mode' for documentation.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'global-whitespace-toggle-options "whitespace" "\
 Toggle global `whitespace-mode' options.
 
@@ -39336,8 +34954,7 @@ The valid symbols are:
 
 See `whitespace-style' and `indent-tabs-mode' for documentation.
 
-\(fn ARG)" t nil)
-
+(fn ARG)" t nil)
 (autoload 'whitespace-cleanup "whitespace" "\
 Cleanup some blank problems in all buffer or at region.
 
@@ -39390,7 +35007,6 @@ The problems cleaned up are:
 
 See `whitespace-style', `indent-tabs-mode' and `tab-width' for
 documentation." t nil)
-
 (autoload 'whitespace-cleanup-region "whitespace" "\
 Cleanup some blank problems at region.
 
@@ -39431,15 +35047,13 @@ The problems cleaned up are:
 See `whitespace-style', `indent-tabs-mode' and `tab-width' for
 documentation.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'whitespace-report "whitespace" "\
 Report some whitespace problems in buffer.
 
 Perform `whitespace-report-region' on the current buffer.
 
-\(fn &optional FORCE REPORT-IF-BOGUS)" t nil)
-
+(fn &optional FORCE REPORT-IF-BOGUS)" t nil)
 (autoload 'whitespace-report-region "whitespace" "\
 Report some whitespace problems in a region.
 
@@ -39477,30 +35091,24 @@ See `whitespace-style' for documentation.
 See also `whitespace-cleanup' and `whitespace-cleanup-region' for
 cleaning up these problems.
 
-\(fn START END &optional FORCE REPORT-IF-BOGUS)" t nil)
-
+(fn START END &optional FORCE REPORT-IF-BOGUS)" t nil)
 (register-definition-prefixes "whitespace" '("whitespace-"))
 
-;;;***
 
-;;;### (autoloads nil "wid-browse" "wid-browse.el" (0 0 0 0))
 ;;; Generated autoloads from wid-browse.el
 
 (autoload 'widget-browse-at "wid-browse" "\
 Browse the widget under point.
 
-\(fn POS)" t nil)
-
+(fn POS)" t nil)
 (autoload 'widget-browse "wid-browse" "\
 Create a widget browser for WIDGET.
 
-\(fn WIDGET)" t nil)
-
+(fn WIDGET)" t nil)
 (autoload 'widget-browse-other-window "wid-browse" "\
 Show widget browser for WIDGET in other window.
 
-\(fn &optional WIDGET)" t nil)
-
+(fn &optional WIDGET)" t nil)
 (autoload 'widget-minor-mode "wid-browse" "\
 Minor mode for traversing widgets.
 
@@ -39518,55 +35126,43 @@ evaluate `widget-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "wid-browse" '("widget-"))
 
-;;;***
 
-;;;### (autoloads nil "wid-edit" "wid-edit.el" (0 0 0 0))
 ;;; Generated autoloads from wid-edit.el
 
 (autoload 'widgetp "wid-edit" "\
 Return non-nil if WIDGET is a widget.
 
-\(fn WIDGET)" nil nil)
-
+(fn WIDGET)" nil nil)
 (autoload 'widget-prompt-value "wid-edit" "\
 Prompt for a value matching WIDGET, using PROMPT.
 The current value is assumed to be VALUE, unless UNBOUND is non-nil.
 
-\(fn WIDGET PROMPT &optional VALUE UNBOUND)" nil nil)
-
+(fn WIDGET PROMPT &optional VALUE UNBOUND)" nil nil)
 (autoload 'widget-create "wid-edit" "\
 Create widget of TYPE.
 The optional ARGS are additional keyword arguments.
 
-\(fn TYPE &rest ARGS)" nil nil)
-
+(fn TYPE &rest ARGS)" nil nil)
 (autoload 'widget-delete "wid-edit" "\
 Delete WIDGET.
 
-\(fn WIDGET)" nil nil)
-
+(fn WIDGET)" nil nil)
 (autoload 'widget-insert "wid-edit" "\
 Call `insert' with ARGS even if surrounding text is read only.
 
-\(fn &rest ARGS)" nil nil)
-
+(fn &rest ARGS)" nil nil)
 (defvar widget-keymap (let ((map (make-sparse-keymap))) (define-key map "\11" 
'widget-forward) (define-key map "\33\11" 'widget-backward) (define-key map 
[(shift tab)] 'widget-backward) (put 'widget-backward :advertised-binding 
[(shift tab)]) (define-key map [backtab] 'widget-backward) (define-key map 
[down-mouse-2] 'widget-button-click) (define-key map [down-mouse-1] 
'widget-button-click) (define-key map [(control 109)] 'widget-button-press) 
map) "\
 Keymap containing useful binding for buffers containing widgets.
 Recommended as a parent keymap for modes using widgets.
 Note that such modes will need to require wid-edit.")
-
 (autoload 'widget-setup "wid-edit" "\
 Setup current buffer so editing string widgets works." nil nil)
-
 (register-definition-prefixes "wid-edit" '("widget-"))
 
-;;;***
 
-;;;### (autoloads nil "windmove" "windmove.el" (0 0 0 0))
 ;;; Generated autoloads from windmove.el
 
 (autoload 'windmove-left "windmove" "\
@@ -39574,12 +35170,11 @@ Select the window to the left of the current one.
 With no prefix argument, or with prefix argument equal to zero,
 \"left\" is relative to the position of point in the window; otherwise
 it is relative to the top edge (for positive ARG) or the bottom edge
-\(for negative ARG) of the current window.
+(for negative ARG) of the current window.
 If no window is at the desired location, an error is signaled
 unless `windmove-create-window' is non-nil and a new window is created.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-up "windmove" "\
 Select the window above the current one.
 With no prefix argument, or with prefix argument equal to zero, \"up\"
@@ -39589,8 +35184,7 @@ negative ARG) of the current window.
 If no window is at the desired location, an error is signaled
 unless `windmove-create-window' is non-nil and a new window is created.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-right "windmove" "\
 Select the window to the right of the current one.
 With no prefix argument, or with prefix argument equal to zero,
@@ -39600,26 +35194,22 @@ bottom edge (for negative ARG) of the current window.
 If no window is at the desired location, an error is signaled
 unless `windmove-create-window' is non-nil and a new window is created.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-down "windmove" "\
 Select the window below the current one.
 With no prefix argument, or with prefix argument equal to zero,
 \"down\" is relative to the position of point in the window; otherwise
 it is relative to the left edge (for positive ARG) or the right edge
-\(for negative ARG) of the current window.
+(for negative ARG) of the current window.
 If no window is at the desired location, an error is signaled
 unless `windmove-create-window' is non-nil and a new window is created.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (defvar windmove-mode t "\
 Non-nil if Windmove mode is enabled.
 See the `windmove-mode' command
 for a description of this minor mode.")
-
 (custom-autoload 'windmove-mode "windmove" nil)
-
 (autoload 'windmove-mode "windmove" "\
 Global minor mode for default windmove commands.
 
@@ -39637,8 +35227,7 @@ evaluate `(default-value \\='windmove-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-default-keybindings "windmove" "\
 Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
@@ -39647,51 +35236,43 @@ If MODIFIERS is `none', the keybindings will be 
directly bound to
 the arrow keys.
 Default value of MODIFIERS is `shift'.
 
-\(fn &optional MODIFIERS)" t nil)
-
+(fn &optional MODIFIERS)" t nil)
 (autoload 'windmove-display-left "windmove" "\
 Display the next buffer in window to the left of the current one.
 See the logic of the prefix ARG and `windmove-display-no-select'
 in `windmove-display-in-direction'.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-display-up "windmove" "\
 Display the next buffer in window above the current one.
 See the logic of the prefix ARG and `windmove-display-no-select'
 in `windmove-display-in-direction'.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-display-right "windmove" "\
 Display the next buffer in window to the right of the current one.
 See the logic of the prefix ARG and `windmove-display-no-select'
 in `windmove-display-in-direction'.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-display-down "windmove" "\
 Display the next buffer in window below the current one.
 See the logic of the prefix ARG and `windmove-display-no-select'
 in `windmove-display-in-direction'.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-display-same-window "windmove" "\
 Display the next buffer in the same window.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-display-new-frame "windmove" "\
 Display the next buffer in a new frame.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-display-new-tab "windmove" "\
 Display the next buffer in a new tab.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-display-default-keybindings "windmove" "\
 Set up keybindings for directional buffer display.
 Keys are bound to commands that display the next buffer in the specified
@@ -39701,36 +35282,31 @@ If MODIFIERS is `none', the keybindings will be 
directly bound to
 the arrow keys.
 Default value of MODIFIERS is `shift-meta'.
 
-\(fn &optional MODIFIERS)" t nil)
-
+(fn &optional MODIFIERS)" t nil)
 (autoload 'windmove-delete-left "windmove" "\
 Delete the window to the left of the current one.
 If prefix ARG is \\[universal-argument], delete the selected window and
 select the window that was to the left of the current one.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-delete-up "windmove" "\
 Delete the window above the current one.
 If prefix ARG is \\[universal-argument], delete the selected window and
 select the window that was above the current one.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-delete-right "windmove" "\
 Delete the window to the right of the current one.
 If prefix ARG is \\[universal-argument], delete the selected window and
 select the window that was to the right of the current one.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-delete-down "windmove" "\
 Delete the window below the current one.
 If prefix ARG is \\[universal-argument], delete the selected window and
 select the window that was below the current one.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (autoload 'windmove-delete-default-keybindings "windmove" "\
 Set up keybindings for directional window deletion.
 Keys are bound to commands that delete windows in the specified
@@ -39741,20 +35317,15 @@ If PREFIX is `none', no prefix is used.  If MODIFIERS 
is `none',
 the keybindings are directly bound to the arrow keys.
 Default value of PREFIX is \\`C-x' and MODIFIERS is `shift'.
 
-\(fn &optional PREFIX MODIFIERS)" t nil)
-
+(fn &optional PREFIX MODIFIERS)" t nil)
 (autoload 'windmove-swap-states-left "windmove" "\
 Swap the states with the window on the left from the current one." t nil)
-
 (autoload 'windmove-swap-states-up "windmove" "\
 Swap the states with the window above from the current one." t nil)
-
 (autoload 'windmove-swap-states-down "windmove" "\
 Swap the states with the window below from the current one." t nil)
-
 (autoload 'windmove-swap-states-right "windmove" "\
 Swap the states with the window on the right from the current one." t nil)
-
 (autoload 'windmove-swap-states-default-keybindings "windmove" "\
 Set up keybindings for directional window swap states.
 Keys are bound to commands that swap the states of the selected window
@@ -39765,13 +35336,10 @@ If MODIFIERS is `none', the keybindings will be 
directly bound to the
 arrow keys.
 Default value of MODIFIERS is `shift-super'.
 
-\(fn &optional MODIFIERS)" t nil)
-
+(fn &optional MODIFIERS)" t nil)
 (register-definition-prefixes "windmove" '("windmove-"))
 
-;;;***
 
-;;;### (autoloads nil "winner" "winner.el" (0 0 0 0))
 ;;; Generated autoloads from winner.el
 
 (defvar winner-mode nil "\
@@ -39781,9 +35349,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `winner-mode'.")
-
 (custom-autoload 'winner-mode "winner" nil)
-
 (autoload 'winner-mode "winner" "\
 Toggle Winner mode on or off.
 
@@ -39808,23 +35374,28 @@ evaluate `(default-value \\='winner-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "winner" '("winner-"))
 
-;;;***
 
-;;;### (autoloads nil "woman" "woman.el" (0 0 0 0))
+;;; Generated autoloads from cedet/semantic/wisent/wisent.el
+
+(register-definition-prefixes "semantic/wisent/wisent" '("$action" "$nterm" 
"$region" "wisent-"))
+
+
+;;; Generated autoloads from cedet/semantic/wisent.el
+
+(register-definition-prefixes "semantic/wisent" '("define-wisent-lexer" 
"wisent-"))
+
+
 ;;; Generated autoloads from woman.el
 
 (defvar woman-locale nil "\
 String specifying a manual page locale, or nil.
 If a manual page is available in the specified locale
-\(e.g. \"sv_SE.ISO8859-1\"), it will be offered in preference to the
+(e.g. \"sv_SE.ISO8859-1\"), it will be offered in preference to the
 default version.  Normally, `set-locale-environment' sets this at startup.")
-
 (custom-autoload 'woman-locale "woman" t)
-
 (autoload 'woman "woman" "\
 Browse UN*X man page for TOPIC (Without using external Man program).
 The major browsing mode used is essentially the standard Man mode.
@@ -39837,11 +35408,9 @@ updated (e.g. to re-interpret the current directory).
 Used non-interactively, arguments are optional: if given then TOPIC
 should be a topic string and non-nil RE-CACHE forces re-caching.
 
-\(fn &optional TOPIC RE-CACHE)" t nil)
-
+(fn &optional TOPIC RE-CACHE)" t nil)
 (autoload 'woman-dired-find-file "woman" "\
 In dired, run the WoMan man-page browser on this file." t nil)
-
 (autoload 'woman-find-file "woman" "\
 Find, decode and browse a specific UN*X man-page source file FILE-NAME.
 Use existing buffer if possible; reformat only if prefix arg given.
@@ -39851,19 +35420,14 @@ No external programs are used, except that `gunzip' 
will be used to
 decompress the file if appropriate.  See the documentation for the
 `woman' command for further details.
 
-\(fn FILE-NAME &optional REFORMAT)" t nil)
-
+(fn FILE-NAME &optional REFORMAT)" t nil)
 (autoload 'woman-bookmark-jump "woman" "\
 Default bookmark handler for Woman buffers.
 
-\(fn BOOKMARK)" nil nil)
-
+(fn BOOKMARK)" nil nil)
 (register-definition-prefixes "woman" '("WoMan-" "menu-bar-manuals-menu" 
"set-woman-file-regexp" "woman"))
 
-;;;***
 
-;;;### (autoloads nil "word-wrap-mode" "textmodes/word-wrap-mode.el"
-;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from textmodes/word-wrap-mode.el
 
 (autoload 'word-wrap-whitespace-mode "word-wrap-mode" "\
@@ -39886,10 +35450,8 @@ evaluate `word-wrap-whitespace-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (put 'global-word-wrap-whitespace-mode 'globalized-minor-mode t)
-
 (defvar global-word-wrap-whitespace-mode nil "\
 Non-nil if Global Word-Wrap-Whitespace mode is enabled.
 See the `global-word-wrap-whitespace-mode' command
@@ -39897,9 +35459,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `global-word-wrap-whitespace-mode'.")
-
 (custom-autoload 'global-word-wrap-whitespace-mode "word-wrap-mode" nil)
-
 (autoload 'global-word-wrap-whitespace-mode "word-wrap-mode" "\
 Toggle Word-Wrap-Whitespace mode in all buffers.
 With prefix ARG, enable Global Word-Wrap-Whitespace mode if ARG is
@@ -39915,27 +35475,20 @@ Word-Wrap-Whitespace mode is enabled in all buffers 
where
 See `word-wrap-whitespace-mode' for more information on
 Word-Wrap-Whitespace mode.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "word-wrap-mode" 
'("word-wrap-whitespace-characters"))
 
-;;;***
 
-;;;### (autoloads nil "x-dnd" "x-dnd.el" (0 0 0 0))
 ;;; Generated autoloads from x-dnd.el
 
 (register-definition-prefixes "x-dnd" '("x-dnd-"))
 
-;;;***
 
-;;;### (autoloads nil "xdg" "xdg.el" (0 0 0 0))
 ;;; Generated autoloads from xdg.el
 
 (register-definition-prefixes "xdg" '("xdg-"))
 
-;;;***
 
-;;;### (autoloads nil "xml" "xml.el" (0 0 0 0))
 ;;; Generated autoloads from xml.el
 
 (autoload 'xml-parse-file "xml" "\
@@ -39959,8 +35512,7 @@ Both features can be combined by providing a cons cell
 
   (symbol-qnames . ALIST).
 
-\(fn FILE &optional PARSE-DTD PARSE-NS)" nil nil)
-
+(fn FILE &optional PARSE-DTD PARSE-NS)" nil nil)
 (autoload 'xml-parse-region "xml" "\
 Parse the region from BEG to END in BUFFER.
 Return the XML parse tree, or raise an error if the region does
@@ -39987,19 +35539,15 @@ Both features can be combined by providing a cons cell
 
   (symbol-qnames . ALIST).
 
-\(fn &optional BEG END BUFFER PARSE-DTD PARSE-NS)" nil nil)
-
+(fn &optional BEG END BUFFER PARSE-DTD PARSE-NS)" nil nil)
 (autoload 'xml-remove-comments "xml" "\
 Remove XML/HTML comments in the region between BEG and END.
 All text between the <!-- ... --> markers will be removed.
 
-\(fn BEG END)" nil nil)
-
+(fn BEG END)" nil nil)
 (register-definition-prefixes "xml" '("xml-"))
 
-;;;***
 
-;;;### (autoloads nil "xmltok" "nxml/xmltok.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/xmltok.el
 
 (autoload 'xmltok-get-declared-encoding-position "xmltok" "\
@@ -40013,40 +35561,31 @@ If there is XML that is not well-formed that looks 
like an XML
 declaration, return nil.  Otherwise, return t.
 If LIMIT is non-nil, then do not consider characters beyond LIMIT.
 
-\(fn &optional LIMIT)" nil nil)
-
+(fn &optional LIMIT)" nil nil)
 (register-definition-prefixes "xmltok" '("xmltok-"))
 
-;;;***
 
-;;;### (autoloads nil "xref" "progmodes/xref.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/xref.el
-(push (purecopy '(xref 1 4 1)) package--builtin-versions)
 
+(push (purecopy '(xref 1 4 1)) package--builtin-versions)
 (autoload 'xref-find-backend "xref" nil nil nil)
-
-(define-obsolete-function-alias 'xref-pop-marker-stack #'xref-go-back "29.1")
-
+(define-obsolete-function-alias 'xref-pop-marker-stack #'xref-go-back "\
+29.1")
 (autoload 'xref-go-back "xref" "\
 Go back to the previous position in xref history.
 To undo, use \\[xref-go-forward]." t nil)
-
 (autoload 'xref-go-forward "xref" "\
 Got to the point where a previous \\[xref-go-back] was invoked." t nil)
-
 (autoload 'xref-marker-stack-empty-p "xref" "\
 Whether the xref back-history is empty." nil nil)
-
 (autoload 'xref-forward-history-empty-p "xref" "\
 Whether the xref forward-history is empty." nil nil)
-
 (autoload 'xref-show-xrefs "xref" "\
 Display some Xref values produced by FETCHER using DISPLAY-ACTION.
 The meanings of both arguments are the same as documented in
 `xref-show-xrefs-function'.
 
-\(fn FETCHER DISPLAY-ACTION)" nil nil)
-
+(fn FETCHER DISPLAY-ACTION)" nil nil)
 (autoload 'xref-find-definitions "xref" "\
 Find the definition of the identifier at point.
 With prefix argument or when there's no identifier at point,
@@ -40059,18 +35598,15 @@ buffer where the user can select from the list.
 
 Use \\[xref-go-back] to return back to where you invoked this command.
 
-\(fn IDENTIFIER)" t nil)
-
+(fn IDENTIFIER)" t nil)
 (autoload 'xref-find-definitions-other-window "xref" "\
 Like `xref-find-definitions' but switch to the other window.
 
-\(fn IDENTIFIER)" t nil)
-
+(fn IDENTIFIER)" t nil)
 (autoload 'xref-find-definitions-other-frame "xref" "\
 Like `xref-find-definitions' but switch to the other frame.
 
-\(fn IDENTIFIER)" t nil)
-
+(fn IDENTIFIER)" t nil)
 (autoload 'xref-find-references "xref" "\
 Find references to the identifier at point.
 This command might prompt for the identifier as needed, perhaps
@@ -40079,27 +35615,24 @@ With prefix argument, or if 
`xref-prompt-for-identifier' is t,
 always prompt for the identifier.  If `xref-prompt-for-identifier'
 is nil, prompt only if there's no usable symbol at point.
 
-\(fn IDENTIFIER)" t nil)
-
+(fn IDENTIFIER)" t nil)
 (autoload 'xref-find-definitions-at-mouse "xref" "\
 Find the definition of identifier at or around mouse click.
 This command is intended to be bound to a mouse event.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (autoload 'xref-find-references-at-mouse "xref" "\
 Find references to the identifier at or around mouse click.
 This command is intended to be bound to a mouse event.
 
-\(fn EVENT)" t nil)
-
+(fn EVENT)" t nil)
 (autoload 'xref-find-apropos "xref" "\
 Find all meaningful symbols that match PATTERN.
 The argument has the same meaning as in `apropos'.
 See `tags-apropos-additional-actions' for how to augment the
 output of this command when the backend is etags.
 
-\(fn PATTERN)" t nil)
+(fn PATTERN)" t nil)
  (define-key esc-map "." #'xref-find-definitions)
  (define-key esc-map "," #'xref-go-back)
  (define-key esc-map [?\C-,] #'xref-go-forward)
@@ -40107,7 +35640,6 @@ output of this command when the backend is etags.
  (define-key esc-map [?\C-.] #'xref-find-apropos)
  (define-key ctl-x-4-map "." #'xref-find-definitions-other-window)
  (define-key ctl-x-5-map "." #'xref-find-definitions-other-frame)
-
 (autoload 'xref-references-in-directory "xref" "\
 Find all references to SYMBOL in directory DIR.
 Return a list of xref values.
@@ -40116,8 +35648,7 @@ This function uses the Semantic Symbol Reference API, 
see
 `semantic-symref-tool-alist' for details on which tools are used,
 and when.
 
-\(fn SYMBOL DIR)" nil nil)
-
+(fn SYMBOL DIR)" nil nil)
 (autoload 'xref-matches-in-directory "xref" "\
 Find all matches for REGEXP in directory DIR.
 Return a list of xref values.
@@ -40125,8 +35656,7 @@ Only files matching some of FILES and none of IGNORES 
are searched.
 FILES is a string with glob patterns separated by spaces.
 IGNORES is a list of glob patterns for files to ignore.
 
-\(fn REGEXP FILES DIR IGNORES)" nil nil)
-
+(fn REGEXP FILES DIR IGNORES)" nil nil)
 (autoload 'xref-matches-in-files "xref" "\
 Find all matches for REGEXP in FILES.
 Return a list of xref values.
@@ -40135,27 +35665,20 @@ FILES must be a list of absolute file names.
 See `xref-search-program' and `xref-search-program-alist' for how
 to control which program to use when looking for matches.
 
-\(fn REGEXP FILES)" nil nil)
-
+(fn REGEXP FILES)" nil nil)
 (register-definition-prefixes "xref" '("xref-"))
 
-;;;***
 
-;;;### (autoloads nil "xscheme" "progmodes/xscheme.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/xscheme.el
 
 (register-definition-prefixes "xscheme" '("default-xscheme-runlight" 
"exit-scheme-interaction-mode" "global-set-scheme-interaction-buffer" "local-" 
"reset-scheme" "run-scheme" "scheme-" "start-scheme" "verify-xscheme-buffer" 
"xscheme-"))
 
-;;;***
 
-;;;### (autoloads nil "xsd-regexp" "nxml/xsd-regexp.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/xsd-regexp.el
 
 (register-definition-prefixes "xsd-regexp" '("xsdre-"))
 
-;;;***
 
-;;;### (autoloads nil "xt-mouse" "xt-mouse.el" (0 0 0 0))
 ;;; Generated autoloads from xt-mouse.el
 
 (defvar xterm-mouse-mode nil "\
@@ -40165,9 +35688,7 @@ for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
 or call the function `xterm-mouse-mode'.")
-
 (custom-autoload 'xterm-mouse-mode "xt-mouse" nil)
-
 (autoload 'xterm-mouse-mode "xt-mouse" "\
 Toggle XTerm mouse mode.
 
@@ -40192,13 +35713,10 @@ evaluate `(default-value \\='xterm-mouse-mode)'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\(fn &optional ARG)" t nil)
-
+(fn &optional ARG)" t nil)
 (register-definition-prefixes "xt-mouse" '("turn-o" "xt-mouse-epoch" 
"xterm-mouse-"))
 
-;;;***
 
-;;;### (autoloads nil "xwidget" "xwidget.el" (0 0 0 0))
 ;;; Generated autoloads from xwidget.el
 
 (autoload 'xwidget-webkit-browse-url "xwidget" "\
@@ -40206,20 +35724,16 @@ Ask xwidget-webkit to browse URL.
 NEW-SESSION specifies whether to create a new xwidget-webkit session.
 Interactively, URL defaults to the string looking like a url around point.
 
-\(fn URL &optional NEW-SESSION)" t nil)
-
+(fn URL &optional NEW-SESSION)" t nil)
 (autoload 'xwidget-webkit-bookmark-jump-handler "xwidget" "\
 Jump to the web page bookmarked by the bookmark record BOOKMARK.
 If `xwidget-webkit-bookmark-jump-new-session' is non-nil, create
 a new xwidget-webkit session, otherwise use an existing session.
 
-\(fn BOOKMARK)" nil nil)
-
+(fn BOOKMARK)" nil nil)
 (register-definition-prefixes "xwidget" '("xwidget-"))
 
-;;;***
 
-;;;### (autoloads nil "yank-media" "yank-media.el" (0 0 0 0))
 ;;; Generated autoloads from yank-media.el
 
 (autoload 'yank-media "yank-media" "\
@@ -40230,7 +35744,6 @@ the `yank-media-handler' mechanism.
 
 Also see `yank-media-types' for a command that lets you explore
 all the different selection types." t nil)
-
 (autoload 'yank-media-handler "yank-media" "\
 Register HANDLER for dealing with `yank-media' actions for TYPES.
 TYPES should be a MIME media type symbol, a regexp, or a list
@@ -40240,183 +35753,41 @@ HANDLER is a function that will be called with two 
arguments: The
 MIME type (a symbol on the form `image/png') and the selection
 data (a string).
 
-\(fn TYPES HANDLER)" nil nil)
-
+(fn TYPES HANDLER)" nil nil)
 (register-definition-prefixes "yank-media" '("yank-media-"))
 
-;;;***
 
-;;;### (autoloads nil "yenc" "mail/yenc.el" (0 0 0 0))
 ;;; Generated autoloads from mail/yenc.el
 
 (autoload 'yenc-decode-region "yenc" "\
 Yenc decode region between START and END using an internal decoder.
 
-\(fn START END)" t nil)
-
+(fn START END)" t nil)
 (autoload 'yenc-extract-filename "yenc" "\
 Extract file name from an yenc header." nil nil)
-
 (register-definition-prefixes "yenc" '("yenc-"))
 
-;;;***
 
-;;;### (autoloads nil "zeroconf" "net/zeroconf.el" (0 0 0 0))
 ;;; Generated autoloads from net/zeroconf.el
 
 (register-definition-prefixes "zeroconf" '("zeroconf-"))
 
-;;;***
 
-;;;### (autoloads nil "zone" "play/zone.el" (0 0 0 0))
 ;;; Generated autoloads from play/zone.el
 
 (autoload 'zone "zone" "\
 Zone out, completely." t nil)
-
 (register-definition-prefixes "zone" '("zone-"))
-
-;;;***
-
-;;;### (autoloads nil nil ("abbrev.el" "bindings.el" "buff-menu.el"
-;;;;;;  "button.el" "calc/calc-aent.el" "calc/calc-embed.el" 
"calc/calc-misc.el"
-;;;;;;  "calc/calc-yank.el" "case-table.el" "cedet/ede/cpp-root.el"
-;;;;;;  "cedet/ede/custom.el" "cedet/ede/dired.el" "cedet/ede/emacs.el"
-;;;;;;  "cedet/ede/files.el" "cedet/ede/generic.el" "cedet/ede/linux.el"
-;;;;;;  "cedet/ede/locate.el" "cedet/ede/make.el" "cedet/ede/speedbar.el"
-;;;;;;  "cedet/ede/system.el" "cedet/ede/util.el" "cedet/semantic/analyze.el"
-;;;;;;  "cedet/semantic/analyze/complete.el" "cedet/semantic/analyze/refs.el"
-;;;;;;  "cedet/semantic/bovine.el" "cedet/semantic/bovine/c-by.el"
-;;;;;;  "cedet/semantic/bovine/c.el" "cedet/semantic/bovine/el.el"
-;;;;;;  "cedet/semantic/bovine/gcc.el" "cedet/semantic/bovine/make-by.el"
-;;;;;;  "cedet/semantic/bovine/make.el" "cedet/semantic/bovine/scm-by.el"
-;;;;;;  "cedet/semantic/bovine/scm.el" "cedet/semantic/complete.el"
-;;;;;;  "cedet/semantic/ctxt.el" "cedet/semantic/db-file.el" 
"cedet/semantic/db-find.el"
-;;;;;;  "cedet/semantic/db-global.el" "cedet/semantic/db-mode.el"
-;;;;;;  "cedet/semantic/db-typecache.el" "cedet/semantic/db.el" 
"cedet/semantic/debug.el"
-;;;;;;  "cedet/semantic/decorate/include.el" "cedet/semantic/decorate/mode.el"
-;;;;;;  "cedet/semantic/dep.el" "cedet/semantic/doc.el" 
"cedet/semantic/edit.el"
-;;;;;;  "cedet/semantic/find.el" "cedet/semantic/format.el" 
"cedet/semantic/grammar-wy.el"
-;;;;;;  "cedet/semantic/grm-wy-boot.el" "cedet/semantic/html.el"
-;;;;;;  "cedet/semantic/ia-sb.el" "cedet/semantic/ia.el" 
"cedet/semantic/idle.el"
-;;;;;;  "cedet/semantic/imenu.el" "cedet/semantic/lex-spp.el" 
"cedet/semantic/lex.el"
-;;;;;;  "cedet/semantic/mru-bookmark.el" "cedet/semantic/scope.el"
-;;;;;;  "cedet/semantic/senator.el" "cedet/semantic/sort.el" 
"cedet/semantic/symref.el"
-;;;;;;  "cedet/semantic/symref/cscope.el" "cedet/semantic/symref/global.el"
-;;;;;;  "cedet/semantic/symref/grep.el" "cedet/semantic/symref/idutils.el"
-;;;;;;  "cedet/semantic/symref/list.el" "cedet/semantic/tag-file.el"
-;;;;;;  "cedet/semantic/tag-ls.el" "cedet/semantic/tag-write.el"
-;;;;;;  "cedet/semantic/tag.el" "cedet/semantic/texi.el" 
"cedet/semantic/util-modes.el"
-;;;;;;  "cedet/semantic/wisent/java-tags.el" 
"cedet/semantic/wisent/javascript.el"
-;;;;;;  "cedet/semantic/wisent/javat-wy.el" "cedet/semantic/wisent/js-wy.el"
-;;;;;;  "cedet/semantic/wisent/python-wy.el" "cedet/semantic/wisent/python.el"
-;;;;;;  "cedet/srecode/compile.el" "cedet/srecode/cpp.el" 
"cedet/srecode/document.el"
-;;;;;;  "cedet/srecode/el.el" "cedet/srecode/expandproto.el" 
"cedet/srecode/getset.el"
-;;;;;;  "cedet/srecode/insert.el" "cedet/srecode/java.el" 
"cedet/srecode/map.el"
-;;;;;;  "cedet/srecode/mode.el" "cedet/srecode/srt-wy.el" 
"cedet/srecode/srt.el"
-;;;;;;  "cedet/srecode/template.el" "cedet/srecode/texi.el" "composite.el"
-;;;;;;  "cus-face.el" "cus-load.el" "cus-start.el" "custom.el" "dired-aux.el"
-;;;;;;  "dired-x.el" "electric.el" "emacs-lisp/backquote.el" 
"emacs-lisp/byte-run.el"
-;;;;;;  "emacs-lisp/cl-extra.el" "emacs-lisp/cl-macs.el" 
"emacs-lisp/cl-preloaded.el"
-;;;;;;  "emacs-lisp/cl-seq.el" "emacs-lisp/debug-early.el" 
"emacs-lisp/easymenu.el"
-;;;;;;  "emacs-lisp/eieio-custom.el" "emacs-lisp/eieio-opt.el" 
"emacs-lisp/float-sup.el"
-;;;;;;  "emacs-lisp/lisp-mode.el" "emacs-lisp/lisp.el" "emacs-lisp/macroexp.el"
-;;;;;;  "emacs-lisp/map-ynp.el" "emacs-lisp/nadvice.el" 
"emacs-lisp/oclosure.el"
-;;;;;;  "emacs-lisp/shorthands.el" "emacs-lisp/syntax.el" "emacs-lisp/timer.el"
-;;;;;;  "env.el" "epa-hook.el" "erc/erc-autoaway.el" "erc/erc-button.el"
-;;;;;;  "erc/erc-capab.el" "erc/erc-compat.el" "erc/erc-dcc.el" 
"erc/erc-desktop-notifications.el"
-;;;;;;  "erc/erc-ezbounce.el" "erc/erc-fill.el" "erc/erc-identd.el"
-;;;;;;  "erc/erc-imenu.el" "erc/erc-join.el" "erc/erc-list.el" "erc/erc-log.el"
-;;;;;;  "erc/erc-match.el" "erc/erc-menu.el" "erc/erc-netsplit.el"
-;;;;;;  "erc/erc-notify.el" "erc/erc-page.el" "erc/erc-pcomplete.el"
-;;;;;;  "erc/erc-replace.el" "erc/erc-ring.el" "erc/erc-services.el"
-;;;;;;  "erc/erc-sound.el" "erc/erc-speedbar.el" "erc/erc-spelling.el"
-;;;;;;  "erc/erc-stamp.el" "erc/erc-status-sidebar.el" "erc/erc-track.el"
-;;;;;;  "erc/erc-truncate.el" "erc/erc-xdcc.el" "eshell/em-alias.el"
-;;;;;;  "eshell/em-banner.el" "eshell/em-basic.el" "eshell/em-cmpl.el"
-;;;;;;  "eshell/em-dirs.el" "eshell/em-elecslash.el" "eshell/em-glob.el"
-;;;;;;  "eshell/em-hist.el" "eshell/em-ls.el" "eshell/em-pred.el"
-;;;;;;  "eshell/em-prompt.el" "eshell/em-rebind.el" "eshell/em-script.el"
-;;;;;;  "eshell/em-smart.el" "eshell/em-term.el" "eshell/em-tramp.el"
-;;;;;;  "eshell/em-unix.el" "eshell/em-xtra.el" "eshell/esh-groups.el"
-;;;;;;  "faces.el" "files.el" "finder-inf.el" "font-core.el" "font-lock.el"
-;;;;;;  "format.el" "frame.el" "help.el" "hfy-cmap.el" "ibuf-ext.el"
-;;;;;;  "indent.el" "international/characters.el" "international/charprop.el"
-;;;;;;  "international/charscript.el" "international/cp51932.el"
-;;;;;;  "international/emoji-labels.el" "international/emoji-zwj.el"
-;;;;;;  "international/eucjp-ms.el" "international/idna-mapping.el"
-;;;;;;  "international/iso-transl.el" "international/mule-cmds.el"
-;;;;;;  "international/mule-conf.el" "international/mule.el" 
"international/uni-bidi.el"
-;;;;;;  "international/uni-brackets.el" "international/uni-category.el"
-;;;;;;  "international/uni-combining.el" "international/uni-comment.el"
-;;;;;;  "international/uni-confusable.el" "international/uni-decimal.el"
-;;;;;;  "international/uni-decomposition.el" "international/uni-digit.el"
-;;;;;;  "international/uni-lowercase.el" "international/uni-mirrored.el"
-;;;;;;  "international/uni-name.el" "international/uni-numeric.el"
-;;;;;;  "international/uni-old-name.el" "international/uni-scripts.el"
-;;;;;;  "international/uni-special-lowercase.el" 
"international/uni-special-titlecase.el"
-;;;;;;  "international/uni-special-uppercase.el" 
"international/uni-titlecase.el"
-;;;;;;  "international/uni-uppercase.el" "isearch.el" "jit-lock.el"
-;;;;;;  "jka-cmpr-hook.el" "keymap.el" "language/burmese.el" "language/cham.el"
-;;;;;;  "language/chinese.el" "language/cyrillic.el" "language/czech.el"
-;;;;;;  "language/english.el" "language/ethiopic.el" "language/european.el"
-;;;;;;  "language/georgian.el" "language/greek.el" "language/hebrew.el"
-;;;;;;  "language/indian.el" "language/japanese.el" "language/khmer.el"
-;;;;;;  "language/korean.el" "language/lao.el" "language/misc-lang.el"
-;;;;;;  "language/romanian.el" "language/sinhala.el" "language/slovak.el"
-;;;;;;  "language/tai-viet.el" "language/thai.el" "language/tibetan.el"
-;;;;;;  "language/utf-8-lang.el" "language/vietnamese.el" "ldefs-boot.el"
-;;;;;;  "leim/ja-dic/ja-dic.el" "leim/leim-list.el" "leim/quail/4Corner.el"
-;;;;;;  "leim/quail/ARRAY30.el" "leim/quail/CCDOSPY.el" 
"leim/quail/CTLau-b5.el"
-;;;;;;  "leim/quail/CTLau.el" "leim/quail/ECDICT.el" "leim/quail/ETZY.el"
-;;;;;;  "leim/quail/PY-b5.el" "leim/quail/PY.el" "leim/quail/Punct-b5.el"
-;;;;;;  "leim/quail/Punct.el" "leim/quail/QJ-b5.el" "leim/quail/QJ.el"
-;;;;;;  "leim/quail/SW.el" "leim/quail/TONEPY.el" "leim/quail/ZIRANMA.el"
-;;;;;;  "leim/quail/ZOZY.el" "leim/quail/arabic.el" "leim/quail/cham.el"
-;;;;;;  "leim/quail/compose.el" "leim/quail/croatian.el" 
"leim/quail/cyril-jis.el"
-;;;;;;  "leim/quail/cyrillic.el" "leim/quail/czech.el" "leim/quail/emoji.el"
-;;;;;;  "leim/quail/georgian.el" "leim/quail/greek.el" 
"leim/quail/hanja-jis.el"
-;;;;;;  "leim/quail/hanja.el" "leim/quail/hanja3.el" "leim/quail/hebrew.el"
-;;;;;;  "leim/quail/ipa-praat.el" "leim/quail/latin-alt.el" 
"leim/quail/latin-ltx.el"
-;;;;;;  "leim/quail/latin-post.el" "leim/quail/latin-pre.el" 
"leim/quail/persian.el"
-;;;;;;  "leim/quail/programmer-dvorak.el" "leim/quail/py-punct.el"
-;;;;;;  "leim/quail/pypunct-b5.el" "leim/quail/quick-b5.el" 
"leim/quail/quick-cns.el"
-;;;;;;  "leim/quail/rfc1345.el" "leim/quail/sami.el" "leim/quail/sgml-input.el"
-;;;;;;  "leim/quail/slovak.el" "leim/quail/symbol-ksc.el" 
"leim/quail/tamil-dvorak.el"
-;;;;;;  "leim/quail/tsang-b5.el" "leim/quail/tsang-cns.el" 
"leim/quail/vntelex.el"
-;;;;;;  "leim/quail/vnvni.el" "leim/quail/welsh.el" "loadup.el" 
"mail/blessmail.el"
-;;;;;;  "mail/undigest.el" "menu-bar.el" "mh-e/mh-gnus.el" "minibuffer.el"
-;;;;;;  "mouse.el" "newcomment.el" "obarray.el" "org/ob-core.el"
-;;;;;;  "org/ob-lob.el" "org/ob-matlab.el" "org/ob-tangle.el" "org/ob.el"
-;;;;;;  "org/ol-bbdb.el" "org/ol-irc.el" "org/ol.el" "org/org-archive.el"
-;;;;;;  "org/org-attach.el" "org/org-clock.el" "org/org-colview.el"
-;;;;;;  "org/org-compat.el" "org/org-datetree.el" "org/org-duration.el"
-;;;;;;  "org/org-element.el" "org/org-feed.el" "org/org-footnote.el"
-;;;;;;  "org/org-goto.el" "org/org-id.el" "org/org-indent.el" 
"org/org-install.el"
-;;;;;;  "org/org-keys.el" "org/org-lint.el" "org/org-list.el" "org/org-macs.el"
-;;;;;;  "org/org-mobile.el" "org/org-num.el" "org/org-plot.el" 
"org/org-refile.el"
-;;;;;;  "org/org-table.el" "org/org-timer.el" "org/ox-ascii.el" 
"org/ox-beamer.el"
-;;;;;;  "org/ox-html.el" "org/ox-icalendar.el" "org/ox-latex.el"
-;;;;;;  "org/ox-md.el" "org/ox-odt.el" "org/ox-org.el" "org/ox-publish.el"
-;;;;;;  "org/ox-texinfo.el" "org/ox.el" "paren.el" "progmodes/elisp-mode.el"
-;;;;;;  "progmodes/prog-mode.el" "ps-mule.el" "register.el" "replace.el"
-;;;;;;  "rfn-eshadow.el" "select.el" "simple.el" "startup.el" "subdirs.el"
-;;;;;;  "subr.el" "tab-bar.el" "textmodes/fill.el" "textmodes/makeinfo.el"
-;;;;;;  "textmodes/page.el" "textmodes/paragraphs.el" "textmodes/reftex-auc.el"
-;;;;;;  "textmodes/reftex-cite.el" "textmodes/reftex-dcr.el" 
"textmodes/reftex-global.el"
-;;;;;;  "textmodes/reftex-index.el" "textmodes/reftex-parse.el" 
"textmodes/reftex-ref.el"
-;;;;;;  "textmodes/reftex-sel.el" "textmodes/reftex-toc.el" 
"textmodes/texnfo-upd.el"
-;;;;;;  "textmodes/text-mode.el" "uniquify.el" "vc/ediff-hook.el"
-;;;;;;  "vc/vc-hooks.el" "version.el" "widget.el" "window.el") (0
-;;;;;;  0 0 0))
-
-;;;***
 
+;;; End of scraped data
+
 (provide 'loaddefs)
+
 ;; Local Variables:
 ;; version-control: never
 ;; no-byte-compile: t
 ;; no-update-autoloads: t
 ;; coding: utf-8-emacs-unix
 ;; End:
+
 ;;; loaddefs.el ends here
diff --git a/lisp/leim/quail/indian.el b/lisp/leim/quail/indian.el
index f2d5f9bad4..8fffcc3511 100644
--- a/lisp/leim/quail/indian.el
+++ b/lisp/leim/quail/indian.el
@@ -730,10 +730,10 @@ Full key sequences are listed below:")
  ("`*" ?𑁙)
  ("9"  ?𑁯)
  ("`9" ?9)
- ("`\(" ?𑁚)
+ ("`(" ?𑁚)
  ("0"  ?𑁦)
  ("`0" ?0)
- ("`\)" ?𑁛)
+ ("`)" ?𑁛)
  ("`-" ?𑁜)
  ("`_" ?𑁝)
  ("`=" ?𑁞)
@@ -780,8 +780,8 @@ Full key sequences are listed below:")
  ("P"  ?𑀨)
  ("`p" ?𑁳)
  ("`P" ?𑁱)
- ("`\[" ?𑁴)
- ("`\{" ?𑁲)
+ ("`[" ?𑁴)
+ ("`{" ?𑁲)
  ("a"  ?𑀸)
  ("A"  ?𑀆)
  ("`a" ?𑀅)
@@ -835,5 +835,1132 @@ Full key sequences are listed below:")
  ("`/" ?𑁿)
  )
 
+(quail-define-package
+ "kaithi" "Kaithi" "𑂍𑂶" t "Kaithi phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+("``" ?₹)
+("1"  ?१)
+("`1" ?1)
+("2"  ?२)
+("`2" ?2)
+("3"  ?३)
+("`3" ?3)
+("4"  ?४)
+("`4" ?4)
+("5"  ?५)
+("`5" ?5)
+("6"  ?६)
+("`6" ?6)
+("7"  ?७)
+("`7" ?7)
+("8"  ?८)
+("`8" ?8)
+("9"  ?९)
+("`9" ?9)
+("0"  ?०)
+("`0" ?0)
+("`)" ?𑂻)
+("`\\" ?𑃀)
+("`|" ?𑃁)
+("`"  ?𑂗)
+("q"  ?𑂗)
+("Q"  ?𑂘)
+("w"  ?𑂙)
+("W"  ?𑂛)
+("`w" ?𑂚)
+("`W" ?𑂜)
+("e"  ?𑂵)
+("E"  ?𑂶)
+("`e" ?𑂉)
+("`E" ?𑂊)
+("r"  ?𑂩)
+("R"  ?𑃂)
+("t"  ?𑂞)
+("T"  ?𑂟)
+("y"  ?𑂨)
+("Y"  ?⸱)
+("u"  ?𑂳)
+("U"  ?𑂴)
+("`u" ?𑂇)
+("`U" ?𑂈)
+("i"  ?𑂱)
+("I"  ?𑂲)
+("`i" ?𑂅)
+("`I" ?𑂆)
+("o"  ?𑂷)
+("O"  ?𑂸)
+("`o" ?𑂋)
+("`O" ?𑂌)
+("p"  ?𑂣)
+("P"  ?𑂤)
+("a"  ?𑂰)
+("A"  ?𑂄)
+("`a" ?𑂃)
+("s"  ?𑂮)
+("S"  ?𑂬)
+("d"  ?𑂠)
+("D"  ?𑂡)
+("`d" ?𑂼)
+("`D" #x110BD) ; Kaithi Number Sign
+("f"  ?𑂹)
+("F" #x110CD) ; Kaithi Number Sign Above
+("`f" ?𑂾)
+("`F" ?𑂿)
+("g"  ?𑂏)
+("G"  ?𑂐)
+("h"  ?𑂯)
+("H"  ?𑂂)
+("j"  ?𑂔)
+("J"  ?𑂕)
+("k"  ?𑂍)
+("K"  ?𑂎)
+("l"  ?𑂪)
+("z"  ?𑂖)
+("Z"  ?𑂑)
+("x"  ?𑂭)
+("X"  ?𑂺)
+("c"  ?𑂒)
+("C"  ?𑂓)
+("`c" #x200C)  ; ZWNJ
+("`C" #x200D)  ; ZWJ
+("v"  ?𑂫)
+("b"  ?𑂥)
+("B"  ?𑂦)
+("n"  ?𑂢)
+("N"  ?𑂝)
+("m"  ?𑂧)
+("M"  ?𑂁)
+("`m" ?𑂀)
+)
+
+(quail-define-package
+ "tirhuta" "Tirhuta" "𑒞𑒱" t "Tirhuta phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+("``" ?₹)
+("1"  ?𑓑)
+("`1" ?1)
+("2"  ?𑓒)
+("`2" ?2)
+("3"  ?𑓓)
+("`3" ?3)
+("4"  ?𑓔)
+("`4" ?4)
+("5"  ?𑓕)
+("`5" ?5)
+("6"  ?𑓖)
+("`6" ?6)
+("7"  ?𑓗)
+("`7" ?7)
+("8"  ?𑓘)
+("`8" ?8)
+("9"  ?𑓙)
+("`9" ?9)
+("0"  ?𑓐)
+("`0" ?0)
+("`)" ?𑓆)
+("`\\" ?।)
+("`|" ?॥)
+("`"  ?𑒙)
+("q"  ?𑒙)
+("Q"  ?𑒚)
+("w"  ?𑒛)
+("W"  ?𑒜)
+("e"  ?𑒺)
+("E"  ?𑒹)
+("`e" ?𑒋)
+("r"  ?𑒩)
+("R"  ?𑒵)
+("`r" ?𑒇)
+("t"  ?𑒞)
+("T"  ?𑒟)
+("y"  ?𑒨)
+("Y"  ?𑒻)
+("`y" ?𑒌)
+("u"  ?𑒳)
+("U"  ?𑒴)
+("`u" ?𑒅)
+("`U" ?𑒆)
+("i"  ?𑒱)
+("I"  ?𑒲)
+("`i" ?𑒃)
+("`I" ?𑒄)
+("o"  ?𑒽)
+("O"  ?𑒼)
+("`o" ?𑒍)
+("p"  ?𑒣)
+("P"  ?𑒤)
+("a"  ?𑒰)
+("A"  ?𑒂)
+("`a" ?𑒁)
+("s"  ?𑒮)
+("S"  ?𑒬)
+("d"  ?𑒠)
+("D"  ?𑒡)
+("f"  ?𑓂)
+("F" ?𑒶)
+("`f" ?𑒈)
+("g"  ?𑒑)
+("G"  ?𑒒)
+("h"  ?𑒯)
+("H"  ?𑓁)
+("j"  ?𑒖)
+("J"  ?𑒗)
+("k"  ?𑒏)
+("K"  ?𑒐)
+("l"  ?𑒪)
+("L" ?𑒷)
+("`l" ?𑒉)
+("z"  ?𑒘)
+("Z"  ?𑒓)
+("`z" ?𑒸)
+("`Z" ?𑒊)
+("x"  ?𑒭)
+("X"  ?𑓃)
+("c"  ?𑒔)
+("C"  ?𑒕)
+("`c" #x200C)  ; ZWNJ
+("v"  ?𑒫)
+("V" ?𑒾)
+("`v" ?𑒎)
+("b"  ?𑒥)
+("B"  ?𑒦)
+("`b" ?𑒀)
+("`B" ?𑓄)
+("n"  ?𑒢)
+("N"  ?𑒝)
+("`n" ?𑓇)
+("`N" ?𑓅)
+("m"  ?𑒧)
+("M"  ?𑓀)
+("`m" ?𑒿)
+)
+
+(quail-define-package
+ "sharada" "Sharada" "𑆯𑆳" t "Sharada phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+("``" ?₹)
+("1"  ?𑇑)
+("`1" ?1)
+("2"  ?𑇒)
+("`2" ?2)
+("3"  ?𑇓)
+("`3" ?3)
+("4"  ?𑇔)
+("`4" ?4)
+("5"  ?𑇕)
+("`5" ?5)
+("6"  ?𑇖)
+("`6" ?6)
+("7"  ?𑇗)
+("`7" ?7)
+("8"  ?𑇘)
+("`8" ?8)
+("9"  ?𑇙)
+("`9" ?9)
+("0"  ?𑇐)
+("`0" ?0)
+("`)" ?𑇇)
+("`\\" ?𑇅)
+("`|" ?𑇆)
+("`"  ?𑆛)
+("q"  ?𑆛)
+("Q"  ?𑆜)
+("`q" ?𑇈)
+("`Q" ?𑇉)
+("w"  ?𑆝)
+("W"  ?𑆞)
+("`w" ?𑇋)
+("`W" ?𑇍)
+("e"  ?𑆼)
+("E"  ?𑆽)
+("`e" ?𑆍)
+("`E" ?𑆎)
+("r"  ?𑆫)
+("R"  ?𑆸)
+("`r" ?𑆉)
+("`R" ?𑇎)
+("t"  ?𑆠)
+("T"  ?𑆡)
+("y"  ?𑆪)
+("u"  ?𑆶)
+("U"  ?𑆷)
+("`u" ?𑆇)
+("`U" ?𑆈)
+("i"  ?𑆴)
+("I"  ?𑆵)
+("`i" ?𑆅)
+("`I" ?𑆆)
+("o"  ?𑆾)
+("O"  ?𑆿)
+("`o" ?𑆏)
+("`O" ?𑆐)
+("p"  ?𑆥)
+("P"  ?𑆦)
+("`p" ?𑇃)
+("a"  ?𑆳)
+("A"  ?𑆄)
+("`a" ?𑆃)
+("s"  ?𑆱)
+("S"  ?𑆯)
+("d"  ?𑆢)
+("D"  ?𑆣)
+("`d" ?𑇚)
+("`D" ?𑇛)
+("f"  ?𑇀)
+("F" ?𑆹)
+("`f" ?𑆊)
+("`F" ?𑇌)
+("g"  ?𑆓)
+("G"  ?𑆔)
+("`g" ?𑇜)
+("`G" ?𑇝)
+("h"  ?𑆲)
+("H"  ?𑆂)
+("`h" ?𑇞)
+("`H" ?𑇟)
+("j"  ?𑆘)
+("J"  ?𑆙)
+("`j" ?᳘)
+("`J" ?᳕)
+("k"  ?𑆑)
+("K"  ?𑆒)
+("`k" ?𑇂)
+("l"  ?𑆬)
+("L" ?𑆭)
+("`l" ?𑆺)
+("`L" ?𑆋)
+("z"  ?𑆚)
+("Z"  ?𑆕)
+("`z" ?𑆻)
+("`Z" ?𑆌)
+("x"  ?𑆰)
+("X"  ?𑇊)
+("c"  ?𑆖)
+("C"  ?𑆗)
+("`c" #x200C)  ; ZWNJ
+("v"  ?𑆮)
+("b"  ?𑆧)
+("B"  ?𑆨)
+("n"  ?𑆤)
+("N"  ?𑆟)
+("`n" ?𑇄)
+("`N" ?𑇁)
+("m"  ?𑆩)
+("M"  ?𑆁)
+("`m" ?𑆀)
+("`M" ?𑇏)
+)
+
+(quail-define-package
+ "siddham" "Sharada" "𑖭𑖰" t "Siddham phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+("``" ?₹)
+("`1" ?𑗊)
+("`!" ?𑗔)
+("`2" ?𑗋)
+("`@" ?𑗕)
+("`3" ?𑗌)
+("`#" ?𑗖)
+("`4" ?𑗍)
+("`$" ?𑗗)
+("`5" ?𑗎)
+("`%" ?𑗅)
+("`6" ?𑗏)
+("`^" ?𑗆)
+("`7" ?𑗐)
+("`&" ?𑗇)
+("`8" ?𑗑)
+("`*" ?𑗈)
+("`9" ?𑗒)
+("`(" ?𑗉)
+("`0" ?𑗓)
+("`)" ?𑗄)
+("`\\" ?𑗂)
+("`|" ?𑗃)
+("`"  ?𑖘)
+("q"  ?𑖘)
+("Q"  ?𑖙)
+("`q" ?𑗘)
+("`Q" ?𑗙)
+("w"  ?𑖚)
+("W"  ?𑖛)
+("`w" ?𑗚)
+("`W" ?𑗛)
+("e"  ?𑖸)
+("E"  ?𑖹)
+("`e" ?𑖊)
+("`E" ?𑖋)
+("r"  ?𑖨)
+("R"  ?𑖴)
+("`r" ?𑖆)
+("t"  ?𑖝)
+("T"  ?𑖞)
+("`t" ?𑗜)
+("`T" ?𑗝)
+("y"  ?𑖧)
+("u"  ?𑖲)
+("U"  ?𑖳)
+("`u" ?𑖄)
+("`U" ?𑖅)
+("i"  ?𑖰)
+("I"  ?𑖱)
+("`i" ?𑖂)
+("`I" ?𑖃)
+("o"  ?𑖺)
+("O"  ?𑖻)
+("`o" ?𑖌)
+("`O" ?𑖍)
+("p"  ?𑖢)
+("P"  ?𑖣)
+("a"  ?𑖯)
+("A"  ?𑖁)
+("`a" ?𑖀)
+("s"  ?𑖭)
+("S"  ?𑖫)
+("d"  ?𑖟)
+("D"  ?𑖠)
+("`d" ?𑗁)
+("f"  ?𑖿)
+("F" ?𑖵)
+("`f" ?𑖇)
+("g"  ?𑖐)
+("G"  ?𑖑)
+("h"  ?𑖮)
+("H"  ?𑖾)
+("j"  ?𑖕)
+("J"  ?𑖖)
+("k"  ?𑖎)
+("K"  ?𑖏)
+("l"  ?𑖩)
+("L" ?𑖈)
+("`l" ?𑖉)
+("z"  ?𑖗)
+("Z"  ?𑖒)
+("x"  ?𑖬)
+("X"  ?𑗀)
+("c"  ?𑖓)
+("C"  ?𑖔)
+("`c" #x200C)  ; ZWNJ
+("v"  ?𑖪)
+("b"  ?𑖤)
+("B"  ?𑖥)
+("n"  ?𑖡)
+("N"  ?𑖜)
+("m"  ?𑖦)
+("M"  ?𑖽)
+("`m" ?𑖼)
+)
 
+
+(quail-define-package
+ "syloti-nagri" "Syloti Nagri" "ꠍꠤ" t "Syloti Nagri phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+("``" ?₹)
+("`~" ?৳)
+("1"  ?১)
+("`1" ?1)
+("2"  ?২)
+("`2" ?2)
+("3"  ?৩)
+("`3" ?3)
+("4"  ?৪)
+("`4" ?4)
+("5"  ?৫)
+("`5" ?5)
+("6"  ?৬)
+("`6" ?6)
+("7"  ?৭)
+("`7" ?7)
+("8"  ?৮)
+("`8" ?8)
+("9"  ?৯)
+("`9" ?9)
+("0"  ?০)
+("`0" ?0)
+("`\\" ?𑇅)
+("`|" ?𑇆)
+("`"  ?ꠐ)
+("q"  ?ꠐ)
+("Q"  ?ꠑ)
+("`q" ?꠨)
+("`Q" ?꠩)
+("w"  ?ꠒ)
+("W"  ?ꠓ)
+("`w" ?꠪)
+("`W" ?꠫)
+("e"  ?ꠦ)
+("E"  ?ꠄ)
+("r"  ?ꠞ)
+("R"  ?ꠠ)
+("t"  ?ꠔ)
+("T"  ?ꠕ)
+("y"  ?ꠂ)
+("u"  ?ꠥ)
+("U"  ?ꠃ)
+("i"  ?ꠤ)
+("I"  ?ꠁ)
+("o"  ?ꠧ)
+("O"  ?ꠅ)
+("p"  ?ꠙ)
+("P"  ?ꠚ)
+("a"  ?ꠣ)
+("A"  ?ꠀ)
+("s"  ?ꠡ)
+("d"  ?ꠖ)
+("D"  ?ꠗ)
+("f"  ?꠆)
+("F" ?꠬)
+("g"  ?ꠉ)
+("G"  ?ꠊ)
+("h"  ?ꠢ)
+("j"  ?ꠎ)
+("J"  ?ꠏ)
+("k"  ?ꠇ)
+("K"  ?ꠈ)
+("l"  ?ꠟ)
+("c"  ?ꠌ)
+("C"  ?ꠍ)
+("`c" #x200C)  ; ZWNJ
+("b"  ?ꠛ)
+("B"  ?ꠜ)
+("n"  ?ꠘ)
+("m"  ?ꠝ)
+("M"  ?ꠋ)
+)
+
+(quail-define-package
+ "modi" "Modi" "𑘦𑘻" t "Modi phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+("``" ?₹)
+("1"  ?𑙑)
+("`1" ?1)
+("2"  ?𑙒)
+("`2" ?2)
+("3"  ?𑙓)
+("`3" ?3)
+("4"  ?𑙔)
+("`4" ?4)
+("5"  ?𑙕)
+("`5" ?5)
+("6"  ?𑙖)
+("`6" ?6)
+("7"  ?𑙗)
+("`7" ?7)
+("8"  ?𑙘)
+("`8" ?8)
+("9"  ?𑙙)
+("`9" ?9)
+("0"  ?𑙐)
+("`0" ?0)
+("`)" ?𑙃)
+("`\\" ?𑙁)
+("`|" ?𑙂)
+("`"  ?𑘘)
+("q"  ?𑘘)
+("Q"  ?𑘙)
+("`q" ?𑙄)
+("w"  ?𑘚)
+("W"  ?𑘛)
+("e"  ?𑘹)
+("E"  ?𑘺)
+("`e" ?𑘊)
+("`E" ?𑘋)
+("r"  ?𑘨)
+("R"  ?𑘵)
+("`r" ?𑘆)
+("t"  ?𑘝)
+("T"  ?𑘞)
+("y"  ?𑘧)
+("u"  ?𑘳)
+("U"  ?𑘴)
+("`u" ?𑘄)
+("`U" ?𑘅)
+("i"  ?𑘱)
+("I"  ?𑘲)
+("`i" ?𑘂)
+("`I" ?𑘃)
+("o"  ?𑘻)
+("O"  ?𑘼)
+("`o" ?𑘌)
+("`O" ?𑘍)
+("p"  ?𑘢)
+("P"  ?𑘣)
+("a"  ?𑘰)
+("A"  ?𑘁)
+("`a" ?𑘀)
+("s"  ?𑘭)
+("S"  ?𑘫)
+("d"  ?𑘟)
+("D"  ?𑘠)
+("f"  ?𑘿)
+("F"  ?𑘶)
+("`f" ?𑘇)
+("g"  ?𑘐)
+("G"  ?𑘑)
+("h"  ?𑘮)
+("H"  ?𑘾)
+("j"  ?𑘕)
+("J"  ?𑘖)
+("k"  ?𑘎)
+("K"  ?𑘏)
+("l"  ?𑘩)
+("L"  ?𑘯)
+("`l" ?𑘷)
+("`L" ?𑘈)
+("z"  ?𑘗)
+("Z"  ?𑘒)
+("`z" ?𑘸)
+("`Z" ?𑘉)
+("x"  ?𑘬)
+("X"  ?𑙀)
+("c"  ?𑘓)
+("C"  ?𑘔)
+("`c" #x200C)  ; ZWNJ
+("v"  ?𑘪)
+("b"  ?𑘤)
+("B"  ?𑘥)
+("n"  ?𑘡)
+("N"  ?𑘜)
+("m"  ?𑘦)
+("M"  ?𑘽)
+)
+
+(quail-define-package
+ "odia" "Odia" "ଓ" t "Odia phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+("``" ?₹)
+("1"  ?୧)
+("`1" ?1)
+("`!" ?୲)
+("2"  ?୨)
+("`2" ?2)
+("`@" ?୳)
+("3"  ?୩)
+("`3" ?3)
+("`#" ?୴)
+("4"  ?୪)
+("`4" ?4)
+("`$" ?୵)
+("5"  ?୫)
+("`5" ?5)
+("`%" ?୶)
+("6"  ?୬)
+("`6" ?6)
+("`^" ?୷)
+("7"  ?୭)
+("`7" ?7)
+("8"  ?୮)
+("`8" ?8)
+("9"  ?୯)
+("`9" ?9)
+("0"  ?୦)
+("`0" ?0)
+("`\\" ?।)
+("`|" ?॥)
+("`"  ?ଟ)
+("q"  ?ଟ)
+("Q"  ?ଠ)
+("`q" ?୰)
+("`Q" ?୕)
+("w"  ?ଡ)
+("W"  ?ଢ)
+("`w" ?ଡ଼)
+("`W" ?ଢ଼)
+("e"  ?େ)
+("E"  ?ୈ)
+("`e" ?ଏ)
+("`E" ?ଐ)
+("r"  ?ର)
+("R"  ?ୃ)
+("`r" ?ଋ)
+("t"  ?ତ)
+("T"  ?ଥ)
+("`t" ?ୖ)
+("`T" ?ୗ)
+("y"  ?ଯ)
+("Y"  ?ୟ)
+("u"  ?ୁ)
+("U"  ?ୂ)
+("`u" ?ଉ)
+("`U" ?ଊ)
+("i"  ?ି)
+("I"  ?ୀ)
+("`i" ?ଇ)
+("`I" ?ଈ)
+("o"  ?ୋ)
+("O"  ?ୌ)
+("`o" ?ଓ)
+("`O" ?ଔ)
+("p"  ?ପ)
+("P"  ?ଫ)
+("a"  ?ା)
+("A"  ?ଆ)
+("`a" ?ଅ)
+("s"  ?ସ)
+("S"  ?ଶ)
+("d"  ?ଦ)
+("D"  ?ଧ)
+("f"  ?୍)
+("F"  ?ୄ)
+("`f" ?ୠ)
+("g"  ?ଗ)
+("G"  ?ଘ)
+("h"  ?ହ)
+("H"  ?ଃ)
+("j"  ?ଜ)
+("J"  ?ଝ)
+("k"  ?କ)
+("K"  ?ଖ)
+("l"  ?ଲ)
+("L"  ?ଳ)
+("`l" ?ୢ)
+("`L" ?ଌ)
+("z"  ?ଞ)
+("Z"  ?ଙ)
+("`z" ?ୣ)
+("`Z" ?ୡ)
+("x"  ?ଷ)
+("X"  ?଼)
+("c"  ?ଚ)
+("C"  ?ଛ)
+("`c" #x200C)  ; ZWNJ
+("`C" #x200D)  ; ZWJ
+("v"  ?ଵ)
+("V"  ?ୱ)
+("b"  ?ବ)
+("B"  ?ଭ)
+("n"  ?ନ)
+("N"  ?ଣ)
+("m"  ?ମ)
+("M"  ?ଂ)
+("`m" ?ଁ)
+("`M" ?ଽ)
+)
+
+(quail-define-package
+ "limbu" "Limbu" "ᤕ" t "Limbu phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+("``" ?₹)
+("1"  ?᥇)
+("`1" ?1)
+("`!" ?᥄)
+("2"  ?᥈)
+("`2" ?2)
+("3"  ?᥉)
+("`3" ?3)
+("4"  ?᥊)
+("`4" ?4)
+("5"  ?᥋)
+("`5" ?5)
+("6"  ?᥌)
+("`6" ?6)
+("7"  ?᥍)
+("`7" ?7)
+("8"  ?᥎)
+("`8" ?8)
+("9"  ?᥏)
+("`9" ?9)
+("0"  ?᥆)
+("`0" ?0)
+("`\\" ?।)
+("`|" ?॥)
+("`"  ?ᤘ)
+("q"  ?ᤧ)
+("Q"  ?ᤨ)
+("`q" ?᥀)
+("w"  ?ᤘ)
+("W"  ?ᤫ)
+("e"  ?ᤣ)
+("E"  ?ᤤ)
+("r"  ?ᤖ)
+("R"  ?ᤷ)
+("`r" ?ᤪ)
+("t"  ?ᤋ)
+("T"  ?ᤌ)
+("`t" ?ᤳ)
+("`T" ?ᤞ)
+("y"  ?ᤕ)
+("Y"  ?ᤩ)
+("u"  ?ᤢ)
+("i"  ?ᤡ)
+("o"  ?ᤥ)
+("O"  ?ᤦ)
+("p"  ?ᤐ)
+("P"  ?ᤑ)
+("`p" ?ᤵ)
+("a"  ?ᤠ)
+("A"  ?ᤀ)
+("s"  ?ᤛ)
+("S"  ?ᤙ)
+("d"  ?ᤍ)
+("D"  ?ᤎ)
+("f"  ?᤻)
+("g"  ?ᤃ)
+("G"  ?ᤄ)
+("`g" ?ᤝ)
+("h"  ?ᤜ)
+("j"  ?ᤈ)
+("J"  ?ᤉ)
+("k"  ?ᤁ)
+("K"  ?ᤂ)
+("`k" ?ᤰ)
+("l"  ?ᤗ)
+("L"  ?ᤸ)
+("z"  ?ᤊ)
+("Z"  ?ᤅ)
+("x"  ?ᤚ)
+("X"  ?᤹)
+("c"  ?ᤆ)
+("C"  ?ᤇ)
+("`c" #x200C)  ; ZWNJ
+("v"  ?᤺)
+("b"  ?ᤒ)
+("B"  ?ᤓ)
+("n"  ?ᤏ)
+("N"  ?ᤴ)
+("m"  ?ᤔ)
+("M"  ?ᤱ)
+("`m" ?ᤲ)
+("`?" ?᥅)
+)
+
+(quail-define-package
+ "grantha" "Grantha" "𑌗𑍍𑌰" t "Grantha phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("``" ?₹)
+ ("1"  ?௧)
+ ("`1" ?1)
+ ("`!" ?𑍧)
+ ("2"  ?௨)
+ ("`2" ?2)
+ ("`@" ?𑍨)
+ ("3"  ?௩)
+ ("`3" ?3)
+ ("`#" ?𑍩)
+ ("4"  ?௪)
+ ("`4" ?4)
+ ("`$" ?𑍪)
+ ("5"  ?௫)
+ ("`5" ?5)
+ ("`%" ?𑍫)
+ ("6"  ?௬)
+ ("`6" ?6)
+ ("`^" ?𑍬)
+ ("7"  ?௭)
+ ("`7" ?7)
+ ("8"  ?௮)
+ ("`8" ?8)
+ ("9"  ?௯)
+ ("`9" ?9)
+ ("0"  ?௦)
+ ("`0" ?0)
+ ("q"  ?𑌟)
+ ("Q"  ?𑌠)
+ ("`q" ?𑍐)
+ ("`Q" ?𑍝)
+ ("w"  ?𑌡)
+ ("W"  ?𑌢)
+ ("`w" ?𑍞)
+ ("`W" ?𑍟)
+ ("e"  ?𑍇)
+ ("E"  ?𑍈)
+ ("`e" ?𑌏)
+ ("`E" ?𑌐)
+ ("r"  ?𑌰)
+ ("R"  ?𑍃)
+ ("`r" ?𑌋)
+ ("t"  ?𑌤)
+ ("T"  ?𑌥)
+ ("`t" ?𑍗)
+ ("y"  ?𑌯)
+ ("u"  ?𑍁)
+ ("U"  ?𑍂)
+ ("`u" ?𑌉)
+ ("`U" ?𑌊)
+ ("i"  ?𑌿)
+ ("I"  ?𑍀)
+ ("`i" ?𑌇)
+ ("`I" ?𑌈)
+ ("o"  ?𑍋)
+ ("O"  ?𑍌)
+ ("`o" ?𑌓)
+ ("`O" ?𑌔)
+ ("p"  ?𑌪)
+ ("P"  ?𑌫)
+ ("`p" ?𑍴)
+ ("a"  ?𑌾)
+ ("A"  ?𑌆)
+ ("`a" ?𑌅)
+ ("`A" ?𑍰)
+ ("s"  ?𑌸)
+ ("S"  ?𑌶)
+ ("d"  ?𑌦)
+ ("D"  ?𑌧)
+ ("f"  ?𑍍)
+ ("F"  ?𑍄)
+ ("`f" ?𑍠)
+ ("g"  ?𑌗)
+ ("G" ?𑌘)
+ ("h"  ?𑌹)
+ ("H"  ?𑌃)
+ ("j"  ?𑌜)
+ ("J"  ?𑌝)
+ ("k"  ?𑌕)
+ ("K"  ?𑌖)
+ ("`k" ?𑍱)
+ ("l"  ?𑌲)
+ ("L"  ?𑌳)
+ ("`l" ?𑍢)
+ ("`L" ?𑌌)
+ ("z"  ?𑌞)
+ ("Z"  ?𑌙)
+ ("`z" ?𑍣)
+ ("`Z" ?𑍡)
+ ("x"  ?𑌷)
+ ("X"  ?𑌼)
+ ("`x" ?𑌻)
+ ("c"  ?𑌚)
+ ("C"  ?𑌛)
+ ("`c" #x200C)  ; ZWNJ
+ ("v"  ?𑌵)
+ ("V"  ?𑌽)
+ ("`v" ?𑍳)
+ ("b"  ?𑌬)
+ ("B"  ?𑌭)
+ ("n"  ?𑌨)
+ ("N"  ?𑌣)
+ ("`n" ?𑍲)
+ ("m"  ?𑌮)
+ ("M"  ?𑌂)
+ ("`m" ?𑌁)
+ ("`M" ?𑌀))
+
+(quail-define-package
+ "lepcha" "Lepcha" "ᰛᰩᰵ" t "Lepcha phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("``" ?₹)
+ ("1"  ?᱁)
+ ("`1" ?1)
+ ("2"  ?᱂)
+ ("`2" ?2)
+ ("3"  ?᱃)
+ ("`3" ?3)
+ ("4"  ?᱄)
+ ("`4" ?4)
+ ("5"  ?᱅)
+ ("`5" ?5)
+ ("6"  ?᱆)
+ ("`6" ?6)
+ ("7"  ?᱇)
+ ("`7" ?7)
+ ("8"  ?᱈)
+ ("`8" ?8)
+ ("9"  ?᱉)
+ ("`9" ?9)
+ ("0"  ?᱀)
+ ("`0" ?0)
+ ("`\\" ?᰻)
+ ("`|" ?᰼)
+ ("`"  ?ᱍ)
+ ("q"  ?ᱍ)
+ ("Q"  ?ᱎ)
+ ("`q" ?᰽)
+ ("`Q" ?᰾)
+ ("w"  ?ᰢ)
+ ("W"  ?ᱏ)
+ ("`w" ?᰿)
+ ("e"  ?ᰬ)
+ ("r"  ?ᰛ)
+ ("R"  ?ᰥ)
+ ("`r" ?ᰲ)
+ ("t"  ?ᰊ)
+ ("T"  ?ᰋ)
+ ("`t" ?ᰳ)
+ ("y"  ?ᰚ)
+ ("Y"  ?ᰤ)
+ ("u"  ?ᰪ)
+ ("U"  ?ᰫ)
+ ("i"  ?ᰧ)
+ ("o"  ?ᰨ)
+ ("O"  ?ᰩ)
+ ("p"  ?ᰎ)
+ ("P"  ?ᰏ)
+ ("`p" ?ᰐ)
+ ("`P" ?ᰱ)
+ ("a"  ?ᰦ)
+ ("A"  ?ᰣ)
+ ("s"  ?ᰠ)
+ ("S"  ?ᰡ)
+ ("d"  ?ᰌ)
+ ("f"  ?ᰑ)
+ ("F"  ?ᰒ)
+ ("g"  ?ᰃ)
+ ("G"  ?ᰄ)
+ ("h"  ?ᰝ)
+ ("H"  ?ᰞ)
+ ("j"  ?ᰈ)
+ ("k"  ?ᰀ)
+ ("K"  ?ᰁ)
+ ("`k" ?ᰂ)
+ ("`K" ?ᰭ)
+ ("l"  ?ᰜ)
+ ("L"  ?ᰯ)
+ ("z"  ?ᰉ)
+ ("Z"  ?ᰅ)
+ ("`z" ?ᰴ)
+ ("`Z" ?ᰵ)
+ ("x"  ?ᰶ)
+ ("X"  ?᰷)
+ ("c"  ?ᰆ)
+ ("C"  ?ᰇ)
+ ("`c" #x200C)  ; ZWNJ
+ ("v"  ?ᰟ)
+ ("b"  ?ᰓ)
+ ("B"  ?ᰔ)
+ ("n"  ?ᰍ)
+ ("N"  ?ᰰ)
+ ("m"  ?ᰕ)
+ ("M"  ?ᰖ)
+ ("`m"  ?ᰮ))
+
+(quail-define-package
+ "meetei-mayek" "Meetei Mayek" "ꯃꯤ" t "Meetei Mayek phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("``" ?₹)
+ ("1"  ?꯱)
+ ("`1" ?1)
+ ("2"  ?꯲)
+ ("`2" ?2)
+ ("3"  ?꯳)
+ ("`3" ?3)
+ ("4"  ?꯴)
+ ("`4" ?4)
+ ("5"  ?꯵)
+ ("`5" ?5)
+ ("6"  ?꯶)
+ ("`6" ?6)
+ ("7"  ?꯷)
+ ("`7" ?7)
+ ("8"  ?꯸)
+ ("`8" ?8)
+ ("9"  ?꯹)
+ ("`9" ?9)
+ ("0"  ?꯰)
+ ("`0" ?0)
+ ("`\\" ?꫰)
+ ("`|" ?꯫)
+ ("`"  ?ꫤ)
+ ("q"  ?ꫤ)
+ ("Q"  ?ꫥ)
+ ("w"  ?ꯋ)
+ ("W"  ?ꫦ)
+ ("`w" ?ꫧ)
+ ("e"  ?ꯦ)
+ ("E"  ?ꯩ)
+ ("`e" ?ꫠ)
+ ("r"  ?ꯔ)
+ ("t"  ?ꯇ)
+ ("T"  ?ꯊ)
+ ("`t" ?ꯠ)
+ ("y"  ?ꯌ)
+ ("u"  ?ꯨ)
+ ("U"  ?ꯎ)
+ ("`u" ?ꫬ)
+ ("i"  ?ꯤ)
+ ("I"  ?ꯏ)
+ ("`i" ?ꯢ)
+ ("`I" ?ꫫ)
+ ("o"  ?ꯣ)
+ ("O"  ?ꯧ)
+ ("`o" ?ꫡ)
+ ("`O" ?ꫮ)
+ ("p"  ?ꯄ)
+ ("P"  ?ꯐ)
+ ("`p" ?ꯞ)
+ ("a"  ?ꯥ)
+ ("A"  ?ꯑ)
+ ("`a" ?ꫭ)
+ ("`A" ?ꫯ)
+ ("s"  ?ꯁ)
+ ("S"  ?ꫩ)
+ ("`s" ?ꫪ)
+ ("d"  ?ꯗ)
+ ("D"  ?ꯙ)
+ ("f"  ?꯭)
+ ("F"  ?꫶)
+ ("g"  ?ꯒ)
+ ("G"  ?ꯘ)
+ ("h"  ?ꯍ)
+ ("H"  ?ꫵ)
+ ("j"  ?ꯖ)
+ ("J"  ?ꯓ)
+ ("k"  ?ꯀ)
+ ("K"  ?ꯈ)
+ ("`k" ?ꯛ)
+ ("l"  ?ꯂ)
+ ("L"  ?ꯜ)
+ ("z"  ?ꯉ)
+ ("Z"  ?ꯡ)
+ ("`z" ?ꫣ)
+ ("x"  ?ꯪ)
+ ("c"  ?ꯆ)
+ ("C"  ?ꫢ)
+ ("v"  ?꯬)
+ ("V"  ?ꫳ)
+ ("`v" ?ꫴ)
+ ("b"  ?ꯕ)
+ ("B"  ?ꯚ)
+ ("n"  ?ꯅ)
+ ("N"  ?ꯟ)
+ ("`n" ?ꫨ)
+ ("m"  ?ꯃ)
+ ("M"  ?ꯝ)
+ ("`m" ?ꫲ)
+ ("`?" ?꫱))
+
+(provide 'indian)
 ;;; indian.el ends here
diff --git a/lisp/leim/quail/indonesian.el b/lisp/leim/quail/indonesian.el
new file mode 100644
index 0000000000..8d0d158076
--- /dev/null
+++ b/lisp/leim/quail/indonesian.el
@@ -0,0 +1,557 @@
+;;; indonesian.el --- Quail package for inputting Indonesian characters  -*- 
lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Author: समीर सिंह Sameer Singh <lumarzeli30@gmail.com>
+;; Keywords: multilingual, input method, i18n, Indonesia
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Input methods for Indonesian languages.
+
+;;; Code:
+
+(require 'quail)
+
+;; This input method supports languages like Buginese, Balinese, Sundanese and
+;; Javanese.
+
+(quail-define-package
+ "balinese" "Balinese" "ᬩ" t "Balinese phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("1"  ?᭑)
+ ("`1" ?1)
+ ("`!" ?᭫)
+ ("2"  ?᭒)
+ ("`2" ?2)
+ ("`@" ?᭬)
+ ("3"  ?᭓)
+ ("`3" ?3)
+ ("`#" ?᭭)
+ ("4"  ?᭔)
+ ("`4" ?4)
+ ("`$" ?᭮)
+ ("5"  ?᭕)
+ ("`5" ?5)
+ ("`%" ?᭯)
+ ("6"  ?᭖)
+ ("`6" ?6)
+ ("`^" ?᭰)
+ ("7"  ?᭗)
+ ("`7" ?7)
+ ("`&" ?᭱)
+ ("8"  ?᭘)
+ ("`8" ?8)
+ ("`*" ?᭲)
+ ("9"  ?᭙)
+ ("`9" ?9)
+ ("`(" ?᭳)
+ ("0"  ?᭐)
+ ("`0" ?0)
+ ("`)" ?᭼)
+ ("`\\" ?᭞)
+ ("`|" ?᭟)
+ ("`"  ?ᬝ)
+ ("q"  ?ᬝ)
+ ("Q"  ?ᬞ)
+ ("`q" ?᭚)
+ ("`Q" ?᭽)
+ ("w"  ?ᬟ)
+ ("W"  ?ᬠ)
+ ("`w" ?᭛)
+ ("`W" ?᭾)
+ ("e"  ?ᬾ)
+ ("E"  ?ᬿ)
+ ("`e" ?ᬏ)
+ ("`E" ?ᬐ)
+ ("r"  ?ᬭ)
+ ("R"  ?ᬃ)
+ ("`r" ?ᬺ)
+ ("`R" ?ᬋ)
+ ("t"  ?ᬢ)
+ ("T"  ?ᬣ)
+ ("`t" ?᭜)
+ ("`T" ?᭝)
+ ("y"  ?ᬬ)
+ ("Y"  ?ᭂ)
+ ("`y" ?ᭃ)
+ ("`Y" ?᭴)
+ ("u"  ?ᬸ)
+ ("U"  ?ᬹ)
+ ("`u" ?ᬉ)
+ ("`U" ?ᬊ)
+ ("i"  ?ᬶ)
+ ("I"  ?ᬷ)
+ ("`i" ?ᬇ)
+ ("`I" ?ᬈ)
+ ("o"  ?ᭀ)
+ ("O"  ?ᭁ)
+ ("`o" ?ᬑ)
+ ("`O" ?ᬒ)
+ ("p"  ?ᬧ)
+ ("P"  ?ᬨ)
+ ("`p" ?ᭈ)
+ ("`P" ?᭠)
+ ("a"  ?ᬵ)
+ ("A"  ?ᬆ)
+ ("`a" ?ᬅ)
+ ("`A" ?᭵)
+ ("s"  ?ᬲ)
+ ("S"  ?ᬰ)
+ ("`s" ?᭡)
+ ("`S" ?᭢)
+ ("d"  ?ᬤ)
+ ("D"  ?ᬥ)
+ ("`d" ?᭣)
+ ("`D" ?᭤)
+ ("f"  ?᭄)
+ ("F"  ?ᬻ)
+ ("`f" ?ᬌ)
+ ("`F" ?᭶)
+ ("g"  ?ᬕ)
+ ("G"  ?ᬖ)
+ ("`g" ?᭥)
+ ("`G" ?᭦)
+ ("h"  ?ᬳ)
+ ("H"  ?ᬄ)
+ ("`h" ?᭧)
+ ("`H" ?᭨)
+ ("j"  ?ᬚ)
+ ("J"  ?ᬛ)
+ ("`j" ?ᭌ)
+ ("`J" ?᭩)
+ ("k"  ?ᬓ)
+ ("K"  ?ᬔ)
+ ("`k" ?ᭅ)
+ ("`K" ?ᭆ)
+ ("l"  ?ᬮ)
+ ("L"  ?ᬼ)
+ ("`l" ?ᬍ)
+ ("`L" ?᭪)
+ ("z"  ?ᭊ)
+ ("Z"  ?ᬽ)
+ ("`z" ?ᬎ)
+ ("`Z" ?᭷)
+ ("x"  ?ᬱ)
+ ("X"  ?᬴)
+ ("`x" ?᭸)
+ ("c"  ?ᬘ)
+ ("C"  ?ᬙ)
+ ("`c" #x200C)  ; ZWNJ
+ ("v"  ?ᬯ)
+ ("V"  ?ᭉ)
+ ("`v" ?᭹)
+ ("`V" ?᭺)
+ ("b"  ?ᬩ)
+ ("B"  ?ᬪ)
+ ("`b" ?᭻)
+ ("n"  ?ᬦ)
+ ("N"  ?ᬡ)
+ ("`n" ?ᬗ)
+ ("`N" ?ᬜ)
+ ("m"  ?ᬫ)
+ ("M"  ?ᬂ)
+ ("`m" ?ᬁ)
+ ("`M" ?ᬀ))
+
+(quail-define-package
+ "javanese" "Javanese" "ꦗ" t "Javanese phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("1"  ?꧑)
+ ("`1" ?1)
+ ("`!" ?꧁)
+ ("2"  ?꧒)
+ ("`2" ?2)
+ ("`@" ?꧂)
+ ("3"  ?꧓)
+ ("`3" ?3)
+ ("`#" ?꧃)
+ ("4"  ?꧔)
+ ("`4" ?4)
+ ("`$" ?꧄)
+ ("5"  ?꧕)
+ ("`5" ?5)
+ ("`%" ?꧅)
+ ("6"  ?꧖)
+ ("`6" ?6)
+ ("`^" ?꧆)
+ ("7"  ?꧗)
+ ("`7" ?7)
+ ("`&" ?꧇)
+ ("8"  ?꧘)
+ ("`8" ?8)
+ ("`*" ?꧈)
+ ("9"  ?꧙)
+ ("`9" ?9)
+ ("`(" ?꧉)
+ ("0"  ?꧐)
+ ("`0" ?0)
+ ("`)" ?꧞)
+ ("`\\" ?꧊)
+ ("`|" ?꧋)
+ ("`"  ?ꦛ)
+ ("q"  ?ꦛ)
+ ("Q"  ?ꦜ)
+ ("`q" ?꧟)
+ ("`Q" ?ꧏ)
+ ("w"  ?ꦝ)
+ ("W"  ?ꦞ)
+ ("`w" ?꧌)
+ ("`W" ?꧍)
+ ("e"  ?ꦺ)
+ ("E"  ?ꦻ)
+ ("`e" ?ꦌ)
+ ("`E" ?ꦍ)
+ ("r"  ?ꦫ)
+ ("R"  ?ꦬ)
+ ("`r" ?ꦿ)
+ ("`R" ?ꦂ)
+ ("t"  ?ꦠ)
+ ("T"  ?ꦡ)
+ ("`t" ?ꦼ)
+ ("y"  ?ꦪ)
+ ("Y"  ?ꦾ)
+ ("u"  ?ꦸ)
+ ("U"  ?ꦹ)
+ ("`u" ?ꦈ)
+ ("`U" ?ꦅ)
+ ("i"  ?ꦶ)
+ ("I"  ?ꦷ)
+ ("`i" ?ꦆ)
+ ("`I" ?ꦇ)
+ ("o"  ?ꦎ)
+ ("p"  ?ꦥ)
+ ("P"  ?ꦦ)
+ ("`p" ?ꦉ)
+ ("a"  ?ꦴ)
+ ("A"  ?ꦄ)
+ ("`a" ?ꦵ)
+ ("s"  ?ꦱ)
+ ("S"  ?ꦯ)
+ ("d"  ?ꦢ)
+ ("D"  ?ꦣ)
+ ("f"  ?꧀)
+ ("F"  ?ꦽ)
+ ("`f" ?ꦉ)
+ ("g"  ?ꦒ)
+ ("G"  ?ꦓ)
+ ("h"  ?ꦲ)
+ ("H"  ?ꦃ)
+ ("j"  ?ꦗ)
+ ("J"  ?ꦙ)
+ ("`j" ?ꦘ)
+ ("k"  ?ꦏ)
+ ("K"  ?ꦑ)
+ ("`k" ?ꦐ)
+ ("l"  ?ꦭ)
+ ("L"  ?ꦊ)
+ ("`l" ?ꦋ)
+ ("z"  ?ꦚ)
+ ("Z"  ?ꦔ)
+ ("x"  ?ꦰ)
+ ("X"  ?꦳)
+ ("c"  ?ꦕ)
+ ("C"  ?ꦖ)
+ ("`c" #x200C)  ; ZWNJ
+ ("v"  ?ꦮ)
+ ("V"  ?ᭉ)
+ ("b"  ?ꦧ)
+ ("B"  ?ꦨ)
+ ("n"  ?ꦤ)
+ ("N"  ?ꦟ)
+ ("m"  ?ꦩ)
+ ("M"  ?ꦁ)
+ ("`m" ?ꦀ))
+
+(quail-define-package
+ "sundanese" "Sundanese" "ᮞᮥ" t "Sundanese phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("1"  ?᮱)
+ ("`1" ?1)
+ ("`!" ?᳀)
+ ("2"  ?᮲)
+ ("`2" ?2)
+ ("`@" ?᳁)
+ ("3"  ?᮳)
+ ("`3" ?3)
+ ("`#" ?᳂)
+ ("4"  ?᮴)
+ ("`4" ?4)
+ ("`$" ?᳃)
+ ("5"  ?᮵)
+ ("`5" ?5)
+ ("6"  ?᮶)
+ ("`6" ?6)
+ ("7"  ?᮷)
+ ("`7" ?7)
+ ("8"  ?᮸)
+ ("`8" ?8)
+ ("9"  ?᮹)
+ ("`9" ?9)
+ ("0"  ?᮰)
+ ("`0" ?0)
+ ("`"  ?ᮒ)
+ ("q"  ?ᮋ)
+ ("w"  ?ᮝ)
+ ("W"  ?ᮭ)
+ ("e"  ?ᮨ)
+ ("E"  ?ᮩ)
+ ("`e" ?ᮈ)
+ ("`E" ?ᮉ)
+ ("r"  ?ᮛ)
+ ("R"  ?ᮢ)
+ ("`r" ?ᮁ)
+ ("`R" ?ᮻ)
+ ("t"  ?ᮒ)
+ ("y"  ?ᮚ)
+ ("Y"  ?ᮡ)
+ ("u"  ?ᮥ)
+ ("U"  ?ᮅ)
+ ("i"  ?ᮤ)
+ ("I"  ?ᮄ)
+ ("o"  ?ᮧ)
+ ("O"  ?ᮇ)
+ ("p"  ?ᮕ)
+ ("P"  ?ᮖ)
+ ("a"  ?ᮃ)
+ ("A"  ?ᮦ)
+ ("`a" ?ᮆ)
+ ("s"  ?ᮞ)
+ ("S"  ?ᮯ)
+ ("d"  ?ᮓ)
+ ("D"  ?᳆)
+ ("f"  ?᮪)
+ ("F"  ?᮫)
+ ("g"  ?ᮌ)
+ ("h"  ?ᮠ)
+ ("H"  ?ᮂ)
+ ("j"  ?ᮏ)
+ ("k"  ?ᮊ)
+ ("K"  ?ᮮ)
+ ("`k" ?ᮾ)
+ ("`K" ?᳅)
+ ("l"  ?ᮜ)
+ ("L"  ?ᮣ)
+ ("`l" ?ᮼ)
+ ("`L" ?᳄)
+ ("z"  ?ᮐ)
+ ("x"  ?ᮟ)
+ ("c"  ?ᮎ)
+ ("`c" #x200C)  ; ZWNJ
+ ("b"  ?ᮘ)
+ ("B"  ?ᮽ)
+ ("`b" ?ᮺ)
+ ("`B" ?᳇)
+ ("n"  ?ᮔ)
+ ("N"  ?ᮍ)
+ ("`n" ?ᮑ)
+ ("m"  ?ᮙ)
+ ("M"  ?ᮀ)
+ ("`m" ?ᮿ)
+ ("`M" ?ᮬ))
+
+(quail-define-package
+ "batak" "Batak" "ᯅ" t "Batak phonetic input method,
+ used by languages such as Karo, Toba, Pakpak, Mandailing
+ and Simalungun.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q"  ?᯼)
+ ("Q"  ?᯽)
+ ("w"  ?ᯋ)
+ ("W"  ?ᯌ)
+ ("`w" ?ᯍ)
+ ("e"  ?ᯧ)
+ ("E"  ?ᯨ)
+ ("`e" ?ᯩ)
+ ("r"  ?ᯒ)
+ ("R"  ?ᯓ)
+ ("t"  ?ᯖ)
+ ("T"  ?ᯗ)
+ ("y"  ?ᯛ)
+ ("Y"  ?ᯜ)
+ ("u"  ?ᯮ)
+ ("U"  ?ᯥ)
+ ("`u" ?ᯯ)
+ ("i"  ?ᯪ)
+ ("I"  ?ᯫ)
+ ("`i" ?ᯤ)
+ ("o"  ?ᯬ)
+ ("O"  ?ᯭ)
+ ("p"  ?ᯇ)
+ ("P"  ?ᯈ)
+ ("a"  ?ᯀ)
+ ("A"  ?ᯁ)
+ ("s"  ?ᯘ)
+ ("S"  ?ᯙ)
+ ("`s" ?ᯚ)
+ ("d"  ?ᯑ)
+ ("f"  ?᯲)
+ ("F"  ?᯳)
+ ("g"  ?ᯎ)
+ ("G"  ?ᯏ)
+ ("h"  ?ᯂ)
+ ("H"  ?ᯃ)
+ ("`h" ?ᯄ)
+ ("`H" ?ᯱ)
+ ("j"  ?ᯐ)
+ ("k"  ?᯦)
+ ("l"  ?ᯞ)
+ ("L"  ?ᯟ)
+ ("z"  ?ᯝ)
+ ("Z"  ?ᯰ)
+ ("x"  ?ᯠ)
+ ("c"  ?ᯡ)
+ ("v"  ?᯾)
+ ("V"  ?᯿)
+ ("b"  ?ᯅ)
+ ("B"  ?ᯆ)
+ ("n"  ?ᯉ)
+ ("N"  ?ᯊ)
+ ("`n" ?ᯢ)
+ ("m"  ?ᯔ)
+ ("M"  ?ᯕ)
+ ("`m" ?ᯣ))
+
+(quail-define-package
+ "rejang" "Rejang" "ꤽꥍ" nil "Rejang phonetic input method."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?꥟)
+ ("w" ?ꥀ)
+ ("e" ?ꥉ)
+ ("E" ?ꥊ)
+ ("r" ?ꤽ)
+ ("R" ?ꥑ)
+ ("t" ?ꤳ)
+ ("y" ?ꤿ)
+ ("u" ?ꥈ)
+ ("U" ?ꥍ)
+ ("i" ?ꥇ)
+ ("o" ?ꥋ)
+ ("O" ?ꥌ)
+ ("p" ?ꤶ)
+ ("a" ?ꥆ)
+ ("A" ?ꥎ)
+ ("s" ?ꤼ)
+ ("d" ?ꤴ)
+ ("D" ?ꥄ)
+ ("f" ?꥓)
+ ("F" ?ꥃ)
+ ("g" ?ꤱ)
+ ("h" ?ꥁ)
+ ("H" ?ꥒ)
+ ("j" ?ꤺ)
+ ("k" ?ꤰ)
+ ("l" ?ꤾ)
+ ("z" ?ꤲ)
+ ("Z" ?ꥏ)
+ ("x" ?ꤻ)
+ ("X" ?ꥅ)
+ ("c" ?ꤹ)
+ ("b" ?ꤷ)
+ ("n" ?ꤵ)
+ ("N" ?ꥐ)
+ ("m" ?ꤸ)
+ ("M" ?ꥂ))
+
+(quail-define-package
+ "makasar" "Makasar" "𑻪" nil "Makasar phonetic input method."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?𑻷)
+ ("Q" ?𑻸)
+ ("e" ?𑻵)
+ ("r" ?𑻭)
+ ("t" ?𑻦)
+ ("y" ?𑻬)
+ ("u" ?𑻴)
+ ("i" ?𑻳)
+ ("o" ?𑻶)
+ ("p" ?𑻣)
+ ("a" ?𑻱)
+ ("s" ?𑻰)
+ ("d" ?𑻧)
+ ("g" ?𑻡)
+ ("j" ?𑻪)
+ ("k" ?𑻠)
+ ("l" ?𑻮)
+ ("z" ?𑻢)
+ ("Z" ?𑻲)
+ ("x" ?𑻫)
+ ("c" ?𑻩)
+ ("v" ?𑻯)
+ ("b" ?𑻤)
+ ("n" ?𑻨)
+ ("m" ?𑻥))
+
+(quail-define-package
+ "lontara" "Lontara" "ᨒ" nil "Lontara phonetic input method."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?᨞)
+ ("Q" ?᨟)
+ ("e" ?ᨙ)
+ ("E" ?ᨛ)
+ ("r" ?ᨑ)
+ ("t" ?ᨈ)
+ ("y" ?ᨐ)
+ ("u" ?ᨘ)
+ ("i" ?ᨗ)
+ ("o" ?ᨚ)
+ ("p" ?ᨄ)
+ ("a" ?ᨕ)
+ ("s" ?ᨔ)
+ ("d" ?ᨉ)
+ ("g" ?ᨁ)
+ ("h" ?ᨖ)
+ ("j" ?ᨍ)
+ ("k" ?ᨀ)
+ ("l" ?ᨒ)
+ ("z" ?ᨂ)
+ ("Z" ?ᨃ)
+ ("x" ?ᨎ)
+ ("X" ?ᨏ)
+ ("c" ?ᨌ)
+ ("v" ?ᨓ)
+ ("b" ?ᨅ)
+ ("n" ?ᨊ)
+ ("N" ?ᨋ)
+ ("m" ?ᨆ)
+ ("M" ?ᨇ))
+
+(provide 'indonesian)
+;;; indonesian.el ends here
diff --git a/lisp/leim/quail/ipa.el b/lisp/leim/quail/ipa.el
index 1eb2255f6c..773dc31f9b 100644
--- a/lisp/leim/quail/ipa.el
+++ b/lisp/leim/quail/ipa.el
@@ -269,7 +269,7 @@ QUAIL-KEYMAP is a cons that satisfies `quail-map-p'; 
TO-PREPEND is a
 string."
   (when (consp quail-keymap) (setq quail-keymap (cdr quail-keymap)))
   (if (or (integerp quail-keymap)
-         (and (fboundp 'characterp) (characterp quail-keymap)))
+          (characterp quail-keymap))
       (setq quail-keymap (list (string quail-keymap)))
     (if (stringp quail-keymap)
        (setq quail-keymap (list quail-keymap))
diff --git a/lisp/leim/quail/latin-post.el b/lisp/leim/quail/latin-post.el
index acb3ef8ede..76ddf3c274 100644
--- a/lisp/leim/quail/latin-post.el
+++ b/lisp/leim/quail/latin-post.el
@@ -2239,6 +2239,7 @@ of characters from a single Latin-N charset.
   tilde      |    ~    | a~ -> ã
   cedilla    |    ,    | c, -> ç
   ogonek     |    ,    | a, -> ą
+  macron     |    -    | a- -> ā   g- -> ḡ   e/- -> ǣ   -- -> ¯
   breve      |    ~    | a~ -> ă
   caron      |    ~    | c~ -> č
   dbl. acute |    :    | o: -> ő
@@ -2246,14 +2247,45 @@ of characters from a single Latin-N charset.
   dot        |    .    | z. -> ż
   stroke     |    /    | d/ -> đ
   nordic     |    /    | d/ -> ð   t/ -> þ   a/ -> å   e/ -> æ   o/ -> ø
+  symbols    |    ^    | r^ -> ®   t^ -> ™
+  super      |    ^    | 0^ -> ⁰   1^ -> ¹   +^ -> ⁺   -^ -> ⁻
+  subscript  |    _    | 0_ -> ₀   1_ -> ₁   +_ -> ₊   -_ -> ₋
   others     |    /    | s/ -> ß   ?/ -> ¿   !/ -> ¡   // -> °   o/ -> œ
+             |    /    | 2/ -> ½   3/ -> ¾   4/ -> ?¼
              | various | << -> «   >> -> »   o_ -> º   a_ -> ª
 
 Doubling the postfix separates the letter and postfix: e.g. a\\='\\=' -> a\\='
 " nil t nil nil nil nil nil nil nil nil t)
 
-;; Fixme: ¦ § ¨ © ¬ ­ ® ¯ ± ² ³ ´ µ ¶ · ¸ ¹ ¼ ½ ¾ × ÷
+;; Fixme: ¦ § ¨ © ¬ ± ´ µ ¶ · ¸ × ÷
 (quail-define-rules
+ ("2/" ?½)
+ ("3/" ?¾)
+ ("4/" ?¼)
+ ("0^" ?⁰)
+ ("1^" ?¹)
+ ("2^" ?²)
+ ("3^" ?³)
+ ("4^" ?⁴)
+ ("5^" ?⁵)
+ ("6^" ?⁶)
+ ("7^" ?⁷)
+ ("8^" ?⁸)
+ ("9^" ?⁹)
+ ("+^" ?⁺)
+ ("-^" ?⁻)
+ ("0_" ?₀)
+ ("1_" ?₁)
+ ("2_" ?₂)
+ ("3_" ?₃)
+ ("4_" ?₄)
+ ("5_" ?₅)
+ ("6_" ?₆)
+ ("7_" ?₇)
+ ("8_" ?₈)
+ ("9_" ?₉)
+ ("+_" ?₊)
+ ("-_" ?₋)
  (" _" ? )
  ("!/" ?¡)
  ("//" ?°)
@@ -2284,11 +2316,13 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\='\\=' -> a\\='
  ("E-" ?Ē)
  ("E." ?Ė)
  ("E/" ?Æ)
+ ("E/-" ?Ǣ)
  ("E\"" ?Ë)
  ("E^" ?Ê)
  ("E`" ?È)
  ("E~" ?Ě)
  ("G," ?Ģ)
+ ("G-" ?Ḡ)
  ("G." ?Ġ)
  ("G^" ?Ĝ)
  ("G~" ?Ğ)
@@ -2374,12 +2408,14 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\='\\=' -> a\\='
  ("e-" ?ē)
  ("e." ?ė)
  ("e/" ?æ)
+ ("e/-" ?ǣ)
  ("e\"" ?ë)
  ("e^" ?ê)
  ("e`" ?è)
  ("e~" ?ě)
  ("e=" ?€)
  ("g," ?ģ)
+ ("g-" ?ḡ)
  ("g." ?ġ)
  ("g^" ?ĝ)
  ("g~" ?ğ)
@@ -2417,6 +2453,7 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\='\\=' -> a\\='
  ("o~" ?õ)
  ("r'" ?ŕ)
  ("r," ?ŗ)
+ ("r^" ?®)
  ("r~" ?ř)
  ("s'" ?ś)
  ("s," ?ş)
@@ -2426,6 +2463,7 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\='\\=' -> a\\='
  ("t," ?ţ)
  ("t/" ?þ)
  ("t/" ?ŧ)
+ ("t^" ?™)
  ("t~" ?ť)
  ("u'" ?ú)
  ("u," ?ų)
@@ -2442,7 +2480,35 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\='\\=' -> a\\='
  ("z'" ?ź)
  ("z." ?ż)
  ("z~" ?ž)
-
+ ("--" ?¯)
+
+ ("2//" ["2/"])
+ ("3//" ["3/"])
+ ("4//" ["4/"])
+ ("0^^" ["0^"])
+ ("1^^" ["1^"])
+ ("2^^" ["2^"])
+ ("3^^" ["3^"])
+ ("4^^" ["4^"])
+ ("5^^" ["5^"])
+ ("6^^" ["6^"])
+ ("7^^" ["7^"])
+ ("8^^" ["8^"])
+ ("9^^" ["9^"])
+ ("+^^" ["+^"])
+ ("-^^" ["-^"])
+ ("0__" ["0_"])
+ ("1__" ["1_"])
+ ("2__" ["2_"])
+ ("3__" ["3_"])
+ ("4__" ["4_"])
+ ("5__" ["5_"])
+ ("6__" ["6_"])
+ ("7__" ["7_"])
+ ("8__" ["8_"])
+ ("9__" ["9_"])
+ ("+__" ["+_"])
+ ("-__" ["-_"])
  (" __" [" _"])
  ("!//" ["!/"])
  ("///" ["//"])
@@ -2470,11 +2536,13 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\='\\=' -> a\\='
  ("E--" ["E-"])
  ("E.." ["E."])
  ("E//" ["E/"])
+ ("E/--" ["E/-"])
  ("E\"\"" ["E\""])
  ("E^^" ["E^"])
  ("E``" ["E`"])
  ("E~~" ["E~"])
  ("G,," ["G,"])
+ ("G--" ["G-"])
  ("G.." ["G."])
  ("G^^" ["G^"])
  ("G~~" ["G~"])
@@ -2553,12 +2621,14 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\='\\=' -> a\\='
  ("e--" ["e-"])
  ("e.." ["e."])
  ("e//" ["e/"])
+ ("e/--" ["e/-"])
  ("e\"\"" ["e\""])
  ("e^^" ["e^"])
  ("e``" ["e`"])
  ("e==" ["e="])
  ("e~~" ["e~"])
  ("g,," ["g,"])
+ ("g--" ["g-"])
  ("g.." ["g."])
  ("g^^" ["g^"])
  ("g~~" ["g~"])
@@ -2617,6 +2687,7 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\='\\=' -> a\\='
  ("z''" ["z'"])
  ("z.." ["z."])
  ("z~~" ["z~"])
+ ("---" ["--"])
  )
 
 ;; Derived from Slovenian.kmap from Yudit
diff --git a/lisp/leim/quail/latin-pre.el b/lisp/leim/quail/latin-pre.el
index b6a26e0b2c..48e0ce9efc 100644
--- a/lisp/leim/quail/latin-pre.el
+++ b/lisp/leim/quail/latin-pre.el
@@ -1104,14 +1104,32 @@ of characters from a single Latin-N charset.
    cedilla   |  , ~   | ,c -> ç  ~c -> ç
     caron    |   ~    | ~c -> č  ~g -> ğ
     breve    |   ~    | ~a -> ă
+    macron   |   -    | -a -> ā  -/e -> ǣ  -- -> ¯
   dot above  |   / .  | /g -> ġ   .g -> ġ
     misc     | \" ~ /  | \"s -> ß  ~d -> ð  ~t -> þ  /a -> å  /e -> æ  /o -> ø
    symbol    |   ~    | ~> -> »  ~< -> «  ~! -> ¡  ~? -> ¿  ~~ -> ¸
    symbol    |  _ /   | _o -> º  _a -> ª  // -> °  /\\ -> ×  _y -> ¥
-   symbol    |   ^    | ^r -> ®  ^c -> ©  ^1 -> ¹  ^2 -> ²  ^3 -> ³
+   symbol    |   ^    | ^r -> ®  ^t -> ™  ^c -> ©  ^1 -> ¹  ^2 -> ²  ^3 -> ³
 " nil t nil nil nil nil nil nil nil nil t)
 
 (quail-define-rules
+ ("--" ?¯)
+ ("-A" ?Ā)
+ ("-a" ?ā)
+ ("-E" ?Ē)
+ ("-e" ?ē)
+ ("-/E" ?Ǣ)
+ ("-/e" ?ǣ)
+ ("-G" ?Ḡ)
+ ("-g" ?ḡ)
+ ("-I" ?Ī)
+ ("-i" ?ī)
+ ("-O" ?Ō)
+ ("-o" ?ō)
+ ("-U" ?Ū)
+ ("-u" ?ū)
+ ("-Y" ?Ȳ)
+ ("-y" ?ȳ)
  ("' " ?')
  ("''" ?´)
  ("'A" ?Á)
@@ -1197,9 +1215,16 @@ of characters from a single Latin-N charset.
  ("\"w" ?ẅ)
  ("\"y" ?ÿ)
  ("^ " ?^)
+ ("^0" ?⁰)
  ("^1" ?¹)
  ("^2" ?²)
  ("^3" ?³)
+ ("^4" ?⁴)
+ ("^5" ?⁵)
+ ("^6" ?⁶)
+ ("^7" ?⁷)
+ ("^8" ?⁸)
+ ("^9" ?⁹)
  ("^A" ?Â)
  ("^C" ?Ĉ)
  ("^E" ?Ê)
@@ -1224,9 +1249,24 @@ of characters from a single Latin-N charset.
  ("^o" ?ô)
  ("^r" ?®)
  ("^s" ?ŝ)
+ ("^t" ?™)
  ("^u" ?û)
  ("^w" ?ŵ)
  ("^y" ?ŷ)
+ ("^+" ?⁺)
+ ("^-" ?⁻)
+ ("_0" ?₀)
+ ("_1" ?₁)
+ ("_2" ?₂)
+ ("_3" ?₃)
+ ("_4" ?₄)
+ ("_5" ?₅)
+ ("_6" ?₆)
+ ("_7" ?₇)
+ ("_8" ?₈)
+ ("_9" ?₉)
+ ("_++" ?₊)
+ ("_-" ?₋)
  ("_+" ?±)
  ("_:" ?÷)
  ("_a" ?ª)
diff --git a/lisp/leim/quail/misc-lang.el b/lisp/leim/quail/misc-lang.el
new file mode 100644
index 0000000000..0c4a0d4ce4
--- /dev/null
+++ b/lisp/leim/quail/misc-lang.el
@@ -0,0 +1,1184 @@
+;;; misc-lang.el --- Quail package for inputting Miscellaneous characters  -*- 
lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Author: समीर सिंह Sameer Singh <lumarzeli30@gmail.com>
+;; Keywords: multilingual, input method, i18n, Miscellaneous
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Input methods for Miscellaneous languages.
+
+;;; Code:
+
+(require 'quail)
+
+(quail-define-package
+ "hanifi-rohingya" "Hanifi Rohingya" "𐴌𐴟" t "Hanifi Rohingya phonetic input 
method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("1"  ?𐴱)
+ ("`1" ?1)
+ ("2"  ?𐴲)
+ ("`2" ?2)
+ ("3"  ?𐴳)
+ ("`3" ?3)
+ ("4"  ?𐴴)
+ ("`4" ?4)
+ ("5"  ?𐴵)
+ ("`5" ?5)
+ ("6"  ?𐴶)
+ ("`6" ?6)
+ ("7"  ?𐴷)
+ ("`7" ?7)
+ ("8"  ?𐴸)
+ ("`8" ?8)
+ ("9"  ?𐴹)
+ ("`9" ?9)
+ ("0"  ?𐴰)
+ ("`0" ?0)
+ ("q"  ?𐴄)
+ ("w"  ?𐴋)
+ ("W"  ?𐴍)
+ ("e"  ?𐴠)
+ ("E"  ?𐴤)
+ ("r"  ?𐴌)
+ ("R"  ?𐴥)
+ ("t"  ?𐴃)
+ ("T"  ?𐴦)
+ ("y"  ?𐴘)
+ ("Y"  ?𐴙)
+ ("u"  ?𐴟)
+ ("U"  ?𐴧)
+ ("i"  ?𐴞)
+ ("o"  ?𐴡)
+ ("p"  ?𐴂)
+ ("a"  ?𐴀)
+ ("A"  ?𐴝)
+ ("s"  ?𐴏)
+ ("S"  ?𐴐)
+ ("d"  ?𐴊)
+ ("f"  ?𐴉)
+ ("F"  ?𐴢)
+ ("g"  ?𐴒)
+ ("h"  ?𐴇)
+ ("j"  ?𐴅)
+ ("k"  ?𐴑)
+ ("K"  ?𐴈)
+ ("l"  ?𐴓)
+ ("z"  ?𐴎)
+ ("c"  ?𐴆)
+ ("C"  #x200C) ; ZWNJ
+ ("v"  ?𐴖)
+ ("V"  ?𐴗)
+ ("`v" ?𐴜)
+ ("b"  ?𐴁)
+ ("n"  ?𐴕)
+ ("N"  ?𐴚)
+ ("`n" ?𐴛)
+ ("`N" ?𐴣)
+ ("m"  ?𐴔))
+
+;; The Kharoṣṭhī input method is based on the Kyoto-Harvard input
+;; conventions for Sanskrit, extended for Kharoṣṭhī special characters.
+;; Author: Stefan Baums <baums@gandhari.org>.
+(quail-define-package
+ "kharoshthi" "Kharoshthi" "𐨑" nil
+ "Kharoṣṭhī input method." nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("a" ["𐨀"])
+ ("i" ["𐨀𐨁"])
+ ("u" ["𐨀𐨂"])
+ ("R" ["𐨀𐨃"])
+ ("e" ["𐨀𐨅"])
+ ("o" ["𐨀𐨆"])
+
+ ("k" ["𐨐𐨿"])
+ ("ka" ["𐨐"])
+ ("ki" ["𐨐𐨁"])
+ ("ku" ["𐨐𐨂"])
+ ("kR" ["𐨐𐨃"])
+ ("ke" ["𐨐𐨅"])
+ ("ko" ["𐨐𐨆"])
+ ("k_" ["𐨐𐨹𐨿"])
+ ("k_a" ["𐨐𐨹"])
+ ("k_i" ["𐨐𐨹𐨁"])
+ ("k_u" ["𐨐𐨹𐨂"])
+ ("k_R" ["𐨐𐨹𐨃"])
+ ("k_e" ["𐨐𐨹𐨅"])
+ ("k_o" ["𐨐𐨹𐨆"])
+ ("k=" ["𐨐𐨿𐨸"])
+ ("k=a" ["𐨐𐨸"])
+ ("k=i" ["𐨐𐨸𐨁"])
+ ("k=u" ["𐨐𐨸𐨂"])
+ ("k=R" ["𐨐𐨸𐨃"])
+ ("k=e" ["𐨐𐨸𐨅"])
+ ("k=o" ["𐨐𐨸𐨆"])
+ ("k_=" ["𐨐𐨹𐨿𐨸"])
+ ("k_=a" ["𐨐𐨹𐨸"])
+ ("k_=i" ["𐨐𐨹𐨸𐨁"])
+ ("k_=u" ["𐨐𐨹𐨸𐨂"])
+ ("k_=R" ["𐨐𐨹𐨸𐨃"])
+ ("k_=e" ["𐨐𐨹𐨸𐨅"])
+ ("k_=o" ["𐨐𐨹𐨸𐨆"])
+
+ ("kh" ["𐨑𐨿"])
+ ("kha" ["𐨑"])
+ ("khi" ["𐨑𐨁"])
+ ("khu" ["𐨑𐨂"])
+ ("khR" ["𐨑𐨃"])
+ ("khe" ["𐨑𐨅"])
+ ("kho" ["𐨑𐨆"])
+ ("kh_" ["𐨑𐨹𐨿"])
+ ("kh_a" ["𐨑𐨹"])
+ ("kh_i" ["𐨑𐨹𐨁"])
+ ("kh_u" ["𐨑𐨹𐨂"])
+ ("kh_R" ["𐨑𐨹𐨃"])
+ ("kh_e" ["𐨑𐨹𐨅"])
+ ("kh_o" ["𐨑𐨹𐨆"])
+ ("kh=" ["𐨑𐨿𐨸"])
+ ("kh=a" ["𐨑𐨸"])
+ ("kh=i" ["𐨑𐨸𐨁"])
+ ("kh=u" ["𐨑𐨸𐨂"])
+ ("kh=R" ["𐨑𐨸𐨃"])
+ ("kh=e" ["𐨑𐨸𐨅"])
+ ("kh=o" ["𐨑𐨸𐨆"])
+ ("kh_=" ["𐨑𐨹𐨿𐨸"])
+ ("kh_=a" ["𐨑𐨹𐨸"])
+ ("kh_=i" ["𐨑𐨹𐨸𐨁"])
+ ("kh_=u" ["𐨑𐨹𐨸𐨂"])
+ ("kh_=R" ["𐨑𐨹𐨸𐨃"])
+ ("kh_=e" ["𐨑𐨹𐨸𐨅"])
+ ("kh_=o" ["𐨑𐨹𐨸𐨆"])
+
+ ("g" ["𐨒𐨿"])
+ ("ga" ["𐨒"])
+ ("gi" ["𐨒𐨁"])
+ ("gu" ["𐨒𐨂"])
+ ("gR" ["𐨒𐨃"])
+ ("ge" ["𐨒𐨅"])
+ ("go" ["𐨒𐨆"])
+ ("g_" ["𐨒𐨹𐨿"])
+ ("g_a" ["𐨒𐨹"])
+ ("g_i" ["𐨒𐨹𐨁"])
+ ("g_u" ["𐨒𐨹𐨂"])
+ ("g_R" ["𐨒𐨹𐨃"])
+ ("g_e" ["𐨒𐨹𐨅"])
+ ("g_o" ["𐨒𐨹𐨆"])
+ ("g=" ["𐨒𐨿𐨸"])
+ ("g=a" ["𐨒𐨸"])
+ ("g=i" ["𐨒𐨸𐨁"])
+ ("g=u" ["𐨒𐨸𐨂"])
+ ("g=R" ["𐨒𐨸𐨃"])
+ ("g=e" ["𐨒𐨸𐨅"])
+ ("g=o" ["𐨒𐨸𐨆"])
+ ("g_=" ["𐨒𐨹𐨿𐨸"])
+ ("g_=a" ["𐨒𐨹𐨸"])
+ ("g_=i" ["𐨒𐨹𐨸𐨁"])
+ ("g_=u" ["𐨒𐨹𐨸𐨂"])
+ ("g_=R" ["𐨒𐨹𐨸𐨃"])
+ ("g_=e" ["𐨒𐨹𐨸𐨅"])
+ ("g_=o" ["𐨒𐨹𐨸𐨆"])
+
+ ("gh" ["𐨓𐨿"])
+ ("gha" ["𐨓"])
+ ("ghi" ["𐨓𐨁"])
+ ("ghu" ["𐨓𐨂"])
+ ("ghR" ["𐨓𐨃"])
+ ("ghe" ["𐨓𐨅"])
+ ("gho" ["𐨓𐨆"])
+ ("gh_" ["𐨓𐨹𐨿"])
+ ("gh_a" ["𐨓𐨹"])
+ ("gh_i" ["𐨓𐨹𐨁"])
+ ("gh_u" ["𐨓𐨹𐨂"])
+ ("gh_R" ["𐨓𐨹𐨃"])
+ ("gh_e" ["𐨓𐨹𐨅"])
+ ("gh_o" ["𐨓𐨹𐨆"])
+ ("gh=" ["𐨓𐨿𐨸"])
+ ("gh=a" ["𐨓𐨸"])
+ ("gh=i" ["𐨓𐨸𐨁"])
+ ("gh=u" ["𐨓𐨸𐨂"])
+ ("gh=R" ["𐨓𐨸𐨃"])
+ ("gh=e" ["𐨓𐨸𐨅"])
+ ("gh=o" ["𐨓𐨸𐨆"])
+ ("gh_=" ["𐨓𐨹𐨿𐨸"])
+ ("gh_=a" ["𐨓𐨹𐨸"])
+ ("gh_=i" ["𐨓𐨹𐨸𐨁"])
+ ("gh_=u" ["𐨓𐨹𐨸𐨂"])
+ ("gh_=R" ["𐨓𐨹𐨸𐨃"])
+ ("gh_=e" ["𐨓𐨹𐨸𐨅"])
+ ("gh_=o" ["𐨓𐨹𐨸𐨆"])
+
+ ("c" ["𐨕𐨿"])
+ ("ca" ["𐨕"])
+ ("ci" ["𐨕𐨁"])
+ ("cu" ["𐨕𐨂"])
+ ("cR" ["𐨕𐨃"])
+ ("ce" ["𐨕𐨅"])
+ ("co" ["𐨕𐨆"])
+ ("c_" ["𐨕𐨹𐨿"])
+ ("c_a" ["𐨕𐨹"])
+ ("c_i" ["𐨕𐨹𐨁"])
+ ("c_u" ["𐨕𐨹𐨂"])
+ ("c_R" ["𐨕𐨹𐨃"])
+ ("c_e" ["𐨕𐨹𐨅"])
+ ("c_o" ["𐨕𐨹𐨆"])
+ ("c=" ["𐨕𐨿𐨸"])
+ ("c=a" ["𐨕𐨸"])
+ ("c=i" ["𐨕𐨸𐨁"])
+ ("c=u" ["𐨕𐨸𐨂"])
+ ("c=R" ["𐨕𐨸𐨃"])
+ ("c=e" ["𐨕𐨸𐨅"])
+ ("c=o" ["𐨕𐨸𐨆"])
+ ("c_=" ["𐨕𐨹𐨿𐨸"])
+ ("c_=a" ["𐨕𐨹𐨸"])
+ ("c_=i" ["𐨕𐨹𐨸𐨁"])
+ ("c_=u" ["𐨕𐨹𐨸𐨂"])
+ ("c_=R" ["𐨕𐨹𐨸𐨃"])
+ ("c_=e" ["𐨕𐨹𐨸𐨅"])
+ ("c_=o" ["𐨕𐨹𐨸𐨆"])
+
+ ("ch" ["𐨖𐨿"])
+ ("cha" ["𐨖"])
+ ("chi" ["𐨖𐨁"])
+ ("chu" ["𐨖𐨂"])
+ ("chR" ["𐨖𐨃"])
+ ("che" ["𐨖𐨅"])
+ ("cho" ["𐨖𐨆"])
+ ("ch_" ["𐨖𐨹𐨿"])
+ ("ch_a" ["𐨖𐨹"])
+ ("ch_i" ["𐨖𐨹𐨁"])
+ ("ch_u" ["𐨖𐨹𐨂"])
+ ("ch_R" ["𐨖𐨹𐨃"])
+ ("ch_e" ["𐨖𐨹𐨅"])
+ ("ch_o" ["𐨖𐨹𐨆"])
+ ("ch=" ["𐨖𐨿𐨸"])
+ ("ch=a" ["𐨖𐨸"])
+ ("ch=i" ["𐨖𐨸𐨁"])
+ ("ch=u" ["𐨖𐨸𐨂"])
+ ("ch=R" ["𐨖𐨸𐨃"])
+ ("ch=e" ["𐨖𐨸𐨅"])
+ ("ch=o" ["𐨖𐨸𐨆"])
+ ("ch_=" ["𐨖𐨹𐨿𐨸"])
+ ("ch_=a" ["𐨖𐨹𐨸"])
+ ("ch_=i" ["𐨖𐨹𐨸𐨁"])
+ ("ch_=u" ["𐨖𐨹𐨸𐨂"])
+ ("ch_=R" ["𐨖𐨹𐨸𐨃"])
+ ("ch_=e" ["𐨖𐨹𐨸𐨅"])
+ ("ch_=o" ["𐨖𐨹𐨸𐨆"])
+
+ ("j" ["𐨗𐨿"])
+ ("ja" ["𐨗"])
+ ("ji" ["𐨗𐨁"])
+ ("ju" ["𐨗𐨂"])
+ ("jR" ["𐨗𐨃"])
+ ("je" ["𐨗𐨅"])
+ ("jo" ["𐨗𐨆"])
+ ("j_" ["𐨗𐨹𐨿"])
+ ("j_a" ["𐨗𐨹"])
+ ("j_i" ["𐨗𐨹𐨁"])
+ ("j_u" ["𐨗𐨹𐨂"])
+ ("j_R" ["𐨗𐨹𐨃"])
+ ("j_e" ["𐨗𐨹𐨅"])
+ ("j_o" ["𐨗𐨹𐨆"])
+ ("j=" ["𐨗𐨿𐨸"])
+ ("j=a" ["𐨗𐨸"])
+ ("j=i" ["𐨗𐨸𐨁"])
+ ("j=u" ["𐨗𐨸𐨂"])
+ ("j=R" ["𐨗𐨸𐨃"])
+ ("j=e" ["𐨗𐨸𐨅"])
+ ("j=o" ["𐨗𐨸𐨆"])
+ ("j_=" ["𐨗𐨹𐨿𐨸"])
+ ("j_=a" ["𐨗𐨹𐨸"])
+ ("j_=i" ["𐨗𐨹𐨸𐨁"])
+ ("j_=u" ["𐨗𐨹𐨸𐨂"])
+ ("j_=R" ["𐨗𐨹𐨸𐨃"])
+ ("j_=e" ["𐨗𐨹𐨸𐨅"])
+ ("j_=o" ["𐨗𐨹𐨸𐨆"])
+
+ ("jh" ["𐨰𐨿"])
+ ("jha" ["𐨰"])
+ ("jhi" ["𐨰𐨁"])
+ ("jhu" ["𐨰𐨂"])
+ ("jhR" ["𐨰𐨃"])
+ ("jhe" ["𐨰𐨅"])
+ ("jho" ["𐨰𐨆"])
+ ("jh_" ["𐨰𐨹𐨿"])
+ ("jh_a" ["𐨰𐨹"])
+ ("jh_i" ["𐨰𐨹𐨁"])
+ ("jh_u" ["𐨰𐨹𐨂"])
+ ("jh_R" ["𐨰𐨹𐨃"])
+ ("jh_e" ["𐨰𐨹𐨅"])
+ ("jh_o" ["𐨰𐨹𐨆"])
+ ("jh=" ["𐨰𐨿𐨸"])
+ ("jh=a" ["𐨰𐨸"])
+ ("jh=i" ["𐨰𐨸𐨁"])
+ ("jh=u" ["𐨰𐨸𐨂"])
+ ("jh=R" ["𐨰𐨸𐨃"])
+ ("jh=e" ["𐨰𐨸𐨅"])
+ ("jh=o" ["𐨰𐨸𐨆"])
+ ("jh_=" ["𐨰𐨹𐨿𐨸"])
+ ("jh_=a" ["𐨰𐨹𐨸"])
+ ("jh_=i" ["𐨰𐨹𐨸𐨁"])
+ ("jh_=u" ["𐨰𐨹𐨸𐨂"])
+ ("jh_=R" ["𐨰𐨹𐨸𐨃"])
+ ("jh_=e" ["𐨰𐨹𐨸𐨅"])
+ ("jh_=o" ["𐨰𐨹𐨸𐨆"])
+
+ ("J" ["𐨙𐨿"])
+ ("Ja" ["𐨙"])
+ ("Ji" ["𐨙𐨁"])
+ ("Ju" ["𐨙𐨂"])
+ ("JR" ["𐨙𐨃"])
+ ("Je" ["𐨙𐨅"])
+ ("Jo" ["𐨙𐨆"])
+ ("J_" ["𐨙𐨹𐨿"])
+ ("J_a" ["𐨙𐨹"])
+ ("J_i" ["𐨙𐨹𐨁"])
+ ("J_u" ["𐨙𐨹𐨂"])
+ ("J_R" ["𐨙𐨹𐨃"])
+ ("J_e" ["𐨙𐨹𐨅"])
+ ("J_o" ["𐨙𐨹𐨆"])
+ ("J=" ["𐨙𐨿𐨸"])
+ ("J=a" ["𐨙𐨸"])
+ ("J=i" ["𐨙𐨸𐨁"])
+ ("J=u" ["𐨙𐨸𐨂"])
+ ("J=R" ["𐨙𐨸𐨃"])
+ ("J=e" ["𐨙𐨸𐨅"])
+ ("J=o" ["𐨙𐨸𐨆"])
+ ("J_=" ["𐨙𐨹𐨿𐨸"])
+ ("J_=a" ["𐨙𐨹𐨸"])
+ ("J_=i" ["𐨙𐨹𐨸𐨁"])
+ ("J_=u" ["𐨙𐨹𐨸𐨂"])
+ ("J_=R" ["𐨙𐨹𐨸𐨃"])
+ ("J_=e" ["𐨙𐨹𐨸𐨅"])
+ ("J_=o" ["𐨙𐨹𐨸𐨆"])
+
+ ("T" ["𐨚𐨿"])
+ ("Ta" ["𐨚"])
+ ("Ti" ["𐨚𐨁"])
+ ("Tu" ["𐨚𐨂"])
+ ("TR" ["𐨚𐨃"])
+ ("Te" ["𐨚𐨅"])
+ ("To" ["𐨚𐨆"])
+ ("T_" ["𐨚𐨹𐨿"])
+ ("T_a" ["𐨚𐨹"])
+ ("T_i" ["𐨚𐨹𐨁"])
+ ("T_u" ["𐨚𐨹𐨂"])
+ ("T_R" ["𐨚𐨹𐨃"])
+ ("T_e" ["𐨚𐨹𐨅"])
+ ("T_o" ["𐨚𐨹𐨆"])
+ ("T=" ["𐨚𐨿𐨸"])
+ ("T=a" ["𐨚𐨸"])
+ ("T=i" ["𐨚𐨸𐨁"])
+ ("T=u" ["𐨚𐨸𐨂"])
+ ("T=R" ["𐨚𐨸𐨃"])
+ ("T=e" ["𐨚𐨸𐨅"])
+ ("T=o" ["𐨚𐨸𐨆"])
+ ("T_=" ["𐨚𐨹𐨿𐨸"])
+ ("T_=a" ["𐨚𐨹𐨸"])
+ ("T_=i" ["𐨚𐨹𐨸𐨁"])
+ ("T_=u" ["𐨚𐨹𐨸𐨂"])
+ ("T_=R" ["𐨚𐨹𐨸𐨃"])
+ ("T_=e" ["𐨚𐨹𐨸𐨅"])
+ ("T_=o" ["𐨚𐨹𐨸𐨆"])
+
+ ("Th" ["𐨛𐨿"])
+ ("Tha" ["𐨛"])
+ ("Thi" ["𐨛𐨁"])
+ ("Thu" ["𐨛𐨂"])
+ ("ThR" ["𐨛𐨃"])
+ ("The" ["𐨛𐨅"])
+ ("Tho" ["𐨛𐨆"])
+ ("Th_" ["𐨛𐨹𐨿"])
+ ("Th_a" ["𐨛𐨹"])
+ ("Th_i" ["𐨛𐨹𐨁"])
+ ("Th_u" ["𐨛𐨹𐨂"])
+ ("Th_R" ["𐨛𐨹𐨃"])
+ ("Th_e" ["𐨛𐨹𐨅"])
+ ("Th_o" ["𐨛𐨹𐨆"])
+ ("Th=" ["𐨛𐨿𐨸"])
+ ("Th=a" ["𐨛𐨸"])
+ ("Th=i" ["𐨛𐨸𐨁"])
+ ("Th=u" ["𐨛𐨸𐨂"])
+ ("Th=R" ["𐨛𐨸𐨃"])
+ ("Th=e" ["𐨛𐨸𐨅"])
+ ("Th=o" ["𐨛𐨸𐨆"])
+ ("Th_=" ["𐨛𐨹𐨿𐨸"])
+ ("Th_=a" ["𐨛𐨹𐨸"])
+ ("Th_=i" ["𐨛𐨹𐨸𐨁"])
+ ("Th_=u" ["𐨛𐨹𐨸𐨂"])
+ ("Th_=R" ["𐨛𐨹𐨸𐨃"])
+ ("Th_=e" ["𐨛𐨹𐨸𐨅"])
+ ("Th_=o" ["𐨛𐨹𐨸𐨆"])
+
+ ("D" ["𐨜𐨿"])
+ ("Da" ["𐨜"])
+ ("Di" ["𐨜𐨁"])
+ ("Du" ["𐨜𐨂"])
+ ("DR" ["𐨜𐨃"])
+ ("De" ["𐨜𐨅"])
+ ("Do" ["𐨜𐨆"])
+ ("D_" ["𐨜𐨹𐨿"])
+ ("D_a" ["𐨜𐨹"])
+ ("D_i" ["𐨜𐨹𐨁"])
+ ("D_u" ["𐨜𐨹𐨂"])
+ ("D_R" ["𐨜𐨹𐨃"])
+ ("D_e" ["𐨜𐨹𐨅"])
+ ("D_o" ["𐨜𐨹𐨆"])
+ ("D=" ["𐨜𐨿𐨸"])
+ ("D=a" ["𐨜𐨸"])
+ ("D=i" ["𐨜𐨸𐨁"])
+ ("D=u" ["𐨜𐨸𐨂"])
+ ("D=R" ["𐨜𐨸𐨃"])
+ ("D=e" ["𐨜𐨸𐨅"])
+ ("D=o" ["𐨜𐨸𐨆"])
+ ("D_=" ["𐨜𐨹𐨿𐨸"])
+ ("D_=a" ["𐨜𐨹𐨸"])
+ ("D_=i" ["𐨜𐨹𐨸𐨁"])
+ ("D_=u" ["𐨜𐨹𐨸𐨂"])
+ ("D_=R" ["𐨜𐨹𐨸𐨃"])
+ ("D_=e" ["𐨜𐨹𐨸𐨅"])
+ ("D_=o" ["𐨜𐨹𐨸𐨆"])
+
+ ("Dh" ["𐨝𐨿"])
+ ("Dha" ["𐨝"])
+ ("Dhi" ["𐨝𐨁"])
+ ("Dhu" ["𐨝𐨂"])
+ ("DhR" ["𐨝𐨃"])
+ ("Dhe" ["𐨝𐨅"])
+ ("Dho" ["𐨝𐨆"])
+ ("Dh_" ["𐨝𐨹𐨿"])
+ ("Dh_a" ["𐨝𐨹"])
+ ("Dh_i" ["𐨝𐨹𐨁"])
+ ("Dh_u" ["𐨝𐨹𐨂"])
+ ("Dh_R" ["𐨝𐨹𐨃"])
+ ("Dh_e" ["𐨝𐨹𐨅"])
+ ("Dh_o" ["𐨝𐨹𐨆"])
+ ("Dh=" ["𐨝𐨿𐨸"])
+ ("Dh=a" ["𐨝𐨸"])
+ ("Dh=i" ["𐨝𐨸𐨁"])
+ ("Dh=u" ["𐨝𐨸𐨂"])
+ ("Dh=R" ["𐨝𐨸𐨃"])
+ ("Dh=e" ["𐨝𐨸𐨅"])
+ ("Dh=o" ["𐨝𐨸𐨆"])
+ ("Dh_=" ["𐨝𐨹𐨿𐨸"])
+ ("Dh_=a" ["𐨝𐨹𐨸"])
+ ("Dh_=i" ["𐨝𐨹𐨸𐨁"])
+ ("Dh_=u" ["𐨝𐨹𐨸𐨂"])
+ ("Dh_=R" ["𐨝𐨹𐨸𐨃"])
+ ("Dh_=e" ["𐨝𐨹𐨸𐨅"])
+ ("Dh_=o" ["𐨝𐨹𐨸𐨆"])
+
+ ("N" ["𐨞𐨿"])
+ ("Na" ["𐨞"])
+ ("Ni" ["𐨞𐨁"])
+ ("Nu" ["𐨞𐨂"])
+ ("NR" ["𐨞𐨃"])
+ ("Ne" ["𐨞𐨅"])
+ ("No" ["𐨞𐨆"])
+ ("N_" ["𐨞𐨹𐨿"])
+ ("N_a" ["𐨞𐨹"])
+ ("N_i" ["𐨞𐨹𐨁"])
+ ("N_u" ["𐨞𐨹𐨂"])
+ ("N_R" ["𐨞𐨹𐨃"])
+ ("N_e" ["𐨞𐨹𐨅"])
+ ("N_o" ["𐨞𐨹𐨆"])
+ ("N=" ["𐨞𐨿𐨸"])
+ ("N=a" ["𐨞𐨸"])
+ ("N=i" ["𐨞𐨸𐨁"])
+ ("N=u" ["𐨞𐨸𐨂"])
+ ("N=R" ["𐨞𐨸𐨃"])
+ ("N=e" ["𐨞𐨸𐨅"])
+ ("N=o" ["𐨞𐨸𐨆"])
+ ("N_=" ["𐨞𐨹𐨿𐨸"])
+ ("N_=a" ["𐨞𐨹𐨸"])
+ ("N_=i" ["𐨞𐨹𐨸𐨁"])
+ ("N_=u" ["𐨞𐨹𐨸𐨂"])
+ ("N_=R" ["𐨞𐨹𐨸𐨃"])
+ ("N_=e" ["𐨞𐨹𐨸𐨅"])
+ ("N_=o" ["𐨞𐨹𐨸𐨆"])
+
+ ("t" ["𐨟𐨿"])
+ ("ta" ["𐨟"])
+ ("ti" ["𐨟𐨁"])
+ ("tu" ["𐨟𐨂"])
+ ("tR" ["𐨟𐨃"])
+ ("te" ["𐨟𐨅"])
+ ("to" ["𐨟𐨆"])
+ ("t_" ["𐨟𐨹𐨿"])
+ ("t_a" ["𐨟𐨹"])
+ ("t_i" ["𐨟𐨹𐨁"])
+ ("t_u" ["𐨟𐨹𐨂"])
+ ("t_R" ["𐨟𐨹𐨃"])
+ ("t_e" ["𐨟𐨹𐨅"])
+ ("t_o" ["𐨟𐨹𐨆"])
+ ("t=" ["𐨟𐨿𐨸"])
+ ("t=a" ["𐨟𐨸"])
+ ("t=i" ["𐨟𐨸𐨁"])
+ ("t=u" ["𐨟𐨸𐨂"])
+ ("t=R" ["𐨟𐨸𐨃"])
+ ("t=e" ["𐨟𐨸𐨅"])
+ ("t=o" ["𐨟𐨸𐨆"])
+ ("t_=" ["𐨟𐨹𐨿𐨸"])
+ ("t_=a" ["𐨟𐨹𐨸"])
+ ("t_=i" ["𐨟𐨹𐨸𐨁"])
+ ("t_=u" ["𐨟𐨹𐨸𐨂"])
+ ("t_=R" ["𐨟𐨹𐨸𐨃"])
+ ("t_=e" ["𐨟𐨹𐨸𐨅"])
+ ("t_=o" ["𐨟𐨹𐨸𐨆"])
+
+ ("th" ["𐨠𐨿"])
+ ("tha" ["𐨠"])
+ ("thi" ["𐨠𐨁"])
+ ("thu" ["𐨠𐨂"])
+ ("thR" ["𐨠𐨃"])
+ ("the" ["𐨠𐨅"])
+ ("tho" ["𐨠𐨆"])
+ ("th_" ["𐨠𐨹𐨿"])
+ ("th_a" ["𐨠𐨹"])
+ ("th_i" ["𐨠𐨹𐨁"])
+ ("th_u" ["𐨠𐨹𐨂"])
+ ("th_R" ["𐨠𐨹𐨃"])
+ ("th_e" ["𐨠𐨹𐨅"])
+ ("th_o" ["𐨠𐨹𐨆"])
+ ("th=" ["𐨠𐨿𐨸"])
+ ("th=a" ["𐨠𐨸"])
+ ("th=i" ["𐨠𐨸𐨁"])
+ ("th=u" ["𐨠𐨸𐨂"])
+ ("th=R" ["𐨠𐨸𐨃"])
+ ("th=e" ["𐨠𐨸𐨅"])
+ ("th=o" ["𐨠𐨸𐨆"])
+ ("th_=" ["𐨠𐨹𐨿𐨸"])
+ ("th_=a" ["𐨠𐨹𐨸"])
+ ("th_=i" ["𐨠𐨹𐨸𐨁"])
+ ("th_=u" ["𐨠𐨹𐨸𐨂"])
+ ("th_=R" ["𐨠𐨹𐨸𐨃"])
+ ("th_=e" ["𐨠𐨹𐨸𐨅"])
+ ("th_=o" ["𐨠𐨹𐨸𐨆"])
+
+ ("d" ["𐨡𐨿"])
+ ("da" ["𐨡"])
+ ("di" ["𐨡𐨁"])
+ ("du" ["𐨡𐨂"])
+ ("dR" ["𐨡𐨃"])
+ ("de" ["𐨡𐨅"])
+ ("do" ["𐨡𐨆"])
+ ("d_" ["𐨡𐨹𐨿"])
+ ("d_a" ["𐨡𐨹"])
+ ("d_i" ["𐨡𐨹𐨁"])
+ ("d_u" ["𐨡𐨹𐨂"])
+ ("d_R" ["𐨡𐨹𐨃"])
+ ("d_e" ["𐨡𐨹𐨅"])
+ ("d_o" ["𐨡𐨹𐨆"])
+ ("d=" ["𐨡𐨿𐨸"])
+ ("d=a" ["𐨡𐨸"])
+ ("d=i" ["𐨡𐨸𐨁"])
+ ("d=u" ["𐨡𐨸𐨂"])
+ ("d=R" ["𐨡𐨸𐨃"])
+ ("d=e" ["𐨡𐨸𐨅"])
+ ("d=o" ["𐨡𐨸𐨆"])
+ ("d_=" ["𐨡𐨹𐨿𐨸"])
+ ("d_=a" ["𐨡𐨹𐨸"])
+ ("d_=i" ["𐨡𐨹𐨸𐨁"])
+ ("d_=u" ["𐨡𐨹𐨸𐨂"])
+ ("d_=R" ["𐨡𐨹𐨸𐨃"])
+ ("d_=e" ["𐨡𐨹𐨸𐨅"])
+ ("d_=o" ["𐨡𐨹𐨸𐨆"])
+
+ ("dh" ["𐨢𐨿"])
+ ("dha" ["𐨢"])
+ ("dhi" ["𐨢𐨁"])
+ ("dhu" ["𐨢𐨂"])
+ ("dhR" ["𐨢𐨃"])
+ ("dhe" ["𐨢𐨅"])
+ ("dho" ["𐨢𐨆"])
+ ("dh_" ["𐨢𐨹𐨿"])
+ ("dh_a" ["𐨢𐨹"])
+ ("dh_i" ["𐨢𐨹𐨁"])
+ ("dh_u" ["𐨢𐨹𐨂"])
+ ("dh_R" ["𐨢𐨹𐨃"])
+ ("dh_e" ["𐨢𐨹𐨅"])
+ ("dh_o" ["𐨢𐨹𐨆"])
+ ("dh=" ["𐨢𐨿𐨸"])
+ ("dh=a" ["𐨢𐨸"])
+ ("dh=i" ["𐨢𐨸𐨁"])
+ ("dh=u" ["𐨢𐨸𐨂"])
+ ("dh=R" ["𐨢𐨸𐨃"])
+ ("dh=e" ["𐨢𐨸𐨅"])
+ ("dh=o" ["𐨢𐨸𐨆"])
+ ("dh_=" ["𐨢𐨹𐨿𐨸"])
+ ("dh_=a" ["𐨢𐨹𐨸"])
+ ("dh_=i" ["𐨢𐨹𐨸𐨁"])
+ ("dh_=u" ["𐨢𐨹𐨸𐨂"])
+ ("dh_=R" ["𐨢𐨹𐨸𐨃"])
+ ("dh_=e" ["𐨢𐨹𐨸𐨅"])
+ ("dh_=o" ["𐨢𐨹𐨸𐨆"])
+
+ ("n" ["𐨣𐨿"])
+ ("na" ["𐨣"])
+ ("ni" ["𐨣𐨁"])
+ ("nu" ["𐨣𐨂"])
+ ("nR" ["𐨣𐨃"])
+ ("ne" ["𐨣𐨅"])
+ ("no" ["𐨣𐨆"])
+ ("n_" ["𐨣𐨹𐨿"])
+ ("n_a" ["𐨣𐨹"])
+ ("n_i" ["𐨣𐨹𐨁"])
+ ("n_u" ["𐨣𐨹𐨂"])
+ ("n_R" ["𐨣𐨹𐨃"])
+ ("n_e" ["𐨣𐨹𐨅"])
+ ("n_o" ["𐨣𐨹𐨆"])
+ ("n=" ["𐨣𐨿𐨸"])
+ ("n=a" ["𐨣𐨸"])
+ ("n=i" ["𐨣𐨸𐨁"])
+ ("n=u" ["𐨣𐨸𐨂"])
+ ("n=R" ["𐨣𐨸𐨃"])
+ ("n=e" ["𐨣𐨸𐨅"])
+ ("n=o" ["𐨣𐨸𐨆"])
+ ("n_=" ["𐨣𐨹𐨿𐨸"])
+ ("n_=a" ["𐨣𐨹𐨸"])
+ ("n_=i" ["𐨣𐨹𐨸𐨁"])
+ ("n_=u" ["𐨣𐨹𐨸𐨂"])
+ ("n_=R" ["𐨣𐨹𐨸𐨃"])
+ ("n_=e" ["𐨣𐨹𐨸𐨅"])
+ ("n_=o" ["𐨣𐨹𐨸𐨆"])
+
+ ("p" ["𐨤𐨿"])
+ ("pa" ["𐨤"])
+ ("pi" ["𐨤𐨁"])
+ ("pu" ["𐨤𐨂"])
+ ("pR" ["𐨤𐨃"])
+ ("pe" ["𐨤𐨅"])
+ ("po" ["𐨤𐨆"])
+ ("p_" ["𐨤𐨹𐨿"])
+ ("p_a" ["𐨤𐨹"])
+ ("p_i" ["𐨤𐨹𐨁"])
+ ("p_u" ["𐨤𐨹𐨂"])
+ ("p_R" ["𐨤𐨹𐨃"])
+ ("p_e" ["𐨤𐨹𐨅"])
+ ("p_o" ["𐨤𐨹𐨆"])
+ ("p=" ["𐨤𐨿𐨸"])
+ ("p=a" ["𐨤𐨸"])
+ ("p=i" ["𐨤𐨸𐨁"])
+ ("p=u" ["𐨤𐨸𐨂"])
+ ("p=R" ["𐨤𐨸𐨃"])
+ ("p=e" ["𐨤𐨸𐨅"])
+ ("p=o" ["𐨤𐨸𐨆"])
+ ("p_=" ["𐨤𐨹𐨿𐨸"])
+ ("p_=a" ["𐨤𐨹𐨸"])
+ ("p_=i" ["𐨤𐨹𐨸𐨁"])
+ ("p_=u" ["𐨤𐨹𐨸𐨂"])
+ ("p_=R" ["𐨤𐨹𐨸𐨃"])
+ ("p_=e" ["𐨤𐨹𐨸𐨅"])
+ ("p_=o" ["𐨤𐨹𐨸𐨆"])
+
+ ("ph" ["𐨥𐨿"])
+ ("pha" ["𐨥"])
+ ("phi" ["𐨥𐨁"])
+ ("phu" ["𐨥𐨂"])
+ ("phR" ["𐨥𐨃"])
+ ("phe" ["𐨥𐨅"])
+ ("pho" ["𐨥𐨆"])
+ ("ph_" ["𐨥𐨹𐨿"])
+ ("ph_a" ["𐨥𐨹"])
+ ("ph_i" ["𐨥𐨹𐨁"])
+ ("ph_u" ["𐨥𐨹𐨂"])
+ ("ph_R" ["𐨥𐨹𐨃"])
+ ("ph_e" ["𐨥𐨹𐨅"])
+ ("ph_o" ["𐨥𐨹𐨆"])
+ ("ph=" ["𐨥𐨿𐨸"])
+ ("ph=a" ["𐨥𐨸"])
+ ("ph=i" ["𐨥𐨸𐨁"])
+ ("ph=u" ["𐨥𐨸𐨂"])
+ ("ph=R" ["𐨥𐨸𐨃"])
+ ("ph=e" ["𐨥𐨸𐨅"])
+ ("ph=o" ["𐨥𐨸𐨆"])
+ ("ph_=" ["𐨥𐨹𐨿𐨸"])
+ ("ph_=a" ["𐨥𐨹𐨸"])
+ ("ph_=i" ["𐨥𐨹𐨸𐨁"])
+ ("ph_=u" ["𐨥𐨹𐨸𐨂"])
+ ("ph_=R" ["𐨥𐨹𐨸𐨃"])
+ ("ph_=e" ["𐨥𐨹𐨸𐨅"])
+ ("ph_=o" ["𐨥𐨹𐨸𐨆"])
+
+ ("b" ["𐨦𐨿"])
+ ("ba" ["𐨦"])
+ ("bi" ["𐨦𐨁"])
+ ("bu" ["𐨦𐨂"])
+ ("bR" ["𐨦𐨃"])
+ ("be" ["𐨦𐨅"])
+ ("bo" ["𐨦𐨆"])
+ ("b_" ["𐨦𐨹𐨿"])
+ ("b_a" ["𐨦𐨹"])
+ ("b_i" ["𐨦𐨹𐨁"])
+ ("b_u" ["𐨦𐨹𐨂"])
+ ("b_R" ["𐨦𐨹𐨃"])
+ ("b_e" ["𐨦𐨹𐨅"])
+ ("b_o" ["𐨦𐨹𐨆"])
+ ("b=" ["𐨦𐨿𐨸"])
+ ("b=a" ["𐨦𐨸"])
+ ("b=i" ["𐨦𐨸𐨁"])
+ ("b=u" ["𐨦𐨸𐨂"])
+ ("b=R" ["𐨦𐨸𐨃"])
+ ("b=e" ["𐨦𐨸𐨅"])
+ ("b=o" ["𐨦𐨸𐨆"])
+ ("b_=" ["𐨦𐨹𐨿𐨸"])
+ ("b_=a" ["𐨦𐨹𐨸"])
+ ("b_=i" ["𐨦𐨹𐨸𐨁"])
+ ("b_=u" ["𐨦𐨹𐨸𐨂"])
+ ("b_=R" ["𐨦𐨹𐨸𐨃"])
+ ("b_=e" ["𐨦𐨹𐨸𐨅"])
+ ("b_=o" ["𐨦𐨹𐨸𐨆"])
+
+ ("bh" ["𐨧𐨿"])
+ ("bha" ["𐨧"])
+ ("bhi" ["𐨧𐨁"])
+ ("bhu" ["𐨧𐨂"])
+ ("bhR" ["𐨧𐨃"])
+ ("bhe" ["𐨧𐨅"])
+ ("bho" ["𐨧𐨆"])
+ ("bh_" ["𐨧𐨹𐨿"])
+ ("bh_a" ["𐨧𐨹"])
+ ("bh_i" ["𐨧𐨹𐨁"])
+ ("bh_u" ["𐨧𐨹𐨂"])
+ ("bh_R" ["𐨧𐨹𐨃"])
+ ("bh_e" ["𐨧𐨹𐨅"])
+ ("bh_o" ["𐨧𐨹𐨆"])
+ ("bh=" ["𐨧𐨿𐨸"])
+ ("bh=a" ["𐨧𐨸"])
+ ("bh=i" ["𐨧𐨸𐨁"])
+ ("bh=u" ["𐨧𐨸𐨂"])
+ ("bh=R" ["𐨧𐨸𐨃"])
+ ("bh=e" ["𐨧𐨸𐨅"])
+ ("bh=o" ["𐨧𐨸𐨆"])
+ ("bh_=" ["𐨧𐨹𐨿𐨸"])
+ ("bh_=a" ["𐨧𐨹𐨸"])
+ ("bh_=i" ["𐨧𐨹𐨸𐨁"])
+ ("bh_=u" ["𐨧𐨹𐨸𐨂"])
+ ("bh_=R" ["𐨧𐨹𐨸𐨃"])
+ ("bh_=e" ["𐨧𐨹𐨸𐨅"])
+ ("bh_=o" ["𐨧𐨹𐨸𐨆"])
+
+ ("m" ["𐨨𐨿"])
+ ("ma" ["𐨨"])
+ ("mi" ["𐨨𐨁"])
+ ("mu" ["𐨨𐨂"])
+ ("mR" ["𐨨𐨃"])
+ ("me" ["𐨨𐨅"])
+ ("mo" ["𐨨𐨆"])
+ ("m_" ["𐨨𐨹𐨿"])
+ ("m_a" ["𐨨𐨹"])
+ ("m_i" ["𐨨𐨹𐨁"])
+ ("m_u" ["𐨨𐨹𐨂"])
+ ("m_R" ["𐨨𐨹𐨃"])
+ ("m_e" ["𐨨𐨹𐨅"])
+ ("m_o" ["𐨨𐨹𐨆"])
+ ("m=" ["𐨨𐨿𐨸"])
+ ("m=a" ["𐨨𐨸"])
+ ("m=i" ["𐨨𐨸𐨁"])
+ ("m=u" ["𐨨𐨸𐨂"])
+ ("m=R" ["𐨨𐨸𐨃"])
+ ("m=e" ["𐨨𐨸𐨅"])
+ ("m=o" ["𐨨𐨸𐨆"])
+ ("m_=" ["𐨨𐨹𐨿𐨸"])
+ ("m_=a" ["𐨨𐨹𐨸"])
+ ("m_=i" ["𐨨𐨹𐨸𐨁"])
+ ("m_=u" ["𐨨𐨹𐨸𐨂"])
+ ("m_=R" ["𐨨𐨹𐨸𐨃"])
+ ("m_=e" ["𐨨𐨹𐨸𐨅"])
+ ("m_=o" ["𐨨𐨹𐨸𐨆"])
+
+ ("y" ["𐨩𐨿"])
+ ("ya" ["𐨩"])
+ ("yi" ["𐨩𐨁"])
+ ("yu" ["𐨩𐨂"])
+ ("yR" ["𐨩𐨃"])
+ ("ye" ["𐨩𐨅"])
+ ("yo" ["𐨩𐨆"])
+ ("y_" ["𐨩𐨹𐨿"])
+ ("y_a" ["𐨩𐨹"])
+ ("y_i" ["𐨩𐨹𐨁"])
+ ("y_u" ["𐨩𐨹𐨂"])
+ ("y_R" ["𐨩𐨹𐨃"])
+ ("y_e" ["𐨩𐨹𐨅"])
+ ("y_o" ["𐨩𐨹𐨆"])
+ ("y=" ["𐨩𐨿𐨸"])
+ ("y=a" ["𐨩𐨸"])
+ ("y=i" ["𐨩𐨸𐨁"])
+ ("y=u" ["𐨩𐨸𐨂"])
+ ("y=R" ["𐨩𐨸𐨃"])
+ ("y=e" ["𐨩𐨸𐨅"])
+ ("y=o" ["𐨩𐨸𐨆"])
+ ("y_=" ["𐨩𐨹𐨿𐨸"])
+ ("y_=a" ["𐨩𐨹𐨸"])
+ ("y_=i" ["𐨩𐨹𐨸𐨁"])
+ ("y_=u" ["𐨩𐨹𐨸𐨂"])
+ ("y_=R" ["𐨩𐨹𐨸𐨃"])
+ ("y_=e" ["𐨩𐨹𐨸𐨅"])
+ ("y_=o" ["𐨩𐨹𐨸𐨆"])
+
+ ("r" ["𐨪𐨿"])
+ ("ra" ["𐨪"])
+ ("ri" ["𐨪𐨁"])
+ ("ru" ["𐨪𐨂"])
+ ("rR" ["𐨪𐨃"])
+ ("re" ["𐨪𐨅"])
+ ("ro" ["𐨪𐨆"])
+ ("r_" ["𐨪𐨹𐨿"])
+ ("r_a" ["𐨪𐨹"])
+ ("r_i" ["𐨪𐨹𐨁"])
+ ("r_u" ["𐨪𐨹𐨂"])
+ ("r_R" ["𐨪𐨹𐨃"])
+ ("r_e" ["𐨪𐨹𐨅"])
+ ("r_o" ["𐨪𐨹𐨆"])
+ ("r=" ["𐨪𐨿𐨸"])
+ ("r=a" ["𐨪𐨸"])
+ ("r=i" ["𐨪𐨸𐨁"])
+ ("r=u" ["𐨪𐨸𐨂"])
+ ("r=R" ["𐨪𐨸𐨃"])
+ ("r=e" ["𐨪𐨸𐨅"])
+ ("r=o" ["𐨪𐨸𐨆"])
+ ("r_=" ["𐨪𐨹𐨿𐨸"])
+ ("r_=a" ["𐨪𐨹𐨸"])
+ ("r_=i" ["𐨪𐨹𐨸𐨁"])
+ ("r_=u" ["𐨪𐨹𐨸𐨂"])
+ ("r_=R" ["𐨪𐨹𐨸𐨃"])
+ ("r_=e" ["𐨪𐨹𐨸𐨅"])
+ ("r_=o" ["𐨪𐨹𐨸𐨆"])
+
+ ("l" ["𐨫𐨿"])
+ ("la" ["𐨫"])
+ ("li" ["𐨫𐨁"])
+ ("lu" ["𐨫𐨂"])
+ ("lR" ["𐨫𐨃"])
+ ("le" ["𐨫𐨅"])
+ ("lo" ["𐨫𐨆"])
+ ("l_" ["𐨫𐨹𐨿"])
+ ("l_a" ["𐨫𐨹"])
+ ("l_i" ["𐨫𐨹𐨁"])
+ ("l_u" ["𐨫𐨹𐨂"])
+ ("l_R" ["𐨫𐨹𐨃"])
+ ("l_e" ["𐨫𐨹𐨅"])
+ ("l_o" ["𐨫𐨹𐨆"])
+ ("l=" ["𐨫𐨿𐨸"])
+ ("l=a" ["𐨫𐨸"])
+ ("l=i" ["𐨫𐨸𐨁"])
+ ("l=u" ["𐨫𐨸𐨂"])
+ ("l=R" ["𐨫𐨸𐨃"])
+ ("l=e" ["𐨫𐨸𐨅"])
+ ("l=o" ["𐨫𐨸𐨆"])
+ ("l_=" ["𐨫𐨹𐨿𐨸"])
+ ("l_=a" ["𐨫𐨹𐨸"])
+ ("l_=i" ["𐨫𐨹𐨸𐨁"])
+ ("l_=u" ["𐨫𐨹𐨸𐨂"])
+ ("l_=R" ["𐨫𐨹𐨸𐨃"])
+ ("l_=e" ["𐨫𐨹𐨸𐨅"])
+ ("l_=o" ["𐨫𐨹𐨸𐨆"])
+
+ ("v" ["𐨬𐨿"])
+ ("va" ["𐨬"])
+ ("vi" ["𐨬𐨁"])
+ ("vu" ["𐨬𐨂"])
+ ("vR" ["𐨬𐨃"])
+ ("ve" ["𐨬𐨅"])
+ ("vo" ["𐨬𐨆"])
+ ("v_" ["𐨬𐨹𐨿"])
+ ("v_a" ["𐨬𐨹"])
+ ("v_i" ["𐨬𐨹𐨁"])
+ ("v_u" ["𐨬𐨹𐨂"])
+ ("v_R" ["𐨬𐨹𐨃"])
+ ("v_e" ["𐨬𐨹𐨅"])
+ ("v_o" ["𐨬𐨹𐨆"])
+ ("v=" ["𐨬𐨿𐨸"])
+ ("v=a" ["𐨬𐨸"])
+ ("v=i" ["𐨬𐨸𐨁"])
+ ("v=u" ["𐨬𐨸𐨂"])
+ ("v=R" ["𐨬𐨸𐨃"])
+ ("v=e" ["𐨬𐨸𐨅"])
+ ("v=o" ["𐨬𐨸𐨆"])
+ ("v_=" ["𐨬𐨹𐨿𐨸"])
+ ("v_=a" ["𐨬𐨹𐨸"])
+ ("v_=i" ["𐨬𐨹𐨸𐨁"])
+ ("v_=u" ["𐨬𐨹𐨸𐨂"])
+ ("v_=R" ["𐨬𐨹𐨸𐨃"])
+ ("v_=e" ["𐨬𐨹𐨸𐨅"])
+ ("v_=o" ["𐨬𐨹𐨸𐨆"])
+
+ ("z" ["𐨭𐨿"])
+ ("za" ["𐨭"])
+ ("zi" ["𐨭𐨁"])
+ ("zu" ["𐨭𐨂"])
+ ("z" ["𐨭𐨃"])
+ ("ze" ["𐨭𐨅"])
+ ("zo" ["𐨭𐨆"])
+ ("z_" ["𐨭𐨹𐨿"])
+ ("z_a" ["𐨭𐨹"])
+ ("z_i" ["𐨭𐨹𐨁"])
+ ("z_u" ["𐨭𐨹𐨂"])
+ ("z_R" ["𐨭𐨹𐨃"])
+ ("z_e" ["𐨭𐨹𐨅"])
+ ("z_o" ["𐨭𐨹𐨆"])
+ ("z=" ["𐨭𐨿𐨸"])
+ ("z=a" ["𐨭𐨸"])
+ ("z=i" ["𐨭𐨸𐨁"])
+ ("z=u" ["𐨭𐨸𐨂"])
+ ("z=R" ["𐨭𐨸𐨃"])
+ ("z=e" ["𐨭𐨸𐨅"])
+ ("z=o" ["𐨭𐨸𐨆"])
+ ("z_=" ["𐨭𐨹𐨿𐨸"])
+ ("z_=a" ["𐨭𐨹𐨸"])
+ ("z_=i" ["𐨭𐨹𐨸𐨁"])
+ ("z_=u" ["𐨭𐨹𐨸𐨂"])
+ ("z_=R" ["𐨭𐨹𐨸𐨃"])
+ ("z_=e" ["𐨭𐨹𐨸𐨅"])
+ ("z_=o" ["𐨭𐨹𐨸𐨆"])
+
+ ("S" ["𐨮𐨿"])
+ ("Sa" ["𐨮"])
+ ("Si" ["𐨮𐨁"])
+ ("Su" ["𐨮𐨂"])
+ ("SR" ["𐨮𐨃"])
+ ("Se" ["𐨮𐨅"])
+ ("So" ["𐨮𐨆"])
+ ("S_" ["𐨮𐨹𐨿"])
+ ("S_a" ["𐨮𐨹"])
+ ("S_i" ["𐨮𐨹𐨁"])
+ ("S_u" ["𐨮𐨹𐨂"])
+ ("S_R" ["𐨮𐨹𐨃"])
+ ("S_e" ["𐨮𐨹𐨅"])
+ ("S_o" ["𐨮𐨹𐨆"])
+ ("S=" ["𐨮𐨿𐨸"])
+ ("S=a" ["𐨮𐨸"])
+ ("S=i" ["𐨮𐨸𐨁"])
+ ("S=u" ["𐨮𐨸𐨂"])
+ ("S=R" ["𐨮𐨸𐨃"])
+ ("S=e" ["𐨮𐨸𐨅"])
+ ("S=o" ["𐨮𐨸𐨆"])
+ ("S_=" ["𐨮𐨹𐨿𐨸"])
+ ("S_=a" ["𐨮𐨹𐨸"])
+ ("S_=i" ["𐨮𐨹𐨸𐨁"])
+ ("S_=u" ["𐨮𐨹𐨸𐨂"])
+ ("S_=R" ["𐨮𐨹𐨸𐨃"])
+ ("S_=e" ["𐨮𐨹𐨸𐨅"])
+ ("S_=o" ["𐨮𐨹𐨸𐨆"])
+
+ ("s" ["𐨯𐨿"])
+ ("sa" ["𐨯"])
+ ("si" ["𐨯𐨁"])
+ ("su" ["𐨯𐨂"])
+ ("sR" ["𐨯𐨃"])
+ ("se" ["𐨯𐨅"])
+ ("so" ["𐨯𐨆"])
+ ("s_" ["𐨯𐨹𐨿"])
+ ("s_a" ["𐨯𐨹"])
+ ("s_i" ["𐨯𐨹𐨁"])
+ ("s_u" ["𐨯𐨹𐨂"])
+ ("s_R" ["𐨯𐨹𐨃"])
+ ("s_e" ["𐨯𐨹𐨅"])
+ ("s_o" ["𐨯𐨹𐨆"])
+ ("s=" ["𐨯𐨿𐨸"])
+ ("s=a" ["𐨯𐨸"])
+ ("s=i" ["𐨯𐨸𐨁"])
+ ("s=u" ["𐨯𐨸𐨂"])
+ ("s=R" ["𐨯𐨸𐨃"])
+ ("s=e" ["𐨯𐨸𐨅"])
+ ("s=o" ["𐨯𐨸𐨆"])
+ ("s_=" ["𐨯𐨹𐨿𐨸"])
+ ("s_=a" ["𐨯𐨹𐨸"])
+ ("s_=i" ["𐨯𐨹𐨸𐨁"])
+ ("s_=u" ["𐨯𐨹𐨸𐨂"])
+ ("s_=R" ["𐨯𐨹𐨸𐨃"])
+ ("s_=e" ["𐨯𐨹𐨸𐨅"])
+ ("s_=o" ["𐨯𐨹𐨸𐨆"])
+
+ ("h" ["𐨱𐨿"])
+ ("ha" ["𐨱"])
+ ("hi" ["𐨱𐨁"])
+ ("hu" ["𐨱𐨂"])
+ ("hR" ["𐨱𐨃"])
+ ("he" ["𐨱𐨅"])
+ ("ho" ["𐨱𐨆"])
+ ("h_" ["𐨱𐨹𐨿"])
+ ("h_a" ["𐨱𐨹"])
+ ("h_i" ["𐨱𐨹𐨁"])
+ ("h_u" ["𐨱𐨹𐨂"])
+ ("h_R" ["𐨱𐨹𐨃"])
+ ("h_e" ["𐨱𐨹𐨅"])
+ ("h_o" ["𐨱𐨹𐨆"])
+ ("h=" ["𐨱𐨿𐨸"])
+ ("h=a" ["𐨱𐨸"])
+ ("h=i" ["𐨱𐨸𐨁"])
+ ("h=u" ["𐨱𐨸𐨂"])
+ ("h=R" ["𐨱𐨸𐨃"])
+ ("h=e" ["𐨱𐨸𐨅"])
+ ("h=o" ["𐨱𐨸𐨆"])
+ ("h_=" ["𐨱𐨹𐨿𐨸"])
+ ("h_=a" ["𐨱𐨹𐨸"])
+ ("h_=i" ["𐨱𐨹𐨸𐨁"])
+ ("h_=u" ["𐨱𐨹𐨸𐨂"])
+ ("h_=R" ["𐨱𐨹𐨸𐨃"])
+ ("h_=e" ["𐨱𐨹𐨸𐨅"])
+ ("h_=o" ["𐨱𐨹𐨸𐨆"])
+
+ ("k'" ["𐨲𐨿"])
+ ("k'a" ["𐨲"])
+ ("k'i" ["𐨲𐨁"])
+ ("k'u" ["𐨲𐨂"])
+ ("k'R" ["𐨲𐨃"])
+ ("k'e" ["𐨲𐨅"])
+ ("k'o" ["𐨲𐨆"])
+ ("k'_" ["𐨲𐨹𐨿"])
+ ("k'_a" ["𐨲𐨹"])
+ ("k'_i" ["𐨲𐨹𐨁"])
+ ("k'_u" ["𐨲𐨹𐨂"])
+ ("k'_R" ["𐨲𐨹𐨃"])
+ ("k'_e" ["𐨲𐨹𐨅"])
+ ("k'_o" ["𐨲𐨹𐨆"])
+ ("k'=" ["𐨲𐨿𐨸"])
+ ("k'=a" ["𐨲𐨸"])
+ ("k'=i" ["𐨲𐨸𐨁"])
+ ("k'=u" ["𐨲𐨸𐨂"])
+ ("k'=R" ["𐨲𐨸𐨃"])
+ ("k'=e" ["𐨲𐨸𐨅"])
+ ("k'=o" ["𐨲𐨸𐨆"])
+ ("k'_=" ["𐨲𐨹𐨿𐨸"])
+ ("k'_=a" ["𐨲𐨹𐨸"])
+ ("k'_=i" ["𐨲𐨹𐨸𐨁"])
+ ("k'_=u" ["𐨲𐨹𐨸𐨂"])
+ ("k'_=R" ["𐨲𐨹𐨸𐨃"])
+ ("k'_=e" ["𐨲𐨹𐨸𐨅"])
+ ("k'_=o" ["𐨲𐨹𐨸𐨆"])
+
+ ("T'" ["𐨴𐨿"])
+ ("T'a" ["𐨴"])
+ ("T'i" ["𐨴𐨁"])
+ ("T'u" ["𐨴𐨂"])
+ ("T'R" ["𐨴𐨃"])
+ ("T'e" ["𐨴𐨅"])
+ ("T'o" ["𐨴𐨆"])
+ ("T'_" ["𐨴𐨹𐨿"])
+ ("T'_a" ["𐨴𐨹"])
+ ("T'_i" ["𐨴𐨹𐨁"])
+ ("T'_u" ["𐨴𐨹𐨂"])
+ ("T'_R" ["𐨴𐨹𐨃"])
+ ("T'_e" ["𐨴𐨹𐨅"])
+ ("T'_o" ["𐨴𐨹𐨆"])
+ ("T'=" ["𐨴𐨿𐨸"])
+ ("T'=a" ["𐨴𐨸"])
+ ("T'=i" ["𐨴𐨸𐨁"])
+ ("T'=u" ["𐨴𐨸𐨂"])
+ ("T'=R" ["𐨴𐨸𐨃"])
+ ("T'=e" ["𐨴𐨸𐨅"])
+ ("T'=o" ["𐨴𐨸𐨆"])
+ ("T'_=" ["𐨴𐨹𐨿𐨸"])
+ ("T'_=a" ["𐨴𐨹𐨸"])
+ ("T'_=i" ["𐨴𐨹𐨸𐨁"])
+ ("T'_=u" ["𐨴𐨹𐨸𐨂"])
+ ("T'_=R" ["𐨴𐨹𐨸𐨃"])
+ ("T'_=e" ["𐨴𐨹𐨸𐨅"])
+ ("T'_=o" ["𐨴𐨹𐨸𐨆"])
+
+ ("Th'" ["𐨳𐨿"])
+ ("Th'a" ["𐨳"])
+ ("Th'i" ["𐨳𐨁"])
+ ("Th'u" ["𐨳𐨂"])
+ ("Th'R" ["𐨳𐨃"])
+ ("Th'e" ["𐨳𐨅"])
+ ("Th'o" ["𐨳𐨆"])
+ ("Th'_" ["𐨳𐨹𐨿"])
+ ("Th'_a" ["𐨳𐨹"])
+ ("Th'_i" ["𐨳𐨹𐨁"])
+ ("Th'_u" ["𐨳𐨹𐨂"])
+ ("Th'_R" ["𐨳𐨹𐨃"])
+ ("Th'_e" ["𐨳𐨹𐨅"])
+ ("Th'_o" ["𐨳𐨹𐨆"])
+ ("Th'=" ["𐨳𐨿𐨸"])
+ ("Th'=a" ["𐨳𐨸"])
+ ("Th'=i" ["𐨳𐨸𐨁"])
+ ("Th'=u" ["𐨳𐨸𐨂"])
+ ("Th'=R" ["𐨳𐨸𐨃"])
+ ("Th'=e" ["𐨳𐨸𐨅"])
+ ("Th'=o" ["𐨳𐨸𐨆"])
+ ("Th'_=" ["𐨳𐨹𐨿𐨸"])
+ ("Th'_=a" ["𐨳𐨹𐨸"])
+ ("Th'_=i" ["𐨳𐨹𐨸𐨁"])
+ ("Th'_=u" ["𐨳𐨹𐨸𐨂"])
+ ("Th'_=R" ["𐨳𐨹𐨸𐨃"])
+ ("Th'_=e" ["𐨳𐨹𐨸𐨅"])
+ ("Th'_=o" ["𐨳𐨹𐨸𐨆"])
+
+ ("vh" ["𐨵𐨿"])
+ ("vha" ["𐨵"])
+ ("vhi" ["𐨵𐨁"])
+ ("vhu" ["𐨵𐨂"])
+ ("vhR" ["𐨵𐨃"])
+ ("vhe" ["𐨵𐨅"])
+ ("vho" ["𐨵𐨆"])
+ ("vh_" ["𐨵𐨹𐨿"])
+ ("vh_a" ["𐨵𐨹"])
+ ("vh_i" ["𐨵𐨹𐨁"])
+ ("vh_u" ["𐨵𐨹𐨂"])
+ ("vh_R" ["𐨵𐨹𐨃"])
+ ("vh_e" ["𐨵𐨹𐨅"])
+ ("vh_o" ["𐨵𐨹𐨆"])
+ ("vh=" ["𐨵𐨿𐨸"])
+ ("vh=a" ["𐨵𐨸"])
+ ("vh=i" ["𐨵𐨸𐨁"])
+ ("vh=u" ["𐨵𐨸𐨂"])
+ ("vh=R" ["𐨵𐨸𐨃"])
+ ("vh=e" ["𐨵𐨸𐨅"])
+ ("vh=o" ["𐨵𐨸𐨆"])
+ ("vh_=" ["𐨵𐨹𐨿𐨸"])
+ ("vh_=a" ["𐨵𐨹𐨸"])
+ ("vh_=i" ["𐨵𐨹𐨸𐨁"])
+ ("vh_=u" ["𐨵𐨹𐨸𐨂"])
+ ("vh_=R" ["𐨵𐨹𐨸𐨃"])
+ ("vh_=e" ["𐨵𐨹𐨸𐨅"])
+ ("vh_=o" ["𐨵𐨹𐨸𐨆"])
+
+ ("M" ?𐨎)
+ ("H" ?𐨏)
+ ("\\" ?𐨌)
+ (";;" ?𐨍)
+
+ ("1" ?𐩀)
+ ("2" ?𐩁)
+ ("3" ?𐩂)
+ ("4" ?𐩃)
+ ("10" ?𐩄)
+ ("20" ?𐩅)
+ ("100" ?𐩆)
+ ("1000" ?𐩇)
+
+ (".." ?𐩐)
+ (".o" ?𐩑)
+ (".O" ?𐩒)
+ (".E" ?𐩓)
+ (".X" ?𐩔)
+ (".L" ?𐩕)
+ (".|" ?𐩖)
+ (".||" ?𐩗)
+ (".=" ?𐩘))
+
+(provide 'misc-lang)
+;;; misc-lang.el ends here
diff --git a/lisp/leim/quail/philippine.el b/lisp/leim/quail/philippine.el
new file mode 100644
index 0000000000..9afbdc354e
--- /dev/null
+++ b/lisp/leim/quail/philippine.el
@@ -0,0 +1,152 @@
+;;; philippine.el --- Quail package for inputting Philippine characters  -*- 
lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Author: समीर सिंह Sameer Singh <lumarzeli30@gmail.com>
+;; Keywords: multilingual, input method, i18n, Philippines
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Input methods for Philippine languages.
+
+;;; Code:
+
+(require 'quail)
+
+;; This input method supports languages like Tagalog, Hanunoo, Buhid and
+;; Tagbanwa, using the Baybayin script.
+(quail-define-package
+ "tagalog" "Tagalog" "ᜊ" nil "Tagalog phonetic input method."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q"  ?₱)
+ ("w"  ?ᜏ)
+ ("r"  ?ᜍ)
+ ("R"  ?ᜟ)
+ ("t"  ?ᜆ)
+ ("y"  ?ᜌ)
+ ("u"  ?ᜓ)
+ ("U"  ?ᜂ)
+ ("i"  ?ᜒ)
+ ("I"  ?ᜁ)
+ ("p"  ?ᜉ)
+ ("a"  ?ᜀ)
+ ("s"  ?ᜐ)
+ ("d"  ?ᜇ)
+ ("f"  ?᜔)
+ ("g"  ?ᜄ)
+ ("h"  ?ᜑ)
+ ("j"  ?᜵)
+ ("J"  ?᜶)
+ ("k"  ?ᜃ)
+ ("l"  ?ᜎ)
+ ("v"  ?᜕)
+ ("b"  ?ᜊ)
+ ("n"  ?ᜈ)
+ ("N"  ?ᜅ)
+ ("m"  ?ᜋ))
+
+(quail-define-package
+ "hanunoo" "Hanunoo" "ᜱ" nil "Hanunoo phonetic input method."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q"  ?₱)
+ ("w"  ?ᜯ)
+ ("r"  ?ᜭ)
+ ("t"  ?ᜦ)
+ ("y"  ?ᜬ)
+ ("u"  ?ᜳ)
+ ("U"  ?ᜢ)
+ ("i"  ?ᜲ)
+ ("I"  ?ᜡ)
+ ("p"  ?ᜩ)
+ ("a"  ?ᜠ)
+ ("s"  ?ᜰ)
+ ("d"  ?ᜧ)
+ ("f"  ?᜴)
+ ("g"  ?ᜤ)
+ ("h"  ?ᜱ)
+ ("j"  ?᜵)
+ ("J"  ?᜶)
+ ("k"  ?ᜣ)
+ ("l"  ?ᜮ)
+ ("b"  ?ᜪ)
+ ("n"  ?ᜨ)
+ ("N"  ?ᜥ)
+ ("m"  ?ᜫ))
+
+(quail-define-package
+ "buhid" "Buhid" "ᝊᝓ" nil "Buhid phonetic input method."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q"  ?₱)
+ ("w"  ?ᝏ)
+ ("r"  ?ᝍ)
+ ("t"  ?ᝆ)
+ ("y"  ?ᝌ)
+ ("u"  ?ᝓ)
+ ("U"  ?ᝂ)
+ ("i"  ?ᝒ)
+ ("I"  ?ᝁ)
+ ("p"  ?ᝉ)
+ ("a"  ?ᝀ)
+ ("s"  ?ᝐ)
+ ("d"  ?ᝇ)
+ ("g"  ?ᝄ)
+ ("h"  ?ᝑ)
+ ("j"  ?᜵)
+ ("J"  ?᜶)
+ ("k"  ?ᝃ)
+ ("l"  ?ᝎ)
+ ("b"  ?ᝊ)
+ ("n"  ?ᝈ)
+ ("N"  ?ᝅ)
+ ("m"  ?ᝋ))
+
+(quail-define-package
+ "tagbanwa" "Tagbanwa" "ᝦ" nil "Tagbanwa phonetic input method."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q"  ?₱)
+ ("w"  ?ᝯ)
+ ("t"  ?ᝦ)
+ ("y"  ?ᝬ)
+ ("u"  ?ᝳ)
+ ("U"  ?ᝢ)
+ ("i"  ?ᝲ)
+ ("I"  ?ᝡ)
+ ("p"  ?ᝩ)
+ ("a"  ?ᝠ)
+ ("s"  ?ᝰ)
+ ("d"  ?ᝧ)
+ ("g"  ?ᝤ)
+ ("j"  ?᜵)
+ ("J"  ?᜶)
+ ("k"  ?ᝣ)
+ ("l"  ?ᝮ)
+ ("b"  ?ᝪ)
+ ("n"  ?ᝨ)
+ ("N"  ?ᝥ)
+ ("m"  ?ᝫ))
+
+(provide 'philippine)
+;;; philippine.el ends here
diff --git a/lisp/loadup.el b/lisp/loadup.el
index 6ca699f901..aa15a3bbe8 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -245,6 +245,8 @@
 (load "language/khmer")
 (load "language/burmese")
 (load "language/cham")
+(load "language/philippine")
+(load "language/indonesian")
 
 (load "indent")
 (let ((max-specpdl-size (max max-specpdl-size 1800)))
diff --git a/lisp/lpr.el b/lisp/lpr.el
index 01617ef912..88b0607b11 100644
--- a/lisp/lpr.el
+++ b/lisp/lpr.el
@@ -125,7 +125,7 @@ and print the result."
 (defcustom print-region-function
   (if (memq system-type '(ms-dos windows-nt))
       (progn
-        (declare-function w32-direct-print-region-function "w32-fns")
+        (declare-function w32-direct-print-region-function "dos-w32")
         #'w32-direct-print-region-function)
     #'call-process-region)
   "Function to call to print the region on a printer.
diff --git a/lisp/ls-lisp.el b/lisp/ls-lisp.el
index 33dd98ef8d..6d1f449568 100644
--- a/lisp/ls-lisp.el
+++ b/lisp/ls-lisp.el
@@ -621,14 +621,22 @@ in some standard C libraries does."
                 (sub2 (substring s2 ni2 e2))
                 ;; "Fraction" is a numerical sequence with leading zeros.
                 (fr1 (string-match "\\`0+" sub1))
-                (fr2 (string-match "\\`0+" sub2)))
+                (efr1 (match-end 0))
+                (fr2 (string-match "\\`0+" sub2))
+                (efr2 (match-end 0)))
            (cond
-            ((and fr1 fr2)     ; two fractions, the shortest wins
-             (setq val (- val (- (length sub1) (length sub2)))))
+             ;; Two fractions: the longer one is less than the other,
+             ;; but only if the "common prefix" is all-zeroes,
+             ;; otherwise fall back on numerical comparison.
+            ((and fr1 fr2)
+             (if (or (and (< efr1 (- e1 ni1)) (< efr2 (- e2 ni2))
+                          (not (eq (aref sub1 efr1) (aref sub2 efr2))))
+                     (= efr1 (- e1 ni1)) (=  efr2 (- e2 ni2)))
+                 (setq val (- val (- (length sub1) (length sub2))))))
             (fr1               ; a fraction is always less than an integral
-             (setq val (- ni1)))
+             (setq val (- 0 ni1 1)))   ; make sure val is non-zero
             (fr2
-             (setq val ni2)))
+             (setq val (1+ ni2))))     ; make sure val is non-zero
            (if (zerop val)     ; fall back on numerical comparison
                (setq val (- (string-to-number sub1)
                             (string-to-number sub2))))
diff --git a/lisp/mail/emacsbug.el b/lisp/mail/emacsbug.el
index 8cb4a00009..df2b7a7453 100644
--- a/lisp/mail/emacsbug.el
+++ b/lisp/mail/emacsbug.el
@@ -516,6 +516,7 @@ Message buffer where you can explain more about the patch."
     (view-mode 1)
     (button-mode 1))
   (message-mail-other-window report-emacs-bug-address subject)
+  (message-goto-body)
   (insert "\n\n\n")
   (emacs-bug--system-description)
   (mml-attach-file file "text/patch" nil "attachment")
diff --git a/lisp/mail/feedmail.el b/lisp/mail/feedmail.el
index 35e9f73f8c..af12417f70 100644
--- a/lisp/mail/feedmail.el
+++ b/lisp/mail/feedmail.el
@@ -1619,7 +1619,8 @@ local gurus."
                 (if (null mail-interactive) '("-oem" "-odb")))))
 
 (declare-function smtpmail-via-smtp "smtpmail"
-                 (recipient smtpmail-text-buffer &optional ask-for-password))
+                 (recipient smtpmail-text-buffer &optional ask-for-password
+                             send-attempts))
 (defvar smtpmail-smtp-server)
 
 ;; provided by jam@austin.asc.slb.com (James A. McLaughlin);
diff --git a/lisp/mail/footnote.el b/lisp/mail/footnote.el
index a985a21255..29e16c419b 100644
--- a/lisp/mail/footnote.el
+++ b/lisp/mail/footnote.el
@@ -41,11 +41,11 @@
 ;; + The key sequence 'C-c ! a C-y C-c ! b' should auto-fill the
 ;;   footnote in adaptive fill mode.  This does not seem to be a bug in
 ;;   `adaptive-fill' because it behaves that way on all point movements
-;; + Handle footmode mode elegantly in all modes, even if that means refuses to
+;; + Handle footnote mode elegantly in all modes, even if that means refusing 
to
 ;;   accept the burden.  For example, in a programming language mode, footnotes
 ;;   should be commented.
-;; + Manually autofilling the a first footnote should not cause it to
-;;   wrap into the footnote section tag
+;; + Manually autofilling the first footnote should not cause it to
+;;   wrap into the footnote section tag.
 ;;   + Current solution adds a second newline after the section tag, so it is
 ;;     clearly a separate paragraph.  There may be stylistic objections to 
this.
 ;; + Footnotes with multiple paragraphs should not have their first
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 6b058d09f9..adb61aa09d 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -537,7 +537,7 @@ Examples:
 ;; Note: this is matched with case-fold-search bound to t.
 (defcustom rmail-re-abbrevs
   
"\\(RE\\|رد\\|回复\\|回覆\\|SV\\|Antw\\|VS\\|REF\\|AW\\|ΑΠ\\|ΣΧΕΤ\\|השב\\|Vá\\|R\\|RIF\\|BLS\\|RES\\|Odp\\|YNT\\|ATB\\)"
-  "Regexp with localized 'Re:' abbreviations in various languages."
+  "Regexp with localized \"Re:\" abbreviations in various languages."
   :version "28.1"
   :type 'regexp)
 
@@ -4592,8 +4592,6 @@ Argument MIME is non-nil if this is a mime message."
           armor-end-regexp
           (buffer-substring armor-start (- (point-max) after-end)))))
 
-(declare-function rmail-mime-entity-truncated "rmailmm" (entity))
-
 ;; Should this have a key-binding, or be in a menu?
 ;; There doesn't really seem to be an appropriate menu.
 ;; Eg the edit command is not in a menu either.
diff --git a/lisp/mail/rmailsum.el b/lisp/mail/rmailsum.el
index 59c2e578d3..b23fbc3f60 100644
--- a/lisp/mail/rmailsum.el
+++ b/lisp/mail/rmailsum.el
@@ -1475,7 +1475,7 @@ argument says to read a file name and use that file as 
the inbox."
   (forward-line -1))
 
 (declare-function rmail-abort-edit "rmailedit" ())
-(declare-function rmail-cease-edit "rmailedit"())
+(declare-function rmail-cease-edit "rmailedit" (&optional abort))
 (declare-function rmail-set-label "rmailkwd" (l state &optional n))
 (declare-function rmail-output-read-file-name "rmailout" ())
 (declare-function mail-send-and-exit "sendmail" (&optional arg))
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index 9a3181afb8..488bf05f3a 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -2320,8 +2320,29 @@ Buffers menu is regenerated."
              (cdr elt)))
          buf)))
 
-;; Used to cache the menu entries for commands in the Buffers menu
-(defvar menu-bar-buffers-menu-command-entries nil)
+(defvar menu-bar-buffers-menu-command-entries
+  (list '(command-separator "--")
+       (list 'next-buffer
+             'menu-item
+             "Next Buffer"
+             'next-buffer
+             :help "Switch to the \"next\" buffer in a cyclic order")
+       (list 'previous-buffer
+             'menu-item
+             "Previous Buffer"
+             'previous-buffer
+             :help "Switch to the \"previous\" buffer in a cyclic order")
+       (list 'select-named-buffer
+             'menu-item
+             "Select Named Buffer..."
+             'switch-to-buffer
+             :help "Prompt for a buffer name, and select that buffer in the 
current window")
+       (list 'list-all-buffers
+             'menu-item
+             "List All Buffers"
+             'list-buffers
+             :help "Pop up a window listing all Emacs buffers"))
+  "Entries to be included at the end of the \"Buffers\" menu.")
 
 (defvar menu-bar-select-buffer-function 'switch-to-buffer
   "Function to select the buffer chosen from the `Buffers' menu-bar menu.
@@ -2406,35 +2427,7 @@ It must accept a buffer as its only required argument.")
                          `((frames-separator "--")
                            (frames menu-item "Frames" ,frames-menu))))))
 
-        ;; Add in some normal commands at the end of the menu.  We use
-        ;; the copy cached in `menu-bar-buffers-menu-command-entries'
-        ;; if it's been set already.  Note that we can't use constant
-        ;; lists for the menu-entries, because the low-level menu-code
-        ;; modifies them.
-        (unless menu-bar-buffers-menu-command-entries
-          (setq menu-bar-buffers-menu-command-entries
-                (list '(command-separator "--")
-                      (list 'next-buffer
-                            'menu-item
-                            "Next Buffer"
-                            'next-buffer
-                            :help "Switch to the \"next\" buffer in a cyclic 
order")
-                      (list 'previous-buffer
-                            'menu-item
-                            "Previous Buffer"
-                            'previous-buffer
-                            :help "Switch to the \"previous\" buffer in a 
cyclic order")
-                      (list 'select-named-buffer
-                            'menu-item
-                            "Select Named Buffer..."
-                            'switch-to-buffer
-                            :help "Prompt for a buffer name, and select that 
buffer in the current window")
-                      (list 'list-all-buffers
-                            'menu-item
-                            "List All Buffers"
-                            'list-buffers
-                            :help "Pop up a window listing all Emacs buffers"
-                            ))))
+        ;; Add in some normal commands at the end of the menu.
         (setq buffers-menu
               (nconc buffers-menu menu-bar-buffers-menu-command-entries))
 
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index fb473cf71b..23251a5474 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -902,10 +902,10 @@ If the value is t, the *Completions* buffer is displayed 
whenever completion
 is requested but cannot be done.
 If the value is `lazy', the *Completions* buffer is only displayed after
 the second failed attempt to complete.
-If the value is 'always', the *Completions* buffer is always shown
+If the value is `always', the *Completions* buffer is always shown
 after a completion attempt, and the list of completions is updated if
 already visible.
-If the value is 'visible', the *Completions* buffer is displayed
+If the value is `visible', the *Completions* buffer is displayed
 whenever completion is requested but cannot be done for the first time,
 but remains visible thereafter, and the list of completions in it is
 updated for subsequent attempts to complete.."
@@ -1001,7 +1001,11 @@ and DOC describes the way this style of completion 
works.")
 The available styles are listed in `completion-styles-alist'.
 
 Note that `completion-category-overrides' may override these
-styles for specific categories, such as files, buffers, etc."
+styles for specific categories, such as files, buffers, etc.
+
+Note that Tramp host name completion (e.g., \"/ssh:ho<TAB>\")
+currently doesn't work if this list doesn't contain at least one
+of `basic', `emacs22' or `emacs21'."
   :type completion--styles-type
   :version "23.1")
 
@@ -1418,9 +1422,10 @@ scroll the window of possible completions."
     (let ((window minibuffer-scroll-window))
       (with-current-buffer (window-buffer window)
         (cond
-         ;; Here this is possible only when second-tab, so jump now.
-         (completion-auto-select
-          (switch-to-completions))
+         ;; Here this is possible only when second-tab, but instead of
+         ;; scrolling the completion list window, switch to it below,
+         ;; outside of `with-current-buffer'.
+         ((eq completion-auto-select 'second-tab))
          ;; Reverse tab
          ((equal (this-command-keys) [backtab])
           (if (pos-visible-in-window-p (point-min) window)
@@ -1434,15 +1439,22 @@ scroll the window of possible completions."
               ;; If end is in view, scroll up to the end.
               (set-window-start window (point-min) nil)
             ;; Else scroll down one screen.
-            (with-selected-window window (scroll-up)))))
-        nil)))
+            (with-selected-window window (scroll-up))))))
+      (when (eq completion-auto-select 'second-tab)
+        (switch-to-completions))
+      nil))
    ;; If we're cycling, keep on cycling.
    ((and completion-cycling completion-all-sorted-completions)
     (minibuffer-force-complete beg end)
     t)
-   (t (pcase (completion--do-completion beg end)
-        (#b000 nil)
-        (_     t)))))
+   (t (prog1 (pcase (completion--do-completion beg end)
+               (#b000 nil)
+               (_     t))
+        (when (and (eq completion-auto-select t)
+                   (window-live-p minibuffer-scroll-window)
+                   (eq t (frame-visible-p (window-frame 
minibuffer-scroll-window))))
+          ;; When the completion list window was displayed, select it.
+          (switch-to-completions))))))
 
 (defun completion--cache-all-sorted-completions (beg end comps)
   (add-hook 'after-change-functions
@@ -1714,52 +1726,57 @@ If `minibuffer-completion-confirm' is 
`confirm-after-completion',
   "Exit from `require-match' minibuffer.
 COMPLETION-FUNCTION is called if the current buffer's content does not
 appear to be a match."
-    (cond
-     ;; Allow user to specify null string
+  (cond
+   ;; Allow user to specify null string
    ((= beg end) (funcall exit-function))
-     ((test-completion (buffer-substring beg end)
-                       minibuffer-completion-table
-                       minibuffer-completion-predicate)
-      ;; FIXME: completion-ignore-case has various slightly
-      ;; incompatible meanings.  E.g. it can reflect whether the user
-      ;; wants completion to pay attention to case, or whether the
-      ;; string will be used in a context where case is significant.
-      ;; E.g. usually try-completion should obey the first, whereas
-      ;; test-completion should obey the second.
-      (when completion-ignore-case
-        ;; Fixup case of the field, if necessary.
-        (let* ((string (buffer-substring beg end))
-               (compl (try-completion
-                       string
-                       minibuffer-completion-table
-                       minibuffer-completion-predicate)))
-          (when (and (stringp compl) (not (equal string compl))
-                     ;; If it weren't for this piece of paranoia, I'd replace
-                     ;; the whole thing with a call to do-completion.
-                     ;; This is important, e.g. when the current minibuffer's
-                     ;; content is a directory which only contains a single
-                     ;; file, so `try-completion' actually completes to
-                     ;; that file.
-                     (= (length string) (length compl)))
-            (completion--replace beg end compl))))
-      (funcall exit-function))
-
-     ((memq minibuffer-completion-confirm '(confirm confirm-after-completion))
-      ;; The user is permitted to exit with an input that's rejected
-      ;; by test-completion, after confirming her choice.
-      (if (or (eq last-command this-command)
-              ;; For `confirm-after-completion' we only ask for confirmation
-              ;; if trying to exit immediately after typing TAB (this
-              ;; catches most minibuffer typos).
-              (and (eq minibuffer-completion-confirm 'confirm-after-completion)
-                   (not (memq last-command minibuffer-confirm-exit-commands))))
+   ;; The CONFIRM argument is a predicate.
+   ((and (functionp minibuffer-completion-confirm)
+         (funcall minibuffer-completion-confirm
+                  (buffer-substring beg end)))
+    (funcall exit-function))
+   ;; See if we have a completion from the table.
+   ((test-completion (buffer-substring beg end)
+                     minibuffer-completion-table
+                     minibuffer-completion-predicate)
+    ;; FIXME: completion-ignore-case has various slightly
+    ;; incompatible meanings.  E.g. it can reflect whether the user
+    ;; wants completion to pay attention to case, or whether the
+    ;; string will be used in a context where case is significant.
+    ;; E.g. usually try-completion should obey the first, whereas
+    ;; test-completion should obey the second.
+    (when completion-ignore-case
+      ;; Fixup case of the field, if necessary.
+      (let* ((string (buffer-substring beg end))
+             (compl (try-completion
+                     string
+                     minibuffer-completion-table
+                     minibuffer-completion-predicate)))
+        (when (and (stringp compl) (not (equal string compl))
+                   ;; If it weren't for this piece of paranoia, I'd replace
+                   ;; the whole thing with a call to do-completion.
+                   ;; This is important, e.g. when the current minibuffer's
+                   ;; content is a directory which only contains a single
+                   ;; file, so `try-completion' actually completes to
+                   ;; that file.
+                   (= (length string) (length compl)))
+          (completion--replace beg end compl))))
+    (funcall exit-function))
+   ;; The user is permitted to exit with an input that's rejected
+   ;; by test-completion, after confirming her choice.
+   ((memq minibuffer-completion-confirm '(confirm confirm-after-completion))
+    (if (or (eq last-command this-command)
+            ;; For `confirm-after-completion' we only ask for confirmation
+            ;; if trying to exit immediately after typing TAB (this
+            ;; catches most minibuffer typos).
+            (and (eq minibuffer-completion-confirm 'confirm-after-completion)
+                 (not (memq last-command minibuffer-confirm-exit-commands))))
         (funcall exit-function)
-        (minibuffer-message "Confirm")
-        nil))
+      (minibuffer-message "Confirm")
+      nil))
 
-     (t
-      ;; Call do-completion, but ignore errors.
-      (funcall completion-function))))
+   (t
+    ;; Call do-completion, but ignore errors.
+    (funcall completion-function))))
 
 (defun completion--try-word-completion (string table predicate point md)
   (let ((comp (completion-try-completion string table predicate point md)))
@@ -2070,11 +2087,11 @@ Runs of equal candidate strings are eliminated.  
GROUP-FUN is a
       (when prefix
         (let ((beg (point))
               (end (progn (insert prefix) (point))))
-          (put-text-property beg end 'mouse-face nil)))
+          (add-text-properties beg end `(mouse-face nil completion--string 
,(car str)))))
       (completion--insert (car str) group-fun)
       (let ((beg (point))
             (end (progn (insert suffix) (point))))
-        (put-text-property beg end 'mouse-face nil)
+        (add-text-properties beg end `(mouse-face nil completion--string ,(car 
str)))
         ;; Put the predefined face only when suffix
         ;; is added via annotation-function without prefix,
         ;; and when the caller doesn't use own face.
@@ -2543,7 +2560,10 @@ Also respects the obsolete wrapper hook 
`completion-in-region-functions'.
   ;; FIXME: Only works if completion-in-region-mode was activated via
   ;; completion-at-point called directly.
   "M-?" #'completion-help-at-point
-  "TAB" #'completion-at-point)
+  "TAB" #'completion-at-point
+  "M-<up>"   #'minibuffer-previous-completion
+  "M-<down>" #'minibuffer-next-completion
+  "M-RET"    #'minibuffer-choose-completion)
 
 ;; It is difficult to know when to exit completion-in-region-mode (i.e. hide
 ;; the *Completions*).  Here's how previous packages did it:
@@ -2590,6 +2610,7 @@ Also respects the obsolete wrapper hook 
`completion-in-region-functions'.
     (cl-assert completion-in-region-mode-predicate)
     (setq completion-in-region-mode--predicate
          completion-in-region-mode-predicate)
+    (setq-local minibuffer-completion-auto-choose nil)
     (add-hook 'post-command-hook #'completion-in-region--postch)
     (push `(completion-in-region-mode . ,completion-in-region-mode-map)
           minor-mode-overriding-map-alist)))
@@ -2816,7 +2837,6 @@ not active."
   "<down-mouse-1>" #'ignore)
 
 (define-derived-mode minibuffer-inactive-mode nil "InactiveMinibuffer"
-  :abbrev-table nil          ;abbrev.el is not loaded yet during dump.
   ;; Note: this major mode is called from minibuf.c.
   "Major mode to use in the minibuffer when it is not active.
 This is only used when the minibuffer area has no active minibuffer.
@@ -2838,7 +2858,6 @@ For customizing this mode, it is better to use
 `minibuffer-setup-hook' and `minibuffer-exit-hook' rather than
 the mode hook of this mode."
   :syntax-table nil
-  :abbrev-table nil
   :interactive nil)
 
 ;;; Completion tables.
@@ -3140,6 +3159,8 @@ Fourth arg MUSTMATCH can take the following values:
   input, but she needs to confirm her choice if she called
   `minibuffer-complete' right before `minibuffer-complete-and-exit'
   and the input is not an existing file.
+- a function, which will be called with the input as the argument.
+  If it returns a non-nil value, the minibuffer is exited with that value.
 - anything else behaves like t except that typing RET does not exit if it
   does non-null completion.
 
@@ -4369,30 +4390,25 @@ selected by these commands to the minibuffer."
   :version "29.1")
 
 (defun minibuffer-next-completion (&optional n)
-  "Run `next-completion' from the minibuffer in its completions window.
+  "Move to the next item in its completions window from the minibuffer.
 When `minibuffer-completion-auto-choose' is non-nil, then also
 insert the selected completion to the minibuffer."
   (interactive "p")
-  (with-minibuffer-completions-window
-    (when completions-highlight-face
-      (setq-local cursor-face-highlight-nonselected-window t))
-    (next-completion (or n 1))
-    (when minibuffer-completion-auto-choose
-      (let ((completion-use-base-affixes t))
-        (choose-completion nil t t)))))
+  (let ((auto-choose minibuffer-completion-auto-choose))
+    (with-minibuffer-completions-window
+      (when completions-highlight-face
+        (setq-local cursor-face-highlight-nonselected-window t))
+      (next-completion (or n 1))
+      (when auto-choose
+        (let ((completion-use-base-affixes t))
+          (choose-completion nil t t))))))
 
 (defun minibuffer-previous-completion (&optional n)
-  "Run `previous-completion' from the minibuffer in its completions window.
+  "Move to the previous item in its completions window from the minibuffer.
 When `minibuffer-completion-auto-choose' is non-nil, then also
 insert the selected completion to the minibuffer."
   (interactive "p")
-  (with-minibuffer-completions-window
-    (when completions-highlight-face
-      (setq-local cursor-face-highlight-nonselected-window t))
-    (previous-completion (or n 1))
-    (when minibuffer-completion-auto-choose
-      (let ((completion-use-base-affixes t))
-        (choose-completion nil t t)))))
+  (minibuffer-next-completion (- (or n 1))))
 
 (defun minibuffer-choose-completion (&optional no-exit no-quit)
   "Run `choose-completion' from the minibuffer in its completions window.
@@ -4407,6 +4423,36 @@ minibuffer, but don't quit the completions window."
     (let ((completion-use-base-affixes t))
       (choose-completion nil no-exit no-quit))))
 
+(defun minibuffer-complete-history ()
+  "Complete the minibuffer history as far as possible.
+Like `minibuffer-complete' but completes on the history items
+instead of the default completion table."
+  (interactive)
+  (let ((completions-sort nil)
+        (history (mapcar (lambda (h)
+                           ;; Support e.g. `C-x ESC ESC TAB' as
+                           ;; a replacement of `list-command-history'
+                           (if (consp h) (format "%S" h) h))
+                         (symbol-value minibuffer-history-variable))))
+    (completion-in-region (minibuffer--completion-prompt-end) (point-max)
+                          history nil)))
+
+(defun minibuffer-complete-defaults ()
+  "Complete minibuffer defaults as far as possible.
+Like `minibuffer-complete' but completes on the default items
+instead of the completion table."
+  (interactive)
+  (let ((completions-sort nil))
+    (when (and (not minibuffer-default-add-done)
+               (functionp minibuffer-default-add-function))
+      (setq minibuffer-default-add-done t
+            minibuffer-default (funcall minibuffer-default-add-function)))
+    (completion-in-region (minibuffer--completion-prompt-end) (point-max)
+                          (ensure-list minibuffer-default) nil)))
+
+(define-key minibuffer-local-map [?\C-x up] 'minibuffer-complete-history)
+(define-key minibuffer-local-map [?\C-x down] 'minibuffer-complete-defaults)
+
 (defcustom minibuffer-default-prompt-format " (default %s)"
   "Format string used to output \"default\" values.
 When prompting for input, there will often be a default value,
diff --git a/lisp/misc.el b/lisp/misc.el
index d85f889ffd..0bb8ee6c7b 100644
--- a/lisp/misc.el
+++ b/lisp/misc.el
@@ -64,15 +64,22 @@ The characters copied are inserted in the buffer before 
point."
 ;; Variation of `zap-to-char'.
 
 ;;;###autoload
-(defun zap-up-to-char (arg char)
+(defun zap-up-to-char (arg char &optional interactive)
   "Kill up to, but not including ARGth occurrence of CHAR.
+When run interactively, the argument INTERACTIVE is non-nil.
 Case is ignored if `case-fold-search' is non-nil in the current buffer.
 Goes backward if ARG is negative; error if CHAR not found.
-Ignores CHAR at point."
+Ignores CHAR at point.
+If called interactively, do a case sensitive search if CHAR
+is an upper-case character."
   (interactive (list (prefix-numeric-value current-prefix-arg)
                     (read-char-from-minibuffer "Zap up to char: "
-                                               nil 'read-char-history)))
-  (let ((direction (if (>= arg 0) 1 -1)))
+                                               nil 'read-char-history)
+                     t))
+  (let ((direction (if (>= arg 0) 1 -1))
+        (case-fold-search (if (and interactive (char-uppercase-p char))
+                              nil
+                            case-fold-search)))
     (kill-region (point)
                 (progn
                   (forward-char direction)
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 0446bc6dd8..14cb20c234 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -53,9 +53,17 @@ mouse cursor to the echo area."
 This affects `mouse-save-then-kill' (\\[mouse-save-then-kill]) in
 addition to mouse drags.
 
+If this variable is `non-empty', only copy to the kill ring if
+the region is non-empty.  For instance, if you mouse drag an area
+that is less than a half a character, you'd normally get the
+empty string in your kill ring, but with this value, this short
+mouse drag won't affect the kill ring.
+
 This variable applies only to mouse adjustments in Emacs, not
 selecting and adjusting regions in other windows."
-  :type 'boolean
+  :type '(choice (const :tag "No" nil)
+                 (const :tag "Yes" t)
+                 (const :tag "Non-empty" non-empty))
   :version "24.1")
 
 (defcustom mouse-1-click-follows-link 450
@@ -108,6 +116,16 @@ down and up respectively."
                  (integer :tag "This many lines from window top or bottom"))
   :version "29.1")
 
+(defcustom mouse-drag-mode-line-buffer nil
+  "If non-nil, allow dragging files from the mode line.
+When the buffer has an associated file, it can be dragged from
+the buffer name portion of its mode line to other programs.
+
+This option is only supported on X, Haiku and Nextstep (GNUstep
+or macOS)."
+  :type 'boolean
+  :version "29.1")
+
 (defvar mouse--last-down nil)
 
 (defun mouse--down-1-maybe-follows-link (&optional _prompt)
@@ -854,8 +872,29 @@ frame instead."
   (interactive "e")
   (let* ((start (event-start start-event))
         (window (posn-window start))
-         (frame (window-frame window)))
+         (frame (window-frame window))
+         (skip-tracking nil)
+         filename)
+    ;; FIXME: is there a better way of determining if the event
+    ;; started on a buffer name?
+    (when (and mouse-drag-mode-line-buffer
+               (eq (car (posn-string start))
+                   (car (with-selected-window window
+                          (setq filename (buffer-file-name))
+                          mode-line-buffer-identification)))
+               filename
+               (file-exists-p filename))
+      (let ((mouse-fine-grained-tracking nil))
+        (track-mouse
+          (setq track-mouse 'drag-source)
+          (let ((event (read-event)))
+            (if (not (eq (event-basic-type event)
+                         'mouse-movement))
+                (push event unread-command-events)
+              (dnd-begin-file-drag filename frame 'copy t)
+              (setq skip-tracking t))))))
     (cond
+     (skip-tracking t)
      ((not (window-live-p window)))
      ((or (not (window-at-side-p window 'bottom))
           ;; Allow resizing the minibuffer window if it's on the
@@ -1392,7 +1431,11 @@ command alters the kill ring or not."
         (if (< end beg)
             (setq end (nth 0 range) beg (nth 1 range))
           (setq beg (nth 0 range) end (nth 1 range)))))
-    (and mouse-drag-copy-region (integerp beg) (integerp end)
+    (when (and mouse-drag-copy-region
+               (integerp beg)
+               (integerp end)
+               (or (not (eq mouse-drag-copy-region 'non-empty))
+                   (/= beg end)))
         ;; Don't set this-command to `kill-region', so a following
         ;; C-w won't double the text in the kill ring.  Ignore
         ;; `last-command' so we don't append to a preceding kill.
@@ -2081,7 +2124,9 @@ if `mouse-drag-copy-region' is non-nil)."
        (if before-scroll (goto-char before-scroll)))
       (exchange-point-and-mark)
       (mouse-set-region-1)
-      (when mouse-drag-copy-region
+      (when (and mouse-drag-copy-region
+                 (or (not (eq mouse-drag-copy-region 'non-empty))
+                     (not (/= (mark t) (point)))))
         (kill-new (filter-buffer-substring (mark t) (point))))
       (setq mouse-save-then-kill-posn click-pt)))))
 
@@ -3017,7 +3062,18 @@ highlight the original region when
   "Display TOOLTIP, a tooltip string, using `x-show-tip'.
 Call `tooltip-show-help-non-mode' instead on non-graphical displays."
   (if (display-graphic-p)
-      (x-show-tip tooltip)
+      (let ((params (copy-sequence tooltip-frame-parameters))
+           (fg (face-attribute 'tooltip :foreground))
+           (bg (face-attribute 'tooltip :background)))
+       (when (stringp fg)
+         (setf (alist-get 'foreground-color params) fg)
+         (setf (alist-get 'border-color params) fg))
+       (when (stringp bg)
+         (setf (alist-get 'background-color params) bg))
+        ;; Don't time out: this leads to very confusing behavior when
+        ;; Emacs isn't visible, and the only indication that the user
+        ;; is actually dragging something abruptly disappears.
+        (x-show-tip tooltip nil params most-positive-fixnum))
     (tooltip-show-help-non-mode tooltip)))
 
 (declare-function x-hide-tip "xfns.c")
@@ -3046,6 +3102,7 @@ is copied instead of being cut."
                      (display-multi-frame-p)
                      (require 'tooltip))
             mouse-drag-and-drop-region-show-tooltip))
+         (mouse-highlight nil)
          (start (region-beginning))
          (end (region-end))
          (point (point))
@@ -3059,6 +3116,13 @@ is copied instead of being cut."
                                                                (cdr bounds)))
                                                (region-bounds)))
          (region-noncontiguous (region-noncontiguous-p))
+         ;; Otherwise, the mouse periodically moves on top of the
+         ;; tooltip.
+         (mouse-fine-grained-tracking t)
+         (was-tooltip-mode tooltip-mode)
+         ;; System tooltips tend to flicker and in general work
+         ;; incorrectly.
+         (use-system-tooltips nil)
          ;; Whether or not some text was ``cut'' from Emacs to another
          ;; program and the cleaanup code should not try modifying the
          ;; region.
@@ -3077,372 +3141,381 @@ is copied instead of being cut."
          window-exempt
          drag-again-mouse-position)
 
-    ;; STATES stores for each window on this frame its start and point
-    ;; positions so we can restore them on all windows but for the one
-    ;; where the drop occurs.  For inter-frame drags we'll have to do
-    ;; this for all windows on all visible frames.  In addition we save
-    ;; also the cursor type for the window's buffer so we can restore it
-    ;; in case we modified it.
-    ;; https://lists.gnu.org/r/emacs-devel/2017-12/msg00090.html
-    (walk-window-tree
-     (lambda (window)
-       (setq states
-             (cons
-              (list
-               window
-               (copy-marker (window-start window))
-               (copy-marker (window-point window))
-               (with-current-buffer (window-buffer window)
-                 cursor-type))
-              states))))
-
-    (ignore-errors
-      (catch 'cross-program-drag
-        (track-mouse
-          (setq track-mouse (if mouse-drag-and-drop-region-cross-program
-                                ;; When `track-mouse' is `drop', we
-                                ;; get events with a posn-window of
-                                ;; the grabbed frame even if some
-                                ;; window is between that and the
-                                ;; pointer.  This makes dragging to a
-                                ;; window on top of a frame
-                                ;; impossible.  With this value of
-                                ;; `track-mouse', no frame is returned
-                                ;; in that particular case.
-                                'drag-source
-                              'drop))
-          ;; When event was "click" instead of "drag", skip loop.
-          (while (progn
-                   (setq event (read-key))      ; read-event or read-key
-                   (or (mouse-movement-p event)
-                       ;; Handle `mouse-autoselect-window'.
-                       (memq (car event) '(select-window switch-frame))))
-            (catch 'drag-again
-              ;; If the mouse is in the drag scroll margin, scroll
-              ;; either up or down depending on which margin it is in.
-              (when mouse-drag-and-drop-region-scroll-margin
-                (let* ((row (cdr (posn-col-row (event-end event))))
-                       (window (when (windowp (posn-window (event-end event)))
-                                 (posn-window (event-end event))))
-                       (text-height (when window
-                                      (window-text-height window)))
-                       ;; Make sure it's possible to scroll both up
-                       ;; and down if the margin is too large for the
-                       ;; window.
-                       (margin (when text-height
-                                 (min (/ text-height 3)
-                                      
mouse-drag-and-drop-region-scroll-margin))))
-                  (when (windowp window)
-                    ;; At 2 lines, the window becomes too small for any
-                    ;; meaningful scrolling.
-                    (unless (<= text-height 2)
-                      ;; We could end up at the beginning or end of the
-                      ;; buffer.
-                      (ignore-errors
-                        (cond
-                         ;; Inside the bottom scroll margin, scroll up.
-                         ((> row (- text-height margin))
-                          (with-selected-window window
-                            (scroll-up 1)))
-                         ;; Inside the top scroll margin, scroll down.
-                         ((< row margin)
-                          (with-selected-window window
-                            (scroll-down 1)))))))))
-
-              ;; Obtain the dragged text in region.  When the loop was
-              ;; skipped, value-selection remains nil.
-              (unless value-selection
-                (setq value-selection (funcall region-extract-function nil))
-                (when mouse-drag-and-drop-region-show-tooltip
-                  (let ((text-size mouse-drag-and-drop-region-show-tooltip))
-                    (setq text-tooltip
-                          (if (and (integerp text-size)
-                                   (> (length value-selection) text-size))
-                              (concat
-                               (substring value-selection 0 (/ text-size 2))
-                               "\n...\n"
-                               (substring value-selection (- (/ text-size 2)) 
-1))
-                            value-selection))))
-
-                ;; Check if selected text is read-only.
-                (setq text-from-read-only
-                      (or text-from-read-only
-                          (catch 'loop
-                            (dolist (bound (region-bounds))
-                              (when (text-property-not-all
-                                     (car bound) (cdr bound) 'read-only nil)
-                                (throw 'loop t)))))))
-
-              (when (and mouse-drag-and-drop-region-cross-program
-                         (display-graphic-p)
-                         (fboundp 'x-begin-drag)
-                         (or (and (framep (posn-window (event-end event)))
-                                  (let ((location (posn-x-y (event-end event)))
-                                        (frame (posn-window (event-end 
event))))
-                                    (or (< (car location) 0)
-                                        (< (cdr location) 0)
-                                        (> (car location)
-                                           (frame-pixel-width frame))
-                                        (> (cdr location)
-                                           (frame-pixel-height frame)))))
-                             (and (or (not drag-again-mouse-position)
-                                      (let ((mouse-position 
(mouse-absolute-pixel-position)))
-                                        (or (< 5 (abs (- (car 
drag-again-mouse-position)
-                                                         (car 
mouse-position))))
-                                            (< 5 (abs (- (cdr 
drag-again-mouse-position)
-                                                         (cdr 
mouse-position)))))))
-                                  (not (posn-window (event-end event))))))
-                (setq drag-again-mouse-position nil)
-                (mouse-drag-and-drop-region-hide-tooltip)
-                (gui-set-selection 'XdndSelection value-selection)
-                (let ((drag-action-or-frame
-                       (condition-case nil
-                           (x-begin-drag '("UTF8_STRING" "text/plain"
-                                           "text/plain;charset=utf-8"
-                                           "STRING" "TEXT" "COMPOUND_TEXT")
-                                         (if 
mouse-drag-and-drop-region-cut-when-buffers-differ
-                                             'XdndActionMove
-                                           'XdndActionCopy)
-                                         (posn-window (event-end event)) 'now
-                                         ;; On platforms where we know
-                                         ;; `return-frame' doesn't
-                                         ;; work, allow dropping on
-                                         ;; the drop frame.
-                                         (eq window-system 'haiku))
-                         (quit nil))))
-                  (when (framep drag-action-or-frame)
-                    ;; With some window managers `x-begin-drag'
-                    ;; returns a frame sooner than `mouse-position'
-                    ;; will return one, due to over-wide frame windows
-                    ;; being drawn by the window manager.  To avoid
-                    ;; that, we just require the mouse move a few
-                    ;; pixels before beginning another cross-program
-                    ;; drag.
-                    (setq drag-again-mouse-position
-                          (mouse-absolute-pixel-position))
-                    (throw 'drag-again nil))
-
-                  (let ((min-char (point)))
-                    (when (eq drag-action-or-frame 'XdndActionMove)
-                      ;; Remove the dragged text from source buffer like
-                      ;; operation `cut'.
-                      (dolist (overlay mouse-drag-and-drop-overlays)
-                        (when (< min-char (min (overlay-start overlay)
-                                               (overlay-end overlay)))
-                          (setq min-char (min (overlay-start overlay)
-                                              (overlay-end overlay))))
-                        (delete-region (overlay-start overlay)
-                                       (overlay-end overlay)))
-                      (goto-char min-char)
-                      (setq deactivate-mark t)
-                      (setq drag-was-cross-program t)))
-
-                  (when (eq drag-action-or-frame 'XdndActionCopy)
-                    ;; Set back the dragged text as region on source buffer
-                    ;; like operation `copy'.
-                    (activate-mark)))
-                (throw 'cross-program-drag nil))
-
-              (setq window-to-paste (posn-window (event-end event)))
-              (setq point-to-paste (posn-point (event-end event)))
-              ;; Set nil when target buffer is minibuffer.
-              (setq buffer-to-paste (let (buf)
-                                      (when (windowp window-to-paste)
-                                        (setq buf (window-buffer 
window-to-paste))
-                                        (when (not (minibufferp buf))
-                                          buf))))
-              (setq cursor-in-text-area (and window-to-paste
-                                             point-to-paste
-                                             buffer-to-paste))
-
-              (when cursor-in-text-area
-                ;; Check if point under mouse is read-only.
-                (save-window-excursion
+    (unwind-protect
+        (progn
+          ;; Without this moving onto text with a help-echo will
+          ;; interfere with the tooltip containing dragged text.
+          (tooltip-mode -1)
+          ;; STATES stores for each window on this frame its start and point
+          ;; positions so we can restore them on all windows but for the one
+          ;; where the drop occurs.  For inter-frame drags we'll have to do
+          ;; this for all windows on all visible frames.  In addition we save
+          ;; also the cursor type for the window's buffer so we can restore it
+          ;; in case we modified it.
+          ;; https://lists.gnu.org/r/emacs-devel/2017-12/msg00090.html
+          (walk-window-tree
+           (lambda (window)
+             (setq states
+                   (cons
+                    (list
+                     window
+                     (copy-marker (window-start window))
+                     (copy-marker (window-point window))
+                     (with-current-buffer (window-buffer window)
+                       cursor-type))
+                    states))))
+
+          (ignore-errors
+            (catch 'cross-program-drag
+              (track-mouse
+                (setq track-mouse (if mouse-drag-and-drop-region-cross-program
+                                      ;; When `track-mouse' is `drop', we
+                                      ;; get events with a posn-window of
+                                      ;; the grabbed frame even if some
+                                      ;; window is between that and the
+                                      ;; pointer.  This makes dragging to a
+                                      ;; window on top of a frame
+                                      ;; impossible.  With this value of
+                                      ;; `track-mouse', no frame is returned
+                                      ;; in that particular case, which
+                                      ;; tells us to initiate interprogram
+                                      ;; drag-and-drop.
+                                      'drag-source
+                                    'drop))
+                ;; When event was "click" instead of "drag", skip loop.
+                (while (progn
+                         (setq event (read-key))      ; read-event or read-key
+                         (or (mouse-movement-p event)
+                             ;; Handle `mouse-autoselect-window'.
+                             (memq (car event) '(select-window switch-frame))))
+                  (catch 'drag-again
+                    ;; If the mouse is in the drag scroll margin, scroll
+                    ;; either up or down depending on which margin it is in.
+                    (when mouse-drag-and-drop-region-scroll-margin
+                      (let* ((row (cdr (posn-col-row (event-end event))))
+                             (window (when (windowp (posn-window (event-end 
event)))
+                                       (posn-window (event-end event))))
+                             (text-height (when window
+                                            (window-text-height window)))
+                             ;; Make sure it's possible to scroll both up
+                             ;; and down if the margin is too large for the
+                             ;; window.
+                             (margin (when text-height
+                                       (min (/ text-height 3)
+                                            
mouse-drag-and-drop-region-scroll-margin))))
+                        (when (windowp window)
+                          ;; At 2 lines, the window becomes too small for any
+                          ;; meaningful scrolling.
+                          (unless (<= text-height 2)
+                            ;; We could end up at the beginning or end of the
+                            ;; buffer.
+                            (ignore-errors
+                              (cond
+                               ;; Inside the bottom scroll margin, scroll up.
+                               ((> row (- text-height margin))
+                                (with-selected-window window
+                                  (scroll-up 1)))
+                               ;; Inside the top scroll margin, scroll down.
+                               ((< row margin)
+                                (with-selected-window window
+                                  (scroll-down 1)))))))))
+
+                    ;; Obtain the dragged text in region.  When the loop was
+                    ;; skipped, value-selection remains nil.
+                    (unless value-selection
+                      (setq value-selection (funcall region-extract-function 
nil))
+                      (when mouse-drag-and-drop-region-show-tooltip
+                        (let ((text-size 
mouse-drag-and-drop-region-show-tooltip))
+                          (setq text-tooltip
+                                (if (and (integerp text-size)
+                                         (> (length value-selection) 
text-size))
+                                    (concat
+                                     (substring value-selection 0 (/ text-size 
2))
+                                     "\n...\n"
+                                     (substring value-selection (- (/ 
text-size 2)) -1))
+                                  value-selection))))
+
+                      ;; Check if selected text is read-only.
+                      (setq text-from-read-only
+                            (or text-from-read-only
+                                (catch 'loop
+                                  (dolist (bound (region-bounds))
+                                    (when (text-property-not-all
+                                           (car bound) (cdr bound) 'read-only 
nil)
+                                      (throw 'loop t)))))))
+
+                    (when (and mouse-drag-and-drop-region-cross-program
+                               (display-graphic-p)
+                               (fboundp 'x-begin-drag)
+                               (or (and (framep (posn-window (event-end 
event)))
+                                        (let ((location (posn-x-y (event-end 
event)))
+                                              (frame (posn-window (event-end 
event))))
+                                          (or (< (car location) 0)
+                                              (< (cdr location) 0)
+                                              (> (car location)
+                                                 (frame-pixel-width frame))
+                                              (> (cdr location)
+                                                 (frame-pixel-height frame)))))
+                                   (and (or (not drag-again-mouse-position)
+                                            (let ((mouse-position 
(mouse-absolute-pixel-position)))
+                                              (or (< 5 (abs (- (car 
drag-again-mouse-position)
+                                                               (car 
mouse-position))))
+                                                  (< 5 (abs (- (cdr 
drag-again-mouse-position)
+                                                               (cdr 
mouse-position)))))))
+                                        (not (posn-window (event-end 
event))))))
+                      (setq drag-again-mouse-position nil)
+                      (gui-set-selection 'XdndSelection value-selection)
+                      (let ((drag-action-or-frame
+                             (condition-case nil
+                                 (x-begin-drag '("UTF8_STRING" "text/plain"
+                                                 "text/plain;charset=utf-8"
+                                                 "STRING" "TEXT" 
"COMPOUND_TEXT")
+                                               (if 
mouse-drag-and-drop-region-cut-when-buffers-differ
+                                                   'XdndActionMove
+                                                 'XdndActionCopy)
+                                               (posn-window (event-end event)) 
'now
+                                               ;; On platforms where we know
+                                               ;; `return-frame' doesn't
+                                               ;; work, allow dropping on
+                                               ;; the drop frame.
+                                               (eq window-system 'haiku) t)
+                               (quit nil))))
+                        (when (framep drag-action-or-frame)
+                          ;; With some window managers `x-begin-drag'
+                          ;; returns a frame sooner than `mouse-position'
+                          ;; will return one, due to over-wide frame windows
+                          ;; being drawn by the window manager.  To avoid
+                          ;; that, we just require the mouse move a few
+                          ;; pixels before beginning another cross-program
+                          ;; drag.
+                          (setq drag-again-mouse-position
+                                (mouse-absolute-pixel-position))
+                          (throw 'drag-again nil))
+
+                        (let ((min-char (point)))
+                          (when (eq drag-action-or-frame 'XdndActionMove)
+                            ;; Remove the dragged text from source buffer like
+                            ;; operation `cut'.
+                            (dolist (overlay mouse-drag-and-drop-overlays)
+                              (when (< min-char (min (overlay-start overlay)
+                                                     (overlay-end overlay)))
+                                (setq min-char (min (overlay-start overlay)
+                                                    (overlay-end overlay))))
+                              (delete-region (overlay-start overlay)
+                                             (overlay-end overlay)))
+                            (goto-char min-char)
+                            (setq deactivate-mark t)
+                            (setq drag-was-cross-program t)))
+
+                        (when (eq drag-action-or-frame 'XdndActionCopy)
+                          ;; Set back the dragged text as region on source 
buffer
+                          ;; like operation `copy'.
+                          (activate-mark)))
+                      (throw 'cross-program-drag nil))
+
+                    (setq window-to-paste (posn-window (event-end event)))
+                    (setq point-to-paste (posn-point (event-end event)))
+                    ;; Set nil when target buffer is minibuffer.
+                    (setq buffer-to-paste (let (buf)
+                                            (when (windowp window-to-paste)
+                                              (setq buf (window-buffer 
window-to-paste))
+                                              (when (not (minibufferp buf))
+                                                buf))))
+                    (setq cursor-in-text-area (and window-to-paste
+                                                   point-to-paste
+                                                   buffer-to-paste))
+
+                    (when cursor-in-text-area
+                      ;; Check if point under mouse is read-only.
+                      (save-window-excursion
+                        (select-window window-to-paste)
+                        (setq point-to-paste-read-only
+                              (or buffer-read-only
+                                  (get-text-property point-to-paste 
'read-only))))
+
+                      ;; Check if "drag but negligible".  Operation "drag but
+                      ;; negligible" is defined as drag-and-drop the text to
+                      ;; the original region.  When modifier is pressed, the
+                      ;; text will be inserted to inside of the original
+                      ;; region.
+                      ;;
+                      ;; If the region is rectangular, check if the newly 
inserted
+                      ;; rectangular text would intersect the already selected
+                      ;; region. If it would, then set "drag-but-negligible" 
to t.
+                      ;; As a special case, allow dragging the region freely 
anywhere
+                      ;; to the left, as this will never trigger its contents 
to be
+                      ;; inserted into the overlays tracking it.
+                      (setq drag-but-negligible
+                            (and (eq (overlay-buffer (car 
mouse-drag-and-drop-overlays))
+                                     buffer-to-paste)
+                                 (if region-noncontiguous
+                                     (let ((dimensions (rectangle-dimensions 
start end))
+                                           (start-coordinates
+                                            (rectangle-position-as-coordinates 
start))
+                                           (point-to-paste-coordinates
+                                            (rectangle-position-as-coordinates
+                                             point-to-paste)))
+                                       (and (rectangle-intersect-p
+                                             start-coordinates dimensions
+                                             point-to-paste-coordinates 
dimensions)
+                                            (not (< (car 
point-to-paste-coordinates)
+                                                    (car start-coordinates)))))
+                                   (and (<= (overlay-start
+                                             (car 
mouse-drag-and-drop-overlays))
+                                            point-to-paste)
+                                        (<= point-to-paste
+                                            (overlay-end
+                                             (car 
mouse-drag-and-drop-overlays))))))))
+
+                    ;; Show a tooltip.
+                    (if mouse-drag-and-drop-region-show-tooltip
+                        ;; Don't use tooltip-show since it has side effects
+                        ;; which change the text properties, and
+                        ;; `text-tooltip' can potentially be the text which
+                        ;; will be pasted.
+                        (mouse-drag-and-drop-region-display-tooltip 
text-tooltip)
+                      (mouse-drag-and-drop-region-hide-tooltip))
+
+                    ;; Show cursor and highlight the original region.
+                    (when mouse-drag-and-drop-region-show-cursor
+                      ;; Modify cursor even when point is out of frame.
+                      (setq cursor-type (cond
+                                         ((not cursor-in-text-area)
+                                          nil)
+                                         ((or point-to-paste-read-only
+                                              drag-but-negligible)
+                                          'hollow)
+                                         (t
+                                          'bar)))
+                      (when cursor-in-text-area
+                        (dolist (overlay mouse-drag-and-drop-overlays)
+                          (overlay-put overlay
+                                       'face 'mouse-drag-and-drop-region))
+                        (deactivate-mark)     ; Maintain region in other 
window.
+                        (mouse-set-point event)))))))
+
+            ;; Hide a tooltip.
+            (when mouse-drag-and-drop-region-show-tooltip (x-hide-tip))
+
+            ;; Check if modifier was pressed on drop.
+            (setq no-modifier-on-drop
+                  (not (member mouse-drag-and-drop-region (event-modifiers 
event))))
+
+            ;; Check if event was "click".
+            (setq clicked (not value-selection))
+
+            ;; Restore status on drag to outside of text-area or non-mouse 
input.
+            (when (or (not cursor-in-text-area)
+                      (not (equal (event-basic-type event) mouse-button)))
+              (setq drag-but-negligible t
+                    no-modifier-on-drop t))
+
+            ;; Do not modify any buffers when event is "click",
+            ;; "drag but negligible", or "drag to read-only".
+            (unless drag-was-cross-program
+              (let* ((mouse-drag-and-drop-region-cut-when-buffers-differ
+                      (if no-modifier-on-drop
+                          mouse-drag-and-drop-region-cut-when-buffers-differ
+                        (not 
mouse-drag-and-drop-region-cut-when-buffers-differ)))
+                     (wanna-paste-to-same-buffer (equal buffer-to-paste 
buffer))
+                     (wanna-cut-on-same-buffer (and wanna-paste-to-same-buffer
+                                                    no-modifier-on-drop))
+                     (wanna-cut-on-other-buffer
+                      (and (not wanna-paste-to-same-buffer)
+                           mouse-drag-and-drop-region-cut-when-buffers-differ))
+                     (cannot-paste (or point-to-paste-read-only
+                                       (when (or wanna-cut-on-same-buffer
+                                                 wanna-cut-on-other-buffer)
+                                         text-from-read-only))))
+
+                (cond
+                 ;; Move point within region.
+                 (clicked
+                  (deactivate-mark)
+                  (mouse-set-point event))
+                 ;; Undo operation. Set back the original text as region.
+                 ((or (and drag-but-negligible
+                           no-modifier-on-drop)
+                      cannot-paste)
+                  ;; Inform user either source or destination buffer cannot be 
modified.
+                  (when (and (not drag-but-negligible)
+                             cannot-paste)
+                    (message "Buffer is read-only"))
+
+                  ;; Select source window back and restore region.
+                  ;; (set-window-point window point)
+                  (select-window window)
+                  (goto-char point)
+                  (setq deactivate-mark nil)
+                  (activate-mark)
+                  (when region-noncontiguous
+                    (rectangle-mark-mode)))
+                 ;; Modify buffers.
+                 (t
+                  ;; * DESTINATION BUFFER::
+                  ;; Insert the text to destination buffer under mouse.
                   (select-window window-to-paste)
-                  (setq point-to-paste-read-only
-                        (or buffer-read-only
-                            (get-text-property point-to-paste 'read-only))))
-
-                ;; Check if "drag but negligible".  Operation "drag but
-                ;; negligible" is defined as drag-and-drop the text to
-                ;; the original region.  When modifier is pressed, the
-                ;; text will be inserted to inside of the original
-                ;; region.
-                ;;
-                ;; If the region is rectangular, check if the newly inserted
-                ;; rectangular text would intersect the already selected
-                ;; region. If it would, then set "drag-but-negligible" to t.
-                ;; As a special case, allow dragging the region freely anywhere
-                ;; to the left, as this will never trigger its contents to be
-                ;; inserted into the overlays tracking it.
-                (setq drag-but-negligible
-                      (and (eq (overlay-buffer (car 
mouse-drag-and-drop-overlays))
-                               buffer-to-paste)
-                           (if region-noncontiguous
-                               (let ((dimensions (rectangle-dimensions start 
end))
-                                     (start-coordinates
-                                      (rectangle-position-as-coordinates 
start))
-                                     (point-to-paste-coordinates
-                                      (rectangle-position-as-coordinates
-                                       point-to-paste)))
-                                 (and (rectangle-intersect-p
-                                       start-coordinates dimensions
-                                       point-to-paste-coordinates dimensions)
-                                      (not (< (car point-to-paste-coordinates)
-                                              (car start-coordinates)))))
-                             (and (<= (overlay-start
-                                       (car mouse-drag-and-drop-overlays))
-                                      point-to-paste)
-                                  (<= point-to-paste
-                                      (overlay-end
-                                       (car 
mouse-drag-and-drop-overlays))))))))
-
-              ;; Show a tooltip.
-              (if mouse-drag-and-drop-region-show-tooltip
-                  ;; Don't use tooltip-show since it has side effects
-                  ;; which change the text properties, and
-                  ;; `text-tooltip' can potentially be the text which
-                  ;; will be pasted.
-                  (mouse-drag-and-drop-region-display-tooltip text-tooltip)
-                (mouse-drag-and-drop-region-hide-tooltip))
-
-              ;; Show cursor and highlight the original region.
-              (when mouse-drag-and-drop-region-show-cursor
-                ;; Modify cursor even when point is out of frame.
-                (setq cursor-type (cond
-                                   ((not cursor-in-text-area)
-                                    nil)
-                                   ((or point-to-paste-read-only
-                                        drag-but-negligible)
-                                    'hollow)
-                                   (t
-                                    'bar)))
-                (when cursor-in-text-area
-                  (dolist (overlay mouse-drag-and-drop-overlays)
-                    (overlay-put overlay
-                                 'face 'mouse-drag-and-drop-region))
-                  (deactivate-mark)     ; Maintain region in other window.
-                  (mouse-set-point event)))))))
-
-      ;; Hide a tooltip.
-      (when mouse-drag-and-drop-region-show-tooltip (x-hide-tip))
-
-      ;; Check if modifier was pressed on drop.
-      (setq no-modifier-on-drop
-            (not (member mouse-drag-and-drop-region (event-modifiers event))))
-
-      ;; Check if event was "click".
-      (setq clicked (not value-selection))
-
-      ;; Restore status on drag to outside of text-area or non-mouse input.
-      (when (or (not cursor-in-text-area)
-                (not (equal (event-basic-type event) mouse-button)))
-        (setq drag-but-negligible t
-              no-modifier-on-drop t))
-
-      ;; Do not modify any buffers when event is "click",
-      ;; "drag but negligible", or "drag to read-only".
-      (unless drag-was-cross-program
-        (let* ((mouse-drag-and-drop-region-cut-when-buffers-differ
-                (if no-modifier-on-drop
-                    mouse-drag-and-drop-region-cut-when-buffers-differ
-                  (not mouse-drag-and-drop-region-cut-when-buffers-differ)))
-               (wanna-paste-to-same-buffer (equal buffer-to-paste buffer))
-               (wanna-cut-on-same-buffer (and wanna-paste-to-same-buffer
-                                              no-modifier-on-drop))
-               (wanna-cut-on-other-buffer
-                (and (not wanna-paste-to-same-buffer)
-                     mouse-drag-and-drop-region-cut-when-buffers-differ))
-               (cannot-paste (or point-to-paste-read-only
-                                 (when (or wanna-cut-on-same-buffer
-                                           wanna-cut-on-other-buffer)
-                                   text-from-read-only))))
-
-          (cond
-           ;; Move point within region.
-           (clicked
-            (deactivate-mark)
-            (mouse-set-point event))
-           ;; Undo operation. Set back the original text as region.
-           ((or (and drag-but-negligible
-                     no-modifier-on-drop)
-                cannot-paste)
-            ;; Inform user either source or destination buffer cannot be 
modified.
-            (when (and (not drag-but-negligible)
-                       cannot-paste)
-              (message "Buffer is read-only"))
-
-            ;; Select source window back and restore region.
-            ;; (set-window-point window point)
-            (select-window window)
-            (goto-char point)
-            (setq deactivate-mark nil)
-            (activate-mark)
-            (when region-noncontiguous
-              (rectangle-mark-mode)))
-           ;; Modify buffers.
-           (t
-            ;; * DESTINATION BUFFER::
-            ;; Insert the text to destination buffer under mouse.
-            (select-window window-to-paste)
-            (setq window-exempt window-to-paste)
-            (goto-char point-to-paste)
-            (push-mark)
-            (insert-for-yank value-selection)
-
-            ;; On success, set the text as region on destination buffer.
-            (when (not (equal (mark) (point)))
-              (setq deactivate-mark nil)
-              (activate-mark)
-              (when region-noncontiguous
-                (rectangle-mark-mode)))
-
-            ;; * SOURCE BUFFER::
-            ;; Set back the original text as region or delete the original
-            ;; text, on source buffer.
-            (if wanna-paste-to-same-buffer
-                ;; When source buffer and destination buffer are the same,
-                ;; remove the original text.
-                (when no-modifier-on-drop
-                  (let (deactivate-mark)
-                    (dolist (overlay mouse-drag-and-drop-overlays)
-                      (delete-region (overlay-start overlay)
-                                     (overlay-end overlay)))))
-              ;; When source buffer and destination buffer are different,
-              ;; keep (set back the original text as region) or remove the
-              ;; original text.
-              (select-window window) ; Select window with source buffer.
-              (goto-char point) ; Move point to the original text on source 
buffer.
-
-              (if mouse-drag-and-drop-region-cut-when-buffers-differ
-                  ;; Remove the dragged text from source buffer like
-                  ;; operation `cut'.
-                  (dolist (overlay mouse-drag-and-drop-overlays)
-                    (delete-region (overlay-start overlay)
-                                   (overlay-end overlay)))
-                ;; Set back the dragged text as region on source buffer
-                ;; like operation `copy'.
-                (activate-mark))
-              (select-window window-to-paste)))))))
-
-    ;; Clean up.
-    (dolist (overlay mouse-drag-and-drop-overlays)
-      (delete-overlay overlay))
-
-    ;; Restore old states but for the window where the drop
-    ;; occurred. Restore cursor types for all windows.
-    (dolist (state states)
-      (let ((window (car state)))
-        (when (and window-exempt
-                   (not (eq window window-exempt)))
-          (set-window-start window (nth 1 state) 'noforce)
-          (set-marker (nth 1 state) nil)
-          ;; If window is selected, the following automatically sets
-          ;; point for that window's buffer.
-          (set-window-point window (nth 2 state))
-          (set-marker (nth 2 state) nil))
-        (with-current-buffer (window-buffer window)
-          (setq cursor-type (nth 3 state)))))))
+                  (setq window-exempt window-to-paste)
+                  (goto-char point-to-paste)
+                  (push-mark)
+                  (insert-for-yank value-selection)
+
+                  ;; On success, set the text as region on destination buffer.
+                  (when (not (equal (mark) (point)))
+                    (setq deactivate-mark nil)
+                    (activate-mark)
+                    (when region-noncontiguous
+                      (rectangle-mark-mode)))
+
+                  ;; * SOURCE BUFFER::
+                  ;; Set back the original text as region or delete the 
original
+                  ;; text, on source buffer.
+                  (if wanna-paste-to-same-buffer
+                      ;; When source buffer and destination buffer are the 
same,
+                      ;; remove the original text.
+                      (when no-modifier-on-drop
+                        (let (deactivate-mark)
+                          (dolist (overlay mouse-drag-and-drop-overlays)
+                            (delete-region (overlay-start overlay)
+                                           (overlay-end overlay)))))
+                    ;; When source buffer and destination buffer are different,
+                    ;; keep (set back the original text as region) or remove 
the
+                    ;; original text.
+                    (select-window window) ; Select window with source buffer.
+                    (goto-char point) ; Move point to the original text on 
source buffer.
+
+                    (if mouse-drag-and-drop-region-cut-when-buffers-differ
+                        ;; Remove the dragged text from source buffer like
+                        ;; operation `cut'.
+                        (dolist (overlay mouse-drag-and-drop-overlays)
+                          (delete-region (overlay-start overlay)
+                                         (overlay-end overlay)))
+                      ;; Set back the dragged text as region on source buffer
+                      ;; like operation `copy'.
+                      (activate-mark))
+                    (select-window window-to-paste))))))))
+
+      (when was-tooltip-mode
+        (tooltip-mode 1))
+
+      ;; Clean up.
+      (dolist (overlay mouse-drag-and-drop-overlays)
+        (delete-overlay overlay))
+
+      ;; Restore old states but for the window where the drop
+      ;; occurred. Restore cursor types for all windows.
+      (dolist (state states)
+        (let ((window (car state)))
+          (when (and window-exempt
+                     (not (eq window window-exempt)))
+            (set-window-start window (nth 1 state) 'noforce)
+            (set-marker (nth 1 state) nil)
+            ;; If window is selected, the following automatically sets
+            ;; point for that window's buffer.
+            (set-window-point window (nth 2 state))
+            (set-marker (nth 2 state) nil))
+          (with-current-buffer (window-buffer window)
+            (setq cursor-type (nth 3 state))))))))
 
 
 ;;; Bindings for mouse commands.
diff --git a/lisp/mwheel.el b/lisp/mwheel.el
index 55d3c7a5d8..be493b3653 100644
--- a/lisp/mwheel.el
+++ b/lisp/mwheel.el
@@ -124,10 +124,10 @@ screen.  It can also be a floating point number, 
specifying the fraction of
 a full screen to scroll.  A near full screen is `next-screen-context-lines'
 less than a full screen.
 
-If AMOUNT is the symbol 'hscroll', this means that with MODIFIER,
+If AMOUNT is the symbol `hscroll', this means that with MODIFIER,
 the mouse wheel will scroll horizontally instead of vertically.
 
-If AMOUNT is the symbol 'text-scale', this means that with
+If AMOUNT is the symbol `text-scale', this means that with
 MODIFIER, the mouse wheel will change the face height instead of
 scrolling."
   :group 'mouse
diff --git a/lisp/net/browse-url.el b/lisp/net/browse-url.el
index 66898d7707..5b58c8ed86 100644
--- a/lisp/net/browse-url.el
+++ b/lisp/net/browse-url.el
@@ -635,9 +635,10 @@ CHARS is a regexp that matches a character."
 The annoying characters are those that can mislead a web browser
 regarding its parameter treatment."
   ;; FIXME: Is there an actual example of a web browser getting
-  ;; confused?  (This used to encode commas, but at least Firefox
-  ;; handles commas correctly and doesn't accept encoded commas.)
-  (browse-url-url-encode-chars url "[\"()$ ]"))
+  ;; confused?  (This used to encode commas and dollar signs, but at
+  ;; least Firefox handles commas correctly and doesn't accept those
+  ;; encoded.)
+  (browse-url-url-encode-chars url "[\"() ]"))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; URL input
@@ -1019,6 +1020,8 @@ instead of `browse-url-new-window-flag'."
      'browse-url-default-windows-browser)
     ((memq system-type '(darwin))
      'browse-url-default-macosx-browser)
+    ((featurep 'haiku)
+     'browse-url-default-haiku-browser)
     ((browse-url-can-use-xdg-open) 'browse-url-xdg-open)
 ;;;    ((executable-find browse-url-gnome-moz-program) 'browse-url-gnome-moz)
     ((executable-find browse-url-mozilla-program) 'browse-url-mozilla)
@@ -1239,6 +1242,24 @@ The optional argument NEW-WINDOW is not used."
 
 (function-put 'browse-url-webpositive 'browse-url-browser-kind 'external)
 
+(declare-function haiku-roster-launch "haikuselect.c")
+
+;;;###autoload
+(defun browse-url-default-haiku-browser (url &optional _new-window)
+  "Browse URL with the system default browser.
+Default to the URL around or before point."
+  (interactive (browse-url-interactive-arg "URL: "))
+  (setq url (browse-url-encode-url url))
+  (let* ((scheme (save-match-data
+                   (if (string-match "\\(.+\\):/" url)
+                       (match-string 1 url)
+                     "http")))
+         (mime (concat "application/x-vnd.Be.URL." scheme)))
+    (haiku-roster-launch mime (vector url))))
+
+(function-put 'browse-url-default-haiku-browser
+              'browse-url-browser-kind 'external)
+
 ;;;###autoload
 (defun browse-url-emacs (url &optional same-window)
   "Ask Emacs to load URL into a buffer and show it in another window.
@@ -1613,13 +1634,11 @@ from `browse-url-elinks-wrapper'."
 
 ;;; Adding buttons to a buffer to call `browse-url' when you hit them.
 
-(defvar browse-url-button-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "\r" #'browse-url-button-open)
-    (define-key map [mouse-2] #'browse-url-button-open)
-    (define-key map "w" #'browse-url-button-copy)
-    map)
-  "The keymap used for `browse-url' buttons.")
+(defvar-keymap browse-url-button-map
+  :doc "The keymap used for `browse-url' buttons."
+  "RET"       #'browse-url-button-open
+  "<mouse-2>" #'browse-url-button-open
+  "w"         #'browse-url-button-copy)
 
 (defface browse-url-button
   '((t :inherit link))
diff --git a/lisp/net/dbus.el b/lisp/net/dbus.el
index 6a8bf87967..d4d4ed54e9 100644
--- a/lisp/net/dbus.el
+++ b/lisp/net/dbus.el
@@ -1871,13 +1871,7 @@ name and cdr is the list of properties as returned by
 
 \(dbus-get-all-managed-objects :session \"org.gnome.SettingsDaemon\" \"/\")
 
-  => ((\"/org/gnome/SettingsDaemon/MediaKeys\"
-       (\"org.gnome.SettingsDaemon.MediaKeys\")
-       (\"org.freedesktop.DBus.Peer\")
-       (\"org.freedesktop.DBus.Introspectable\")
-       (\"org.freedesktop.DBus.Properties\")
-       (\"org.freedesktop.DBus.ObjectManager\"))
-      (\"/org/gnome/SettingsDaemon/Power\"
+  => ((\"/org/gnome/SettingsDaemon/Power\"
        (\"org.gnome.SettingsDaemon.Power.Keyboard\")
        (\"org.gnome.SettingsDaemon.Power.Screen\")
        (\"org.gnome.SettingsDaemon.Power\"
diff --git a/lisp/net/eudc-bob.el b/lisp/net/eudc-bob.el
index f543678fa2..68a0ccb3a1 100644
--- a/lisp/net/eudc-bob.el
+++ b/lisp/net/eudc-bob.el
@@ -86,7 +86,7 @@
   `("EUDC Image Menu"
     ["---" nil nil]
     ["Toggle inline display" eudc-bob-toggle-inline-display
-     (eudc-bob-can-display-inline-images)]
+     (display-graphic-p)]
     ,@(cdr (cdr eudc-bob-generic-menu))))
 
 (defvar eudc-bob-sound-menu
@@ -109,14 +109,6 @@
       (setq overlays (cdr overlays)))
     value))
 
-(defun eudc-bob-can-display-inline-images ()
-  "Return non-nil if we can display images inline."
-  (if (fboundp 'console-type)
-      (and (memq (console-type) '(x mswindows))
-          (fboundp 'make-glyph))
-    (and (fboundp 'display-graphic-p)
-        (display-graphic-p))))
-
 (defun eudc-bob-make-button (label keymap &optional menu plist)
   "Create a button with LABEL.
 Attach KEYMAP, MENU and properties from PLIST to a new overlay covering
@@ -142,19 +134,7 @@ LABEL."
   "Display the JPEG DATA at point.
 If INLINE is non-nil, try to inline the image otherwise simply
 display a button."
-  (cond ((fboundp 'make-glyph)
-        (let ((glyph (if (eudc-bob-can-display-inline-images)
-                         (make-glyph (list (vector 'jpeg :data data)
-                                           [string :data "[JPEG Picture]"])))))
-          (eudc-bob-make-button "[JPEG Picture]"
-                                eudc-bob-image-keymap
-                                eudc-bob-image-menu
-                                (list 'glyph glyph
-                                      'end-glyph (if inline glyph)
-                                      'duplicable t
-                                      'invisible inline
-                                       'object-data data))))
-       ((fboundp 'create-image)
+  (cond ((fboundp 'create-image)
         (let* ((image (create-image data nil t))
                (props (list 'object-data data 'eudc-image image)))
           (when (and inline (image-type-available-p 'jpeg))
@@ -167,7 +147,7 @@ display a button."
 (defun eudc-bob-toggle-inline-display ()
   "Toggle inline display of an image."
   (interactive)
-  (when (eudc-bob-can-display-inline-images)
+  (when (display-graphic-p)
     (let* ((overlays (append (overlays-at (1- (point)))
                             (overlays-at (point))))
           image)
@@ -287,11 +267,13 @@ display a button."
 ;;;###autoload
 (defun eudc-display-jpeg-inline (data)
   "Display the JPEG DATA inline at point if possible."
-  (eudc-bob-display-jpeg data (eudc-bob-can-display-inline-images)))
+  (eudc-bob-display-jpeg data (display-graphic-p)))
 
 ;;;###autoload
 (defun eudc-display-jpeg-as-button (data)
   "Display a button for the JPEG DATA."
   (eudc-bob-display-jpeg data nil))
 
+(define-obsolete-function-alias 'eudc-bob-can-display-inline-images 
#'display-graphic-p "29.1")
+
 ;;; eudc-bob.el ends here
diff --git a/lisp/net/eudc-capf.el b/lisp/net/eudc-capf.el
new file mode 100644
index 0000000000..68cbfd93ff
--- /dev/null
+++ b/lisp/net/eudc-capf.el
@@ -0,0 +1,133 @@
+;;; eudc-capf.el --- EUDC - completion-at-point bindings  -*- 
lexical-binding:t -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+;;
+;; Author: Alexander Adolf
+;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;    This library provides functions to deliver email addresses from
+;;    EUDC search results to `completion-at-point'.
+;;
+;;    Email address completion will likely be desirable only in
+;;    situations where designating email recipients plays a role, such
+;;    as when composing or replying to email messages, or when posting
+;;    to newsgroups, possibly with copies of the post being emailed.
+;;    Hence, modes relevant in such contexts, such as for example
+;;    `message-mode' and `mail-mode', often at least to some extent
+;;    provide infrastructure for different functions to be called when
+;;    completing in certain message header fields, or in the body of
+;;    the message.  In other modes for editing email messages or
+;;    newsgroup posts, which do not provide such infrastructure, any
+;;    completion function providing email addresses will need to check
+;;    whether the completion attempt occurs in an appropriate context
+;;    (that is, in a relevant message header field) before providing
+;;    completion candidates.  Two mechanisms are thus provided by this
+;;    library.
+;;
+;;    The first mechanism is intended for use by the modes listed in
+;;    `eudc-capf-modes', and relies on these modes adding
+;;    `eudc-capf-complete' to `completion-at-point-functions', as
+;;    would be usually done for any general-purpose completion
+;;    function.  In this mode of operation, and in order to offer
+;;    email addresses only in contexts where the user would expect
+;;    them, a check is performed whether point is on a line that is a
+;;    message header field suitable for email addresses, such as for
+;;    example "To:", "Cc:", etc.
+;;
+;;    The second mechanism is intended for when the user modifies
+;;    `message-completion-alist' to replace `message-expand-name' with
+;;    the function `eudc-capf-message-expand-name'.  As a result,
+;;    minibuffer completion (`completing-read') for email addresses
+;;    would no longer enabled in `message-mode', but
+;;    `completion-at-point' (in-buffer completion) only.
+
+;;; Usage:
+
+;;    In a major mode, or context where you want email address
+;;    completion, you would do something along the lines of:
+;;
+;;    (require 'eudc-capf)
+;;    (add-hook 'completion-at-point-functions #'eudc-capf-complete -1 t)
+;;
+;;    The minus one argument puts it at the front of the list so it is
+;;    called first, and the t value for the LOCAL parameter causes the
+;;    setting to be buffer local, so as to avoid modifying any global
+;;    setting.
+;;
+;;    The value of the variable `eudc-capf-modes' indicates which
+;;    major modes do such a setup as part of their initialisation
+;;    code.
+
+;;; Code:
+
+(require 'eudc)
+
+(defvar message-email-recipient-header-regexp)
+(defvar mail-abbrev-mode-regexp)
+(declare-function mail-abbrev-in-expansion-header-p "mailabbrev" ())
+
+(defconst eudc-capf-modes '(message-mode)
+  "List of modes in which email address completion is to be attempted.")
+
+;; completion functions
+
+;;;###autoload
+(defun eudc-capf-complete ()
+  "Email address completion function for `completion-at-point-functions'.
+
+This function checks whether the current major mode is one of the
+modes listed in `eudc-capf-modes', and whether point is on a line
+with a message header listing email recipients, that is, a line
+whose beginning matches `message-email-recipient-header-regexp',
+and, if the check succeeds, searches for records matching the
+words before point.
+
+The return value is either nil when no match is found, or a
+completion table as required for functions listed in
+`completion-at-point-functions'."
+  (if (and (seq-some #'derived-mode-p eudc-capf-modes)
+           (let ((mail-abbrev-mode-regexp 
message-email-recipient-header-regexp))
+             (mail-abbrev-in-expansion-header-p)))
+      (eudc-capf-message-expand-name)))
+
+;;;###autoload
+(defun eudc-capf-message-expand-name ()
+  "Email address completion function for `message-completion-alist'.
+
+When this function is added to `message-completion-alist',
+replacing any existing entry for `message-expand-name' there,
+with an appropriate regular expression such as for example
+`message-email-recipient-header-regexp', then EUDC will be
+queried for email addresses, and the results delivered to
+`completion-at-point'."
+  (if (or eudc-server eudc-server-hotlist)
+      (progn
+        (let* ((beg (save-excursion
+                      (re-search-backward "\\([:,]\\|^\\)[ \t]*")
+                      (match-end 0)))
+               (end (point))
+               (prefix (save-excursion (buffer-substring-no-properties beg 
end))))
+          (list beg end
+                (completion-table-with-cache
+                 (lambda (_)
+                   (eudc-query-with-words (split-string prefix "[ \t]+") t))
+                 t))))))
+
+(provide 'eudc-capf)
+;;; eudc-capf.el ends here
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index 57cb566c95..8f02be12ff 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -192,7 +192,7 @@ determine the renaming scheme, as follows:
   user-defined function:
 
   (defun my-eww-rename-buffer ()
-    (when (eq major-mode 'eww-mode)
+    (when (eq major-mode \\='eww-mode)
       (when-let ((string (or (plist-get eww-data :title)
                              (plist-get eww-data :url))))
         (format \"*%s*\" string))))
@@ -1855,7 +1855,7 @@ The browser to used is specified by the
   (replace-regexp-in-string ".utm_.*" "" url))
 
 (defun eww--transform-url (url)
-  "Appy `eww-url-transformers'."
+  "Apply `eww-url-transformers'."
   (when url
     (dolist (func eww-url-transformers)
       (setq url (funcall func url)))
diff --git a/lisp/net/mailcap.el b/lisp/net/mailcap.el
index b65f7c25b8..8ba7f1bec3 100644
--- a/lisp/net/mailcap.el
+++ b/lisp/net/mailcap.el
@@ -1098,11 +1098,12 @@ For instance, `image/png' will result in `png'."
   (mailcap-parse-mimetypes)
   (let* ((all-mime-type
          ;; All unique MIME types from file extensions
-         (delete-dups
-          (mapcar (lambda (file)
-                    (mailcap-extension-to-mime
-                     (file-name-extension file t)))
-                  files)))
+          (delq nil
+               (delete-dups
+                (mapcar (lambda (file)
+                          (mailcap-extension-to-mime
+                           (file-name-extension file t)))
+                        files))))
         (all-mime-info
          ;; All MIME info lists
          (delete-dups
diff --git a/lisp/net/newst-backend.el b/lisp/net/newst-backend.el
index a62a7bd8b7..7ae58884f9 100644
--- a/lisp/net/newst-backend.el
+++ b/lisp/net/newst-backend.el
@@ -1697,11 +1697,11 @@ Checks list of active processes against list of 
newsticker processes."
 ;; ======================================================================
 (defun newsticker--images-dir ()
   "Return directory where feed images are saved."
-  (concat newsticker-dir "/images/"))
+  (expand-file-name "images/" newsticker-dir))
 
 (defun newsticker--icons-dir ()
   "Return directory where feed icons are saved."
-  (concat newsticker-dir "/icons/"))
+  (expand-file-name "icons/" newsticker-dir))
 
 (defun newsticker--image-get (feed-name filename directory url)
   "Get image for FEED-NAME by returning FILENAME from DIRECTORY.
@@ -2114,7 +2114,7 @@ FEED is a symbol!"
 
 (defun newsticker--cache-dir ()
   "Return directory for saving cache data."
-  (concat newsticker-dir "/feeds"))
+  (expand-file-name "feeds/" newsticker-dir))
 
 (defun newsticker--cache-save ()
   "Save cache data for all feeds."
@@ -2125,13 +2125,15 @@ FEED is a symbol!"
 
 (defun newsticker--cache-save-feed (feed)
   "Save cache data for FEED."
-  (let ((dir (concat (newsticker--cache-dir) "/" (symbol-name (car feed)))))
+  (let ((dir (file-name-as-directory
+              (expand-file-name (symbol-name (car feed))
+                                (newsticker--cache-dir)))))
     (unless (file-directory-p dir)
       (make-directory dir t))
     (let ((coding-system-for-write 'utf-8))
-      (with-temp-file (concat dir "/data")
+      (with-temp-file (expand-file-name "data" dir)
         (insert ";; -*- coding: utf-8 -*-\n")
-        (insert (prin1-to-string (cdr feed)))))))
+        (prin1 (cdr feed) (current-buffer) t)))))
 
 (defun newsticker--cache-read ()
   "Read cache data."
@@ -2141,7 +2143,9 @@ FEED is a symbol!"
 
 (defun newsticker--cache-read-feed (feed-name)
   "Read cache data for feed named FEED-NAME."
-  (let ((file-name (concat (newsticker--cache-dir) "/" feed-name "/data"))
+  (let ((file-name (expand-file-name
+                    "data" (expand-file-name
+                            feed-name (newsticker--cache-dir))))
         (coding-system-for-read 'utf-8))
     (when (file-exists-p file-name)
       (with-temp-buffer
@@ -2213,8 +2217,7 @@ Export subscriptions to a buffer in OPML Format."
           (newsticker--opml-insert-feed (car f) 4)))
       (insert "  </body>\n</opml>\n")))
   (pop-to-buffer "*OPML Export*")
-  (when (fboundp 'sgml-mode)
-    (sgml-mode)))
+  (sgml-mode))
 
 (defun newsticker--opml-insert-elt (elt depth)
   "Insert an OPML ELT with indentation level DEPTH."
@@ -2334,14 +2337,19 @@ This function just prints out the values of the 
FEEDNAME and title of the ITEM."
   "Download the first image.
 If FEEDNAME equals \"imagefeed\" download the first image URL
 found in the description=contents of ITEM to the directory
-\"~/tmp/newsticker/FEEDNAME/TITLE\" where TITLE is the title of
-the item."
+`temporary-file-directory'/newsticker/FEEDNAME/TITLE where TITLE
+is the title of the item."
   (when (string= feedname "imagefeed")
     (let ((title (newsticker--title item))
           (desc (newsticker--desc item)))
       (when (string-match "<img src=\"\\(http://[^ \"]+\\)\"" desc)
         (let ((url (substring desc (match-beginning 1) (match-end 1)))
-              (temp-dir (concat "~/tmp/newsticker/" feedname "/" title))
+               (temp-dir (file-name-as-directory
+                           (expand-file-name
+                            title (expand-file-name
+                                   feedname (expand-file-name
+                                             "newsticker"
+                                             temporary-file-directory)))))
               (org-dir default-directory))
           (unless (file-directory-p temp-dir)
             (make-directory temp-dir t))
@@ -2355,7 +2363,8 @@ the item."
 
 (defun newsticker-download-enclosures (feedname item)
   "In all feeds download the enclosed object of the news ITEM.
-The object is saved to the directory \"~/tmp/newsticker/FEEDNAME/TITLE\", which
+The object is saved to the directory
+`temporary-file-directory'/newsticker/FEEDNAME/TITLE, which
 is created if it does not exist.  TITLE is the title of the news
 item.  Argument FEEDNAME is ignored.
 This function is suited for adding it to `newsticker-new-item-functions'."
@@ -2363,7 +2372,12 @@ This function is suited for adding it to 
`newsticker-new-item-functions'."
         (enclosure (newsticker--enclosure item)))
     (when enclosure
       (let ((url (cdr (assoc 'url enclosure)))
-            (temp-dir (concat "~/tmp/newsticker/" feedname "/" title))
+            (temp-dir (file-name-as-directory
+                       (expand-file-name
+                        title (expand-file-name
+                               feedname (expand-file-name
+                                         "newsticker"
+                                         temporary-file-directory)))))
             (org-dir default-directory))
         (unless (file-directory-p temp-dir)
           (make-directory temp-dir t))
diff --git a/lisp/net/newst-treeview.el b/lisp/net/newst-treeview.el
index 80d9fd1cef..b429a33dec 100644
--- a/lisp/net/newst-treeview.el
+++ b/lisp/net/newst-treeview.el
@@ -106,13 +106,13 @@ applies to newsticker only."
 
 (defcustom newsticker-treeview-use-feed-name-from-url-list-in-treeview
   t
-  "Use the feed names from 'newsticker-url-list' for display in treeview."
+  "Use the feed names from `newsticker-url-list' for display in treeview."
   :version "28.1"
   :type 'boolean)
 
 (defcustom newsticker-treeview-use-feed-name-from-url-list-in-itemview
   t
-  "Use feed names from 'newsticker-url-list' in itemview."
+  "Use feed names from `newsticker-url-list' in itemview."
   :version "28.1"
   :type 'boolean)
 
@@ -1257,20 +1257,20 @@ Note: does not update the layout."
   "Save treeview group settings."
   (interactive)
   (let ((coding-system-for-write 'utf-8)
-        (buf (find-file-noselect (concat newsticker-dir "/groups"))))
+        (buf (find-file-noselect (expand-file-name "groups" newsticker-dir))))
     (when buf
       (with-current-buffer buf
         (setq buffer-undo-list t)
         (erase-buffer)
         (insert ";; -*- coding: utf-8 -*-\n")
-        (insert (prin1-to-string newsticker-groups))
+        (prin1 newsticker-groups (current-buffer) t)
         (save-buffer)
         (kill-buffer)))))
 
 (defun newsticker--treeview-load ()
   "Load treeview settings."
   (let* ((coding-system-for-read 'utf-8)
-         (filename (concat newsticker-dir "/groups"))
+         (filename (expand-file-name "groups" newsticker-dir))
          (buf (and (file-exists-p filename)
                    (find-file-noselect filename))))
     (when buf
@@ -1283,7 +1283,6 @@ Note: does not update the layout."
          (setq newsticker-groups nil)))
       (kill-buffer buf))))
 
-
 (defun newsticker-treeview-scroll-item ()
   "Scroll current item."
   (interactive)
diff --git a/lisp/net/shr.el b/lisp/net/shr.el
index 43d34a9d4d..505a093392 100644
--- a/lisp/net/shr.el
+++ b/lisp/net/shr.el
@@ -994,8 +994,7 @@ the mouse click event."
   (let ((url (get-text-property (point) 'shr-url)))
     (if (not url)
        (message "No link under point")
-      (url-retrieve (shr-encode-url url)
-                    #'shr-store-contents (list url directory)))))
+      (url-retrieve url #'shr-store-contents (list url directory)))))
 
 (defun shr-store-contents (status url directory)
   (unless (plist-get status :error)
@@ -1154,7 +1153,7 @@ Return a string with image data."
   (with-temp-buffer
     (set-buffer-multibyte nil)
     (when (ignore-errors
-           (url-cache-extract (url-cache-create-filename (shr-encode-url url)))
+           (url-cache-extract (url-cache-create-filename url))
            t)
       (when (re-search-forward "\r?\n\r?\n" nil t)
        (shr-parse-image-data)))))
@@ -1252,6 +1251,7 @@ START, and END.  Note that START and END should be 
markers."
 
 (defun shr-encode-url (url)
   "Encode URL."
+  (declare (obsolete nil "29.1"))
   (browse-url-url-encode-chars url "[)$ ]"))
 
 (autoload 'shr-color-visible "shr-color")
@@ -1326,6 +1326,11 @@ ones, in case fg and bg are nil."
 (defun shr-tag-comment (_dom)
   )
 
+;; Introduced in HTML5.  For text browsers, functionally similar to a
+;; comment.
+(defun shr-tag-template (_dom)
+  )
+
 (defun shr-dom-to-xml (dom &optional charset)
   (with-temp-buffer
     (shr-dom-print dom)
@@ -1672,13 +1677,13 @@ The preference is a float determined from 
`shr-prefer-media-type'."
          (setq shr-start (point))
           (shr-insert alt))
         ((and (not shr-ignore-cache)
-              (url-is-cached (shr-encode-url url)))
+              (url-is-cached url))
          (funcall shr-put-image-function (shr-get-image-data url) alt
                    (list :width width :height height)))
         (t
          (when (and shr-ignore-cache
-                    (url-is-cached (shr-encode-url url)))
-           (let ((file (url-cache-create-filename (shr-encode-url url))))
+                    (url-is-cached url))
+           (let ((file (url-cache-create-filename url)))
              (when (file-exists-p file)
                (delete-file file))))
           (when (image-type-available-p 'svg)
@@ -1687,7 +1692,7 @@ The preference is a float determined from 
`shr-prefer-media-type'."
              (or alt "")))
           (insert " ")
          (url-queue-retrieve
-           (shr-encode-url url) #'shr-image-fetched
+           url #'shr-image-fetched
           (list (current-buffer) start (set-marker (make-marker) (point))
                  (list :width width :height height))
           t
diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el
index 251d5191cb..8268b2d167 100644
--- a/lisp/net/tramp-adb.el
+++ b/lisp/net/tramp-adb.el
@@ -1073,9 +1073,9 @@ E.g. a host name \"192.168.1.1#5555\" returns 
\"192.168.1.1:5555\"
        tramp-prefix-port-format ":"
        (cond ((member host devices) host)
             ;; This is the case when the host is connected to the default port.
-            ((member (format "%s%s%d" host tramp-prefix-port-format port)
+            ((member (format "%s%s%s" host tramp-prefix-port-format port)
                      devices)
-             (format "%s:%d" host port))
+             (format "%s:%s" host port))
             ;; An empty host name shall be mapped as well, when there
             ;; is exactly one entry in `devices'.
             ((and (zerop (length host)) (= (length devices) 1))
diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el
index 4a020c7150..f30aa021b6 100644
--- a/lisp/net/tramp-archive.el
+++ b/lisp/net/tramp-archive.el
@@ -57,6 +57,7 @@
 ;; * ".crate" - Cargo (Rust) packages
 ;; * ".deb" - Debian packages
 ;; * ".depot" - HP-UX SD depots
+;; * ".epub" - Electronic publications
 ;; * ".exe" - Self extracting Microsoft Windows EXE files
 ;; * ".iso" - ISO 9660 images
 ;; * ".jar" - Java archives
@@ -145,6 +146,7 @@
     "crate" ;; Cargo (Rust) packages.  Not in libarchive testsuite.
     "deb" ;; Debian packages.  Not in libarchive testsuite.
     "depot" ;; HP-UX SD depot.  Not in libarchive testsuite.
+    "epub" ;; Electronic publications.  Not in libarchive testsuite.
     "exe" ;; Self extracting Microsoft Windows EXE files.
     "iso" ;; ISO 9660 images.
     "jar" ;; Java archives.  Not in libarchive testsuite.
diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el
index c18ab4972d..006683bdcc 100644
--- a/lisp/net/tramp-cmds.el
+++ b/lisp/net/tramp-cmds.el
@@ -51,6 +51,7 @@ SYNTAX can be one of the symbols `default' (default),
   (when syntax
     (customize-set-variable 'tramp-syntax syntax)))
 
+;;;###tramp-autoload
 (defun tramp-list-tramp-buffers ()
   "Return a list of all Tramp connection buffers."
   (append
@@ -61,6 +62,7 @@ SYNTAX can be one of the symbols `default' (default),
    (all-completions
     "*trace tramp" (mapcar #'list (mapcar #'buffer-name (buffer-list))))))
 
+;;;###tramp-autoload
 (defun tramp-list-remote-buffers ()
   "Return a list of all buffers with remote `default-directory'."
   (delq
diff --git a/lisp/net/tramp-fuse.el b/lisp/net/tramp-fuse.el
index 2a73d5aa02..20be74a79b 100644
--- a/lisp/net/tramp-fuse.el
+++ b/lisp/net/tramp-fuse.el
@@ -44,6 +44,17 @@
     (delete-file (tramp-fuse-local-file-name filename) trash)
     (tramp-flush-file-properties v localname)))
 
+(defvar tramp-fuse-remove-hidden-files nil
+  "Remove hidden files from directory listings.")
+
+(defsubst tramp-fuse-remove-hidden-files (files)
+  "Remove hidden files from FILES."
+  (if tramp-fuse-remove-hidden-files
+      (cl-remove-if
+       (lambda (x) (and (stringp x) (string-match-p "\\.fuse_hidden" x)))
+       files)
+    files))
+
 (defun tramp-fuse-handle-directory-files
     (directory &optional full match nosort count)
   "Like `directory-files' for Tramp files."
@@ -75,7 +86,8 @@
                              result)))
            (setq result (cons item result))))
        ;; Return result.
-       (if nosort result (sort result #'string<))))))
+       (tramp-fuse-remove-hidden-files
+        (if nosort result (sort result #'string<)))))))
 
 (defun tramp-fuse-handle-file-attributes (filename &optional id-format)
   "Like `file-attributes' for Tramp files."
@@ -92,20 +104,21 @@
 
 (defun tramp-fuse-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
-  (all-completions
-   filename
-   (delete-dups
-    (append
-     (file-name-all-completions
-      filename (tramp-fuse-local-file-name directory))
-     ;; Some storage systems do not return "." and "..".
-     (let (result)
-       (dolist (item '(".." ".") result)
-        (when (string-prefix-p filename item)
-          (catch 'match
-            (dolist (elt completion-regexp-list)
-              (unless (string-match-p elt item) (throw 'match nil)))
-            (setq result (cons (concat item "/") result))))))))))
+  (tramp-fuse-remove-hidden-files
+   (all-completions
+    filename
+    (delete-dups
+     (append
+      (file-name-all-completions
+       filename (tramp-fuse-local-file-name directory))
+      ;; Some storage systems do not return "." and "..".
+      (let (result)
+       (dolist (item '(".." ".") result)
+         (when (string-prefix-p filename item)
+           (catch 'match
+             (dolist (elt completion-regexp-list)
+               (unless (string-match-p elt item) (throw 'match nil)))
+             (setq result (cons (concat item "/") result)))))))))))
 
 ;; This function isn't used.
 (defun tramp-fuse-handle-insert-directory
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index 752dfdb068..fca3988b8d 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -1788,22 +1788,26 @@ a downcased host name only."
                  (list
                   t ;; handled.
                   nil ;; no abort of D-Bus.
-                  (with-tramp-connection-property (tramp-get-process v) message
-                    ;; In theory, there can be several choices.
-                    ;; Until now, there is only the question whether
-                    ;; to accept an unknown host signature or certificate.
-                    (with-temp-buffer
-                      ;; Preserve message for `progress-reporter'.
-                      (with-temp-message ""
-                        (insert message)
-                        (goto-char (point-max))
-                        (if noninteractive
-                            (message "%s" message)
-                          (pop-to-buffer (current-buffer)))
-                        (if (yes-or-no-p
-                             (buffer-substring
-                              (line-beginning-position) (point)))
-                            0 1)))))
+                  ;; Preserve message for `progress-reporter'.
+                  (with-temp-message ""
+                    (if noninteractive
+                        ;; Keep regression tests running.
+                        (progn
+                          (message "%s" message)
+                          0)
+                      (with-tramp-connection-property (tramp-get-process v) 
message
+                        ;; In theory, there can be several choices.
+                        ;; Until now, there is only the question
+                        ;; whether to accept an unknown host
+                        ;; signature or certificate.
+                        (with-temp-buffer
+                          (insert message)
+                          (goto-char (point-max))
+                          (pop-to-buffer (current-buffer))
+                          (if (yes-or-no-p
+                               (buffer-substring
+                                (line-beginning-position) (point)))
+                              0 1))))))
 
                ;; When QUIT is raised, we shall return this
                ;; information to D-Bus.
diff --git a/lisp/net/tramp-integration.el b/lisp/net/tramp-integration.el
index b7f82770c4..5e51074c49 100644
--- a/lisp/net/tramp-integration.el
+++ b/lisp/net/tramp-integration.el
@@ -39,6 +39,7 @@
 (declare-function info-lookup->topic-value "info-look")
 (declare-function info-lookup-maybe-add-help "info-look")
 (declare-function recentf-cleanup "recentf")
+(declare-function shortdoc-add-function "shortdoc")
 (declare-function tramp-dissect-file-name "tramp")
 (declare-function tramp-file-name-equal-p "tramp")
 (declare-function tramp-tramp-file-p "tramp")
@@ -49,6 +50,7 @@
 (defvar info-lookup-alist)
 (defvar ivy-completing-read-handlers-alist)
 (defvar recentf-exclude)
+(defvar shortdoc--groups)
 (defvar tramp-current-connection)
 (defvar tramp-postfix-host-format)
 (defvar tramp-use-ssh-controlmaster-options)
@@ -257,6 +259,33 @@ NAME must be equal to `tramp-current-connection'."
                  (delete (info-lookup->mode-cache 'symbol ',mode)
                          (info-lookup->topic-cache 'symbol))))))))
 
+;;; Integration of shortdoc.el:
+
+(with-eval-after-load 'shortdoc
+  (dolist (elem '((file-remote-p
+                  :eval (file-remote-p "/ssh:user@host:/tmp/foo")
+                  :eval (file-remote-p "/ssh:user@host:/tmp/foo" 'method))
+                 (file-local-name
+                  :eval (file-local-name "/ssh:user@host:/tmp/foo"))
+                 (file-local-copy
+                  :no-eval (file-local-copy "/ssh:user@host:/tmp/foo")
+                  :eg-result "/tmp/tramp.8ihLbO"
+                  :eval (file-local-copy "/tmp/foo"))))
+    (unless (assoc (car elem)
+                  (member "Remote Files" (assq 'file shortdoc--groups)))
+      (shortdoc-add-function 'file "Remote Files" elem)))
+
+  (add-hook
+   'tramp-integration-unload-hook
+   (lambda ()
+     (let ((glist (assq 'file shortdoc--groups)))
+       (while (and (consp glist)
+                   (not (and (stringp (cadr glist))
+                             (string-equal (cadr glist) "Remote Files"))))
+         (setq glist (cdr glist)))
+       (when (consp glist)
+         (setcdr glist nil))))))
+
 ;;; Integration of compile.el:
 
 ;; Compilation processes use `accept-process-output' such a way that
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index ba4cdb0ab5..8f8b81186b 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -118,7 +118,7 @@ configuration."
   "Which ssh Control* arguments to use.
 
 If it is a string, it should have the form
-\"-o ControlMaster=auto -o ControlPath=\\='tramp.%%r@%%h:%%p\\='
+\"-o ControlMaster=auto -o ControlPath=tramp.%%C
 -o ControlPersist=no\".  Percent characters in the ControlPath
 spec must be doubled, because the string is used as format string.
 
@@ -137,6 +137,15 @@ be auto-detected by Tramp.
 
 The string is used in `tramp-methods'.")
 
+(defvar tramp-scp-force-scp-protocol nil
+  "Force scp protocol.
+
+It is the string \"-O\" if supported by the local scp (since
+release 8.6), otherwise the string \"\".  If it is nil, it will
+be auto-detected by Tramp.
+
+The string is used in `tramp-methods'.")
+
 (defcustom tramp-use-scp-direct-remote-copying nil
   "Whether to use direct copying between two remote hosts."
   :group 'tramp
@@ -179,7 +188,8 @@ The string is used in `tramp-methods'.")
                 (tramp-remote-shell-args    ("-c"))
                 (tramp-copy-program         "scp")
                 (tramp-copy-args            (("-P" "%p") ("-p" "%k")
-                                            ("%x") ("%y") ("-q") ("-r") 
("%c")))
+                                            ("%x") ("%y") ("%z")
+                                            ("-q") ("-r") ("%c")))
                 (tramp-copy-keep-date       t)
                 (tramp-copy-recursive       t)))
  (add-to-list 'tramp-methods
@@ -195,7 +205,8 @@ The string is used in `tramp-methods'.")
                 (tramp-remote-shell-args    ("-c"))
                 (tramp-copy-program         "scp")
                 (tramp-copy-args            (("-P" "%p") ("-p" "%k")
-                                            ("%x") ("%y") ("-q") ("-r") 
("%c")))
+                                            ("%x") ("%y") ("%z")
+                                            ("-q") ("-r") ("%c")))
                 (tramp-copy-keep-date       t)
                 (tramp-copy-recursive       t)))
  (add-to-list 'tramp-methods
@@ -2347,7 +2358,8 @@ The method used must be an out-of-band method."
                  ?r listener ?c options ?k (if keep-date " " "")
                   ?n (concat "2>" (tramp-get-remote-null-device v))
                  ?x (tramp-scp-strict-file-name-checking v)
-                 ?y (tramp-scp-direct-remote-copying v1 v2))
+                 ?y (tramp-scp-force-scp-protocol v)
+                 ?z (tramp-scp-direct-remote-copying v1 v2))
            copy-program (tramp-get-method-parameter v 'tramp-copy-program)
            copy-keep-date (tramp-get-method-parameter
                            v 'tramp-copy-keep-date)
@@ -4767,13 +4779,13 @@ Goes through the list `tramp-inline-compress-commands'."
              (if (zerop
                   (tramp-call-process
                    vec "ssh" nil nil nil
-                   "-G" "-o" "ControlPath='tramp.%C'" "0.0.0.1"))
+                   "-G" "-o" "ControlPath=tramp.%C" "0.0.0.1"))
                  (setq tramp-ssh-controlmaster-options
                        (concat tramp-ssh-controlmaster-options
-                               " -o ControlPath='tramp.%%C'"))
+                               " -o ControlPath=tramp.%%C"))
                (setq tramp-ssh-controlmaster-options
                      (concat tramp-ssh-controlmaster-options
-                             " -o ControlPath='tramp.%%r@%%h:%%p'")))
+                             " -o ControlPath=tramp.%%r@%%h:%%p")))
              (when (zerop
                     (tramp-call-process
                      vec "ssh" nil nil nil
@@ -4810,14 +4822,41 @@ Goes through the list `tramp-inline-compress-commands'."
                  (setq tramp-scp-strict-file-name-checking "-T")))))))
       tramp-scp-strict-file-name-checking)))
 
+(defun tramp-scp-force-scp-protocol (vec)
+  "Return the force scp protocol argument of the local scp."
+  (cond
+   ;; No options to be computed.
+   ((null (assoc "%y" (tramp-get-method-parameter vec 'tramp-copy-args)))
+    "")
+
+   ;; There is already a value to be used.
+   ((stringp tramp-scp-force-scp-protocol)
+    tramp-scp-force-scp-protocol)
+
+   ;; Determine the options.
+   (t (setq tramp-scp-force-scp-protocol "")
+      (let ((case-fold-search t))
+       (ignore-errors
+         (when (executable-find "scp")
+           (with-tramp-progress-reporter
+               vec 4 "Computing force scp protocol argument"
+             (with-temp-buffer
+               (tramp-call-process vec "scp" nil t nil "-O")
+               (goto-char (point-min))
+               (unless
+                    (search-forward-regexp
+                     "\\(illegal\\|unknown\\) option -- O" nil t)
+                 (setq tramp-scp-force-scp-protocol "-O")))))))
+      tramp-scp-force-scp-protocol)))
+
 (defun tramp-scp-direct-remote-copying (vec1 vec2)
   "Return the direct remote copying argument of the local scp."
   (cond
    ((or (not tramp-use-scp-direct-remote-copying) (null vec1) (null vec2)
        (not (tramp-get-process vec1))
        (not (equal (tramp-file-name-port vec1) (tramp-file-name-port vec2)))
-       (null (assoc "%y" (tramp-get-method-parameter vec1 'tramp-copy-args)))
-       (null (assoc "%y" (tramp-get-method-parameter vec2 'tramp-copy-args))))
+       (null (assoc "%z" (tramp-get-method-parameter vec1 'tramp-copy-args)))
+       (null (assoc "%z" (tramp-get-method-parameter vec2 'tramp-copy-args))))
     "")
 
    ((let ((case-fold-search t))
@@ -6094,4 +6133,5 @@ function cell is returned to be applied on a buffer."
 ;; * Support hostname canonicalization in ~/.ssh/config.
 ;;   <https://stackoverflow.com/questions/70205232/>
 
+
 ;;; tramp-sh.el ends here
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index 968c1daccb..8037c89829 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -609,7 +609,11 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
          (if (tramp-tramp-file-p filename) filename newname))
         'file-missing filename))
 
-      (if-let ((tmpfile (file-local-copy filename)))
+      ;; `file-local-copy' returns a file name also for a local file
+      ;; with `jka-compr-handler', so we cannot trust its result as
+      ;; indication for a remote file name.
+      (if-let ((tmpfile
+               (and (file-remote-p filename) (file-local-copy filename))))
          ;; Remote filename.
          (condition-case err
              (rename-file tmpfile newname ok-if-already-exists)
diff --git a/lisp/net/tramp-sudoedit.el b/lisp/net/tramp-sudoedit.el
index fb885ebd05..420a593644 100644
--- a/lisp/net/tramp-sudoedit.el
+++ b/lisp/net/tramp-sudoedit.el
@@ -147,7 +147,7 @@ See `tramp-actions-before-shell' for more info.")
     (unlock-file . tramp-handle-unlock-file)
     (vc-registered . ignore)
     (verify-visited-file-modtime . tramp-handle-verify-visited-file-modtime)
-    (write-region . tramp-sudoedit-handle-write-region))
+    (write-region . tramp-handle-write-region))
   "Alist of handler functions for Tramp SUDOEDIT method.")
 
 ;; It must be a `defsubst' in order to push the whole code into
@@ -739,38 +739,6 @@ ID-FORMAT valid values are `string' and `integer'."
               (or gid (tramp-get-remote-gid v 'integer)))
        (tramp-unquote-file-local-name filename))))
 
-(defun tramp-sudoedit-handle-write-region
-  (start end filename &optional append visit lockname mustbenew)
-  "Like `write-region' for Tramp files."
-  (setq filename (expand-file-name filename))
-  (with-parsed-tramp-file-name filename nil
-    (let* ((uid (or (file-attribute-user-id (file-attributes filename 
'integer))
-                   (tramp-get-remote-uid v 'integer)))
-          (gid (or (file-attribute-group-id (file-attributes filename 
'integer))
-                   (tramp-get-remote-gid v 'integer)))
-          (flag (and (eq mustbenew 'excl) 'nofollow))
-          (modes (tramp-default-file-modes filename flag))
-          (attributes (file-extended-attributes filename)))
-      (prog1
-         (tramp-handle-write-region
-          start end filename append visit lockname mustbenew)
-
-       ;; Set the ownership, modes and extended attributes.  This is
-       ;; not performed in `tramp-handle-write-region'.
-       (unless (and (= (file-attribute-user-id
-                        (file-attributes filename 'integer))
-                       uid)
-                     (= (file-attribute-group-id
-                        (file-attributes filename 'integer))
-                       gid))
-          (tramp-set-file-uid-gid filename uid gid))
-       (tramp-compat-set-file-modes filename modes flag)
-       ;; We ignore possible errors, because ACL strings could be
-       ;; incompatible.
-       (when attributes
-         (ignore-errors
-           (set-file-extended-attributes filename attributes)))))))
-
 
 ;; Internal functions.
 
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 34f256147b..cee8897b4f 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -255,7 +255,9 @@ pair of the form (KEY VALUE).  The following KEYs are 
defined:
     - \"%n\" expands to \"2>/dev/null\".
     - \"%x\" is replaced by the `tramp-scp-strict-file-name-checking'
       argument if it is supported.
-    - \"%y\" is replaced by the `tramp-scp-direct-remote-copying'
+    - \"%y\" is replaced by the `tramp-scp-force-scp-protocol'
+      argument if it is supported.
+    - \"%z\" is replaced by the `tramp-scp-direct-remote-copying'
       argument if it is supported.
 
     The existence of `tramp-login-args', combined with the
@@ -503,7 +505,8 @@ interpreted as a regular expression which always matches."
 ;; either lower case or upper case letters.  See
 ;; <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=38079#20>.
 (defcustom tramp-restricted-shell-hosts-alist
-  (when (eq system-type 'windows-nt)
+  (when (and (eq system-type 'windows-nt)
+             (not (string-match-p "sh$" tramp-encoding-shell)))
     (list (format "\\`\\(%s\\|%s\\)\\'"
                  (regexp-quote (downcase tramp-system-name))
                  (regexp-quote (upcase tramp-system-name)))))
@@ -2481,7 +2484,7 @@ For definition of that list see 
`tramp-set-completion-function'."
 
 (defun tramp-default-file-modes (filename &optional flag)
   "Return file modes of FILENAME as integer.
-If optional FLAG is ‘nofollow’, do not follow FILENAME if it is a
+If optional FLAG is `nofollow', do not follow FILENAME if it is a
 symbolic link.  If the file modes of FILENAME cannot be
 determined, return the value of `default-file-modes', without
 execute permissions."
@@ -2523,6 +2526,7 @@ arguments to pass to the OPERATION."
            ,(and (eq inhibit-file-name-operation operation)
                  inhibit-file-name-handlers)))
         (inhibit-file-name-operation operation)
+        (args (if (tramp-file-name-p (car args)) (cons nil (cdr args)) args))
         signal-hook-function)
     (apply operation args)))
 
@@ -2705,6 +2709,7 @@ Fall back to normal file name handler if no Tramp file 
name handler exists."
                          (tramp-message
                           v 5 "Non-essential received in operation %s"
                           (cons operation args))
+                         (let ((tramp-verbose 10)) (tramp-backtrace v))
                          (tramp-run-real-handler operation args))
                         ((eq result 'suppress)
                          (let ((inhibit-message t))
@@ -2949,7 +2954,7 @@ not in completion mode."
             (m (tramp-find-method method user host))
             all-user-hosts)
 
-       (unless localname        ;; Nothing to complete.
+       (unless localname ;; Nothing to complete.
 
          (if (or user host)
 
@@ -3384,8 +3389,9 @@ BODY is the backend specific code."
         (lockname (file-truename (or ,lockname filename)))
         (handler (and (stringp ,visit)
                       (let ((inhibit-file-name-handlers
-                             (cons 'tramp-file-name-handler
-                                   inhibit-file-name-handlers))
+                             `(tramp-file-name-handler
+                               tramp-crypt-file-name-handler
+                               . inhibit-file-name-handlers))
                             (inhibit-file-name-operation 'write-region))
                         (find-file-name-handler ,visit 'write-region)))))
      (with-parsed-tramp-file-name filename nil
@@ -3412,6 +3418,7 @@ BODY is the backend specific code."
               (gid (or (file-attribute-group-id
                         (file-attributes filename 'integer))
                        (tramp-get-remote-gid v 'integer)))
+              (attributes (file-extended-attributes filename))
               (curbuf (current-buffer)))
 
           ;; Lock file.
@@ -3432,7 +3439,7 @@ BODY is the backend specific code."
 
           ;; We must protect `last-coding-system-used', now we have
           ;; set it to its correct value.
-          (let (last-coding-system-used)
+          (let (last-coding-system-used (need-chown t))
             ;; Set file modification time.
             (when (or (eq ,visit t) (stringp ,visit))
               (when-let ((file-attr (file-attributes filename 'integer)))
@@ -3442,10 +3449,19 @@ BODY is the backend specific code."
                  ;; `file-precious-flag' is set.
                  (or (file-attribute-modification-time file-attr)
                      (current-time)))
-                ;; Set the ownership.
                 (unless (and (= (file-attribute-user-id file-attr) uid)
                              (= (file-attribute-group-id file-attr) gid))
-                  (tramp-set-file-uid-gid filename uid gid)))))
+                  (setq need-chown nil))))
+
+            ;; Set the ownership.
+             (when need-chown
+               (tramp-set-file-uid-gid filename uid gid)))
+
+          ;; Set extended attributes.  We ignore possible errors,
+          ;; because ACL strings could be incompatible.
+          (when attributes
+            (ignore-errors
+              (set-file-extended-attributes filename attributes)))
 
           ;; Unlock file.
           (when file-locked
@@ -4219,7 +4235,9 @@ Parsing the remote \"ps\" output is controlled by
 It is not guaranteed, that all process attributes as described in
 `process-attributes' are returned.  The additional attribute
 `pid' shall be returned always."
-  (with-tramp-file-property vec "/" "process-attributes"
+  ;; Since Emacs 27.1.
+  (when (fboundp 'connection-local-criteria-for-default-directory)
+    (with-tramp-file-property vec "/" "process-attributes"
       (ignore-errors
         (with-temp-buffer
           (hack-connection-local-variables-apply
@@ -4263,7 +4281,7 @@ It is not guaranteed, that all process attributes as 
described in
                   (push (append res) result))
                 (forward-line))
               ;; Return result.
-              result))))))
+              result)))))))
 
 (defun tramp-handle-list-system-processes ()
   "Like `list-system-processes' for Tramp files."
@@ -5622,7 +5640,9 @@ If FILENAME is remote, a file name handler is called."
       (setq gid (file-attribute-group-id (file-attributes dir)))))
 
   (if (tramp-tramp-file-p filename)
-      (tramp-file-name-handler #'tramp-set-file-uid-gid filename uid gid)
+      (funcall (if (tramp-crypt-file-name-p filename)
+                  #'tramp-crypt-file-name-handler #'tramp-file-name-handler)
+              #'tramp-set-file-uid-gid filename uid gid)
     ;; On W32 systems, "chown" does not work.
     (unless (memq system-type '(ms-dos windows-nt))
       (let ((uid (or (and (natnump uid) uid) (tramp-get-local-uid 'integer)))
@@ -5728,26 +5748,29 @@ be granted."
 If USER is a string, return its home directory instead of the
 user identified by VEC.  If there is no user specified in either
 VEC or USER, or if there is no home directory, return nil."
-  (with-tramp-connection-property vec (concat "~" user)
-    (tramp-file-name-handler #'tramp-get-home-directory vec user)))
+  (and (tramp-file-name-p vec)
+       (with-tramp-connection-property vec (concat "~" user)
+        (tramp-file-name-handler #'tramp-get-home-directory vec user))))
 
 (defun tramp-get-remote-uid (vec id-format)
   "The uid of the remote connection VEC, in ID-FORMAT.
 ID-FORMAT valid values are `string' and `integer'."
-  (with-tramp-connection-property vec (format "uid-%s" id-format)
-    (or (tramp-file-name-handler #'tramp-get-remote-uid vec id-format)
-       ;; Ensure there is a valid result.
-       (and (equal id-format 'integer) tramp-unknown-id-integer)
-       (and (equal id-format 'string) tramp-unknown-id-string))))
+  (or (and (tramp-file-name-p vec)
+          (with-tramp-connection-property vec (format "uid-%s" id-format)
+            (tramp-file-name-handler #'tramp-get-remote-uid vec id-format)))
+      ;; Ensure there is a valid result.
+      (and (equal id-format 'integer) tramp-unknown-id-integer)
+      (and (equal id-format 'string) tramp-unknown-id-string)))
 
 (defun tramp-get-remote-gid (vec id-format)
   "The gid of the remote connection VEC, in ID-FORMAT.
 ID-FORMAT valid values are `string' and `integer'."
-  (with-tramp-connection-property vec (format "gid-%s" id-format)
-    (or (tramp-file-name-handler #'tramp-get-remote-gid vec id-format)
-       ;; Ensure there is a valid result.
-       (and (equal id-format 'integer) tramp-unknown-id-integer)
-       (and (equal id-format 'string) tramp-unknown-id-string))))
+  (or (and (tramp-file-name-p vec)
+          (with-tramp-connection-property vec (format "gid-%s" id-format)
+            (tramp-file-name-handler #'tramp-get-remote-gid vec id-format)))
+      ;; Ensure there is a valid result.
+      (and (equal id-format 'integer) tramp-unknown-id-integer)
+      (and (equal id-format 'string) tramp-unknown-id-string)))
 
 (defun tramp-local-host-p (vec)
   "Return t if this points to the local host, nil otherwise.
diff --git a/lisp/net/trampver.el b/lisp/net/trampver.el
index e3bcd568d7..9a2f495eb8 100644
--- a/lisp/net/trampver.el
+++ b/lisp/net/trampver.el
@@ -58,6 +58,7 @@
       ;; `emacs-repository-get-branch' has been introduced with Emacs 27.1.
       (with-no-warnings
        (and (stringp dir) (file-directory-p dir)
+            (executable-find "git")
             (emacs-repository-get-branch dir)))))
   "The repository branch of the Tramp sources.")
 
@@ -70,6 +71,7 @@
          (dir (or (locate-dominating-file (locate-library "tramp") ".git")
                   source-directory)))
       (and (stringp dir) (file-directory-p dir)
+          (executable-find "git")
           (emacs-repository-get-version dir))))
   "The repository revision of the Tramp sources.")
 
diff --git a/lisp/newcomment.el b/lisp/newcomment.el
index 95adf9f90a..385dd80beb 100644
--- a/lisp/newcomment.el
+++ b/lisp/newcomment.el
@@ -1235,33 +1235,21 @@ changed with `comment-style'."
     ;; FIXME: maybe we should call uncomment depending on ARG.
     (funcall comment-region-function beg end arg)))
 
-(defun comment-region-default-1 (beg end &optional arg noadjust)
-  "Comment region between BEG and END.
-See `comment-region' for ARG.  If NOADJUST, do not skip past
-leading/trailing space when determining the region to comment
-out."
+(defun comment-region-default-1 (beg end &optional arg)
   (let* ((numarg (prefix-numeric-value arg))
         (style (cdr (assoc comment-style comment-styles)))
         (lines (nth 2 style))
         (block (nth 1 style))
         (multi (nth 0 style)))
 
-    (if noadjust
-        (when (bolp)
-          (setq end (1- end)))
-      ;; We use `chars' instead of `syntax' because `\n' might be
-      ;; of end-comment syntax rather than of whitespace syntax.
-      ;; sanitize BEG and END
-      (goto-char beg)
-      (skip-chars-forward " \t\n\r")
-      (beginning-of-line)
-      (setq beg (max beg (point)))
-      (goto-char end)
-      (skip-chars-backward " \t\n\r")
-      (end-of-line)
-      (setq end (min end (point)))
-      (when (>= beg end)
-        (error "Nothing to comment")))
+    ;; We use `chars' instead of `syntax' because `\n' might be
+    ;; of end-comment syntax rather than of whitespace syntax.
+    ;; sanitize BEG and END
+    (goto-char beg) (skip-chars-forward " \t\n\r") (beginning-of-line)
+    (setq beg (max beg (point)))
+    (goto-char end) (skip-chars-backward " \t\n\r") (end-of-line)
+    (setq end (min end (point)))
+    (if (>= beg end) (error "Nothing to comment"))
 
     ;; sanitize LINES
     (setq lines
diff --git a/lisp/obsolete/gs.el b/lisp/obsolete/gs.el
index 971e7d2640..7bf324ceec 100644
--- a/lisp/obsolete/gs.el
+++ b/lisp/obsolete/gs.el
@@ -116,7 +116,7 @@ FILE is the value to substitute for the place-holder 
`<file>'."
     (/ (* 25.4 mm) 72.0)))
 
 (declare-function x-change-window-property "xfns.c"
-                 (prop value &optional frame type format outer-p))
+                 (prop value &optional frame type format outer-p window-id))
 
 (defun gs-set-ghostview-window-prop (frame spec img-width img-height)
   "Set the `GHOSTVIEW' window property of FRAME.
diff --git a/lisp/obsolete/iswitchb.el b/lisp/obsolete/iswitchb.el
index 2825ea1136..1929d1994e 100644
--- a/lisp/obsolete/iswitchb.el
+++ b/lisp/obsolete/iswitchb.el
@@ -1064,8 +1064,7 @@ Return the modified list with the last element prepended 
to it."
        ;; then create a new buffer
        (progn
          (setq newbufcreated (get-buffer-create buf))
-         (if (fboundp 'set-buffer-major-mode)
-             (set-buffer-major-mode newbufcreated))
+          (set-buffer-major-mode newbufcreated)
          (iswitchb-visit-buffer newbufcreated))
       ;; else won't create new buffer
       (message "no buffer matching `%s'" buf))))
diff --git a/lisp/vc/vc-mtn.el b/lisp/obsolete/vc-mtn.el
similarity index 99%
rename from lisp/vc/vc-mtn.el
rename to lisp/obsolete/vc-mtn.el
index 20fbf92bb1..cd56b29007 100644
--- a/lisp/vc/vc-mtn.el
+++ b/lisp/obsolete/vc-mtn.el
@@ -5,6 +5,7 @@
 ;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
 ;; Keywords: vc
 ;; Package: vc
+;; Obsolete-since: 29.1
 
 ;; This file is part of GNU Emacs.
 
diff --git a/lisp/org/ol-eww.el b/lisp/org/ol-eww.el
index 69bf1ba62d..d1bb519510 100644
--- a/lisp/org/ol-eww.el
+++ b/lisp/org/ol-eww.el
@@ -115,7 +115,7 @@ keep the structure of the Org file."
       (setq transform-start (region-beginning))
       (setq transform-end (region-end))
       ;; Deactivate mark if current mark is activate.
-      (when (fboundp 'deactivate-mark) (deactivate-mark)))
+      (deactivate-mark))
     (message "Transforming links...")
     (save-excursion
       (goto-char transform-start)
diff --git a/lisp/org/ol-w3m.el b/lisp/org/ol-w3m.el
index 517329889c..80d6811a5c 100644
--- a/lisp/org/ol-w3m.el
+++ b/lisp/org/ol-w3m.el
@@ -72,7 +72,7 @@ so that it can be yanked into an Org  buffer with links 
working correctly."
       (setq transform-start (region-beginning))
       (setq transform-end (region-end))
       ;; Deactivate mark if current mark is activate.
-      (when (fboundp 'deactivate-mark) (deactivate-mark)))
+      (deactivate-mark))
     (message "Transforming links...")
     (save-excursion
       (goto-char transform-start)
diff --git a/lisp/org/org-agenda.el b/lisp/org/org-agenda.el
index dfd5d829db..a43b083d53 100644
--- a/lisp/org/org-agenda.el
+++ b/lisp/org/org-agenda.el
@@ -1615,7 +1615,7 @@ alpha-down         Sort headlines alphabetically, 
reversed.
 
 The different possibilities will be tried in sequence, and testing stops
 if one comparison returns a \"not-equal\".  For example, the default
-    '(time-up category-keep priority-down)
+    `(time-up category-keep priority-down)'
 means: Pull out all entries having a specified time of day and sort them,
 in order to make a time schedule for the current day the first thing in the
 agenda listing for the day.  Of the entries without a time indication, keep
diff --git a/lisp/org/org-clock.el b/lisp/org/org-clock.el
index 7395669109..fdc9818a5a 100644
--- a/lisp/org/org-clock.el
+++ b/lisp/org/org-clock.el
@@ -658,7 +658,6 @@ there is no recent clock to choose from."
                     (if (< i 10)
                         (+ i ?0)
                       (+ i (- ?A 10))) m))
-           (if (fboundp 'int-to-char) (setf (car s) (int-to-char (car s))))
            (push s sel-list)))
        (run-hooks 'org-clock-before-select-task-hook)
        (goto-char (point-min))
@@ -1105,7 +1104,7 @@ to be CLOCKED OUT."))))
                  60))
         (keep
          (or (and (memq ch '(?k ?K))
-                  (read-number "Keep how many minutes? " default))
+                  (read-number "Keep how many minutes: " default))
              (and (memq ch '(?t ?T))
                   (floor
                    (/ (float-time
@@ -1113,7 +1112,7 @@ to be CLOCKED OUT."))))
                       60)))))
         (gotback
          (and (memq ch '(?g ?G))
-              (read-number "Got back how many minutes ago? " default)))
+              (read-number "Got back how many minutes ago: " default)))
         (subtractp (memq ch '(?s ?S)))
         (barely-started-p (org-time-less-p
                            (org-time-subtract last-valid (cdr clock))
diff --git a/lisp/org/org-refile.el b/lisp/org/org-refile.el
index f76ebefe7b..71d00a7a22 100644
--- a/lisp/org/org-refile.el
+++ b/lisp/org/org-refile.el
@@ -577,7 +577,7 @@ prefix argument (`C-u C-u C-u C-c C-w')."
                     (with-demoted-errors "Bookmark set error: %S"
                       (bookmark-set bookmark-name))))
                 (move-marker org-capture-last-stored-marker (point)))
-              (when (fboundp 'deactivate-mark) (deactivate-mark))
+               (deactivate-mark)
               (run-hooks 'org-after-refile-insert-hook)))
            (unless org-refile-keep
              (if regionp
diff --git a/lisp/org/org-version.el b/lisp/org/org-version.el
index dc689662b7..6bdcb0afff 100644
--- a/lisp/org/org-version.el
+++ b/lisp/org/org-version.el
@@ -5,13 +5,13 @@
 (defun org-release ()
   "The release version of Org.
 Inserted by installing Org mode or when a release is made."
-   (let ((org-release "9.5.3"))
+   (let ((org-release "9.5.4"))
      org-release))
 ;;;###autoload
 (defun org-git-version ()
   "The Git version of Org mode.
 Inserted by installing Org or when a release is made."
-   (let ((org-git-version "release_9.5.3-3-gd54104"))
+   (let ((org-git-version "release_9.5.4"))
      org-git-version))
 
 (provide 'org-version)
diff --git a/lisp/org/org.el b/lisp/org/org.el
index 1fc4251a34..008230500d 100644
--- a/lisp/org/org.el
+++ b/lisp/org/org.el
@@ -9,7 +9,7 @@
 ;; Homepage: https://orgmode.org
 ;; Package-Requires: ((emacs "25.1"))
 
-;; Version: 9.5.3
+;; Version: 9.5.4
 
 ;; This file is part of GNU Emacs.
 ;;
@@ -247,7 +247,7 @@ byte-compiled before it is loaded."
     (if compile
        (progn
          (byte-compile-file tangled-file)
-         (load tangled-file)
+         (load-file (byte-compile-dest-file tangled-file))
          (message "Compiled and loaded %s" tangled-file))
       (load-file tangled-file)
       (message "Loaded %s" tangled-file))))
@@ -3301,7 +3301,7 @@ Replace format-specifiers in the command as noted below 
and use
 %i:     The LaTeX fragment to be converted.
 
 For example, this could be used with LaTeXML as
-\"latexmlc 'literal:%i' --profile=math --preload=siunitx.sty 2>/dev/null\"."
+\"latexmlc \\='literal:%i\\=' --profile=math --preload=siunitx.sty 
2>/dev/null\"."
   :group 'org-latex
   :package-version '(Org . "9.4")
   :type '(choice
@@ -12160,7 +12160,7 @@ This works in the agenda, and also in an Org buffer."
         (progn
           (message "[s]et or [r]emove? ")
           (equal (read-char-exclusive) ?r))))
-  (when (fboundp 'deactivate-mark) (deactivate-mark))
+  (deactivate-mark)
   (let ((agendap (equal major-mode 'org-agenda-mode))
        l1 l2 m buf pos newhead (cnt 0))
     (goto-char end)
@@ -15026,8 +15026,9 @@ When matching, the match groups are the following:
   (let* ((regexp
           (if extended
               (if (eq extended 'agenda)
-                  (rx (or (regexp org-ts-regexp3)
-                          (regexp org-element--timestamp-regexp)))
+                  (rx-to-string
+                   `(or (regexp ,org-ts-regexp3)
+                        (regexp ,org-element--timestamp-regexp)))
                org-ts-regexp3)
             org-ts-regexp2))
         (pos (point))
diff --git a/lisp/pcomplete.el b/lisp/pcomplete.el
index a1492af89d..15b9880df8 100644
--- a/lisp/pcomplete.el
+++ b/lisp/pcomplete.el
@@ -802,25 +802,30 @@ this is `comint-dynamic-complete-functions'."
       (let ((begin (pcomplete-begin 'last)))
        (if (and (listp pcomplete-stub) ;??
                 (not pcomplete-expand-only-p))
-           (let* ((completions pcomplete-stub) ;??
-                  (common-stub (car completions))
-                  (c completions)
-                  (len (length common-stub)))
-             (while (and c (> len 0))
-               (while (and (> len 0)
-                           (not (string=
-                                 (substring common-stub 0 len)
-                                 (substring (car c) 0
-                                            (min (length (car c))
-                                                 len)))))
-                 (setq len (1- len)))
-               (setq c (cdr c)))
-             (setq pcomplete-stub (substring common-stub 0 len)
-                   pcomplete-autolist t)
-             (when (and begin (> len 0) (not pcomplete-show-list))
-               (delete-region begin (point))
-               (pcomplete-insert-entry "" pcomplete-stub))
-             (throw 'pcomplete-completions completions))
+           ;; If `pcomplete-stub' is a list, it means it's a list of
+            ;; completions computed during parsing, e.g. Eshell uses
+            ;; that to turn globs into lists of completions.
+           (if (not pcomplete-allow-modifications)
+               (let ((completions pcomplete-stub))
+                 ;; FIXME: The mapping from what's in the buffer to the list
+                  ;; of completions can be arbitrary and will often fail to be
+                  ;; understood by the completion style.  See bug#50470.
+                  ;; E.g. `pcomplete-stub' may end up being "~/Down*"
+                  ;; while the completions contain entries like
+                  ;; "/home/<foo>/Downloads" which will fail to match the
+                  ;; "~/Down*" completion pattern since the completion
+                  ;; is neither told that it's a file nor a global pattern.
+                 (setq pcomplete-stub (buffer-substring begin (point)))
+                  (throw 'pcomplete-completions completions))
+             (let* ((completions pcomplete-stub)
+                    (common-prefix (try-completion "" completions))
+                    (len (length common-prefix)))
+               (setq pcomplete-stub common-prefix
+                     pcomplete-autolist t)
+               (when (and begin (> len 0) (not pcomplete-show-list))
+                 (delete-region begin (point))
+                 (pcomplete-insert-entry "" pcomplete-stub))
+               (throw 'pcomplete-completions completions)))
          (when expand-p
            (if (stringp pcomplete-stub)
                (when begin
diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el
index b0fe2f56c0..fc7e680c26 100644
--- a/lisp/pixel-scroll.el
+++ b/lisp/pixel-scroll.el
@@ -547,7 +547,7 @@ the height of the current window."
                               (beginning-of-visual-line)
                               (point)))
                       t)
-    (set-window-vscroll nil desired-vscroll t)))
+    (set-window-vscroll nil desired-vscroll t t)))
 
 (defun pixel-scroll-precision-scroll-down (delta)
   "Scroll the current window down by DELTA pixels."
@@ -586,7 +586,7 @@ the height of the current window."
         (goto-char up-point)))
     (let ((current-vscroll (window-vscroll nil t)))
       (setq delta (- delta current-vscroll))
-      (set-window-vscroll nil 0 t)
+      (set-window-vscroll nil 0 t t)
       (when (> delta 0)
         (let* ((start (window-start))
                (dims (window-text-pixel-size nil (cons start (- delta))
@@ -602,7 +602,7 @@ the height of the current window."
             (signal 'beginning-of-buffer nil))
           (setq delta (- delta height))))
       (when (< delta 0)
-        (set-window-vscroll nil (- delta) t)))))
+        (set-window-vscroll nil (- delta) t t)))))
 
 (defun pixel-scroll-precision-interpolate (delta &optional old-window)
   "Interpolate a scroll of DELTA pixels.
diff --git a/lisp/play/gamegrid.el b/lisp/play/gamegrid.el
index 256b4e19ce..55c9244f2e 100644
--- a/lisp/play/gamegrid.el
+++ b/lisp/play/gamegrid.el
@@ -343,11 +343,17 @@ format."
           (gamegrid-colorize-glyph color))
          ((listp data)
           (find-image data)) ;untested!
-         ((vectorp data)
-          (gamegrid-make-image-from-vector data)))))
+          ;; Remove when `gamegrid-make-image-from-vector' is removed:
+          ((vectorp data)
+           (lwarn 'gamegrid :warning
+                  "Using obsolete XEmacs style \"glyph\"; \
+convert to an Emacs image-spec instead")
+           (with-suppressed-warnings ((obsolete 
gamegrid-make-image-from-vector))
+             (gamegrid-make-image-from-vector data))))))
 
 (defun gamegrid-make-image-from-vector (vect)
   "Convert an XEmacs style \"glyph\" to an image-spec."
+  (declare (obsolete nil "29.1"))
   (let ((l (list 'image :type)))
     (dotimes (n (length vect))
       (setf l (nconc l (list (aref vect n)))))
diff --git a/lisp/play/handwrite.el b/lisp/play/handwrite.el
index 14624ddce2..68a82f5a9e 100644
--- a/lisp/play/handwrite.el
+++ b/lisp/play/handwrite.el
@@ -1,6 +1,6 @@
 ;;; handwrite.el --- turns your emacs buffer into a handwritten document  -*- 
lexical-binding: t -*-
 
-;; Copyright (C) 1996, 2001-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1996-2022 Free Software Foundation, Inc.
 
 ;; Author: Danny Roozendaal (was: <danny@tvs.kun.nl>)
 ;; Maintainer: emacs-devel@gnu.org
@@ -29,44 +29,42 @@
 ;;
 ;; Other functions that may be useful are:
 ;;
-;;      handwrite-10pt: sets the font size to 10 and finds corresponding
-;;                      values for the line spacing and the number of lines
-;;                      on a page.
-;;      handwrite-11pt: which is similar
-;;      handwrite-12pt: which is also similar
-;;      handwrite-13pt: which is similar, too
+;;     `handwrite-10pt': set the font size to 10 and find corresponding
+;;                       values for the line spacing and the number of lines
+;;                       on a page.
+;;     `handwrite-11pt': which is similar
+;;     `handwrite-12pt': which is also similar
+;;     `handwrite-13pt': which is similar, too
 ;;
-;;      handwrite-set-pagenumber: set and unset page numbering
+;;     `handwrite-set-pagenumber': set and unset page numbering
 ;;
 ;;
 ;; If you are not satisfied with the type page there are a number of
 ;; variables you may want to set.
 ;;
-;; To use this, say "M-x handwrite" or type at your prompt
+;; To use this, say `M-x handwrite' or type at your prompt
 ;; "emacs -l handwrite.el".
 ;;
 ;; I tried to make it `iso_8859_1'-friendly, but there are some exotic
 ;; characters missing.
 ;;
 ;;
-;; Known bugs: -Page feeds do not do their work, but are ignored instead.
-;;             -Tabs are not always properly displayed.
-;;             -Handwrite may create corrupt PostScript if it encounters
-;;              unknown characters.
+;; Known bugs:
+;; - Page feeds do not work, and are ignored instead.
+;; - Tabs are not always properly displayed.
+;; - Handwrite may create corrupt PostScript if it encounters
+;;   unknown characters.
 ;;
 ;; Thanks to anyone who emailed me suggestions!
 
 ;;; Code:
 
-;; From ps-print.el
-(defvar ps-printer-name)
-(defvar ps-lpr-command)
-(defvar ps-lpr-switches)
+(require 'ps-print)
 
 ;; Variables
 
 (defgroup handwrite nil
-  "Turns your Emacs buffer into a handwritten document."
+  "Turn your Emacs buffer into a handwritten document."
   :prefix "handwrite-"
   :group 'games)
 
@@ -235,20 +233,13 @@ Variables: `handwrite-linespace'     (default 12)
     (while (search-forward "\f" nil t)
       (replace-match "" nil t) )
     (untabify textp (point-max))       ; this may result in strange tabs
-    (if (y-or-n-p "Send this to the printer? ")
-       (progn
-         (require 'ps-print)
-         (let* ((coding-system-for-write 'raw-text-unix)
-                (ps-printer-name (or ps-printer-name
-                                     (and (boundp 'printer-name)
-                                          printer-name)))
-                (ps-lpr-switches
-                 (if (stringp ps-printer-name)
-                     (list (concat "-P" ps-printer-name)))))
-           (apply (or (and (boundp 'ps-print-region-function)
-                           ps-print-region-function)
-                      'call-process-region)
-                  (point-min) (point-max) ps-lpr-command nil nil nil))))
+    (when (y-or-n-p "Send this to the printer? ")
+      (let* ((coding-system-for-write 'raw-text-unix)
+            (printer-name (or ps-printer-name printer-name))
+             (lpr-printer-switch ps-printer-name-option)
+             (print-region-function ps-print-region-function)
+             (lpr-command ps-lpr-command))
+        (lpr-print-region (point-min) (point-max) ps-lpr-switches nil)))
     (message "")
     (bury-buffer ())
     (switch-to-buffer cur-buf)
@@ -264,8 +255,8 @@ Variables: `handwrite-linespace'     (default 12)
 
 (defun handwrite-10pt ()
   "Specify 10-point output for `handwrite'.
-This sets `handwrite-fontsize' to 10 and finds correct
-values for `handwrite-linespace' and `handwrite-numlines'."
+Set `handwrite-fontsize' to 10 and find correct values for
+`handwrite-linespace' and `handwrite-numlines'."
   (interactive)
   (setq handwrite-fontsize 10)
   (setq handwrite-linespace 11)
@@ -274,8 +265,8 @@ values for `handwrite-linespace' and `handwrite-numlines'."
 
 (defun handwrite-11pt ()
   "Specify 11-point output for `handwrite'.
-This sets `handwrite-fontsize' to 11 and finds correct
-values for `handwrite-linespace' and `handwrite-numlines'."
+Set `handwrite-fontsize' to 11 and find correct values for
+`handwrite-linespace' and `handwrite-numlines'."
   (interactive)
   (setq handwrite-fontsize 11)
   (setq handwrite-linespace 12)
@@ -284,8 +275,8 @@ values for `handwrite-linespace' and `handwrite-numlines'."
 
 (defun handwrite-12pt ()
   "Specify 12-point output for `handwrite'.
-This sets `handwrite-fontsize' to 12 and finds correct
-values for `handwrite-linespace' and `handwrite-numlines'."
+Set `handwrite-fontsize' to 12 and find correct values for
+`handwrite-linespace' and `handwrite-numlines'."
   (interactive)
   (setq handwrite-fontsize 12)
   (setq handwrite-linespace 13)
@@ -294,8 +285,8 @@ values for `handwrite-linespace' and `handwrite-numlines'."
 
 (defun handwrite-13pt ()
   "Specify 13-point output for `handwrite'.
-This sets `handwrite-fontsize' to 13 and finds correct
-values for `handwrite-linespace' and `handwrite-numlines'."
+Set `handwrite-fontsize' to 13 and find correct values for
+`handwrite-linespace' and `handwrite-numlines'."
   (interactive)
   (setq handwrite-fontsize 13)
   (setq handwrite-linespace 14)
diff --git a/lisp/play/morse.el b/lisp/play/morse.el
index 974e9fbc49..5b7d343a79 100644
--- a/lisp/play/morse.el
+++ b/lisp/play/morse.el
@@ -1,6 +1,6 @@
 ;;; morse.el --- convert text to morse code and back  -*- lexical-binding: t 
-*-
 
-;; Copyright (C) 1995, 2001-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1995-2022 Free Software Foundation, Inc.
 
 ;; Author: Rick Farnbach <rick_farnbach@MENTORG.COM>
 ;; Keywords: games
@@ -22,11 +22,11 @@
 
 ;;; Commentary:
 
-;; Converts text to Morse code and back with M-x morse-region and
-;; M-x unmorse-region (though Morse code is no longer official :-().
+;; Convert plain text to Morse code and back with `M-x morse-region' and
+;; `M-x unmorse-region'.
 
-;; Converts text to NATO phonetic alphabet and back with M-x
-;; nato-region and M-x denato-region.
+;; Convert plain text to NATO spelling alphabet and back with
+;; `M-x nato-region' and `M-x denato-region'.
 
 ;;; Code:
 
@@ -142,14 +142,16 @@
                        ("(" . "Open")
                        (")" . "Close")
                        ("@" . "At"))
-  "NATO phonetic alphabet.
+  "NATO spelling alphabet.
 See “International Code of Signals” (INTERCO), United States
 Edition, 1969 Edition (Revised 2003) available from National
-Geospatial-Intelligence Agency at URL `https://www.nga.mil/'")
+Geospatial-Intelligence Agency at <https://www.nga.mil/>.
+See also <https://en.wikipedia.org/wiki/NATO_phonetic_alphabet>.")
 
 ;;;###autoload
 (defun morse-region (beg end)
-  "Convert all text in a given region to morse code."
+  "Convert plain text in region to Morse code.
+See <https://en.wikipedia.org/wiki/Morse_code>."
   (interactive "*r")
   (if (integerp end)
       (setq end (copy-marker end)))
@@ -172,7 +174,7 @@ Geospatial-Intelligence Agency at URL 
`https://www.nga.mil/'")
 
 ;;;###autoload
 (defun unmorse-region (beg end)
-  "Convert morse coded text in region to ordinary ASCII text."
+  "Convert Morse coded text in region to plain text."
   (interactive "*r")
   (if (integerp end)
       (setq end (copy-marker end)))
@@ -194,7 +196,7 @@ Geospatial-Intelligence Agency at URL 
`https://www.nga.mil/'")
 
 ;;;###autoload
 (defun nato-region (beg end)
-  "Convert all text in a given region to NATO phonetic alphabet."
+  "Convert plain text in region to NATO spelling alphabet."
   ;; Copied from morse-region. -- ashawley 2009-02-10
   (interactive "*r")
   (if (integerp end)
@@ -218,7 +220,7 @@ Geospatial-Intelligence Agency at URL 
`https://www.nga.mil/'")
 
 ;;;###autoload
 (defun denato-region (beg end)
-  "Convert NATO phonetic alphabet in region to ordinary ASCII text."
+  "Convert NATO spelling alphabet text in region to plain text."
   ;; Copied from unmorse-region. -- ashawley 2009-02-10
   (interactive "*r")
   (if (integerp end)
diff --git a/lisp/progmodes/antlr-mode.el b/lisp/progmodes/antlr-mode.el
index 4bc6de0c75..d6e2ab8a87 100644
--- a/lisp/progmodes/antlr-mode.el
+++ b/lisp/progmodes/antlr-mode.el
@@ -2437,7 +2437,6 @@ the default language."
        #'antlr-imenu-create-index-function)
   (set (make-local-variable 'imenu-generic-expression) t) ; fool stupid test
   (and antlr-imenu-name                        ; there should be a global 
variable...
-       (fboundp 'imenu-add-to-menubar)
        (imenu-add-to-menubar
        (if (stringp antlr-imenu-name) antlr-imenu-name "Index")))
   (antlr-set-tabs))
diff --git a/lisp/progmodes/asm-mode.el b/lisp/progmodes/asm-mode.el
index 370fb1b80b..aaf063b517 100644
--- a/lisp/progmodes/asm-mode.el
+++ b/lisp/progmodes/asm-mode.el
@@ -24,16 +24,16 @@
 ;;; Commentary:
 
 ;; This mode was written by Eric S. Raymond <esr@snark.thyrsus.com>,
-;; inspired by an earlier asm-mode by Martin Neitzel.
+;; inspired by an earlier `asm-mode' by Martin Neitzel.
 
-;; This major mode is based on prog mode.  It defines a private abbrev table
-;; that can be used to save abbrevs for assembler mnemonics.  It binds just
-;; five keys:
+;; This major mode is based on `prog-mode'.  It defines a private
+;; abbrev table that can be used to save abbrevs for assembler
+;; mnemonics.  It binds just five keys:
 ;;
 ;;     TAB             tab to next tab stop
 ;;     :               outdent preceding label, tab to tab stop
 ;;     comment char    place or move comment
-;;                     asm-comment-char specifies which character this is;
+;;                     `asm-comment-char' specifies which character this is;
 ;;                     you can use a different character in different
 ;;                     Asm mode buffers.
 ;;     C-j, C-m        newline and tab to tab stop
@@ -41,9 +41,9 @@
 ;; Code is indented to the first tab stop level.
 
 ;; This mode runs two hooks:
-;;   1) An asm-mode-set-comment-hook before the part of the initialization
-;; depending on asm-comment-char, and
-;;   2) an asm-mode-hook at the end of initialization.
+;;   1) `asm-mode-set-comment-hook' before the part of the initialization
+;;      depending on `asm-comment-char', and
+;;   2) `asm-mode-hook' at the end of initialization.
 
 ;;; Code:
 
@@ -68,13 +68,11 @@
   "Abbrev table used while in Asm mode.")
 (define-abbrev-table 'asm-mode-abbrev-table ())
 
-(defvar asm-mode-map
-  (let ((map (make-sparse-keymap)))
-    ;; Note that the comment character isn't set up until asm-mode is called.
-    (define-key map ":"                'asm-colon)
-    (define-key map "\C-c;"    'comment-region)
-    map)
-  "Keymap for Asm mode.")
+(defvar-keymap asm-mode-map
+  :doc "Keymap for Asm mode."
+  ;; Note that the comment character isn't set up until asm-mode is called.
+  ":"     #'asm-colon
+  "C-c ;" #'comment-region)
 
 (easy-menu-define asm-mode-menu asm-mode-map
   "Menu for Asm mode."
@@ -130,7 +128,7 @@ Special commands:
   (setq-local tab-always-indent nil)
 
   (run-hooks 'asm-mode-set-comment-hook)
-  ;; Make our own local child of asm-mode-map
+  ;; Make our own local child of `asm-mode-map'
   ;; so we can define our own comment character.
   (use-local-map (nconc (make-sparse-keymap) asm-mode-map))
   (local-set-key (vector asm-comment-char) #'asm-comment)
diff --git a/lisp/progmodes/bug-reference.el b/lisp/progmodes/bug-reference.el
index 06242a4cba..d3626dbaf0 100644
--- a/lisp/progmodes/bug-reference.el
+++ b/lisp/progmodes/bug-reference.el
@@ -40,12 +40,10 @@
   ;; Somewhat arbitrary, by analogy with eg goto-address.
   :group 'comm)
 
-(defvar bug-reference-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [mouse-2] 'bug-reference-push-button)
-    (define-key map (kbd "C-c RET") 'bug-reference-push-button)
-    map)
-  "Keymap used by bug reference buttons.")
+(defvar-keymap bug-reference-map
+  :doc "Keymap used by bug reference buttons."
+  "<mouse-2>" #'bug-reference-push-button
+  "C-c RET"   #'bug-reference-push-button)
 
 ;; E.g., "https://gcc.gnu.org/PR%s";
 (defvar bug-reference-url-format nil
diff --git a/lisp/progmodes/cc-awk.el b/lisp/progmodes/cc-awk.el
index 188d5a8a83..9ea1557391 100644
--- a/lisp/progmodes/cc-awk.el
+++ b/lisp/progmodes/cc-awk.el
@@ -56,6 +56,8 @@
 ;; Silence the byte compiler.
 (cc-bytecomp-defvar c-new-BEG)
 (cc-bytecomp-defvar c-new-END)
+(cc-bytecomp-defun c-restore-string-fences)
+(cc-bytecomp-defun c-clear-string-fences)
 
 ;; Some functions in cc-engine that are used below.  There's a cyclic
 ;; dependency so it can't be required here.  (Perhaps some functions
@@ -934,7 +936,7 @@
   ;; It prepares the buffer for font
   ;; locking, hence must get called before `font-lock-after-change-function'.
   ;;
-  ;; This function is the AWK value of `c-before-font-lock-function'.
+  ;; This function is the AWK value of `c-before-font-lock-functions'.
   ;; It does hidden buffer changes.
   (c-save-buffer-state ()
     (setq c-new-END (c-awk-end-of-change-region beg end old-len))
@@ -1109,29 +1111,30 @@ nor helpful.
 Note that this function might do hidden buffer changes.  See the
 comment at the start of cc-engine.el for more info."
   (interactive "p")
-  (or arg (setq arg 1))
-  (save-match-data
-    (c-save-buffer-state                ; ensures the buffer is writable.
-     nil
-     (let ((found t))     ; Has the most recent regexp search found b-of-defun?
-       (if (>= arg 0)
-           ;; Go back one defun each time round the following loop. (For +ve 
arg)
-           (while (and found (> arg 0) (not (eq (point) (point-min))))
-             ;; Go back one "candidate" each time round the next loop until one
-             ;; is genuinely a beginning-of-defun.
-             (while (and (setq found (search-backward-regexp
-                                      "^[^#} \t\n\r]" (point-min) 
'stop-at-limit))
-                         (not (memq (c-awk-get-NL-prop-prev-line) '(?\$ ?\} 
?\#)))))
-             (setq arg (1- arg)))
-         ;; The same for a -ve arg.
-         (if (not (eq (point) (point-max))) (forward-char 1))
-         (while (and found (< arg 0) (not (eq (point) (point-max)))) ; The 
same for -ve arg.
-           (while (and (setq found (search-forward-regexp
-                                    "^[^#} \t\n\r]" (point-max) 
'stop-at-limit))
-                       (not (memq (c-awk-get-NL-prop-prev-line) '(?\$ ?\} 
?\#)))))
-           (setq arg (1+ arg)))
-         (if found (goto-char (match-beginning 0))))
-       (eq arg 0)))))
+  (c-with-string-fences
+   (or arg (setq arg 1))
+   (save-match-data
+     (c-save-buffer-state           ; ensures the buffer is writable.
+        nil
+       (let ((found t))        ; Has the most recent regexp search found 
b-of-defun?
+        (if (>= arg 0)
+             ;; Go back one defun each time round the following loop. (For +ve 
arg)
+             (while (and found (> arg 0) (not (eq (point) (point-min))))
+               ;; Go back one "candidate" each time round the next loop until 
one
+               ;; is genuinely a beginning-of-defun.
+               (while (and (setq found (search-backward-regexp
+                                       "^[^#} \t\n\r]" (point-min) 
'stop-at-limit))
+                           (not (memq (c-awk-get-NL-prop-prev-line) '(?\$ ?\} 
?\#)))))
+               (setq arg (1- arg)))
+           ;; The same for a -ve arg.
+           (if (not (eq (point) (point-max))) (forward-char 1))
+           (while (and found (< arg 0) (not (eq (point) (point-max)))) ; The 
same for -ve arg.
+             (while (and (setq found (search-forward-regexp
+                                      "^[^#} \t\n\r]" (point-max) 
'stop-at-limit))
+                        (not (memq (c-awk-get-NL-prop-prev-line) '(?\$ ?\} 
?\#)))))
+             (setq arg (1+ arg)))
+           (if found (goto-char (match-beginning 0))))
+        (eq arg 0))))))
 
 (defun c-awk-forward-awk-pattern ()
   ;; Point is at the start of an AWK pattern (which may be null) or function
@@ -1187,39 +1190,40 @@ no explicit action; see function 
`c-awk-beginning-of-defun'.
 Note that this function might do hidden buffer changes.  See the
 comment at the start of cc-engine.el for more info."
   (interactive "p")
-  (or arg (setq arg 1))
-  (save-match-data
-    (c-save-buffer-state
-     nil
-     (let ((start-point (point)) end-point)
-       ;; Strategy: (For +ve ARG): If we're not already at a 
beginning-of-defun,
-       ;; move backwards to one.
-       ;; Repeat [(i) move forward to end-of-current-defun (see below);
-       ;;         (ii) If this isn't it, move forward to beginning-of-defun].
-       ;; We start counting ARG only when step (i) has passed the original 
point.
-       (when (> arg 0)
-         ;; Try to move back to a beginning-of-defun, if not already at one.
-         (if (not (c-awk-beginning-of-defun-p))
-             (when (not (c-awk-beginning-of-defun 1)) ; No bo-defun before 
point.
-               (goto-char start-point)
-               (c-awk-beginning-of-defun -1))) ; if this fails, we're at EOB, 
tough!
-         ;; Now count forward, one defun at a time
-         (while (and (not (eobp))
-                     (c-awk-end-of-defun1)
-                     (if (> (point) start-point) (setq arg (1- arg)) t)
-                     (> arg 0)
-                     (c-awk-beginning-of-defun -1))))
-
-       (when (< arg 0)
-         (setq end-point start-point)
-         (while (and (not (bobp))
-                     (c-awk-beginning-of-defun 1)
-                     (if (< (setq end-point (if (bobp) (point)
-                                              (save-excursion 
(c-awk-end-of-defun1))))
-                            start-point)
-                         (setq arg (1+ arg)) t)
-                     (< arg 0)))
-         (goto-char (min start-point end-point)))))))
+  (c-with-string-fences
+   (or arg (setq arg 1))
+   (save-match-data
+     (c-save-buffer-state
+        nil
+       (let ((start-point (point)) end-point)
+        ;; Strategy: (For +ve ARG): If we're not already at a 
beginning-of-defun,
+        ;; move backwards to one.
+        ;; Repeat [(i) move forward to end-of-current-defun (see below);
+        ;;         (ii) If this isn't it, move forward to beginning-of-defun].
+        ;; We start counting ARG only when step (i) has passed the original 
point.
+        (when (> arg 0)
+           ;; Try to move back to a beginning-of-defun, if not already at one.
+           (if (not (c-awk-beginning-of-defun-p))
+               (when (not (c-awk-beginning-of-defun 1)) ; No bo-defun before 
point.
+                (goto-char start-point)
+                (c-awk-beginning-of-defun -1))) ; if this fails, we're at EOB, 
tough!
+           ;; Now count forward, one defun at a time
+           (while (and (not (eobp))
+                       (c-awk-end-of-defun1)
+                       (if (> (point) start-point) (setq arg (1- arg)) t)
+                       (> arg 0)
+                       (c-awk-beginning-of-defun -1))))
+
+        (when (< arg 0)
+           (setq end-point start-point)
+           (while (and (not (bobp))
+                       (c-awk-beginning-of-defun 1)
+                       (if (< (setq end-point (if (bobp) (point)
+                                               (save-excursion 
(c-awk-end-of-defun1))))
+                              start-point)
+                           (setq arg (1+ arg)) t)
+                       (< arg 0)))
+           (goto-char (min start-point end-point))))))))
 
 
 (cc-provide 'cc-awk)                   ; Changed from 'awk-mode, ACM 2002/5/21
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el
index f1f61f7e08..e9cc63709e 100644
--- a/lisp/progmodes/cc-cmds.el
+++ b/lisp/progmodes/cc-cmds.el
@@ -49,6 +49,8 @@
                                        ; which looks at this.
 (cc-bytecomp-defun electric-pair-post-self-insert-function)
 (cc-bytecomp-defvar c-indent-to-body-directives)
+(cc-bytecomp-defun c-restore-string-fences)
+(cc-bytecomp-defun c-clear-string-fences)
 (defvar c-syntactic-context)
 
 ;; Indentation / Display syntax functions
@@ -210,35 +212,36 @@ and takes care to set the indentation before calling
   "Show syntactic information for current line.
 With universal argument, inserts the analysis as a comment on that line."
   (interactive "P")
-  (let* ((c-parsing-error nil)
-        (syntax (if (boundp 'c-syntactic-context)
-                    ;; Use `c-syntactic-context' in the same way as
-                    ;; `c-indent-line', to be consistent.
-                    c-syntactic-context
-                  (c-save-buffer-state nil
-                    (c-guess-basic-syntax)))))
-    (if (not (consp arg))
-       (let (elem pos ols)
-         (message "Syntactic analysis: %s" syntax)
-         (unwind-protect
-             (progn
-               (while syntax
-                 (setq elem (pop syntax))
-                 (when (setq pos (c-langelem-pos elem))
-                   (push (c-put-overlay pos (1+ pos)
-                                        'face 'highlight)
-                         ols))
-                 (when (setq pos (c-langelem-2nd-pos elem))
-                   (push (c-put-overlay pos (1+ pos)
-                                        'face 'secondary-selection)
-                         ols)))
-               (sit-for 10))
-           (while ols
-             (c-delete-overlay (pop ols)))))
-      (indent-for-comment)
-      (insert-and-inherit (format "%s" syntax))
-      ))
-  (c-keep-region-active))
+  (c-with-string-fences
+   (let* ((c-parsing-error nil)
+         (syntax (if (boundp 'c-syntactic-context)
+                     ;; Use `c-syntactic-context' in the same way as
+                     ;; `c-indent-line', to be consistent.
+                     c-syntactic-context
+                   (c-save-buffer-state nil
+                     (c-guess-basic-syntax)))))
+     (if (not (consp arg))
+        (let (elem pos ols)
+          (message "Syntactic analysis: %s" syntax)
+          (unwind-protect
+              (progn
+                (while syntax
+                  (setq elem (pop syntax))
+                  (when (setq pos (c-langelem-pos elem))
+                    (push (c-put-overlay pos (1+ pos)
+                                         'face 'highlight)
+                          ols))
+                  (when (setq pos (c-langelem-2nd-pos elem))
+                    (push (c-put-overlay pos (1+ pos)
+                                         'face 'secondary-selection)
+                          ols)))
+                (sit-for 10))
+            (while ols
+              (c-delete-overlay (pop ols)))))
+       (indent-for-comment)
+       (insert-and-inherit (format "%s" syntax))
+       ))
+   (c-keep-region-active)))
 
 (defun c-syntactic-information-on-region (from to)
   "Insert a comment with the syntactic analysis on every line in the region."
@@ -414,23 +417,25 @@ argument is supplied, or `c-hungry-delete-key' is nil, or 
point is
 inside a literal then the function in the variable
 `c-backspace-function' is called."
   (interactive "*P")
-  (if (c-save-buffer-state ()
-       (or (not c-hungry-delete-key)
-           arg
-           (c-in-literal)))
-      (funcall c-backspace-function (prefix-numeric-value arg))
-    (c-hungry-delete-backwards)))
+  (c-with-string-fences
+   (if (c-save-buffer-state ()
+        (or (not c-hungry-delete-key)
+            arg
+            (c-in-literal)))
+       (funcall c-backspace-function (prefix-numeric-value arg))
+     (c-hungry-delete-backwards))))
 
 (defun c-hungry-delete-backwards ()
   "Delete the preceding character or all preceding whitespace
 back to the previous non-whitespace character.
 See also \\[c-hungry-delete-forward]."
   (interactive)
-  (let ((here (point)))
-    (c-skip-ws-backward)
-    (if (/= (point) here)
-       (delete-region (point) here)
-      (funcall c-backspace-function 1))))
+  (c-with-string-fences
+   (let ((here (point)))
+     (c-skip-ws-backward)
+     (if (/= (point) here)
+        (delete-region (point) here)
+       (funcall c-backspace-function 1)))))
 
 (defalias 'c-hungry-backspace 'c-hungry-delete-backwards)
 
@@ -442,23 +447,26 @@ argument is supplied, or `c-hungry-delete-key' is nil, or 
point is
 inside a literal then the function in the variable `c-delete-function'
 is called."
   (interactive "*P")
-  (if (c-save-buffer-state ()
-       (or (not c-hungry-delete-key)
-           arg
-           (c-in-literal)))
-      (funcall c-delete-function (prefix-numeric-value arg))
-    (c-hungry-delete-forward)))
+  (c-with-string-fences
+   (if
+       (c-save-buffer-state ()
+        (or (not c-hungry-delete-key)
+            arg
+            (c-in-literal)))
+       (funcall c-delete-function (prefix-numeric-value arg))
+     (c-hungry-delete-forward))))
 
 (defun c-hungry-delete-forward ()
   "Delete the following character or all following whitespace
 up to the next non-whitespace character.
 See also \\[c-hungry-delete-backwards]."
   (interactive)
-  (let ((here (point)))
-    (c-skip-ws-forward)
-    (if (/= (point) here)
-       (delete-region (point) here)
-      (funcall c-delete-function 1))))
+  (c-with-string-fences
+   (let ((here (point)))
+     (c-skip-ws-forward)
+     (if (/= (point) here)
+        (delete-region (point) here)
+       (funcall c-delete-function 1)))))
 
 ;; This function is only used in XEmacs.
 (defun c-electric-delete (arg)
@@ -519,7 +527,8 @@ function to control that."
 
 (defmacro c--call-post-self-insert-hook-more-safely ()
   ;; Call post-self-insert-hook, if such exists.  See comment for
-  ;; `c--call-post-self-insert-hook-more-safely-1'.
+  ;; `c--call-post-self-insert-hook-more-safely-1'.  This macro should be
+  ;; invoked OUTSIDE of `c-with-string-fences'.
   (if (boundp 'post-self-insert-hook)
       '(c--call-post-self-insert-hook-more-safely-1)
     '(progn)))
@@ -530,30 +539,30 @@ If `c-electric-flag' is set, handle it specially 
according to the variable
 `c-electric-pound-behavior'.  If a numeric ARG is supplied, or if point is
 inside a literal or a macro, nothing special happens."
   (interactive "*P")
-  (if (c-save-buffer-state ()
-       (or arg
-           (not c-electric-flag)
-           (not (memq 'alignleft c-electric-pound-behavior))
-           (save-excursion
-             (skip-chars-backward " \t")
-             (not (bolp)))
-           (save-excursion
-             (and (= (forward-line -1) 0)
-                  (progn (end-of-line)
-                         (eq (char-before) ?\\))))
-           (c-in-literal)))
-      ;; do nothing special
-      (let (post-self-insert-hook)     ; Disable random functionality.
-       (self-insert-command (prefix-numeric-value arg)))
-    ;; place the pound character at the left edge
-    (let ((pos (- (point-max) (point)))
-         (bolp (bolp)))
-      (beginning-of-line)
-      (delete-horizontal-space)
-      (insert (c-last-command-char))
-      (and (not bolp)
-          (goto-char (- (point-max) pos)))
-      ))
+  (c-with-string-fences
+   (if (c-save-buffer-state ()
+        (or arg
+            (not c-electric-flag)
+            (not (memq 'alignleft c-electric-pound-behavior))
+            (save-excursion
+              (skip-chars-backward " \t")
+              (not (bolp)))
+            (save-excursion
+              (and (= (forward-line -1) 0)
+                   (progn (end-of-line)
+                          (eq (char-before) ?\\))))
+            (c-in-literal)))
+       ;; do nothing special
+       (let (post-self-insert-hook)    ; Disable random functionality.
+        (self-insert-command (prefix-numeric-value arg)))
+     ;; place the pound character at the left edge
+     (let ((pos (- (point-max) (point)))
+          (bolp (bolp)))
+       (beginning-of-line)
+       (delete-horizontal-space)
+       (insert (c-last-command-char))
+       (and (not bolp)
+           (goto-char (- (point-max) pos))))))
   (c--call-post-self-insert-hook-more-safely))
 
 (defun c-point-syntax ()
@@ -883,25 +892,26 @@ settings of `c-cleanup-list' are done."
 
   (interactive "*P")
   (let (safepos literal
-       ;; We want to inhibit blinking the paren since this would be
-       ;; most disruptive.  We'll blink it ourselves later on.
-       (old-blink-paren blink-paren-function)
-       blink-paren-function case-fold-search
-       (at-eol (looking-at "[ \t]*\\\\?$"))
-       (active-region (and (fboundp 'use-region-p) (use-region-p)))
-       got-pair-} electric-pair-deletion)
-
-    (c-save-buffer-state ()
-      (setq safepos (c-safe-position (point) (c-parse-state))
-           literal (c-in-literal safepos)))
-
-    ;; Insert the brace.  Note that expand-abbrev might reindent
-    ;; the line here if there's a preceding "else" or something.
-    (let (post-self-insert-hook) ; the only way to get defined functionality
-                                ; from `self-insert-command'.
-      (self-insert-command (prefix-numeric-value arg)))
-
-    ;; Emulate `electric-pair-mode'.
+               ;; We want to inhibit blinking the paren since this would be
+               ;; most disruptive.  We'll blink it ourselves later on.
+               (old-blink-paren blink-paren-function)
+               blink-paren-function case-fold-search
+               (at-eol (looking-at "[ \t]*\\\\?$"))
+               (active-region (and (fboundp 'use-region-p) (use-region-p)))
+               got-pair-} electric-pair-deletion)
+
+    (c-with-string-fences
+     (c-save-buffer-state ()
+       (setq safepos (c-safe-position (point) (c-parse-state))
+            literal (c-in-literal safepos)))
+
+     ;; Insert the brace.  Note that expand-abbrev might reindent
+     ;; the line here if there's a preceding "else" or something.
+     (let (post-self-insert-hook)  ; the only way to get defined functionality
+                                       ; from `self-insert-command'.
+       (self-insert-command (prefix-numeric-value arg))))
+
+    ;; Emulate `electric-pair-mode', outside of `c-with-string-fences'.
     (when (and (boundp 'electric-pair-mode)
               electric-pair-mode)
       (let ((size (buffer-size))
@@ -912,30 +922,31 @@ settings of `c-cleanup-list' are done."
                              (eq (char-after) ?}))
              electric-pair-deletion (< (buffer-size) size))))
 
-    ;; Perform any required CC Mode electric actions.
-    (cond
-     ((or literal arg (not c-electric-flag) active-region))
-     ((not at-eol)
-      (c-indent-line))
-     (electric-pair-deletion
-      (c-indent-line)
-      (c-do-brace-electrics 'ignore nil))
-     (t (c-do-brace-electrics nil nil)
-       (when got-pair-}
+    (c-with-string-fences
+     ;; Perform any required CC Mode electric actions.
+     (cond
+      ((or literal arg (not c-electric-flag) active-region))
+      ((not at-eol)
+       (c-indent-line))
+      (electric-pair-deletion
+       (c-indent-line)
+       (c-do-brace-electrics 'ignore nil))
+      (t (c-do-brace-electrics nil nil)
+        (when got-pair-}
+          (save-excursion
+            (forward-char)
+            (c-do-brace-electrics 'assume 'ignore))
+          (c-indent-line))))
+
+     ;; blink the paren
+     (and (eq (c-last-command-char) ?\})
+         (not executing-kbd-macro)
+         old-blink-paren
          (save-excursion
-           (forward-char)
-           (c-do-brace-electrics 'assume 'ignore))
-         (c-indent-line))))
-
-    ;; blink the paren
-    (and (eq (c-last-command-char) ?\})
-        (not executing-kbd-macro)
-        old-blink-paren
-        (save-excursion
-          (c-save-buffer-state nil
-            (c-backward-syntactic-ws safepos))
-          (funcall old-blink-paren)))
-    (c--call-post-self-insert-hook-more-safely)))
+           (c-save-buffer-state nil
+             (c-backward-syntactic-ws safepos))
+           (funcall old-blink-paren)))))
+  (c--call-post-self-insert-hook-more-safely))
 
 (defun c-electric-slash (arg)
   "Insert a slash character.
@@ -956,39 +967,40 @@ If a numeric ARG is supplied, point is inside a literal, 
or
 `c-syntactic-indentation' is nil or `c-electric-flag' is nil, indentation
 is inhibited."
   (interactive "*P")
-  (let ((literal (c-save-buffer-state () (c-in-literal)))
-       indentp
-       ;; shut this up
-       (c-echo-syntactic-information-p nil))
+  (c-with-string-fences
+   (let ((literal (c-save-buffer-state () (c-in-literal)))
+        indentp
+        ;; shut this up
+        (c-echo-syntactic-information-p nil))
 
-    ;; comment-close-slash cleanup?  This DOESN'T need `c-electric-flag' or
-    ;; `c-syntactic-indentation' set.
-    (when (and (not arg)
-              (eq literal 'c)
-              (memq 'comment-close-slash c-cleanup-list)
-              (eq (c-last-command-char) ?/)
-              (looking-at (concat "[ \t]*\\("
-                                  (regexp-quote comment-end) "\\)?$"))
-       ; (eq c-block-comment-ender "*/") ; C-style comments ALWAYS end in */
-              (save-excursion
-                (save-restriction
-                  (narrow-to-region (point-min) (point))
-                  (back-to-indentation)
-                  (looking-at (concat c-current-comment-prefix "[ \t]*$")))))
-      (delete-region (progn (forward-line 0) (point))
-                    (progn (end-of-line) (point)))
-      (insert-char ?* 1)) ; the / comes later. ; Do I need a t (retain sticky 
properties) here?
-
-    (setq indentp (and (not arg)
-                      c-syntactic-indentation
-                      c-electric-flag
-                      (eq (c-last-command-char) ?/)
-                      (eq (char-before) (if literal ?* ?/))))
-    (let (post-self-insert-hook)       ; Disable random functionality.
-      (self-insert-command (prefix-numeric-value arg)))
-    (if indentp
-       (indent-according-to-mode))
-    (c--call-post-self-insert-hook-more-safely)))
+     ;; comment-close-slash cleanup?  This DOESN'T need `c-electric-flag' or
+     ;; `c-syntactic-indentation' set.
+     (when (and (not arg)
+               (eq literal 'c)
+               (memq 'comment-close-slash c-cleanup-list)
+               (eq (c-last-command-char) ?/)
+               (looking-at (concat "[ \t]*\\("
+                                   (regexp-quote comment-end) "\\)?$"))
+                                       ; (eq c-block-comment-ender "*/") ; 
C-style comments ALWAYS end in */
+               (save-excursion
+                 (save-restriction
+                   (narrow-to-region (point-min) (point))
+                   (back-to-indentation)
+                   (looking-at (concat c-current-comment-prefix "[ \t]*$")))))
+       (delete-region (progn (forward-line 0) (point))
+                     (progn (end-of-line) (point)))
+       (insert-char ?* 1)) ; the / comes later. ; Do I need a t (retain sticky 
properties) here?
+
+     (setq indentp (and (not arg)
+                       c-syntactic-indentation
+                       c-electric-flag
+                       (eq (c-last-command-char) ?/)
+                       (eq (char-before) (if literal ?* ?/))))
+     (let (post-self-insert-hook)      ; Disable random functionality.
+       (self-insert-command (prefix-numeric-value arg)))
+     (if indentp
+        (indent-according-to-mode))))
+  (c--call-post-self-insert-hook-more-safely))
 
 (defun c-electric-star (arg)
   "Insert a star character.
@@ -999,26 +1011,26 @@ supplied, point is inside a literal, or 
`c-syntactic-indentation' is nil,
 this indentation is inhibited."
 
   (interactive "*P")
-  (let (post-self-insert-hook)         ; Disable random functionality.
-    (self-insert-command (prefix-numeric-value arg)))
-  ;; if we are in a literal, or if arg is given do not reindent the
-  ;; current line, unless this star introduces a comment-only line.
-  (if (c-save-buffer-state ()
-       (and c-syntactic-indentation
-            c-electric-flag
-            (not arg)
-            (eq (c-in-literal) 'c)
-            (eq (char-before) ?*)
-            (save-excursion
-              (forward-char -1)
-              (skip-chars-backward "*")
-              (if (eq (char-before) ?/)
-                  (forward-char -1))
-              (skip-chars-backward " \t")
-              (bolp))))
-      (let (c-echo-syntactic-information-p) ; shut this up
-       (indent-according-to-mode))
-    )
+  (c-with-string-fences
+   (let (post-self-insert-hook)                ; Disable random functionality.
+     (self-insert-command (prefix-numeric-value arg)))
+   ;; if we are in a literal, or if arg is given do not reindent the
+   ;; current line, unless this star introduces a comment-only line.
+   (if (c-save-buffer-state ()
+        (and c-syntactic-indentation
+             c-electric-flag
+             (not arg)
+             (eq (c-in-literal) 'c)
+             (eq (char-before) ?*)
+             (save-excursion
+               (forward-char -1)
+               (skip-chars-backward "*")
+               (if (eq (char-before) ?/)
+                   (forward-char -1))
+               (skip-chars-backward " \t")
+               (bolp))))
+       (let (c-echo-syntactic-information-p) ; shut this up
+        (indent-according-to-mode))))
   (c--call-post-self-insert-hook-more-safely))
 
 (defun c-electric-semi&comma (arg)
@@ -1039,60 +1051,61 @@ reindented unless `c-syntactic-indentation' is nil.
 semicolon following a defun might be cleaned up, depending on the
 settings of `c-cleanup-list'."
   (interactive "*P")
-  (let* (lim literal c-syntactic-context
-        (here (point))
-        ;; shut this up
-        (c-echo-syntactic-information-p nil))
-
-    (c-save-buffer-state ()
-      (setq lim (c-most-enclosing-brace (c-parse-state))
-           literal (c-in-literal lim)))
-
-    (let (post-self-insert-hook)       ; Disable random functionality.
-      (self-insert-command (prefix-numeric-value arg)))
-
-    (if (and c-electric-flag (not literal) (not arg))
-       ;; do all cleanups and newline insertions if c-auto-newline is on.
-       (if (or (not c-auto-newline)
-               (not (looking-at "[ \t]*\\\\?$")))
-           (if c-syntactic-indentation
-               (c-indent-line))
-         ;; clean ups: list-close-comma or defun-close-semi
-         (let ((pos (- (point-max) (point))))
-           (if (c-save-buffer-state ()
-                 (and (or (and
-                           (eq (c-last-command-char) ?,)
-                           (memq 'list-close-comma c-cleanup-list))
-                          (and
-                           (eq (c-last-command-char) ?\;)
-                           (memq 'defun-close-semi c-cleanup-list)))
-                      (progn
-                        (forward-char -1)
-                        (c-skip-ws-backward)
-                        (eq (char-before) ?}))
-                      ;; make sure matching open brace isn't in a comment
-                      (not (c-in-literal lim))))
-               (delete-region (point) here))
-           (goto-char (- (point-max) pos)))
-         ;; reindent line
-         (when c-syntactic-indentation
-           (setq c-syntactic-context (c-guess-basic-syntax))
-           (c-indent-line c-syntactic-context))
-         ;; check to see if a newline should be added
-         (let ((criteria c-hanging-semi&comma-criteria)
-               answer add-newline-p)
-           (while criteria
-             (setq answer (funcall (car criteria)))
-             ;; only nil value means continue checking
-             (if (not answer)
-                 (setq criteria (cdr criteria))
-               (setq criteria nil)
-               ;; only 'stop specifically says do not add a newline
-               (setq add-newline-p (not (eq answer 'stop)))
-               ))
-           (if add-newline-p
-               (c-newline-and-indent)))))
-    (c--call-post-self-insert-hook-more-safely)))
+  (c-with-string-fences
+   (let* (lim literal c-syntactic-context
+             (here (point))
+             ;; shut this up
+             (c-echo-syntactic-information-p nil))
+
+     (c-save-buffer-state ()
+       (setq lim (c-most-enclosing-brace (c-parse-state))
+            literal (c-in-literal lim)))
+
+     (let (post-self-insert-hook)      ; Disable random functionality.
+       (self-insert-command (prefix-numeric-value arg)))
+
+     (if (and c-electric-flag (not literal) (not arg))
+        ;; do all cleanups and newline insertions if c-auto-newline is on.
+        (if (or (not c-auto-newline)
+                (not (looking-at "[ \t]*\\\\?$")))
+            (if c-syntactic-indentation
+                (c-indent-line))
+          ;; clean ups: list-close-comma or defun-close-semi
+          (let ((pos (- (point-max) (point))))
+            (if (c-save-buffer-state ()
+                  (and (or (and
+                            (eq (c-last-command-char) ?,)
+                            (memq 'list-close-comma c-cleanup-list))
+                           (and
+                            (eq (c-last-command-char) ?\;)
+                            (memq 'defun-close-semi c-cleanup-list)))
+                       (progn
+                         (forward-char -1)
+                         (c-skip-ws-backward)
+                         (eq (char-before) ?}))
+                       ;; make sure matching open brace isn't in a comment
+                       (not (c-in-literal lim))))
+                (delete-region (point) here))
+            (goto-char (- (point-max) pos)))
+          ;; reindent line
+          (when c-syntactic-indentation
+            (setq c-syntactic-context (c-guess-basic-syntax))
+            (c-indent-line c-syntactic-context))
+          ;; check to see if a newline should be added
+          (let ((criteria c-hanging-semi&comma-criteria)
+                answer add-newline-p)
+            (while criteria
+              (setq answer (funcall (car criteria)))
+              ;; only nil value means continue checking
+              (if (not answer)
+                  (setq criteria (cdr criteria))
+                (setq criteria nil)
+                ;; only 'stop specifically says do not add a newline
+                (setq add-newline-p (not (eq answer 'stop)))
+                ))
+            (if add-newline-p
+                (c-newline-and-indent)))))))
+  (c--call-post-self-insert-hook-more-safely))
 
 (defun c-electric-colon (arg)
   "Insert a colon.
@@ -1113,89 +1126,90 @@ reindented unless `c-syntactic-indentation' is nil.
 `c-cleanup-list'."
 
   (interactive "*P")
-  (let* ((bod (c-point 'bod))
-        (literal (c-save-buffer-state () (c-in-literal bod)))
-        newlines is-scope-op
-        ;; shut this up
-        (c-echo-syntactic-information-p nil))
-    (let (post-self-insert-hook)       ; Disable random functionality.
-      (self-insert-command (prefix-numeric-value arg)))
-    ;; Any electric action?
-    (if (and c-electric-flag (not literal) (not arg))
-       ;; Unless we're at EOL, only re-indentation happens.
-       (if (not (looking-at "[ \t]*\\\\?$"))
-           (if c-syntactic-indentation
-               (indent-according-to-mode))
-
-         ;; scope-operator clean-up?
-         (let ((pos (- (point-max) (point)))
-               (here (point)))
-           (if (c-save-buffer-state () ; Why do we need this? [ACM, 2003-03-12]
-                 (and c-auto-newline
-                      (memq 'scope-operator c-cleanup-list)
-                      (eq (char-before) ?:)
-                      (progn
-                        (forward-char -1)
-                        (c-skip-ws-backward)
-                        (eq (char-before) ?:))
-                      (not (c-in-literal))
-                      (not (eq (char-after (- (point) 2)) ?:))))
-               (progn
-                 (delete-region (point) (1- here))
-                 (setq is-scope-op t)))
-           (goto-char (- (point-max) pos)))
-
-         ;; indent the current line if it's done syntactically.
-         (if c-syntactic-indentation
-             ;; Cannot use the same syntax analysis as we find below,
-             ;; since that's made with c-syntactic-indentation-in-macros
-             ;; always set to t.
-             (indent-according-to-mode))
-
-         ;; Calculate where, if anywhere, we want newlines.
-         (c-save-buffer-state
-             ((c-syntactic-indentation-in-macros t)
-              (c-auto-newline-analysis t)
-              ;; Turn on syntactic macro analysis to help with auto newlines
-              ;; only.
-              (syntax (c-guess-basic-syntax))
-              (elem syntax))
-           ;; Translate substatement-label to label for this operation.
-           (while elem
-             (if (eq (car (car elem)) 'substatement-label)
-                 (setcar (car elem) 'label))
-             (setq elem (cdr elem)))
-           ;; some language elements can only be determined by checking
-           ;; the following line.  Let's first look for ones that can be
-           ;; found when looking on the line with the colon
-           (setq newlines
-                 (and c-auto-newline
-                      (or (c-lookup-lists '(case-label label access-label)
-                                          syntax c-hanging-colons-alist)
-                          (c-lookup-lists '(member-init-intro inher-intro)
-                                          (progn
-                                            (insert ?\n)
-                                            (unwind-protect
-                                                (c-guess-basic-syntax)
-                                              (delete-char -1)))
-                                          c-hanging-colons-alist)))))
-         ;; does a newline go before the colon?  Watch out for already
-         ;; non-hung colons.  However, we don't unhang them because that
-         ;; would be a cleanup (and anti-social).
-         (if (and (memq 'before newlines)
-                  (not is-scope-op)
-                  (save-excursion
-                    (skip-chars-backward ": \t")
-                    (not (bolp))))
-             (let ((pos (- (point-max) (point))))
-               (forward-char -1)
-               (c-newline-and-indent)
-               (goto-char (- (point-max) pos))))
-         ;; does a newline go after the colon?
-         (if (and (memq 'after (cdr-safe newlines))
-                  (not is-scope-op))
-             (c-newline-and-indent))))
-    (c--call-post-self-insert-hook-more-safely)))
+  (c-with-string-fences
+   (let* ((bod (c-point 'bod))
+         (literal (c-save-buffer-state () (c-in-literal bod)))
+         newlines is-scope-op
+         ;; shut this up
+         (c-echo-syntactic-information-p nil))
+     (let (post-self-insert-hook)      ; Disable random functionality.
+       (self-insert-command (prefix-numeric-value arg)))
+     ;; Any electric action?
+     (if (and c-electric-flag (not literal) (not arg))
+        ;; Unless we're at EOL, only re-indentation happens.
+        (if (not (looking-at "[ \t]*\\\\?$"))
+            (if c-syntactic-indentation
+                (indent-according-to-mode))
+
+          ;; scope-operator clean-up?
+          (let ((pos (- (point-max) (point)))
+                (here (point)))
+            (if (c-save-buffer-state () ; Why do we need this? [ACM, 
2003-03-12]
+                  (and c-auto-newline
+                       (memq 'scope-operator c-cleanup-list)
+                       (eq (char-before) ?:)
+                       (progn
+                         (forward-char -1)
+                         (c-skip-ws-backward)
+                         (eq (char-before) ?:))
+                       (not (c-in-literal))
+                       (not (eq (char-after (- (point) 2)) ?:))))
+                (progn
+                  (delete-region (point) (1- here))
+                  (setq is-scope-op t)))
+            (goto-char (- (point-max) pos)))
+
+          ;; indent the current line if it's done syntactically.
+          (if c-syntactic-indentation
+              ;; Cannot use the same syntax analysis as we find below,
+              ;; since that's made with c-syntactic-indentation-in-macros
+              ;; always set to t.
+              (indent-according-to-mode))
+
+          ;; Calculate where, if anywhere, we want newlines.
+          (c-save-buffer-state
+              ((c-syntactic-indentation-in-macros t)
+               (c-auto-newline-analysis t)
+               ;; Turn on syntactic macro analysis to help with auto newlines
+               ;; only.
+               (syntax (c-guess-basic-syntax))
+               (elem syntax))
+            ;; Translate substatement-label to label for this operation.
+            (while elem
+              (if (eq (car (car elem)) 'substatement-label)
+                  (setcar (car elem) 'label))
+              (setq elem (cdr elem)))
+            ;; some language elements can only be determined by checking
+            ;; the following line.  Let's first look for ones that can be
+            ;; found when looking on the line with the colon
+            (setq newlines
+                  (and c-auto-newline
+                       (or (c-lookup-lists '(case-label label access-label)
+                                           syntax c-hanging-colons-alist)
+                           (c-lookup-lists '(member-init-intro inher-intro)
+                                           (progn
+                                             (insert ?\n)
+                                             (unwind-protect
+                                                 (c-guess-basic-syntax)
+                                               (delete-char -1)))
+                                           c-hanging-colons-alist)))))
+          ;; does a newline go before the colon?  Watch out for already
+          ;; non-hung colons.  However, we don't unhang them because that
+          ;; would be a cleanup (and anti-social).
+          (if (and (memq 'before newlines)
+                   (not is-scope-op)
+                   (save-excursion
+                     (skip-chars-backward ": \t")
+                     (not (bolp))))
+              (let ((pos (- (point-max) (point))))
+                (forward-char -1)
+                (c-newline-and-indent)
+                (goto-char (- (point-max) pos))))
+          ;; does a newline go after the colon?
+          (if (and (memq 'after (cdr-safe newlines))
+                   (not is-scope-op))
+              (c-newline-and-indent))))))
+  (c--call-post-self-insert-hook-more-safely))
 
 (defun c-electric-lt-gt (arg)
   "Insert a \"<\" or \">\" character.
@@ -1209,74 +1223,75 @@ finishes a C++ style stream operator in C++ mode.  
Exceptions are when a
 numeric argument is supplied, or the point is inside a literal."
 
   (interactive "*P")
-  (let ((literal (c-save-buffer-state () (c-in-literal)))
-       template-delim include-delim
+  (let (template-delim include-delim
        (c-echo-syntactic-information-p nil)
        final-pos found-delim case-fold-search)
 
-    (let (post-self-insert-hook)       ; Disable random functionality.
-      (self-insert-command (prefix-numeric-value arg)))
-    (setq final-pos (point))
+    (c-with-string-fences
+     (let (post-self-insert-hook)      ; Disable random functionality.
+       (self-insert-command (prefix-numeric-value arg)))
+     (setq final-pos (point))
 
 ;;;;  2010-01-31: There used to be code here to put a syntax-table text
 ;;;;  property on the new < or > and its mate (if any) when they are template
 ;;;;  parens.  This is now done in an after-change function.
 
-    (when (and (not arg) (not literal))
-      ;; Have we got a delimiter on a #include directive?
-      (beginning-of-line)
-      (setq include-delim
-           (and
-            (looking-at c-cpp-include-key)
-            (if (eq (c-last-command-char) ?<)
-                (eq (match-end 0) (1- final-pos))
-              (goto-char (1- final-pos))
-              (skip-chars-backward "^<>" (c-point 'bol))
-              (eq (char-before) ?<))))
-      (goto-char final-pos)
-
-      ;; Indent the line if appropriate.
-      (when (and c-electric-flag c-syntactic-indentation 
c-recognize-<>-arglists)
-       (setq found-delim
+     (when (and (not arg)
+               (not (c-save-buffer-state () (c-in-literal))))
+       ;; Have we got a delimiter on a #include directive?
+       (beginning-of-line)
+       (setq include-delim
+            (and
+             (looking-at c-cpp-include-key)
              (if (eq (c-last-command-char) ?<)
-                 ;; If a <, basically see if it's got "template" before it 
.....
-                 (or (and (progn
-                            (backward-char)
-                            (= (point)
-                               (progn (c-beginning-of-current-token) (point))))
-                          (progn
-                            (c-backward-token-2)
-                            (looking-at c-opt-<>-sexp-key))
-                          (setq template-delim t))
-                     ;; ..... or is a C++ << operator.
-                     (and (c-major-mode-is 'c++-mode)
-                          (progn
-                            (goto-char (1- final-pos))
-                            (c-beginning-of-current-token)
-                            (looking-at "<<"))
-                          (>= (match-end 0) final-pos)))
-
-               ;; It's a >.  Either a template/generic terminator ...
-               (or (and (c-get-char-property (1- final-pos) 'syntax-table)
-                        (setq template-delim t))
-                   ;; or a C++ >> operator.
-                   (and (c-major-mode-is 'c++-mode)
-                        (progn
-                          (goto-char (1- final-pos))
-                          (c-beginning-of-current-token)
-                          (looking-at ">>"))
-                        (>= (match-end 0) final-pos)))))
-       (goto-char final-pos)
-
-       (when found-delim
-         (indent-according-to-mode)))
-
-      ;; On the off chance that < and > are configured as pairs in
-      ;; electric-pair-mode.
-      (when (and (boundp 'electric-pair-mode) electric-pair-mode
-                (or template-delim include-delim))
-       (let (post-self-insert-hook)
-         (electric-pair-post-self-insert-function))))
+                 (eq (match-end 0) (1- final-pos))
+               (goto-char (1- final-pos))
+               (skip-chars-backward "^<>" (c-point 'bol))
+               (eq (char-before) ?<))))
+       (goto-char final-pos)
+
+       ;; Indent the line if appropriate.
+       (when (and c-electric-flag c-syntactic-indentation 
c-recognize-<>-arglists)
+        (setq found-delim
+              (if (eq (c-last-command-char) ?<)
+                  ;; If a <, basically see if it's got "template" before it 
.....
+                  (or (and (progn
+                             (backward-char)
+                             (= (point)
+                                (progn (c-beginning-of-current-token) 
(point))))
+                           (progn
+                             (c-backward-token-2)
+                             (looking-at c-opt-<>-sexp-key))
+                           (setq template-delim t))
+                      ;; ..... or is a C++ << operator.
+                      (and (c-major-mode-is 'c++-mode)
+                           (progn
+                             (goto-char (1- final-pos))
+                             (c-beginning-of-current-token)
+                             (looking-at "<<"))
+                           (>= (match-end 0) final-pos)))
+
+                ;; It's a >.  Either a template/generic terminator ...
+                (or (and (c-get-char-property (1- final-pos) 'syntax-table)
+                         (setq template-delim t))
+                    ;; or a C++ >> operator.
+                    (and (c-major-mode-is 'c++-mode)
+                         (progn
+                           (goto-char (1- final-pos))
+                           (c-beginning-of-current-token)
+                           (looking-at ">>"))
+                         (>= (match-end 0) final-pos)))))
+        (goto-char final-pos)
+
+        (when found-delim
+          (indent-according-to-mode)))))
+
+    ;; On the off chance that < and > are configured as pairs in
+    ;; electric-pair-mode.
+    (when (and (boundp 'electric-pair-mode) electric-pair-mode
+              (or template-delim include-delim))
+      (let (post-self-insert-hook)
+       (electric-pair-post-self-insert-function)))
 
     (when found-delim
       (when (and (eq (char-before) ?>)
@@ -1301,12 +1316,13 @@ removed; see the variable `c-cleanup-list'.
 Also, if `c-electric-flag' and `c-auto-newline' are both non-nil, some
 newline cleanups are done if appropriate; see the variable `c-cleanup-list'."
   (interactive "*P")
-  (let ((literal (c-save-buffer-state () (c-in-literal)))
+  (let ((literal (c-save-buffer-state ()
+                  (c-with-string-fences (c-in-literal))))
        ;; shut this up
        (c-echo-syntactic-information-p nil)
        case-fold-search)
     (let (post-self-insert-hook) ; The only way to get defined functionality
-                                ; from `self-insert-command'.
+                                       ; from `self-insert-command'.
       (self-insert-command (prefix-numeric-value arg)))
 
     (if (and (not arg) (not literal))
@@ -1315,46 +1331,47 @@ newline cleanups are done if appropriate; see the 
variable `c-cleanup-list'."
               ;; afterwards.
               (old-blink-paren blink-paren-function)
               blink-paren-function)
-         (if (and c-syntactic-indentation c-electric-flag)
-             (indent-according-to-mode))
-
-         ;; If we're at EOL, check for new-line clean-ups.
-         (when (and c-electric-flag c-auto-newline
-                    (looking-at "[ \t]*\\\\?$"))
-
-           ;; clean up brace-elseif-brace
-           (when
-               (and (memq 'brace-elseif-brace c-cleanup-list)
-                    (eq (c-last-command-char) ?\()
-                    (re-search-backward
-                     (concat "}"
-                             "\\([ \t\n]\\|\\\\\n\\)*"
-                             "else"
-                             "\\([ \t\n]\\|\\\\\n\\)+"
-                             "if"
-                             "\\([ \t\n]\\|\\\\\n\\)*"
-                             "("
-                             "\\=")
-                     nil t)
-                    (not  (c-save-buffer-state () (c-in-literal))))
-             (delete-region (match-beginning 0) (match-end 0))
-             (insert-and-inherit "} else if ("))
-
-           ;; clean up brace-catch-brace
-           (when
-               (and (memq 'brace-catch-brace c-cleanup-list)
-                    (eq (c-last-command-char) ?\()
-                    (re-search-backward
-                     (concat "}"
-                             "\\([ \t\n]\\|\\\\\n\\)*"
-                             "catch"
-                             "\\([ \t\n]\\|\\\\\n\\)*"
-                             "("
-                             "\\=")
-                     nil t)
-                    (not  (c-save-buffer-state () (c-in-literal))))
-             (delete-region (match-beginning 0) (match-end 0))
-             (insert-and-inherit "} catch (")))
+         (c-with-string-fences
+          (if (and c-syntactic-indentation c-electric-flag)
+              (indent-according-to-mode))
+
+          ;; If we're at EOL, check for new-line clean-ups.
+          (when (and c-electric-flag c-auto-newline
+                     (looking-at "[ \t]*\\\\?$"))
+
+            ;; clean up brace-elseif-brace
+            (when
+                (and (memq 'brace-elseif-brace c-cleanup-list)
+                     (eq (c-last-command-char) ?\()
+                     (re-search-backward
+                      (concat "}"
+                              "\\([ \t\n]\\|\\\\\n\\)*"
+                              "else"
+                              "\\([ \t\n]\\|\\\\\n\\)+"
+                              "if"
+                              "\\([ \t\n]\\|\\\\\n\\)*"
+                              "("
+                              "\\=")
+                      nil t)
+                     (not  (c-save-buffer-state () (c-in-literal))))
+              (delete-region (match-beginning 0) (match-end 0))
+              (insert-and-inherit "} else if ("))
+
+            ;; clean up brace-catch-brace
+            (when
+                (and (memq 'brace-catch-brace c-cleanup-list)
+                     (eq (c-last-command-char) ?\()
+                     (re-search-backward
+                      (concat "}"
+                              "\\([ \t\n]\\|\\\\\n\\)*"
+                              "catch"
+                              "\\([ \t\n]\\|\\\\\n\\)*"
+                              "("
+                              "\\=")
+                      nil t)
+                     (not  (c-save-buffer-state () (c-in-literal))))
+              (delete-region (match-beginning 0) (match-end 0))
+              (insert-and-inherit "} catch ("))))
 
          ;; Apply `electric-pair-mode' stuff.
          (when (and (boundp 'electric-pair-mode)
@@ -1362,41 +1379,42 @@ newline cleanups are done if appropriate; see the 
variable `c-cleanup-list'."
            (let (post-self-insert-hook)
              (electric-pair-post-self-insert-function)))
 
-         ;; Check for clean-ups at function calls.  These two DON'T need
-         ;; `c-electric-flag' or `c-syntactic-indentation' set.
-         ;; Point is currently just after the inserted paren.
-         (let (beg (end (1- (point))))
-           (cond
-
-            ;; space-before-funcall clean-up?
-            ((and (memq 'space-before-funcall c-cleanup-list)
-                  (eq (c-last-command-char) ?\()
-                  (save-excursion
-                    (backward-char)
-                    (skip-chars-backward " \t")
-                    (setq beg (point))
-                    (and (c-save-buffer-state () (c-on-identifier))
-                          ;; Don't add a space into #define FOO()....
-                          (not (and (c-beginning-of-macro)
-                                    (c-forward-over-cpp-define-id)
-                                    (eq (point) beg))))))
-             (save-excursion
-               (delete-region beg end)
-               (goto-char beg)
-               (insert ?\ )))
-
-            ;; compact-empty-funcall clean-up?
-            ((c-save-buffer-state ()
-               (and (memq 'compact-empty-funcall c-cleanup-list)
-                    (eq (c-last-command-char) ?\))
-                    (save-excursion
-                      (c-safe (backward-char 2))
-                      (when (looking-at "()")
-                        (setq end (point))
-                        (skip-chars-backward " \t")
-                        (setq beg (point))
-                        (c-on-identifier)))))
-             (delete-region beg end))))
+         (c-with-string-fences
+          ;; Check for clean-ups at function calls.  These two DON'T need
+          ;; `c-electric-flag' or `c-syntactic-indentation' set.
+          ;; Point is currently just after the inserted paren.
+          (let (beg (end (1- (point))))
+            (cond
+
+             ;; space-before-funcall clean-up?
+             ((and (memq 'space-before-funcall c-cleanup-list)
+                   (eq (c-last-command-char) ?\()
+                   (save-excursion
+                     (backward-char)
+                     (skip-chars-backward " \t")
+                     (setq beg (point))
+                     (and (c-save-buffer-state () (c-on-identifier))
+                           ;; Don't add a space into #define FOO()....
+                           (not (and (c-beginning-of-macro)
+                                     (c-forward-over-cpp-define-id)
+                                     (eq (point) beg))))))
+              (save-excursion
+                (delete-region beg end)
+                (goto-char beg)
+                (insert ?\ )))
+
+             ;; compact-empty-funcall clean-up?
+             ((c-save-buffer-state ()
+                (and (memq 'compact-empty-funcall c-cleanup-list)
+                     (eq (c-last-command-char) ?\))
+                     (save-excursion
+                       (c-safe (backward-char 2))
+                       (when (looking-at "()")
+                         (setq end (point))
+                         (skip-chars-backward " \t")
+                         (setq beg (point))
+                         (c-on-identifier)))))
+              (delete-region beg end)))))
          (and (eq last-input-event ?\))
               (not executing-kbd-macro)
               old-blink-paren
@@ -1405,8 +1423,8 @@ newline cleanups are done if appropriate; see the 
variable `c-cleanup-list'."
       ;; Apply `electric-pair-mode' stuff inside a string or comment.
       (when (and (boundp 'electric-pair-mode) electric-pair-mode)
        (let (post-self-insert-hook)
-         (electric-pair-post-self-insert-function))))
-    (c--call-post-self-insert-hook-more-safely)))
+         (electric-pair-post-self-insert-function)))))
+  (c--call-post-self-insert-hook-more-safely))
 
 (defun c-electric-continued-statement ()
   "Reindent the current line if appropriate.
@@ -1868,70 +1886,71 @@ defun."
       (c-region-is-active-p)
       (push-mark))
 
-  (c-save-buffer-state
-      (beginning-of-defun-function
-       end-of-defun-function
-       (paren-state (c-parse-state))
-       (orig-point-min (point-min)) (orig-point-max (point-max))
-       lim                 ; Position of { which has been widened to.
-       where pos case-fold-search)
-
-    (save-restriction
-      (if (eq c-defun-tactic 'go-outward)
-         (setq lim (c-widen-to-enclosing-decl-scope ; e.g. class, namespace.
-                    paren-state orig-point-min orig-point-max)))
-
-      ;; Move back out of any macro/comment/string we happen to be in.
-      (c-beginning-of-macro)
-      (setq pos (c-literal-start))
-      (if pos (goto-char pos))
-
-      (setq where (c-where-wrt-brace-construct))
-
-      (if (< arg 0)
-         ;; Move forward to the closing brace of a function.
-         (progn
-           (if (memq where '(at-function-end outwith-function))
-               (setq arg (1+ arg)))
-           (if (< arg 0)
-               (c-while-widening-to-decl-block
-                (< (setq arg (- (c-forward-to-nth-EOF-\;-or-} (- arg) where))) 
0)))
-           (prog1
-               ;; Move forward to the next opening brace....
-               (when (and (= arg 0)
-                          (progn
-                            (c-while-widening-to-decl-block
-                             (not (c-syntactic-re-search-forward "{" nil 
'eob)))
-                            (eq (char-before) ?{)))
-                 (backward-char)
-                 ;; ... and backward to the function header.
-                 (c-beginning-of-decl-1)
-                 t)
-             (c-keep-region-active)))
-
-       ;; Move backward to the opening brace of a function, making successively
-       ;; larger portions of the buffer visible as necessary.
-       (when (> arg 0)
-         (c-while-widening-to-decl-block
-          (> (setq arg (c-backward-to-nth-BOF-{ arg where)) 0)))
-
-       (when (eq arg 0)
-         ;; Go backward to this function's header.
-         (c-beginning-of-decl-1)
-
-         (setq pos (point))
-         ;; We're now there, modulo comments and whitespace.
-         ;; Try to be line oriented; position point at the closest
-         ;; preceding boi that isn't inside a comment, but if we hit
-         ;; the previous declaration then we use the current point
-         ;; instead.
-         (while (and (/= (point) (c-point 'boi))
-                     (c-backward-single-comment)))
-         (if (/= (point) (c-point 'boi))
-             (goto-char pos)))
-
-       (c-keep-region-active)
-       (= arg 0)))))
+  (c-with-string-fences
+   (c-save-buffer-state
+       (beginning-of-defun-function
+       end-of-defun-function
+       (paren-state (c-parse-state))
+       (orig-point-min (point-min)) (orig-point-max (point-max))
+       lim                 ; Position of { which has been widened to.
+       where pos case-fold-search)
+
+     (save-restriction
+       (if (eq c-defun-tactic 'go-outward)
+          (setq lim (c-widen-to-enclosing-decl-scope ; e.g. class, namespace.
+                     paren-state orig-point-min orig-point-max)))
+
+       ;; Move back out of any macro/comment/string we happen to be in.
+       (c-beginning-of-macro)
+       (setq pos (c-literal-start))
+       (if pos (goto-char pos))
+
+       (setq where (c-where-wrt-brace-construct))
+
+       (if (< arg 0)
+          ;; Move forward to the closing brace of a function.
+          (progn
+            (if (memq where '(at-function-end outwith-function))
+                (setq arg (1+ arg)))
+            (if (< arg 0)
+                (c-while-widening-to-decl-block
+                 (< (setq arg (- (c-forward-to-nth-EOF-\;-or-} (- arg) 
where))) 0)))
+            (prog1
+                ;; Move forward to the next opening brace....
+                (when (and (= arg 0)
+                           (progn
+                             (c-while-widening-to-decl-block
+                              (not (c-syntactic-re-search-forward "{" nil 
'eob)))
+                             (eq (char-before) ?{)))
+                  (backward-char)
+                  ;; ... and backward to the function header.
+                  (c-beginning-of-decl-1)
+                  t)
+              (c-keep-region-active)))
+
+        ;; Move backward to the opening brace of a function, making 
successively
+        ;; larger portions of the buffer visible as necessary.
+        (when (> arg 0)
+          (c-while-widening-to-decl-block
+           (> (setq arg (c-backward-to-nth-BOF-{ arg where)) 0)))
+
+        (when (eq arg 0)
+          ;; Go backward to this function's header.
+          (c-beginning-of-decl-1)
+
+          (setq pos (point))
+          ;; We're now there, modulo comments and whitespace.
+          ;; Try to be line oriented; position point at the closest
+          ;; preceding boi that isn't inside a comment, but if we hit
+          ;; the previous declaration then we use the current point
+          ;; instead.
+          (while (and (/= (point) (c-point 'boi))
+                      (c-backward-single-comment)))
+          (if (/= (point) (c-point 'boi))
+              (goto-char pos)))
+
+        (c-keep-region-active)
+        (= arg 0))))))
 
 (defun c-forward-to-nth-EOF-\;-or-} (n where)
   ;; Skip to the closing brace or semicolon of the Nth function after point.
@@ -1998,65 +2017,66 @@ the open-parenthesis that starts a defun; see 
`beginning-of-defun'."
       (c-region-is-active-p)
       (push-mark))
 
-  (c-save-buffer-state
-      (beginning-of-defun-function
-       end-of-defun-function
-       (paren-state (c-parse-state))
-       (orig-point-min (point-min)) (orig-point-max (point-max))
-       lim
-       where pos case-fold-search)
-
-    (save-restriction
-      (if (eq c-defun-tactic 'go-outward)
-         (setq lim (c-widen-to-enclosing-decl-scope ; e.g. class, namespace
-                    paren-state orig-point-min orig-point-max)))
-
-      ;; Move back out of any macro/comment/string we happen to be in.
-      (c-beginning-of-macro)
-      (setq pos (c-literal-start))
-      (if pos (goto-char pos))
+  (c-with-string-fences
+   (c-save-buffer-state
+       (beginning-of-defun-function
+       end-of-defun-function
+       (paren-state (c-parse-state))
+       (orig-point-min (point-min)) (orig-point-max (point-max))
+       lim
+       where pos case-fold-search)
+
+     (save-restriction
+       (if (eq c-defun-tactic 'go-outward)
+          (setq lim (c-widen-to-enclosing-decl-scope ; e.g. class, namespace
+                     paren-state orig-point-min orig-point-max)))
+
+       ;; Move back out of any macro/comment/string we happen to be in.
+       (c-beginning-of-macro)
+       (setq pos (c-literal-start))
+       (if pos (goto-char pos))
+
+       (setq where (c-where-wrt-brace-construct))
+
+       (if (< arg 0)
+          ;; Move backwards to the } of a function
+          (progn
+            (if (memq where '(at-header outwith-function))
+                (setq arg (1+ arg)))
+            (if (< arg 0)
+                (c-while-widening-to-decl-block
+                 (< (setq arg (- (c-backward-to-nth-BOF-{ (- arg) where))) 0)))
+            (if (= arg 0)
+                (c-while-widening-to-decl-block
+                 (progn (c-syntactic-skip-backward "^}")
+                        (not (eq (char-before) ?}))))))
+
+        ;; Move forward to the } of a function
+        (if (> arg 0)
+            (c-while-widening-to-decl-block
+             (> (setq arg (c-forward-to-nth-EOF-\;-or-} arg where)) 0))))
+
+       ;; Do we need to move forward from the brace to the semicolon?
+       (when (eq arg 0)
+        (if (c-in-function-trailer-p)  ; after "}" of struct/enum, etc.
+            (c-syntactic-re-search-forward ";"))
 
-      (setq where (c-where-wrt-brace-construct))
+        (setq pos (point))
+        ;; We're there now, modulo comments and whitespace.
+        ;; Try to be line oriented; position point after the next
+        ;; newline that isn't inside a comment, but if we hit the
+        ;; next declaration then we use the current point instead.
+        (while (and (not (bolp))
+                    (not (looking-at "\\s *$"))
+                    (c-forward-single-comment)))
+        (cond ((bolp))
+              ((looking-at "\\s *$")
+               (forward-line 1))
+              (t
+               (goto-char pos))))
 
-      (if (< arg 0)
-         ;; Move backwards to the } of a function
-         (progn
-           (if (memq where '(at-header outwith-function))
-               (setq arg (1+ arg)))
-           (if (< arg 0)
-               (c-while-widening-to-decl-block
-                (< (setq arg (- (c-backward-to-nth-BOF-{ (- arg) where))) 0)))
-           (if (= arg 0)
-               (c-while-widening-to-decl-block
-                (progn (c-syntactic-skip-backward "^}")
-                       (not (eq (char-before) ?}))))))
-
-       ;; Move forward to the } of a function
-       (if (> arg 0)
-           (c-while-widening-to-decl-block
-            (> (setq arg (c-forward-to-nth-EOF-\;-or-} arg where)) 0))))
-
-      ;; Do we need to move forward from the brace to the semicolon?
-      (when (eq arg 0)
-       (if (c-in-function-trailer-p)   ; after "}" of struct/enum, etc.
-           (c-syntactic-re-search-forward ";"))
-
-       (setq pos (point))
-       ;; We're there now, modulo comments and whitespace.
-       ;; Try to be line oriented; position point after the next
-       ;; newline that isn't inside a comment, but if we hit the
-       ;; next declaration then we use the current point instead.
-       (while (and (not (bolp))
-                   (not (looking-at "\\s *$"))
-                   (c-forward-single-comment)))
-       (cond ((bolp))
-             ((looking-at "\\s *$")
-              (forward-line 1))
-             (t
-              (goto-char pos))))
-
-      (c-keep-region-active)
-      (= arg 0))))
+       (c-keep-region-active)
+       (= arg 0)))))
 
 (defun c-defun-name-1 ()
   "Return name of current defun, at current narrowing, or nil if there isn't 
one.
@@ -2342,18 +2362,19 @@ with a brace block, at the outermost level of nesting."
   "Display the name of the current CC mode defun and the position in it.
 With a prefix arg, push the name onto the kill ring too."
   (interactive "P")
-  (save-restriction
-    (widen)
-    (c-save-buffer-state ((name-and-limits (c-defun-name-and-limits nil))
-                         (name (car name-and-limits))
-                         (limits (cdr name-and-limits))
-                         (point-bol (c-point 'bol)))
-      (when name
-       (message "%s.  Line %s/%s." name
-                (1+ (count-lines (car limits) (max point-bol (car limits))))
-                (count-lines (car limits) (cdr limits)))
-       (if arg (kill-new name))
-       (sit-for 3 t)))))
+  (c-with-string-fences
+   (save-restriction
+     (widen)
+     (c-save-buffer-state ((name-and-limits (c-defun-name-and-limits nil))
+                          (name (car name-and-limits))
+                          (limits (cdr name-and-limits))
+                          (point-bol (c-point 'bol)))
+       (when name
+        (message "%s.  Line %s/%s." name
+                 (1+ (count-lines (car limits) (max point-bol (car limits))))
+                 (count-lines (car limits) (cdr limits)))
+        (if arg (kill-new name))
+        (sit-for 3 t))))))
 (put 'c-display-defun-name 'isearch-scroll t)
 
 (defun c-mark-function ()
@@ -2369,34 +2390,35 @@ As opposed to \\[c-beginning-of-defun] and 
\\[c-end-of-defun], this
 function does not require the declaration to contain a brace block."
   (interactive)
 
-  (let (decl-limits case-fold-search)
-    (c-save-buffer-state nil
-      ;; We try to be line oriented, unless there are several
-      ;; declarations on the same line.
-      (if (looking-at c-syntactic-eol)
-         (c-backward-token-2 1 nil (c-point 'bol)))
-      (setq decl-limits (c-declaration-limits t)))
-
-    (if (not decl-limits)
-       (error "Cannot find any declaration")
-      (let* ((extend-region-p
-             (and (eq this-command 'c-mark-function)
-                  (eq last-command 'c-mark-function)))
-            (push-mark-p (and (eq this-command 'c-mark-function)
-                              (not extend-region-p)
-                              (not (c-region-is-active-p)))))
-       (if push-mark-p (push-mark))
-       (if extend-region-p
-           (progn
-             (exchange-point-and-mark)
-             (setq decl-limits (c-declaration-limits t))
-             (when (not decl-limits)
-               (exchange-point-and-mark)
-               (error "Cannot find any declaration"))
-             (goto-char (cdr decl-limits))
-             (exchange-point-and-mark))
-         (goto-char (car decl-limits))
-         (push-mark (cdr decl-limits) nil t))))))
+  (c-with-string-fences
+   (let (decl-limits case-fold-search)
+     (c-save-buffer-state nil
+       ;; We try to be line oriented, unless there are several
+       ;; declarations on the same line.
+       (if (looking-at c-syntactic-eol)
+          (c-backward-token-2 1 nil (c-point 'bol)))
+       (setq decl-limits (c-declaration-limits t)))
+
+     (if (not decl-limits)
+        (error "Cannot find any declaration")
+       (let* ((extend-region-p
+              (and (eq this-command 'c-mark-function)
+                   (eq last-command 'c-mark-function)))
+             (push-mark-p (and (eq this-command 'c-mark-function)
+                               (not extend-region-p)
+                               (not (c-region-is-active-p)))))
+        (if push-mark-p (push-mark))
+        (if extend-region-p
+            (progn
+              (exchange-point-and-mark)
+              (setq decl-limits (c-declaration-limits t))
+              (when (not decl-limits)
+                (exchange-point-and-mark)
+                (error "Cannot find any declaration"))
+              (goto-char (cdr decl-limits))
+              (exchange-point-and-mark))
+          (goto-char (car decl-limits))
+          (push-mark (cdr decl-limits) nil t)))))))
 
 (defun c-cpp-define-name ()
   "Return the name of the current CPP macro, or NIL if we're not in one."
@@ -3033,85 +3055,86 @@ be more \"DWIM:ey\"."
                     nil t))
   (if (< count 0)
       (c-end-of-statement (- count) lim sentence-flag)
-    (c-save-buffer-state
-       ((count (or count 1))
-        last ; start point for going back ONE chunk.  Updated each chunk 
movement.
-        (macro-fence
-         (save-excursion (and (not (bobp)) (c-beginning-of-macro) (point))))
-        res                            ; result from sub-function call
-        not-bos                        ; "not beginning-of-statement"
-        (range (c-collect-line-comments (c-literal-limits lim)))) ; 
(start.end) of current literal or NIL
-
-      ;; Go back one statement at each iteration of the following loop.
-      (while (and (/= count 0)
-                 (or (not lim) (> (point) lim)))
-       ;; Go back one "chunk" each time round the following loop, stopping
-       ;; when we reach a statement boundary, etc.
-       (setq last (point))
-       (while
-           (cond ; Each arm of this cond returns NIL on reaching a desired
-                 ; statement boundary, non-NIL otherwise.
-            ((bobp)
-             (setq count 0)
-             nil)
-
-            (range                ; point is within or approaching a literal.
-             (cond
-              ;; Single line string or sentence-flag is null => skip the
-              ;; entire literal.
-              ((or (null sentence-flag)
-                   (c-one-line-string-p range))
-               (goto-char (car range))
-               (setq range (c-ascertain-preceding-literal))
-               ;; N.B. The following is essentially testing for an AWK regexp
-               ;; at BOS:
-               ;; Was the previous non-ws thing an end of statement?
-               (save-excursion
-                 (if macro-fence
-                     (c-backward-comments)
-                   (c-backward-syntactic-ws))
-                 (not (or (bobp) (c-after-statement-terminator-p)))))
-
-              ;; Comment inside a statement or a multi-line string.
-              (t (when (setq res ; returns non-nil when we go out of the 
literal
-                             (if (eq (c-literal-type range) 'string)
-                                 (c-beginning-of-sentence-in-string range)
-                               (c-beginning-of-sentence-in-comment range)))
-                   (setq range (c-ascertain-preceding-literal)))
-                 res)))
-
-            ;; Non-literal code.
-            (t (setq res (c-back-over-illiterals macro-fence))
-               (setq not-bos          ; "not reached beginning-of-statement".
-                     (or (= (point) last)
-                         (memq (char-after) '(?\) ?\}))
-                         (and
-                          (car res)
-                          ;; We're at a tentative BOS.  The next form goes
-                          ;; back over WS looking for an end of previous
-                          ;; statement.
-                          (not (save-excursion
-                                 (if macro-fence
-                                     (c-backward-comments)
-                                   (c-backward-syntactic-ws))
-                                 (or (bobp) 
(c-after-statement-terminator-p)))))))
-               ;; Are we about to move backwards into or out of a
-               ;; preprocessor command?  If so, locate its beginning.
-               (when (eq (cdr res) 'macro-boundary)
-                 (save-excursion
-                   (beginning-of-line)
-                   (setq macro-fence
-                         (and (not (bobp))
-                              (progn (c-skip-ws-backward) 
(c-beginning-of-macro))
-                              (point)))))
-               ;; Are we about to move backwards into a literal?
-               (when (memq (cdr res) '(macro-boundary literal))
-                 (setq range (c-ascertain-preceding-literal)))
-               not-bos))
-         (setq last (point)))
-
-       (if (/= count 0) (setq count (1- count))))
-      (c-keep-region-active))))
+  (c-with-string-fences
+   (c-save-buffer-state
+       ((count (or count 1))
+       last ; start point for going back ONE chunk.  Updated each chunk 
movement.
+       (macro-fence
+        (save-excursion (and (not (bobp)) (c-beginning-of-macro) (point))))
+       res                             ; result from sub-function call
+       not-bos                         ; "not beginning-of-statement"
+       (range (c-collect-line-comments (c-literal-limits lim)))) ; (start.end) 
of current literal or NIL
+
+     ;; Go back one statement at each iteration of the following loop.
+     (while (and (/= count 0)
+                (or (not lim) (> (point) lim)))
+       ;; Go back one "chunk" each time round the following loop, stopping
+       ;; when we reach a statement boundary, etc.
+       (setq last (point))
+       (while
+          (cond     ; Each arm of this cond returns NIL on reaching a desired
+                                       ; statement boundary, non-NIL otherwise.
+           ((bobp)
+            (setq count 0)
+            nil)
+
+           (range                 ; point is within or approaching a literal.
+            (cond
+             ;; Single line string or sentence-flag is null => skip the
+             ;; entire literal.
+             ((or (null sentence-flag)
+                  (c-one-line-string-p range))
+              (goto-char (car range))
+              (setq range (c-ascertain-preceding-literal))
+              ;; N.B. The following is essentially testing for an AWK regexp
+              ;; at BOS:
+              ;; Was the previous non-ws thing an end of statement?
+              (save-excursion
+                (if macro-fence
+                    (c-backward-comments)
+                  (c-backward-syntactic-ws))
+                (not (or (bobp) (c-after-statement-terminator-p)))))
+
+             ;; Comment inside a statement or a multi-line string.
+             (t (when (setq res ; returns non-nil when we go out of the literal
+                            (if (eq (c-literal-type range) 'string)
+                                (c-beginning-of-sentence-in-string range)
+                              (c-beginning-of-sentence-in-comment range)))
+                  (setq range (c-ascertain-preceding-literal)))
+                res)))
+
+           ;; Non-literal code.
+           (t (setq res (c-back-over-illiterals macro-fence))
+              (setq not-bos           ; "not reached beginning-of-statement".
+                    (or (= (point) last)
+                        (memq (char-after) '(?\) ?\}))
+                        (and
+                         (car res)
+                         ;; We're at a tentative BOS.  The next form goes
+                         ;; back over WS looking for an end of previous
+                         ;; statement.
+                         (not (save-excursion
+                                (if macro-fence
+                                    (c-backward-comments)
+                                  (c-backward-syntactic-ws))
+                                (or (bobp) 
(c-after-statement-terminator-p)))))))
+              ;; Are we about to move backwards into or out of a
+              ;; preprocessor command?  If so, locate its beginning.
+              (when (eq (cdr res) 'macro-boundary)
+                (save-excursion
+                  (beginning-of-line)
+                  (setq macro-fence
+                        (and (not (bobp))
+                             (progn (c-skip-ws-backward) 
(c-beginning-of-macro))
+                             (point)))))
+              ;; Are we about to move backwards into a literal?
+              (when (memq (cdr res) '(macro-boundary literal))
+                (setq range (c-ascertain-preceding-literal)))
+              not-bos))
+        (setq last (point)))
+
+       (if (/= count 0) (setq count (1- count))))
+     (c-keep-region-active)))))
 
 (defun c-end-of-statement (&optional count lim sentence-flag)
   "Go to the end of the innermost C statement.
@@ -3129,78 +3152,79 @@ sentence motion in or near comments and multiline 
strings."
   (setq count (or count 1))
   (if (< count 0) (c-beginning-of-statement (- count) lim sentence-flag)
 
-    (c-save-buffer-state
-       (here ; start point for going forward ONE statement.  Updated each 
statement.
-        (macro-fence
-         (save-excursion
-           (and (not (eobp)) (c-beginning-of-macro)
-                (progn (c-end-of-macro) (point)))))
-        res
-        (range (c-collect-line-comments (c-literal-limits lim)))) ; 
(start.end) of current literal or NIL
-
-      ;; Go back/forward one statement at each iteration of the following loop.
-      (while (and (/= count 0)
-                 (or (not lim) (< (point) lim)))
-       (setq here (point))             ; ONLY HERE is HERE updated
-
-       ;; Go forward one "chunk" each time round the following loop, stopping
-       ;; when we reach a statement boundary, etc.
-       (while
-           (cond    ; Each arm of this cond returns NIL on reaching a desired
-                    ; statement boundary, non-NIL otherwise.
-            ((eobp)
-             (setq count 0)
-             nil)
+  (c-with-string-fences
+   (c-save-buffer-state
+       (here ; start point for going forward ONE statement.  Updated each 
statement.
+       (macro-fence
+        (save-excursion
+          (and (not (eobp)) (c-beginning-of-macro)
+               (progn (c-end-of-macro) (point)))))
+       res
+       (range (c-collect-line-comments (c-literal-limits lim)))) ; (start.end) 
of current literal or NIL
+
+     ;; Go back/forward one statement at each iteration of the following loop.
+     (while (and (/= count 0)
+                (or (not lim) (< (point) lim)))
+       (setq here (point))             ; ONLY HERE is HERE updated
+
+       ;; Go forward one "chunk" each time round the following loop, stopping
+       ;; when we reach a statement boundary, etc.
+       (while
+          (cond     ; Each arm of this cond returns NIL on reaching a desired
+                                       ; statement boundary, non-NIL otherwise.
+           ((eobp)
+            (setq count 0)
+            nil)
+
+           (range                      ; point is within a literal.
+            (cond
+             ;; sentence-flag is null => skip the entire literal.
+             ;; or a Single line string.
+             ((or (null sentence-flag)
+                  (c-one-line-string-p range))
+              (goto-char (cdr range))
+              (setq range (c-ascertain-following-literal))
+              ;; Is there a virtual semicolon here (e.g. for AWK)?
+              (not (c-at-vsemi-p)))
+
+             ;; Comment or multi-line string.
+             (t (when (setq res  ; gets non-nil when we go out of the literal
+                            (if (eq (c-literal-type range) 'string)
+                                (c-end-of-sentence-in-string range)
+                              (c-end-of-sentence-in-comment range)))
+                  (setq range (c-ascertain-following-literal)))
+                ;; If we've just come forward out of a literal, check for
+                ;; vsemi.  (N.B. AWK can't have a vsemi after a comment, but
+                ;; some other language may do in the future)
+                (and res
+                     (not (c-at-vsemi-p))))))
+
+           ;; Non-literal code.
+           (t (setq res (c-forward-over-illiterals macro-fence
+                                                   (> (point) here)))
+              ;; Are we about to move forward into or out of a
+              ;; preprocessor command?
+              (when (eq (cdr res) 'macro-boundary)
+                (setq macro-fence
+                      (save-excursion
+                        (if macro-fence
+                            (progn
+                              (end-of-line)
+                              (and (not (eobp))
+                                   (progn (c-skip-ws-forward)
+                                          (c-beginning-of-macro))
+                                   (progn (c-end-of-macro)
+                                          (point))))
+                          (and (not (eobp))
+                               (c-beginning-of-macro)
+                               (progn (c-end-of-macro) (point)))))))
+              ;; Are we about to move forward into a literal?
+              (when (memq (cdr res) '(macro-boundary literal))
+                (setq range (c-ascertain-following-literal)))
+              (car res))))
 
-            (range                     ; point is within a literal.
-             (cond
-              ;; sentence-flag is null => skip the entire literal.
-              ;; or a Single line string.
-              ((or (null sentence-flag)
-                   (c-one-line-string-p range))
-               (goto-char (cdr range))
-               (setq range (c-ascertain-following-literal))
-               ;; Is there a virtual semicolon here (e.g. for AWK)?
-               (not (c-at-vsemi-p)))
-
-              ;; Comment or multi-line string.
-              (t (when (setq res ; gets non-nil when we go out of the literal
-                             (if (eq (c-literal-type range) 'string)
-                                 (c-end-of-sentence-in-string range)
-                               (c-end-of-sentence-in-comment range)))
-                   (setq range (c-ascertain-following-literal)))
-                 ;; If we've just come forward out of a literal, check for
-                 ;; vsemi.  (N.B. AWK can't have a vsemi after a comment, but
-                 ;; some other language may do in the future)
-                 (and res
-                      (not (c-at-vsemi-p))))))
-
-            ;; Non-literal code.
-            (t (setq res (c-forward-over-illiterals macro-fence
-                                                    (> (point) here)))
-               ;; Are we about to move forward into or out of a
-               ;; preprocessor command?
-               (when (eq (cdr res) 'macro-boundary)
-                 (setq macro-fence
-                       (save-excursion
-                         (if macro-fence
-                             (progn
-                               (end-of-line)
-                               (and (not (eobp))
-                                    (progn (c-skip-ws-forward)
-                                           (c-beginning-of-macro))
-                                    (progn (c-end-of-macro)
-                                           (point))))
-                           (and (not (eobp))
-                                (c-beginning-of-macro)
-                                (progn (c-end-of-macro) (point)))))))
-               ;; Are we about to move forward into a literal?
-               (when (memq (cdr res) '(macro-boundary literal))
-                 (setq range (c-ascertain-following-literal)))
-               (car res))))
-
-       (if (/= count 0) (setq count (1- count))))
-      (c-keep-region-active))))
+       (if (/= count 0) (setq count (1- count))))
+     (c-keep-region-active)))))
 
 
 ;; set up electric character functions to work with pending-del,
@@ -3539,122 +3563,125 @@ prefix argument is equivalent to -1.
   depending on the variable `indent-tabs-mode'."
 
   (interactive "P")
-  (let ((indent-function
-        (if c-syntactic-indentation
-            (symbol-function 'indent-according-to-mode)
-          (lambda ()
-            (let ((c-macro-start c-macro-start)
-                  (steps (if (equal arg '(4))
-                             -1
-                           (prefix-numeric-value arg))))
-              (c-shift-line-indentation (* steps c-basic-offset))
-              (when (and c-auto-align-backslashes
-                         (save-excursion
-                           (end-of-line)
-                           (eq (char-before) ?\\))
-                         (c-query-and-set-macro-start))
-                ;; Realign the line continuation backslash if inside a macro.
-                (c-backslash-region (point) (point) nil t)))
-            ))))
-    (if (and c-syntactic-indentation arg)
-       ;; If c-syntactic-indentation and got arg, always indent this
-       ;; line as C and shift remaining lines of expression the same
-       ;; amount.
-       (let ((shift-amt (save-excursion
-                          (back-to-indentation)
-                          (current-column)))
-             beg end)
-         (c-indent-line)
-         (setq shift-amt (- (save-excursion
-                              (back-to-indentation)
-                              (current-column))
-                            shift-amt))
-         (save-excursion
-           (if (eq c-tab-always-indent t)
-               (beginning-of-line))    ; FIXME!!! What is this here for?  ACM 
2005/10/31
-           (setq beg (point))
-           (c-forward-sexp 1)
-           (setq end (point))
-           (goto-char beg)
-           (forward-line 1)
-           (setq beg (point)))
-         (if (> end beg)
-             (indent-code-rigidly beg end shift-amt "#")))
-      ;; Else use c-tab-always-indent to determine behavior.
-      (cond
-       ;; CASE 1: indent when at column zero or in line's indentation,
-       ;; otherwise insert a tab
-       ((not c-tab-always-indent)
-       (if (save-excursion
-             (skip-chars-backward " \t")
-             (not (bolp)))
-           (funcall c-insert-tab-function)
-         (funcall indent-function)))
-       ;; CASE 2: just indent the line
-       ((eq c-tab-always-indent t)
-       (funcall indent-function))
-       ;; CASE 3: if in a literal, insert a tab, but always indent the
-       ;; line
-       (t
-       (if (c-save-buffer-state () (c-in-literal))
-           (funcall c-insert-tab-function))
-       (funcall indent-function)
-       )))))
+  (c-with-string-fences
+   (let ((indent-function
+         (if c-syntactic-indentation
+             (symbol-function 'indent-according-to-mode)
+           (lambda ()
+             (let ((c-macro-start c-macro-start)
+                   (steps (if (equal arg '(4))
+                              -1
+                            (prefix-numeric-value arg))))
+               (c-shift-line-indentation (* steps c-basic-offset))
+               (when (and c-auto-align-backslashes
+                          (save-excursion
+                            (end-of-line)
+                            (eq (char-before) ?\\))
+                          (c-query-and-set-macro-start))
+                 ;; Realign the line continuation backslash if inside a macro.
+                 (c-backslash-region (point) (point) nil t)))
+             ))))
+     (if (and c-syntactic-indentation arg)
+        ;; If c-syntactic-indentation and got arg, always indent this
+        ;; line as C and shift remaining lines of expression the same
+        ;; amount.
+        (let ((shift-amt (save-excursion
+                           (back-to-indentation)
+                           (current-column)))
+              beg end)
+          (c-indent-line)
+          (setq shift-amt (- (save-excursion
+                               (back-to-indentation)
+                               (current-column))
+                             shift-amt))
+          (save-excursion
+            (if (eq c-tab-always-indent t)
+                (beginning-of-line)) ; FIXME!!! What is this here for?  ACM 
2005/10/31
+            (setq beg (point))
+            (c-forward-sexp 1)
+            (setq end (point))
+            (goto-char beg)
+            (forward-line 1)
+            (setq beg (point)))
+          (if (> end beg)
+              (indent-code-rigidly beg end shift-amt "#")))
+       ;; Else use c-tab-always-indent to determine behavior.
+       (cond
+       ;; CASE 1: indent when at column zero or in line's indentation,
+       ;; otherwise insert a tab
+       ((not c-tab-always-indent)
+        (if (save-excursion
+              (skip-chars-backward " \t")
+              (not (bolp)))
+            (funcall c-insert-tab-function)
+          (funcall indent-function)))
+       ;; CASE 2: just indent the line
+       ((eq c-tab-always-indent t)
+        (funcall indent-function))
+       ;; CASE 3: if in a literal, insert a tab, but always indent the
+       ;; line
+       (t
+        (if (c-save-buffer-state () (c-in-literal))
+            (funcall c-insert-tab-function))
+        (funcall indent-function)
+        ))))))
 
 (defun c-indent-exp (&optional shutup-p)
   "Indent each line in the balanced expression following point syntactically.
 If optional SHUTUP-P is non-nil, no errors are signaled if no
 balanced expression is found."
   (interactive "*P")
-  (let ((here (point-marker))
-       end)
-    (set-marker-insertion-type here t)
-    (unwind-protect
-       (let ((start (save-restriction
-                      ;; Find the closest following open paren that
-                      ;; ends on another line.
-                      (narrow-to-region (point-min) (c-point 'eol))
-                      (let (beg (end (point)))
-                        (while (and (setq beg (c-down-list-forward end))
-                                    (setq end (c-up-list-forward beg))))
-                        (and beg
-                             (eq (char-syntax (char-before beg)) ?\()
-                             (1- beg))))))
-         ;; sanity check
-         (if (not start)
-            (unless shutup-p
-              (error "Cannot find start of balanced expression to indent"))
-           (goto-char start)
-           (setq end (c-safe (scan-sexps (point) 1)))
-           (if (not end)
-               (unless shutup-p
-                 (error "Cannot find end of balanced expression to indent"))
-             (forward-line)
-             (if (< (point) end)
-                 (c-indent-region (point) end)))))
-      (goto-char here)
-      (set-marker here nil))))
+  (c-with-string-fences
+   (let ((here (point-marker))
+        end)
+     (set-marker-insertion-type here t)
+     (unwind-protect
+        (let ((start (save-restriction
+                       ;; Find the closest following open paren that
+                       ;; ends on another line.
+                       (narrow-to-region (point-min) (c-point 'eol))
+                       (let (beg (end (point)))
+                         (while (and (setq beg (c-down-list-forward end))
+                                     (setq end (c-up-list-forward beg))))
+                         (and beg
+                              (eq (char-syntax (char-before beg)) ?\()
+                              (1- beg))))))
+          ;; sanity check
+          (if (not start)
+              (unless shutup-p
+                (error "Cannot find start of balanced expression to indent"))
+            (goto-char start)
+            (setq end (c-safe (scan-sexps (point) 1)))
+            (if (not end)
+                (unless shutup-p
+                  (error "Cannot find end of balanced expression to indent"))
+              (forward-line)
+              (if (< (point) end)
+                  (c-indent-region (point) end)))))
+       (goto-char here)
+       (set-marker here nil)))))
 
 (defun c-indent-defun ()
   "Indent the current top-level declaration or macro syntactically.
 In the macro case this also has the effect of realigning any line
 continuation backslashes, unless `c-auto-align-backslashes' is nil."
   (interactive "*")
-  (let ((here (point-marker)) decl-limits case-fold-search)
-    (unwind-protect
-       (progn
-         (c-save-buffer-state nil
-           ;; We try to be line oriented, unless there are several
-           ;; declarations on the same line.
-           (if (looking-at c-syntactic-eol)
-               (c-backward-token-2 1 nil (c-point 'bol))
-             (c-forward-token-2 0 nil (c-point 'eol)))
-           (setq decl-limits (c-declaration-limits nil)))
-         (if decl-limits
-             (c-indent-region (car decl-limits)
-                              (cdr decl-limits))))
-      (goto-char here)
-      (set-marker here nil))))
+  (c-with-string-fences
+   (let ((here (point-marker)) decl-limits case-fold-search)
+     (unwind-protect
+        (progn
+          (c-save-buffer-state nil
+            ;; We try to be line oriented, unless there are several
+            ;; declarations on the same line.
+            (if (looking-at c-syntactic-eol)
+                (c-backward-token-2 1 nil (c-point 'bol))
+              (c-forward-token-2 0 nil (c-point 'eol)))
+            (setq decl-limits (c-declaration-limits nil)))
+          (if decl-limits
+              (c-indent-region (car decl-limits)
+                               (cdr decl-limits))))
+       (goto-char here)
+       (set-marker here nil)))))
 
 (defun c-indent-region (start end &optional quiet)
   "Indent syntactically lines whose first char is between START and END 
inclusive.
@@ -3734,9 +3761,10 @@ starting on the current line.
 Otherwise reindent just the current line."
   (interactive
    (list current-prefix-arg (c-region-is-active-p)))
-  (if region
-      (c-indent-region (region-beginning) (region-end))
-    (c-indent-command arg)))
+  (c-with-string-fences
+   (if region
+       (c-indent-region (region-beginning) (region-end))
+     (c-indent-command arg))))
 
 ;; for progress reporting
 (defvar c-progress-info nil)
@@ -4823,15 +4851,16 @@ If point is in any other situation, i.e. in normal 
code, do nothing.
 
 Optional prefix ARG means justify paragraph as well."
   (interactive "*P")
-  (let ((fill-paragraph-function
-        ;; Avoid infinite recursion.
-        (if (not (eq fill-paragraph-function 'c-fill-paragraph))
-            fill-paragraph-function)))
-    (c-mask-paragraph t nil 'fill-paragraph arg))
-  ;; Always return t.  This has the effect that if filling isn't done
-  ;; above, it isn't done at all, and it's therefore effectively
-  ;; disabled in normal code.
-  t)
+  (c-with-string-fences
+   (let ((fill-paragraph-function
+         ;; Avoid infinite recursion.
+         (if (not (eq fill-paragraph-function 'c-fill-paragraph))
+             fill-paragraph-function)))
+     (c-mask-paragraph t nil 'fill-paragraph arg))
+   ;; Always return t.  This has the effect that if filling isn't done
+   ;; above, it isn't done at all, and it's therefore effectively
+   ;; disabled in normal code.
+   t))
 
 (defun c-do-auto-fill ()
   ;; Do automatic filling if not inside a context where it should be
@@ -4863,165 +4892,166 @@ If a fill prefix is specified, it overrides all the 
above."
   ;; used from auto-fill itself, that's normally disabled to avoid
   ;; unnecessary recursion.
   (interactive)
-  (let ((fill-prefix fill-prefix)
-       (do-line-break
-        (lambda ()
-          (delete-horizontal-space)
-          (if soft
-              (insert-and-inherit ?\n)
-            (newline (if allow-auto-fill nil 1)))))
-       ;; Already know the literal type and limits when called from
-       ;; c-context-line-break.
-       (c-lit-limits c-lit-limits)
-       (c-lit-type c-lit-type)
-       (c-macro-start c-macro-start))
-
-    (c-save-buffer-state ()
-      (when (not (eq c-auto-fill-prefix t))
-       ;; Called from do-auto-fill.
-       (unless c-lit-limits
-         (setq c-lit-limits (c-literal-limits nil nil t)))
-       (unless c-lit-type
-         (setq c-lit-type (c-literal-type c-lit-limits)))
-       (if (memq (cond ((c-query-and-set-macro-start) 'cpp)
-                       ((null c-lit-type) 'code)
-                       (t c-lit-type))
-                 c-ignore-auto-fill)
-           (setq fill-prefix t)        ; Used as flag in the cond.
-         (if (and (null c-auto-fill-prefix)
-                  (eq c-lit-type 'c)
-                  (<= (c-point 'bol) (car c-lit-limits)))
-             ;; The adaptive fill function has generated a prefix, but
-             ;; we're on the first line in a block comment so it'll be
-             ;; wrong.  Ignore it to guess a better one below.
-             (setq fill-prefix nil)
-           (when (and (eq c-lit-type 'c++)
-                      (not (string-match (concat "\\`[ \t]*"
-                                                 c-line-comment-starter)
-                                         (or fill-prefix ""))))
-             ;; Kludge: If the function that adapted the fill prefix
-             ;; doesn't produce the required comment starter for line
-             ;; comments, then we ignore it.
-             (setq fill-prefix nil)))
-         )))
-
-    (cond ((eq fill-prefix t)
-          ;; A call from do-auto-fill which should be ignored.
-          )
-         (fill-prefix
-          ;; A fill-prefix overrides anything.
-          (funcall do-line-break)
-          (insert-and-inherit fill-prefix))
-         ((c-save-buffer-state ()
-            (unless c-lit-limits
-              (setq c-lit-limits (c-literal-limits)))
-            (unless c-lit-type
-              (setq c-lit-type (c-literal-type c-lit-limits)))
-            (memq c-lit-type '(c c++)))
-          ;; Some sort of comment.
-          (if (or comment-multi-line
-                  (save-excursion
-                    (goto-char (car c-lit-limits))
-                    (end-of-line)
-                    (< (point) (cdr c-lit-limits))))
-              ;; Inside a comment that should be continued.
-              (let ((fill (c-save-buffer-state nil
-                            (c-guess-fill-prefix
-                             (setq c-lit-limits
-                                   (c-collect-line-comments c-lit-limits))
-                             c-lit-type)))
-                    (pos (point))
-                    (comment-text-end
-                     (or (and (eq c-lit-type 'c)
-                              (save-excursion
-                                (goto-char (- (cdr c-lit-limits) 2))
-                                (if (looking-at "\\*/") (point))))
-                         (cdr c-lit-limits))))
-                ;; Skip forward past the fill prefix in case
-                ;; we're standing in it.
-                ;;
-                ;; FIXME: This doesn't work well in cases like
-                ;;
-                ;; /* Bla bla bla bla bla
-                ;;         bla bla
-                ;;
-                ;; If point is on the 'B' then the line will be
-                ;; broken after "Bla b".
-                ;;
-                ;; If we have an empty comment, /*   */, the next
-                ;; lot of code pushes point to the */.  We fix
-                ;; this by never allowing point to end up to the
-                ;; right of where it started.
-                (while (and (< (current-column) (cdr fill))
-                            (not (eolp)))
-                  (forward-char 1))
-                (if (and (> (point) comment-text-end)
-                         (> (c-point 'bol) (car c-lit-limits)))
-                    (progn
-                      ;; The skip takes us out of the (block)
-                      ;; comment; insert the fill prefix at bol
-                      ;; instead and keep the position.
-                      (setq pos (copy-marker pos t))
-                      (beginning-of-line)
-                      (insert-and-inherit (car fill))
-                      (if soft (insert-and-inherit ?\n) (newline 1))
-                      (goto-char pos)
-                      (set-marker pos nil))
-                  ;; Don't break in the middle of a comment starter
-                  ;; or ender.
-                  (cond ((> (point) comment-text-end)
-                         (goto-char comment-text-end))
-                        ((< (point) (+ (car c-lit-limits) 2))
-                         (goto-char (+ (car c-lit-limits) 2))))
-                  (funcall do-line-break)
-                  (insert-and-inherit (car fill))
-                  (if (and (looking-at c-block-comment-ender-regexp)
-                           (memq (char-before) '(?\  ?\t)))
-                      (backward-char)))) ; can this hit the
-                                         ; middle of a TAB?
-            ;; Inside a comment that should be broken.
-            (let ((comment-start comment-start)
-                  (comment-end comment-end)
-                  col)
-              (if (eq c-lit-type 'c)
-                  (unless (string-match "[ \t]*/\\*" comment-start)
-                    (setq comment-start "/* " comment-end " */"))
-                (unless (string-match "[ \t]*//" comment-start)
-                  (setq comment-start "// " comment-end "")))
-              (setq col (save-excursion
-                          (back-to-indentation)
-                          (current-column)))
-              (funcall do-line-break)
-              (when (and comment-end (not (equal comment-end "")))
-                (forward-char -1)
-                (insert-and-inherit comment-end)
-                (forward-char 1))
-              ;; c-comment-indent may look at the current
-              ;; indentation, so let's start out with the same
-              ;; indentation as the previous one.
-              (indent-to col)
-              (insert-and-inherit comment-start)
-              (indent-for-comment))))
-         ((c-query-and-set-macro-start)
-          ;; In a macro.
-          (unless (looking-at "[ \t]*\\\\$")
-            ;; Do not clobber the alignment of the line continuation
-            ;; slash; c-backslash-region might look at it.
-            (delete-horizontal-space))
-          ;; Got an asymmetry here: In normal code this command
-          ;; doesn't indent the next line syntactically, and otoh a
-          ;; normal syntactically indenting newline doesn't continue
-          ;; the macro.
-          (c-newline-and-indent (if allow-auto-fill nil 1)))
-         (t
-          ;; Somewhere else in the code.
-          (let ((col (save-excursion
+  (c-with-string-fences
+   (let ((fill-prefix fill-prefix)
+        (do-line-break
+         (lambda ()
+           (delete-horizontal-space)
+           (if soft
+               (insert-and-inherit ?\n)
+             (newline (if allow-auto-fill nil 1)))))
+        ;; Already know the literal type and limits when called from
+        ;; c-context-line-break.
+        (c-lit-limits c-lit-limits)
+        (c-lit-type c-lit-type)
+        (c-macro-start c-macro-start))
+
+     (c-save-buffer-state ()
+       (when (not (eq c-auto-fill-prefix t))
+        ;; Called from do-auto-fill.
+        (unless c-lit-limits
+          (setq c-lit-limits (c-literal-limits nil nil t)))
+        (unless c-lit-type
+          (setq c-lit-type (c-literal-type c-lit-limits)))
+        (if (memq (cond ((c-query-and-set-macro-start) 'cpp)
+                        ((null c-lit-type) 'code)
+                        (t c-lit-type))
+                  c-ignore-auto-fill)
+            (setq fill-prefix t)       ; Used as flag in the cond.
+          (if (and (null c-auto-fill-prefix)
+                   (eq c-lit-type 'c)
+                   (<= (c-point 'bol) (car c-lit-limits)))
+              ;; The adaptive fill function has generated a prefix, but
+              ;; we're on the first line in a block comment so it'll be
+              ;; wrong.  Ignore it to guess a better one below.
+              (setq fill-prefix nil)
+            (when (and (eq c-lit-type 'c++)
+                       (not (string-match (concat "\\`[ \t]*"
+                                                  c-line-comment-starter)
+                                          (or fill-prefix ""))))
+              ;; Kludge: If the function that adapted the fill prefix
+              ;; doesn't produce the required comment starter for line
+              ;; comments, then we ignore it.
+              (setq fill-prefix nil)))
+          )))
+
+     (cond ((eq fill-prefix t)
+           ;; A call from do-auto-fill which should be ignored.
+           )
+          (fill-prefix
+           ;; A fill-prefix overrides anything.
+           (funcall do-line-break)
+           (insert-and-inherit fill-prefix))
+          ((c-save-buffer-state ()
+             (unless c-lit-limits
+               (setq c-lit-limits (c-literal-limits)))
+             (unless c-lit-type
+               (setq c-lit-type (c-literal-type c-lit-limits)))
+             (memq c-lit-type '(c c++)))
+           ;; Some sort of comment.
+           (if (or comment-multi-line
+                   (save-excursion
+                     (goto-char (car c-lit-limits))
+                     (end-of-line)
+                     (< (point) (cdr c-lit-limits))))
+               ;; Inside a comment that should be continued.
+               (let ((fill (c-save-buffer-state nil
+                             (c-guess-fill-prefix
+                              (setq c-lit-limits
+                                    (c-collect-line-comments c-lit-limits))
+                              c-lit-type)))
+                     (pos (point))
+                     (comment-text-end
+                      (or (and (eq c-lit-type 'c)
+                               (save-excursion
+                                 (goto-char (- (cdr c-lit-limits) 2))
+                                 (if (looking-at "\\*/") (point))))
+                          (cdr c-lit-limits))))
+                 ;; Skip forward past the fill prefix in case
+                 ;; we're standing in it.
+                 ;;
+                 ;; FIXME: This doesn't work well in cases like
+                 ;;
+                 ;; /* Bla bla bla bla bla
+                 ;;         bla bla
+                 ;;
+                 ;; If point is on the 'B' then the line will be
+                 ;; broken after "Bla b".
+                 ;;
+                 ;; If we have an empty comment, /*   */, the next
+                 ;; lot of code pushes point to the */.  We fix
+                 ;; this by never allowing point to end up to the
+                 ;; right of where it started.
+                 (while (and (< (current-column) (cdr fill))
+                             (not (eolp)))
+                   (forward-char 1))
+                 (if (and (> (point) comment-text-end)
+                          (> (c-point 'bol) (car c-lit-limits)))
+                     (progn
+                       ;; The skip takes us out of the (block)
+                       ;; comment; insert the fill prefix at bol
+                       ;; instead and keep the position.
+                       (setq pos (copy-marker pos t))
                        (beginning-of-line)
-                       (while (and (looking-at "[ \t]*\\\\?$")
-                                   (= (forward-line -1) 0)))
-                       (current-indentation))))
-            (funcall do-line-break)
-            (indent-to col))))))
+                       (insert-and-inherit (car fill))
+                       (if soft (insert-and-inherit ?\n) (newline 1))
+                       (goto-char pos)
+                       (set-marker pos nil))
+                   ;; Don't break in the middle of a comment starter
+                   ;; or ender.
+                   (cond ((> (point) comment-text-end)
+                          (goto-char comment-text-end))
+                         ((< (point) (+ (car c-lit-limits) 2))
+                          (goto-char (+ (car c-lit-limits) 2))))
+                   (funcall do-line-break)
+                   (insert-and-inherit (car fill))
+                   (if (and (looking-at c-block-comment-ender-regexp)
+                            (memq (char-before) '(?\  ?\t)))
+                       (backward-char)))) ; can this hit the
+                                       ; middle of a TAB?
+             ;; Inside a comment that should be broken.
+             (let ((comment-start comment-start)
+                   (comment-end comment-end)
+                   col)
+               (if (eq c-lit-type 'c)
+                   (unless (string-match "[ \t]*/\\*" comment-start)
+                     (setq comment-start "/* " comment-end " */"))
+                 (unless (string-match "[ \t]*//" comment-start)
+                   (setq comment-start "// " comment-end "")))
+               (setq col (save-excursion
+                           (back-to-indentation)
+                           (current-column)))
+               (funcall do-line-break)
+               (when (and comment-end (not (equal comment-end "")))
+                 (forward-char -1)
+                 (insert-and-inherit comment-end)
+                 (forward-char 1))
+               ;; c-comment-indent may look at the current
+               ;; indentation, so let's start out with the same
+               ;; indentation as the previous one.
+               (indent-to col)
+               (insert-and-inherit comment-start)
+               (indent-for-comment))))
+          ((c-query-and-set-macro-start)
+           ;; In a macro.
+           (unless (looking-at "[ \t]*\\\\$")
+             ;; Do not clobber the alignment of the line continuation
+             ;; slash; c-backslash-region might look at it.
+             (delete-horizontal-space))
+           ;; Got an asymmetry here: In normal code this command
+           ;; doesn't indent the next line syntactically, and otoh a
+           ;; normal syntactically indenting newline doesn't continue
+           ;; the macro.
+           (c-newline-and-indent (if allow-auto-fill nil 1)))
+          (t
+           ;; Somewhere else in the code.
+           (let ((col (save-excursion
+                        (beginning-of-line)
+                        (while (and (looking-at "[ \t]*\\\\?$")
+                                    (= (forward-line -1) 0)))
+                        (current-indentation))))
+             (funcall do-line-break)
+             (indent-to col)))))))
 
 (defalias 'c-comment-line-break-function 'c-indent-new-comment-line)
 (make-obsolete 'c-comment-line-break-function 'c-indent-new-comment-line 
"21.1")
@@ -5048,58 +5078,59 @@ When point is inside a string, only insert a backslash 
when it is also
 inside a preprocessor directive."
 
   (interactive "*")
-  (let* (c-lit-limits c-lit-type
-        (c-macro-start c-macro-start)
-        case-fold-search)
-
-    (c-save-buffer-state ()
-      (setq c-lit-limits (c-literal-limits nil nil t)
-           c-lit-type (c-literal-type c-lit-limits))
-      (when (eq c-lit-type 'c++)
-       (setq c-lit-limits (c-collect-line-comments c-lit-limits)))
-      (c-query-and-set-macro-start))
-
-    (cond
-     ((or (eq c-lit-type 'c)
-         (and (eq c-lit-type 'c++) ; C++ comment, but not at the very end of 
it.
-              (< (save-excursion
-                   (skip-chars-forward " \t")
-                   (point))
-                 (1- (cdr c-lit-limits))))
-         (and (numberp c-macro-start)  ; Macro, but not at the very end of
+  (c-with-string-fences
+   (let* (c-lit-limits c-lit-type
+                      (c-macro-start c-macro-start)
+                      case-fold-search)
+
+     (c-save-buffer-state ()
+       (setq c-lit-limits (c-literal-limits nil nil t)
+            c-lit-type (c-literal-type c-lit-limits))
+       (when (eq c-lit-type 'c++)
+        (setq c-lit-limits (c-collect-line-comments c-lit-limits)))
+       (c-query-and-set-macro-start))
+
+     (cond
+      ((or (eq c-lit-type 'c)
+          (and (eq c-lit-type 'c++) ; C++ comment, but not at the very end of 
it.
+               (< (save-excursion
+                    (skip-chars-forward " \t")
+                    (point))
+                  (1- (cdr c-lit-limits))))
+          (and (numberp c-macro-start) ; Macro, but not at the very end of
                                        ; it, not in a string, and not in the
                                        ; cpp keyword.
-              (not (eq c-lit-type 'string))
-              (or (not (looking-at "\\s *$"))
-                  (eq (char-before) ?\\))
-              (<= (save-excursion
-                    (goto-char c-macro-start)
-                    (if (looking-at c-opt-cpp-start)
-                        (goto-char (match-end 0)))
-                    (point))
-                  (point))))
-      (let ((comment-multi-line t)
-           (fill-prefix nil))
-       (c-indent-new-comment-line nil t)))
-
-     ((eq c-lit-type 'string)
-      (if (and (numberp c-macro-start)
-              (not (eq (char-before) ?\\)))
-         (insert ?\\))
-      (newline))
-
-     (t (delete-horizontal-space)
-       (newline)
-      ;; c-indent-line may look at the current indentation, so let's
-      ;; start out with the same indentation as the previous line.
-       (let ((col (save-excursion
-                    (backward-char)
-                    (forward-line 0)
-                    (while (and (looking-at "[ \t]*\\\\?$")
-                                (= (forward-line -1) 0)))
-                    (current-indentation))))
-         (indent-to col))
-     (indent-according-to-mode)))))
+               (not (eq c-lit-type 'string))
+               (or (not (looking-at "\\s *$"))
+                   (eq (char-before) ?\\))
+               (<= (save-excursion
+                     (goto-char c-macro-start)
+                     (if (looking-at c-opt-cpp-start)
+                         (goto-char (match-end 0)))
+                     (point))
+                   (point))))
+       (let ((comment-multi-line t)
+            (fill-prefix nil))
+        (c-indent-new-comment-line nil t)))
+
+      ((eq c-lit-type 'string)
+       (if (and (numberp c-macro-start)
+               (not (eq (char-before) ?\\)))
+          (insert ?\\))
+       (newline))
+
+      (t (delete-horizontal-space)
+        (newline)
+        ;; c-indent-line may look at the current indentation, so let's
+        ;; start out with the same indentation as the previous line.
+        (let ((col (save-excursion
+                     (backward-char)
+                     (forward-line 0)
+                     (while (and (looking-at "[ \t]*\\\\?$")
+                                 (= (forward-line -1) 0)))
+                     (current-indentation))))
+          (indent-to col))
+        (indent-according-to-mode))))))
 
 (defun c-context-open-line ()
   "Insert a line break suitable to the context and leave point before it.
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el
index a127024355..9edaf46534 100644
--- a/lisp/progmodes/cc-defs.el
+++ b/lisp/progmodes/cc-defs.el
@@ -1563,6 +1563,28 @@ with value CHAR in the region [FROM to)."
         (forward-char)))))
 
 
+;; Miscellaneous macro(s)
+(defvar c-string-fences-set-flag nil)
+;; Non-nil when we have set string fences with `c-restore-string-fences'.
+(defmacro c-with-string-fences (&rest forms)
+  ;; Restore the string fences, evaluate FORMS, then remove them again.  It
+  ;; should only be used at the top level of "boundary" functions in CC Mode,
+  ;; i.e. those called from outside CC Mode which directly or indirectly need
+  ;; unbalanced string markers to have their string-fence syntax-table text
+  ;; properties.  This includes all calls to `c-parse-state'.  This macro will
+  ;; be invoked recursively; however the `c-string-fences-set-flag' mechanism
+  ;; should ensure consistency, when this happens.
+  (declare (debug t))
+  `(unwind-protect
+       (progn
+        (unless c-string-fences-set-flag
+          (c-restore-string-fences))
+        (let ((c-string-fences-set-flag t))
+          ,@forms))
+     (unless c-string-fences-set-flag
+       (c-clear-string-fences))))
+
+
 ;; Macros to put overlays (Emacs) or extents (XEmacs) on buffer text.
 ;; For our purposes, these are characterized by being possible to
 ;; remove again without affecting the other text properties in the
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index b2fa9e0691..8794a527f8 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -3422,7 +3422,9 @@ initializing CC Mode.  Currently (2020-06) these are 
`js-mode' and
   ;; Return a good pos (in the sense of `c-state-cache-good-pos') at the
   ;; lowest[*] position between POS and HERE which is syntactically equivalent
   ;; to HERE.  This position may be HERE itself.  POS is before HERE in the
-  ;; buffer.
+  ;; buffer.  If POS and HERE are both in the same literal, return the start
+  ;; of the literal.  STATE is the parsing state at POS.
+  ;;
   ;; [*] We don't actually always determine this exact position, since this
   ;; would require a disproportionate amount of work, given that this function
   ;; deals only with a corner condition, and POS and HERE are typically on
@@ -3438,7 +3440,7 @@ initializing CC Mode.  Currently (2020-06) these are 
`js-mode' and
          (setq pos (point)
                state s)))
       (if (eq (point) here)            ; HERE is in the same literal as POS
-         pos
+         (nth 8 state)             ; A valid good pos cannot be in a literal.
        (setq s (parse-partial-sexp pos here (1+ (car state)) nil state nil))
        (cond
         ((> (car s) (car state))  ; Moved into a paren between POS and HERE
@@ -3884,7 +3886,10 @@ initializing CC Mode.  Currently (2020-06) these are 
`js-mode' and
                  (cons (if (and ce (< bra ce) (> ce here)) ; {..} straddling 
HERE?
                            bra
                          (point-min))
-                       (min here from)))))))))
+                       (progn
+                         (goto-char (min here from))
+                         (c-beginning-of-macro)
+                         (point))))))))))
 
 (defsubst c-state-push-any-brace-pair (bra+1 macro-start-or-here)
   ;; If BRA+1 is nil, do nothing.  Otherwise, BRA+1 is the buffer position
@@ -6846,7 +6851,7 @@ comment at the start of cc-engine.el for more info."
   ;; checking `c-new-id-start' and `c-new-id-end'.  That's done to avoid
   ;; adding all prefixes of a type as it's being entered and font locked.
   ;; This is a bit rough and ready, but now covers adding characters into the
-  ;; middle of an identifer.
+  ;; middle of an identifier.
   ;;
   ;; This function might do hidden buffer changes.
   (if (and c-new-id-start c-new-id-end
diff --git a/lisp/progmodes/cc-guess.el b/lisp/progmodes/cc-guess.el
index ea5dd48986..584db86539 100644
--- a/lisp/progmodes/cc-guess.el
+++ b/lisp/progmodes/cc-guess.el
@@ -76,6 +76,8 @@
 (cc-require 'cc-engine)
 (cc-require 'cc-styles)
 
+(cc-bytecomp-defun c-restore-string-fences)
+(cc-bytecomp-defun c-clear-string-fences)
 
 
 (defcustom c-guess-offset-threshold 10
@@ -225,11 +227,12 @@ guess is made from scratch.
 Note that the larger the region to guess in, the slower the guessing.
 So you can limit the region with `c-guess-region-max'."
   (interactive "r\nP")
-  (let ((accumulator (when accumulate c-guess-accumulator)))
-    (setq c-guess-accumulator (c-guess-examine start end accumulator))
-    (let ((pair (c-guess-guess c-guess-accumulator)))
-      (setq c-guess-guessed-basic-offset (car pair)
-           c-guess-guessed-offsets-alist (cdr pair)))))
+  (c-with-string-fences
+   (let ((accumulator (when accumulate c-guess-accumulator)))
+     (setq c-guess-accumulator (c-guess-examine start end accumulator))
+     (let ((pair (c-guess-guess c-guess-accumulator)))
+       (setq c-guess-guessed-basic-offset (car pair)
+            c-guess-guessed-offsets-alist (cdr pair))))))
 
 
 (defun c-guess-examine (start end accumulator)
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index 957a0b8a7c..ae96cdbd2f 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -997,7 +997,8 @@ Note that the style variables are always made local to the 
buffer."
   ;; `c-before/after-change', frame 3 is the primitive invoking the change
   ;; hook.
   (memq (cadr (backtrace-frame 3))
-       '(put-text-property remove-list-of-text-properties)))
+       '(put-text-property remove-text-properties
+                           remove-list-of-text-properties)))
 
 (defun c-depropertize-CPP (beg end)
   ;; Remove the punctuation syntax-table text property from the CPP parts of
@@ -1319,7 +1320,8 @@ Note that the style variables are always made local to 
the buffer."
   ;; balanced by another " is left with a '(1) syntax-table property.
   (when
       (and c-min-syn-tab-mkr c-max-syn-tab-mkr)
-    (let (s pos)
+    (c-save-buffer-state (s pos)  ; Prevent text property stuff causing change
+                                 ; function invocation.
       (setq pos c-min-syn-tab-mkr)
       (while
          (and
@@ -1342,7 +1344,8 @@ Note that the style variables are always made local to 
the buffer."
                       (c-search-backward-char-property-with-value-on-char
                        'c-fl-syn-tab '(15) ?\"
                        (max (- (point) 500) (point-min))))
-                    (not (equal (c-get-char-property (point) 'syntax-table) 
'(1))))
+                    (not (equal (c-get-char-property (point) 'syntax-table)
+                                '(1))))
            (setq pos (1+ pos))))
        (while (< pos c-max-syn-tab-mkr)
          (setq pos
@@ -1372,7 +1375,9 @@ Note that the style variables are always made local to 
the buffer."
   ;; Restore any syntax-table text properties which are "mirrored" by
   ;; c-fl-syn-tab text properties.
   (when (and c-min-syn-tab-mkr c-max-syn-tab-mkr)
-    (let ((pos c-min-syn-tab-mkr))
+    (c-save-buffer-state ; Prevent text property stuff causing change function
+                        ; invocation.
+       ((pos c-min-syn-tab-mkr))
       (while
          (and
           (< pos c-max-syn-tab-mkr)
@@ -2016,120 +2021,116 @@ Note that this is a strict tail, so won't match, e.g. 
\"0x....\".")
   ;; or a comment - "wrongly" removing a symbol from `c-found-types'
   ;; isn't critical.
   (unless (c-called-from-text-property-change-p)
-    (save-restriction
-      (widen)
-      ;; Clear the list of found types if we make a change at the start of the
-      ;; buffer, to make it easier to get rid of misspelled types and
-      ;; variables that have gotten recognized as types in malformed code.
-      (when (eq beg (point-min))
-       (c-clear-found-types))
-      (if c-just-done-before-change
-         ;; We have two consecutive calls to `before-change-functions'
-         ;; without an intervening `after-change-functions'.  An example of
-         ;; this is bug #38691.  To protect CC Mode, assume that the entire
-         ;; buffer has changed.
-         (setq beg (point-min)
-               end (point-max)
-               c-just-done-before-change 'whole-buffer)
-       (setq c-just-done-before-change t))
-      ;; (c-new-BEG c-new-END) will be the region to fontify.
-      (setq c-new-BEG beg  c-new-END end)
-      (setq c-maybe-stale-found-type nil)
-      ;; A workaround for syntax-ppss's failure to notice syntax-table text
-      ;; property changes.
-      (when (fboundp 'syntax-ppss)
-       (setq c-syntax-table-hwm most-positive-fixnum))
-      (save-match-data
-       (widen)
-       (unwind-protect
-           (progn
-             (c-restore-string-fences)
-             (save-excursion
-               ;; Are we inserting/deleting stuff in the middle of an
-               ;; identifier?
-               (c-unfind-enclosing-token beg)
-               (c-unfind-enclosing-token end)
-               ;; Are we coalescing two tokens together, e.g. "fo o"
-               ;; -> "foo"?
-               (when (< beg end)
-                 (c-unfind-coalesced-tokens beg end))
-               (c-invalidate-sws-region-before beg end)
-               ;; Are we (potentially) disrupting the syntactic
-               ;; context which makes a type a type?  E.g. by
-               ;; inserting stuff after "foo" in "foo bar;", or
-               ;; before "foo" in "typedef foo *bar;"?
-               ;;
-               ;; We search for appropriate c-type properties "near"
-               ;; the change.  First, find an appropriate boundary
-               ;; for this property search.
-               (let (lim lim-2
-                     type type-pos
-                     marked-id term-pos
-                     (end1
-                      (or (and (eq (get-text-property end 'face)
-                                   'font-lock-comment-face)
-                               (previous-single-property-change end 'face))
-                          end)))
-                 (when (>= end1 beg) ; Don't hassle about changes entirely in
+    (c-with-string-fences
+     (save-restriction
+       (widen)
+       ;; Clear the list of found types if we make a change at the start of the
+       ;; buffer, to make it easier to get rid of misspelled types and
+       ;; variables that have gotten recognized as types in malformed code.
+       (when (eq beg (point-min))
+        (c-clear-found-types))
+       (if c-just-done-before-change
+          ;; We have two consecutive calls to `before-change-functions'
+          ;; without an intervening `after-change-functions'.  An example of
+          ;; this is bug #38691.  To protect CC Mode, assume that the entire
+          ;; buffer has changed.
+          (setq beg (point-min)
+                end (point-max)
+                c-just-done-before-change 'whole-buffer)
+        (setq c-just-done-before-change t))
+       ;; (c-new-BEG c-new-END) will be the region to fontify.
+       (setq c-new-BEG beg  c-new-END end)
+       (setq c-maybe-stale-found-type nil)
+       ;; A workaround for syntax-ppss's failure to notice syntax-table text
+       ;; property changes.
+       (when (fboundp 'syntax-ppss)
+        (setq c-syntax-table-hwm most-positive-fixnum))
+       (save-match-data
+        (save-excursion
+          ;; Are we inserting/deleting stuff in the middle of an
+          ;; identifier?
+          (c-unfind-enclosing-token beg)
+          (c-unfind-enclosing-token end)
+          ;; Are we coalescing two tokens together, e.g. "fo o"
+          ;; -> "foo"?
+          (when (< beg end)
+            (c-unfind-coalesced-tokens beg end))
+          (c-invalidate-sws-region-before beg end)
+          ;; Are we (potentially) disrupting the syntactic
+          ;; context which makes a type a type?  E.g. by
+          ;; inserting stuff after "foo" in "foo bar;", or
+          ;; before "foo" in "typedef foo *bar;"?
+          ;;
+          ;; We search for appropriate c-type properties "near"
+          ;; the change.  First, find an appropriate boundary
+          ;; for this property search.
+          (let (lim lim-2
+                    type type-pos
+                    marked-id term-pos
+                    (end1
+                     (or (and (eq (get-text-property end 'face)
+                                  'font-lock-comment-face)
+                              (previous-single-property-change end 'face))
+                         end)))
+            (when (>= end1 beg) ; Don't hassle about changes entirely in
                                        ; comments.
-                   ;; Find a limit for the search for a `c-type' property
-                   ;; Point is currently undefined.  A `goto-char' somewhere 
is needed.  (2020-12-06).
-                   (setq lim-2 (c-determine-limit 1000 (point) ; that is 
wrong.  FIXME!!!  (2020-12-06)
-                                                  ))
-                   (while
-                       (and (/= (skip-chars-backward "^;{}" lim-2) 0)
-                            (> (point) (point-min))
-                            (memq (c-get-char-property (1- (point)) 'face)
-                                  '(font-lock-comment-face 
font-lock-string-face))))
-                   (setq lim (max (point-min) (1- (point))))
-
-                   ;; Look for the latest `c-type' property before end1
-                   (when (and (> end1 (point-min))
-                              (setq type-pos
-                                    (if (get-text-property (1- end1) 'c-type)
-                                        end1
-                                      (previous-single-property-change end1 
'c-type
-                                                                       nil 
lim))))
-                     (setq type (get-text-property (max (1- type-pos) lim) 
'c-type))
-
-                     (when (memq type '(c-decl-id-start c-decl-type-start))
-                       ;; Get the identifier, if any, that the property is on.
-                       (goto-char (1- type-pos))
-                       (setq marked-id
-                             (when (looking-at "\\(\\sw\\|\\s_\\)")
-                               (c-beginning-of-current-token)
-                               (buffer-substring-no-properties (point) 
type-pos)))
-
-                       (goto-char end1)
-                       (setq lim-2 (c-determine-+ve-limit 1000))
-                       (skip-chars-forward "^;{}" lim-2) ; FIXME!!!  loop for
+              ;; Find a limit for the search for a `c-type' property
+              ;; Point is currently undefined.  A `goto-char' somewhere is 
needed.  (2020-12-06).
+              (setq lim-2 (c-determine-limit 1000 (point) ; that is wrong.  
FIXME!!!  (2020-12-06)
+                                             ))
+              (while
+                  (and (/= (skip-chars-backward "^;{}" lim-2) 0)
+                       (> (point) (point-min))
+                       (memq (c-get-char-property (1- (point)) 'face)
+                             '(font-lock-comment-face font-lock-string-face))))
+              (setq lim (max (point-min) (1- (point))))
+
+              ;; Look for the latest `c-type' property before end1
+              (when (and (> end1 (point-min))
+                         (setq type-pos
+                               (if (get-text-property (1- end1) 'c-type)
+                                   end1
+                                 (previous-single-property-change end1 'c-type
+                                                                  nil lim))))
+                (setq type (get-text-property (max (1- type-pos) lim) 'c-type))
+
+                (when (memq type '(c-decl-id-start c-decl-type-start))
+                  ;; Get the identifier, if any, that the property is on.
+                  (goto-char (1- type-pos))
+                  (setq marked-id
+                        (when (looking-at "\\(\\sw\\|\\s_\\)")
+                          (c-beginning-of-current-token)
+                          (buffer-substring-no-properties (point) type-pos)))
+
+                  (goto-char end1)
+                  (setq lim-2 (c-determine-+ve-limit 1000))
+                  (skip-chars-forward "^;{}" lim-2) ; FIXME!!!  loop for
                                        ; comment, maybe
-                       (setq lim (point))
-                       (setq term-pos
-                             (or (c-next-single-property-change end 'c-type 
nil lim) lim))
-                       (setq c-maybe-stale-found-type
-                             (list type marked-id
-                                   type-pos term-pos
-                                   (buffer-substring-no-properties type-pos
-                                                                   term-pos)
-                                   (buffer-substring-no-properties beg 
end)))))))
-
-               (if c-get-state-before-change-functions
-                   (mapc (lambda (fn)
-                           (funcall fn beg end))
-                         c-get-state-before-change-functions))
-
-               (c-laomib-invalidate-cache beg end)))
-         (c-clear-string-fences))))
-    (c-truncate-lit-pos-cache beg)
-    ;; The following must be done here rather than in `c-after-change'
-    ;; because newly inserted parens would foul up the invalidation
-    ;; algorithm.
-    (c-invalidate-state-cache beg)
-    ;; The following must happen after the previous, which likely alters
-    ;; the macro cache.
-    (when c-opt-cpp-symbol
-      (c-invalidate-macro-cache beg end))))
+                  (setq lim (point))
+                  (setq term-pos
+                        (or (c-next-single-property-change end 'c-type nil 
lim) lim))
+                  (setq c-maybe-stale-found-type
+                        (list type marked-id
+                              type-pos term-pos
+                              (buffer-substring-no-properties type-pos
+                                                              term-pos)
+                              (buffer-substring-no-properties beg end)))))))
+
+          (if c-get-state-before-change-functions
+              (mapc (lambda (fn)
+                      (funcall fn beg end))
+                    c-get-state-before-change-functions))
+
+          (c-laomib-invalidate-cache beg end))))
+     (c-truncate-lit-pos-cache beg)
+     ;; The following must be done here rather than in `c-after-change'
+     ;; because newly inserted parens would foul up the invalidation
+     ;; algorithm.
+     (c-invalidate-state-cache beg)
+     ;; The following must happen after the previous, which likely alters
+     ;; the macro cache.
+     (when c-opt-cpp-symbol
+       (c-invalidate-macro-cache beg end)))))
 
 (defvar c-in-after-change-fontification nil)
 (make-variable-buffer-local 'c-in-after-change-fontification)
@@ -2181,51 +2182,48 @@ Note that this is a strict tail, so won't match, e.g. 
\"0x....\".")
       (save-restriction
        (save-match-data          ; c-recognize-<>-arglists changes match-data
          (widen)
-         (unwind-protect
-             (progn
-               (c-restore-string-fences)
-               (when (> end (point-max))
-                 ;; Some emacsen might return positions past the end. This
-                 ;; has been observed in Emacs 20.7 when rereading a buffer
-                 ;; changed on disk (haven't been able to minimize it, but
-                 ;; Emacs 21.3 appears to work).
-                 (setq end (point-max))
-                 (when (> beg end)
-                   (setq beg end)))
-
-               ;; C-y is capable of spuriously converting category
-               ;; properties c-</>-as-paren-syntax and
-               ;; c-cpp-delimiter into hard syntax-table properties.
-               ;; Remove these when it happens.
-               (when (eval-when-compile (memq 'category-properties 
c-emacs-features))
-                 (c-save-buffer-state ()
-                   (c-clear-char-property-with-value beg end 'syntax-table
-                                                     c-<-as-paren-syntax)
-                   (c-clear-char-property-with-value beg end 'syntax-table
-                                                     c->-as-paren-syntax)
-                   (c-clear-char-property-with-value beg end 'syntax-table 
nil)))
-
-               (c-update-new-id end)
-               (c-trim-found-types beg end old-len) ; maybe we don't
-                                                    ; need all of these.
-               (c-invalidate-sws-region-after beg end old-len)
-               ;; (c-invalidate-state-cache beg) ; moved to
-               ;; `c-before-change'.
-               (c-invalidate-find-decl-cache beg)
-
-               (when c-recognize-<>-arglists
-                 (c-after-change-check-<>-operators beg end))
-
-               (setq c-in-after-change-fontification t)
-               (save-excursion
-                 (mapc (lambda (fn)
-                         (funcall fn beg end old-len))
-                       c-before-font-lock-functions)))
-           (c-clear-string-fences))))))
+         (c-with-string-fences
+          (when (> end (point-max))
+            ;; Some emacsen might return positions past the end. This
+            ;; has been observed in Emacs 20.7 when rereading a buffer
+            ;; changed on disk (haven't been able to minimize it, but
+            ;; Emacs 21.3 appears to work).
+            (setq end (point-max))
+            (when (> beg end)
+              (setq beg end)))
+
+          ;; C-y is capable of spuriously converting category
+          ;; properties c-</>-as-paren-syntax and
+          ;; c-cpp-delimiter into hard syntax-table properties.
+          ;; Remove these when it happens.
+          (when (eval-when-compile (memq 'category-properties 
c-emacs-features))
+            (c-save-buffer-state ()
+              (c-clear-char-property-with-value beg end 'syntax-table
+                                                c-<-as-paren-syntax)
+              (c-clear-char-property-with-value beg end 'syntax-table
+                                                c->-as-paren-syntax)
+              (c-clear-char-property-with-value beg end 'syntax-table nil)))
+
+          (c-update-new-id end)
+          (c-trim-found-types beg end old-len) ; maybe we don't
+                                       ; need all of these.
+          (c-invalidate-sws-region-after beg end old-len)
+          ;; (c-invalidate-state-cache beg) ; moved to
+          ;; `c-before-change'.
+          (c-invalidate-find-decl-cache beg)
+
+          (when c-recognize-<>-arglists
+            (c-after-change-check-<>-operators beg end))
+
+          (setq c-in-after-change-fontification t)
+          (save-excursion
+            (mapc (lambda (fn)
+                    (funcall fn beg end old-len))
+                  c-before-font-lock-functions)))))
   ;; A workaround for syntax-ppss's failure to notice syntax-table text
   ;; property changes.
-  (when (fboundp 'syntax-ppss)
-    (syntax-ppss-flush-cache c-syntax-table-hwm)))
+      (when (fboundp 'syntax-ppss)
+       (syntax-ppss-flush-cache c-syntax-table-hwm)))))
 
 (defun c-doc-fl-decl-start (pos)
   ;; If the line containing POS is in a doc comment continued line (as defined
@@ -2457,46 +2455,42 @@ Note that this is a strict tail, so won't match, e.g. 
\"0x....\".")
     (widen)
     (let (new-beg new-end new-region case-fold-search)
       (c-save-buffer-state nil
-       ;; Temporarily reapply the string fence syntax-table properties.
-       (unwind-protect
-           (progn
-             (c-restore-string-fences)
-             (if (and c-in-after-change-fontification
-                      (< beg c-new-END) (> end c-new-BEG))
-                 ;; Region and the latest after-change fontification region 
overlap.
-                 ;; Determine the upper and lower bounds of our adjusted region
-                 ;; separately.
-                 (progn
-                   (if (<= beg c-new-BEG)
-                       (setq c-in-after-change-fontification nil))
-                   (setq new-beg
-                         (if (and (>= beg (c-point 'bol c-new-BEG))
-                                  (<= beg c-new-BEG))
-                             ;; Either jit-lock has accepted `c-new-BEG', or 
has
-                             ;; (probably) extended the change region 
spuriously
-                             ;; to BOL, which position likely has a
-                             ;; syntactically different position.  To ensure
-                             ;; correct fontification, we start at `c-new-BEG',
-                             ;; assuming any characters to the left of
-                             ;; `c-new-BEG' on the line do not require
-                             ;; fontification.
-                             c-new-BEG
-                           (setq new-region (c-before-context-fl-expand-region 
beg end)
-                                 new-end (cdr new-region))
-                           (car new-region)))
-                   (setq new-end
-                         (if (and (>= end (c-point 'bol c-new-END))
-                                  (<= end c-new-END))
-                             c-new-END
-                           (or new-end
-                               (cdr (c-before-context-fl-expand-region beg 
end))))))
-               ;; Context (etc.) fontification.
-               (setq new-region (c-before-context-fl-expand-region beg end)
-                     new-beg (car new-region)  new-end (cdr new-region)))
-             ;; Finally invoke font lock's functionality.
-             (funcall (default-value 'font-lock-fontify-region-function)
-                      new-beg new-end verbose))
-         (c-clear-string-fences))))))
+       (c-with-string-fences
+        (if (and c-in-after-change-fontification
+                 (< beg c-new-END) (> end c-new-BEG))
+            ;; Region and the latest after-change fontification region overlap.
+            ;; Determine the upper and lower bounds of our adjusted region
+            ;; separately.
+            (progn
+              (if (<= beg c-new-BEG)
+                  (setq c-in-after-change-fontification nil))
+              (setq new-beg
+                    (if (and (>= beg (c-point 'bol c-new-BEG))
+                             (<= beg c-new-BEG))
+                        ;; Either jit-lock has accepted `c-new-BEG', or has
+                        ;; (probably) extended the change region spuriously
+                        ;; to BOL, which position likely has a
+                        ;; syntactically different position.  To ensure
+                        ;; correct fontification, we start at `c-new-BEG',
+                        ;; assuming any characters to the left of
+                        ;; `c-new-BEG' on the line do not require
+                        ;; fontification.
+                        c-new-BEG
+                      (setq new-region (c-before-context-fl-expand-region beg 
end)
+                            new-end (cdr new-region))
+                      (car new-region)))
+              (setq new-end
+                    (if (and (>= end (c-point 'bol c-new-END))
+                             (<= end c-new-END))
+                        c-new-END
+                      (or new-end
+                          (cdr (c-before-context-fl-expand-region beg end))))))
+          ;; Context (etc.) fontification.
+          (setq new-region (c-before-context-fl-expand-region beg end)
+                new-beg (car new-region)  new-end (cdr new-region)))
+        ;; Finally invoke font lock's functionality.
+        (funcall (default-value 'font-lock-fontify-region-function)
+                 new-beg new-end verbose))))))
 
 (defun c-after-font-lock-init ()
   ;; Put on `font-lock-mode-hook'.  This function ensures our after-change
diff --git a/lisp/progmodes/cfengine.el b/lisp/progmodes/cfengine.el
index 6fc898d95b..00348ac0bb 100644
--- a/lisp/progmodes/cfengine.el
+++ b/lisp/progmodes/cfengine.el
@@ -989,13 +989,7 @@ Intended as the value of `indent-line-function'."
 (defun cfengine-fill-paragraph (&optional justify)
   "Fill `paragraphs' in Cfengine code."
   (interactive "P")
-  (or (if (fboundp 'fill-comment-paragraph)
-          (fill-comment-paragraph justify)
-       ;; else do nothing in a comment
-       (nth 4 (parse-partial-sexp (save-excursion
-                                    (beginning-of-defun)
-                                    (point))
-                                  (point))))
+  (or (fill-comment-paragraph justify)
       (let ((paragraph-start
             ;; Include start of parenthesized block.
             "\f\\|[ \t]*$\\|.*(")
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 2c5f4687ac..d28fce9dbd 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -82,6 +82,25 @@ after `call-process' inserts the grep output into the 
buffer.")
   "Position of the start of the text inserted by `compilation-filter'.
 This is bound before running `compilation-filter-hook'.")
 
+(defcustom compilation-hidden-output nil
+  "Regexp to match output from the compilation that should be hidden.
+This can also be a list of regexps.
+
+The text matched by this variable will be made invisible, which
+means that it'll still be present in the buffer, so that
+navigation commands (for instance, `next-error') can still make
+use of the hidden text to determine the current directory and the
+like.
+
+For instance, to hide the verbose output from recursive
+makefiles, you can say something like:
+
+  (setq compilation-hidden-output
+        \\='(\"^make[^\n]+\n\"))"
+  :type '(choice regexp
+                 (repeat regexp))
+  :version "29.1")
+
 (defvar compilation-first-column 1
   "This is how compilers number the first column, usually 1 or 0.
 If this is buffer-local in the destination buffer, Emacs obeys
@@ -951,7 +970,10 @@ Faces `compilation-error-face', `compilation-warning-face',
 
 (defcustom compilation-auto-jump-to-first-error nil
   "If non-nil, automatically jump to the first error during compilation."
-  :type 'boolean
+  :type '(choice (const :tag "Never" nil)
+                 (const :tag "Always" t)
+                 (const :tag "If location known" if-location-known)
+                 (const :tag "First known location" first-known))
   :version "23.1")
 
 (defvar-local compilation-auto-jump-to-next nil
@@ -1182,14 +1204,39 @@ POS and RES.")
              l2
            (setcdr l1 (cons (list ,key) l2)))))))
 
+(defun compilation--file-known-p ()
+  "Say whether the file under point can be found."
+  (when-let* ((msg (get-text-property (point) 'compilation-message))
+              (loc (compilation--message->loc msg))
+              (elem (compilation-find-file-1
+                     (point-marker)
+                     (caar (compilation--loc->file-struct loc))
+                     (cadr (car (compilation--loc->file-struct loc)))
+                     (compilation--file-struct->formats
+                      (compilation--loc->file-struct loc)))))
+    (car elem)))
+
 (defun compilation-auto-jump (buffer pos)
   (when (buffer-live-p buffer)
     (with-current-buffer buffer
       (goto-char pos)
       (let ((win (get-buffer-window buffer 0)))
         (if win (set-window-point win pos)))
-      (if compilation-auto-jump-to-first-error
-         (compile-goto-error)))))
+      (when compilation-auto-jump-to-first-error
+        (cl-case compilation-auto-jump-to-first-error
+          ('if-location-known
+           (when (compilation--file-known-p)
+            (compile-goto-error)))
+          ('first-known
+           (let (match)
+             (while (and (not (compilation--file-known-p))
+                         (setq match (text-property-search-forward
+                                      'compilation-message nil nil t)))
+               (goto-char (prop-match-beginning match))))
+           (when (compilation--file-known-p)
+            (compile-goto-error)))
+          (otherwise
+           (compile-goto-error)))))))
 
 ;; This function is the central driver, called when font-locking to gather
 ;; all information needed to later jump to corresponding source code.
@@ -1766,7 +1813,8 @@ If nil, don't hide anything."
   (unless compilation-in-progress (force-mode-line-update t)))
 
 ;;;###autoload
-(defun compilation-start (command &optional mode name-function 
highlight-regexp)
+(defun compilation-start (command &optional mode name-function highlight-regexp
+                                  continue)
   "Run compilation command COMMAND (low level interface).
 If COMMAND starts with a cd command, that becomes the `default-directory'.
 The rest of the arguments are optional; for them, nil means use the default.
@@ -1783,6 +1831,12 @@ If HIGHLIGHT-REGEXP is non-nil, `next-error' will 
temporarily highlight
 the matching section of the visited source line; the default is to use the
 global value of `compilation-highlight-regexp'.
 
+If CONTINUE is non-nil, the buffer won't be emptied before
+compilation is started.  This can be useful if you wish to
+combine the output from several compilation commands in the same
+buffer.  The new output will be at the end of the buffer, and
+point is not changed.
+
 Returns the compilation buffer created."
   (or mode (setq mode 'compilation-mode))
   (let* ((name-of-mode
@@ -1846,7 +1900,12 @@ Returns the compilation buffer created."
                   (if (= (length expanded-dir) 1)
                       (car expanded-dir)
                     substituted-dir)))))
-       (erase-buffer)
+        (if continue
+            (progn
+              ;; Save the point so we can restore it.
+              (setq continue (point))
+              (goto-char (point-max)))
+         (erase-buffer))
        ;; Select the desired mode.
        (if (not (eq mode t))
             (progn
@@ -1872,12 +1931,13 @@ Returns the compilation buffer created."
         (if (or compilation-auto-jump-to-first-error
                (eq compilation-scroll-output 'first-error))
             (setq-local compilation-auto-jump-to-next t))
-       ;; Output a mode setter, for saving and later reloading this buffer.
-       (insert "-*- mode: " name-of-mode
-               "; default-directory: "
-                (prin1-to-string (abbreviate-file-name default-directory))
-               " -*-\n"
-               (format "%s started at %s\n\n"
+        (when (zerop (buffer-size))
+         ;; Output a mode setter, for saving and later reloading this buffer.
+         (insert "-*- mode: " name-of-mode
+                 "; default-directory: "
+                  (prin1-to-string (abbreviate-file-name default-directory))
+                 " -*-\n"))
+        (insert (format "%s started at %s\n\n"
                        mode-name
                        (substring (current-time-string) 0 19))
                command "\n")
@@ -1896,28 +1956,33 @@ Returns the compilation buffer created."
               (and (derived-mode-p 'comint-mode)
                    (comint-term-environment))
              (list (format "INSIDE_EMACS=%s,compile" emacs-version))
+              ;; Some external programs (like "git grep") use a pager;
+              ;; defeat that.
+              (list "PAGER=")
              (copy-sequence process-environment))))
         (setq-local compilation-arguments
                     (list command mode name-function highlight-regexp))
         (setq-local revert-buffer-function 'compilation-revert-buffer)
-       (and outwin
-            ;; Forcing the window-start overrides the usual redisplay
-            ;; feature of bringing point into view, so setting the
-            ;; window-start to top of the buffer risks losing the
-            ;; effect of moving point to EOB below, per
-            ;; compilation-scroll-output, if the command is long
-            ;; enough to push point outside of the window.  This
-            ;; could happen, e.g., in `rgrep'.
-            (not compilation-scroll-output)
-            (set-window-start outwin (point-min)))
+       (when (and outwin
+                   (not continue)
+                  ;; Forcing the window-start overrides the usual redisplay
+                  ;; feature of bringing point into view, so setting the
+                  ;; window-start to top of the buffer risks losing the
+                  ;; effect of moving point to EOB below, per
+                  ;; compilation-scroll-output, if the command is long
+                  ;; enough to push point outside of the window.  This
+                  ;; could happen, e.g., in `rgrep'.
+                  (not compilation-scroll-output))
+         (set-window-start outwin (point-min)))
 
        ;; Position point as the user will see it.
        (let ((desired-visible-point
-              ;; Put it at the end if `compilation-scroll-output' is set.
-              (if compilation-scroll-output
-                  (point-max)
-                ;; Normally put it at the top.
-                (point-min))))
+              (cond
+                (continue continue)
+               ;; Put it at the end if `compilation-scroll-output' is set.
+                (compilation-scroll-output (point-max))
+               ;; Normally put it at the top.
+                (t (point-min)))))
          (goto-char desired-visible-point)
          (when (and outwin (not (eq outwin (selected-window))))
            (set-window-point outwin desired-visible-point)))
@@ -2413,8 +2478,8 @@ commands of Compilation major mode are available.  See
 
 (defun compilation-filter (proc string)
   "Process filter for compilation buffers.
-Just inserts the text,
-handles carriage motion (see `comint-inhibit-carriage-motion'),
+Just inserts the text, handles carriage motion (see
+`comint-inhibit-carriage-motion'), `compilation-hidden-output',
 and runs `compilation-filter-hook'."
   (when (buffer-live-p (process-buffer proc))
     (with-current-buffer (process-buffer proc)
@@ -2439,6 +2504,8 @@ and runs `compilation-filter-hook'."
                 (dolist (line (string-lines string nil t))
                   (compilation--insert-abbreviated-line
                    line compilation-max-output-line-length)))
+              (when compilation-hidden-output
+                (compilation--hide-output compilation-filter-start))
               (unless comint-inhibit-carriage-motion
                 (comint-carriage-motion (process-mark proc) (point)))
               (set-marker (process-mark proc) (point))
@@ -2451,6 +2518,24 @@ and runs `compilation-filter-hook'."
          (set-marker min nil)
          (set-marker max nil))))))
 
+(defun compilation--hide-output (start)
+  (save-excursion
+    (goto-char start)
+    (beginning-of-line)
+    ;; Apply the match to each line, but wait until we have a complete
+    ;; line.
+    (let ((start (point)))
+      (while (search-forward "\n" nil t)
+        (save-restriction
+          (narrow-to-region start (point))
+          (dolist (regexp (ensure-list compilation-hidden-output))
+            (goto-char start)
+            (while (re-search-forward regexp nil t)
+              (add-text-properties (match-beginning 0) (match-end 0)
+                                   '( invisible t
+                                      rear-nonsticky t))))
+          (goto-char (point-max)))))))
+
 (defun compilation--insert-abbreviated-line (string width)
   (if (and (> (current-column) 0)
            (get-text-property (1- (point)) 'button))
@@ -2974,19 +3059,7 @@ and overlay is highlighted between MK and END-MK."
   (remove-hook 'pre-command-hook
               #'compilation-goto-locus-delete-o))
 
-(defun compilation-find-file (marker filename directory &rest formats)
-  "Find a buffer for file FILENAME.
-If FILENAME is not found at all, ask the user where to find it.
-Pop up the buffer containing MARKER and scroll to MARKER if we ask
-the user where to find the file.
-Search the directories in `compilation-search-path'.
-A nil in `compilation-search-path' means to try the
-\"current\" directory, which is passed in DIRECTORY.
-If DIRECTORY is relative, it is combined with `default-directory'.
-If DIRECTORY is nil, that means use `default-directory'.
-FORMATS, if given, is a list of formats to reformat FILENAME when
-looking for it: for each element FMT in FORMATS, this function
-attempts to find a file whose name is produced by (format FMT FILENAME)."
+(defun compilation-find-file-1 (marker filename directory &optional formats)
   (or formats (setq formats '("%s")))
   (let ((dirs compilation-search-path)
         (spec-dir (if directory
@@ -3035,6 +3108,23 @@ attempts to find a file whose name is produced by 
(format FMT FILENAME)."
                             (find-file-noselect name))
                 fmts (cdr fmts)))
         (setq dirs (cdr dirs))))
+    (list buffer spec-dir)))
+
+(defun compilation-find-file (marker filename directory &rest formats)
+  "Find a buffer for file FILENAME.
+If FILENAME is not found at all, ask the user where to find it.
+Pop up the buffer containing MARKER and scroll to MARKER if we ask
+the user where to find the file.
+Search the directories in `compilation-search-path'.
+A nil in `compilation-search-path' means to try the
+\"current\" directory, which is passed in DIRECTORY.
+If DIRECTORY is relative, it is combined with `default-directory'.
+If DIRECTORY is nil, that means use `default-directory'.
+FORMATS, if given, is a list of formats to reformat FILENAME when
+looking for it: for each element FMT in FORMATS, this function
+attempts to find a file whose name is produced by (format FMT FILENAME)."
+  (pcase-let ((`(,buffer ,spec-dir)
+               (compilation-find-file-1 marker filename directory formats)))
     (while (null buffer)    ;Repeat until the user selects an existing file.
       ;; The file doesn't exist.  Ask the user where to find it.
       (save-excursion            ;This save-excursion is probably not right.
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index 3742286e5d..e571cee83c 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -558,6 +558,20 @@ This way enabling/disabling of menu items is more correct."
   :type 'boolean
   :group 'cperl-speed)
 
+(defcustom cperl-file-style nil
+  "Indentation style to use in cperl-mode."
+  :type '(choice (const "CPerl")
+                 (const "PBP")
+                 (const "PerlStyle")
+                 (const "GNU")
+                 (const "C++")
+                 (const "K&R")
+                 (const "BSD")
+                 (const "Whitesmith")
+                 (const :tag "Default" nil))
+  :version "29.1")
+;;;###autoload(put 'cperl-file-style 'safe-local-variable 'stringp)
+
 (defcustom cperl-ps-print-face-properties
   '((font-lock-keyword-face            nil nil         bold shadow)
     (font-lock-variable-name-face      nil nil         bold)
@@ -1077,7 +1091,7 @@ Unless KEEP, removes the old indentation."
     ["Debugger" cperl-db t]
     "----"
     ("Tools"
-     ["Imenu" imenu (fboundp 'imenu)]
+     ["Imenu" imenu]
      ["Imenu on Perl Info" cperl-imenu-on-info (featurep 'imenu)]
      "----"
      ["Ispell PODs" cperl-pod-spell
@@ -1660,9 +1674,11 @@ Settings for classic indent-styles: K&R BSD=C++ GNU PBP 
PerlStyle=Whitesmith
   `cperl-continued-statement-offset'  5   4       2   4   4
 
 CPerl knows several indentation styles, and may bulk set the
-corresponding variables.  Use \\[cperl-set-style] to do this.  Use
-\\[cperl-set-style-back] to restore the memorized preexisting values
-\(both available from menu).  See examples in `cperl-style-examples'.
+corresponding variables.  Use \\[cperl-set-style] to do this or
+set the `cperl-file-style' user option.  Use
+\\[cperl-set-style-back] to restore the memorized preexisting
+values \(both available from menu).  See examples in
+`cperl-style-examples'.
 
 Part of the indentation style is how different parts of if/elsif/else
 statements are broken into lines; in CPerl, this is reflected on how
@@ -1795,8 +1811,15 @@ or as help on variables `cperl-tips', `cperl-problems',
   (when (and cperl-pod-here-scan
              (not cperl-syntaxify-by-font-lock))
     (cperl-find-pods-heres))
+  (when cperl-file-style
+    (cperl-set-style cperl-file-style))
+  (add-hook 'hack-local-variables-hook #'cperl--set-file-style nil t)
   ;; Setup Flymake
   (add-hook 'flymake-diagnostic-functions #'perl-flymake nil t))
+
+(defun cperl--set-file-style ()
+  (when cperl-file-style
+    (cperl-set-style cperl-file-style)))
 
 ;; Fix for perldb - make default reasonable
 (defun cperl-db ()
@@ -6313,7 +6336,7 @@ else
      )
     ("Current"))
   "List of variables to set to get a particular indentation style.
-Should be used via `cperl-set-style' or via Perl menu.
+Should be used via `cperl-set-style', `cperl-file-style' or via Perl menu.
 
 See examples in `cperl-style-examples'.")
 
@@ -6359,7 +6382,8 @@ side-effect of memorizing only.  Examples in 
`cperl-style-examples'."
     (eval '(mode-compile))))           ; Avoid a warning
 
 (declare-function Info-find-node "info"
-                 (filename nodename &optional no-going-back strict-case))
+                 (filename nodename &optional no-going-back strict-case
+                            noerror))
 
 (defun cperl-info-buffer (type)
   ;; Return buffer with documentation.  Creates if missing.
@@ -7056,9 +7080,7 @@ One may build such TAGS files from CPerl mode menu."
       (error "No items found"))
   (setq update
         ;; (imenu-choose-buffer-index "Packages: " (nth 2 cperl-hierarchy))
-       (if (if (fboundp 'display-popup-menus-p)
-               (display-popup-menus-p)
-             window-system)
+        (if (display-popup-menus-p)
            (x-popup-menu t (nth 2 cperl-hierarchy))
          (require 'tmm)
          (tmm-prompt (nth 2 cperl-hierarchy))))
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index 775b6ebab4..5989e1161b 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -627,13 +627,13 @@ functions are annotated with \"<f>\" via the
            ;; t if in function position.
            (funpos (eq (char-before beg) ?\())
            (quoted (elisp--form-quoted-p beg))
-           (fun-sym (condition-case nil
-                        (save-excursion
-                          (up-list -1)
-                          (forward-char 1)
-                          (and (memq (char-syntax (char-after)) '(?w ?_))
-                               (read (current-buffer))))
-                      (error nil))))
+           (is-ignore-error
+            (condition-case nil
+                (save-excursion
+                  (up-list -1)
+                  (forward-char 1)
+                  (looking-at-p "ignore-error\\>"))
+              (error nil))))
       (when (and end (or (not (nth 8 (syntax-ppss)))
                          (memq (char-before beg) '(?` ?‘))))
         (let ((table-etc
@@ -642,7 +642,7 @@ functions are annotated with \"<f>\" via the
                     ;; FIXME: We could look at the first element of
                     ;; the current form and use it to provide a more
                     ;; specific completion table in more cases.
-                    ((eq fun-sym 'ignore-error)
+                    (is-ignore-error
                      (list t (elisp--completion-local-symbols)
                            :predicate (lambda (sym)
                                         (get sym 'error-conditions))))
@@ -697,7 +697,10 @@ functions are annotated with \"<f>\" via the
                                      (let ((c (char-after)))
                                        (if (eq c ?\() ?\(
                                          (if (memq (char-syntax c) '(?w ?_))
-                                             (read (current-buffer))))))
+                                             (let ((pt (point)))
+                                               (forward-sexp)
+                                               (intern-soft
+                                                (buffer-substring pt 
(point))))))))
                             (error nil))))
                      (pcase parent
                        ;; FIXME: Rather than hardcode special cases here,
@@ -776,8 +779,8 @@ functions are annotated with \"<f>\" via the
 
 ;;; Xref backend
 
-(declare-function xref-make "xref" (summary location))
-(declare-function xref-item-location "xref" (this))
+(declare-function xref-make "progmodes/xref" (summary location))
+(declare-function xref-item-location "progmodes/xref" (this))
 
 (defun elisp--xref-backend () 'elisp)
 
@@ -1763,7 +1766,8 @@ Intended for `eldoc-documentation-functions' (which see)."
 
 (defun elisp-eldoc-var-docstring (callback &rest _ignored)
   "Document variable at point.
-Intended for `eldoc-documentation-functions' (which see)."
+Intended for `eldoc-documentation-functions' (which see).
+Also see `elisp-eldoc-var-docstring-with-value'."
   (let* ((sym (elisp--current-symbol))
          (docstring (and sym (elisp-get-var-docstring sym))))
     (when docstring
@@ -1771,6 +1775,33 @@ Intended for `eldoc-documentation-functions' (which 
see)."
                :thing sym
                :face 'font-lock-variable-name-face))))
 
+(defun elisp-eldoc-var-docstring-with-value (callback &rest _)
+  "Document variable at point.
+Intended for `eldoc-documentation-functions' (which see).
+Compared to `elisp-eldoc-var-docstring', this also includes the
+current variable value and a bigger chunk of the docstring."
+  (when-let ((cs (elisp--current-symbol)))
+    (when (and (boundp cs)
+              ;; nil and t are boundp!
+              (not (null cs))
+              (not (eq cs t)))
+      (funcall callback
+              (format "%.100S %s"
+                      (symbol-value cs)
+                      (let* ((doc (documentation-property
+                                    cs 'variable-documentation t))
+                             (more (- (length doc) 1000)))
+                        (concat (propertize
+                                 (string-limit (if (string= doc "nil")
+                                                   "Undocumented."
+                                                 doc)
+                                               1000)
+                                 'face 'font-lock-doc-face)
+                                (when (> more 0)
+                                  (format "[%sc more]" more)))))
+              :thing cs
+              :face 'font-lock-variable-name-face))))
+
 (defun elisp-get-fnsym-args-string (sym &optional index)
   "Return a string containing the parameter list of the function SYM.
 If SYM is a subr and no arglist is obtainable from the docstring
@@ -2088,7 +2119,9 @@ current buffer state and calls REPORT-FN when done."
     (when (process-live-p elisp-flymake--byte-compile-process)
       (kill-process elisp-flymake--byte-compile-process)))
   (let ((temp-file (make-temp-file "elisp-flymake-byte-compile"))
-        (source-buffer (current-buffer)))
+        (source-buffer (current-buffer))
+        (coding-system-for-write 'utf-8-unix)
+        (coding-system-for-read 'utf-8))
     (save-restriction
       (widen)
       (write-region (point-min) (point-max) temp-file nil 'nomessage))
@@ -2138,6 +2171,8 @@ Runs in a batch-mode Emacs.  Interactively use variable
   (interactive (list buffer-file-name))
   (let* ((file (or file
                    (car command-line-args-left)))
+         (coding-system-for-read 'utf-8-unix)
+         (coding-system-for-write 'utf-8)
          (byte-compile-log-buffer
           (generate-new-buffer " *dummy-byte-compile-log-buffer*"))
          (byte-compile-dest-file-function #'ignore)
diff --git a/lisp/progmodes/erts-mode.el b/lisp/progmodes/erts-mode.el
index 31a8bded8a..13da1d478d 100644
--- a/lisp/progmodes/erts-mode.el
+++ b/lisp/progmodes/erts-mode.el
@@ -51,25 +51,23 @@
      :foreground "blue")
     (t
      :bold t))
-  "Face used for displaying specificaton values."
+  "Face used for displaying specification values."
   :group 'erts-mode)
 
 (defface erts-mode-start-test
   '((t :inherit font-lock-keyword-face))
-  "Face used for displaying specificaton test start markers."
+  "Face used for displaying specification test start markers."
   :group 'erts-mode)
 
 (defface erts-mode-end-test
   '((t :inherit font-lock-comment-face))
-  "Face used for displaying specificaton test start markers."
+  "Face used for displaying specification test start markers."
   :group 'erts-mode)
 
-(defvar erts-mode-map
-  (let ((map (make-keymap)))
-    (set-keymap-parent map prog-mode-map)
-    (define-key map "\C-c\C-r" 'erts-tag-region)
-    (define-key map "\C-c\C-c" 'erts-run-test)
-    map))
+(defvar-keymap erts-mode-map
+  :parent prog-mode-map
+  "C-c C-r" #'erts-tag-region
+  "C-c C-c" #'erts-run-test)
 
 (defvar erts-mode-font-lock-keywords
   ;; Specifications.
diff --git a/lisp/progmodes/f90.el b/lisp/progmodes/f90.el
index 263cd0ef29..dcd74f0369 100644
--- a/lisp/progmodes/f90.el
+++ b/lisp/progmodes/f90.el
@@ -600,6 +600,7 @@ and variable-name parts, respectively."
   (append
    f90-font-lock-keywords-1
    (list
+    '("\\(&\\)[ \t]*\\(!\\|$\\)"  (1 font-lock-keyword-face))
     ;; Variable declarations (avoid the real function call).
     ;; NB by accident (?), this correctly fontifies the "integer" in:
     ;; integer () function foo ()
@@ -611,8 +612,8 @@ and variable-name parts, respectively."
     '("^[ \t0-9]*\\(?:pure\\|elemental\\)?[ \t]*\
 \\(real\\|integer\\|c\\(haracter\\|omplex\\)\\|\
 enumerator\\|generic\\|procedure\\|logical\\|double[ \t]*precision\\)\
-\\(.*::\\|[ \t]*(.*)\\)?\\([^&!\n]*\\)"
-      (1 font-lock-type-face t) (4 font-lock-variable-name-face t))
+\\(.*::\\|[ \t]*(.*)\\)?\\([^&!\n]*\\(?:&\n[^&!\n]*\\)*\\)"
+      (1 font-lock-type-face t) (4 font-lock-variable-name-face append))
     ;; Derived type/class variables.
     ;; TODO ? If we just highlighted the "type" part, rather than
     ;; "type(...)", this could be in the previous expression. And this
@@ -654,7 +655,6 @@ logical\\|double[ \t]*precision\\|type[ 
\t]*(\\(?:\\sw\\|\\s_\\)+)\\|none\\)[ \t
     '("\\_<\\(namelist\\|common\\)[ \t]*/\\(\\(?:\\sw\\|\\s_\\)+\\)?/"
       (1 font-lock-keyword-face) (2 font-lock-constant-face nil t))
     "\\_<else\\([ \t]*if\\|where\\)?\\_>"
-    '("\\(&\\)[ \t]*\\(!\\|$\\)"  (1 font-lock-keyword-face))
     "\\_<\\(then\\|continue\\|format\\|include\\|\\(?:error[ \t]+\\)?stop\\|\
 return\\)\\_>"
     '("\\_<\\(exit\\|cycle\\)[ \t]+\\(\\(?:\\sw\\|\\s_\\)+\\)?\\_>"
@@ -825,9 +825,7 @@ Can be overridden by the value of 
`font-lock-maximum-decoration'.")
          :style toggle :help "Expand abbreviations while typing in this 
buffer"]
         ["Add Imenu Menu" f90-add-imenu-menu
          :active   (not (lookup-key (current-local-map) [menu-bar index]))
-         :included (fboundp 'imenu-add-to-menubar)
-         :help "Add an index menu to the menu-bar"
-         ]))
+         :help "Add an index menu to the menu-bar"]))
     map)
   "Keymap used in F90 mode.")
 
diff --git a/lisp/progmodes/flymake-proc.el b/lisp/progmodes/flymake-proc.el
index eebfa70e34..4ab16831bc 100644
--- a/lisp/progmodes/flymake-proc.el
+++ b/lisp/progmodes/flymake-proc.el
@@ -903,7 +903,7 @@ can also be executed interactively independently of
 
 (defun flymake-proc--delete-temp-directory (dir-name)
   "Attempt to delete temp dir DIR-NAME, do not fail on error."
-  (let* ((temp-dir    temporary-file-directory)
+  (let* ((temp-dir    (file-truename temporary-file-directory))
         (suffix      (substring dir-name (1+ (length (directory-file-name 
temp-dir))))))
 
     (while (> (length suffix) 0)
diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index b5f4fff3c3..0b7958e52f 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -303,7 +303,7 @@ generated it."
 (defun flymake-error (text &rest args)
   "Format TEXT with ARGS and signal an error for Flymake."
   (let ((msg (apply #'format-message text args)))
-    (flymake-log :error msg)
+    (flymake-log :error "%s" msg)
     (error (concat "[Flymake] " msg))))
 
 (cl-defstruct (flymake--diag
@@ -1102,6 +1102,13 @@ The commands `flymake-goto-next-error' and
 `flymake-goto-prev-error' can be used to navigate among Flymake
 diagnostics annotated in the buffer.
 
+By default, `flymake-mode' doesn't override the \\[next-error] command, but
+if you're using Flymake a lot (and don't use the regular compilation
+mechanisms that often), it can be useful to put something like
+the following in your init file:
+
+  (setq next-error-function \\='flymake-goto-next-error)
+
 The visual appearance of each type of diagnostic can be changed
 by setting properties `flymake-overlay-control', `flymake-bitmap'
 and `flymake-severity' on the symbols of diagnostic types (like
diff --git a/lisp/progmodes/fortran.el b/lisp/progmodes/fortran.el
index 86f0be7320..786c5ae804 100644
--- a/lisp/progmodes/fortran.el
+++ b/lisp/progmodes/fortran.el
@@ -2213,7 +2213,6 @@ arg DO-SPACE prevents stripping the whitespace."
      :style toggle :help "Expand abbreviations while typing in this buffer"]
     ["Add Imenu Menu" imenu-add-menubar-index
      :active   (not (lookup-key (current-local-map) [menu-bar index]))
-     :included (fboundp 'imenu-add-to-menubar)
      :help "Add an index menu to the menu-bar"]))
 
 (provide 'fortran)
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 089c273bc6..79ef6101e9 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -105,6 +105,7 @@
 ;; at toplevel, so the compiler doesn't know under which circumstances
 ;; they're defined.
 (declare-function gud-until  "gud" (arg))
+(declare-function gud-go     "gud" (arg))
 (declare-function gud-print  "gud" (arg))
 (declare-function gud-down   "gud" (arg))
 (declare-function gud-up     "gud" (arg))
@@ -284,8 +285,8 @@ Possible values are:
   :type '(choice
           (const :tag "Always restore" t)
           (const :tag "Don't restore" nil)
-          (const :tag "Depends on `gdb-show-main'" 'if-gdb-show-main)
-          (const :tag "Depends on `gdb-many-windows'" 'if-gdb-many-windows))
+          (const :tag "Depends on `gdb-show-main'" if-gdb-show-main)
+          (const :tag "Depends on `gdb-many-windows'" if-gdb-many-windows))
   :group 'gdb
   :version "28.1")
 
@@ -955,12 +956,16 @@ detailed description of this mode.
                          (forward-char 2)
                          (gud-call "-exec-until *%a" arg)))
           "\C-u" "Continue to current line or address.")
-  ;; TODO Why arg here?
   (gud-def
-   gud-go (gud-call (if gdb-active-process
-                        (gdb-gud-context-command "-exec-continue")
-                      "-exec-run") arg)
-   nil "Start or continue execution.")
+   gud-go (progn
+            (when arg
+              (gud-call (concat "-exec-arguments "
+                                (read-string "Arguments to exec-run: "))))
+            (gud-call
+             (if gdb-active-process
+                 (gdb-gud-context-command "-exec-continue")
+               "-exec-run")))
+   "C-v" "Start or continue execution.  Use a prefix to specify arguments.")
 
   ;; For debugging Emacs only.
   (gud-def gud-pp
@@ -1139,7 +1144,8 @@ no input, and GDB is waiting for input."
       (setq name (nth 1 (split-string define "[( ]")))
       (push (cons name define) gdb-define-alist))))
 
-(declare-function tooltip-show "tooltip" (text &optional use-echo-area))
+(declare-function tooltip-show "tooltip" (text &optional use-echo-area
+                                               text-face default-face))
 
 (defconst gdb--string-regexp (rx "\""
                                  (* (or (seq "\\" nonl)
@@ -3081,6 +3087,45 @@ See `def-gdb-auto-update-handler'."
  'gdb-breakpoints-mode
  'gdb-invalidate-breakpoints)
 
+(defun gdb-breakpoints--add-breakpoint-row (tbl bkpt)
+  (let ((at (gdb-mi--field bkpt 'at))
+        (pending (gdb-mi--field bkpt 'pending))
+        (addr (gdb-mi--field bkpt 'addr))
+        (func (gdb-mi--field bkpt 'func))
+       (type (gdb-mi--field bkpt 'type)))
+    (if (and (not func) (string-equal addr "<MULTIPLE>"))
+        (setq func ""))
+    (gdb-table-add-row tbl
+                       (list
+                        (gdb-mi--field bkpt 'number)
+                        (or type "")
+                        (or (gdb-mi--field bkpt 'disp) "")
+                        (let ((flag (gdb-mi--field bkpt 'enabled)))
+                          (if (string-equal flag "y")
+                              (eval-when-compile
+                                (propertize "y" 'font-lock-face
+                                            font-lock-warning-face))
+                            (eval-when-compile
+                              (propertize "n" 'font-lock-face
+                                          font-lock-comment-face))))
+                        addr
+                        (or (gdb-mi--field bkpt 'times) "")
+                        (if (and type (string-match ".*watchpoint" type))
+                            (gdb-mi--field bkpt 'what)
+                          (or (and (equal func "") "")
+                              pending at
+                              (concat "in "
+                                      (propertize (or func "unknown")
+                                                  'font-lock-face
+                                                  font-lock-function-name-face)
+                                      (gdb-frame-location bkpt)))))
+                       ;; Add clickable properties only for
+                       ;; breakpoints with file:line information
+                       (append (list 'gdb-breakpoint bkpt)
+                               (when func
+                                 '(help-echo "mouse-2, RET: visit breakpoint"
+                                             mouse-face highlight))))))
+
 (defun gdb-breakpoints-list-handler-custom ()
   (let ((breakpoints-list (gdb-mi--field
                            (gdb-mi--field (gdb-mi--partial-output 'bkpt)
@@ -3093,37 +3138,14 @@ See `def-gdb-auto-update-handler'."
       (add-to-list 'gdb-breakpoints-list
                    (cons (gdb-mi--field breakpoint 'number)
                          breakpoint))
-      (let ((at (gdb-mi--field breakpoint 'at))
-            (pending (gdb-mi--field breakpoint 'pending))
-            (func (gdb-mi--field breakpoint 'func))
-           (type (gdb-mi--field breakpoint 'type)))
-        (gdb-table-add-row table
-                           (list
-                            (gdb-mi--field breakpoint 'number)
-                            (or type "")
-                            (or (gdb-mi--field breakpoint 'disp) "")
-                            (let ((flag (gdb-mi--field breakpoint 'enabled)))
-                              (if (string-equal flag "y")
-                                  (eval-when-compile
-                                    (propertize "y" 'font-lock-face
-                                                font-lock-warning-face))
-                                (eval-when-compile
-                                  (propertize "n" 'font-lock-face
-                                              font-lock-comment-face))))
-                            (gdb-mi--field breakpoint 'addr)
-                            (or (gdb-mi--field breakpoint 'times) "")
-                            (if (and type (string-match ".*watchpoint" type))
-                                (gdb-mi--field breakpoint 'what)
-                              (or pending at
-                                  (concat "in "
-                                          (propertize (or func "unknown")
-                                                      'font-lock-face 
font-lock-function-name-face)
-                                          (gdb-frame-location breakpoint)))))
-                           ;; Add clickable properties only for breakpoints 
with file:line
-                           ;; information
-                           (append (list 'gdb-breakpoint breakpoint)
-                                   (when func '(help-echo "mouse-2, RET: visit 
breakpoint"
-                                                mouse-face highlight))))))
+      ;; Add the breakpoint/header row to the table.
+      (gdb-breakpoints--add-breakpoint-row table breakpoint)
+      ;; If this breakpoint has multiple locations, add them as well.
+      (when-let ((locations (gdb-mi--field breakpoint 'locations)))
+        (dolist (loc locations)
+          (add-to-list 'gdb-breakpoints-list
+                       (cons (gdb-mi--field loc 'number) loc))
+          (gdb-breakpoints--add-breakpoint-row table loc))))
     (insert (gdb-table-string table " "))
     (gdb-place-breakpoints)))
 
diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el
index 7620536b4b..a3ef90f397 100644
--- a/lisp/progmodes/grep.el
+++ b/lisp/progmodes/grep.el
@@ -215,6 +215,7 @@ by `grep-compute-defaults'; to change the default value, use
     ("hh" .    "*.hxx *.hpp *.[Hh] *.HH *.h++")
     ("h" .     "*.h")
     ("l" .     "[Cc]hange[Ll]og*")
+    ("am" .    "Makefile.am GNUmakefile *.mk")
     ("m" .     "[Mm]akefile*")
     ("tex" .   "*.tex")
     ("texi" .  "*.texi")
@@ -1065,15 +1066,18 @@ REGEXP is used as a string in the prompt."
               default-extension
               (car grep-files-history)
               (car (car grep-files-aliases))))
+        (defaults
+          (delete-dups
+           (delq nil
+                 (append (list default default-alias default-extension)
+                         (mapcar #'car grep-files-aliases)))))
          (files (completing-read
                  (format-prompt "Search for \"%s\" in files matching wildcard"
                                 default regexp)
-                #'read-file-name-internal
-                nil nil nil 'grep-files-history
-                (delete-dups
-                 (delq nil
-                        (append (list default default-alias default-extension)
-                               (mapcar #'car grep-files-aliases)))))))
+                 (completion-table-merge
+                  (lambda (_string _pred _action) defaults)
+                  #'read-file-name-internal)
+                nil nil nil 'grep-files-history defaults)))
     (and files
         (or (cdr (assoc files grep-files-aliases))
             files))))
@@ -1204,7 +1208,11 @@ When called programmatically and FILES is nil, REGEXP is 
expected
 to specify a command to run.
 
 If CONFIRM is non-nil, the user will be given an opportunity to edit the
-command before it's run."
+command before it's run.
+
+Interactively, the user can use the `M-c' command while entering
+the regexp to indicate whether the grep should be case sensitive
+or not."
   (interactive
    (progn
      (grep-compute-defaults)
@@ -1232,7 +1240,8 @@ command before it's run."
                                   grep-find-command)))
            (compilation-start regexp #'grep-mode))
       (setq dir (file-name-as-directory (expand-file-name dir)))
-      (let ((command (rgrep-default-command regexp files nil)))
+      (let* ((case-fold-search (read-regexp-case-fold-search regexp))
+             (command (rgrep-default-command regexp files nil)))
        (when command
          (if confirm
              (setq command
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index 7092ca2041..26fecf9c9f 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -54,8 +54,8 @@
 (declare-function gdb-tooltip-print-1 "gdb-mi" (expr))
 (declare-function gud-pp "gdb-mi" (arg))
 (declare-function gdb-var-delete "gdb-mi" ())
-(declare-function speedbar-toggle-line-expansion "gud" ())
-(declare-function speedbar-edit-line "gud" ())
+(declare-function speedbar-toggle-line-expansion "speedbar" ())
+(declare-function speedbar-edit-line "speedbar" ())
 ;; FIXME: The declares below are necessary because we don't call `gud-def'
 ;; at toplevel, so the compiler doesn't know under which circumstances
 ;; they're defined.
@@ -2460,7 +2460,7 @@ during jdb initialization depending on the value of
   ;;  not supported/followed)
   (if (and gud-jdb-use-classpath
           (not gud-jdb-classpath-string)
-          (or (string-match "classpath:[ \t[]+\\([^]]+\\)" gud-marker-acc)
+          (or (string-match "classpath:[ \t[]+\\([^]]*\\)" gud-marker-acc)
               (string-match "-classpath[ \t\"]+\\([^ \"]+\\)" gud-marker-acc)))
       (setq gud-jdb-classpath
            (gud-jdb-parse-classpath-string
diff --git a/lisp/progmodes/icon.el b/lisp/progmodes/icon.el
index e1ee9efc54..ec281f3a49 100644
--- a/lisp/progmodes/icon.el
+++ b/lisp/progmodes/icon.el
@@ -31,17 +31,16 @@
   "Abbrev table in use in Icon-mode buffers.")
 (define-abbrev-table 'icon-mode-abbrev-table ())
 
-(defvar icon-mode-map
-  (let ((map (make-sparse-keymap "Icon")))
-    (define-key map "{" 'electric-icon-brace)
-    (define-key map "}" 'electric-icon-brace)
-    (define-key map "\e\C-h" 'mark-icon-function)
-    (define-key map "\e\C-a" 'beginning-of-icon-defun)
-    (define-key map "\e\C-e" 'end-of-icon-defun)
-    (define-key map "\e\C-q" 'indent-icon-exp)
-    (define-key map "\177" 'backward-delete-char-untabify)
-    map)
-  "Keymap used in Icon mode.")
+(defvar-keymap icon-mode-map
+  :doc "Keymap used in Icon mode."
+  :name "Icon"
+  "{"     #'electric-icon-brace
+  "}"     #'electric-icon-brace
+  "C-M-h" #'mark-icon-function
+  "C-M-a" #'beginning-of-icon-defun
+  "C-M-e" #'end-of-icon-defun
+  "C-M-q" #'indent-icon-exp
+  "DEL"   #'backward-delete-char-untabify)
 
 (easy-menu-define icon-mode-menu icon-mode-map
   "Menu for Icon mode."
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index e3985db64a..edb53793e6 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -1353,7 +1353,7 @@ the leftover unidentified statements containing an equal 
sign.")
 ;; Note that this is documented in the v18 manuals as being a string
 ;; of length one rather than a single character.
 ;; The code in this file accepts either format for compatibility.
-(defvar idlwave-comment-indent-char ?\
+(defvar idlwave-comment-indent-char ?\s
   "Character to be inserted for IDL comment indentation.
 Normally a space.")
 
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 9c1358e466..eb2a1e4fcc 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -660,13 +660,11 @@ This variable is like `sgml-attribute-offset'."
   :type 'integer
   :safe 'integerp)
 
-;;; KeyMap
+;;; Keymap
 
-(defvar js-mode-map
-  (let ((keymap (make-sparse-keymap)))
-    (define-key keymap [(meta ?.)] #'js-find-symbol)
-    keymap)
-  "Keymap for `js-mode'.")
+(defvar-keymap js-mode-map
+  :doc "Keymap for `js-mode'."
+  "M-." #'js-find-symbol)
 
 ;;; Syntax table and parsing
 
diff --git a/lisp/progmodes/m4-mode.el b/lisp/progmodes/m4-mode.el
index b9fcd033bb..a18c8bcce4 100644
--- a/lisp/progmodes/m4-mode.el
+++ b/lisp/progmodes/m4-mode.el
@@ -121,13 +121,11 @@ If m4 is not in your PATH, set this to an absolute file 
name."
    ("#" (0 (when (m4--quoted-p (match-beginning 0))
              (string-to-syntax "."))))))
 
-(defvar m4-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "\C-c\C-b" 'm4-m4-buffer)
-    (define-key map "\C-c\C-r" 'm4-m4-region)
-    (define-key map "\C-c\C-c" 'comment-region)
-    map)
-  "Keymap for M4 Mode.")
+(defvar-keymap m4-mode-map
+  :doc "Keymap for M4 Mode."
+  "C-c C-b" #'m4-m4-buffer
+  "C-c C-r" #'m4-m4-region
+  "C-c C-c" #'comment-region)
 
 (easy-menu-define m4-mode-menu m4-mode-map
   "Menu for M4 Mode."
diff --git a/lisp/progmodes/make-mode.el b/lisp/progmodes/make-mode.el
index 1a1dc3aee9..91307f6c09 100644
--- a/lisp/progmodes/make-mode.el
+++ b/lisp/progmodes/make-mode.el
@@ -889,7 +889,7 @@ Makefile mode can be configured by modifying the following 
variables:
   (setq-local comment-start-skip "#+[ \t]*")
 
   ;; Make sure TAB really inserts \t.
-  (setq-local indent-line-function #'insert-tab)
+  (setq-local indent-line-function 'indent-to-left-margin)
 
   ;; Real TABs are important in makefiles
   (setq indent-tabs-mode t))
diff --git a/lisp/progmodes/mixal-mode.el b/lisp/progmodes/mixal-mode.el
index 97a218fcfa..9d1ceaa55a 100644
--- a/lisp/progmodes/mixal-mode.el
+++ b/lisp/progmodes/mixal-mode.el
@@ -78,16 +78,13 @@
 ;;; Code:
 (defvar compile-command)
 
-;;; Key map
-(defvar mixal-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "\C-c\C-c" 'compile)
-    (define-key map "\C-c\C-r" 'mixal-run)
-    (define-key map "\C-c\C-d" 'mixal-debug)
-    (define-key map "\C-h\C-o" 'mixal-describe-operation-code)
-    map)
-  "Keymap for `mixal-mode'.")
-;; (makunbound 'mixal-mode-map)
+;;; Keymap
+(defvar-keymap mixal-mode-map
+  :doc "Keymap for `mixal-mode'."
+  "C-c C-c" #'compile
+  "C-c C-r" #'mixal-run
+  "C-c C-d" #'mixal-debug
+  "C-h C-o" #'mixal-describe-operation-code)
 
 ;;; Syntax table
 (defvar mixal-mode-syntax-table
diff --git a/lisp/progmodes/pascal.el b/lisp/progmodes/pascal.el
index 8dc03b72b1..351ea6e3a9 100644
--- a/lisp/progmodes/pascal.el
+++ b/lisp/progmodes/pascal.el
@@ -47,8 +47,8 @@
 ;;                                  "reset" "rewrite" "write" "writeln")
 ;;       pascal-separator-keywords '("downto" "else" "mod" "div" "then"))
 
-;; KNOWN BUGS / BUGREPORTS
-;; =======================
+;; KNOWN BUGS / BUG REPORTS
+;; ========================
 ;; As far as I know, there are no bugs in the current version of this
 ;; package.  This may not be true however, since I never use this mode
 ;; myself and therefore would never notice them anyway.   If you do
@@ -1382,8 +1382,6 @@ The default is a name found in the buffer around point."
 ;;;
 (defvar pascal-outline-map
   (let ((map (make-sparse-keymap)))
-    (if (fboundp 'set-keymap-name)
-        (set-keymap-name map 'pascal-outline-map))
     (define-key map "\M-\C-a"  'pascal-outline-prev-defun)
     (define-key map "\M-\C-e"  'pascal-outline-next-defun)
     (define-key map "\C-c\C-d" 'pascal-outline-goto-defun)
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 6c50135358..f4d6742ed8 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -382,6 +382,12 @@ you might have to restart Emacs to see the effect."
   :package-version '(project . "0.2.0")
   :safe #'booleanp)
 
+(defcustom project-vc-include-untracked t
+  "When non-nil, the VC project backend includes untracked files."
+  :type 'boolean
+  :version "29.1"
+  :safe #'booleanp)
+
 ;; FIXME: Using the current approach, major modes are supposed to set
 ;; this variable to a buffer-local value.  So we don't have access to
 ;; the "external roots" of language A from buffers of language B, which
@@ -512,8 +518,9 @@ backend implementation of `project-external-roots'.")
            (args '("-z"))
            (vc-git-use-literal-pathspecs nil)
            files)
-       ;; Include unregistered.
-       (setq args (append args '("-c" "-o" "--exclude-standard")))
+       (setq args (append args
+                          '("-c" "--exclude-standard")
+                          (and project-vc-include-untracked '("-o"))))
        (when extra-ignores
          (setq args (append args
                             (cons "--"
@@ -565,9 +572,9 @@ backend implementation of `project-external-roots'.")
        (delete-consecutive-dups files)))
     (`Hg
      (let ((default-directory (expand-file-name (file-name-as-directory dir)))
-           args)
-       ;; Include unregistered.
-       (setq args (nconc args '("-mcardu" "--no-status" "-0")))
+           (args (list (concat "-mcard" (and project-vc-include-untracked "u"))
+                       "--no-status"
+                       "-0")))
        (when extra-ignores
          (setq args (nconc args
                            (mapcan
@@ -592,7 +599,7 @@ backend implementation of `project-external-roots'.")
         (insert-file-contents ".gitmodules")
         (let (res)
           (goto-char (point-min))
-          (while (re-search-forward "path *= *\\(.+\\)" nil t)
+          (while (re-search-forward "^[ \t]*path *= *\\(.+\\)" nil t)
             (push (match-string 1) res))
           (nreverse res)))
     (file-missing nil)))
@@ -863,8 +870,12 @@ interactively, include all files under the project root, 
except
 for VCS directories listed in `vc-directory-exclusion-list'."
   (interactive "P")
   (let* ((pr (project-current t))
-         (dirs (list (project-root pr))))
-    (project-find-file-in (thing-at-point 'filename) dirs pr include-all)))
+         (root (project-root pr))
+         (dirs (list root)))
+    (project-find-file-in
+     (or (thing-at-point 'filename)
+         (and buffer-file-name (file-relative-name buffer-file-name root)))
+     dirs pr include-all)))
 
 ;;;###autoload
 (defun project-or-external-find-file (&optional include-all)
@@ -955,7 +966,7 @@ directories listed in `vc-directory-exclusion-list'."
             (project-files project dirs)))
          (completion-ignore-case read-file-name-completion-ignore-case)
          (file (funcall project-read-file-name-function
-                        "Find file" all-files nil nil
+                        "Find file" all-files nil 'file-name-history
                         suggested-filename)))
     (if (string= file "")
         (user-error "You didn't specify the file")
@@ -992,7 +1003,7 @@ directories listed in `vc-directory-exclusion-list'."
                        "Dired"
                        ;; Some completion UIs show duplicates.
                        (delete-dups all-dirs)
-                       nil nil)))
+                       nil 'file-name-history)))
     (dired dir)))
 
 ;;;###autoload
@@ -1088,7 +1099,12 @@ If you exit the `query-replace', you can later continue 
the
                   (query-replace-read-args "Query replace (regexp)" t t)))
        (list from to))))
   (fileloop-initialize-replace
-   from to (project-files (project-current t)) 'default)
+   from to
+   ;; XXX: Filter out Git submodules, which are not regular files.
+   ;; `project-files' can return those, which is arguably suboptimal,
+   ;; but removing them eagerly has performance cost.
+   (cl-delete-if-not #'file-regular-p (project-files (project-current t)))
+   'default)
   (fileloop-continue))
 
 (defvar compilation-read-command)
diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el
index 8382c4bd09..9598209f5e 100644
--- a/lisp/progmodes/prolog.el
+++ b/lisp/progmodes/prolog.el
@@ -1355,8 +1355,6 @@ the variable `prolog-prompt-regexp'."
         (error "This Prolog system has defined no interpreter"))
     (unless (comint-check-proc "*prolog*")
       (with-current-buffer (get-buffer-create "*prolog*")
-        (prolog-inferior-mode)
-
         ;; The "INFERIOR=yes" hack is for SWI-Prolog 7.2.3 and earlier,
         ;; which assumes it is running under Emacs if either INFERIOR=yes or
         ;; if EMACS is set to a nonempty value.  The EMACS setting is
@@ -1369,6 +1367,7 @@ the variable `prolog-prompt-regexp'."
                 (cons "INFERIOR=yes" process-environment))))
          (apply 'make-comint-in-buffer "prolog" (current-buffer)
                 pname nil pswitches))
+        (prolog-inferior-mode)
 
         (unless prolog-system
           ;; Setup auto-detection.
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 11ed732d28..c2483436fe 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -359,9 +359,12 @@
 (defmacro python-rx (&rest regexps)
   "Python mode specialized rx macro.
 This variant of `rx' supports common Python named REGEXPS."
-  `(rx-let ((block-start       (seq symbol-start
+  `(rx-let ((sp-bsnl (or space (and ?\\ ?\n)))
+            (block-start       (seq symbol-start
                                     (or "def" "class" "if" "elif" "else" "try"
                                         "except" "finally" "for" "while" "with"
+                                        ;; Python 3.10+ PEP634
+                                        "match" "case"
                                         ;; Python 3.5+ PEP492
                                         (and "async" (+ space)
                                              (or "def" "for" "with")))
@@ -394,7 +397,7 @@ This variant of `rx' supports common Python named REGEXPS."
             (open-paren        (or "{" "[" "("))
             (close-paren       (or "}" "]" ")"))
             (simple-operator   (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%))
-            (not-simple-operator (not simple-operator))
+            (not-simple-operator (not (or simple-operator ?\n)))
             (operator          (or "==" ">=" "is" "not"
                                    "**" "//" "<<" ">>" "<=" "!="
                                    "+" "-" "/" "&" "^" "~" "|" "*" "<" ">"
@@ -538,9 +541,9 @@ the {...} holes that appear within f-strings."
         (setq ppss (syntax-ppss))))))
 
 (defvar python-font-lock-keywords-level-1
-  `((,(rx symbol-start "def" (1+ space) (group (1+ (or word ?_))))
+  `((,(python-rx symbol-start "def" (1+ space) (group symbol-name))
      (1 font-lock-function-name-face))
-    (,(rx symbol-start "class" (1+ space) (group (1+ (or word ?_))))
+    (,(python-rx symbol-start "class" (1+ space) (group symbol-name))
      (1 font-lock-type-face)))
   "Font lock keywords to use in `python-mode' for level 1 decoration.
 
@@ -603,15 +606,18 @@ builtins.")
 
 (defun python-font-lock-assignment-matcher (regexp)
   "Font lock matcher for assignments based on REGEXP.
-Return nil if REGEXP matched within a `paren' context (to avoid,
-e.g., default values for arguments or passing arguments by name
-being treated as assignments) or is followed by an '=' sign (to
-avoid '==' being treated as an assignment."
+Search for next occurrence if REGEXP matched within a `paren'
+context (to avoid, e.g., default values for arguments or passing
+arguments by name being treated as assignments) or is followed by
+an '=' sign (to avoid '==' being treated as an assignment.  Set
+point to the position one character before the end of the
+occurrence found so that subsequent searches can detect the '='
+sign in chained assignment."
   (lambda (limit)
-    (let ((res (re-search-forward regexp limit t)))
-      (unless (or (python-syntax-context 'paren)
-                  (equal (char-after (point)) ?=))
-        res))))
+    (cl-loop while (re-search-forward regexp limit t)
+             unless (or (python-syntax-context 'paren)
+                        (equal (char-after) ?=))
+               return (progn (backward-char) t))))
 
 (defvar python-font-lock-keywords-maximum-decoration
   `((python--font-lock-f-strings)
@@ -673,7 +679,7 @@ avoid '==' being treated as an assignment."
     ;; and variants thereof
     ;; the cases
     ;;   (a) = 5
-    ;;   [a] = 5
+    ;;   [a] = 5,
     ;;   [*a] = 5, 6
     ;; are handled separately below
     (,(python-font-lock-assignment-matcher
@@ -703,10 +709,10 @@ avoid '==' being treated as an assignment."
      (1 font-lock-variable-name-face))
     ;; special cases
     ;;   (a) = 5
-    ;;   [a] = 5
+    ;;   [a] = 5,
     ;;   [*a] = 5, 6
     (,(python-font-lock-assignment-matcher
-       (python-rx (or line-start ?\;) (* space)
+       (python-rx (or line-start ?\; ?=) (* space)
                   (or "[" "(") (* space)
                   grouped-assignment-target (* space)
                   (or ")" "]") (* space)
@@ -1297,7 +1303,7 @@ Called from a program, START and END specify the region 
to indent."
                    ;; Don't mess with strings, unless it's the
                    ;; enclosing set of quotes or a docstring.
                    (or (not (python-syntax-context 'string))
-                       (eq
+                       (equal
                         (syntax-after
                          (+ (1- (point))
                             (current-indentation)
@@ -1434,7 +1440,7 @@ marks the next defun after the ones already marked."
                  function))
 
 (defvar python-nav-beginning-of-defun-regexp
-  (python-rx line-start (* space) defun (+ space) (group symbol-name))
+  (python-rx line-start (* space) defun (+ sp-bsnl) (group symbol-name))
   "Regexp matching class or function definition.
 The name of the defun should be grouped so it can be retrieved
 via `match-string'.")
@@ -2646,6 +2652,7 @@ banner and the initial prompt are received separately."
 (defun python-comint-postoutput-scroll-to-bottom (output)
   "Faster version of `comint-postoutput-scroll-to-bottom'.
 Avoids `recenter' calls until OUTPUT is completely sent."
+  (declare (obsolete nil "29.1")) ; Not used.
   (when (and (not (string= "" output))
              (python-shell-comint-end-of-output-p
               (ansi-color-filter-apply output)))
@@ -2951,11 +2958,11 @@ variable.
   (setq-local comint-output-filter-functions
               '(ansi-color-process-output
                 python-shell-comint-watch-for-first-prompt-output-filter
-                python-comint-postoutput-scroll-to-bottom
                 comint-watch-for-password-prompt))
   (setq-local comint-highlight-input nil)
   (setq-local compilation-error-regexp-alist
               python-shell-compilation-regexp-alist)
+  (setq-local scroll-conservatively 1)
   (add-hook 'completion-at-point-functions
             #'python-shell-completion-at-point nil 'local)
   (define-key inferior-python-mode-map "\t"
diff --git a/lisp/progmodes/scheme.el b/lisp/progmodes/scheme.el
index cd397733d2..9b24c2155d 100644
--- a/lisp/progmodes/scheme.el
+++ b/lisp/progmodes/scheme.el
@@ -1,7 +1,6 @@
 ;;; scheme.el --- Scheme (and DSSSL) editing mode    -*- lexical-binding: t; 
-*-
 
-;; Copyright (C) 1986-1988, 1997-1998, 2001-2022 Free Software
-;; Foundation, Inc.
+;; Copyright (C) 1986-2022 Free Software Foundation, Inc.
 
 ;; Author: Bill Rozas <jinx@martigny.ai.mit.edu>
 ;; Adapted-by: Dave Love <d.love@dl.ac.uk>
@@ -201,12 +200,10 @@
 
 (defvar scheme-mode-line-process "")
 
-(defvar scheme-mode-map
-  (let ((map (make-sparse-keymap)))
-    (set-keymap-parent map lisp-mode-shared-map)
-    map)
-  "Keymap for Scheme mode.
-All commands in `lisp-mode-shared-map' are inherited by this map.")
+(defvar-keymap scheme-mode-map
+  :doc "Keymap for Scheme mode.
+All commands in `lisp-mode-shared-map' are inherited by this map."
+  :parent lisp-mode-shared-map)
 
 (easy-menu-define scheme-mode-menu scheme-mode-map
   "Menu for Scheme mode."
@@ -590,7 +587,7 @@ indentation."
 (put 'sequence 'scheme-indent-function 0) ; SICP, not r4rs
 (put 'let-syntax 'scheme-indent-function 1)
 (put 'letrec-syntax 'scheme-indent-function 1)
-(put 'syntax-rules 'scheme-indent-function 1)
+(put 'syntax-rules 'scheme-indent-function 'defun)
 (put 'syntax-case 'scheme-indent-function 2) ; not r5rs
 (put 'with-syntax 'scheme-indent-function 1)
 (put 'library 'scheme-indent-function 1) ; R6RS
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index 9151fd0a34..75758fd39a 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -286,7 +286,7 @@ naming the shell."
   :group 'sh-script)
 
 (defcustom sh-imenu-generic-expression
-  '((sh
+  `((sh
      . ((nil
         ;; function FOO
         ;; function FOO()
@@ -295,8 +295,21 @@ naming the shell."
        ;; FOO()
        (nil
         "^\\s-*\\([[:alpha:]_][[:alnum:]_]*\\)\\s-*()"
-        1)
-       )))
+        1)))
+    (mksh
+     . ((nil
+         ;; function FOO
+         ;; function FOO()
+         ,(rx bol (* (syntax whitespace)) "function" (+ (syntax whitespace))
+              (group (1+ (not (any "\0\t\n \"$&'();<=>\\`|#*?[]/"))))
+              (* (syntax whitespace)) (? "()"))
+         1)
+        (nil
+         ;; FOO()
+         ,(rx bol (* (syntax whitespace))
+              (group (1+ (not (any "\0\t\n \"$&'();<=>\\`|#*?[]/"))))
+              (* (syntax whitespace)) "()")
+         1))))
   "Alist of regular expressions for recognizing shell function definitions.
 See `sh-feature' and `imenu-generic-expression'."
   :type '(alist :key-type (symbol :tag "Shell")
@@ -306,7 +319,7 @@ See `sh-feature' and `imenu-generic-expression'."
                                   :value-type
                                   (repeat :tag "Regexp, index..." sexp)))
   :group 'sh-script
-  :version "20.4")
+  :version "29.1")
 
 (defun sh-current-defun-name ()
   "Find the name of function or variable at point.
@@ -641,7 +654,12 @@ implemented as aliases.  See `sh-feature'."
   :version "24.4"                       ; bash4 additions
   :group 'sh-script)
 
-
+(defcustom sh-indent-statement-after-and t
+  "How to indent statements following && in Shell-Script mode.
+If t, indent to align with &&.
+If nil, indent to align with the previous line's indentation."
+  :type 'boolean
+  :version "29.1")
 
 (defcustom sh-leading-keywords
   '((bash sh-append sh
@@ -1410,7 +1428,7 @@ If FORCE is non-nil and no process found, create one."
   (pop-to-buffer (process-buffer (sh-shell-process t)) 
display-comint-buffer-action))
 
 (defun sh-send-text (text)
-  "Send the text to the `sh-shell-process'."
+  "Send TEXT to `sh-shell-process'."
   (comint-send-string (sh-shell-process t) (concat text "\n")))
 
 (defun sh-cd-here ()
@@ -1538,6 +1556,11 @@ with your script for an edit-interpret-debug cycle."
   (add-hook 'completion-at-point-functions
             #'sh-completion-at-point-function nil t)
   (setq-local outline-regexp "###")
+  (setq-local escaped-string-quote
+              (lambda (terminator)
+                (if (eq terminator ?')
+                    "'\\'"
+                  "\\")))
   ;; Parse or insert magic number for exec, and set all variables depending
   ;; on the shell thus determined.
   (sh-set-shell
@@ -1990,7 +2013,9 @@ May return nil if the line should not be treated as 
continued."
                  (current-column)
                (smie-indent-calculate)))))
     (`(:before . ,(or "|" "&&" "||"))
-     (unless (smie-rule-parent-p token)
+     (when (and (not (smie-rule-parent-p token))
+                (or (not (equal token "&&"))
+                    sh-indent-statement-after-and))
        (smie-backward-sexp token)
        `(column . ,(+ (funcall smie-rules-function :elem 'basic)
                       (smie-indent-virtual)))))
diff --git a/lisp/progmodes/sql.el b/lisp/progmodes/sql.el
index 979b743a65..8d25986090 100644
--- a/lisp/progmodes/sql.el
+++ b/lisp/progmodes/sql.el
@@ -4159,6 +4159,7 @@ must tell Emacs.  Here's how to do that in your init file:
   (setq-local abbrev-all-caps 1)
   ;; Contains the name of database objects
   (setq-local sql-contains-names t)
+  (setq-local escaped-string-quote "'")
   (setq-local syntax-propertize-function
               (syntax-propertize-rules
                ;; Handle escaped apostrophes within strings.
@@ -4179,7 +4180,7 @@ must tell Emacs.  Here's how to do that in your init file:
                      ;; start a comment.
                     (string-to-syntax ".")
                    ;; Inside a comment, ignore it to avoid -*/ not
-                   ;; being intepreted as a comment end.
+                   ;; being interpreted as a comment end.
                    (forward-char -1)
                    nil)))))
   ;; Set syntax and font-face highlighting
diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el
index cdc8aeb176..39c5eb453b 100644
--- a/lisp/progmodes/vhdl-mode.el
+++ b/lisp/progmodes/vhdl-mode.el
@@ -153,7 +153,11 @@
 (defvar lazy-lock-defer-on-scrolling)
 (defvar lazy-lock-defer-on-the-fly)
 (defvar speedbar-attached-frame)
-
+(defvar arch-alist)
+(defvar pack-alist)
+(defvar file-alist)
+(defvar unit-alist)
+(defvar rule-alist)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Variables
@@ -14952,10 +14956,10 @@ otherwise use cached data."
   (vhdl-speedbar-expand-units directory)
   (vhdl-aput 'vhdl-directory-alist directory (list (list directory))))
 
-(defun vhdl-speedbar-insert-hierarchy ( ent-alist-arg conf-alist-arg pack-alist
-                                       ent-inst-list depth)
-  "Insert hierarchy of ENT-ALIST, CONF-ALIST, and PACK-ALIST."
-  (if (not (or ent-alist conf-alist pack-alist))
+(defun vhdl-speedbar-insert-hierarchy ( ent-alist-arg conf-alist-arg
+                                        package-alist ent-inst-list depth)
+  "Insert hierarchy of ENT-ALIST, CONF-ALIST, and PACKAGE-ALIST."
+  (if (not (or ent-alist conf-alist package-alist))
       (vhdl-speedbar-make-title-line "No VHDL design units!" depth)
     (let ((ent-alist ent-alist-arg)
           (conf-alist conf-alist-arg)
@@ -14985,15 +14989,15 @@ otherwise use cached data."
         'vhdl-speedbar-configuration-face depth)
        (setq conf-alist (cdr conf-alist)))
       ;; insert packages
-      (when pack-alist (vhdl-speedbar-make-title-line "Packages:" depth))
-      (while pack-alist
-       (setq pack-entry (car pack-alist))
+      (when package-alist (vhdl-speedbar-make-title-line "Packages:" depth))
+      (while package-alist
+       (setq pack-entry (car package-alist))
        (vhdl-speedbar-make-pack-line
         (nth 0 pack-entry) (nth 1 pack-entry)
         (cons (nth 2 pack-entry) (nth 3 pack-entry))
         (cons (nth 7 pack-entry) (nth 8 pack-entry))
         depth)
-       (setq pack-alist (cdr pack-alist))))))
+       (setq package-alist (cdr package-alist))))))
 
 (declare-function speedbar-line-directory "speedbar" (&optional depth))
 
@@ -17212,6 +17216,7 @@ specified by a target."
       (unless (or (assoc directory vhdl-file-alist)
                  (vhdl-load-cache directory))
        (vhdl-scan-directory-contents directory))))
+  (defvar rule-alist) ; we need it to be dynamically bound
   (let* ((directory (abbreviate-file-name (vhdl-default-directory)))
         (project (vhdl-project-p))
         (ent-alist (vhdl-aget vhdl-entity-alist (or project directory)))
diff --git a/lisp/progmodes/which-func.el b/lisp/progmodes/which-func.el
index abe25f2c63..3c8d4f43db 100644
--- a/lisp/progmodes/which-func.el
+++ b/lisp/progmodes/which-func.el
@@ -64,7 +64,7 @@
 ;; Variables for customization
 ;; ---------------------------
 ;;
-(defvar which-func-unknown "???"
+(defvar which-func-unknown "n/a"
   "String to display in the mode line when current function is unknown.")
 
 (defgroup which-func nil
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 6e763eef01..683589d71c 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -1549,7 +1549,7 @@ This command is intended to be bound to a mouse event."
           (xref-find-references identifier))
       (user-error "No identifier here"))))
 
-(declare-function apropos-parse-pattern "apropos" (pattern))
+(declare-function apropos-parse-pattern "apropos" (pattern &optional do-all))
 
 ;;;###autoload
 (defun xref-find-apropos (pattern)
diff --git a/lisp/rect.el b/lisp/rect.el
index 15d636f074..e717d2ac7e 100644
--- a/lisp/rect.el
+++ b/lisp/rect.el
@@ -656,6 +656,8 @@ on.  Only lasts until the region is next deactivated."
   :lighter nil
   (rectangle--reset-crutches)
   (when rectangle-mark-mode
+    (advice-add 'region-beginning :around #'rectangle--region-beginning)
+    (advice-add 'region-end :around #'rectangle--region-end)
     (add-hook 'deactivate-mark-hook
               (lambda () (rectangle-mark-mode -1)))
     (unless (region-active-p)
@@ -754,17 +756,38 @@ Ignores `line-move-visual'."
     (rectangle--col-pos col 'point)))
 
 
+(defun rectangle--region-beginning (orig)
+  "Like `region-beginning' but supports rectangular regions."
+  (cond
+   ((not rectangle-mark-mode)
+    (funcall orig))
+   (t
+    (apply #'min (mapcar #'car (region-bounds))))))
+
+(defun rectangle--region-end (orig)
+  "Like `region-end' but supports rectangular regions."
+  (cond
+   ((not rectangle-mark-mode)
+    (funcall orig))
+   (t
+    (apply #'max (mapcar #'cdr (region-bounds))))))
+
 (defun rectangle--extract-region (orig &optional delete)
   (cond
    ((not rectangle-mark-mode)
     (funcall orig delete))
    ((eq delete 'bounds)
-    (extract-rectangle-bounds (region-beginning) (region-end)))
+    (extract-rectangle-bounds
+     ;; Avoid recursive calls from advice
+     (let (rectangle-mark-mode) (region-beginning))
+     (let (rectangle-mark-mode) (region-end))))
    (t
     (let* ((strs (funcall (if delete
                               #'delete-extract-rectangle
                             #'extract-rectangle)
-                          (region-beginning) (region-end)))
+                          ;; Avoid recursive calls from advice
+                          (let (rectangle-mark-mode) (region-beginning))
+                          (let (rectangle-mark-mode) (region-end))))
            (str (mapconcat #'identity strs "\n")))
       (when (eq last-command 'kill-region)
         ;; Try to prevent kill-region from appending this to some
diff --git a/lisp/repeat.el b/lisp/repeat.el
index aaccc22784..ea4e3d0bd8 100644
--- a/lisp/repeat.el
+++ b/lisp/repeat.el
@@ -176,7 +176,7 @@ that variable on the theory they're doing more good than 
harm; `repeat' does
 that, and usually does do more good than harm.  However, like all do-gooders,
 sometimes `repeat' gets surprising results from its altruism.  The value of
 this function is always whether the value of `this-command' would've been
-'repeat if `repeat' hadn't modified it."
+`repeat' if `repeat' hadn't modified it."
   (= repeat-num-input-keys-at-repeat num-input-keys))
 
 ;; An example of the use of (repeat-is-really-this-command) may still be
diff --git a/lisp/replace.el b/lisp/replace.el
index 81282deb14..c5c24c7a36 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -928,7 +928,13 @@ If the first element of DEFAULTS is non-nil (and if PROMPT 
does not end
 in \":\", followed by optional whitespace), DEFAULT is added to the prompt.
 
 The optional argument HISTORY is a symbol to use for the history list.
-If nil, use `regexp-history'."
+If nil, use `regexp-history'.
+
+If the user has used the `M-c' command to specify case
+sensitivity, the returned string will have a text property named
+`case-fold' that has a value of either `fold' or
+`inhibit-fold'.  (It's up to the caller of `read-regexp' to
+respect this or not; see `read-regexp-case-fold-search'.)"
   (let* ((defaults
           (if (and defaults (symbolp defaults))
               (cond
@@ -944,21 +950,51 @@ If nil, use `regexp-history'."
         (suggestions (delete-dups (delq nil (delete "" suggestions))))
         ;; Do not automatically add default to the history for empty input.
         (history-add-new-input nil)
+         (case-fold case-fold-search)
         (input (read-from-minibuffer
                  (if (string-match-p ":[ \t]*\\'" prompt)
                      prompt
                    (format-prompt prompt (and (length> default 0)
                                               (query-replace-descr default))))
-                nil nil nil (or history 'regexp-history) suggestions t)))
-    (if (equal input "")
-       ;; Return the default value when the user enters empty input.
-       (prog1 (or default input)
-         (when default
-           (add-to-history (or history 'regexp-history) default)))
-      ;; Otherwise, add non-empty input to the history and return input.
-      (prog1 input
-       (add-to-history (or history 'regexp-history) input)))))
-
+                nil
+                 (define-keymap
+                   :parent minibuffer-local-map
+                   "M-c" (lambda ()
+                           (interactive)
+                           (setq case-fold
+                                 (if (or (eq case-fold 'fold)
+                                         (and case-fold
+                                              (not (eq case-fold
+                                                       'inhibit-fold))))
+                                     'inhibit-fold
+                                   'fold))
+                           (minibuffer-message
+                            "Case folding is now %s"
+                            (if (eq case-fold 'fold)
+                                "on"
+                              "off"))))
+                 nil (or history 'regexp-history) suggestions t))
+         (result (if (equal input "")
+                    ;; Return the default value when the user enters
+                    ;; empty input.
+                     default
+                   input)))
+    (when result
+      (add-to-history (or history 'regexp-history) result))
+    (if (and result
+             (or (eq case-fold 'fold)
+                 (eq case-fold 'inhibit-fold)))
+        (propertize result 'case-fold case-fold)
+      (or result input))))
+
+(defun read-regexp-case-fold-search (regexp)
+  "Return a value for `case-fold-search' based on REGEXP and current settings.
+REGEXP is a string as returned by `read-regexp'."
+  (let ((fold (get-text-property 0 'case-fold regexp)))
+    (cond
+     ((eq fold 'fold) t)
+     ((eq fold 'inhibit-fold) nil)
+     (t case-fold-search))))
 
 (defalias 'delete-non-matching-lines 'keep-lines)
 (defalias 'delete-matching-lines 'flush-lines)
@@ -2471,7 +2507,8 @@ To be added to `context-menu-functions'."
 \\`^' to move point back to previous match,
 \\`u' to undo previous replacement,
 \\`U' to undo all replacements,
-\\`E' to edit the replacement string.
+\\`e' to edit the replacement string.
+\\`E' to edit the replacement string with exact case.
 In multi-buffer replacements type \\`Y' to replace all remaining
 matches in all remaining buffers with no more questions,
 \\`N' to skip to the next buffer without replacing remaining matches
@@ -2489,7 +2526,7 @@ in the current buffer."
     (define-key map "Y" 'act)
     (define-key map "N" 'skip)
     (define-key map "e" 'edit-replacement)
-    (define-key map "E" 'edit-replacement)
+    (define-key map "E" 'edit-replacement-exact-case)
     (define-key map "," 'act-and-show)
     (define-key map "q" 'exit)
     (define-key map "\r" 'exit)
@@ -2526,8 +2563,9 @@ The \"bindings\" in this map are not commands; they are 
answers.
 The valid answers include `act', `skip', `act-and-show',
 `act-and-exit', `exit', `exit-prefix', `recenter', `scroll-up',
 `scroll-down', `scroll-other-window', `scroll-other-window-down',
-`edit', `edit-replacement', `delete-and-edit', `automatic',
-`backup', `undo', `undo-all', `quit', and `help'.
+`edit', `edit-replacement', `edit-replacement-exact-case',
+`delete-and-edit', `automatic', `backup', `undo', `undo-all',
+`quit', and `help'.
 
 This keymap is used by `y-or-n-p' as well as `query-replace'.")
 
@@ -2684,7 +2722,7 @@ It is called with three arguments, as if it were
   "Function to convert the FROM string of query-replace commands to a regexp.
 This is used by `query-replace', `query-replace-regexp', etc. as
 the value of `isearch-regexp-function' when they search for the
-occurences of the string/regexp to be replaced.  This is intended
+occurrences of the string/regexp to be replaced.  This is intended
 to be used when the string to be replaced, as typed by the user,
 is not to be interpreted literally, but instead should be converted
 to a regexp that is actually used for the search.")
@@ -3301,19 +3339,29 @@ characters."
                             (setq match-again (and (looking-at search-string)
                                                    (match-data)))))
                        ;; Edit replacement.
-                       ((eq def 'edit-replacement)
+                       ((or (eq def 'edit-replacement)
+                             (eq def 'edit-replacement-exact-case))
                         (setq real-match-data (replace-match-data
                                                nil real-match-data
                                                real-match-data)
                               next-replacement
-                              (read-string "Edit replacement string: "
-                                            next-replacement)
+                              (read-string
+                                (format "Edit replacement string%s: "
+                                        (if (eq def
+                                                'edit-replacement-exact-case)
+                                            " (exact case)"
+                                          ""))
+                                next-replacement)
                               noedit nil)
                         (if replaced
                             (set-match-data real-match-data)
                           (setq noedit
                                 (replace-match-maybe-edit
-                                 next-replacement nocasify literal noedit
+                                 next-replacement
+                                  (if (eq def 'edit-replacement-exact-case)
+                                      t
+                                    nocasify)
+                                  literal noedit
                                  real-match-data backward)
                                 replaced t)
                           (setq next-replacement-replaced next-replacement))
diff --git a/lisp/saveplace.el b/lisp/saveplace.el
index 4d13ad3959..a23454b0bb 100644
--- a/lisp/saveplace.el
+++ b/lisp/saveplace.el
@@ -290,7 +290,11 @@ may have changed) back to `save-place-alist'."
               ;; adding hooks to it.
               (with-current-buffer (get-buffer-create " *Saved Places*")
                 (delete-region (point-min) (point-max))
-                (insert-file-contents file)
+                ;; Make sure our 'coding:' cookie in the save-place
+                ;; file will take effect, in case the caller binds
+                ;; coding-system-for-read.
+                (let (coding-system-for-read)
+                  (insert-file-contents file))
                 (goto-char (point-min))
                 (setq save-place-alist
                       (with-demoted-errors "Error reading save-place-file: %S"
diff --git a/lisp/scroll-lock.el b/lisp/scroll-lock.el
index 3f5f777f53..fa1f3a633b 100644
--- a/lisp/scroll-lock.el
+++ b/lisp/scroll-lock.el
@@ -30,15 +30,13 @@
 
 ;;; Code:
 
-(defvar scroll-lock-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [remap next-line] 'scroll-lock-next-line)
-    (define-key map [remap previous-line] 'scroll-lock-previous-line)
-    (define-key map [remap forward-paragraph] 'scroll-lock-forward-paragraph)
-    (define-key map [remap backward-paragraph] 'scroll-lock-backward-paragraph)
-    (define-key map [S-down] 'scroll-lock-next-line-always-scroll)
-    map)
-  "Keymap for Scroll Lock mode.")
+(defvar-keymap scroll-lock-mode-map
+  :doc "Keymap for Scroll Lock mode."
+  "<remap> <next-line>"          #'scroll-lock-next-line
+  "<remap> <previous-line>"      #'scroll-lock-previous-line
+  "<remap> <forward-paragraph>"  #'scroll-lock-forward-paragraph
+  "<remap> <backward-paragraph>" #'scroll-lock-backward-paragraph
+  "S-<down>"                     #'scroll-lock-next-line-always-scroll)
 
 (defvar-local scroll-lock-preserve-screen-pos-save 
scroll-preserve-screen-position
   "Used for saving the state of `scroll-preserve-screen-position'.")
diff --git a/lisp/select.el b/lisp/select.el
index 3646a28b9b..127a6a5c61 100644
--- a/lisp/select.el
+++ b/lisp/select.el
@@ -401,11 +401,16 @@ also be a string, which stands for the symbol with that 
name, but
 this is considered obsolete.)  DATA may be a string, a symbol, or
 an integer.
 
-The selection may also be a cons of two markers pointing to the same buffer,
-or an overlay.  In these cases, the selection is considered to be the text
-between the markers *at whatever time the selection is examined*.
-Thus, editing done in the buffer after you specify the selection
-can alter the effective value of the selection.
+The selection may also be a cons of two markers pointing to the
+same buffer, or an overlay.  In these cases, the selection is
+considered to be the text between the markers *at whatever time
+the selection is examined*.  Thus, editing done in the buffer
+after you specify the selection can alter the effective value of
+the selection.  If DATA is a string, then its text properties can
+specify alternative values for different data types.  For
+example, the value of any property named `text/uri-list' will be
+used instead of DATA itself when another program converts TYPE to
+the target `text/uri-list'.
 
 The data may also be a vector of valid non-vector selection values.
 
@@ -481,7 +486,8 @@ two markers or an overlay.  Otherwise, it is nil."
 (defun xselect--int-to-cons (n)
   (cons (ash n -16) (logand n 65535)))
 
-(defun xselect--encode-string (type str &optional can-modify)
+(defun xselect--encode-string (type str &optional can-modify
+                                    prefer-string-to-c-string)
   (when str
     ;; If TYPE is nil, this is a local request; return STR as-is.
     (if (null type)
@@ -574,7 +580,10 @@ two markers or an overlay.  Otherwise, it is nil."
       (setq str (string-replace "\0" "\\0" str))
 
       (setq next-selection-coding-system nil)
-      (cons type str))))
+      (cons (if (and prefer-string-to-c-string
+                     (eq type 'C_STRING))
+                'STRING type)
+            str))))
 
 (defun xselect-convert-to-string (_selection type value)
   (let ((str (cond ((stringp value) value)
@@ -592,19 +601,29 @@ two markers or an overlay.  Otherwise, it is nil."
     (if len
        (xselect--int-to-cons len))))
 
+(defvar x-dnd-targets-list)
+
 (defun xselect-convert-to-targets (selection _type value)
   ;; Return a vector of atoms, but remove duplicates first.
-  (apply #'vector
-         (delete-dups
-          `( TIMESTAMP MULTIPLE
-             . ,(delq '_EMACS_INTERNAL
-                      (mapcar (lambda (conv)
-                                (if (or (not (consp (cdr conv)))
-                                        (funcall (cadr conv) selection
-                                                 (car conv) value))
-                                    (car conv)
-                                  '_EMACS_INTERNAL))
-                              selection-converter-alist))))))
+  (if (eq selection 'XdndSelection)
+      ;; This isn't required by the XDND protocol, and sure enough no
+      ;; clients seem to dependent on it, but Emacs implements the
+      ;; receiver side of the Motif drop protocol by looking at the
+      ;; initiator selection's TARGETS target (which Motif provides)
+      ;; instead of the target table on the drag window, so it seems
+      ;; plausible for other clients to rely on that as well.
+      (apply #'vector (mapcar #'intern x-dnd-targets-list))
+    (apply #'vector
+           (delete-dups
+            `( TIMESTAMP MULTIPLE
+               . ,(delq '_EMACS_INTERNAL
+                        (mapcar (lambda (conv)
+                                  (if (or (not (consp (cdr conv)))
+                                          (funcall (cadr conv) selection
+                                                   (car conv) value))
+                                      (car conv)
+                                    '_EMACS_INTERNAL))
+                                selection-converter-alist)))))))
 
 (defun xselect-convert-to-delete (selection _type _value)
   ;; This should be handled by the caller of `x-begin-drag'.
@@ -619,9 +638,24 @@ two markers or an overlay.  Otherwise, it is nil."
   (if (not (eq selection 'XdndSelection))
       (when (setq value (xselect--selection-bounds value))
         (xselect--encode-string 'TEXT (buffer-file-name (nth 2 value))))
-    (when (and (stringp value)
-               (file-exists-p value))
-      (xselect--encode-string 'C_STRING value))))
+    (if (and (stringp value)
+             (file-exists-p value))
+        ;; Motif expects this to be STRING, but it treats the data as
+        ;; a sequence of bytes instead of a Latin-1 string.
+        (cons 'STRING (encode-coding-string (expand-file-name value)
+                                            (or file-name-coding-system
+                                                
default-file-name-coding-system)))
+      (when (vectorp value)
+        (with-temp-buffer
+          (cl-loop for file across value
+                   do (insert (expand-file-name file) "\0"))
+          ;; Get rid of the last NULL byte.
+          (when (> (point) 1)
+            (delete-char -1))
+          ;; Motif wants STRING.
+          (cons 'STRING (encode-coding-string (buffer-string)
+                                              (or file-name-coding-system
+                                                  
default-file-name-coding-system))))))))
 
 (defun xselect-convert-to-charpos (_selection _type value)
   (when (setq value (xselect--selection-bounds value))
@@ -687,18 +721,16 @@ This function returns the string \"emacs\"."
   (user-real-login-name))
 
 (defun xselect-convert-to-text-uri-list (_selection _type value)
-  (when (and (stringp value)
-             (file-exists-p value))
-    (concat (url-encode-url
-             ;; Uncomment the following code code in a better world where
-             ;; people write correct code that adds the hostname to the URI.
-             ;; Since most programs don't implement this properly, we omit the
-             ;; hostname so that copying files actually works.  Most properly
-             ;; written programs will look at WM_CLIENT_MACHINE to determine
-             ;; the hostname anyway.  (format "file://%s%s\n" (system-name)
-             ;; (expand-file-name value))
-             (concat "file://" (expand-file-name value)))
-            "\n")))
+  (if (stringp value)
+      (xselect--encode-string 'TEXT
+                              (concat (url-encode-url value) "\n"))
+    (when (vectorp value)
+      (with-temp-buffer
+        (cl-loop for tem across value
+                 do (progn
+                      (insert (url-encode-url tem))
+                      (insert "\n")))
+        (xselect--encode-string 'TEXT (buffer-string))))))
 
 (defun xselect-convert-to-xm-file (selection _type value)
   (when (and (stringp value)
@@ -711,12 +743,55 @@ This function returns the string \"emacs\"."
   "Return whether or not `text/uri-list' is a valid target for SELECTION.
 VALUE is the local selection value of SELECTION."
   (and (eq selection 'XdndSelection)
-       (stringp value)
-       (file-exists-p value)))
+       (or (stringp value)
+           (vectorp value))))
 
 (defun xselect-convert-xm-special (_selection _type _value)
   "")
 
+(defun xselect-dt-netfile-available-p (selection _type value)
+  "Return whether or not `_DT_NETFILE' is a valid target for SELECTION.
+VALUE is SELECTION's local selection value."
+  (and (eq selection 'XdndSelection)
+       (stringp value)
+       (file-exists-p value)
+       (not (file-remote-p value))))
+
+(defun xselect-tt-net-file (file)
+  "Get the canonical ToolTalk filename for FILE.
+FILE must be a local file, or otherwise the conversion will fail.
+The string returned has three components: the hostname of the
+machine where the file is, the real path, and the local path.
+They are encoded into a string of the form
+\"HOST=0-X,RPATH=X-Y,LPATH=Y-Z:DATA\", where X, Y, and Z are the
+positions of the hostname, rpath and lpath inside DATA."
+  (let ((hostname (system-name))
+        (rpath file)
+        (lpath file))
+    (format "HOST=0-%d,RPATH=%d-%d,LPATH=%d-%d:%s%s%s"
+            (1- (length hostname)) (length hostname)
+            (1- (+ (length hostname) (length rpath)))
+            (+ (length hostname) (length rpath))
+            (1- (+ (length hostname) (length rpath)
+                   (length lpath)))
+            hostname rpath lpath)))
+
+(defun xselect-convert-to-dt-netfile (selection _type value)
+  "Convert SELECTION to a ToolTalk filename.
+VALUE should be SELECTION's local value."
+  (when (and (eq selection 'XdndSelection)
+             (stringp value)
+             (file-exists-p value)
+             (not (file-remote-p value)))
+    (let ((name (encode-coding-string value
+                                      (or file-name-coding-system
+                                          default-file-name-coding-system))))
+      (cons 'STRING
+            (encode-coding-string (xselect-tt-net-file name)
+                                  (or file-name-coding-system
+                                      default-file-name-coding-system)
+                                  t)))))
+
 (setq selection-converter-alist
       '((TEXT . xselect-convert-to-string)
        (COMPOUND_TEXT . xselect-convert-to-string)
@@ -724,9 +799,11 @@ VALUE is the local selection value of SELECTION."
        (UTF8_STRING . xselect-convert-to-string)
        (text/plain . xselect-convert-to-string)
        (text/plain\;charset=utf-8 . xselect-convert-to-string)
-        (text/uri-list . (xselect-uri-list-available-p . 
xselect-convert-to-text-uri-list))
+        (text/uri-list . (xselect-uri-list-available-p
+                          . xselect-convert-to-text-uri-list))
         (text/x-xdnd-username . xselect-convert-to-username)
-        (FILE . (xselect-uri-list-available-p . xselect-convert-to-xm-file))
+        (FILE . (xselect-uri-list-available-p
+                 . xselect-convert-to-xm-file))
        (TARGETS . xselect-convert-to-targets)
        (LENGTH . xselect-convert-to-length)
        (DELETE . xselect-convert-to-delete)
@@ -744,7 +821,9 @@ VALUE is the local selection value of SELECTION."
        (SAVE_TARGETS . xselect-convert-to-save-targets)
        (_EMACS_INTERNAL . xselect-convert-to-identity)
         (XmTRANSFER_SUCCESS . xselect-convert-xm-special)
-        (XmTRANSFER_FAILURE . xselect-convert-xm-special)))
+        (XmTRANSFER_FAILURE . xselect-convert-xm-special)
+        (_DT_NETFILE . (xselect-dt-netfile-available-p
+                        . xselect-convert-to-dt-netfile))))
 
 (provide 'select)
 
diff --git a/lisp/server.el b/lisp/server.el
index 763cf27f7a..8f47a99a31 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -1367,7 +1367,7 @@ The following commands are accepted by the client:
                         ((functionp initial-buffer-choice)
                          (funcall initial-buffer-choice)))))
              (switch-to-buffer
-              (if (buffer-live-p buf) buf (get-buffer-create "*scratch*"))
+              (if (buffer-live-p buf) buf (get-scratch-buffer-create))
               'norecord)))
 
           ;; Delete the client if necessary.
diff --git a/lisp/ses.el b/lisp/ses.el
index 7a9b35d749..ba965ff8a5 100644
--- a/lisp/ses.el
+++ b/lisp/ses.el
@@ -108,9 +108,9 @@ Each function is called with ARG=1."
   :type 'hook)
 
 (defcustom ses-jump-cell-name-function #'upcase
-  "Function to process the string passed to function ‘ses-jump’.
-Set it to 'identity to make no change.
-Set it to 'upcase to make cell name change case isensitive.
+  "Function to process the string passed to function `ses-jump'.
+Set it to `identity' to make no change.
+Set it to `upcase' to make cell name change case isensitive.
 
  May return
 
@@ -119,8 +119,8 @@ Set it to 'upcase to make cell name change case isensitive.
   :type 'function)
 
 (defcustom ses-jump-prefix-function #'ses-jump-prefix
-  "Function that takes the prefix argument passed to function ‘ses-jump’.
-It may return the same sort of thing as ‘ses-jump-cell-name-function’."
+  "Function that takes the prefix argument passed to function `ses-jump'.
+It may return the same sort of thing as `ses-jump-cell-name-function'."
   :type 'function)
 
 
diff --git a/lisp/shell.el b/lisp/shell.el
index 47887433d9..8bcc578406 100644
--- a/lisp/shell.el
+++ b/lisp/shell.el
@@ -331,6 +331,12 @@ Useful for shells like zsh that has this feature."
   :group 'shell-directories
   :version "28.1")
 
+(defcustom shell-kill-buffer-on-exit nil
+  "Kill a shell buffer after the shell process terminates."
+  :type 'boolean
+  :group 'shell
+  :version "29.1")
+
 (defvar shell-mode-map
   (let ((map (make-sparse-keymap)))
     (define-key map "\C-c\C-f" 'shell-forward-command)
@@ -713,7 +719,7 @@ Sentinels will always get the two parameters PROCESS and 
EVENT."
         (insert (format "\nProcess %s %s\n" process event))))))
 
 ;;;###autoload
-(defun shell (&optional buffer)
+(defun shell (&optional buffer file-name)
   "Run an inferior shell, with I/O through BUFFER (which defaults to 
`*shell*').
 Interactively, a prefix arg means to prompt for BUFFER.
 If `default-directory' is a remote file name, it is also prompted
@@ -724,6 +730,8 @@ If BUFFER exists and shell process is running, just switch 
to BUFFER.
 Program used comes from variable `explicit-shell-file-name',
  or (if that is nil) from the ESHELL environment variable,
  or (if that is nil) from `shell-file-name'.
+Non-interactively, it can also be specified via the FILE-NAME arg.
+
 If a file `~/.emacs_SHELLNAME' exists, or `~/.emacs.d/init_SHELLNAME.sh',
 it is given as initial input (but this may be lost, due to a timing
 error, if the shell discards input when it starts up).
@@ -747,25 +755,47 @@ Make the shell buffer the current buffer, and return it.
 
 \(Type \\[describe-mode] in the shell buffer for a list of commands.)"
   (interactive
-   (list
-    (and current-prefix-arg
-        (prog1
-            (read-buffer "Shell buffer: "
-                         ;; If the current buffer is an inactive
-                         ;; shell buffer, use it as the default.
-                         (if (and (eq major-mode 'shell-mode)
-                                  (null (get-buffer-process (current-buffer))))
-                             (buffer-name)
-                           (generate-new-buffer-name "*shell*")))
-          (if (file-remote-p default-directory)
-              ;; It must be possible to declare a local default-directory.
-               ;; FIXME: This can't be right: it changes the default-directory
-               ;; of the current-buffer rather than of the *shell* buffer.
-              (setq default-directory
-                    (expand-file-name
-                     (read-directory-name
-                      "Default directory: " default-directory default-directory
-                      t nil))))))))
+   (let* ((buffer
+           (and current-prefix-arg
+               (read-buffer "Shell buffer: "
+                            ;; If the current buffer is an inactive
+                            ;; shell buffer, use it as the default.
+                            (if (and (eq major-mode 'shell-mode)
+                                     (null (get-buffer-process
+                                            (current-buffer))))
+                                (buffer-name)
+                              (generate-new-buffer-name "*shell*")))))
+         (buf (if (or buffer (not (derived-mode-p 'shell-mode))
+                       (comint-check-proc (current-buffer)))
+                   (get-buffer-create (or buffer "*shell*"))
+                 ;; If the current buffer is a dead shell buffer, use it.
+                 (current-buffer))))
+
+     (with-current-buffer buf
+       (when (and buffer (file-remote-p default-directory))
+        ;; It must be possible to declare a local default-directory.
+        (setq default-directory
+              (expand-file-name
+               (read-directory-name
+                "Default directory: " default-directory default-directory
+                t nil))))
+       (list
+        buffer
+        ;; On remote hosts, the local `shell-file-name' might be useless.
+        (with-connection-local-variables
+         (when (and (file-remote-p default-directory)
+                    (null explicit-shell-file-name)
+                    (null (getenv "ESHELL")))
+           ;; `expand-file-name' shall not add the MS Windows volume letter
+           ;; (Bug#49229).
+           (replace-regexp-in-string
+            "^[[:alpha:]]:" ""
+            (file-local-name
+             (expand-file-name
+              (read-file-name "Remote shell path: " default-directory
+                              shell-file-name t shell-file-name
+                              #'file-remote-p))))))))))
+
   (setq buffer (if (or buffer (not (derived-mode-p 'shell-mode))
                        (comint-check-proc (current-buffer)))
                    (get-buffer-create (or buffer "*shell*"))
@@ -776,21 +806,8 @@ Make the shell buffer the current buffer, and return it.
   (pop-to-buffer buffer display-comint-buffer-action)
 
   (with-connection-local-variables
-   ;; On remote hosts, the local `shell-file-name' might be useless.
-   (when (and (file-remote-p default-directory)
-              (called-interactively-p 'any)
-              (null explicit-shell-file-name)
-              (null (getenv "ESHELL")))
-     ;; `expand-file-name' shall not add the MS Windows volume letter
-     ;; (Bug#49229).
-     (setq-local explicit-shell-file-name
-                 (replace-regexp-in-string
-                  "^[[:alpha:]]:" ""
-                  (file-local-name
-                   (expand-file-name
-                    (read-file-name "Remote shell path: " default-directory
-                                    shell-file-name t shell-file-name
-                                    #'file-remote-p))))))
+   (when file-name
+     (setq-local explicit-shell-file-name file-name))
 
    ;; Rain or shine, BUFFER must be current by now.
    (unless (comint-check-proc buffer)
@@ -818,6 +835,17 @@ Make the shell buffer the current buffer, and return it.
           (with-temp-buffer
             (insert-file-contents startfile)
             (buffer-string)))))))
+  (when shell-kill-buffer-on-exit
+    (let* ((buffer (current-buffer))
+           (process (get-buffer-process buffer))
+           (sentinel (process-sentinel process)))
+      (set-process-sentinel
+       process
+       (lambda (proc event)
+         (when sentinel
+           (funcall sentinel proc event))
+         (unless (buffer-live-p proc)
+           (kill-buffer buffer))))))
   buffer)
 
 ;;; Directory tracking
diff --git a/lisp/simple.el b/lisp/simple.el
index 861d9eefde..99c951b24b 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -60,6 +60,24 @@ value of 1 means that nothing is amalgamated.")
 (defgroup paren-matching nil
   "Highlight (un)matching of parens and expressions."
   :group 'matching)
+
+(defvar-local escaped-string-quote "\\"
+  "String to insert before a string quote character in a string to escape it.
+This is typically a backslash (in most languages):
+
+  \\='foo\\\\='bar\\='
+  \"foo\\\"bar\"
+
+But in SQL, for instance, it's \"\\='\":
+
+  \\='foo\\='\\='bar\\='
+
+This can also be a function, which is called with the string
+terminator as the argument, and should return a string to be
+used as the escape.
+
+This variable is used by the `yank-in-context' command.")
+
 
 ;;; next-error support framework
 
@@ -494,7 +512,7 @@ buffer causes automatic display of the corresponding source 
code location."
       (error t))))
 
 (defun next-error-message-highlight (error-buffer)
-  "Highlight the current error message in the ‘next-error’ buffer."
+  "Highlight the current error message in the `next-error' buffer."
   (when next-error-message-highlight
     (with-current-buffer error-buffer
       (when (and next-error--message-highlight-overlay
@@ -1072,15 +1090,26 @@ Leave one space or none, according to the context."
   "Delete all spaces and tabs around point.
 If BACKWARD-ONLY is non-nil, delete them only before point."
   (interactive "*P")
+  (delete-space--internal " \t" backward-only))
+
+(defun delete-all-space (&optional backward-only)
+  "Delete all spaces, tabs, and newlines around point.
+If BACKWARD-ONLY is non-nil, delete them only before point."
+  (interactive "*P")
+  (delete-space--internal " \t\r\n" backward-only))
+
+(defun delete-space--internal (chars backward-only)
+  "Delete CHARS around point.
+If BACKWARD-ONLY is non-nil, delete them only before point."
   (let ((orig-pos (point)))
     (delete-region
      (if backward-only
-        orig-pos
+         orig-pos
        (progn
-        (skip-chars-forward " \t")
-        (constrain-to-field nil orig-pos t)))
+         (skip-chars-forward chars)
+         (constrain-to-field nil orig-pos t)))
      (progn
-       (skip-chars-backward " \t")
+       (skip-chars-backward chars)
        (constrain-to-field nil orig-pos)))))
 
 (defun just-one-space (&optional n)
@@ -1088,73 +1117,225 @@ If BACKWARD-ONLY is non-nil, delete them only before 
point."
 If N is negative, delete newlines as well, leaving -N spaces.
 See also `cycle-spacing'."
   (interactive "*p")
-  (cycle-spacing n nil 'single-shot))
+  (let ((orig-pos        (point))
+        (skip-characters (if (and n (< n 0)) " \t\n\r" " \t"))
+        (num             (abs (or n 1))))
+    (skip-chars-backward skip-characters)
+    (constrain-to-field nil orig-pos)
+    (let* ((num   (- num (skip-chars-forward " " (+ num (point)))))
+           (mid   (point))
+           (end   (progn
+                    (skip-chars-forward skip-characters)
+                    (constrain-to-field nil orig-pos t))))
+      (delete-region mid end)
+      (insert (make-string num ?\s)))))
 
 (defvar cycle-spacing--context nil
-  "Store context used in consecutive calls to `cycle-spacing' command.
-The first time `cycle-spacing' runs, it saves in this variable:
-its N argument, the original point position, and the original spacing
-around point.")
+  "Stored context used in consecutive calls to `cycle-spacing' command.
+The value is a property list with the following elements:
+- `:orig-pos'    The original position of point when starting the
+                 sequence.
+- `:whitespace-string' All whitespace characters around point
+                       including newlines.
+- `:n'            The prefix arg given to the initial invocation
+                  which is reused for all actions in this cycle.
+- `:last-action'  The last action performed in the cycle.")
+
+(defcustom cycle-spacing-actions
+  '( just-one-space
+     delete-all-space
+     restore)
+  "List of actions cycled through by `cycle-spacing'.
+Supported values are:
+- `just-one-space'      Delete all but N (prefix arg) spaces.
+                        See that command's docstring for details.
+- `delete-space-after'  Delete spaces after point keeping only N.
+- `delete-space-before' Delete spaces before point keeping only N.
+- `delete-all-space'    Delete all spaces around point.
+- `restore'             Restore the original spacing.
+
+All actions make use of the prefix arg given to `cycle-spacing'
+in the initial invocation, i.e., `just-one-space' keeps this
+amount of spaces deleting surplus ones.  `just-one-space' and all
+other actions have the contract that a positive prefix arg (or
+zero) only deletes tabs and spaces whereas a negative prefix arg
+also deletes newlines.
+
+The `delete-space-before' and `delete-space-after' actions handle
+the prefix arg \\[negative-argument] without a number provided
+specially: all spaces before/after point are deleted (as if N was
+0) including newlines (as if N was negative).
+
+In addition to the predefined actions listed above, any function
+which accepts one argument is allowed.  It receives the raw
+prefix arg of this cycle.
+
+In addition, an action may take the form (ACTION ARG) where
+ACTION is one of the predefined actions (except for `restore')
+and ARG is either
+- an integer with the meaning that ACTION should always use this
+  fixed integer instead of the actual prefix arg or
+- the symbol `inverted-arg' with the meaning that ACTION should
+  be performed with the inverted actual prefix arg.
+- the symbol `-' with the meaning that ACTION should include
+  newlines but it's up to the ACTION to decide how to interpret
+  it as a number, e.g., `delete-space-before' and
+  `delete-space-after' treat it like 0 whereas `just-one-space'
+  treats it like -1 as is usual."
+  :group 'editing-basics
+  :type (let ((actions
+               '((const :tag "Just N (prefix arg) spaces" just-one-space)
+                 (const :tag "Delete spaces after point" delete-space-after)
+                 (const :tag "Delete spaces before point" delete-space-before)
+                 (const :tag "Delete all spaces around point" delete-all-space)
+                 (function :tag "Function receiving a numeric arg"))))
+          `(repeat
+            (choice
+             ,@actions
+             (list :tag "Action with modified arg"
+                   (choice ,@actions)
+                   (choice (const :tag "Inverted prefix arg" inverted-arg)
+                           (integer :tag "Fixed numeric arg")
+                           (const :tag "Negative arg" -)))
+             (const :tag "Restore the original spacing" restore))))
+  :version "29.1")
 
-(defun cycle-spacing (&optional n preserve-nl-back mode)
+(defun cycle-spacing (&optional n)
   "Manipulate whitespace around point in a smart way.
-In interactive use, this function behaves differently in successive
-consecutive calls.
-
-The first call in a sequence acts like `just-one-space'.
-It deletes all spaces and tabs around point, leaving one space
-\(or N spaces).  N is the prefix argument.  If N is negative,
-it deletes newlines as well, leaving -N spaces.
-\(If PRESERVE-NL-BACK is non-nil, it does not delete newlines before point.)
-
-The second call in a sequence deletes all spaces.
-
-The third call in a sequence restores the original whitespace (and point).
-
-If MODE is `single-shot', it performs only the first step in the sequence.
-If MODE is `fast' and the first step would not result in any change
-\(i.e., there are exactly (abs N) spaces around point),
-the function goes straight to the second step.
-
-Repeatedly calling the function with different values of N starts a
-new sequence each time."
-  (interactive "*p")
-  (let ((orig-pos       (point))
-       (skip-characters (if (and n (< n 0)) " \t\n\r" " \t"))
-       (num             (abs (or n 1))))
-    (skip-chars-backward (if preserve-nl-back " \t" skip-characters))
-    (constrain-to-field nil orig-pos)
-    (cond
-     ;; Command run for the first time, single-shot mode or different argument
-     ((or (eq 'single-shot mode)
-         (not (equal last-command this-command))
-         (not cycle-spacing--context)
-         (not (eq (car cycle-spacing--context) n)))
-      (let* ((start (point))
-            (num   (- num (skip-chars-forward " " (+ num (point)))))
-            (mid   (point))
-            (end   (progn
-                     (skip-chars-forward skip-characters)
-                     (constrain-to-field nil orig-pos t))))
-       (setq cycle-spacing--context  ;; Save for later.
-             ;; Special handling for case where there was no space at all.
-             (unless (= start end)
-                (cons n (cons orig-pos (buffer-substring start (point))))))
-       ;; If this run causes no change in buffer content, delete all spaces,
-       ;; otherwise delete all excess spaces.
-       (delete-region (if (and (eq mode 'fast) (zerop num) (= mid end))
-                          start mid) end)
-        (insert (make-string num ?\s))))
-
-     ;; Command run for the second time.
-     ((not (equal orig-pos (point)))
-      (delete-region (point) orig-pos))
-
-     ;; Command run for the third time.
-     (t
-      (insert (cddr cycle-spacing--context))
-      (goto-char (cadr cycle-spacing--context))
-      (setq cycle-spacing--context nil)))))
+Repeated calls perform the actions in `cycle-spacing-actions' one
+after the other, wrapping around after the last one.
+
+All actions are amendable using a prefix arg N.  In general, a
+zero or positive prefix arg allows only for deletion of tabs and
+spaces whereas a negative prefix arg also allows for deleting
+newlines.
+
+The prefix arg given at the first invocation starting a cycle is
+provided to all following actions, i.e.,
+    \\[negative-argument] \\[cycle-spacing] \\[cycle-spacing] \\[cycle-spacing]
+is equivalent to
+    \\[negative-argument] \\[cycle-spacing] \\[negative-argument] 
\\[cycle-spacing] \\[negative-argument] \\[cycle-spacing].
+
+A new sequence can be started by providing a different prefix arg
+than provided at the initial invocation (except for 1), or by
+doing any other command before the next \\[cycle-spacing]."
+  (interactive "*P")
+  ;; Initialize `cycle-spacing--context' if needed.
+  (when (or (not (equal last-command this-command))
+            (not cycle-spacing--context)
+            ;; With M-5 M-SPC M-SPC... we pass the prefix arg 5 to
+            ;; each action and only start a new cycle when a different
+            ;; prefix arg is given and which is not the default value
+            ;; 1.
+            (and n (not (equal (plist-get cycle-spacing--context :n)
+                               n))))
+    (let ((orig-pos (point))
+          (skip-characters " \t\n\r"))
+      (save-excursion
+        (skip-chars-backward skip-characters)
+        (constrain-to-field nil orig-pos)
+        (let ((start (point))
+              (end   (progn
+                       (skip-chars-forward skip-characters)
+                       (constrain-to-field nil orig-pos t))))
+          (setq cycle-spacing--context  ;; Save for later.
+                (list :orig-pos orig-pos
+                      :whitespace-string (buffer-substring start end)
+                      :n n
+                      :last-action nil))))))
+
+  ;; Cycle through the actions in `cycle-spacing-actions'.
+  (when cycle-spacing--context
+    (cl-labels ((next-action ()
+                  (let* ((l cycle-spacing-actions)
+                         (elt (plist-get cycle-spacing--context
+                                         :last-action)))
+                    (if (null elt)
+                        (car cycle-spacing-actions)
+                      (catch 'found
+                        (while l
+                          (cond
+                           ((null (cdr l))
+                            (throw 'found
+                                   (when (eq elt (car l))
+                                     (car cycle-spacing-actions))))
+                           ((and (eq elt (car l))
+                                 (cdr l))
+                            (throw 'found (cadr l)))
+                           (t (setq l (cdr l)))))))))
+                (skip-chars (chars max-dist direction)
+                  (if (eq direction 'forward)
+                      (skip-chars-forward
+                       chars
+                       (and max-dist (+ (point) max-dist)))
+                    (skip-chars-backward
+                     chars
+                     (and max-dist (- (point) max-dist)))))
+                (delete-space (n include-newlines direction)
+                  (let ((orig-point (point))
+                        (chars (if include-newlines
+                                   " \t\r\n"
+                                 " \t")))
+                    (when (or (zerop n)
+                              (= n (abs (skip-chars chars n direction))))
+                      (let ((start (point))
+                            (end (progn
+                                   (skip-chars chars nil direction)
+                                   (point))))
+                        (unless (= start end)
+                          (delete-region start end))
+                        (goto-char (if (eq direction 'forward)
+                                       orig-point
+                                     (+ n end)))))))
+                (restore ()
+                  (delete-all-space)
+                  (insert (plist-get cycle-spacing--context
+                                     :whitespace-string))
+                  (goto-char (plist-get cycle-spacing--context
+                                        :orig-pos))))
+      (let ((action (next-action)))
+        (atomic-change-group
+          (restore)
+          (unless (eq action 'restore)
+            ;; action can be some-action or (some-action <arg>) where
+            ;; arg is either an integer, the arg to be always used for
+            ;; this action or - to use the inverted context n for this
+            ;; action.
+            (let* ((actual-action (if (listp action)
+                                      (car action)
+                                    action))
+                   (arg (when (listp action)
+                          (nth 1 action)))
+                   (context-n (plist-get cycle-spacing--context :n))
+                   (actual-n (cond
+                              ((integerp arg) arg)
+                              ((eq 'inverted-arg arg)
+                               (* -1 (prefix-numeric-value context-n)))
+                              ((eq '- arg) '-)
+                              (t context-n)))
+                   (numeric-n (prefix-numeric-value actual-n))
+                   (include-newlines (or (eq actual-n '-)
+                                         (and (integerp actual-n)
+                                              (< actual-n 0)))))
+              (cond
+               ((eq actual-action 'just-one-space)
+                (just-one-space numeric-n))
+               ((eq actual-action 'delete-space-after)
+                (delete-space (if (eq actual-n '-) 0 (abs numeric-n))
+                              include-newlines 'forward))
+               ((eq actual-action 'delete-space-before)
+                (delete-space (if (eq actual-n '-) 0 (abs numeric-n))
+                              include-newlines 'backward))
+               ((eq actual-action 'delete-all-space)
+                (if include-newlines
+                    (delete-all-space)
+                  (delete-horizontal-space)))
+               ((functionp actual-action)
+                (funcall actual-action actual-n))
+               (t
+                (error "Don't know how to handle action %S" action)))))
+          (setf (plist-get cycle-spacing--context :last-action)
+                action))))))
 
 (defun beginning-of-buffer (&optional arg)
   "Move point to the beginning of the buffer.
@@ -1486,8 +1667,9 @@ START and END."
 If called interactively, START and END are normally the start and
 end of the buffer; but if the region is active, START and END are
 the start and end of the region.  Print a message reporting the
-number of lines, words, and chars.  With prefix argument, also
-include the data for the entire (un-narrowed) buffer.
+number of lines, sentences, words, and chars.  With prefix
+argument, also include the data for the entire (un-narrowed)
+buffer.
 
 If called from Lisp, return the number of words between START and
 END, without printing any message.  TOTALS is ignored when called
@@ -1527,11 +1709,13 @@ from Lisp."
 
 (defun count-words--format (str start end)
   (let ((lines (count-lines start end))
+       (sentences (count-sentences start end))
        (words (count-words start end))
        (chars (- end start)))
-    (format "%s has %d line%s, %d word%s, and %d character%s"
+    (format "%s has %d line%s, %d sentence%s, %d word%s, and %d character%s"
             str
             lines (if (= lines 1) "" "s")
+            sentences (if (= sentences 1) "" "s")
             words (if (= words 1) "" "s")
             chars (if (= chars 1) "" "s"))))
 
@@ -2266,6 +2450,11 @@ invoking, give a prefix argument to 
`execute-extended-command'."
          (find-shorter nil))
     (unless (commandp function)
       (error "`%s' is not a valid command name" command-name))
+    ;; If we're executing a command that's remapped, we can't actually
+    ;; execute that command with the keymapping we've found with
+    ;; `where-is-internal'.
+    (when (and binding (command-remapping function))
+      (setq binding nil))
     ;; Some features, such as novice.el, rely on this-command-keys
     ;; including M-x COMMAND-NAME RET.
     (set--this-command-keys (concat "\M-x" (symbol-name function) "\r"))
@@ -5765,6 +5954,15 @@ See also `yank-handled-properties'."
   :group 'killing
   :version "24.3")
 
+(defvar yank-transform-functions nil
+  "Hook run on strings to be yanked.
+Each function in this list will be called (in order) with the
+string to be yanked as the sole argument, and should return the (possibly)
+transformed string.
+
+The functions will be called with the destination buffer as the current
+buffer, and with point at the place where the string is to be inserted.")
+
 (defvar yank-window-start nil)
 (defvar yank-undo-function nil
   "If non-nil, function used by `yank-pop' to delete last stretch of yanked 
text.
@@ -5836,6 +6034,11 @@ property, as described below.
 Properties listed in `yank-handled-properties' are processed,
 then those listed in `yank-excluded-properties' are discarded.
 
+STRING will be run through `yank-transform-functions'.
+`yank-in-context' is a command that uses this mechanism to
+provide a `yank' alternative that conveniently preserves
+string/comment syntax.
+
 If STRING has a non-nil `yank-handler' property anywhere, the
 normal insert behavior is altered, and instead, for each contiguous
 segment of STRING that has a given value of the `yank-handler'
@@ -5886,6 +6089,88 @@ With ARG, rotate that many kills forward (or backward, 
if negative)."
   (interactive "p")
   (current-kill arg))
 
+(defun yank-in-context (&optional arg)
+  "Insert the last stretch of killed text while preserving syntax.
+In particular, if point is inside a string, any quote characters
+in the killed text will be quoted, so that the string remains a
+valid string.
+
+If point is inside a comment, ensure that the inserted text is
+also marked as a comment.
+
+This command otherwise behaves as `yank'.  See that command for
+explanation of ARG.
+
+This function uses the `escaped-string-quote' buffer-local
+variable to determine how strings should be escaped."
+  (interactive "*P")
+  (let ((yank-transform-functions (cons #'yank-in-context--transform
+                                        yank-transform-functions)))
+    (yank arg)))
+
+(defun yank-in-context--transform (string)
+  (let ((ppss (syntax-ppss)))
+    (cond
+     ;; We're in a string.
+     ((ppss-string-terminator ppss)
+      (string-replace
+       (string (ppss-string-terminator ppss))
+       (concat (if (functionp escaped-string-quote)
+                   (funcall escaped-string-quote
+                            (ppss-string-terminator ppss))
+                 escaped-string-quote)
+               (string (ppss-string-terminator ppss)))
+       string))
+     ;; We're in a comment.
+     ((or (ppss-comment-depth ppss)
+          (and (bolp)
+               (not (eobp))
+               ;; If we're in the middle of a bunch of commented text,
+               ;; we probably want to be commented.  This is quite DWIM.
+               (or (bobp)
+                   (save-excursion
+                     (forward-line -1)
+                     (forward-char 1)
+                     (ppss-comment-depth (syntax-ppss))))
+               (ppss-comment-depth
+                (setq ppss (save-excursion
+                             (forward-char 1)
+                             (syntax-ppss))))))
+      (cond
+       ((and (eq (ppss-comment-depth ppss) t)
+             (> (length comment-end) 0)
+             (string-search comment-end string))
+        (user-error "Can't insert a string containing a comment terminator in 
a comment"))
+       ;; If this is a comment syntax that has an explicit end, then
+       ;; we can just insert as is.
+       ((> (length comment-end) 0) string)
+       ;; Line-based comment formats.
+       ((or (string-search "\n" string)
+            (bolp))
+        (let ((mode major-mode)
+              (bolp (bolp))
+              (eolp (eolp))
+              (comment-style 'plain))
+          (with-temp-buffer
+            (funcall mode)
+            (insert string)
+            (when (string-match-p "\n\\'" string)
+              (cond
+               ((not eolp) (delete-char -1))
+               (bolp (insert "\n"))))
+            (comment-normalize-vars)
+            (comment-region-default-1
+             (if bolp
+                 (point-min)
+               (save-excursion
+                 (goto-char (point-min))
+                 (forward-line 1)
+                 (point)))
+             (point-max))
+            (buffer-string))))
+       (t string)))
+     (t string))))
+
 (defvar read-from-kill-ring-history)
 (defun read-from-kill-ring (prompt)
   "Read a `kill-ring' entry using completion and minibuffer history.
@@ -6024,7 +6309,7 @@ Delete ARG chars, and kill (save in kill ring) if KILLP 
is non-nil.
 
 If Transient Mark mode is enabled, the mark is active, and ARG is 1,
 delete the text in the region and deactivate the mark instead.
-To disable this, set option ‘delete-active-region’ to nil.
+To disable this, set option `delete-active-region' to nil.
 
 Interactively, ARG is the prefix arg (default 1)
 and KILLP is t if a prefix arg was specified."
@@ -6054,21 +6339,34 @@ and KILLP is t if a prefix arg was specified."
     ;; Avoid warning about delete-backward-char
     (with-no-warnings (delete-backward-char n killp))))
 
-(defun zap-to-char (arg char)
+(defun char-uppercase-p (char)
+  "Return non-nil if CHAR is an upper-case character.
+If the Unicode tables are not yet available, e.g. during bootstrap,
+then gives correct answers only for ASCII characters."
+  (cond ((unicode-property-table-internal 'lowercase)
+         (characterp (get-char-code-property char 'lowercase)))
+        ((and (>= char ?A) (<= char ?Z)))))
+
+(defun zap-to-char (arg char &optional interactive)
   "Kill up to and including ARGth occurrence of CHAR.
+When run interactively, the argument INTERACTIVE is non-nil.
 Case is ignored if `case-fold-search' is non-nil in the current buffer.
 Goes backward if ARG is negative; error if CHAR not found.
-See also `zap-up-to-char'."
+See also `zap-up-to-char'.
+If called interactively, do a case sensitive search if CHAR
+is an upper-case character."
   (interactive (list (prefix-numeric-value current-prefix-arg)
                     (read-char-from-minibuffer "Zap to char: "
-                                               nil 'read-char-history)))
+                                               nil 'read-char-history)
+               t))
   ;; Avoid "obsolete" warnings for translation-table-for-input.
   (with-no-warnings
     (if (char-table-p translation-table-for-input)
        (setq char (or (aref translation-table-for-input char) char))))
-  (kill-region (point) (progn
-                        (search-forward (char-to-string char) nil nil arg)
-                        (point))))
+  (let ((case-fold-search (if (and interactive (char-uppercase-p char))
+                              nil
+                            case-fold-search)))
+    (kill-region (point) (search-forward (char-to-string char) nil nil arg))))
 
 ;; kill-line and its subroutines.
 
@@ -7785,31 +8083,28 @@ For motion by visual lines, see 
`beginning-of-visual-line'."
 (put 'set-goal-column 'disabled t)
 
 (defun set-goal-column (arg)
-  "Set the current horizontal position as a goal for \\[next-line] and 
\\[previous-line].
+  "Set the current horizontal position as a goal column.
+This goal column will affect the \\[next-line] and \\[previous-line] commands,
+as well as the \\[scroll-up-command] and \\[scroll-down-command] commands.
+
 Those commands will move to this position in the line moved to
 rather than trying to keep the same horizontal position.
-With a non-nil argument ARG, clears out the goal column
-so that \\[next-line] and \\[previous-line] resume vertical motion.
-The goal column is stored in the variable `goal-column'.
-This is a buffer-local setting."
+
+With a non-nil argument ARG, clears out the goal column so that
+these commands resume normal motion.
+
+The goal column is stored in the variable `goal-column'.  This is
+a buffer-local setting."
   (interactive "P")
   (if arg
       (progn
         (setq goal-column nil)
         (message "No goal column"))
     (setq goal-column (current-column))
-    ;; The older method below can be erroneous if `set-goal-column' is bound
-    ;; to a sequence containing %
-    ;;(message (substitute-command-keys
-    ;;"Goal column %d (use \\[set-goal-column] with an arg to unset it)")
-    ;;goal-column)
-    (message "%s"
-            (concat
-             (format "Goal column %d " goal-column)
-             (substitute-command-keys
-              "(use \\[set-goal-column] with an arg to unset it)")))
-
-    )
+    (message "Goal column %d %s"
+             goal-column
+            (substitute-command-keys
+             "(use \\[set-goal-column] with an arg to unset it)")))
   nil)
 
 ;;; Editing based on visual lines, as opposed to logical lines.
@@ -8917,9 +9212,10 @@ Valid values include:
                            paraphernalia if Gnus is running, particularly
                            the Gcc: header for archiving.
 
-Additional valid symbols may be available; check with the author of
-your package for details.  The function should return non-nil if it
-succeeds.
+Additional valid symbols may be available; check in the manual of
+your mail user agent package for details.  You may also define
+your own symbol to be used as value for this variable using
+`define-mail-user-agent'.
 
 See also `read-mail-command' concerning reading mail."
   :type '(radio (function-item :tag "Message package"
@@ -9206,10 +9502,10 @@ Go to the window from which completion was requested."
       (if (get-buffer-window buf)
          (select-window (get-buffer-window buf))))))
 
-(defcustom completion-wrap-movement t
+(defcustom completion-auto-wrap t
   "Non-nil means to wrap around when selecting completion options.
-This affects the commands `next-completion' and
-`previous-completion'."
+This affects the commands `next-completion' and `previous-completion'.
+When `completion-auto-select' is t, it wraps through the minibuffer."
   :type 'boolean
   :version "29.1"
   :group 'completion)
@@ -9219,23 +9515,41 @@ This affects the commands `next-completion' and
 When the value is t, pressing TAB will switch to the completion list
 buffer when Emacs pops up a window showing that buffer.
 If the value is `second-tab', then the first TAB will pop up the
-window shwoing the completions list buffer, and the next TAB will
+window showing the completions list buffer, and the next TAB will
 switch to that window.
 See `completion-auto-help' for controlling when the window showing
 the completions is popped up and down."
   :type '(choice (const :tag "Don't auto-select completions window" nil)
                  (const :tag "Select completions window on first TAB" t)
-                 (const :tag
-                        "Select completions window on second TAB" second-tab))
+                 (const :tag "Select completions window on second TAB"
+                        second-tab))
   :version "29.1"
   :group 'completion)
 
+(defun first-completion ()
+  "Move to the first item in the completion list."
+  (interactive)
+  (goto-char (point-min))
+  (unless (get-text-property (point) 'mouse-face)
+    (when-let ((pos (next-single-property-change (point) 'mouse-face)))
+      (goto-char pos))))
+
+(defun last-completion ()
+  "Move to the last item in the completion list."
+  (interactive)
+  (goto-char (previous-single-property-change
+              (point-max) 'mouse-face nil (point-min)))
+  ;; Move to the start of last one.
+  (unless (get-text-property (point) 'mouse-face)
+    (when-let ((pos (previous-single-property-change (point) 'mouse-face)))
+      (goto-char pos))))
+
 (defun previous-completion (n)
   "Move to the previous item in the completion list.
 With prefix argument N, move back N items (negative N means move
 forward).
 
-Also see the `completion-wrap-movement' variable."
+Also see the `completion-auto-wrap' variable."
   (interactive "p")
   (next-completion (- n)))
 
@@ -9244,62 +9558,54 @@ Also see the `completion-wrap-movement' variable."
 With prefix argument N, move N items (negative N means move
 backward).
 
-Also see the `completion-wrap-movement' variable."
+Also see the `completion-auto-wrap' variable."
   (interactive "p")
-  (let ((prev (previous-single-property-change (point) 'mouse-face)))
-    (goto-char (cond
-                ((not prev)
-                 (1- (next-single-property-change (point) 'mouse-face)))
-                ((/= prev (point))
-                 (point))
-                (t prev))))
-
-  (let ((beg (point-min))
-        (end (point-max))
-        (tabcommand (member (this-command-keys) '("\t" [backtab])))
-        prop)
+  (let ((tabcommand (member (this-command-keys) '("\t" [backtab])))
+        pos)
     (catch 'bound
       (while (> n 0)
+        (setq pos (point))
         ;; If in a completion, move to the end of it.
-        (when (get-text-property (point) 'mouse-face)
-          (goto-char (next-single-property-change (point) 'mouse-face nil 
end)))
-        ;; If at the last completion option, wrap or skip to the
-        ;; minibuffer, if requested. We can't use (eobp) because some
-        ;; extra text may be after the last candidate: ex: when
-        ;; completion-detailed
-        (setq prop (next-single-property-change (point) 'mouse-face nil end))
-        (when (and completion-wrap-movement (eq end prop))
-          (if (and completion-auto-select tabcommand)
-              (throw 'bound nil)
-            (goto-char (point-min))))
-        ;; Move to start of next one.
-        (unless (get-text-property (point) 'mouse-face)
-          (goto-char (next-single-property-change (point) 'mouse-face nil 
end)))
+        (when (get-text-property pos 'mouse-face)
+          (setq pos (next-single-property-change pos 'mouse-face)))
+        (when pos (setq pos (next-single-property-change pos 'mouse-face)))
+        (if pos
+            ;; Move to the start of next one.
+            (goto-char pos)
+          ;; If at the last completion option, wrap or skip
+          ;; to the minibuffer, if requested.
+          (when completion-auto-wrap
+            (if (and (eq completion-auto-select t) tabcommand
+                     (minibufferp completion-reference-buffer))
+                (throw 'bound nil)
+              (first-completion))))
         (setq n (1- n)))
 
-      (while (and (< n 0) (not (bobp)))
-        (setq prop (get-text-property (1- (point)) 'mouse-face))
+      (while (< n 0)
+        (setq pos (point))
         ;; If in a completion, move to the start of it.
-        (when (and prop (eq prop (get-text-property (point) 'mouse-face)))
-          (goto-char (previous-single-property-change
-                      (point) 'mouse-face nil beg)))
-        ;; Move to end of the previous completion.
-        (unless (or (bobp) (get-text-property (1- (point)) 'mouse-face))
-          (goto-char (previous-single-property-change
-                      (point) 'mouse-face nil beg)))
-        ;; If at the first completion option, wrap or skip to the
-        ;; minibuffer, if requested.
-        (setq prop (previous-single-property-change (point) 'mouse-face nil 
beg))
-        (when (and completion-wrap-movement (eq beg prop))
-          (if (and completion-auto-select tabcommand)
-              (progn
-                (goto-char (next-single-property-change (point) 'mouse-face 
nil end))
-                (throw 'bound nil))
-            (goto-char (point-max))))
-        ;; Move to the start of that one.
-        (goto-char (previous-single-property-change
-                    (point) 'mouse-face nil beg))
+        (when (and (get-text-property pos 'mouse-face)
+                   (not (bobp))
+                   (get-text-property (1- pos) 'mouse-face))
+          (setq pos (previous-single-property-change pos 'mouse-face)))
+        (when pos (setq pos (previous-single-property-change pos 'mouse-face)))
+        (if pos
+            (progn
+              (goto-char pos)
+              ;; Move to the start of that one.
+              (unless (get-text-property (point) 'mouse-face)
+                (goto-char (previous-single-property-change
+                            (point) 'mouse-face nil (point-min)))))
+          ;; If at the first completion option, wrap or skip
+          ;; to the minibuffer, if requested.
+          (when completion-auto-wrap
+            (if (and (eq completion-auto-select t) tabcommand
+                     (minibufferp completion-reference-buffer))
+                (progn
+                  (throw 'bound nil))
+              (last-completion))))
         (setq n (1+ n))))
+
     (when (/= 0 n)
       (switch-to-minibuffer))))
 
@@ -9327,13 +9633,16 @@ minibuffer, but don't quit the completions window."
              (goto-char (posn-point (event-start event)))
              (let (beg)
                (cond
-                ((and (not (eobp)) (get-text-property (point) 'mouse-face))
+                ((and (not (eobp))
+                      (get-text-property (point) 'completion--string))
                  (setq beg (1+ (point))))
                 ((and (not (bobp))
-                      (get-text-property (1- (point)) 'mouse-face))
+                      (get-text-property (1- (point)) 'completion--string))
                  (setq beg (point)))
                 (t (error "No completion here")))
-               (setq beg (previous-single-property-change beg 'mouse-face))
+               (setq beg (or (previous-single-property-change
+                              beg 'completion--string)
+                             beg))
                (substring-no-properties
                 (get-text-property beg 'completion--string))))))
 
@@ -9495,7 +9804,7 @@ Called from `temp-buffer-show-hook'."
           ;; - With fancy completion styles, the code below will not always
           ;;   find the right base directory.
           (if minibuffer-completing-file-name
-              (file-name-as-directory
+              (file-name-directory
                (expand-file-name
                 (buffer-substring (minibuffer-prompt-end) (point)))))))
     (with-current-buffer standard-output
@@ -9520,9 +9829,7 @@ Called from `temp-buffer-show-hook'."
            (insert "Click on a completion to select it.\n"))
        (insert (substitute-command-keys
                 "In this buffer, type \\[choose-completion] to \
-select the completion near point.\n\n")))))
-  (when (eq completion-auto-select t)
-    (switch-to-completions)))
+select the completion near point.\n\n"))))))
 
 (add-hook 'completion-setup-hook #'completion-setup-function)
 
@@ -9539,8 +9846,8 @@ select the completion near point.\n\n")))))
        ((and (memq this-command '(completion-at-point minibuffer-complete))
              (equal (this-command-keys) [backtab]))
         (goto-char (point-max))
-        (previous-completion 1))
-       (t (next-completion 1))))))
+        (last-completion))
+       (t (first-completion))))))
 
 (defun read-expression-switch-to-completions ()
   "Select the completion list window while reading an expression."
@@ -10204,25 +10511,45 @@ This is an integer between 1 and 12 (inclusive).  
January is 1.")
   (year nil :documentation "This is a four digit integer.")
   (weekday nil :documentation "\
 This is a number between 0 and 6, and 0 is Sunday.")
-  (dst nil :documentation "\
+  (dst -1 :documentation "\
 This is t if daylight saving time is in effect, nil if it is not
-in effect, and -1 if daylight saving information is not
-available.")
+in effect, and -1 if daylight saving information is not available.
+Also see `decoded-time-dst'.")
   (zone nil :documentation "\
 This is an integer indicating the UTC offset in seconds, i.e.,
 the number of seconds east of Greenwich.")
   )
 
+;; Document that decoded-time-dst is problematic on 6-element lists.
+;; It should return -1 indicating unknown DST, but currently returns
+;; nil indicating standard time.
+(put 'decoded-time-dst 'function-documentation
+     "Access slot \"dst\" of `decoded-time' struct CL-X.
+This is t if daylight saving time is in effect, nil if it is not
+in effect, and -1 if daylight saving information is not available.
+As a special case, return an unspecified value when given a list
+too short to have a dst element.
+
+(fn CL-X)")
+
+(defun get-scratch-buffer-create ()
+  "Return the *scratch* buffer, creating a new one if needed."
+  (or (get-buffer "*scratch*")
+      (let ((scratch (get-buffer-create "*scratch*")))
+        ;; Don't touch the buffer contents or mode unless we know that
+        ;; we just created it.
+        (with-current-buffer scratch
+          (when initial-scratch-message
+            (insert (substitute-command-keys initial-scratch-message))
+            (set-buffer-modified-p nil))
+          (funcall initial-major-mode))
+        scratch)))
+
 (defun scratch-buffer ()
-  "Switch to the \*scratch\* buffer.
+  "Switch to the *scratch* buffer.
 If the buffer doesn't exist, create it first."
   (interactive)
-  (if (get-buffer "*scratch*")
-      (pop-to-buffer-same-window "*scratch*")
-    (pop-to-buffer-same-window (get-buffer-create "*scratch*"))
-    (when initial-scratch-message
-      (insert initial-scratch-message))
-    (funcall initial-major-mode)))
+  (pop-to-buffer-same-window (get-scratch-buffer-create)))
 
 
 
diff --git a/lisp/so-long.el b/lisp/so-long.el
index f4ae71d905..a2b4282ad6 100644
--- a/lisp/so-long.el
+++ b/lisp/so-long.el
@@ -1518,14 +1518,14 @@ The variables are set in accordance with what was 
remembered in `so-long'."
       (kill-local-variable variable))))
 
 (defun so-long-mode-maintain-preserved-variables ()
-  "Set any 'preserved' variables.
+  "Set any \"preserved\" variables.
 
 The variables are set in accordance with what was remembered in `so-long'."
   (dolist (var (so-long-original 'so-long-mode-preserved-variables))
     (so-long-restore-variable var)))
 
 (defun so-long-mode-maintain-preserved-minor-modes ()
-  "Enable or disable 'preserved' minor modes.
+  "Enable or disable \"preserved\" minor modes.
 
 The modes are set in accordance with what was remembered in `so-long'."
   (dolist (mode (so-long-original 'so-long-mode-preserved-minor-modes))
diff --git a/lisp/speedbar.el b/lisp/speedbar.el
index b2e7be1505..b12cf3d9c2 100644
--- a/lisp/speedbar.el
+++ b/lisp/speedbar.el
@@ -306,10 +306,9 @@ attached to and added to this list before the new frame is 
initialized."
                       (symbol :tag "Parameter")
                       (sexp :tag "Value"))))
 
-(defcustom speedbar-use-imenu-flag (fboundp 'imenu)
+(defcustom speedbar-use-imenu-flag t
   "Non-nil means use imenu for file parsing, nil to use etags.
-XEmacs prior to 20.4 doesn't support imenu, therefore the default is to
-use etags instead.  Etags support is not as robust as imenu support."
+Etags support is not as robust as imenu support." ; See Bug#51102
   :tag "Use Imenu for tags"
   :group 'speedbar
   :type 'boolean)
@@ -800,15 +799,10 @@ This basically creates a sparse keymap, and makes its 
parent be
      ["Auto Update" speedbar-toggle-updates
       :active (not speedbar-update-flag-disable)
       :style toggle :selected speedbar-update-flag])
-   (if (and (or (fboundp 'defimage)
-               (fboundp 'make-image-specifier))
-           (if (fboundp 'display-graphic-p)
-               (display-graphic-p)
-             window-system))
-       (list
-       ["Use Images" speedbar-toggle-images
-        :style toggle :selected speedbar-use-images]))
-   )
+   (when (and (fboundp 'defimage) (display-graphic-p))
+     (list
+      ["Use Images" speedbar-toggle-images
+       :style toggle :selected speedbar-use-images])))
   "Base part of the speedbar menu.")
 
 (defvar speedbar-easymenu-definition-special
@@ -2276,9 +2270,7 @@ the list."
                      (with-current-buffer (get-file-buffer f)
                         speedbar-tag-hierarchy-method)
                    speedbar-tag-hierarchy-method))
-        (lst (if (fboundp 'copy-tree)
-                 (copy-tree lst)
-               lst)))
+         (lst (copy-tree lst)))
     (while methods
       (setq lst (funcall (car methods) lst)
            methods (cdr methods)))
diff --git a/lisp/sqlite-mode.el b/lisp/sqlite-mode.el
index ba1b81ef7e..66e2e487d9 100644
--- a/lisp/sqlite-mode.el
+++ b/lisp/sqlite-mode.el
@@ -129,15 +129,23 @@
             (insert (format "  %s\n" column))))))))
 
 (defun sqlite-mode--column-names (table)
+  "Return a list of the column names for TABLE."
   (let ((sql
          (caar
           (sqlite-select
            sqlite--db
            "select sql from sqlite_master where tbl_name = ? AND type = 
'table'"
            (list table)))))
-    (mapcar
-     #'string-trim
-     (split-string (replace-regexp-in-string "^.*(\\|)$" "" sql) ","))))
+    (with-temp-buffer
+      (insert sql)
+      (mapcar #'string-trim
+              (split-string
+               ;; Extract the args to CREATE TABLE.  Point is
+               ;; currently at its end.
+               (buffer-substring
+                (1- (point))                          ; right before )
+                (1+ (progn (backward-sexp) (point)))) ; right after (
+               ",")))))
 
 (defun sqlite-mode-list-data ()
   "List the data from the table under point."
diff --git a/lisp/startup.el b/lisp/startup.el
index 0b7d90ecf2..4b42cd236c 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -557,25 +557,12 @@ to `user-emacs-directory'.
 For best results, call this function in your early-init file,
 so that the rest of initialization and package loading uses
 the updated value."
-  (let ((tmp-dir (and (equal (getenv "HOME") "/nonexistent")
-                      (file-writable-p (expand-file-name
-                                        (or temporary-file-directory "")))
-                      (car native-comp-eln-load-path))))
-    (if tmp-dir
-        (setq native-comp-eln-load-path
-              (cdr native-comp-eln-load-path)))
-    ;; Remove the original eln-cache.
-    (setq native-comp-eln-load-path
-          (cdr native-comp-eln-load-path))
-    ;; Add the new eln-cache.
-    (push (expand-file-name (file-name-as-directory cache-directory)
-                            user-emacs-directory)
-          native-comp-eln-load-path)
-    (when tmp-dir
-      ;; Recompute tmp-dir, in case user-emacs-directory affects it.
-      (setq tmp-dir (make-temp-file "emacs-testsuite-" t))
-      (add-hook 'kill-emacs-hook (lambda () (delete-directory tmp-dir t)))
-      (push tmp-dir native-comp-eln-load-path))))
+  ;; Remove the original eln-cache.
+  (setq native-comp-eln-load-path (cdr native-comp-eln-load-path))
+  ;; Add the new eln-cache.
+  (push (expand-file-name (file-name-as-directory cache-directory)
+                          user-emacs-directory)
+        native-comp-eln-load-path))
 
 (defun startup--update-eln-cache ()
   "Update the user eln-cache directory due to user customizations."
@@ -619,18 +606,7 @@ It is the default value of the variable `top-level'."
             (unless (string= "" path)
               (push path native-comp-eln-load-path)))))
       (push (expand-file-name "eln-cache/" user-emacs-directory)
-            native-comp-eln-load-path)
-      ;; When $HOME is set to '/nonexistent' means we are running the
-      ;; testsuite, add a temporary folder in front to produce there
-      ;; new compilations.
-      (when (and (equal (getenv "HOME") "/nonexistent")
-                 ;; We may be running in a chroot environment where we
-                 ;; can't write anything.
-                 (file-writable-p (expand-file-name
-                                   (or temporary-file-directory ""))))
-        (let ((tmp-dir (make-temp-file "emacs-testsuite-" t)))
-          (add-hook 'kill-emacs-hook (lambda () (delete-directory tmp-dir t)))
-          (push tmp-dir native-comp-eln-load-path))))
+            native-comp-eln-load-path))
 
     ;; Look in each dir in load-path for a subdirs.el file.  If we
     ;; find one, load it, which will add the appropriate subdirs of
@@ -2358,7 +2334,7 @@ If you have no Meta key, you may instead type ESC 
followed by the character.)"))
   (insert "\t\t")
   (insert-button "Open *scratch* buffer"
                 'action (lambda (_button) (switch-to-buffer
-                                       (startup--get-buffer-create-scratch)))
+                                       (get-scratch-buffer-create)))
                 'follow-link t)
   (insert "\n")
   (save-restriction
@@ -2490,12 +2466,6 @@ A fancy display is used on graphic displays, normal 
otherwise."
 (defalias 'about-emacs 'display-about-screen)
 (defalias 'display-splash-screen 'display-startup-screen)
 
-(defun startup--get-buffer-create-scratch ()
-  (or (get-buffer "*scratch*")
-      (with-current-buffer (get-buffer-create "*scratch*")
-        (set-buffer-major-mode (current-buffer))
-        (current-buffer))))
-
 ;; This avoids byte-compiler warning in the unexec build.
 (declare-function pdumper-stats "pdumper.c" ())
 
@@ -2787,7 +2757,7 @@ nil default-directory" name)
     (when (eq initial-buffer-choice t)
       ;; When `initial-buffer-choice' equals t make sure that *scratch*
       ;; exists.
-      (startup--get-buffer-create-scratch))
+      (get-scratch-buffer-create))
 
     ;; If *scratch* exists and is empty, insert initial-scratch-message.
     ;; Do this before switching to *scratch* below to handle bug#9605.
@@ -2811,7 +2781,7 @@ nil default-directory" name)
                   ((functionp initial-buffer-choice)
                    (funcall initial-buffer-choice))
                    ((eq initial-buffer-choice t)
-                    (startup--get-buffer-create-scratch))
+                    (get-scratch-buffer-create))
                    (t
                     (error "`initial-buffer-choice' must be a string, a 
function, or t")))))
         (unless (buffer-live-p buf)
diff --git a/lisp/strokes.el b/lisp/strokes.el
index dc242d8f33..5402ebf1e1 100644
--- a/lisp/strokes.el
+++ b/lisp/strokes.el
@@ -1036,8 +1036,8 @@ o Strokes are a bit computer-dependent in that they 
depend somewhat on
 (defun strokes-window-configuration-changed-p ()
   "Non-nil if the `strokes-window-configuration' frame properties changed.
 This is based on the last time `strokes-window-configuration' was updated."
-  (compare-window-configurations (current-window-configuration)
-                                strokes-window-configuration))
+  (window-configuration-equal-p (current-window-configuration)
+                               strokes-window-configuration))
 
 (defun strokes-update-window-configuration ()
   "Ensure that `strokes-window-configuration' is up-to-date."
diff --git a/lisp/subr.el b/lisp/subr.el
index 5af802fa18..50ae357a13 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -441,7 +441,10 @@ To signal with MESSAGE without interpreting format 
characters
 like `%', `\\=`' and `\\='', use (error \"%s\" MESSAGE).
 In Emacs, the convention is that error messages start with a capital
 letter but *do not* end with a period.  Please follow this convention
-for the sake of consistency."
+for the sake of consistency.
+
+To alter the look of the displayed error messages, you can use
+the `command-error-function' variable."
   (declare (advertised-calling-convention (string &rest args) "23.1"))
   (signal 'error (list (apply #'format-message args))))
 
@@ -457,7 +460,10 @@ To signal with MESSAGE without interpreting format 
characters
 like `%', `\\=`' and `\\='', use (user-error \"%s\" MESSAGE).
 In Emacs, the convention is that error messages start with a capital
 letter but *do not* end with a period.  Please follow this convention
-for the sake of consistency."
+for the sake of consistency.
+
+To alter the look of the displayed error messages, you can use
+the `command-error-function' variable."
   (signal 'user-error (list (apply #'format-message format args))))
 
 (defun define-error (name message &optional parent)
@@ -1699,13 +1705,19 @@ pixels.  POSITION should be a list of the form returned 
by
 
 (declare-function scroll-bar-scale "scroll-bar" (num-denom whole))
 
-(defun posn-col-row (position)
+(defun posn-col-row (position &optional use-window)
   "Return the nominal column and row in POSITION, measured in characters.
 The column and row values are approximations calculated from the x
 and y coordinates in POSITION and the frame's default character width
 and default line height, including spacing.
+
+If USE-WINDOW is non-nil, use the typical width of a character in
+the window indicated by POSITION instead of the frame.  (This
+makes a difference is a window has a zoom level.)
+
 For a scroll-bar event, the result column is 0, and the row
 corresponds to the vertical position of the click in the scroll bar.
+
 POSITION should be a list of the form returned by the `event-start'
 and `event-end' functions."
   (let* ((pair            (posn-x-y position))
@@ -1723,20 +1735,23 @@ and `event-end' functions."
      ((eq area 'horizontal-scroll-bar)
       (cons (scroll-bar-scale pair (window-width window)) 0))
      (t
-      ;; FIXME: This should take line-spacing properties on
-      ;; newlines into account.
-      (let* ((spacing (when (display-graphic-p frame)
-                        (or (with-current-buffer
-                                (window-buffer (frame-selected-window frame))
-                              line-spacing)
-                            (frame-parameter frame 'line-spacing)))))
-       (cond ((floatp spacing)
-              (setq spacing (truncate (* spacing
-                                         (frame-char-height frame)))))
-             ((null spacing)
-              (setq spacing 0)))
-       (cons (/ (car pair) (frame-char-width frame))
-             (/ (cdr pair) (+ (frame-char-height frame) spacing))))))))
+      (if use-window
+          (cons (/ (car pair) (window-font-width window))
+                (/ (cdr pair) (window-font-height window)))
+        ;; FIXME: This should take line-spacing properties on
+        ;; newlines into account.
+        (let* ((spacing (when (display-graphic-p frame)
+                          (or (with-current-buffer
+                                  (window-buffer (frame-selected-window frame))
+                                line-spacing)
+                              (frame-parameter frame 'line-spacing)))))
+         (cond ((floatp spacing)
+                (setq spacing (truncate (* spacing
+                                           (frame-char-height frame)))))
+               ((null spacing)
+                (setq spacing 0)))
+         (cons (/ (car pair) (frame-char-width frame))
+               (/ (cdr pair) (+ (frame-char-height frame) spacing)))))))))
 
 (defun posn-actual-col-row (position)
   "Return the window row number in POSITION and character number in that row.
@@ -1874,6 +1889,9 @@ This was used internally by quail.el and keyboard.c in 
Emacs 27.
 It does nothing in Emacs 28.")
 (make-obsolete-variable 'inhibit--record-char nil "28.1")
 
+(define-obsolete-function-alias 'compare-window-configurations
+  #'window-configuration-equal-p "29.1")
+
 ;; We can't actually make `values' obsolete, because that will result
 ;; in warnings when using `values' in let-bindings.
 ;;(make-obsolete-variable 'values "no longer used" "28.1")
@@ -3055,7 +3073,8 @@ DEFAULT specifies a default value to return if the user 
just types RET.
 The value of DEFAULT is inserted into PROMPT.
 HIST specifies a history list variable.  See `read-from-minibuffer'
 for details of the HIST argument.
-This function is used by the `interactive' code letter `n'."
+
+This function is used by the `interactive' code letter \"n\"."
   (let ((n nil)
        (default1 (if (consp default) (car default) default)))
     (when default1
@@ -4069,7 +4088,12 @@ remove properties specified by 
`yank-excluded-properties'."
 
 This function is like `insert', except it honors the variables
 `yank-handled-properties' and `yank-excluded-properties', and the
-`yank-handler' text property, in the way that `yank' does."
+`yank-handler' text property, in the way that `yank' does.
+
+It also runs the string through `yank-transform-functions'."
+  ;; Allow altering the yank string.
+  (run-hook-wrapped 'yank-transform-functions
+                    (lambda (f) (setq string (funcall f string)) nil))
   (let (to)
     (while (setq to (next-single-property-change 0 'yank-handler string))
       (insert-for-yank-1 (substring string 0 to))
@@ -4602,8 +4626,9 @@ of that nature."
        (unwind-protect
            (progn
              ,@body)
-         (unless ,modified
-           (restore-buffer-modified-p nil))))))
+         (when (or (not ,modified)
+                   (eq ,modified 'autosaved))
+           (restore-buffer-modified-p ,modified))))))
 
 (defmacro with-output-to-string (&rest body)
   "Execute BODY, return the text it sent to `standard-output', as a string."
@@ -6033,6 +6058,10 @@ to deactivate this transient map, regardless of 
KEEP-PRED."
                         t)
                        ((eq t keep-pred)
                         (let ((mc (lookup-key map (this-command-keys-vector))))
+                          ;; We may have a remapped command, so chase
+                          ;; down that.
+                          (when (and mc (symbolp mc))
+                            (setq mc (or (command-remapping mc) mc)))
                           ;; If the key is unbound `this-command` is
                           ;; nil and so is `mc`.
                           (and mc (eq this-command mc))))
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 42c4b822bc..705b072501 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -476,7 +476,7 @@ that was current before calling the command that adds a new 
tab
 (this is the same what `make-frame' does by default).
 If the value is the symbol `window', then keep the selected
 window as a single window on the new tab, and keep all its
-window parameters except 'window-atom' and 'window-side'.
+window parameters except `window-atom' and `window-side'.
 If the value is a string, use it as a buffer name to switch to
 if such buffer exists, or switch to a buffer visiting the file or
 directory that the string specifies.  If the value is a function,
@@ -2320,9 +2320,9 @@ Interactively, prompt for the buffer to switch to."
   (declare (advertised-calling-convention (buffer-or-name) "28.1"))
   (interactive
    (list (read-buffer-to-switch "Switch to buffer in other tab: ")))
-  (display-buffer (window-normalize-buffer-to-switch-to buffer-or-name)
-                  '((display-buffer-in-tab)
-                    (inhibit-same-window . nil))))
+  (pop-to-buffer (window-normalize-buffer-to-switch-to buffer-or-name)
+                 '((display-buffer-in-tab)
+                   (inhibit-same-window . nil))))
 
 (defun find-file-other-tab (filename &optional wildcards)
   "Edit file FILENAME, in another tab.
diff --git a/lisp/term.el b/lisp/term.el
index 3e05d529cd..f81cbf7293 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -918,6 +918,13 @@ is buffer-local."
   :type 'integer
   :version "27.1")
 
+(defcustom term-bind-function-keys nil
+  "If nil, don't alter <f1>, <f2> and so on.
+If non-nil, bind these keys in `term-mode' and send them to the
+underlying shell."
+  :type 'boolean
+  :version "29.1")
+
 
 ;; Set up term-raw-map, etc.
 
@@ -958,6 +965,10 @@ is buffer-local."
     (define-key map [next] 'term-send-next)
     (define-key map [xterm-paste] #'term--xterm-paste)
     (define-key map [?\C-/] #'term-send-C-_)
+
+    (when term-bind-function-keys
+      (dotimes (key 21)
+        (keymap-set map (format "<f%d>" key) #'term-send-function-key)))
     map)
   "Keyboard map for sending characters directly to the inferior process.")
 
@@ -1411,6 +1422,26 @@ Entry to this mode runs the hooks on `term-mode-hook'."
 (defun term-send-del   () (interactive) (term-send-raw-string "\e[3~"))
 (defun term-send-backspace  () (interactive) (term-send-raw-string "\C-?"))
 (defun term-send-C-_  () (interactive) (term-send-raw-string "\C-_"))
+
+(defun term-send-function-key ()
+  "If bound to a function key, this will send that key to the underlying 
shell."
+  (interactive)
+  (let ((key (this-command-keys-vector)))
+    (when (and (= (length key) 1)
+               (symbolp (elt key 0)))
+      (let ((name (symbol-name (elt key 0))))
+        (when (string-match "\\`f\\([0-9]+\\)\\'" name)
+          (let* ((num (string-to-number (match-string 1 name)))
+                 (ansi
+                  (cond
+                   ((<= num 5) (+ num 10))
+                   ((<= num 10) (+ num 11))
+                   ((<= num 14) (+ num 12))
+                   ((<= num 16) (+ num 13))
+                   ((<= num 20) (+ num 14)))))
+            (when ansi
+              (term-send-raw-string (format "\e[%d~" ansi)))))))))
+
 
 (defun term-char-mode ()
   "Switch to char (\"raw\") sub-mode of term mode.
@@ -1550,7 +1581,8 @@ commands to use in that buffer.
                                         (or explicit-shell-file-name
                                             (getenv "ESHELL")
                                             shell-file-name))))
-  (set-buffer (make-term "terminal" program))
+  (let ((prog (split-string-shell-command program)))
+    (set-buffer (apply #'make-term "terminal" (car prog) nil (cdr prog))))
   (term-char-mode)
   (pop-to-buffer-same-window "*terminal*"))
 
@@ -4368,7 +4400,10 @@ and `C-x' being marked as a `term-escape-char'."
   ;; for now they have the *term-ansi-term*<?> form but we'll see...
 
   (setq term-ansi-buffer-name (generate-new-buffer-name term-ansi-buffer-name))
-  (setq term-ansi-buffer-name (term-ansi-make-term term-ansi-buffer-name 
program))
+  (let ((prog (split-string-shell-command program)))
+    (setq term-ansi-buffer-name
+          (apply #'term-ansi-make-term term-ansi-buffer-name (car prog)
+                 nil (cdr prog))))
 
   (set-buffer term-ansi-buffer-name)
   (term-mode)
diff --git a/lisp/term/haiku-win.el b/lisp/term/haiku-win.el
index 5f02087732..5443904a73 100644
--- a/lisp/term/haiku-win.el
+++ b/lisp/term/haiku-win.el
@@ -52,7 +52,8 @@
   "The local value of the special `XdndSelection' selection.")
 
 (defvar haiku-dnd-selection-converters '((STRING . haiku-dnd-convert-string)
-                                         (text/uri-list . 
haiku-dnd-convert-uri-list))
+                                         (FILE_NAME . 
haiku-dnd-convert-file-name)
+                                         (text/uri-list . 
haiku-dnd-convert-text-uri-list))
   "Alist of X selection types to functions that act as selection converters.
 The functions should accept a single argument VALUE, describing
 the value of the drag-and-drop selection, and return a list of
@@ -60,9 +61,14 @@ two elements TYPE and DATA, where TYPE is a string 
containing the
 MIME type of DATA, and DATA is a unibyte string, or nil if the
 data could not be converted.
 
+DATA may also be a list of items; that means to add every
+individual item in DATA to the serialized message, instead of
+DATA in its entirety.
+
 DATA can optionally have a text property `type', which specifies
 the type of DATA inside the system message (see the doc string of
-`haiku-drag-message' for more details).")
+`haiku-drag-message' for more details).  If DATA is a list, then
+that property is obtained from the first element of DATA.")
 
 (defvar haiku-normal-selection-encoders '(haiku-select-encode-xstring
                                           haiku-select-encode-utf-8-string
@@ -99,6 +105,7 @@ for more details on the structure of the associations.")
        "B_LINK_VISITED_COLOR" "B_LINK_ACTIVE_COLOR"
        "B_STATUS_BAR_COLOR" "B_SUCCESS_COLOR" "B_FAILURE_COLOR"])
 
+(defvar x-colors)
 ;; Also update `x-colors' to take that into account.
 (setq x-colors (append haiku-allowed-ui-colors x-colors))
 
@@ -140,11 +147,31 @@ VALUE as a unibyte string, or nil if VALUE was not a 
string."
     (list "text/plain" (string-to-unibyte
                         (encode-coding-string value 'utf-8)))))
 
-(defun haiku-dnd-convert-uri-list (value)
+(defun haiku-dnd-convert-file-name (value)
   "Convert VALUE to a file system reference if it is a file name."
-  (when (and (stringp value)
-             (file-exists-p value))
-    (list "refs" (propertize (expand-file-name value) 'type 'ref))))
+  (cond ((and (stringp value)
+              (not (file-remote-p value))
+              (file-exists-p value))
+         (list "refs" (propertize (expand-file-name value)
+                                  'type 'ref)))
+        ((vectorp value)
+         (list "refs"
+               (cl-loop for item across value
+                        collect (propertize (expand-file-name item)
+                                            'type 'ref))))))
+
+(defun haiku-dnd-convert-text-uri-list (value)
+  "Convert VALUE to a list of URLs."
+  (cond
+   ((stringp value) (list "text/uri-list"
+                          (concat (url-encode-url value) "\n")))
+   ((vectorp value) (list "text/uri-list"
+                          (with-temp-buffer
+                            (cl-loop for tem across value
+                                     do (progn
+                                          (insert (url-encode-url tem))
+                                          (insert "\n")))
+                            (buffer-string))))))
 
 (declare-function x-open-connection "haikufns.c")
 (declare-function x-handle-args "common-win")
@@ -169,7 +196,6 @@ The resources should be a list of strings in 
COMMAND-LINE-RESOURCES."
   "Set up the window system.  WINDOW-SYSTEM must be HAIKU.
 DISPLAY may be set to the name of a display that will be initialized."
   (cl-assert (not haiku-initialized))
-
   (create-default-fontset)
   (when x-command-line-resources
     (haiku--handle-x-command-line-resources
@@ -285,17 +311,24 @@ or a pair of markers) and turns it into a file system 
reference."
     (if (eq string 'lambda) ; This means the mouse moved.
         (dnd-handle-movement (event-start event))
       (cond
+       ;; Don't allow dropping on something other than the text area.
+       ;; It does nothing and doesn't work with text anyway.
+       ((posn-area (event-start event)))
        ((assoc "refs" string)
         (with-selected-window window
-          (raise-frame)
           (dolist (filename (cddr (assoc "refs" string)))
             (dnd-handle-one-url window 'private
                                 (concat "file:" filename)))))
+       ((assoc "text/uri-list" string)
+        (dolist (text (cddr (assoc "text/uri-list" string)))
+          (let ((uri-list (split-string text "[\0\r\n]" t)))
+            (dolist (bf uri-list)
+              (dnd-handle-one-url window 'private bf)))))
        ((assoc "text/plain" string)
         (with-selected-window window
-          (raise-frame)
           (dolist (text (cddr (assoc "text/plain" string)))
-            (goto-char (posn-point (event-start event)))
+            (unless mouse-yank-at-point
+              (goto-char (posn-point (event-start event))))
             (dnd-insert-text window 'private
                              (if (multibyte-string-p text)
                                  text
@@ -331,7 +364,8 @@ take effect on menu items until the menu bar is updated 
again."
 
 (setq haiku-drag-track-function #'haiku-dnd-drag-handler)
 
-(defun x-begin-drag (targets &optional action frame _return-frame 
allow-current-frame)
+(defun x-begin-drag (targets &optional action frame _return-frame
+                             allow-current-frame follow-tooltip)
   "SKIP: real doc in xfns.c."
   (unless haiku-dnd-selection-value
     (error "No local value for XdndSelection"))
@@ -339,30 +373,42 @@ take effect on menu items until the menu bar is updated 
again."
         (mouse-highlight nil)
         (haiku-signal-invalid-refs nil))
     (dolist (target targets)
-      (let ((selection-converter (cdr (assoc (intern target)
-                                             haiku-dnd-selection-converters))))
+      (let* ((target-atom (intern target))
+             (selection-converter (cdr (assoc target-atom
+                                              haiku-dnd-selection-converters)))
+             (value (if (stringp haiku-dnd-selection-value)
+                        (or (get-text-property 0 target-atom
+                                               haiku-dnd-selection-value)
+                            haiku-dnd-selection-value)
+                      haiku-dnd-selection-value)))
         (when selection-converter
-          (let ((selection-result
-                 (funcall selection-converter
-                          haiku-dnd-selection-value)))
+          (let ((selection-result (funcall selection-converter value)))
             (when selection-result
-              (let ((field (cdr (assoc (car selection-result) message))))
+              (let* ((field (cdr (assoc (car selection-result) message)))
+                     (maybe-string (if (stringp (cadr selection-result))
+                                       (cadr selection-result)
+                                     (caadr selection-result))))
                 (unless (cadr field)
                   ;; Add B_MIME_TYPE to the message if the type was not
                   ;; previously specified, or the type if it was.
-                  (push (or (get-text-property 0 'type
-                                               (cadr selection-result))
+                  (push (or (get-text-property 0 'type maybe-string)
                             1296649541)
                         (alist-get (car selection-result) message
                                    nil nil #'equal))))
-              (push (cadr selection-result)
-                    (cdr (alist-get (car selection-result) message
-                                    nil nil #'equal))))))))
+              (if (not (consp (cadr selection-result)))
+                  (push (cadr selection-result)
+                        (cdr (alist-get (car selection-result) message
+                                        nil nil #'equal)))
+                (dolist (tem (cadr selection-result))
+                  (push tem
+                        (cdr (alist-get (car selection-result) message
+                                        nil nil #'equal))))))))))
     (prog1 (or (and (symbolp action)
                     action)
                'XdndActionCopy)
       (haiku-drag-message (or frame (selected-frame))
-                          message allow-current-frame))))
+                          message allow-current-frame
+                          follow-tooltip))))
 
 (add-variable-watcher 'use-system-tooltips #'haiku-use-system-tooltips-watcher)
 
@@ -391,6 +437,37 @@ take effect on menu items until the menu bar is updated 
again."
     ;; the Deskbar will not, so kill ourself here.
     (unless cancel-shutdown (kill-emacs))))
 
+
+;;;; Cursors.
+
+;; We use the same interface as X, but the cursor numbers are
+;; different, and there are also less cursors.
+
+(defconst x-pointer-X-cursor 5)                        ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-arrow 1)                   ; B_CURSOR_ID_SYSTEM_DEFAULT
+(defconst x-pointer-bottom-left-corner 22)     ; B_CURSOR_ID_RESIZE_SOUTH_WEST
+(defconst x-pointer-bottom-right-corner 21)    ; B_CURSOR_ID_RESIZE_SOUTH_EAST
+(defconst x-pointer-bottom-side 17)            ; B_CURSOR_ID_RESIZE_SOUTH
+(defconst x-pointer-clock 14)                  ; B_CURSOR_ID_PROGRESS
+(defconst x-pointer-cross 5)                   ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-cross-reverse 5)           ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-crosshair 5)               ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-diamond-cross 5)           ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-hand1 7)                   ; B_CURSOR_ID_GRAB
+(defconst x-pointer-hand2 8)                   ; B_CURSOR_ID_GRABBING
+(defconst x-pointer-left-side 18)              ; B_CURSOR_ID_RESIZE_WEST
+(defconst x-pointer-right-side 16)             ; B_CURSOR_ID_RESIZE_EAST
+(defconst x-pointer-sb-down-arrow 17)          ; B_CURSOR_ID_RESIZE_SOUTH
+(defconst x-pointer-sb-left-arrow 18)          ; B_CURSOR_ID_RESIZE_WEST
+(defconst x-pointer-sb-right-arrow 16)         ; B_CURSOR_ID_RESIZE_EAST
+(defconst x-pointer-sb-up-arrow 16)            ; B_CURSOR_ID_RESIZE_NORTH
+(defconst x-pointer-target 5)                  ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-top-left-corner 20)                ; 
B_CURSOR_ID_RESIZE_NORTH_WEST
+(defconst x-pointer-top-right-corner 19)       ; B_CURSOR_ID_RESIZE_NORTH_EAST
+(defconst x-pointer-top-side 16)               ; B_CURSOR_ID_RESIZE_NORTH
+(defconst x-pointer-watch 14)                  ; B_CURSOR_ID_PROGRESS
+(defconst x-pointer-invisible 12)              ; B_CURSOR_ID_NO_CURSOR
+
 (provide 'haiku-win)
 (provide 'term/haiku-win)
 
diff --git a/lisp/term/linux.el b/lisp/term/linux.el
index 6d43e477ac..ab5a6d8698 100644
--- a/lisp/term/linux.el
+++ b/lisp/term/linux.el
@@ -17,6 +17,10 @@
 
   (ignore-errors (when gpm-mouse-mode (require 't-mouse) (gpm-mouse-enable)))
 
+  ;; Don't translate ESC TAB to backtab as directed
+  ;; by ncurses-6.3.
+  (define-key input-decode-map "\e\t" nil)
+  
   ;; Make Latin-1 input characters work, too.
   ;; Meta will continue to work, because the kernel
   ;; turns that into Escape.
diff --git a/lisp/term/ns-win.el b/lisp/term/ns-win.el
index 6a414d83f1..84c5b087b9 100644
--- a/lisp/term/ns-win.el
+++ b/lisp/term/ns-win.el
@@ -142,7 +142,7 @@ The properties returned may include `top', `left', 
`height', and `width'."
 (define-key global-map [?\s-p] 'ns-print-buffer)
 (define-key global-map [?\s-q] 'save-buffers-kill-emacs)
 (define-key global-map [?\s-s] 'save-buffer)
-(define-key global-map [?\s-t] 'ns-popup-font-panel)
+(define-key global-map [?\s-t] 'menu-set-font)
 (define-key global-map [?\s-u] 'revert-buffer)
 (define-key global-map [?\s-v] 'yank)
 (define-key global-map [?\s-w] 'delete-frame)
@@ -870,12 +870,18 @@ See the documentation of 
`create-fontset-from-fontset-spec' for the format.")
 (declare-function ns-disown-selection-internal "nsselect.m" (selection))
 (declare-function ns-selection-owner-p "nsselect.m" (&optional selection))
 (declare-function ns-selection-exists-p "nsselect.m" (&optional selection))
+(declare-function ns-begin-drag "nsselect.m")
+
+(defvar ns-dnd-selection-value nil
+  "The value of the special `XdndSelection' selection on NS.")
+
 (declare-function ns-get-selection "nsselect.m" (selection-symbol target-type))
 
-(cl-defmethod gui-backend-set-selection (selection value
-                                         &context (window-system ns))
-  (if value (ns-own-selection-internal selection value)
-    (ns-disown-selection-internal selection)))
+(cl-defmethod gui-backend-set-selection (selection value &context 
(window-system ns))
+  (if (eq selection 'XdndSelection)
+      (setq ns-dnd-selection-value value)
+    (if value (ns-own-selection-internal selection value)
+      (ns-disown-selection-internal selection))))
 
 (cl-defmethod gui-backend-selection-owner-p (selection
                                              &context (window-system ns))
@@ -889,6 +895,41 @@ See the documentation of 
`create-fontset-from-fontset-spec' for the format.")
                                          &context (window-system ns))
   (ns-get-selection selection-symbol target-type))
 
+(defun x-begin-drag (targets &optional action frame return-frame
+                             allow-current-frame follow-tooltip)
+  "SKIP: real doc in xfns.c."
+  (unless ns-dnd-selection-value
+    (error "No local value for XdndSelection"))
+  (let ((pasteboard nil))
+    (when (and (member "STRING" targets)
+               (stringp ns-dnd-selection-value))
+      (push (cons 'string ns-dnd-selection-value) pasteboard))
+    (when (and (member "FILE_NAME" targets)
+               (file-exists-p ns-dnd-selection-value))
+      (let ((value (if (stringp ns-dnd-selection-value)
+                       (or (get-text-property 0 'FILE_NAME
+                                              ns-dnd-selection-value)
+                           ns-dnd-selection-value)
+                     ns-dnd-selection-value)))
+        (if (vectorp value)
+            (push (cons 'file
+                        (cl-loop for file across value
+                                 collect (expand-file-name file)))
+                  pasteboard)
+          (push (cons 'file
+                      (url-encode-url (concat "file://"
+                                              (expand-file-name
+                                               ns-dnd-selection-value))))
+                pasteboard))))
+    (ns-begin-drag frame pasteboard action return-frame
+                   allow-current-frame follow-tooltip)))
+
+(defun ns-handle-drag-motion (frame x y)
+  "Handle mouse movement on FRAME at X and Y during drag-and-drop.
+This moves point to the current mouse position if
+ `dnd-indicate-insertion-point' is enabled."
+  (dnd-handle-movement (posn-at-x-y x y frame)))
+
 (provide 'ns-win)
 (provide 'term/ns-win)
 
diff --git a/lisp/term/pgtk-win.el b/lisp/term/pgtk-win.el
index 5317f6ba01..8abea3edba 100644
--- a/lisp/term/pgtk-win.el
+++ b/lisp/term/pgtk-win.el
@@ -45,7 +45,6 @@
 (defvar pgtk-use-im-context-on-new-connection)
 
 (declare-function pgtk-use-im-context "pgtkim.c")
-(declare-function pgtk-hide-emacs "pgtkfns.c" (on))
 
 (defun pgtk-drag-n-drop (event &optional new-frame force-text)
   "Edit the files listed in the drag-n-drop EVENT.
@@ -97,7 +96,7 @@ the last file dropped is selected."
 (declare-function x-handle-args "common-win" (args))
 (declare-function x-open-connection "pgtkfns.c"
                   (display &optional xrm-string must-succeed))
-(declare-function pgtk-set-resource "pgtkfns.c" (owner name value))
+(declare-function pgtk-set-resource "pgtkfns.c" (attribute value))
 
 ;; Do the actual window system setup here; the above code just defines
 ;; functions and variables that we use now.
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
index ca38a0a8c9..1f29b24ef2 100644
--- a/lisp/term/x-win.el
+++ b/lisp/term/x-win.el
@@ -241,7 +241,9 @@ exists."
 (defconst x-pointer-ur-angle 148)
 (defconst x-pointer-watch 150)
 (defconst x-pointer-xterm 152)
-(defconst x-pointer-invisible 255)
+(defconst x-pointer-invisible 65536) ;; This value is larger than a
+                                     ;; CARD16, so it cannot be a
+                                     ;; valid cursor.
 
 
 ;;;; Keysyms
@@ -1557,7 +1559,7 @@ EVENT is a preedit-text event."
 
 (defvaralias 'x-gtk-use-system-tooltips 'use-system-tooltips)
 
-(declare-function x-internal-focus-input-context (focus frame) "xfns.c")
+(declare-function x-internal-focus-input-context "xfns.c" (focus))
 
 (defun x-gtk-use-native-input-watcher (_symbol newval &rest _ignored)
   "Variable watcher for `x-gtk-use-native-input'.
diff --git a/lisp/textmodes/artist.el b/lisp/textmodes/artist.el
index 686d5f494c..ff4311c3ac 100644
--- a/lisp/textmodes/artist.el
+++ b/lisp/textmodes/artist.el
@@ -4919,7 +4919,7 @@ The event, EV, is the mouse event."
         (arrow-set-fn (artist-go-get-arrow-set-fn-from-symbol op))
         (ev-start     (event-start ev))
         (initial-win  (posn-window ev-start))
-        (ev-start-pos (artist-coord-win-to-buf (posn-col-row ev-start)))
+        (ev-start-pos (artist-coord-win-to-buf (posn-col-row ev-start t)))
         (x1           (artist--adjust-x (car ev-start-pos)))
         (y1           (cdr ev-start-pos))
         (timer nil))
@@ -4935,7 +4935,7 @@ The event, EV, is the mouse event."
           (while (or (mouse-movement-p ev)
                      (member 'down (event-modifiers ev)))
             (setq ev-start-pos (artist-coord-win-to-buf
-                                (posn-col-row (event-start ev))))
+                                (posn-col-row (event-start ev) t)))
             (setq x1 (artist--adjust-x (car ev-start-pos)))
             (setq y1 (cdr ev-start-pos))
 
@@ -5015,7 +5015,7 @@ The event, EV, is the mouse event."
         (arrow-set-fn (artist-go-get-arrow-set-fn-from-symbol op))
         (ev-start     (event-start ev))
         (initial-win  (posn-window ev-start))
-        (ev-start-pos (artist-coord-win-to-buf (posn-col-row ev-start)))
+        (ev-start-pos (artist-coord-win-to-buf (posn-col-row ev-start t)))
         (x1-last      (artist--adjust-x (car ev-start-pos)))
         (y1-last      (cdr ev-start-pos))
         (x2           x1-last)
@@ -5107,7 +5107,7 @@ The event, EV, is the mouse event."
              ;; set x2 and y2
              ;;
              (setq ev-start-pos (artist-coord-win-to-buf
-                                 (posn-col-row (event-start ev))))
+                                 (posn-col-row (event-start ev) t)))
              (setq x2 (artist--adjust-x (car ev-start-pos)))
              (setq y2 (cdr ev-start-pos))
 
@@ -5134,7 +5134,7 @@ The event, EV, is the mouse event."
          ;;
          ;; set x2 and y2
          (setq ev-start-pos (artist-coord-win-to-buf
-                             (posn-col-row (event-start ev))))
+                             (posn-col-row (event-start ev) t)))
          (setq x2 (artist--adjust-x (car ev-start-pos)))
          (setq y2 (cdr ev-start-pos))
 
@@ -5218,7 +5218,8 @@ Operation is done once.  The event, EV, is the mouse 
event."
         (arrow-pred   (artist-go-get-arrow-pred-from-symbol op))
         (arrow-set-fn (artist-go-get-arrow-set-fn-from-symbol op))
         (ev-start     (event-start ev))
-        (ev-start-pos (artist-coord-win-to-buf (posn-col-row ev-start)))
+        (ev-start-pos (artist-coord-win-to-buf
+                        (posn-col-row ev-start t)))
         (x1           (artist--adjust-x (car ev-start-pos)))
         (y1           (cdr  ev-start-pos)))
     (select-window (posn-window ev-start))
@@ -5252,7 +5253,8 @@ The event, EV, is the mouse event."
         (arrow-set-fn (artist-go-get-arrow-set-fn-from-symbol op))
         (ev-start     (event-start ev))
         (initial-win  (posn-window ev-start))
-        (ev-start-pos (artist-coord-win-to-buf (posn-col-row ev-start)))
+        (ev-start-pos (artist-coord-win-to-buf
+                        (posn-col-row ev-start t)))
         (x1           (artist--adjust-x (car ev-start-pos)))
         (y1           (cdr ev-start-pos))
         (x2)
@@ -5266,7 +5268,7 @@ The event, EV, is the mouse event."
       (while (or (mouse-movement-p ev)
                 (member 'down (event-modifiers ev)))
        (setq ev-start-pos (artist-coord-win-to-buf
-                           (posn-col-row (event-start ev))))
+                           (posn-col-row (event-start ev) t)))
        (setq x2 (artist--adjust-x (car ev-start-pos)))
        (setq y2 (cdr ev-start-pos))
 
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
index 62a4af1377..544e0da827 100644
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -2298,11 +2298,11 @@ is non-nil, FUN is not called for @String entries."
     (set-marker-insertion-type end-marker t)
     (save-excursion
       (goto-char (point-min))
-      (let ((prev (point)))
+      (let ((prev nil))
         (while (setq found (bibtex-skip-to-valid-entry))
           ;; If we have invalid entries, ensure that we have forward
           ;; progress so that we don't infloop.
-          (if (= (point) prev)
+          (if (equal (point) prev)
               (forward-line 1)
             (setq prev (point))
             (set-marker end-marker (cdr found))
diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el
index 1139fd1976..a2a7774aba 100644
--- a/lisp/textmodes/css-mode.el
+++ b/lisp/textmodes/css-mode.el
@@ -269,6 +269,10 @@
     ("resize" "none" "both" "horizontal" "vertical")
     ("text-overflow" "clip" "ellipsis" string)
 
+    ;; CSS Cascading and Inheritance Level 3
+    ;; (https://www.w3.org/TR/css-cascade-3/#property-index)
+    ("all")
+
     ;; CSS Color Module Level 3
     ;; (https://www.w3.org/TR/css3-color/#property)
     ("color" color)
@@ -304,27 +308,27 @@
 
     ;; CSS Box Alignment Module Level 3
     ;; (https://www.w3.org/TR/css-align-3/#property-index)
-    ("align-content"
-     baseline-position content-distribution overflow-position content-position)
-    ("align-items"
-     "normal" "stretch" baseline-position overflow-position self-position)
-    ("align-self"
-     "auto" "normal" "stretch"
-     baseline-position overflow-position self-position)
-    ("justify-content" "normal"
-     content-distribution overflow-position content-position "left" "right")
-    ("justify-items"
-     "normal" "stretch" baseline-position overflow-position self-position
-     "left" "right" "legacy")
-    ("justify-self"
-     "auto" "normal" "stretch" baseline-position overflow-position 
self-position
-     "left" "right")
+    ("align-content" baseline-position content-distribution
+     overflow-position content-position)
+    ("align-items" "normal" "stretch" baseline-position
+     overflow-position self-position)
+    ("align-self" "auto" "normal" "stretch" baseline-position
+     overflow-position self-position)
+    ("column-gap" "normal" length-percentage)
+    ("gap" row-gap column-gap)
+    ("justify-content" "normal" content-distribution overflow-position
+     content-position "left" "right")
+    ("justify-items" "normal" "stretch" baseline-position
+     overflow-position self-position "left" "right" "legacy" "center")
+    ("justify-self" "auto" "normal" "stretch" baseline-position
+     overflow-position self-position "left" "right")
     ("place-content" align-content justify-content)
     ("place-items" align-items justify-items)
     ("place-self" justify-self align-self)
+    ("row-gap" "normal" length-percentage)
 
-    ;; CSS Flexible Box Layout Module Level 2
-    ;; (https://www.w3.org/TR/css-flexbox-2/#property-index)
+    ;; CSS Flexible Box Layout Module Level 1
+    ;; (https://www.w3.org/TR/css-flexbox-1/#property-index)
     ("flex" "none" flex-grow flex-shrink flex-basis)
     ("flex-basis" "auto" "content" width)
     ("flex-direction" "row" "row-reverse" "column" "column-reverse")
@@ -413,21 +417,20 @@
     ("mask-type" "luminance" "alpha")
     ("clip" "rect()" "auto")
 
-    ;; CSS Multi-column Layout Module
+    ;; CSS Multi-column Layout Module Level 1
     ;; (https://www.w3.org/TR/css3-multicol/#property-index)
     ;; "break-after", "break-before", and "break-inside" are left out
     ;; below, because they're already included in CSS Fragmentation
     ;; Module Level 3.
-    ("column-count" integer "auto")
-    ("column-fill" "auto" "balance")
-    ("column-gap" length "normal")
+    ("column-count" "auto" integer)
+    ("column-fill" "auto" "balance" "balance-all")
     ("column-rule" column-rule-width column-rule-style
-     column-rule-color "transparent")
+     column-rule-color)
     ("column-rule-color" color)
-    ("column-rule-style" border-style)
-    ("column-rule-width" border-width)
+    ("column-rule-style" line-style)
+    ("column-rule-width" line-width)
     ("column-span" "none" "all")
-    ("column-width" length "auto")
+    ("column-width" "auto" length)
     ("columns" column-width column-count)
 
     ;; CSS Overflow Module Level 3
@@ -925,6 +928,32 @@ cannot be completed sensibly: `custom-ident',
 (defface css-proprietary-property '((t :inherit (css-property italic)))
   "Face to use for vendor-specific properties.")
 
+(defun css--selector-regexp (sassy)
+  (concat
+   "\\(?:"
+   (if (not sassy)
+       "[-_%*#.>[:alnum:]]+"
+     ;; Same as for non-sassy except we do want to allow { and }
+     ;; chars in selectors in the case of #{$foo}
+     ;; variable interpolation!
+     (concat "\\(?:[-_%*#.>&+~[:alnum:]]*" scss--hash-re
+             "\\|[-_%*#.>&+~[:alnum:]]+\\)"))
+   ;; Even though pseudo-elements should be prefixed by ::, a
+   ;; single colon is accepted for backward compatibility.
+   "\\(?:\\(:" (regexp-opt (append css-pseudo-class-ids
+                                   css-pseudo-element-ids)
+                           t)
+   "\\|::" (regexp-opt css-pseudo-element-ids t) "\\)\\)?"
+   ;; Braces after selectors.
+   "\\(?:\\[[^]\n]+\\]\\)?"
+   ;; Parentheses after selectors.
+   "\\(?:([^)]+)\\)?"
+   ;; Main bit over.  But perhaps just [target]?
+   "\\|\\[[^]\n]+\\]"
+   ;; :root, ::marker and the like.
+   "\\|::?[[:alnum:]]+\\(?:([^)]+)\\)?"
+   "\\)"))
+
 (defun css--font-lock-keywords (&optional sassy)
   `((,(concat "!\\s-*" (regexp-opt css--bang-ids))
      (0 font-lock-builtin-face))
@@ -945,28 +974,16 @@ cannot be completed sensibly: `custom-ident',
     ;; selector between [...] should simply not be highlighted.
     (,(concat
        "^[ \t]*\\("
-       (if (not sassy)
-           ;; We don't allow / as first char, so as not to
-           ;; take a comment as the beginning of a selector.
-           "[^@/:{}() \t\n][^:{}()]*"
-         ;; Same as for non-sassy except we do want to allow { and }
-         ;; chars in selectors in the case of #{$foo}
-         ;; variable interpolation!
-         (concat "\\(?:" scss--hash-re
-                 "\\|[^@/:{}() \t\n#]\\)"
-                 "[^:{}()#]*\\(?:" scss--hash-re "[^:{}()#]*\\)*"))
-       ;; Even though pseudo-elements should be prefixed by ::, a
-       ;; single colon is accepted for backward compatibility.
-       "\\(?:\\(:" (regexp-opt (append css-pseudo-class-ids
-                                       css-pseudo-element-ids)
-                               t)
-       "\\|::" (regexp-opt css-pseudo-element-ids t) "\\)"
-       "\\(?:([^)]+)\\)?"
-       (if (not sassy)
-           "[^:{}()\n]*"
-         (concat "[^:{}()\n#]*\\(?:" scss--hash-re "[^:{}()\n#]*\\)*"))
+       ;; We have at least one selector.
+       (css--selector-regexp sassy)
+       ;; And then possibly more.
+       "\\(?:"
+       ;; Separators between selectors.
+       "[ \n\t,+~>]+"
+       (css--selector-regexp sassy)
        "\\)*"
-       "\\)\\(?:\n[ \t]*\\)*{")
+       ;; And then a brace.
+       "\\)[ \n\t]*{")
      (1 'css-selector keep))
     ;; In the above rule, we allow the open-brace to be on some subsequent
     ;; line.  This will only work if we properly mark the intervening text
diff --git a/lisp/textmodes/dns-mode.el b/lisp/textmodes/dns-mode.el
index dc26a3c1b7..42d547504c 100644
--- a/lisp/textmodes/dns-mode.el
+++ b/lisp/textmodes/dns-mode.el
@@ -110,11 +110,11 @@
                        "26.1" 'set)
 
 (defcustom dns-mode-font-lock-keywords
-  `((,(concat "^\\$" (regexp-opt dns-mode-control-entities))
+  `((,(concat "^\\$" (regexp-opt dns-mode-control-entities) "\\>")
      0 ,dns-mode-control-entity-face)
     ("^\\$[a-z0-9A-Z]+" 0 ,dns-mode-bad-control-entity-face)
-    (,(regexp-opt dns-mode-classes) 0 ,dns-mode-class-face)
-    (,(regexp-opt dns-mode-types) 0 ,dns-mode-type-face))
+    (,(regexp-opt dns-mode-classes 'words) 0 ,dns-mode-class-face)
+    (,(regexp-opt dns-mode-types 'words) 0 ,dns-mode-type-face))
   "Font lock keywords used to highlight text in DNS master file mode."
   :version "26.1"
   :type 'sexp)
@@ -165,7 +165,7 @@ manually with \\[dns-mode-soa-increment-serial]."
 ;;;###autoload
 (define-derived-mode dns-mode text-mode "DNS"
   "Major mode for viewing and editing DNS master files.
-This mode is inherited from text mode.  It add syntax
+This mode is derived from text mode.  It adds syntax
 highlighting, and some commands for handling DNS master files.
 Its keymap inherits from `text-mode' and it has the same
 variables for customizing indentation.  It has its own abbrev
diff --git a/lisp/textmodes/enriched.el b/lisp/textmodes/enriched.el
index 50ff668a9f..935be06812 100644
--- a/lisp/textmodes/enriched.el
+++ b/lisp/textmodes/enriched.el
@@ -539,6 +539,30 @@ the range of text to assign text property SYMBOL with 
value VALUE."
         (list start end 'display prop)
       (list start end 'display (list 'disable-eval prop)))))
 
+(defvar enriched--markup-shown)
+(defun enriched-toggle-markup ()
+  "Toggle whether to see markup in the current buffer."
+  (interactive)
+  (save-excursion
+    (save-restriction
+      (widen)
+      (with-silent-modifications
+        (if (bound-and-true-p enriched--markup-shown)
+            (progn
+              (setq-local enriched--markup-shown nil)
+              ;; Remove any faces, because they will be decoded, too.
+              (goto-char (point-min))
+              (let (match)
+                (while (setq match (text-property-search-forward 'face))
+                  (put-text-property (prop-match-beginning match)
+                                     (prop-match-end match)
+                                     'face nil)))
+              (enriched-decode (point-min) (point-max))
+              (enriched-mode 1))
+          (setq-local enriched--markup-shown t)
+          (enriched-encode (point-min) (point-max) (current-buffer))
+          (enriched-mode -1))))))
+
 (provide 'enriched)
 
 ;;; enriched.el ends here
diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el
index 5de04b12d4..2c5e30fecd 100644
--- a/lisp/textmodes/flyspell.el
+++ b/lisp/textmodes/flyspell.el
@@ -1942,9 +1942,7 @@ before point that's highlighted as misspelled."
                           'face 'flyspell-incorrect
                           string))
       (setq pos (cdr pos)))
-    (if (fboundp 'display-message)
-       (display-message 'no-log string)
-      (message "%s" string))))
+    (message "%s" string)))
 
 ;;*---------------------------------------------------------------------*/
 ;;*    flyspell-abbrev-table ...                                        */
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index b58514972a..1810d7bcae 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -3052,6 +3052,8 @@ when needed."
 ;;;###autoload
 (defun ispell-region (reg-start reg-end &optional recheckp shift)
   "Interactively check a region for spelling errors.
+Leave the mark at the last misspelled word that the user was queried about.
+
 Return nil if spell session was terminated, otherwise returns shift offset
 amount for last line processed."
   (interactive "r")                    ; Don't flag errors on read-only bufs.
@@ -3063,7 +3065,8 @@ amount for last line processed."
        (region-type (if (and (= reg-start (point-min)) (= reg-end (point-max)))
                         (buffer-name) "region"))
        (program-basename (file-name-nondirectory ispell-program-name))
-       (dictionary (or ispell-current-dictionary "default")))
+       (dictionary (or ispell-current-dictionary "default"))
+        max-word)
     (unwind-protect
        (save-excursion
          (message "Spell-checking %s using %s with %s dictionary..."
@@ -3159,10 +3162,14 @@ ispell-region: Search for first region to skip after 
(ispell-begin-skip-region-r
                            ;; Reset `in-comment' (and indirectly 
`add-comment') for new line
                            in-comment nil))
                  (setq ispell-end (point)) ; "end" tracks region retrieved.
-                 (if string            ; there is something to spell check!
-                     ;; (special start end)
-                     (setq shift (ispell-process-line string
-                                                      (and recheckp shift))))
+                  ;; There is something to spell check!
+                 (when string
+                   ;; (special start end)
+                    (let ((res (ispell-process-line string
+                                                   (and recheckp shift))))
+                      (setq shift (car res))
+                      (when (cdr res)
+                        (setq max-word (cdr res)))))
                  (goto-char ispell-end)))))
          (if ispell-quit
              nil
@@ -3173,6 +3180,9 @@ ispell-region: Search for first region to skip after 
(ispell-begin-skip-region-r
          (kill-buffer ispell-choices-buffer))
       (set-marker skip-region-start nil)
       (set-marker rstart nil)
+      ;; Allow the user to pop back to the last position.
+      (when max-word
+        (push-mark max-word t))
       (if ispell-quit
          (progn
            ;; preserve or clear the region for ispell-continue.
@@ -3407,9 +3417,12 @@ Returns a string with the line data."
 This will modify the buffer for spelling errors.
 Requires variables ISPELL-START and ISPELL-END to be defined in its
 dynamic scope.
-Returns the sum SHIFT due to changes in word replacements."
+
+Returns a cons cell where the `car' is sum SHIFT due to changes
+in word replacements, and the `cdr' is the location of the final
+word that was queried about."
   ;;(declare special ispell-start ispell-end)
-  (let (poss accept-list)
+  (let (poss accept-list max-word)
     (if (not (numberp shift))
        (setq shift 0))
     ;; send string to spell process and get input.
@@ -3463,6 +3476,7 @@ Returns the sum SHIFT due to changes in word 
replacements."
                   (error (concat "Ispell misalignment: word "
                                  "`%s' point %d; probably incompatible 
versions")
                          ispell-pipe-word actual-point)))
+            (setq max-word (marker-position word-start))
             ;; ispell-cmd-loop can go recursive & change buffer
             (if ispell-keep-choices-win
                 (setq replace (ispell-command-loop
@@ -3559,7 +3573,7 @@ Returns the sum SHIFT due to changes in word 
replacements."
             (set-marker line-end nil)))
       ;; Finished with misspelling!
       (setq ispell-filter (cdr ispell-filter)))
-    shift))
+    (cons shift max-word)))
 
 
 ;;;###autoload
@@ -3600,7 +3614,8 @@ to limit the check."
 
 ;;;###autoload
 (defun ispell-buffer ()
-  "Check the current buffer for spelling errors interactively."
+  "Check the current buffer for spelling errors interactively.
+Leave the mark at the last misspelled word that the user was queried about."
   (interactive)
   (ispell-region (point-min) (point-max)))
 
diff --git a/lisp/textmodes/paragraphs.el b/lisp/textmodes/paragraphs.el
index 7daf71e990..98eb494823 100644
--- a/lisp/textmodes/paragraphs.el
+++ b/lisp/textmodes/paragraphs.el
@@ -477,7 +477,23 @@ sentences.  Also, every paragraph boundary terminates 
sentences as well."
            (skip-chars-backward " \t\n")
          (goto-char par-end)))
       (setq arg (1- arg)))
-    (constrain-to-field nil opoint t)))
+    (let ((npoint (constrain-to-field nil opoint t)))
+      (not (= npoint opoint)))))
+
+(defun count-sentences (start end)
+  "Count sentences in current buffer from START to END."
+  (let ((sentences 0)
+        (inhibit-field-text-motion t))
+    (save-excursion
+      (save-restriction
+        (narrow-to-region start end)
+        (goto-char (point-min))
+       (while (ignore-errors (forward-sentence))
+         (setq sentences (1+ sentences)))
+        ;; Remove last possibly empty sentence
+        (when (/= (skip-chars-backward " \t\n") 0)
+          (setq sentences (1- sentences)))
+       sentences))))
 
 (defun repunctuate-sentences-filter (_start _end)
   "Search filter used by `repunctuate-sentences' to skip unneeded spaces.
diff --git a/lisp/textmodes/pixel-fill.el b/lisp/textmodes/pixel-fill.el
index 418d6a37c9..e47653e734 100644
--- a/lisp/textmodes/pixel-fill.el
+++ b/lisp/textmodes/pixel-fill.el
@@ -45,9 +45,9 @@ of a line or the end of a line."
 
 (defun pixel-fill-width (&optional columns window)
   "Return the pixel width corresponding to COLUMNS in WINDOW.
-If COLUMNS in nil, use the enture window width.
+If COLUMNS is nil or omitted, use the entire window width.
 
-If WINDOW is nil, this defaults to the current window."
+If WINDOW is nil or omitted, this defaults to the selected window."
   (unless window
     (setq window (selected-window)))
   (let ((frame (window-frame window)))
diff --git a/lisp/textmodes/reftex-cite.el b/lisp/textmodes/reftex-cite.el
index 4e487d745c..26b14ebc79 100644
--- a/lisp/textmodes/reftex-cite.el
+++ b/lisp/textmodes/reftex-cite.el
@@ -360,7 +360,7 @@ The name of the first different author/editor is used."
 
 ;; Parse the bibliography environment
 (defun reftex-extract-bib-entries-from-thebibliography (files)
-  "Extract bib-entries from the \begin{thebibliography} environment.
+  "Extract bib-entries from the \\begin{thebibliography} environment.
 Parsing is not as good as for the BibTeX database stuff.
 The environment should be located in FILES."
   (let* (start end buf entries re re-list file default)
@@ -580,7 +580,7 @@ If FORMAT is non-nil `format' entry accordingly."
     (concat key "\n     " authors " " year " " extra "\n     " title "\n\n")))
 
 (defun reftex-parse-bibitem (item)
-  "Parse a \bibitem entry in ITEM."
+  "Parse a \\bibitem entry in ITEM."
   (let ((key "") (text ""))
     (when (string-match "\\`{\\([^}]+\\)}\\([^\000]*\\)" item)
       (setq key (match-string 1 item)
@@ -596,7 +596,7 @@ If FORMAT is non-nil `format' entry accordingly."
      (cons "&entry" (concat key " " text)))))
 
 (defun reftex-format-bibitem (item)
-  "Format a \bibitem entry in ITEM so that it is (relatively) nice to look at."
+  "Format a \\bibitem entry in ITEM so that it is (relatively) nice to look 
at."
   (let ((text (reftex-get-bib-field "&text" item))
         (key  (reftex-get-bib-field "&key" item))
         (lines nil))
diff --git a/lisp/textmodes/reftex-vars.el b/lisp/textmodes/reftex-vars.el
index f9d832f155..f9f09825fa 100644
--- a/lisp/textmodes/reftex-vars.el
+++ b/lisp/textmodes/reftex-vars.el
@@ -1318,7 +1318,7 @@ macro before insertion.  For example, it will change
     \\cite[][]{Jones}              -> \\cite{Jones}
     \\cite[][Chapter 1]{Jones}     -> \\cite[Chapter 1]{Jones}
     \\cite[see][]{Jones}           -> \\cite[see][]{Jones}
-    \\cite[see][Chapter 1]{Jones}  -> \\cite{Jones}
+    \\cite[see][Chapter 1]{Jones}  -> \\cite[see][Chapter 1]{Jones}
 It is possible that other packages have other conventions about which
 optional argument is interpreted how - that is why this cleaning up
 can be turned off."
diff --git a/lisp/textmodes/reftex.el b/lisp/textmodes/reftex.el
index 907d50889a..e72576cdc7 100644
--- a/lisp/textmodes/reftex.el
+++ b/lisp/textmodes/reftex.el
@@ -2257,8 +2257,7 @@ IGNORE-WORDS List of words which should be removed from 
the string."
    ("Customize"
     ["Browse RefTeX Group" reftex-customize t]
     "--"
-    ["Build Full Customize Menu" reftex-create-customize-menu
-     (fboundp 'customize-menu-create)])
+    ["Build Full Customize Menu" reftex-create-customize-menu])
    ("Documentation"
     ["Info" reftex-info t]
     ["Commentary" reftex-show-commentary t])))
diff --git a/lisp/textmodes/remember.el b/lisp/textmodes/remember.el
index d65aea6286..e72f86f7db 100644
--- a/lisp/textmodes/remember.el
+++ b/lisp/textmodes/remember.el
@@ -653,7 +653,7 @@ to turn the *scratch* buffer into your notes buffer."
                    (remember-notes-mode 1)
                    (current-buffer)))))
     (when switch-to
-      (switch-to-buffer buf))
+      (pop-to-buffer-same-window buf))
     buf))
 
 (defun remember-notes--kill-buffer-query ()
diff --git a/lisp/textmodes/string-edit.el b/lisp/textmodes/string-edit.el
index ab0b3b3bd7..53850674ac 100644
--- a/lisp/textmodes/string-edit.el
+++ b/lisp/textmodes/string-edit.el
@@ -47,32 +47,39 @@ called with no parameters.
 PROMPT will be inserted at the start of the buffer, but won't be
 included in the resulting string.  If PROMPT is nil, no help text
 will be inserted."
-  (pop-to-buffer-same-window (generate-new-buffer "*edit string*"))
-  (when prompt
-    (let ((inhibit-read-only t))
-      (insert prompt)
-      (ensure-empty-lines 0)
-      (add-text-properties (point-min) (point)
-                           (list 'intangible t
-                                 'face 'string-edit-prompt
-                                 'read-only t))
-      (insert (propertize (make-separator-line) 'rear-nonsticky t))
-      (add-text-properties (point-min) (point)
-                           (list 'string-edit--prompt t))))
-  (let ((start (point)))
-    (insert string)
-    (goto-char start))
-  (set-buffer-modified-p nil)
-  (setq buffer-undo-list nil)
-  (string-edit-mode)
-  (setq-local string-edit--success-callback success-callback)
-  (when abort-callback
-    (setq-local string-edit--abort-callback abort-callback))
-  (setq-local header-line-format
-              (substitute-command-keys
-               "Type \\<string-edit-mode-map>\\[string-edit-done] when you've 
finished editing or \\[string-edit-abort] to abort"))
-  (message "%s" (substitute-command-keys
-                 "Type \\<string-edit-mode-map>\\[string-edit-done] when 
you've finished editing")))
+  (with-current-buffer (generate-new-buffer "*edit string*")
+    (when prompt
+      (let ((inhibit-read-only t))
+        (insert prompt)
+        (ensure-empty-lines 0)
+        (add-text-properties (point-min) (point)
+                             (list 'intangible t
+                                   'face 'string-edit-prompt
+                                   'read-only t))
+        (insert (propertize (make-separator-line) 'rear-nonsticky t))
+        (add-text-properties (point-min) (point)
+                             (list 'string-edit--prompt t))))
+    (let ((start (point)))
+      (insert string)
+      (goto-char start))
+
+    ;; Use `fit-window-to-buffer' after the buffer is filled with text.
+    (pop-to-buffer (current-buffer)
+                   '(display-buffer-below-selected
+                     (window-height . (lambda (window)
+                                        (fit-window-to-buffer window nil 
10)))))
+
+    (set-buffer-modified-p nil)
+    (setq buffer-undo-list nil)
+    (string-edit-mode)
+    (setq-local string-edit--success-callback success-callback)
+    (when abort-callback
+      (setq-local string-edit--abort-callback abort-callback))
+    (setq-local header-line-format
+                (substitute-command-keys
+                 "Type \\<string-edit-mode-map>\\[string-edit-done] when 
you've finished editing or \\[string-edit-abort] to abort"))
+    (message "%s" (substitute-command-keys
+                   "Type \\<string-edit-mode-map>\\[string-edit-done] when 
you've finished editing"))))
 
 ;;;###autoload
 (defun read-string-from-buffer (prompt string)
@@ -113,14 +120,14 @@ This will kill the current buffer."
     (goto-char (prop-match-beginning match)))
   (let ((string (buffer-substring (point) (point-max)))
         (callback string-edit--success-callback))
-    (kill-buffer (current-buffer))
+    (quit-window 'kill)
     (funcall callback string)))
 
 (defun string-edit-abort ()
   "Abort editing the current string."
   (interactive)
   (let ((callback string-edit--abort-callback))
-    (kill-buffer (current-buffer))
+    (quit-window 'kill)
     (when callback
       (funcall callback))))
 
diff --git a/lisp/textmodes/table.el b/lisp/textmodes/table.el
index 2175900194..fc06c4c0da 100644
--- a/lisp/textmodes/table.el
+++ b/lisp/textmodes/table.el
@@ -753,6 +753,18 @@ the cell contents dynamically."
   :type 'string
   :group 'table)
 
+(defcustom table-latex-environment "tabular"
+  "Tabular-compatible environment to use when generating latex.
+The value should be a string suitable for use as a LaTeX environment
+that's compatible with the \"tabular\" protocol, such as \"tabular\"
+and \"longtable\"."
+  :tag "Latex environment used to export tables"
+  :type '(choice
+         (const :tag "tabular" "tabular")
+         (const :tag "longtable"  "longtable")
+          string)
+  :version "29.1")
+
 (defcustom table-cals-thead-rows 1
   "Number of top rows to become header rows in CALS table."
   :tag "CALS Header Rows"
@@ -3025,7 +3037,8 @@ CALS (DocBook DTD):
                "")))
      ((eq language 'latex)
       (insert (format "%% This LaTeX table template is generated by emacs 
%s\n" emacs-version)
-             "\\begin{tabular}{|" (apply #'concat (make-list (length col-list) 
"l|")) "}\n"
+             "\\begin{" table-latex-environment "}{|"
+              (apply #'concat (make-list (length col-list) "l|")) "}\n"
              "\\hline\n"))
      ((eq language 'cals)
       (insert (format "<!-- This CALS table template is generated by emacs %s 
-->\n" emacs-version)
@@ -3051,7 +3064,7 @@ CALS (DocBook DTD):
      ((eq language 'html)
       (insert "</table>\n"))
      ((eq language 'latex)
-      (insert "\\end{tabular}\n"))
+      (insert "\\end{" table-latex-environment "}\n"))
      ((eq language 'cals)
       (set-marker-insertion-type (table-get-source-info 'colspec-marker) t) ;; 
insert before
       (save-excursion
diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el
index da4d7cc442..473643bb48 100644
--- a/lisp/textmodes/tex-mode.el
+++ b/lisp/textmodes/tex-mode.el
@@ -1178,12 +1178,7 @@ subshell is initiated, `tex-shell-hook' is run."
   (setq-local outline-regexp latex-outline-regexp)
   (setq-local outline-level #'latex-outline-level)
   (setq-local forward-sexp-function #'latex-forward-sexp)
-  (setq-local skeleton-end-hook nil)
-  (setq-local comment-region-function #'latex--comment-region)
-  (setq-local comment-style 'plain))
-
-(defun latex--comment-region (beg end &optional arg)
-  (comment-region-default-1 beg end arg t))
+  (setq-local skeleton-end-hook nil))
 
 ;;;###autoload
 (define-derived-mode slitex-mode latex-mode "SliTeX"
diff --git a/lisp/textmodes/texinfo.el b/lisp/textmodes/texinfo.el
index 71b8d82ed9..5d6f5deae1 100644
--- a/lisp/textmodes/texinfo.el
+++ b/lisp/textmodes/texinfo.el
@@ -39,7 +39,7 @@
 (declare-function flymake-make-diagnostic "flymake"
                   ( locus beg end type text
                     &optional data overlay-properties))
-(declare-function flymake--log-1 (level sublog msg &rest args))
+(declare-function flymake--log-1 "flymake" (level sublog msg &rest args))
 
 (eval-when-compile (require 'tex-mode))
 (declare-function tex-buffer "tex-mode" ())
diff --git a/lisp/tooltip.el b/lisp/tooltip.el
index e24d03b8e8..3e9c16a445 100644
--- a/lisp/tooltip.el
+++ b/lisp/tooltip.el
@@ -230,25 +230,42 @@ change the existing association.  Value is the resulting 
alist."
 (declare-function x-show-tip "xfns.c"
                  (string &optional frame parms timeout dx dy))
 
-(defun tooltip-show (text &optional use-echo-area)
+(defun tooltip-show (text &optional use-echo-area text-face default-face)
   "Show a tooltip window displaying TEXT.
 
 Text larger than `x-max-tooltip-size' is clipped.
 
-If the alist in `tooltip-frame-parameters' includes `left' and `top'
-parameters, they determine the x and y position where the tooltip
-is displayed.  Otherwise, the tooltip pops at offsets specified by
-`tooltip-x-offset' and `tooltip-y-offset' from the current mouse
-position.
+If the alist in `tooltip-frame-parameters' includes `left' and
+`top' parameters, they determine the x and y position where the
+tooltip is displayed.  Otherwise, the tooltip pops at offsets
+specified by `tooltip-x-offset' and `tooltip-y-offset' from the
+current mouse position.
+
+The text properties of TEXT are also modified to add the
+appropriate faces before displaying the tooltip.  If your code
+depends on them, you should copy the tooltip string before
+passing it to this function.
 
 Optional second arg USE-ECHO-AREA non-nil means to show tooltip
-in echo area."
+in echo area.
+
+The third and fourth args TEXT-FACE and DEFAULT-FACE specify
+faces used to display the tooltip, and default to `tooltip' if
+not specified.  TEXT-FACE specifies a face used to display text
+in the tooltip, while DEFAULT-FACE specifies a face that provides
+the background, foreground and border colors of the tooltip
+frame.
+
+Note that the last two arguments are not respected when
+`use-system-tooltips' is non-nil and Emacs is built with support
+for system tooltips, such as on NS, Haiku, and with the GTK
+toolkit."
   (if use-echo-area
       (tooltip-show-help-non-mode text)
     (condition-case error
        (let ((params (copy-sequence tooltip-frame-parameters))
-             (fg (face-attribute 'tooltip :foreground))
-             (bg (face-attribute 'tooltip :background)))
+             (fg (face-attribute (or default-face 'tooltip) :foreground))
+             (bg (face-attribute (or default-face 'tooltip) :background)))
          (when (stringp fg)
            (setf (alist-get 'foreground-color params) fg)
            (setf (alist-get 'border-color params) fg))
@@ -258,7 +275,8 @@ in echo area."
           ;; faces used in our TEXT.  Among other things, this allows
           ;; tooltips to use the `help-key-binding' face used in
           ;; `substitute-command-keys' substitutions.
-          (add-face-text-property 0 (length text) 'tooltip t text)
+          (add-face-text-property 0 (length text)
+                                  (or text-face 'tooltip) t text)
           (x-show-tip text
                      (selected-frame)
                      params
diff --git a/lisp/transient.el b/lisp/transient.el
index 13e8de258b..d329bbdbcd 100644
--- a/lisp/transient.el
+++ b/lisp/transient.el
@@ -61,10 +61,10 @@
 (eval-when-compile
   (require 'subr-x))
 
-(declare-function info 'info)
-(declare-function Man-find-section 'man)
-(declare-function Man-next-section 'man)
-(declare-function Man-getpage-in-background 'man)
+(declare-function info "info")
+(declare-function Man-find-section "man")
+(declare-function Man-next-section "man")
+(declare-function Man-getpage-in-background "man")
 
 (defvar Man-notify-method)
 
diff --git a/lisp/tree-widget.el b/lisp/tree-widget.el
index 4ba96a36a4..f91b36bfc2 100644
--- a/lisp/tree-widget.el
+++ b/lisp/tree-widget.el
@@ -319,6 +319,7 @@ has been found accessible."
   '(
     ("guide"     . arrow)
     ("no-guide"  . arrow)
+    ("nohandle-guide" . arrow)
     ("end-guide" . arrow)
     ("handle"    . arrow)
     ("no-handle" . arrow)
@@ -440,6 +441,12 @@ Handle mouse button 1 click on buttons.")
   :format    "%t"
   )
 
+(define-widget 'tree-widget-nohandle-guide 'item
+  "Vertical guide line, when there is no handle."
+  :tag       " |"
+  ;;:tag-glyph (tree-widget-find-image "nohandle-guide")
+  :format    "%t")
+
 (define-widget 'tree-widget-end-guide 'item
   "End of a vertical guide line."
   :tag       " \\=`"
@@ -483,6 +490,7 @@ Handle mouse button 1 click on buttons.")
   :empty-icon     'tree-widget-empty-icon
   :leaf-icon      'tree-widget-leaf-icon
   :guide          'tree-widget-guide
+  :nohandle-guide 'tree-widget-nohandle-guide
   :end-guide      'tree-widget-end-guide
   :no-guide       'tree-widget-no-guide
   :handle         'tree-widget-handle
@@ -612,11 +620,13 @@ This hook should be local in the buffer setup to display 
widgets.")
 ;;;; Expanded node.
         (let ((args     (widget-get tree :args))
               (guide    (widget-get tree :guide))
+              (nohandle-guide (widget-get tree :nohandle-guide))
               (noguide  (widget-get tree :no-guide))
               (endguide (widget-get tree :end-guide))
               (handle   (widget-get tree :handle))
               (nohandle (widget-get tree :no-handle))
               (guidi    (tree-widget-find-image "guide"))
+              (nohandle-guidi (tree-widget-find-image "nohandle-guide"))
               (noguidi  (tree-widget-find-image "no-guide"))
               (endguidi (tree-widget-find-image "end-guide"))
               (handli   (tree-widget-find-image "handle"))
@@ -648,8 +658,8 @@ This hook should be local in the buffer setup to display 
widgets.")
             ;; Insert guide lines elements from previous levels.
             (dolist (f (reverse flags))
               (widget-create-child-and-convert
-               tree (if f guide noguide)
-               :tag-glyph (if f guidi noguidi))
+               tree (if f nohandle-guide noguide)
+               :tag-glyph (if f nohandle-guidi noguidi))
               (widget-create-child-and-convert
                tree nohandle :tag-glyph nohandli))
             ;; Insert guide line element for this level.
diff --git a/lisp/tutorial.el b/lisp/tutorial.el
index 0f3a1506d6..2c787ae559 100644
--- a/lisp/tutorial.el
+++ b/lisp/tutorial.el
@@ -649,13 +649,15 @@ with some explanatory links."
         (unless (eq prop-val 'key-sequence)
          (delete-region prop-start prop-end))))))
 
+(defvar tutorial--starting-point)
 (defun tutorial--save-on-kill ()
   "Query the user about saving the tutorial when killing Emacs."
   (when (buffer-live-p tutorial--buffer)
     (with-current-buffer tutorial--buffer
-      (if (y-or-n-p "Save your position in the tutorial? ")
-         (tutorial--save-tutorial-to (tutorial--saved-file))
-       (message "Tutorial position not saved"))))
+      (unless (= (point) tutorial--starting-point)
+        (if (y-or-n-p "Save your position in the tutorial? ")
+           (tutorial--save-tutorial-to (tutorial--saved-file))
+         (message "Tutorial position not saved")))))
   t)
 
 (defun tutorial--save-tutorial ()
@@ -734,7 +736,6 @@ See `tutorial--save-tutorial' for more information."
         (message "Can't save tutorial: %s is not a directory"
                  tutorial-dir)))))
 
-
 ;;;###autoload
 (defun help-with-tutorial (&optional arg dont-ask-for-revert)
   "Select the Emacs learn-by-doing tutorial.
@@ -914,6 +915,7 @@ Run the Viper tutorial? "))
               (forward-line 1)
               (newline (- n (/ n 2)))))
           (goto-char (point-min)))
+        (setq-local tutorial--starting-point (point))
         (setq buffer-undo-list nil)
         (set-buffer-modified-p nil)))))
 
diff --git a/lisp/url/url-cookie.el b/lisp/url/url-cookie.el
index 6b9ce5da93..15c78512c6 100644
--- a/lisp/url/url-cookie.el
+++ b/lisp/url/url-cookie.el
@@ -26,6 +26,7 @@
 (require 'url-util)
 (require 'url-parse)
 (require 'url-domsuf)
+(require 'generate-lisp-file)
 
 (eval-when-compile (require 'cl-lib))
 
@@ -158,10 +159,7 @@ i.e. 1970-1-1) are loaded as expiring one year from now 
instead."
        (insert ")\n(setq url-cookie-secure-storage\n '")
        (pp url-cookie-secure-storage (current-buffer)))
       (insert ")\n")
-      (insert "\n;; Local Variables:\n"
-              ";; version-control: never\n"
-              ";; no-byte-compile: t\n"
-              ";; End:\n")
+      (generate-lisp-file-trailer fname :inhibit-provide t :autoloads t)
       (setq-local version-control 'never)
       (write-file fname))
     (setq url-cookies-changed-since-last-save nil))))
@@ -494,12 +492,10 @@ Use \\<url-cookie-mode-map>\\[url-cookie-delete] to 
remove cookies."
       (url-cookie--generate-buffer)
       (goto-char point))))
 
-(defvar url-cookie-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [delete] 'url-cookie-delete)
-    (define-key map [(control k)] 'url-cookie-delete)
-    (define-key map [(control _)] 'url-cookie-undo)
-    map))
+(defvar-keymap url-cookie-mode-map
+  "<delete>" #'url-cookie-delete
+  "C-k"      #'url-cookie-delete
+  "C-_"      #'url-cookie-undo)
 
 (define-derived-mode url-cookie-mode special-mode "URL Cookie"
   "Mode for listing cookies.
diff --git a/lisp/url/url-dired.el b/lisp/url/url-dired.el
index 1bbd741c1a..e2c23a8b6d 100644
--- a/lisp/url/url-dired.el
+++ b/lisp/url/url-dired.el
@@ -25,12 +25,10 @@
 
 (autoload 'dired-get-filename "dired")
 
-(defvar url-dired-minor-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "\C-m" 'url-dired-find-file)
-    (define-key map [mouse-2] 'url-dired-find-file-mouse)
-    map)
-  "Keymap used when browsing directories.")
+(defvar-keymap url-dired-minor-mode-map
+  :doc "Keymap used when browsing directories."
+  "C-m"       #'url-dired-find-file
+  "<mouse-2>" #'url-dired-find-file-mouse)
 
 (defun url-dired-find-file ()
   "In dired, visit the file or directory named on this line."
diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el
index b950a8994f..4e5d017036 100644
--- a/lisp/url/url-http.el
+++ b/lisp/url/url-http.el
@@ -589,6 +589,13 @@ should be shown to the user."
   (url-http-debug "url-http-parse-headers called in (%s)" (buffer-name))
   (url-http-parse-response)
   (mail-narrow-to-head)
+  (when url-debug
+    (save-excursion
+      (goto-char (point-min))
+      (while (not (eobp))
+        (url-http-debug "Response: %s"
+                        (buffer-substring (point) (line-end-position)))
+        (forward-line 1))))
   ;;(narrow-to-region (point-min) url-http-end-of-headers)
   (let ((connection (mail-fetch-field "Connection")))
     ;; In HTTP 1.0, keep the connection only if there is a
diff --git a/lisp/url/url-util.el b/lisp/url/url-util.el
index b8b7980e40..fc84d45176 100644
--- a/lisp/url/url-util.el
+++ b/lisp/url/url-util.el
@@ -1,7 +1,6 @@
 ;;; url-util.el --- Miscellaneous helper routines for URL library -*- 
lexical-binding: t -*-
 
-;; Copyright (C) 1996-1999, 2001, 2004-2022 Free Software Foundation,
-;; Inc.
+;; Copyright (C) 1996-2022 Free Software Foundation, Inc.
 
 ;; Author: Bill Perry <wmperry@gnu.org>
 ;; Maintainer: emacs-devel@gnu.org
@@ -217,9 +216,7 @@ Will not do anything if `url-show-status' is nil."
 
 ;;;###autoload
 (defun url-percentage (x y)
-  (if (fboundp 'float)
-      (round (* 100 (/ x (float y))))
-    (/ (* x 100) y)))
+  (round (* 100 (/ x (float y)))))
 
 ;;;###autoload
 (defalias 'url-basepath 'url-file-directory)
diff --git a/lisp/url/url-vars.el b/lisp/url/url-vars.el
index 922f26d65b..1012525568 100644
--- a/lisp/url/url-vars.el
+++ b/lisp/url/url-vars.el
@@ -396,7 +396,7 @@ Should be one of:
 (defvar url-lazy-message-time 0)
 
 ;; Fixme: We may not be able to run SSL.
-(defvar url-extensions-header "Security/Digest Security/SSL")
+(defvar url-extensions-header nil)
 
 (defvar url-parse-syntax-table
   (copy-syntax-table emacs-lisp-mode-syntax-table)
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index 5c13c7fc38..0fd67422d5 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -2600,19 +2600,21 @@ fixed, visit it in a buffer."
 
 (defun diff--font-lock-prettify (limit)
   (when diff-font-lock-prettify
-    (save-excursion
-      ;; FIXME: Include the first space for context-style hunks!
-      (while (re-search-forward "^[-+! ]" limit t)
-        (unless (eq (get-text-property (match-beginning 0) 'face) 'diff-header)
-          (let ((spec
-                 (alist-get
-                  (char-before)
-                  '((?+ . (left-fringe diff-fringe-add diff-indicator-added))
-                    (?- . (left-fringe diff-fringe-del diff-indicator-removed))
-                    (?! . (left-fringe diff-fringe-rep diff-indicator-changed))
-                    (?\s . (left-fringe diff-fringe-nul fringe))))))
-            (put-text-property (match-beginning 0) (match-end 0)
-                               'display spec)))))
+    (when (> (frame-parameter nil 'left-fringe) 0)
+      (save-excursion
+        ;; FIXME: Include the first space for context-style hunks!
+        (while (re-search-forward "^[-+! ]" limit t)
+          (unless (eq (get-text-property (match-beginning 0) 'face)
+                      'diff-header)
+            (put-text-property
+             (match-beginning 0) (match-end 0)
+             'display
+             (alist-get
+              (char-before)
+              '((?+ . (left-fringe diff-fringe-add diff-indicator-added))
+                (?- . (left-fringe diff-fringe-del diff-indicator-removed))
+                (?! . (left-fringe diff-fringe-rep diff-indicator-changed))
+                (?\s . (left-fringe diff-fringe-nul fringe)))))))))
     ;; Mimicks the output of Magit's diff.
     ;; FIXME: This has only been tested with Git's diff output.
     ;; FIXME: Add support for Git's "rename from/to"?
diff --git a/lisp/vc/diff.el b/lisp/vc/diff.el
index 926993eebb..3e35a3329b 100644
--- a/lisp/vc/diff.el
+++ b/lisp/vc/diff.el
@@ -153,7 +153,7 @@ Possible values are:
   ;; Noninteractive helper for creating and reverting diff buffers
   "Compare the OLD and NEW file/buffer.
 If the optional SWITCHES is nil, the switches specified in the
-variable ‘diff-switches’ are passed to the diff command,
+variable `diff-switches' are passed to the diff command,
 otherwise SWITCHES is used.  SWITCHES can be a string or a list
 of strings.
 
diff --git a/lisp/vc/ediff-merg.el b/lisp/vc/ediff-merg.el
index de8c587b1c..aae6ad549e 100644
--- a/lisp/vc/ediff-merg.el
+++ b/lisp/vc/ediff-merg.el
@@ -54,7 +54,7 @@ Valid values are the symbols `default-A', `default-B', and 
`combined'."
 The value must be a list of the form
 \(STRING1 bufspec1  STRING2 bufspec2 STRING3 bufspec3 STRING4)
 where bufspec is the symbol A, B, or Ancestor.  For instance, if the value is
-'(STRING1 A  STRING2 Ancestor STRING3 B STRING4) then the
+`(STRING1 A  STRING2 Ancestor STRING3 B STRING4)' then the
 combined text will look like this:
 
 STRING1
diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el
index b41def2aff..040a9a63c5 100644
--- a/lisp/vc/ediff-util.el
+++ b/lisp/vc/ediff-util.el
@@ -3431,6 +3431,9 @@ Without an argument, it saves customized diff argument, 
if available
     ))
 
 (defun ediff-show-diff-output (arg)
+  "With prefix argument ARG, show plain diff output.
+Without an argument, save the customized diff argument, if available
+(and plain output, if customized output was not generated)."
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
   (ediff-compute-custom-diffs-maybe)
@@ -3438,7 +3441,10 @@ Without an argument, it saves customized diff argument, 
if available
     (ediff-skip-unsuitable-frames ' ok-unsplittable))
   (let ((buf (cond ((and arg (ediff-buffer-live-p ediff-diff-buffer))
                    ediff-diff-buffer)
-                  ((ediff-buffer-live-p ediff-custom-diff-buffer)
+                  ((and (ediff-buffer-live-p ediff-custom-diff-buffer)
+                         ;; We may not have gotten a custom output if
+                         ;; we're working on unsaved buffers.
+                         (> (buffer-size ediff-custom-diff-buffer) 0))
                    ediff-custom-diff-buffer)
                   ((ediff-buffer-live-p ediff-diff-buffer)
                    ediff-diff-buffer)
diff --git a/lisp/vc/ediff-wind.el b/lisp/vc/ediff-wind.el
index 1e702edb41..4549b910b1 100644
--- a/lisp/vc/ediff-wind.el
+++ b/lisp/vc/ediff-wind.el
@@ -1135,7 +1135,10 @@ It assumes that it is called from within the control 
buffer."
     (setq mode-line-format
          (if (ediff-narrow-control-frame-p)
              (list "   " mode-line-buffer-identification)
-           (list "-- " mode-line-buffer-identification "        Quick Help")))
+           (list "-- " mode-line-buffer-identification
+                  (and (not (eq ediff-window-setup-function
+                                'ediff-setup-windows-plain))
+                       "        Quick Help"))))
     ;; control buffer id
     (setq mode-line-buffer-identification
          (if (ediff-narrow-control-frame-p)
@@ -1213,18 +1216,20 @@ It assumes that it is called from within the control 
buffer."
    ediff-control-buffer-suffix))
 
 (defun ediff-make-wide-control-buffer-id ()
-  (cond ((< ediff-current-difference 0)
-        (list (format "%%b   At start of %d diffs"
-                      ediff-number-of-differences)))
-       ((>= ediff-current-difference ediff-number-of-differences)
-        (list (format "%%b   At end of %d diffs"
-                      ediff-number-of-differences)))
-       (t
-        (list (format "%%b   diff %d of %d"
-                      (1+ ediff-current-difference)
-                      ediff-number-of-differences)))))
-
-
+  (list
+   (concat "%b   "
+           (propertize
+            (cond ((< ediff-current-difference 0)
+                   (format "At start of %d diffs"
+                           ediff-number-of-differences))
+                  ((>= ediff-current-difference ediff-number-of-differences)
+                   (format "At end of %d diffs"
+                           ediff-number-of-differences))
+                  (t
+                   (format "diff %d of %d"
+                           (1+ ediff-current-difference)
+                           ediff-number-of-differences)))
+            'face 'mode-line-buffer-id))))
 
 ;; If buff is not live, return nil
 (defun ediff-get-visible-buffer-window (buff)
diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el
index 79dafe60cc..e958673fea 100644
--- a/lisp/vc/log-edit.el
+++ b/lisp/vc/log-edit.el
@@ -710,10 +710,14 @@ different header separator appropriate for 
`log-edit-mode'."
   (interactive)
   (when (or (called-interactively-p 'interactive)
             (log-edit-empty-buffer-p))
-    (insert "Summary: ")
-    (when log-edit-setup-add-author
-      (insert "\nAuthor: "))
-    (insert "\n\n")
+    (dolist (header (append '("Summary") (and log-edit-setup-add-author
+                                              '("Author"))))
+      ;; Make `C-a' work like in other buffers with header names.
+      (insert (propertize (concat header ": ")
+                          'field 'header
+                          'rear-nonsticky t)
+              "\n"))
+    (insert "\n")
     (message-position-point)))
 
 (defun log-edit-insert-cvs-template ()
diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el
index 2e9de587bf..9335da1006 100644
--- a/lisp/vc/vc-dir.el
+++ b/lisp/vc/vc-dir.el
@@ -325,6 +325,7 @@ See `run-hooks'."
     (define-key map "U" #'vc-dir-unmark-all-files)
     (define-key map "\C-?" #'vc-dir-unmark-file-up)
     (define-key map "\M-\C-?" #'vc-dir-unmark-all-files)
+    (define-key map "%" #'vc-dir-mark-by-regexp)
     ;; Movement.
     (define-key map "n" #'vc-dir-next-line)
     (define-key map " " #'vc-dir-next-line)
@@ -750,6 +751,23 @@ share the same state."
                (vc-dir-mark-file crt)))
            (setq crt (ewoc-next vc-ewoc crt))))))))
 
+(defun vc-dir-mark-by-regexp (regexp &optional unmark)
+  "Mark all files that match REGEXP.
+If UNMARK (interactively, the prefix), unmark instead."
+  (interactive "sMark files matching: \nP")
+  (ewoc-map
+   (lambda (filearg)
+     (when (and (not (vc-dir-fileinfo->directory filearg))
+                (eq (not unmark)
+                    (not (vc-dir-fileinfo->marked filearg)))
+                ;; We don't want to match on the part of the file
+                ;; that's above the current directory.
+                (string-match-p regexp (file-relative-name
+                                        (vc-dir-fileinfo->name filearg))))
+       (setf (vc-dir-fileinfo->marked filearg) (not unmark))
+       t))
+   vc-ewoc))
+
 (defun vc-dir-mark-files (mark-files)
   "Mark files specified by file names in the argument MARK-FILES.
 MARK-FILES should be a list of absolute filenames."
@@ -924,7 +942,7 @@ system."
   "Search through all marked files for a match for REGEXP.
 For marked directories, use the files displayed from those directories.
 Stops when a match is found.
-To continue searching for next match, use command \\[tags-loop-continue]."
+To continue searching for next match, use command \\[fileloop-continue]."
   (interactive "sSearch marked files (regexp): ")
   (tags-search regexp
                (mapcar #'car (vc-dir-marked-only-files-and-states))))
@@ -940,7 +958,7 @@ DEL or `n' to skip and go to the next match.  For more 
directions,
 type \\[help-command] at that time.
 
 If you exit (\\[keyboard-quit], RET or q), you can resume the query replace
-with the command \\[tags-loop-continue]."
+with the command \\[fileloop-continue]."
   ;; FIXME: this is almost a copy of `dired-do-query-replace-regexp'.  This
   ;; should probably be made generic and used in both places instead of
   ;; duplicating it here.
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index ad39dc604a..8937454d11 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -1599,7 +1599,7 @@ This requires git 1.8.4 or later, for the \"-L\" option 
of \"git log\"."
 (declare-function grep-read-regexp "grep" ())
 (declare-function grep-read-files "grep" (regexp))
 (declare-function grep-expand-template "grep"
-                 (template &optional regexp files dir excl))
+                 (template &optional regexp files dir excl more-opts))
 (defvar compilation-environment)
 
 ;; Derived from `lgrep'.
diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el
index bd2ea337b1..cc08767ade 100644
--- a/lisp/vc/vc-hooks.el
+++ b/lisp/vc/vc-hooks.el
@@ -99,7 +99,7 @@ interpreted as hostnames."
   :type 'regexp
   :group 'vc)
 
-(defcustom vc-handled-backends '(RCS CVS SVN SCCS SRC Bzr Git Hg Mtn)
+(defcustom vc-handled-backends '(RCS CVS SVN SCCS SRC Bzr Git Hg)
   ;; RCS, CVS, SVN, SCCS, and SRC come first because they are per-dir
   ;; rather than per-tree.  RCS comes first because of the multibackend
   ;; support intended to use RCS for local commits (with a remote CVS server).
@@ -966,7 +966,7 @@ In the latter case, VC mode is deactivated for this buffer."
 
 (defalias 'vc-menu-map vc-menu-map)
 
-(declare-function vc-responsible-backend "vc" (file))
+(declare-function vc-responsible-backend "vc" (file &optional no-error))
 
 (defun vc-menu-map-filter (orig-binding)
   (if (and (symbolp orig-binding) (fboundp orig-binding))
diff --git a/lisp/vc/vc-rcs.el b/lisp/vc/vc-rcs.el
index 0a2b8fa53c..a4345c7d7e 100644
--- a/lisp/vc/vc-rcs.el
+++ b/lisp/vc/vc-rcs.el
@@ -100,7 +100,7 @@ to use --brief and sets this variable to remember whether 
it worked."
   "Where to look for RCS master files.
 For a description of possible values, see `vc-check-master-templates'."
   :type '(choice (const :tag "Use standard RCS file names"
-                       '("%sRCS/%s,v" "%s%s,v" "%sRCS/%s"))
+                       ("%sRCS/%s,v" "%s%s,v" "%sRCS/%s"))
                 (repeat :tag "User-specified"
                         (choice string
                                 function)))
diff --git a/lisp/vc/vc-src.el b/lisp/vc/vc-src.el
index 5a252c55cb..432448bde5 100644
--- a/lisp/vc/vc-src.el
+++ b/lisp/vc/vc-src.el
@@ -120,7 +120,7 @@ If nil, use the value of `vc-diff-switches'.  If t, use no 
switches."
   "Where to look for SRC master files.
 For a description of possible values, see `vc-check-master-templates'."
   :type '(choice (const :tag "Use standard SRC file names"
-                       '("%s.src/%s,v"))
+                       ("%s.src/%s,v"))
                 (repeat :tag "User-specified"
                         (choice string
                                 function))))
diff --git a/lisp/vc/vc-svn.el b/lisp/vc/vc-svn.el
index 3cf692bfda..270877041a 100644
--- a/lisp/vc/vc-svn.el
+++ b/lisp/vc/vc-svn.el
@@ -212,7 +212,7 @@ switches."
 (autoload 'vc-expand-dirs "vc")
 
 (defun vc-svn-dir-status-files (_dir files callback)
-  "Run 'svn status' for DIR and update BUFFER via CALLBACK.
+  "Run \"svn status\" for DIR and update BUFFER via CALLBACK.
 CALLBACK is called as (CALLBACK RESULT BUFFER), where
 RESULT is a list of conses (FILE . STATE) for directory DIR."
   ;; FIXME shouldn't this rather default to all the files in dir?
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index 3508f684c4..d6f0f4a497 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -2654,7 +2654,10 @@ with its diffs (if the underlying VCS supports that)."
         (error "Directory is not version controlled")))
     (setq default-directory rootdir)
     (vc-print-log-internal backend (list rootdir) revision revision limit
-                           (when with-diff 'with-diff))))
+                           (when with-diff 'with-diff))
+    ;; We're looking at the root, so displaying " from <some-file>" in
+    ;; the mode line isn't helpful.
+    (setq vc-parent-buffer-name nil)))
 
 ;;;###autoload
 (defun vc-print-branch-log (branch)
diff --git a/lisp/vcursor.el b/lisp/vcursor.el
index 8b7105df51..a54227c1bc 100644
--- a/lisp/vcursor.el
+++ b/lisp/vcursor.el
@@ -216,23 +216,17 @@
 ;; Key bindings
 ;; ============
 ;;
-;; There is an alternative set of key bindings which will be used
-;; automatically for a PC if Oemacs is detected.  This set uses separate
-;; control, shift and meta keys with function keys 1 to 10.  In
-;; particular, movement keys are concentrated on f5 to f8 with (in
-;; increasing order of distance traveled) C-, M- and S- as prefixes.
-;; See the actual bindings below (search for C-f1).  This is because the
-;; C-S- prefix is represented by weird key sequences and the set is
-;; incomplete; if you don't mind that, some hints are given in comments
-;; below.
+;; There is an alternative set of key bindings named "Oemacs" (for
+;; historical reasons).  This set uses separate control, shift and
+;; meta keys with function keys 1 to 10.  In particular, movement keys
+;; are concentrated on f5 to f8 with (in increasing order of distance
+;; traveled) C-, M- and S- as prefixes.  See the actual bindings below
+;; (search for C-f1).  This is because the C-S- prefix is represented
+;; by weird key sequences and the set is incomplete; if you don't mind
+;; that, some hints are given in comments below.
 ;;
-;; You can specify the usual or the Oemacs bindings by setting the
-;; variable vcursor-key-bindings to `xterm' or `oemacs'.  You can also set
-;; it to nil, in which case vcursor will not make any key bindings
-;; and you can define your own.  The default is t, which makes vcursor
-;; guess (it will use xterm unless it thinks Oemacs is running).  The
-;; oemacs set will work on an X terminal with function keys, but the
-;; xterm set will not work under Oemacs.
+;; You can specify which set of key bindings to use by customizing the
+;; user option `vcursor-key-bindings'.
 ;;
 ;; Usage on dumb terminals
 ;; =======================
@@ -355,8 +349,7 @@ on loading vcursor and from the customize package."
   (set var value)
   (cond
    ((not value)) ;; Don't set any key bindings.
-   ((or (eq value 'oemacs)
-       (and (eq value t) (fboundp 'oemacs-version)))
+   ((eq value 'oemacs)
     (global-set-key [C-f1] #'vcursor-toggle-copy)
     (global-set-key [C-f2] #'vcursor-copy)
     (global-set-key [C-f3] #'vcursor-copy-word)
@@ -386,33 +379,6 @@ on loading vcursor and from the customize package."
 
     (global-set-key [S-f9] #'vcursor-execute-key)
     (global-set-key [S-f10] #'vcursor-execute-command)
-
-    ;; Partial dictionary of Oemacs key sequences for you to roll your own,
-    ;; e.g C-S-up: (global-set-key "\M-[\C-f\M-\C-m" 'vcursor-previous-line)
-    ;;    Sequence:         Sends:
-    ;; "\M-[\C-f\M-\C-m"   C-S-up
-    ;; "\M-[\C-f\M-\C-q"   C-S-down
-    ;; "\M-[\C-fs"         C-S-left
-    ;; "\M-[\C-ft"         C-S-right
-    ;;
-    ;; "\M-[\C-fw"         C-S-home
-    ;; "\M-[\C-b\C-o"      S-tab
-    ;; "\M-[\C-f\M-\C-r"   C-S-insert
-    ;; "\M-[\C-fu"         C-S-end
-    ;; "\M-[\C-f\M-\C-s"   C-S-delete
-    ;; "\M-[\C-f\M-\C-d"   C-S-prior
-    ;; "\M-[\C-fv"         C-S-next
-    ;;
-    ;; "\M-[\C-f^"         C-S-f1
-    ;; "\M-[\C-f_"         C-S-f2
-    ;; "\M-[\C-f`"         C-S-f3
-    ;; "\M-[\C-fa"         C-S-f4
-    ;; "\M-[\C-fb"         C-S-f5
-    ;; "\M-[\C-fc"         C-S-f6
-    ;; "\M-[\C-fd"         C-S-f7
-    ;; "\M-[\C-fe"         C-S-f8
-    ;; "\M-[\C-ff"         C-S-f9
-    ;; "\M-[\C-fg"         C-S-f10
     )
    (t
     (global-set-key (vcursor-cs-binding "up") #'vcursor-previous-line)
@@ -456,11 +422,12 @@ on loading vcursor and from the customize package."
     (global-set-key (vcursor-cs-binding "f10") #'vcursor-execute-command)
     )))
 
+;; TODO: Get rid of references to "oemacs", which was an ancient
+;;       MS-DOS compatible release of Emacs 19.
 (defcustom vcursor-key-bindings nil
   "How to bind keys when vcursor is loaded.
-If t, guess; if `xterm', use bindings suitable for an X terminal; if
-`oemacs', use bindings which work on a PC with Oemacs.  If nil, don't
-define any key bindings.
+If t or `xterm', use the default bindings; if `oemacs', use
+alternative key bindings.  If nil, don't define any key bindings.
 
 Default is nil."
   :type '(choice (const t) (const nil) (const xterm) (const oemacs))
@@ -854,9 +821,7 @@ Arguments N and optional ALL-FRAMES are the same as with 
`other-window'.
 ALL-FRAMES is also used to decide whether to split the window."
 
   (interactive "p")
-  (if (if (fboundp 'oemacs-version)
-         (one-window-p nil)
-       (one-window-p nil all-frames))
+  (if (one-window-p nil all-frames)
       (display-buffer (current-buffer) t))
   (save-excursion
     (save-window-excursion
diff --git a/lisp/view.el b/lisp/view.el
index bfc0341b2a..3343136c1c 100644
--- a/lisp/view.el
+++ b/lisp/view.el
@@ -146,7 +146,7 @@ This is local in each buffer, once it is used.")
 
 ;; Some redundant "less"-like key bindings below have been commented out.
 (defvar-keymap view-mode-map
-  :doc "Keymap for ‘view-mode’."
+  :doc "Keymap for `view-mode'."
   "C"     #'View-kill-and-leave
   "c"     #'View-leave
   "Q"     #'View-quit-all
diff --git a/lisp/w32-fns.el b/lisp/w32-fns.el
index f353566b06..85e37ec609 100644
--- a/lisp/w32-fns.el
+++ b/lisp/w32-fns.el
@@ -312,8 +312,8 @@ names."
 
 ;;;; System name and version for emacsbug.el
 
-(declare-function w32-version "w32-win" ())
-(declare-function w32-read-registry "w32fns" (root key name))
+(declare-function w32-version "term/w32-win" ())
+(declare-function w32-read-registry "w32fns.c" (root key name))
 
 (defun w32--os-description ()
   "Return a string describing the underlying OS and its version."
@@ -359,23 +359,6 @@ names."
 
 ;;;; Support for build process
 
-;; From autoload.el
-(defvar autoload-make-program)
-(defvar generated-autoload-file)
-
-(defun w32-batch-update-autoloads ()
-  "Like `batch-update-autoloads', but takes the name of the autoloads file
-from the command line.
-
-This is required because some Windows build environments, such as MSYS,
-munge command-line arguments that include file names to a horrible mess
-that Emacs is unable to cope with."
-  (let ((generated-autoload-file
-        (expand-file-name (pop command-line-args-left)))
-       ;; I can only assume the same considerations may apply here...
-       (autoload-make-program (pop command-line-args-left)))
-    (batch-update-autoloads)))
-
 (defun w32-append-code-lines (orig extra)
   "Append non-empty non-comment lines in the file EXTRA to the file ORIG.
 
diff --git a/lisp/whitespace.el b/lisp/whitespace.el
index 8e726c40dd..610d670ac9 100644
--- a/lisp/whitespace.el
+++ b/lisp/whitespace.el
@@ -276,116 +276,116 @@
 
 It's a list containing some or all of the following values:
 
-   face                        enable all visualization via faces (see below).
-
-   trailing            trailing blanks are visualized via faces.
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
-
-   tabs                        TABs are visualized via faces.
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
-
-   spaces              SPACEs and HARD SPACEs are visualized via
-                       faces.
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
-
-   lines               lines which have columns beyond
-                       `whitespace-line-column' are highlighted via
-                       faces.
-                       Whole line is highlighted.
-                       It has precedence over `lines-tail' (see
-                       below).
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
-
-   lines-tail          lines which have columns beyond
-                       `whitespace-line-column' are highlighted via
-                       faces.
-                       But only the part of line which goes
-                       beyond `whitespace-line-column' column.
-                       It has effect only if `lines' (see above)
-                       is not present in `whitespace-style'
-                       and if `face' (see above) is present in
-                       `whitespace-style'.
-
-   newline             NEWLINEs are visualized via faces.
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
+   face                 enable all visualization via faces (see below).
+
+   trailing             trailing blanks are visualized via faces.
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
+
+   tabs                 TABs are visualized via faces.
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
+
+   spaces               SPACEs and HARD SPACEs are visualized via
+                        faces.
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
+
+   lines                lines which have columns beyond
+                        `whitespace-line-column' are highlighted via
+                        faces.
+                        Whole line is highlighted.
+                        It has precedence over `lines-tail' (see
+                        below).
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
+
+   lines-tail           lines which have columns beyond
+                        `whitespace-line-column' are highlighted via
+                        faces.
+                        But only the part of line which goes
+                        beyond `whitespace-line-column' column.
+                        It has effect only if `lines' (see above)
+                        is not present in `whitespace-style'
+                        and if `face' (see above) is present in
+                        `whitespace-style'.
+
+   newline              NEWLINEs are visualized via faces.
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
 
    missing-newline-at-eof Missing newline at the end of the file is
                         visualized via faces.
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
-
-   empty               empty lines at beginning and/or end of buffer
-                       are visualized via faces.
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
-
-   indentation::tab    `tab-width' or more SPACEs at beginning of line
-                       are visualized via faces.
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
-
-   indentation::space  TABs at beginning of line are visualized via
-                       faces.
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
-
-   indentation         `tab-width' or more SPACEs at beginning of line
-                       are visualized, if `indent-tabs-mode' (which
-                       see) is non-nil; otherwise, TABs at beginning
-                       of line are visualized via faces.
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
-
-   big-indent          Big indentations are visualized via faces.
-                       It has effect only if `face' (see above)
-                       is present in `whitespace-style'.
-
-   space-after-tab::tab                `tab-width' or more SPACEs after a TAB
-                               are visualized via faces.
-                               It has effect only if `face' (see above)
-                               is present in `whitespace-style'.
-
-   space-after-tab::space      TABs are visualized when `tab-width' or
-                               more SPACEs occur after a TAB, via
-                               faces.
-                               It has effect only if `face' (see above)
-                               is present in `whitespace-style'.
-
-   space-after-tab             `tab-width' or more SPACEs after a TAB
-                               are visualized, if `indent-tabs-mode'
-                               (which see) is non-nil; otherwise,
-                               the TABs are visualized via faces.
-                               It has effect only if `face' (see above)
-                               is present in `whitespace-style'.
-
-   space-before-tab::tab       SPACEs before TAB are visualized via
-                               faces.
-                               It has effect only if `face' (see above)
-                               is present in `whitespace-style'.
-
-   space-before-tab::space     TABs are visualized when SPACEs occur
-                               before TAB, via faces.
-                               It has effect only if `face' (see above)
-                               is present in `whitespace-style'.
-
-   space-before-tab            SPACEs before TAB are visualized, if
-                               `indent-tabs-mode' (which see) is
-                               non-nil; otherwise, the TABs are
-                               visualized via faces.
-                               It has effect only if `face' (see above)
-                               is present in `whitespace-style'.
-
-   space-mark          SPACEs and HARD SPACEs are visualized via
-                       display table.
-
-   tab-mark            TABs are visualized via display table.
-
-   newline-mark                NEWLINEs are visualized via display table.
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
+
+   empty                empty lines at beginning and/or end of buffer
+                        are visualized via faces.
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
+
+   indentation::tab     `tab-width' or more SPACEs at beginning of line
+                        are visualized via faces.
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
+
+   indentation::space   TABs at beginning of line are visualized via
+                        faces.
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
+
+   indentation          `tab-width' or more SPACEs at beginning of line
+                        are visualized, if `indent-tabs-mode' (which
+                        see) is non-nil; otherwise, TABs at beginning
+                        of line are visualized via faces.
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
+
+   big-indent           Big indentations are visualized via faces.
+                        It has effect only if `face' (see above)
+                        is present in `whitespace-style'.
+
+   space-after-tab::tab         `tab-width' or more SPACEs after a TAB
+                                are visualized via faces.
+                                It has effect only if `face' (see above)
+                                is present in `whitespace-style'.
+
+   space-after-tab::space       TABs are visualized when `tab-width' or
+                                more SPACEs occur after a TAB, via
+                                faces.
+                                It has effect only if `face' (see above)
+                                is present in `whitespace-style'.
+
+   space-after-tab              `tab-width' or more SPACEs after a TAB
+                                are visualized, if `indent-tabs-mode'
+                                (which see) is non-nil; otherwise,
+                                the TABs are visualized via faces.
+                                It has effect only if `face' (see above)
+                                is present in `whitespace-style'.
+
+   space-before-tab::tab        SPACEs before TAB are visualized via
+                                faces.
+                                It has effect only if `face' (see above)
+                                is present in `whitespace-style'.
+
+   space-before-tab::space      TABs are visualized when SPACEs occur
+                                before TAB, via faces.
+                                It has effect only if `face' (see above)
+                                is present in `whitespace-style'.
+
+   space-before-tab             SPACEs before TAB are visualized, if
+                                `indent-tabs-mode' (which see) is
+                                non-nil; otherwise, the TABs are
+                                visualized via faces.
+                                It has effect only if `face' (see above)
+                                is present in `whitespace-style'.
+
+   space-mark           SPACEs and HARD SPACEs are visualized via
+                        display table.
+
+   tab-mark             TABs are visualized via display table.
+
+   newline-mark         NEWLINEs are visualized via display table.
 
 Any other value is ignored.
 
@@ -808,21 +808,21 @@ Each element has the following form:
 
 Where:
 
-KIND   is the kind of character.
-       It can be one of the following symbols:
+KIND    is the kind of character.
+        It can be one of the following symbols:
 
-       tab-mark        for TAB character
+        tab-mark        for TAB character
 
-       space-mark      for SPACE or HARD SPACE character
+        space-mark      for SPACE or HARD SPACE character
 
-       newline-mark    for NEWLINE character
+        newline-mark    for NEWLINE character
 
-CHAR   is the character to be mapped.
+CHAR    is the character to be mapped.
 
-VECTOR is a vector of characters to be displayed in place of CHAR.
-       The first display vector that can be displayed is used;
-       if no display vector for a mapping can be displayed, then
-       that character is displayed unmodified.
+VECTOR  is a vector of characters to be displayed in place of CHAR.
+        The first display vector that can be displayed is used;
+        if no display vector for a mapping can be displayed, then
+        that character is displayed unmodified.
 
 The NEWLINE character is displayed using the face given by
 `whitespace-newline' variable.
@@ -880,27 +880,27 @@ C++ modes only."
 
 It's a list containing some or all of the following values:
 
-   nil                 no action is taken.
+   nil                  no action is taken.
 
-   cleanup             cleanup any bogus whitespace always when local
-                       whitespace is turned on.
-                       See `whitespace-cleanup' and
-                       `whitespace-cleanup-region'.
+   cleanup              cleanup any bogus whitespace always when local
+                        whitespace is turned on.
+                        See `whitespace-cleanup' and
+                        `whitespace-cleanup-region'.
 
-   report-on-bogus     report if there is any bogus whitespace always
-                       when local whitespace is turned on.
+   report-on-bogus      report if there is any bogus whitespace always
+                        when local whitespace is turned on.
 
-   auto-cleanup                cleanup any bogus whitespace when buffer is
-                       written.
-                       See `whitespace-cleanup' and
-                       `whitespace-cleanup-region'.
+   auto-cleanup         cleanup any bogus whitespace when buffer is
+                        written.
+                        See `whitespace-cleanup' and
+                        `whitespace-cleanup-region'.
 
-   abort-on-bogus      abort if there is any bogus whitespace and the
-                       buffer is written.
+   abort-on-bogus       abort if there is any bogus whitespace and the
+                        buffer is written.
 
-   warn-if-read-only   give a warning if `cleanup' or `auto-cleanup'
-                       is included in `whitespace-action' and the
-                       buffer is read-only.
+   warn-if-read-only    give a warning if `cleanup' or `auto-cleanup'
+                        is included in `whitespace-action' and the
+                        buffer is read-only.
 
 Any other value is treated as nil."
   :type '(choice :tag "Actions"
diff --git a/lisp/window.el b/lisp/window.el
index 9f78784612..eba888a89d 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -2488,8 +2488,16 @@ and no others."
 
 (defalias 'some-window 'get-window-with-predicate)
 
+(defcustom display-buffer-avoid-small-windows nil
+  "If non-nil, windows that have fewer lines than this are avoided.
+This is used by `get-lru-window'.  The value is interpreted in units
+of the frame's canonical line height, like `window-total-height' does."
+  :type '(choice (const nil) number)
+  :version "29.1"
+  :group 'windows)
+
 (defun get-lru-window (&optional all-frames dedicated not-selected no-other)
-   "Return the least recently used window on frames specified by ALL-FRAMES.
+  "Return the least recently used window on frames specified by ALL-FRAMES.
 Return a full-width window if possible.  A minibuffer window is
 never a candidate.  A dedicated window is never a candidate
 unless DEDICATED is non-nil, so if all windows are dedicated, the
@@ -2513,15 +2521,23 @@ have special meanings:
 - A frame means consider all windows on that frame only.
 
 Any other value of ALL-FRAMES means consider all windows on the
-selected frame and no others."
-   (let (best-window best-time second-best-window second-best-time time)
-    (dolist (window (window-list-1 nil 'nomini all-frames))
+selected frame and no others.
+
+`display-buffer-avoid-small-windows', if non-nil, is also taken into
+consideration.  Windows whose height is smaller that the value of that
+variable will be avoided if larger windows are available."
+  (let ((windows (window-list-1 nil 'nomini all-frames))
+        best-window best-time second-best-window second-best-time time)
+    (dolist (window windows)
       (when (and (or dedicated (not (window-dedicated-p window)))
                 (or (not not-selected) (not (eq window (selected-window))))
                  (or (not no-other)
                      (not (window-parameter window 'no-other-window))))
        (setq time (window-use-time window))
        (if (or (eq window (selected-window))
+                (and display-buffer-avoid-small-windows
+                     (< (window-height window)
+                        display-buffer-avoid-small-windows))
                (not (window-full-width-p window)))
            (when (or (not second-best-time) (< time second-best-time))
              (setq second-best-time time)
@@ -4165,8 +4181,8 @@ another live window on that frame to serve as its selected
 window.  This option allows to control which window gets selected
 instead.
 
-The possible choices are 'mru' (the default) to select the most
-recently used window on that frame, and 'pos' to choose the
+The possible choices are `mru' (the default) to select the most
+recently used window on that frame, and `pos' to choose the
 window at the frame coordinates of point of the previously
 selected window.  If this is nil, choose the frame's first window
 instead.  A window with a non-nil `no-other-window' parameter is
@@ -4578,7 +4594,9 @@ as well.  In that case, if this option specifies a 
function, it
 will be called with the third argument nil.
 
 Under certain circumstances `switch-to-prev-buffer' may ignore
-this option, for example, when there is only one buffer left."
+this option, for example, when there is only one buffer left.
+
+Also see `switch-to-prev-buffer-skip-regexp'."
   :type
   '(choice (const :tag "Never" nil)
            (const :tag "This frame" this)
@@ -4589,16 +4607,37 @@ this option, for example, when there is only one buffer 
left."
   :version "27.1"
   :group 'windows)
 
+(defcustom switch-to-prev-buffer-skip-regexp nil
+  "Buffers that `switch-to-prev-buffer' and `switch-to-next-buffer' should 
skip.
+The value can either be a regexp or a list of regexps.  Buffers whose
+names match these regexps are skipped by `switch-to-prev-buffer'
+and `switch-to-next-buffer'.
+
+Also see `switch-to-prev-buffer-skip'."
+  :type '(choice regexp
+                 (repeat regexp))
+  :version "29.1"
+  :group 'windows)
+
 (defun switch-to-prev-buffer-skip-p (skip window buffer &optional bury-or-kill)
   "Return non-nil if `switch-to-prev-buffer' should skip BUFFER.
 SKIP is a value derived from `switch-to-prev-buffer-skip', WINDOW
 the window `switch-to-prev-buffer' acts upon.  Optional argument
 BURY-OR-KILL is passed unchanged by `switch-to-prev-buffer' and
 omitted in calls from `switch-to-next-buffer'."
-  (when skip
-    (if (functionp skip)
-        (funcall skip window buffer bury-or-kill)
-      (get-buffer-window buffer skip))))
+  (or (and skip
+           (if (functionp skip)
+               (funcall skip window buffer bury-or-kill)
+             (get-buffer-window buffer skip)))
+      (and switch-to-prev-buffer-skip-regexp
+           (or (and (stringp switch-to-prev-buffer-skip-regexp)
+                    (string-match-p switch-to-prev-buffer-skip-regexp
+                                    (buffer-name buffer)))
+               (and (consp switch-to-prev-buffer-skip-regexp)
+                    (catch 'found
+                      (dolist (regexp switch-to-prev-buffer-skip-regexp)
+                        (when (string-match-p regexp (buffer-name buffer))
+                          (throw 'tag t)))))))))
 
 (defun switch-to-prev-buffer (&optional window bury-or-kill)
   "In WINDOW switch to previous buffer.
@@ -4886,10 +4925,7 @@ the buffer `*scratch*', creating it if necessary."
   (setq frame (or frame (selected-frame)))
   (or (get-next-valid-buffer (nreverse (buffer-list frame))
                             buffer visible-ok frame)
-      (get-buffer "*scratch*")
-      (let ((scratch (get-buffer-create "*scratch*")))
-       (set-buffer-major-mode scratch)
-       scratch)))
+      (get-scratch-buffer-create)))
 
 (defcustom frame-auto-hide-function #'iconify-frame
   "Function called to automatically hide frames.
@@ -5122,6 +5158,14 @@ all window-local buffer lists."
   :version "27.1"
   :group 'windows)
 
+(defun window--quit-restore-select-window (window)
+  "Select WINDOW after having quit another one.
+Do not select an inactive minibuffer window."
+  (when (and (window-live-p window)
+             (or (not (window-minibuffer-p window))
+                 (minibuffer-window-active-p window)))
+    (select-window window)))
+
 (defun quit-restore-window (&optional window bury-or-kill)
   "Quit WINDOW and deal with its buffer.
 WINDOW must be a live window and defaults to the selected one.
@@ -5160,6 +5204,7 @@ nil means to not handle the buffer in a particular way.  
This
   (setq window (window-normalize-window window t))
   (let* ((buffer (window-buffer window))
         (quit-restore (window-parameter window 'quit-restore))
+        (quit-restore-2 (nth 2 quit-restore))
          (prev-buffer (catch 'prev-buffer
                         (dolist (buf (window-prev-buffers window))
                           (unless (eq (car buf) buffer)
@@ -5171,15 +5216,13 @@ nil means to not handle the buffer in a particular way. 
 This
      ((and dedicated (not (eq dedicated 'side))
            (window--delete window 'dedicated (eq bury-or-kill 'kill)))
       ;; If the previously selected window is still alive, select it.
-      (when (window-live-p (nth 2 quit-restore))
-        (select-window (nth 2 quit-restore))))
+      (window--quit-restore-select-window quit-restore-2))
      ((and (not prev-buffer)
           (eq (nth 1 quit-restore) 'tab)
           (eq (nth 3 quit-restore) buffer))
       (tab-bar-close-tab)
       ;; If the previously selected window is still alive, select it.
-      (when (window-live-p (nth 2 quit-restore))
-       (select-window (nth 2 quit-restore))))
+      (window--quit-restore-select-window quit-restore-2))
      ((and (not prev-buffer)
           (or (eq (nth 1 quit-restore) 'frame)
               (and (eq (nth 1 quit-restore) 'window)
@@ -5191,8 +5234,7 @@ nil means to not handle the buffer in a particular way.  
This
           ;; Delete WINDOW if possible.
           (window--delete window nil (eq bury-or-kill 'kill)))
       ;; If the previously selected window is still alive, select it.
-      (when (window-live-p (nth 2 quit-restore))
-       (select-window (nth 2 quit-restore))))
+      (window--quit-restore-select-window quit-restore-2))
      ((and (listp (setq quad (nth 1 quit-restore)))
           (buffer-live-p (car quad))
           (eq (nth 3 quit-restore) buffer))
@@ -5236,8 +5278,8 @@ nil means to not handle the buffer in a particular way.  
This
       ;; Reset the quit-restore parameter.
       (set-window-parameter window 'quit-restore nil)
       ;; Select old window.
-      (when (window-live-p (nth 2 quit-restore))
-       (select-window (nth 2 quit-restore))))
+      ;; If the previously selected window is still alive, select it.
+      (window--quit-restore-select-window quit-restore-2))
      (t
       ;; Show some other buffer in WINDOW and reset the quit-restore
       ;; parameter.
@@ -5250,8 +5292,8 @@ nil means to not handle the buffer in a particular way.  
This
           (when (eq dedicated 'side)
             (set-window-dedicated-p window 'side))
         (window--delete window nil (eq bury-or-kill 'kill))
-        (when (window-live-p (nth 2 quit-restore))
-          (select-window (nth 2 quit-restore))))))
+      ;; If the previously selected window is still alive, select it.
+      (window--quit-restore-select-window quit-restore-2))))
 
     ;; Deal with the buffer.
     (cond
@@ -7409,6 +7451,7 @@ The actual non-nil value of this variable will be copied 
to the
           (const display-buffer-pop-up-window)
           (const display-buffer-same-window)
           (const display-buffer-pop-up-frame)
+          (const display-buffer-full-frame)
           (const display-buffer-in-child-frame)
           (const display-buffer-below-selected)
           (const display-buffer-at-bottom)
@@ -7555,6 +7598,7 @@ to an expression containing one of these \"action\" 
functions:
  `display-buffer-use-least-recent-window' -- Try to avoid re-using
     windows that have recently been switched to.
  `display-buffer-pop-up-window' -- Pop up a new window.
+ `display-buffer-full-frame' -- Delete other windows and use the full frame.
  `display-buffer-below-selected' -- Use or pop up a window below
     the selected one.
  `display-buffer-at-bottom' -- Use or pop up a window at the
@@ -7788,6 +7832,23 @@ indirectly called by the latter."
              (window-dedicated-p))
     (window--display-buffer buffer (selected-window) 'reuse alist)))
 
+(defun display-buffer-full-frame (buffer alist)
+  "Display BUFFER in the current frame, taking the entire frame.
+ALIST is an association list of action symbols and values.  See
+Info node `(elisp) Buffer Display Action Alists' for details of
+such alists.
+
+This is an action function for buffer display, see Info
+node `(elisp) Buffer Display Action Functions'.  It should be
+called only by `display-buffer' or a function directly or
+indirectly called by the latter."
+  (when-let ((window (or (display-buffer-reuse-window buffer alist)
+                         (display-buffer-same-window buffer alist)
+                         (display-buffer-pop-up-window buffer alist)
+                         (display-buffer-use-some-window buffer alist))))
+    (delete-other-windows window)
+    window))
+
 (defun display-buffer--maybe-same-window (buffer alist)
   "Conditionally display BUFFER in the selected window.
 ALIST is an association list of action symbols and values.  See
@@ -8621,12 +8682,13 @@ If BUFFER-OR-NAME is nil, return the buffer returned by
 `other-buffer'.  Else, if a buffer specified by BUFFER-OR-NAME
 exists, return that buffer.  If no such buffer exists, create a
 buffer with the name BUFFER-OR-NAME and return that buffer."
-  (if buffer-or-name
-      (or (get-buffer buffer-or-name)
-         (let ((buffer (get-buffer-create buffer-or-name)))
-           (set-buffer-major-mode buffer)
-           buffer))
-    (other-buffer)))
+  (pcase buffer-or-name
+    ('nil (other-buffer))
+    ("*scratch*" (get-scratch-buffer-create))
+    (_ (or (get-buffer buffer-or-name)
+          (let ((buffer (get-buffer-create buffer-or-name)))
+            (set-buffer-major-mode buffer)
+            buffer)))))
 
 (defcustom switch-to-buffer-preserve-window-point t
   "If non-nil, `switch-to-buffer' tries to preserve `window-point'.
@@ -8869,6 +8931,7 @@ to deactivate this overriding action."
   (let* ((old-window (or (minibuffer-selected-window) (selected-window)))
          (new-window nil)
          (minibuffer-depth (minibuffer-depth))
+         (obey-display switch-to-buffer-obey-display-actions)
          (clearfun (make-symbol "clear-display-buffer-overriding-action"))
          (postfun (make-symbol "post-display-buffer-override-next-command"))
          (action (lambda (buffer alist)
@@ -8893,6 +8956,7 @@ to deactivate this overriding action."
               (funcall post-function old-window new-window)))))
     (fset clearfun
           (lambda ()
+            (setq switch-to-buffer-obey-display-actions obey-display)
             (setcar display-buffer-overriding-action
                     (delq action (car display-buffer-overriding-action)))))
     (fset postfun
@@ -8909,6 +8973,7 @@ to deactivate this overriding action."
     (add-hook 'post-command-hook postfun)
     (when echofun
       (add-hook 'prefix-command-echo-keystrokes-functions echofun))
+    (setq switch-to-buffer-obey-display-actions t)
     (push action (car display-buffer-overriding-action))
     exitfun))
 
@@ -10031,65 +10096,98 @@ When point is already on that position, then signal 
an error."
 
 (defun scroll-up-command (&optional arg)
   "Scroll text of selected window upward ARG lines; or near full screen if no 
ARG.
+Interactively, giving this command a numerical prefix will scroll
+up by that many lines (and down by that many lines if the number
+is negative).  Without a prefix, scroll up by a full screen.
+If given a `C-u -' prefix, scroll a full page down instead.
+
 If `scroll-error-top-bottom' is non-nil and `scroll-up' cannot
 scroll window further, move cursor to the bottom line.
 When point is already on that position, then signal an error.
 A near full screen is `next-screen-context-lines' less than a full screen.
 Negative ARG means scroll downward.
-If ARG is the atom `-', scroll downward by nearly full screen."
+
+If ARG is the atom `-', scroll downward by nearly full screen.
+
+The command \\[set-goal-column] can be used to create a
+semipermanent goal column for this command."
   (interactive "^P")
-  (cond
-   ((null scroll-error-top-bottom)
-    (scroll-up arg))
-   ((eq arg '-)
-    (scroll-down-command nil))
-   ((< (prefix-numeric-value arg) 0)
-    (scroll-down-command (- (prefix-numeric-value arg))))
-   ((eobp)
-    (scroll-up arg))                   ; signal error
-   (t
-    (condition-case nil
-       (scroll-up arg)
-      (end-of-buffer
-       (if arg
-          ;; When scrolling by ARG lines can't be done,
-          ;; move by ARG lines instead.
-          (forward-line arg)
-        ;; When ARG is nil for full-screen scrolling,
-        ;; move to the bottom of the buffer.
-        (goto-char (point-max))))))))
+  (prog1
+      (cond
+       ((null scroll-error-top-bottom)
+        (scroll-up arg))
+       ((eq arg '-)
+        (scroll-down-command nil))
+       ((< (prefix-numeric-value arg) 0)
+        (scroll-down-command (- (prefix-numeric-value arg))))
+       ((eobp)
+        (scroll-up arg))                ; signal error
+       (t
+        (condition-case nil
+           (scroll-up arg)
+          (end-of-buffer
+           (if arg
+              ;; When scrolling by ARG lines can't be done,
+              ;; move by ARG lines instead.
+              (forward-line arg)
+            ;; When ARG is nil for full-screen scrolling,
+            ;; move to the bottom of the buffer.
+            (goto-char (point-max)))))))
+    (scroll-command--goto-goal-column)))
+
+(defun scroll-command--goto-goal-column ()
+  (when goal-column
+    ;; Move to the desired column.
+    (if (and line-move-visual
+             (not (or truncate-lines truncate-partial-width-windows)))
+        ;; Under line-move-visual, goal-column should be
+        ;; interpreted in units of the frame's canonical character
+        ;; width, which is exactly what vertical-motion does.
+        (vertical-motion (cons goal-column 0))
+      (line-move-to-column (truncate goal-column)))))
 
 (put 'scroll-up-command 'scroll-command t)
 
 (defun scroll-down-command (&optional arg)
   "Scroll text of selected window down ARG lines; or near full screen if no 
ARG.
+Interactively, giving this command a numerical prefix will scroll
+down by that many lines (and up by that many lines if the number
+is negative).  Without a prefix, scroll down by a full screen.
+If given a `C-u -' prefix, scroll a full page up instead.
+
 If `scroll-error-top-bottom' is non-nil and `scroll-down' cannot
 scroll window further, move cursor to the top line.
 When point is already on that position, then signal an error.
 A near full screen is `next-screen-context-lines' less than a full screen.
 Negative ARG means scroll upward.
-If ARG is the atom `-', scroll upward by nearly full screen."
+
+If ARG is the atom `-', scroll upward by nearly full screen.
+
+The command \\[set-goal-column] can be used to create a
+semipermanent goal column for this command."
   (interactive "^P")
-  (cond
-   ((null scroll-error-top-bottom)
-    (scroll-down arg))
-   ((eq arg '-)
-    (scroll-up-command nil))
-   ((< (prefix-numeric-value arg) 0)
-    (scroll-up-command (- (prefix-numeric-value arg))))
-   ((bobp)
-    (scroll-down arg))                 ; signal error
-   (t
-    (condition-case nil
-       (scroll-down arg)
-      (beginning-of-buffer
-       (if arg
-          ;; When scrolling by ARG lines can't be done,
-          ;; move by ARG lines instead.
-          (forward-line (- arg))
-        ;; When ARG is nil for full-screen scrolling,
-        ;; move to the top of the buffer.
-        (goto-char (point-min))))))))
+  (prog1
+      (cond
+       ((null scroll-error-top-bottom)
+        (scroll-down arg))
+       ((eq arg '-)
+        (scroll-up-command nil))
+       ((< (prefix-numeric-value arg) 0)
+        (scroll-up-command (- (prefix-numeric-value arg))))
+       ((bobp)
+        (scroll-down arg))              ; signal error
+       (t
+        (condition-case nil
+           (scroll-down arg)
+          (beginning-of-buffer
+           (if arg
+              ;; When scrolling by ARG lines can't be done,
+              ;; move by ARG lines instead.
+              (forward-line (- arg))
+            ;; When ARG is nil for full-screen scrolling,
+            ;; move to the top of the buffer.
+            (goto-char (point-min)))))))
+    (scroll-command--goto-goal-column)))
 
 (put 'scroll-down-command 'scroll-command t)
 
@@ -10498,55 +10596,6 @@ displaying that processes's buffer."
 (put 'shrink-window-horizontally 'repeat-map 'resize-window-repeat-map)
 (put 'shrink-window 'repeat-map 'resize-window-repeat-map)
 
-(defun window-char-pixel-width (&optional window face)
-  "Return average character width for the font of FACE used in WINDOW.
-WINDOW must be a live window and defaults to the selected one.
-
-If FACE is nil or omitted, the default face is used.  If FACE is
-remapped (see `face-remapping-alist'), the function returns the
-information for the remapped face."
-  (with-selected-window (window-normalize-window window t)
-    (let* ((info (font-info (face-font (or face 'default))))
-          (width (aref info 11)))
-      (if (> width 0)
-         width
-       (aref info 10)))))
-
-(defun window-char-pixel-height (&optional window face)
-  "Return character height for the font of FACE used in WINDOW.
-WINDOW must be a live window and defaults to the selected one.
-
-If FACE is nil or omitted, the default face is used.  If FACE is
-remapped (see `face-remapping-alist'), the function returns the
-information for the remapped face."
-  (with-selected-window (window-normalize-window window t)
-    (aref (font-info (face-font (or face 'default))) 3)))
-
-(defun window-max-characters-per-line (&optional window face)
-  "Return the number of characters that can be displayed on one line in WINDOW.
-WINDOW must be a live window and defaults to the selected one.
-
-The character width of FACE is used for the calculation.  If FACE
-is nil or omitted, the default face is used.  If FACE is
-remapped (see `face-remapping-alist'), the function uses the
-remapped face.
-
-This function is different from `window-body-width' in two
-ways.  First, it accounts for the portions of the line reserved
-for the continuation glyph.  Second, it accounts for the size of
-the font, which may have been adjusted, e.g., using
-`text-scale-increase')."
-  (with-selected-window (window-normalize-window window t)
-    (let* ((window-width (window-body-width window t))
-           (font-width (window-char-pixel-width window face))
-           (ncols (/ window-width font-width)))
-      (if (and (display-graphic-p)
-               overflow-newline-into-fringe
-               (/= (frame-parameter nil 'left-fringe) 0)
-               (/= (frame-parameter nil 'right-fringe) 0))
-          ncols
-        (1- ncols)))))
-
 (provide 'window)
 
 ;;; window.el ends here
diff --git a/lisp/woman.el b/lisp/woman.el
index c0c8f34348..fd5fee2005 100644
--- a/lisp/woman.el
+++ b/lisp/woman.el
@@ -1813,8 +1813,7 @@ Argument EVENT is the invoking mouse event."
    "--"
    ["Describe (Wo)Man Mode" describe-mode t]
    ["Mini Help" woman-mini-help t]
-   ,@(if (fboundp 'customize-group)
-        '(["Customize..." (customize-group 'woman) t]))
+   ["Customize..." (customize-group 'woman) t]
    "--"
    ("Advanced"
     ["View Source" (view-file woman-last-file-name) woman-last-file-name]
diff --git a/lisp/x-dnd.el b/lisp/x-dnd.el
index 47d8ae14cf..bcf74762cc 100644
--- a/lisp/x-dnd.el
+++ b/lisp/x-dnd.el
@@ -35,25 +35,26 @@
 (defcustom x-dnd-test-function #'x-dnd-default-test-function
   "The function drag and drop uses to determine if to accept or reject a drop.
 The function takes three arguments, WINDOW, ACTION and TYPES.
-WINDOW is where the mouse is when the function is called.  WINDOW may be a
-frame if the mouse isn't over a real window (i.e. menu bar, tool bar or
-scroll bar).  ACTION is the suggested action from the drag and drop source,
-one of the symbols move, copy, link or ask.  TYPES is a list of available
-types for the drop.
-
-The function shall return nil to reject the drop or a cons with two values,
-the wanted action as car and the wanted type as cdr.  The wanted action
-can be copy, move, link, ask or private.
+WINDOW is where the mouse is when the function is called.  WINDOW
+may be a frame if the mouse isn't over a real window (i.e. menu
+bar, tool bar or scroll bar).  ACTION is the suggested action
+from the drag and drop source, one of the symbols move, copy,
+link or ask.  TYPES is a vector of available types for the drop.
+
+Each element of TYPE should either be a string (containing the
+name of the type's X atom), or a symbol, whose name will be used.
+
+The function shall return nil to reject the drop or a cons with
+two values, the wanted action as car and the wanted type as cdr.
+The wanted action can be copy, move, link, ask or private.
+
 The default value for this variable is `x-dnd-default-test-function'."
   :version "22.1"
   :type 'symbol
   :group 'x)
 
-
-
 (defcustom x-dnd-types-alist
-  `(
-    (,(purecopy "text/uri-list") . x-dnd-handle-uri-list)
+  `((,(purecopy "text/uri-list") . x-dnd-handle-uri-list)
     (,(purecopy "text/x-moz-url") . x-dnd-handle-moz-url)
     (,(purecopy "_NETSCAPE_URL") . x-dnd-handle-uri-list)
     (,(purecopy "FILE_NAME") . x-dnd-handle-file-name)
@@ -64,8 +65,7 @@ The default value for this variable is 
`x-dnd-default-test-function'."
     (,(purecopy "text/plain") . dnd-insert-text)
     (,(purecopy "COMPOUND_TEXT") . x-dnd-insert-ctext)
     (,(purecopy "STRING") . dnd-insert-text)
-    (,(purecopy "TEXT")   . dnd-insert-text)
-    )
+    (,(purecopy "TEXT")   . dnd-insert-text))
   "Which function to call to handle a drop of that type.
 If the type for the drop is not present, or the function is nil,
 the drop is rejected.  The function takes three arguments, WINDOW, ACTION
@@ -91,14 +91,12 @@ if drop is successful, nil if not."
     "text/plain"
     "COMPOUND_TEXT"
     "STRING"
-    "TEXT"
-    ))
+    "TEXT"))
   "The types accepted by default for dropped data.
 The types are chosen in the order they appear in the list."
   :version "22.1"
   :type '(repeat string)
-  :group 'x
-)
+  :group 'x)
 
 ;; Internal variables
 
@@ -166,7 +164,6 @@ types in `x-dnd-known-types'.  It always returns the action 
private."
   (let ((type (x-dnd-choose-type types)))
     (when type (cons 'private type))))
 
-
 (defun x-dnd-current-type (frame-or-window)
   "Return the type we want the DND data to be in for the current drop.
 FRAME-OR-WINDOW is the frame or window that the mouse is over."
@@ -333,7 +330,10 @@ nil if not."
          ;; If dropping in an ordinary window which we could use,
          ;; let dnd-open-file-other-window specify what to do.
          (progn
-           (when (not mouse-yank-at-point)
+           (when (and (not mouse-yank-at-point)
+                       ;; If dropping on top of the mode line, insert
+                       ;; the text at point instead.
+                       (posn-point (event-start event)))
              (goto-char (posn-point (event-start event))))
            (funcall handler window action data))
        ;; If we can't display the file here,
@@ -403,7 +403,7 @@ Currently XDND, Motif and old KDE 1.x protocols are 
recognized."
 ;;;  XDND protocol.
 
 (declare-function x-change-window-property "xfns.c"
-                 (prop value &optional frame type format outer-P))
+                 (prop value &optional frame type format outer-P window-id))
 
 (defun x-dnd-init-xdnd-for-frame (frame)
   "Set the XdndAware property for FRAME to indicate that we do XDND."
@@ -487,7 +487,11 @@ FORMAT is 32 (not used).  MESSAGE is the data part of an 
XClientMessageEvent."
                (reply-action (car (rassoc (car action-type)
                                           x-dnd-xdnd-to-action)))
                (accept ;; 1 = accept, 0 = reject
-                (if (and reply-action action-type) 1 0))
+                (if (and reply-action action-type
+                          ;; Only allow drops on the text area of a
+                          ;; window.
+                          (not (posn-area (event-start event))))
+                     1 0))
                (list-to-send
                 (list (string-to-number
                        (frame-parameter frame 'outer-window-id))
@@ -495,8 +499,7 @@ FORMAT is 32 (not used).  MESSAGE is the data part of an 
XClientMessageEvent."
                       (x-dnd-get-drop-x-y frame window)
                       (x-dnd-get-drop-width-height
                        frame window (eq accept 1))
-                      (or reply-action 0)
-                      )))
+                      (or reply-action 0))))
           (x-send-client-message
            frame dnd-source frame "XdndStatus" 32 list-to-send)
            (dnd-handle-movement (event-start event))))
@@ -582,6 +585,88 @@ FORMAT is 32 (not used).  MESSAGE is the data part of an 
XClientMessageEvent."
        (reverse bytes)
       bytes)))
 
+(defun x-dnd-xm-unpack-targets-table-header (data)
+  "Decode the header of DATA, a Motif targets table.
+Return a list of the following fields with the given types:
+
+    Field name        Type
+  - BYTE_ORDER        BYTE
+  - PROTOCOL          BYTE
+  - TARGET_LIST_COUNT CARD16
+  - TOTAL_DATA_SIZE   CARD32"
+  (let* ((byte-order (aref data 0))
+         (protocol (aref data 1))
+         (target-list-count (x-dnd-get-motif-value
+                             data 2 2 byte-order))
+         (total-data-size (x-dnd-get-motif-value
+                           data 4 4 byte-order)))
+    (list byte-order protocol target-list-count
+          total-data-size)))
+
+(defun x-dnd-xm-read-single-rec (data i)
+  "Read a single rec from DATA, a Motif targets table.
+I is the offset into DATA to begin reading at.  Return a list
+of (CONSUMED NTARGETS TARGETS), where CONSUMED is the number of
+bytes read from DATA, NTARGETS is the total number of targets
+inside the current rec, and TARGETS is a vector of atoms
+describing the selection targets in the current rec."
+  (let* ((byte-order (aref data 0))
+         (n-targets (x-dnd-get-motif-value
+                     data i 2 byte-order))
+         (targets (make-vector n-targets nil))
+         (consumed 0))
+    (while (< consumed n-targets)
+      (aset targets consumed (x-dnd-get-motif-value
+                              data (+ i 2 (* consumed 4))
+                              4 byte-order))
+      (setq consumed (1+ consumed)))
+    (list (+ 2 (* consumed 4)) n-targets targets)))
+
+(defun x-dnd-xm-read-targets-table (frame)
+  "Read the Motif targets table on FRAME.
+Return a vector of vectors of numbers, which are the atoms of the
+available selection targets for each index into the selection
+table."
+  (let* ((drag-window (x-window-property "_MOTIF_DRAG_WINDOW"
+                                         frame "WINDOW" 0 nil t))
+         (targets-data (x-window-property "_MOTIF_DRAG_TARGETS"
+                                          frame "_MOTIF_DRAG_TARGETS"
+                                          drag-window nil t))
+         (header (x-dnd-xm-unpack-targets-table-header targets-data))
+         (vec (make-vector (nth 2 header) nil))
+         (current-byte 8)
+         (i 0))
+    (unless (stringp targets-data)
+      (error "Expected format 8, got %s" (type-of targets-data)))
+    (prog1 vec
+      (while (< i (nth 2 header))
+        (let ((rec (x-dnd-xm-read-single-rec targets-data
+                                             current-byte)))
+          (aset vec i (nth 2 rec))
+          (setq current-byte (+ current-byte (car rec)))
+          (setq i (1+ i))))
+      (unless (eq current-byte (nth 3 header))
+        (error "Targets table header says size is %d, but it is actually %d"
+               (nth 3 header) current-byte)))))
+
+(defun x-dnd-xm-read-targets (frame window selection)
+  "Read targets of SELECTION on FRAME from the targets table.
+WINDOW should be the drag-and-drop operation's initiator.
+Return a vector of atoms containing the selection targets."
+  (let* ((targets-table (x-dnd-xm-read-targets-table frame))
+         (initiator-info (x-window-property selection frame
+                                            "_MOTIF_DRAG_INITIATOR_INFO"
+                                            window nil nil))
+         (byte-order (aref initiator-info 0))
+         (idx (x-dnd-get-motif-value initiator-info
+                                     2 2 byte-order))
+         (vector (aref targets-table idx))
+         (i 0))
+    (prog1 vector
+      (while (< i (length vector))
+        (aset vector i
+              (intern (x-get-atom-name (aref vector i))))
+        (setq i (1+ i))))))
 
 (defvar x-dnd-motif-message-types
   '((0 . XmTOP_LEVEL_ENTER)
@@ -619,14 +704,12 @@ FORMAT is 32 (not used).  MESSAGE is the data part of an 
XClientMessageEvent."
                                 data 8 4 source-byteorder))
                    (selection-atom (x-dnd-get-motif-value
                                     data 12 4 source-byteorder))
-                   (atom-name (x-get-atom-name selection-atom))
-                   (types (when atom-name
-                            (x-get-selection-internal (intern atom-name)
-                                                      'TARGETS))))
+                    (atom-name (x-get-atom-name selection-atom))
+                   (types (x-dnd-xm-read-targets frame dnd-source
+                                                  atom-name)))
               (x-dnd-forget-drop frame)
               (when types (x-dnd-save-state window nil nil
-                                            types
-                                            dnd-source))))
+                                            types dnd-source))))
 
            ;; Can not forget drop here, LEAVE comes before DROP_START and
            ;; we need the state in DROP_START.
@@ -653,13 +736,16 @@ FORMAT is 32 (not used).  MESSAGE is the data part of an 
XClientMessageEvent."
                    (reply-action (car (rassoc (car action-type)
                                               x-dnd-motif-to-action)))
                    (reply-flags
-                    (x-dnd-motif-value-to-list
-                     (if reply-action
-                         (+ reply-action
-                            ?\x30      ; 30:  valid drop site
-                            ?\x700)    ; 700: can do copy, move or link
-                       ?\x30)          ; 30:  drop site, but noop.
-                     2 my-byteorder))
+                     (if (posn-area (event-start event))
+                         (x-dnd-motif-value-to-list ?\x20 ; 20: invalid drop 
site
+                                                    2 my-byteorder)
+                      (x-dnd-motif-value-to-list
+                       (if reply-action
+                           (+ reply-action
+                              ?\x30                      ; 30:  valid drop site
+                              ?\x700)                    ; 700: can do copy, 
move or link
+                         ?\x30)                          ; 30:  drop site, but 
noop.
+                       2 my-byteorder)))
                    (reply (append
                            (list
                             (+ ?\x80   ; 0x80 indicates a reply.
@@ -691,13 +777,16 @@ FORMAT is 32 (not used).  MESSAGE is the data part of an 
XClientMessageEvent."
                    (reply-action (car (rassoc (car action-type)
                                               x-dnd-motif-to-action)))
                    (reply-flags
-                    (x-dnd-motif-value-to-list
-                     (if reply-action
-                         (+ reply-action
-                            ?\x30      ; 30:  valid drop site
-                            ?\x700)    ; 700: can do copy, move or link
-                       ?\x30)          ; 30:  drop site, but noop
-                     2 my-byteorder))
+                    (if (posn-area (event-start event))
+                         (x-dnd-motif-value-to-list ?\x20 ; 20: invalid drop 
site
+                                                    2 my-byteorder)
+                      (x-dnd-motif-value-to-list
+                       (if reply-action
+                           (+ reply-action
+                              ?\x30   ; 30:  valid drop site
+                              ?\x700) ; 700: can do copy, move or link
+                         ?\x30)       ; 30:  drop site, but noop.
+                       2 my-byteorder)))
                    (reply (append
                            (list
                             (+ ?\x80   ; 0x80 indicates a reply.
@@ -722,59 +811,74 @@ FORMAT is 32 (not used).  MESSAGE is the data part of an 
XClientMessageEvent."
                    (selection-atom (x-dnd-get-motif-value
                                     data 12 4 source-byteorder))
                    (atom-name (x-get-atom-name selection-atom))
-                   (dnd-source (x-dnd-get-motif-value
-                                data 16 4 source-byteorder))
-                   (action-type (x-dnd-maybe-call-test-function
-                                 window
-                                 source-action))
-                   (reply-action (car (rassoc (car action-type)
-                                              x-dnd-motif-to-action)))
-                   (reply-flags
-                    (x-dnd-motif-value-to-list
-                     (if reply-action
-                         (+ reply-action
-                            ?\x30      ; 30:  valid drop site
-                            ?\x700)    ; 700: can do copy, move or link
-                       (+ ?\x30                ; 30:  drop site, but noop.
-                          ?\x200))     ; 200: drop cancel.
-                     2 my-byteorder))
-                   (reply (append
-                           (list
-                            (+ ?\x80   ; 0x80 indicates a reply.
-                               5)      ; DROP_START.
-                            my-byteorder)
-                           reply-flags
-                           x
-                           y))
-                   (timestamp (x-dnd-get-motif-value
-                               data 4 4 source-byteorder))
-                   action)
-
-              (x-send-client-message frame
-                                     dnd-source
-                                     frame
-                                     "_MOTIF_DRAG_AND_DROP_MESSAGE"
-                                     8
-                                     reply)
-              (setq action
-                    (when (and reply-action atom-name)
-                      (let* ((value (x-get-selection-internal
-                                     (intern atom-name)
-                                     (intern (x-dnd-current-type window)))))
-                        (when value
-                          (condition-case info
-                              (x-dnd-drop-data event frame window value
-                                               (x-dnd-current-type window))
-                            (error
-                             (message "Error: %s" info)
-                             nil))))))
-              (x-get-selection-internal
-               (intern atom-name)
-               (if action 'XmTRANSFER_SUCCESS 'XmTRANSFER_FAILURE)
-               timestamp)
-              (x-dnd-forget-drop frame)))
-
-            (t (message "Unknown Motif drag-and-drop message: %s" (logand 
(aref data 0) #x3f)))))))
+                    (dnd-source (x-dnd-get-motif-value
+                                data 16 4 source-byteorder)))
+
+               ;; This might be a drop from a program that doesn't use
+               ;; the Motif drag protocol.  Compute all the necessary
+               ;; state here if that is true.
+               (unless (and (x-dnd-get-state-for-frame frame)
+                            (aref (x-dnd-get-state-for-frame frame) 2))
+                 (x-dnd-forget-drop frame)
+                 (let ((types (x-dnd-xm-read-targets frame dnd-source
+                                                     atom-name)))
+                   (x-dnd-save-state window nil nil types dnd-source)))
+
+               (let* ((action-type (x-dnd-maybe-call-test-function
+                                   window
+                                   source-action))
+                     (reply-action (and (not (posn-area (event-start event)))
+                                         (car (rassoc (car action-type)
+                                                     x-dnd-motif-to-action))))
+                     (reply-flags
+                      (x-dnd-motif-value-to-list
+                        (if (posn-area (event-start event))
+                            (+ ?\x20     ; 20: invalid drop site
+                               ?\x200)   ; 200: drop cancel
+                         (if reply-action
+                             (+ reply-action
+                                ?\x30   ; 30:  valid drop site
+                                ?\x700) ; 700: can do copy, move or link
+                           (+ ?\x30     ; 30:  drop site, but noop.
+                              ?\x200))) ; 200: drop cancel.
+                       2 my-byteorder))
+                     (reply (append
+                             (list
+                              (+ ?\x80 ; 0x80 indicates a reply.
+                                 5)    ; DROP_START.
+                              my-byteorder)
+                             reply-flags
+                             x y))
+                     (timestamp (x-dnd-get-motif-value
+                                 data 4 4 source-byteorder))
+                     action)
+
+                (x-send-client-message frame
+                                       dnd-source
+                                       frame
+                                       "_MOTIF_DRAG_AND_DROP_MESSAGE"
+                                       8
+                                       reply)
+                (setq action
+                      (when (and reply-action atom-name)
+                        (let* ((value (x-get-selection-internal
+                                       (intern atom-name)
+                                       (intern (x-dnd-current-type window)))))
+                          (when value
+                            (condition-case info
+                                (x-dnd-drop-data event frame window value
+                                                 (x-dnd-current-type window))
+                              (error
+                               (message "Error: %s" info)
+                               nil))))))
+                (x-get-selection-internal
+                 (intern atom-name)
+                 (if action 'XmTRANSFER_SUCCESS 'XmTRANSFER_FAILURE)
+                 timestamp)
+                (x-dnd-forget-drop frame))))
+
+            (t (message "Unknown Motif drag-and-drop message: %s"
+                        (logand (aref data 0) #x3f)))))))
 
 
 ;;;
@@ -783,8 +887,8 @@ FORMAT is 32 (not used).  MESSAGE is the data part of an 
XClientMessageEvent."
 
 ;;; Handling drops.
 
-(defun x-dnd-handle-unsupported-drop (targets _x _y action _window-id _frame)
-  "Return non-nil if the drop described by TARGETS and ACTION should not 
proceeed."
+(defun x-dnd-handle-unsupported-drop (targets _x _y action _window-id _frame 
_time)
+  "Return non-nil if the drop described by TARGETS and ACTION should not 
proceed."
   (not (and (or (eq action 'XdndActionCopy)
                 (eq action 'XdndActionMove))
             (or (member "STRING" targets)
@@ -792,6 +896,23 @@ FORMAT is 32 (not used).  MESSAGE is the data part of an 
XClientMessageEvent."
                 (member "COMPOUND_TEXT" targets)
                 (member "TEXT" targets)))))
 
+(defvar x-dnd-targets-list)
+(defvar x-dnd-native-test-function)
+
+(defun x-dnd-handle-native-drop (pos action)
+  "Compute the action for a drop at POS.
+Return the appropriate drag-and-drop action for a local drop at POS.
+ACTION is the action given to `x-begin-drag'."
+  (let ((state (funcall x-dnd-test-function
+                        (posn-window pos)
+                        (cdr (assoc (symbol-name action)
+                                    x-dnd-xdnd-to-action))
+                        (apply #'vector x-dnd-targets-list))))
+    (when state
+      (intern (car (rassq (car state) x-dnd-xdnd-to-action))))))
+
+(setq x-dnd-native-test-function #'x-dnd-handle-native-drop)
+
 (provide 'x-dnd)
 
 ;;; x-dnd.el ends here
diff --git a/lisp/xwidget.el b/lisp/xwidget.el
index e50324ac47..88bc8ff6c5 100644
--- a/lisp/xwidget.el
+++ b/lisp/xwidget.el
@@ -36,7 +36,7 @@
 (require 'format-spec)
 
 (declare-function make-xwidget "xwidget.c"
-                  (type title width height arguments &optional buffer related))
+                  (type title width height &optional arguments buffer related))
 (declare-function xwidget-buffer "xwidget.c" (xwidget))
 (declare-function set-xwidget-buffer "xwidget.c" (xwidget buffer))
 (declare-function xwidget-size-request "xwidget.c" (xwidget))
@@ -451,7 +451,7 @@ XWIDGET instance, XWIDGET-EVENT-TYPE depends on the 
originating xwidget."
                          xwidget-webkit--progress-update-timer
                          (run-at-time 0.5 0.5 
#'xwidget-webkit--update-progress-timer-function
                                       xwidget)))))
-             ;; This funciton will be called multi times, so only
+             ;; This function will be called multi times, so only
              ;; change buffer name when the load actually completes
              ;; this can limit buffer-name flicker in mode-line.
              (when (or (string-equal (nth 3 last-input-event)
diff --git a/m4/manywarnings.m4 b/m4/manywarnings.m4
index 253393e51b..f4b5853f02 100644
--- a/m4/manywarnings.m4
+++ b/m4/manywarnings.m4
@@ -167,11 +167,13 @@ AC_DEFUN([gl_MANYWARN_ALL_GCC(C)],
   # them here so that the above 'comm' command doesn't report a false match.
   gl_AS_VAR_APPEND([$1], [' -Warray-bounds=2'])
   gl_AS_VAR_APPEND([$1], [' -Wattribute-alias=2'])
+  gl_AS_VAR_APPEND([$1], [' -Wbidi-chars=any,ucn'])
   gl_AS_VAR_APPEND([$1], [' -Wformat-overflow=2'])
   gl_AS_VAR_APPEND([$1], [' -Wformat=2'])
   gl_AS_VAR_APPEND([$1], [' -Wformat-truncation=2'])
   gl_AS_VAR_APPEND([$1], [' -Wimplicit-fallthrough=5'])
   gl_AS_VAR_APPEND([$1], [' -Wshift-overflow=2'])
+  gl_AS_VAR_APPEND([$1], [' -Wuse-after-free=3'])
   gl_AS_VAR_APPEND([$1], [' -Wunused-const-variable=2'])
   gl_AS_VAR_APPEND([$1], [' -Wvla-larger-than=4031'])
 
diff --git a/nextstep/Makefile.in b/nextstep/Makefile.in
index 92d7f28fe6..9c7059f2c0 100644
--- a/nextstep/Makefile.in
+++ b/nextstep/Makefile.in
@@ -47,7 +47,9 @@ ns_check_file = @ns_appdir@/@ns_check_file@
 
 all: ${ns_appdir} ${ns_appbindir}/Emacs ${ns_applibexecdir}/Emacs.pdmp
 
-${ns_check_file} ${ns_appdir}: ${srcdir}/${ns_appsrc} ${ns_appsrc}
+${ns_check_file}: ${ns_appdir}
+
+${ns_appdir}: ${srcdir}/${ns_appsrc} ${ns_appsrc}
        rm -rf ${ns_appdir}
        ${MKDIR_P} ${ns_appdir}
        ( cd ${srcdir}/${ns_appsrc} ; tar cfh - . ) | \
diff --git a/src/alloc.c b/src/alloc.c
index 3c622d05ff..14c3a4cb8d 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -1036,9 +1036,12 @@ lisp_free (void *block)
     return;
 
   MALLOC_BLOCK_INPUT;
+#ifndef GC_MALLOC_CHECK
+  struct mem_node *m = mem_find (block);
+#endif
   free (block);
 #ifndef GC_MALLOC_CHECK
-  mem_delete (mem_find (block));
+  mem_delete (m);
 #endif
   MALLOC_UNBLOCK_INPUT;
 }
@@ -6197,6 +6200,7 @@ garbage_collect (void)
 
   mark_pinned_objects ();
   mark_pinned_symbols ();
+  mark_lread ();
   mark_terminals ();
   mark_kboards ();
   mark_threads ();
@@ -6319,7 +6323,7 @@ where each entry has the form (NAME SIZE USED FREE), 
where:
   to return them to the OS).
 
 However, if there was overflow in pure space, and Emacs was dumped
-using the 'unexec' method, `garbage-collect' returns nil, because
+using the \"unexec\" method, `garbage-collect' returns nil, because
 real GC can't be done.
 
 Note that calling this function does not guarantee that absolutely all
diff --git a/src/atimer.c b/src/atimer.c
index 1c6c881fc0..18301120ff 100644
--- a/src/atimer.c
+++ b/src/atimer.c
@@ -18,6 +18,10 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
+#ifdef WINDOWSNT
+#define raise(s) w32_raise(s)
+#endif
+
 #include "lisp.h"
 #include "keyboard.h"
 #include "syssignal.h"
@@ -297,11 +301,6 @@ set_alarm (void)
 {
   if (atimers)
     {
-#ifdef HAVE_SETITIMER
-      struct itimerval it;
-#endif
-      struct timespec now, interval;
-
 #ifdef HAVE_ITIMERSPEC
       if (0 <= timerfd || alarm_timer_ok)
        {
@@ -337,20 +336,24 @@ set_alarm (void)
        }
 #endif
 
-      /* Determine interval till the next timer is ripe.
-        Don't set the interval to 0; this disables the timer.  */
-      now = current_timespec ();
-      interval = (timespec_cmp (atimers->expiration, now) <= 0
-                 ? make_timespec (0, 1000 * 1000)
-                 : timespec_sub (atimers->expiration, now));
+      /* Determine interval till the next timer is ripe.  */
+      struct timespec now = current_timespec ();
+      if (timespec_cmp (atimers->expiration, now) <= 0)
+       {
+         /* Timer is (over)due -- just trigger the signal right way.  */
+         raise (SIGALRM);
+       }
+      else
+       {
+         struct timespec interval = timespec_sub (atimers->expiration, now);
 
 #ifdef HAVE_SETITIMER
-
-      memset (&it, 0, sizeof it);
-      it.it_value = make_timeval (interval);
-      setitimer (ITIMER_REAL, &it, 0);
-#endif /* not HAVE_SETITIMER */
-      alarm (max (interval.tv_sec, 1));
+         struct itimerval it = {.it_value = make_timeval (interval)};
+         setitimer (ITIMER_REAL, &it, 0);
+#else
+         alarm (max (interval.tv_sec, 1));
+#endif
+       }
     }
 }
 
diff --git a/src/buffer.c b/src/buffer.c
index f8a7a4f510..a0761f5b59 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1218,7 +1218,7 @@ is the default binding of the variable.  */)
 {
   register Lisp_Object result = buffer_local_value (variable, buffer);
 
-  if (EQ (result, Qunbound))
+  if (BASE_EQ (result, Qunbound))
     xsignal1 (Qvoid_variable, variable);
 
   return result;
@@ -1313,7 +1313,7 @@ buffer_lisp_local_variables (struct buffer *buf, bool 
clone)
       if (buf != current_buffer)
        val = XCDR (elt);
 
-      result = Fcons (!clone && EQ (val, Qunbound)
+      result = Fcons (!clone && BASE_EQ (val, Qunbound)
                      ? XCAR (elt)
                      : Fcons (XCAR (elt), val),
                      result);
@@ -1336,7 +1336,7 @@ buffer_local_variables_1 (struct buffer *buf, int offset, 
Lisp_Object sym)
     {
       sym = NILP (sym) ? PER_BUFFER_SYMBOL (offset) : sym;
       Lisp_Object val = per_buffer_value (buf, offset);
-      return EQ (val, Qunbound) ? sym : Fcons (sym, val);
+      return BASE_EQ (val, Qunbound) ? sym : Fcons (sym, val);
     }
   return Qnil;
 }
@@ -1376,12 +1376,23 @@ No argument or nil as argument means use current buffer 
as BUFFER.  */)
 
 DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p,
        0, 1, 0,
-       doc: /* Return t if BUFFER was modified since its file was last read or 
saved.
-No argument or nil as argument means use current buffer as BUFFER.  */)
+       doc: /* Return non-nil if BUFFER was modified since its file was last 
read or saved.
+No argument or nil as argument means use current buffer as BUFFER.
+
+If BUFFER was autosaved since it was last modified, this function
+returns the symbol `autosaved'.  */)
   (Lisp_Object buffer)
 {
   struct buffer *buf = decode_buffer (buffer);
-  return BUF_SAVE_MODIFF (buf) < BUF_MODIFF (buf) ? Qt : Qnil;
+  if (BUF_SAVE_MODIFF (buf) < BUF_MODIFF (buf))
+    {
+      if (BUF_AUTOSAVE_MODIFF (buf) == BUF_MODIFF (buf))
+       return Qautosaved;
+      else
+       return Qt;
+    }
+  else
+    return Qnil;
 }
 
 DEFUN ("force-mode-line-update", Fforce_mode_line_update,
@@ -1436,6 +1447,11 @@ and `buffer-file-truename' are non-nil.  */)
 DEFUN ("restore-buffer-modified-p", Frestore_buffer_modified_p,
        Srestore_buffer_modified_p, 1, 1, 0,
        doc: /* Like `set-buffer-modified-p', but doesn't redisplay buffer's 
mode line.
+A nil FLAG means to mark the buffer as unmodified.  A non-nil FLAG
+means mark the buffer as modified.  A special value of `autosaved'
+will mark the buffer as modified and also as autosaved since it was
+last modified.
+
 This function also locks or unlocks the file visited by the buffer,
 if both `buffer-file-truename' and `buffer-file-name' are non-nil.
 
@@ -1475,16 +1491,19 @@ state of the current buffer.  Use with care.  */)
      recent-auto-save-p from t to nil.
      Vice versa, if FLAG is non-nil and SAVE_MODIFF>=auto_save_modified
      we risk changing recent-auto-save-p from nil to t.  */
-  SAVE_MODIFF = (NILP (flag)
-                /* FIXME: This unavoidably sets recent-auto-save-p to nil.  */
-                ? MODIFF
-                /* Let's try to preserve recent-auto-save-p.  */
-                : SAVE_MODIFF < MODIFF ? SAVE_MODIFF
-                /* If SAVE_MODIFF == auto_save_modified == MODIFF,
-                   we can either decrease SAVE_MODIFF and auto_save_modified
-                   or increase MODIFF.  */
-                : modiff_incr (&MODIFF));
-
+  if (NILP (flag))
+    /* This unavoidably sets recent-auto-save-p to nil.  */
+    SAVE_MODIFF = MODIFF;
+  else
+    {
+      /* If SAVE_MODIFF == auto_save_modified == MODIFF, we can either
+        decrease SAVE_MODIFF and auto_save_modified or increase
+        MODIFF.  */
+      if (SAVE_MODIFF >= MODIFF)
+       SAVE_MODIFF = modiff_incr (&MODIFF);
+      if (EQ (flag, Qautosaved))
+       BUF_AUTOSAVE_MODIFF (b) = MODIFF;
+    }
   return flag;
 }
 
@@ -1499,6 +1518,18 @@ use current buffer as BUFFER.  */)
   return modiff_to_integer (BUF_MODIFF (decode_buffer (buffer)));
 }
 
+DEFUN ("internal--set-buffer-modified-tick",
+       Finternal__set_buffer_modified_tick, 
Sinternal__set_buffer_modified_tick,
+       1, 2, 0,
+       doc: /* Set BUFFER's tick counter to TICK.
+No argument or nil as argument means use current buffer as BUFFER.  */)
+  (Lisp_Object tick, Lisp_Object buffer)
+{
+  CHECK_FIXNUM (tick);
+  BUF_MODIFF (decode_buffer (buffer)) = XFIXNUM (tick);
+  return Qnil;
+}
+
 DEFUN ("buffer-chars-modified-tick", Fbuffer_chars_modified_tick,
        Sbuffer_chars_modified_tick, 0, 1, 0,
        doc: /* Return BUFFER's character-change tick counter.
@@ -1634,16 +1665,7 @@ exists, return the buffer `*scratch*' (creating it if 
necessary).  */)
   if (!NILP (notsogood))
     return notsogood;
   else
-    {
-      AUTO_STRING (scratch, "*scratch*");
-      buf = Fget_buffer (scratch);
-      if (NILP (buf))
-       {
-         buf = Fget_buffer_create (scratch, Qnil);
-         Fset_buffer_major_mode (buf);
-       }
-      return buf;
-    }
+    return safe_call (1, Qget_scratch_buffer_create);
 }
 
 /* The following function is a safe variant of Fother_buffer: It doesn't
@@ -1659,15 +1681,7 @@ other_buffer_safely (Lisp_Object buffer)
     if (candidate_buffer (buf, buffer))
       return buf;
 
-  AUTO_STRING (scratch, "*scratch*");
-  buf = Fget_buffer (scratch);
-  if (NILP (buf))
-    {
-      buf = Fget_buffer_create (scratch, Qnil);
-      Fset_buffer_major_mode (buf);
-    }
-
-  return buf;
+  return safe_call (1, Qget_scratch_buffer_create);
 }
 
 DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo,
@@ -4093,7 +4107,7 @@ buffer.  */)
   n_end = marker_position (OVERLAY_END (overlay));
 
   /* If the overlay has changed buffers, do a thorough redisplay.  */
-  if (!EQ (buffer, obuffer))
+  if (!BASE_EQ (buffer, obuffer))
     {
       /* Redisplay where the overlay was.  */
       if (ob)
@@ -5552,6 +5566,7 @@ syms_of_buffer (void)
   DEFSYM (Qbefore_change_functions, "before-change-functions");
   DEFSYM (Qafter_change_functions, "after-change-functions");
   DEFSYM (Qkill_buffer_query_functions, "kill-buffer-query-functions");
+  DEFSYM (Qget_scratch_buffer_create, "get-scratch-buffer-create");
 
   DEFSYM (Qvertical_scroll_bar, "vertical-scroll-bar");
   Fput (Qvertical_scroll_bar, Qchoice, list4 (Qnil, Qt, Qleft, Qright));
@@ -5583,8 +5598,11 @@ the mode line appears at the bottom.  */);
                     &BVAR (current_buffer, header_line_format),
                     Qnil,
                     doc: /* Analogous to `mode-line-format', but controls the 
header line.
-The header line appears, optionally, at the top of a window;
-the mode line appears at the bottom.  */);
+The header line appears, optionally, at the top of a window; the mode
+line appears at the bottom.
+
+Also see `header-line-indent-mode' if `display-line-number-mode' is
+used.  */);
 
   DEFVAR_PER_BUFFER ("mode-line-format", &BVAR (current_buffer, 
mode_line_format),
                     Qnil,
@@ -6418,6 +6436,7 @@ will run for `clone-indirect-buffer' calls as well.  */);
   defsubr (&Sforce_mode_line_update);
   defsubr (&Sset_buffer_modified_p);
   defsubr (&Sbuffer_modified_tick);
+  defsubr (&Sinternal__set_buffer_modified_tick);
   defsubr (&Sbuffer_chars_modified_tick);
   defsubr (&Srename_buffer);
   defsubr (&Sother_buffer);
@@ -6452,5 +6471,7 @@ will run for `clone-indirect-buffer' calls as well.  */);
   defsubr (&Soverlay_put);
   defsubr (&Srestore_buffer_modified_p);
 
+  DEFSYM (Qautosaved, "autosaved");
+
   Fput (intern_c_string ("erase-buffer"), Qdisabled, Qt);
 }
diff --git a/src/bytecode.c b/src/bytecode.c
index 74b7d16aff..fa068e1ec6 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -627,7 +627,7 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
            Lisp_Object v1 = vectorp[op], v2;
            if (!SYMBOLP (v1)
                || XSYMBOL (v1)->u.s.redirect != SYMBOL_PLAINVAL
-               || (v2 = SYMBOL_VAL (XSYMBOL (v1)), EQ (v2, Qunbound)))
+               || (v2 = SYMBOL_VAL (XSYMBOL (v1)), BASE_EQ (v2, Qunbound)))
              v2 = Fsymbol_value (v1);
            PUSH (v2);
            NEXT;
@@ -694,7 +694,7 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
 
            /* Inline the most common case.  */
            if (SYMBOLP (sym)
-               && !EQ (val, Qunbound)
+               && !BASE_EQ (val, Qunbound)
                && XSYMBOL (sym)->u.s.redirect == SYMBOL_PLAINVAL
                && !SYMBOL_TRAPPED_WRITE_P (sym))
              SET_SYMBOL_VAL (XSYMBOL (sym), val);
@@ -1209,7 +1209,7 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
            Lisp_Object v2 = POP;
            Lisp_Object v1 = TOP;
            if (FIXNUMP (v1) && FIXNUMP (v2))
-             TOP = BASE_EQ(v1, v2) ? Qt : Qnil;
+             TOP = BASE_EQ (v1, v2) ? Qt : Qnil;
            else
              TOP = arithcompare (v1, v2, ARITH_EQUAL);
            NEXT;
diff --git a/src/callint.c b/src/callint.c
index 92bfaf8d39..8283c61da6 100644
--- a/src/callint.c
+++ b/src/callint.c
@@ -170,7 +170,7 @@ check_mark (bool for_region)
    of VALUES to do its job.  */
 
 static void
-fix_command (Lisp_Object input, Lisp_Object values)
+fix_command (Lisp_Object input, Lisp_Object function, Lisp_Object values)
 {
   /* FIXME: Instead of this ugly hack, we should provide a way for an
      interactive spec to return an expression/function that will re-build the
@@ -230,6 +230,37 @@ fix_command (Lisp_Object input, Lisp_Object values)
            }
        }
     }
+
+  /* If the list contains a bunch of trailing nil values, and they are
+     optional, remove them from the list.  This makes navigating the
+     history less confusing, since it doesn't contain a lot of
+     parameters that aren't used.  */
+  if (CONSP (values))
+    {
+      Lisp_Object arity = Ffunc_arity (function);
+      /* We don't want to do this simplification if we have an &rest
+        function, because (cl-defun foo (a &optional (b 'zot)) ..)
+        etc.  */
+      if (FIXNUMP (XCAR (arity)) && FIXNUMP (XCDR (arity)))
+       {
+         Lisp_Object final = Qnil;
+         ptrdiff_t final_i = 0, i = 0;
+         for (Lisp_Object tail = values;
+              CONSP (tail);
+              tail = XCDR (tail), ++i)
+           {
+             if (!NILP (XCAR (tail)))
+               {
+                 final = tail;
+                 final_i = i;
+               }
+           }
+
+         /* Chop the trailing optional values.  */
+         if (final_i > 0 && final_i >= XFIXNUM (XCAR (arity)) - 1)
+           XSETCDR (final,  Qnil);
+       }
+    }
 }
 
 /* Helper function to call `read-file-name' from C.  */
@@ -340,7 +371,7 @@ invoke it (via an `interactive' spec that contains, for 
instance, an
             Make a copy of the list of values, for the command history,
             and turn them into things we can eval.  */
          Lisp_Object values = quotify_args (Fcopy_sequence (specs));
-         fix_command (input, values);
+         fix_command (input, function, values);
           call4 (intern ("add-to-history"), intern ("command-history"),
                  Fcons (function, values), Qnil, Qt);
        }
diff --git a/src/ccl.c b/src/ccl.c
index a3121f7278..1a4f73500a 100644
--- a/src/ccl.c
+++ b/src/ccl.c
@@ -35,6 +35,11 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include "coding.h"
 #include "keyboard.h"
 
+/* Avoid GCC 12 bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105784>.  */
+#if GNUC_PREREQ (12, 0, 0)
+# pragma GCC diagnostic ignored "-Wanalyzer-use-of-uninitialized-value"
+#endif
+
 /* Table of registered CCL programs.  Each element is a vector of
    NAME, CCL_PROG, RESOLVEDP, and UPDATEDP, where NAME (symbol) is the
    name of the program, CCL_PROG (vector) is the compiled code of the
diff --git a/src/coding.c b/src/coding.c
index 2bed293d57..aa32efc3f6 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -6528,7 +6528,7 @@ detect_coding (struct coding_system *coding)
   if (EQ (CODING_ATTR_TYPE (CODING_ID_ATTRS (coding->id)), Qundecided))
     {
       int c, i;
-      struct coding_detection_info detect_info;
+      struct coding_detection_info detect_info = {0};
       bool null_byte_found = 0, eight_bit_found = 0;
       bool inhibit_nbd = inhibit_flag (coding->spec.undecided.inhibit_nbd,
                                       inhibit_null_byte_detection);
@@ -6537,7 +6537,6 @@ detect_coding (struct coding_system *coding)
       bool prefer_utf_8 = coding->spec.undecided.prefer_utf_8;
 
       coding->head_ascii = 0;
-      detect_info.checked = detect_info.found = detect_info.rejected = 0;
       for (src = coding->source; src < src_end; src++)
        {
          c = *src;
@@ -6712,12 +6711,8 @@ detect_coding (struct coding_system *coding)
   else if (XFIXNUM (CODING_ATTR_CATEGORY (CODING_ID_ATTRS (coding->id)))
           == coding_category_utf_8_auto)
     {
-      Lisp_Object coding_systems;
-      struct coding_detection_info detect_info;
-
-      coding_systems
+      Lisp_Object coding_systems
        = AREF (CODING_ID_ATTRS (coding->id), coding_attr_utf_bom);
-      detect_info.found = detect_info.rejected = 0;
       if (check_ascii (coding) == coding->src_bytes)
        {
          if (CONSP (coding_systems))
@@ -6725,6 +6720,7 @@ detect_coding (struct coding_system *coding)
        }
       else
        {
+         struct coding_detection_info detect_info = {0};
          if (CONSP (coding_systems)
              && detect_coding_utf_8 (coding, &detect_info))
            {
@@ -6738,20 +6734,19 @@ detect_coding (struct coding_system *coding)
   else if (XFIXNUM (CODING_ATTR_CATEGORY (CODING_ID_ATTRS (coding->id)))
           == coding_category_utf_16_auto)
     {
-      Lisp_Object coding_systems;
-      struct coding_detection_info detect_info;
-
-      coding_systems
+      Lisp_Object coding_systems
        = AREF (CODING_ID_ATTRS (coding->id), coding_attr_utf_bom);
-      detect_info.found = detect_info.rejected = 0;
       coding->head_ascii = 0;
-      if (CONSP (coding_systems)
-         && detect_coding_utf_16 (coding, &detect_info))
+      if (CONSP (coding_systems))
        {
-         if (detect_info.found & CATEGORY_MASK_UTF_16_LE)
-           found = XCAR (coding_systems);
-         else if (detect_info.found & CATEGORY_MASK_UTF_16_BE)
-           found = XCDR (coding_systems);
+         struct coding_detection_info detect_info = {0};
+         if (detect_coding_utf_16 (coding, &detect_info))
+           {
+             if (detect_info.found & CATEGORY_MASK_UTF_16_LE)
+               found = XCAR (coding_systems);
+             else if (detect_info.found & CATEGORY_MASK_UTF_16_BE)
+               found = XCDR (coding_systems);
+           }
        }
     }
 
@@ -8639,7 +8634,7 @@ detect_coding_system (const unsigned char *src,
   Lisp_Object val = Qnil;
   struct coding_system coding;
   ptrdiff_t id;
-  struct coding_detection_info detect_info;
+  struct coding_detection_info detect_info = {0};
   enum coding_category base_category;
   bool null_byte_found = 0, eight_bit_found = 0;
 
@@ -8658,8 +8653,6 @@ detect_coding_system (const unsigned char *src,
   coding.mode |= CODING_MODE_LAST_BLOCK;
   coding.head_ascii = 0;
 
-  detect_info.checked = detect_info.found = detect_info.rejected = 0;
-
   /* At first, detect text-format if necessary.  */
   base_category = XFIXNUM (CODING_ATTR_CATEGORY (attrs));
   if (base_category == coding_category_undecided)
diff --git a/src/comp.c b/src/comp.c
index 66a7ab789a..c230536ac5 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -756,12 +756,12 @@ comp_hash_source_file (Lisp_Object filename)
 
 DEFUN ("comp--subr-signature", Fcomp__subr_signature,
        Scomp__subr_signature, 1, 1, 0,
-       doc: /* Support function to 'hash_native_abi'.
+       doc: /* Support function to hash_native_abi.
 For internal use.  */)
   (Lisp_Object subr)
 {
   return concat2 (Fsubr_name (subr),
-                 Fprin1_to_string (Fsubr_arity (subr), Qnil));
+                 Fprin1_to_string (Fsubr_arity (subr), Qnil, Qnil));
 }
 
 /* Produce a key hashing Vcomp_subr_list.  */
@@ -1707,7 +1707,7 @@ static gcc_jit_lvalue *
 emit_lisp_obj_reloc_lval (Lisp_Object obj)
 {
   emit_comment (format_string ("l-value for lisp obj: %s",
-                              SSDATA (Fprin1_to_string (obj, Qnil))));
+                              SSDATA (Fprin1_to_string (obj, Qnil, Qnil))));
 
   imm_reloc_t reloc = obj_to_reloc (obj);
   return gcc_jit_context_new_array_access (comp.ctxt,
@@ -1720,7 +1720,7 @@ static gcc_jit_rvalue *
 emit_lisp_obj_rval (Lisp_Object obj)
 {
   emit_comment (format_string ("const lisp obj: %s",
-                              SSDATA (Fprin1_to_string (obj, Qnil))));
+                              SSDATA (Fprin1_to_string (obj, Qnil, Qnil))));
 
   if (NILP (obj))
     {
@@ -1968,7 +1968,7 @@ emit_mvar_rval (Lisp_Object mvar)
            SSDATA (
              Fprin1_to_string (
                NILP (func) ? value : CALL1I (comp-func-c-name, func),
-               Qnil)));
+               Qnil, Qnil)));
        }
       if (FIXNUMP (value))
        {
@@ -2471,7 +2471,7 @@ emit_limple_insn (Lisp_Object insn)
   else if (EQ (op, Qsetimm))
     {
       /* Ex: (setimm #s(comp-mvar 9 1 t 3 nil) a).  */
-      emit_comment (SSDATA (Fprin1_to_string (arg[1], Qnil)));
+      emit_comment (SSDATA (Fprin1_to_string (arg[1], Qnil, Qnil)));
       imm_reloc_t reloc = obj_to_reloc (arg[1]);
       emit_frame_assignment (
        arg[0],
@@ -2647,7 +2647,7 @@ emit_static_object (const char *name, Lisp_Object obj)
   specbind (intern_c_string ("print-quoted"), Qt);
   specbind (intern_c_string ("print-gensym"), Qt);
   specbind (intern_c_string ("print-circle"), Qt);
-  Lisp_Object str = Fprin1_to_string (obj, Qnil);
+  Lisp_Object str = Fprin1_to_string (obj, Qnil, Qnil);
   unbind_to (count, Qnil);
 
   ptrdiff_t len = SBYTES (str);
@@ -4262,7 +4262,7 @@ compile_function (Lisp_Object func)
     {
       Lisp_Object block_name = HASH_KEY (ht, i);
       if (!EQ (block_name, Qentry)
-         && !EQ (block_name, Qunbound))
+         && !BASE_EQ (block_name, Qunbound))
        declare_block (block_name);
     }
 
@@ -4275,7 +4275,7 @@ compile_function (Lisp_Object func)
   for (ptrdiff_t i = 0; i < HASH_TABLE_SIZE (ht); i++)
     {
       Lisp_Object block_name = HASH_KEY (ht, i);
-      if (!EQ (block_name, Qunbound))
+      if (!BASE_EQ (block_name, Qunbound))
        {
          Lisp_Object block = HASH_VALUE (ht, i);
          Lisp_Object insns = CALL1I (comp-block-insns, block);
@@ -4890,12 +4890,12 @@ DEFUN ("comp--compile-ctxt-to-file", 
Fcomp__compile_ctxt_to_file,
   struct Lisp_Hash_Table *func_h =
     XHASH_TABLE (CALL1I (comp-ctxt-funcs-h, Vcomp_ctxt));
   for (ptrdiff_t i = 0; i < HASH_TABLE_SIZE (func_h); i++)
-    if (!EQ (HASH_VALUE (func_h, i), Qunbound))
+    if (!BASE_EQ (HASH_VALUE (func_h, i), Qunbound))
       declare_function (HASH_VALUE (func_h, i));
   /* Compile all functions. Can't be done before because the
      relocation structs has to be already defined.  */
   for (ptrdiff_t i = 0; i < HASH_TABLE_SIZE (func_h); i++)
-    if (!EQ (HASH_VALUE (func_h, i), Qunbound))
+    if (!BASE_EQ (HASH_VALUE (func_h, i), Qunbound))
       compile_function (HASH_VALUE (func_h, i));
 
   /* Work around bug#46495 (GCC PR99126). */
@@ -5342,7 +5342,7 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, 
bool loading_dump,
         are necessary exclusively during the first load.  Once these
         are collected we don't have to maintain them in the heap
         forever.  */
-      Lisp_Object volatile data_ephemeral_vec;
+      Lisp_Object volatile data_ephemeral_vec = Qnil;
       /* In case another load of the same CU is active on the stack
         all ephemeral data is hold by that frame.  Re-writing
         'data_ephemeral_vec' would be not only a waste of cycles but
diff --git a/src/composite.c b/src/composite.c
index c2ade90d54..4d69702171 100644
--- a/src/composite.c
+++ b/src/composite.c
@@ -688,7 +688,7 @@ composition_gstring_cache_clear_font (Lisp_Object 
font_object)
     {
       Lisp_Object k = HASH_KEY (h, i);
 
-      if (!EQ (k, Qunbound))
+      if (!BASE_EQ (k, Qunbound))
        {
          Lisp_Object gstring = HASH_VALUE (h, i);
 
diff --git a/src/data.c b/src/data.c
index 8dbb2902a7..2447ed72e4 100644
--- a/src/data.c
+++ b/src/data.c
@@ -705,7 +705,7 @@ global value outside of any lexical scope.  */)
     default: emacs_abort ();
     }
 
-  return (EQ (valcontents, Qunbound) ? Qnil : Qt);
+  return (BASE_EQ (valcontents, Qunbound) ? Qnil : Qt);
 }
 
 /* It has been previously suggested to make this function an alias for
@@ -1591,7 +1591,7 @@ global value outside of any lexical scope.  */)
   Lisp_Object val;
 
   val = find_symbol_value (symbol);
-  if (!EQ (val, Qunbound))
+  if (!BASE_EQ (val, Qunbound))
     return val;
 
   xsignal1 (Qvoid_variable, symbol);
@@ -1618,7 +1618,7 @@ void
 set_internal (Lisp_Object symbol, Lisp_Object newval, Lisp_Object where,
               enum Set_Internal_Bind bindflag)
 {
-  bool voide = EQ (newval, Qunbound);
+  bool voide = BASE_EQ (newval, Qunbound);
 
   /* If restoring in a dead buffer, do nothing.  */
   /* if (BUFFERP (where) && NILP (XBUFFER (where)->name))
@@ -1945,15 +1945,15 @@ default_value (Lisp_Object symbol)
 
 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
        doc: /* Return t if SYMBOL has a non-void default value.
-A variable may have a buffer-local or a `let'-bound local value.  This
-function says whether the variable has a non-void value outside of the
-current context.  Also see `default-value'.  */)
+A variable may have a buffer-local value.  This function says whether
+the variable has a non-void value outside of the current buffer
+context.  Also see `default-value'.  */)
   (Lisp_Object symbol)
 {
   register Lisp_Object value;
 
   value = default_value (symbol);
-  return (EQ (value, Qunbound) ? Qnil : Qt);
+  return (BASE_EQ (value, Qunbound) ? Qnil : Qt);
 }
 
 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
@@ -1964,7 +1964,7 @@ local bindings in certain buffers.  */)
   (Lisp_Object symbol)
 {
   Lisp_Object value = default_value (symbol);
-  if (!EQ (value, Qunbound))
+  if (!BASE_EQ (value, Qunbound))
     return value;
 
   xsignal1 (Qvoid_variable, symbol);
@@ -2144,7 +2144,7 @@ See also `defvar-local'.  */)
     case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
     case SYMBOL_PLAINVAL:
       forwarded = 0; valcontents.value = SYMBOL_VAL (sym);
-      if (EQ (valcontents.value, Qunbound))
+      if (BASE_EQ (valcontents.value, Qunbound))
        valcontents.value = Qnil;
       break;
     case SYMBOL_LOCALIZED:
diff --git a/src/dbusbind.c b/src/dbusbind.c
index 7cfdbbe23c..943a4aff8e 100644
--- a/src/dbusbind.c
+++ b/src/dbusbind.c
@@ -1690,29 +1690,30 @@ xd_read_message_1 (DBusConnection *connection, 
Lisp_Object bus)
       value = Fgethash (key, Vdbus_registered_objects_table, Qnil);
 
       /* Loop over the registered functions.  Construct an event.  */
-      while (!NILP (value))
+      for (; !NILP (value); value = CDR_SAFE (value))
        {
          key = CAR_SAFE (value);
+         Lisp_Object key_uname = CAR_SAFE (key);
          /* key has the structure (UNAME SERVICE PATH HANDLER).  */
-         if (((uname == NULL)
-              || (NILP (CAR_SAFE (key)))
-              || (strcmp (uname, SSDATA (CAR_SAFE (key))) == 0))
-             && ((path == NULL)
-                 || (NILP (CAR_SAFE (CDR_SAFE (CDR_SAFE (key)))))
-                 || (strcmp (path,
-                             SSDATA (CAR_SAFE (CDR_SAFE (CDR_SAFE (key)))))
-                     == 0))
-             && (!NILP (CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (key)))))))
-           {
-             EVENT_INIT (event);
-             event.kind = DBUS_EVENT;
-             event.frame_or_window = Qnil;
-             /* Handler.  */
-             event.arg
-               = Fcons (CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (key)))), args);
-             break;
-           }
-         value = CDR_SAFE (value);
+         if (uname && !NILP (key_uname)
+             && strcmp (uname, SSDATA (key_uname)) != 0)
+           continue;
+         Lisp_Object key_service_etc = CDR_SAFE (key);
+         Lisp_Object key_path_etc = CDR_SAFE (key_service_etc);
+         Lisp_Object key_path = CAR_SAFE (key_path_etc);
+         if (path && !NILP (key_path)
+             && strcmp (path, SSDATA (key_path)) != 0)
+           continue;
+         Lisp_Object handler = CAR_SAFE (CDR_SAFE (key_path_etc));
+         if (NILP (handler))
+           continue;
+
+         /* Construct an event and exit the loop.  */
+         EVENT_INIT (event);
+         event.kind = DBUS_EVENT;
+         event.frame_or_window = Qnil;
+         event.arg = Fcons (handler, args);
+         break;
        }
 
       if (NILP (value))
diff --git a/src/dispextern.h b/src/dispextern.h
index e9b19a7f13..c7399ca299 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -1075,6 +1075,9 @@ struct glyph_row
      right-to-left paragraph.  */
   bool_bf reversed_p : 1;
 
+  /* Whether or not a stipple was drawn in this row at some point.  */
+  bool_bf stipple_p : 1;
+
   /* Continuation lines width at the start of the row.  */
   int continuation_lines_width;
 
@@ -3467,6 +3470,7 @@ extern void expose_frame (struct frame *, int, int, int, 
int);
 extern bool gui_intersect_rectangles (const Emacs_Rectangle *,
                                       const Emacs_Rectangle *,
                                       Emacs_Rectangle *);
+extern void gui_consider_frame_title (Lisp_Object);
 #endif /* HAVE_WINDOW_SYSTEM */
 
 extern void note_mouse_highlight (struct frame *, int, int);
@@ -3612,6 +3616,9 @@ void gamma_correct (struct frame *, XColor *);
 #ifdef HAVE_NTGUI
 void gamma_correct (struct frame *, COLORREF *);
 #endif
+#ifdef HAVE_HAIKU
+void gamma_correct (struct frame *, Emacs_Color *);
+#endif
 
 #ifdef HAVE_WINDOW_SYSTEM
 
diff --git a/src/dispnew.c b/src/dispnew.c
index 1dd64be4ea..7a4d9f8710 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -1837,7 +1837,18 @@ adjust_frame_glyphs (struct frame *f)
   if (FRAME_WINDOW_P (f))
     adjust_frame_glyphs_for_window_redisplay (f);
   else
-    adjust_frame_glyphs_for_frame_redisplay (f);
+    {
+      adjust_frame_glyphs_for_frame_redisplay (f);
+      eassert (FRAME_INITIAL_P (f)
+              || noninteractive
+              || !initialized
+              || (f->current_matrix
+                  && f->current_matrix->nrows > 0
+                  && f->current_matrix->rows
+                  && f->desired_matrix
+                  && f->desired_matrix->nrows > 0
+                  && f->desired_matrix->rows));
+    }
 
   /* Don't forget the buffer for decode_mode_spec.  */
   adjust_decode_mode_spec_buffer (f);
@@ -2119,6 +2130,19 @@ adjust_frame_glyphs_for_frame_redisplay (struct frame *f)
          SET_FRAME_GARBAGED (f);
        }
     }
+  else if (!FRAME_INITIAL_P (f) && !noninteractive && initialized)
+    {
+      if (!f->desired_matrix->nrows || !f->desired_matrix->rows)
+       {
+         adjust_glyph_matrix (NULL, f->desired_matrix, 0, 0, matrix_dim);
+         SET_FRAME_GARBAGED (f);
+       }
+      if (!f->current_matrix->nrows || !f->current_matrix->rows)
+       {
+         adjust_glyph_matrix (NULL, f->current_matrix, 0, 0, matrix_dim);
+         SET_FRAME_GARBAGED (f);
+       }
+    }
 }
 
 
@@ -3907,7 +3931,8 @@ update_marginal_area (struct window *w, struct glyph_row 
*updated_row,
    Value is true if display has changed.  */
 
 static bool
-update_text_area (struct window *w, struct glyph_row *updated_row, int vpos)
+update_text_area (struct window *w, struct glyph_row *updated_row, int vpos,
+                 bool *partial_p)
 {
   struct glyph_row *current_row = MATRIX_ROW (w->current_matrix, vpos);
   struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos);
@@ -4013,6 +4038,13 @@ update_text_area (struct window *w, struct glyph_row 
*updated_row, int vpos)
                {
                  x += desired_glyph->pixel_width;
                  ++desired_glyph, ++current_glyph, ++i;
+
+                 /* Say that only a partial update was performed of
+                    the current row (i.e. not all the glyphs were
+                    drawn).  This is used to preserve the stipple_p
+                    flag of the current row inside
+                    update_window_line.  */
+                 *partial_p = true;
                }
 
              /* Consider the case that the current row contains "xxx
@@ -4084,9 +4116,15 @@ update_text_area (struct window *w, struct glyph_row 
*updated_row, int vpos)
              rif->write_glyphs (w, updated_row, start,
                                 TEXT_AREA, i - start_hpos);
              changed_p = 1;
+             *partial_p = true;
            }
        }
 
+      /* This means we will draw from the start, so no partial update
+        is being performed.  */
+      if (!i)
+       *partial_p = false;
+
       /* Write the rest.  */
       if (i < desired_row->used[TEXT_AREA])
        {
@@ -4159,7 +4197,9 @@ update_window_line (struct window *w, int vpos, bool 
*mouse_face_overwritten_p)
   struct glyph_row *current_row = MATRIX_ROW (w->current_matrix, vpos);
   struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos);
   struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w)));
-  bool changed_p = 0;
+
+  /* partial_p is true if not all of desired_row was drawn.  */
+  bool changed_p = 0, partial_p = 0, was_stipple;
 
   /* A row can be completely invisible in case a desired matrix was
      built with a vscroll and then make_cursor_line_fully_visible shifts
@@ -4183,7 +4223,7 @@ update_window_line (struct window *w, int vpos, bool 
*mouse_face_overwritten_p)
        }
 
       /* Update the display of the text area.  */
-      if (update_text_area (w, desired_row, vpos))
+      if (update_text_area (w, desired_row, vpos, &partial_p))
        {
          changed_p = 1;
          if (current_row->mouse_face_p)
@@ -4212,7 +4252,17 @@ update_window_line (struct window *w, int vpos, bool 
*mouse_face_overwritten_p)
     }
 
   /* Update current_row from desired_row.  */
+  was_stipple = current_row->stipple_p;
   make_current (w->desired_matrix, w->current_matrix, vpos);
+
+  /* If only a partial update was performed, any stipple already
+     displayed in MATRIX_ROW (w->current_matrix, vpos) might still be
+     there, so don't hurry to clear that flag if it's not in
+     desired_row.  */
+
+  if (partial_p && was_stipple)
+    current_row->stipple_p = true;
+
   return changed_p;
 }
 
@@ -4392,7 +4442,6 @@ add_row_entry (struct glyph_row *row)
   return entry;
 }
 
-
 /* Try to reuse part of the current display of W by scrolling lines.
    HEADER_LINE_P means W has a header line.
 
@@ -4438,6 +4487,14 @@ scrolling_window (struct window *w, int tab_line_p)
       struct glyph_row *d = MATRIX_ROW (desired_matrix, i);
       struct glyph_row *c = MATRIX_ROW (current_matrix, i);
 
+      /* If there is a row with a stipple currently on the glass, give
+        up.  Stipples look different depending on where on the
+        display they are drawn, so scrolling the display will produce
+        incorrect results.  */
+
+      if (c->stipple_p)
+       return 0;
+
       if (c->enabled_p
          && d->enabled_p
          && !d->redraw_fringe_bitmaps_p
@@ -4467,6 +4524,16 @@ scrolling_window (struct window *w, int tab_line_p)
 
   first_old = first_new = i;
 
+  while (i < current_matrix->nrows - 1)
+    {
+      /* If there is a stipple after the first change, give up as
+        well.  */
+      if (MATRIX_ROW (current_matrix, i)->stipple_p)
+       return 0;
+
+      ++i;
+    }
+
   /* Set last_new to the index + 1 of the row that reaches the
      bottom boundary in the desired matrix.  Give up if we find a
      disabled row before we reach the bottom boundary.  */
diff --git a/src/doc.c b/src/doc.c
index 71e66853b0..14db3189f3 100644
--- a/src/doc.c
+++ b/src/doc.c
@@ -569,6 +569,8 @@ the same file name is found in the `doc-directory'.  */)
       if (p)
        {
          end = strchr (p, '\n');
+         if (!end)
+           error ("DOC file invalid at position %"pI"d", pos);
 
          /* We used to skip files not in build_files, so that when a
             function was defined several times in different files
diff --git a/src/editfns.c b/src/editfns.c
index 6cb684d4d8..17f0252969 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -3327,7 +3327,7 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool 
message)
              if (EQ (arg, args[n]))
                {
                  Lisp_Object noescape = conversion == 'S' ? Qnil : Qt;
-                 spec->argument = arg = Fprin1_to_string (arg, noescape);
+                 spec->argument = arg = Fprin1_to_string (arg, noescape, Qnil);
                  if (STRING_MULTIBYTE (arg) && ! multibyte)
                    {
                      multibyte = true;
diff --git a/src/emacs-module.c b/src/emacs-module.c
index 0d3cce0276..1c392d65df 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -411,7 +411,7 @@ module_global_reference_p (emacs_value v, ptrdiff_t *n)
      reference that's identical to some global reference.  */
   for (ptrdiff_t i = 0; i < HASH_TABLE_SIZE (h); ++i)
     {
-      if (!EQ (HASH_KEY (h, i), Qunbound)
+      if (!BASE_EQ (HASH_KEY (h, i), Qunbound)
           && &XMODULE_GLOBAL_REFERENCE (HASH_VALUE (h, i))->value == v)
         return true;
     }
diff --git a/src/emacs.c b/src/emacs.c
index 9f20a1597c..189692a02e 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -1409,7 +1409,7 @@ main (int argc, char **argv)
      related to the GUI system, like -font, -geometry, and -title, and
      then processes the rest of arguments whose priority is below
      those that are related to the GUI system.  The arguments
-     porcessed by 'command-line' are removed from 'command-line-args';
+     processed by 'command-line' are removed from 'command-line-args';
      the arguments processed by 'command-line-1' aren't, they are only
      removed from 'command-line-args-left'.
 
@@ -1419,54 +1419,19 @@ main (int argc, char **argv)
      should be explicitly recognized, ignored, and removed from
      'command-line-args-left' in 'command-line-1'.  */
 
+  bool only_version = false;
   sort_args (argc, argv);
   argc = 0;
   while (argv[argc]) argc++;
 
   skip_args = 0;
   if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args))
-    {
-      const char *version, *copyright;
-      if (initialized)
-       {
-         Lisp_Object tem, tem2;
-         tem = Fsymbol_value (intern_c_string ("emacs-version"));
-         tem2 = Fsymbol_value (intern_c_string ("emacs-copyright"));
-         if (!STRINGP (tem))
-           {
-             fputs ("Invalid value of 'emacs-version'\n", stderr);
-             exit (1);
-           }
-         if (!STRINGP (tem2))
-           {
-             fputs ("Invalid value of 'emacs-copyright'\n", stderr);
-             exit (1);
-           }
-         else
-           {
-             version = SSDATA (tem);
-             copyright = SSDATA (tem2);
-           }
-       }
-      else
-       {
-         version = emacs_version;
-         copyright = emacs_copyright;
-       }
-      printf (("%s %s\n"
-              "%s\n"
-              "%s comes with ABSOLUTELY NO WARRANTY.\n"
-              "You may redistribute copies of %s\n"
-              "under the terms of the GNU General Public License.\n"
-              "For more information about these matters, "
-              "see the file named COPYING.\n"),
-             PACKAGE_NAME, version, copyright, PACKAGE_NAME, PACKAGE_NAME);
-      exit (0);
-    }
+    only_version = true;
 
 #ifdef HAVE_PDUMPER
   if (argmatch (argv, argc, "-fingerprint", "--fingerprint", 4,
-               NULL, &skip_args))
+               NULL, &skip_args)
+      && !only_version)
     {
       if (initialized)
         {
@@ -1491,7 +1456,8 @@ main (int argc, char **argv)
     pdumper_record_wd (emacs_wd);
 #endif
 
-  if (argmatch (argv, argc, "-chdir", "--chdir", 4, &ch_to_dir, &skip_args))
+  if (argmatch (argv, argc, "-chdir", "--chdir", 4, &ch_to_dir, &skip_args)
+      && !only_version)
     {
 #ifdef WINDOWSNT
       /* argv[] array is kept in its original ANSI codepage encoding,
@@ -1617,7 +1583,7 @@ main (int argc, char **argv)
   inhibit_window_system = 0;
 
   /* Handle the -t switch, which specifies filename to use as terminal.  */
-  while (1)
+  while (!only_version)
     {
       char *term;
       if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
@@ -1655,7 +1621,8 @@ main (int argc, char **argv)
 
   /* Handle the -batch switch, which means don't do interactive display.  */
   noninteractive = 0;
-  if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
+  if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args)
+      || only_version)
     {
       noninteractive = 1;
       Vundo_outer_limit = Qnil;
@@ -1672,7 +1639,8 @@ main (int argc, char **argv)
     }
 
   /* Handle the --help option, which gives a usage message.  */
-  if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
+  if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args)
+      && !only_version)
     {
       int i;
       printf ("Usage: %s [OPTION-OR-FILENAME]...\n", argv[0]);
@@ -1693,20 +1661,27 @@ main (int argc, char **argv)
 
   int sockfd = -1;
 
-  if (argmatch (argv, argc, "-fg-daemon", "--fg-daemon", 10, NULL, &skip_args)
-      || argmatch (argv, argc, "-fg-daemon", "--fg-daemon", 10, &dname_arg, 
&skip_args))
+  if (!only_version)
     {
-      daemon_type = 1;           /* foreground */
-    }
-  else if (argmatch (argv, argc, "-daemon", "--daemon", 5, NULL, &skip_args)
-      || argmatch (argv, argc, "-daemon", "--daemon", 5, &dname_arg, 
&skip_args)
-      || argmatch (argv, argc, "-bg-daemon", "--bg-daemon", 10, NULL, 
&skip_args)
-      || argmatch (argv, argc, "-bg-daemon", "--bg-daemon", 10, &dname_arg, 
&skip_args))
-    {
-      daemon_type = 2;          /* background */
+      if (argmatch (argv, argc, "-fg-daemon", "--fg-daemon", 10, NULL,
+                   &skip_args)
+         || argmatch (argv, argc, "-fg-daemon", "--fg-daemon", 10, &dname_arg,
+                      &skip_args))
+       {
+         daemon_type = 1;           /* foreground */
+       }
+      else if (argmatch (argv, argc, "-daemon", "--daemon", 5, NULL, 
&skip_args)
+              || argmatch (argv, argc, "-daemon", "--daemon", 5, &dname_arg,
+                           &skip_args)
+              || argmatch (argv, argc, "-bg-daemon", "--bg-daemon", 10, NULL,
+                           &skip_args)
+              || argmatch (argv, argc, "-bg-daemon", "--bg-daemon", 10,
+                           &dname_arg, &skip_args))
+       {
+         daemon_type = 2;          /* background */
+       }
     }
 
-
   if (daemon_type > 0)
     {
 #ifndef DOS_NT
@@ -1956,15 +1931,11 @@ Using an Emacs configured with --with-x-toolkit=lucid 
does not have this problem
   init_threads ();
   init_eval ();
 #ifdef HAVE_PGTK
-  init_pgtkterm ();   /* before init_atimer(). */
+  init_pgtkterm (); /* Must come before `init_atimer'.  */
 #endif
   running_asynch_code = 0;
   init_random ();
-
-#ifdef HAVE_PDUMPER
-  if (dumped_with_pdumper_p ())
-    init_xfaces ();
-#endif
+  init_xfaces ();
 
 #if defined HAVE_JSON && !defined WINDOWSNT
   init_json ();
@@ -1986,7 +1957,7 @@ Using an Emacs configured with --with-x-toolkit=lucid 
does not have this problem
   bool module_assertions
     = argmatch (argv, argc, "-module-assertions", "--module-assertions", 15,
                 NULL, &skip_args);
-  if (will_dump_p () && module_assertions)
+  if (will_dump_p () && module_assertions && !only_version)
     {
       fputs ("Module assertions are not supported during dumping\n", stderr);
       exit (1);
@@ -2034,7 +2005,7 @@ Using an Emacs configured with --with-x-toolkit=lucid 
does not have this problem
     int count_before = skip_args;
 
     /* Skip any number of -d options, but only use the last one.  */
-    while (1)
+    while (!only_version)
       {
        int count_before_this = skip_args;
 
@@ -2176,6 +2147,72 @@ Using an Emacs configured with --with-x-toolkit=lucid 
does not have this problem
   init_callproc ();    /* Must follow init_cmdargs but not init_sys_modes.  */
   init_fileio ();
   init_lread ();
+
+  /* If "-version" was specified, produce version information and
+     exit.  We do it here because the code below needs to call Lisp
+     primitives, which cannot be done safely before we call all the
+     init_FOO initialization functions above.  */
+  if (only_version)
+    {
+      const char *version, *copyright;
+
+      if (initialized)
+       {
+         Lisp_Object tem = Fsymbol_value (intern_c_string ("emacs-version"));
+         Lisp_Object tem2 = Fsymbol_value (intern_c_string 
("emacs-copyright"));
+         if (!STRINGP (tem))
+           {
+             fputs ("Invalid value of 'emacs-version'\n", stderr);
+             exit (1);
+           }
+         if (!STRINGP (tem2))
+           {
+             fputs ("Invalid value of 'emacs-copyright'\n", stderr);
+             exit (1);
+           }
+         else
+           {
+             version = SSDATA (tem);
+             copyright = SSDATA (tem2);
+           }
+       }
+      else
+       {
+         version = emacs_version;
+         copyright = emacs_copyright;
+       }
+      printf ("%s %s\n", PACKAGE_NAME, version);
+
+      if (initialized)
+       {
+         Lisp_Object rversion, rbranch, rtime;
+
+         rversion
+           = Fsymbol_value (intern_c_string ("emacs-repository-version"));
+         rbranch
+           = Fsymbol_value (intern_c_string ("emacs-repository-branch"));
+         rtime
+           = Fsymbol_value (intern_c_string ("emacs-build-time"));
+
+         if (!NILP (rversion) && !NILP (rbranch) && !NILP (rtime))
+           printf ("Development version %s on %s branch; build date %s.\n",
+                   SSDATA (Fsubstring (rversion, make_fixnum (0),
+                                       make_fixnum (12))),
+                   SSDATA (rbranch),
+                   SSDATA (Fformat_time_string (build_string ("%Y-%m-%d"),
+                                                rtime, Qnil)));
+       }
+
+      printf (("%s\n"
+              "%s comes with ABSOLUTELY NO WARRANTY.\n"
+              "You may redistribute copies of %s\n"
+              "under the terms of the GNU General Public License.\n"
+              "For more information about these matters, "
+              "see the file named COPYING.\n"),
+             copyright, PACKAGE_NAME, PACKAGE_NAME);
+      exit (0);
+    }
+
 #ifdef WINDOWSNT
   /* Check to see if Emacs has been installed correctly.  */
   check_windows_init_file ();
@@ -2954,6 +2991,10 @@ shut_down_emacs (int sig, Lisp_Object stuff)
       check_message_stack ();
     }
 
+#ifdef HAVE_NATIVE_COMP
+  eln_load_path_final_clean_up ();
+#endif
+
 #ifdef MSDOS
   dos_cleanup ();
 #endif
diff --git a/src/eval.c b/src/eval.c
index 3ec03de137..45ddbab2a2 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -707,7 +707,7 @@ DEFUN ("default-toplevel-value", Fdefault_toplevel_value, 
Sdefault_toplevel_valu
   union specbinding *binding = default_toplevel_binding (symbol);
   Lisp_Object value
     = binding ? specpdl_old_value (binding) : Fdefault_value (symbol);
-  if (!EQ (value, Qunbound))
+  if (!BASE_EQ (value, Qunbound))
     return value;
   xsignal1 (Qvoid_variable, symbol);
 }
@@ -741,7 +741,9 @@ value.  */)
        and where the `foo` package only gets loaded when <foo-function>
        is called, so the outer `let` incorrectly made the binding lexical
        because the <foo-var> wasn't yet declared as dynamic at that point.  */
-    error ("Defining as dynamic an already lexical var");
+    xsignal2 (Qerror,
+             build_string ("Defining as dynamic an already lexical var"),
+             symbol);
 
   XSYMBOL (symbol)->u.s.declared_special = true;
   if (!NILP (doc))
@@ -754,6 +756,33 @@ value.  */)
   return Qnil;
 }
 
+static Lisp_Object
+defvar (Lisp_Object sym, Lisp_Object initvalue, Lisp_Object docstring, bool 
eval)
+{
+  Lisp_Object tem;
+
+  CHECK_SYMBOL (sym);
+
+  tem = Fdefault_boundp (sym);
+
+  /* Do it before evaluating the initial value, for self-references.  */
+  Finternal__define_uninitialized_variable (sym, docstring);
+
+  if (NILP (tem))
+    Fset_default (sym, eval ? eval_sub (initvalue) : initvalue);
+  else
+    { /* Check if there is really a global binding rather than just a let
+            binding that shadows the global unboundness of the var.  */
+      union specbinding *binding = default_toplevel_binding (sym);
+      if (binding && BASE_EQ (specpdl_old_value (binding), Qunbound))
+       {
+         set_specpdl_old_value (binding,
+                                eval ? eval_sub (initvalue) : initvalue);
+       }
+    }
+  return sym;
+}
+
 DEFUN ("defvar", Fdefvar, Sdefvar, 1, UNEVALLED, 0,
        doc: /* Define SYMBOL as a variable, and return SYMBOL.
 You are not required to define a variable in order to use it, but
@@ -768,12 +797,10 @@ value.  If SYMBOL is buffer-local, its default value is 
what is set;
 buffer-local values are not affected.  If INITVALUE is missing,
 SYMBOL's value is not set.
 
-If SYMBOL has a local binding, then this form affects the local
-binding.  This is usually not what you want.  Thus, if you need to
-load a file defining variables, with this form or with `defconst' or
-`defcustom', you should always load that file _outside_ any bindings
-for these variables.  (`defconst' and `defcustom' behave similarly in
-this respect.)
+If SYMBOL is let-bound, then this form does not affect the local let
+binding but the toplevel default binding instead, like
+`set-toplevel-default-binding`.
+(`defcustom' behaves similarly in this respect.)
 
 The optional argument DOCSTRING is a documentation string for the
 variable.
@@ -784,7 +811,7 @@ To define a buffer-local variable, use `defvar-local'.
 usage: (defvar SYMBOL &optional INITVALUE DOCSTRING)  */)
   (Lisp_Object args)
 {
-  Lisp_Object sym, tem, tail;
+  Lisp_Object sym, tail;
 
   sym = XCAR (args);
   tail = XCDR (args);
@@ -796,24 +823,8 @@ usage: (defvar SYMBOL &optional INITVALUE DOCSTRING)  */)
       if (!NILP (XCDR (tail)) && !NILP (XCDR (XCDR (tail))))
        error ("Too many arguments");
       Lisp_Object exp = XCAR (tail);
-
-      tem = Fdefault_boundp (sym);
       tail = XCDR (tail);
-
-      /* Do it before evaluating the initial value, for self-references.  */
-      Finternal__define_uninitialized_variable (sym, CAR (tail));
-
-      if (NILP (tem))
-       Fset_default (sym, eval_sub (exp));
-      else
-       { /* Check if there is really a global binding rather than just a let
-            binding that shadows the global unboundness of the var.  */
-         union specbinding *binding = default_toplevel_binding (sym);
-         if (binding && EQ (specpdl_old_value (binding), Qunbound))
-           {
-             set_specpdl_old_value (binding, eval_sub (exp));
-           }
-       }
+      return defvar (sym, exp, CAR (tail), true);
     }
   else if (!NILP (Vinternal_interpreter_environment)
           && (SYMBOLP (sym) && !XSYMBOL (sym)->u.s.declared_special))
@@ -832,6 +843,14 @@ usage: (defvar SYMBOL &optional INITVALUE DOCSTRING)  */)
   return sym;
 }
 
+DEFUN ("defvar-1", Fdefvar_1, Sdefvar_1, 2, 3, 0,
+       doc: /* Like `defvar' but as a function.
+More specifically behaves like (defvar SYM 'INITVALUE DOCSTRING).  */)
+  (Lisp_Object sym, Lisp_Object initvalue, Lisp_Object docstring)
+{
+  return defvar (sym, initvalue, docstring, false);
+}
+
 DEFUN ("defconst", Fdefconst, Sdefconst, 2, UNEVALLED, 0,
        doc: /* Define SYMBOL as a constant variable.
 This declares that neither programs nor users should ever change the
@@ -861,9 +880,18 @@ usage: (defconst SYMBOL INITVALUE [DOCSTRING])  */)
        error ("Too many arguments");
       docstring = XCAR (XCDR (XCDR (args)));
     }
+  tem = eval_sub (XCAR (XCDR (args)));
+  return Fdefconst_1 (sym, tem, docstring);
+}
 
+DEFUN ("defconst-1", Fdefconst_1, Sdefconst_1, 2, 3, 0,
+       doc: /* Like `defconst' but as a function.
+More specifically, behaves like (defconst SYM 'INITVALUE DOCSTRING).  */)
+  (Lisp_Object sym, Lisp_Object initvalue, Lisp_Object docstring)
+{
+  CHECK_SYMBOL (sym);
+  Lisp_Object tem = initvalue;
   Finternal__define_uninitialized_variable (sym, docstring);
-  tem = eval_sub (XCAR (XCDR (args)));
   if (!NILP (Vpurify_flag))
     tem = Fpurecopy (tem);
   Fset_default (sym, tem);      /* FIXME: set-default-toplevel-value? */
@@ -1223,6 +1251,13 @@ unwind_to_catch (struct handler *catch, enum 
nonlocal_exit type,
   set_poll_suppress_count (catch->poll_suppress_count);
   unblock_input_to (catch->interrupt_input_blocked);
 
+#ifdef HAVE_X_WINDOWS
+  /* Restore the X error handler stack.  This is important because
+     otherwise a display disconnect won't unwind the stack of error
+     traps to the right depth.  */
+  x_unwind_errors_to (catch->x_error_handler_depth);
+#endif
+
   do
     {
       /* Unwind the specpdl stack, and then restore the proper set of
@@ -1341,7 +1376,7 @@ internal_lisp_condition_case (Lisp_Object var, 
Lisp_Object bodyform,
                 && (SYMBOLP (XCAR (tem))
                     || CONSP (XCAR (tem))))))
        error ("Invalid condition handler: %s",
-              SDATA (Fprin1_to_string (tem, Qt)));
+              SDATA (Fprin1_to_string (tem, Qt, Qnil)));
       if (CONSP (tem) && EQ (XCAR (tem), QCsuccess))
        success_handler = XCDR (tem);
       else
@@ -1597,6 +1632,9 @@ push_handler_nosignal (Lisp_Object tag_ch_val, enum 
handlertype handlertype)
   c->act_rec = get_act_rec (current_thread);
   c->poll_suppress_count = poll_suppress_count;
   c->interrupt_input_blocked = interrupt_input_blocked;
+#ifdef HAVE_X_WINDOWS
+  c->x_error_handler_depth = x_error_message_count;
+#endif
   handlerlist = c;
   return c;
 }
@@ -2740,7 +2778,7 @@ run_hook_with_args (ptrdiff_t nargs, Lisp_Object *args,
   sym = args[0];
   val = find_symbol_value (sym);
 
-  if (EQ (val, Qunbound) || NILP (val))
+  if (BASE_EQ (val, Qunbound) || NILP (val))
     return ret;
   else if (!CONSP (val) || FUNCTIONP (val))
     {
@@ -2816,7 +2854,13 @@ apply1 (Lisp_Object fn, Lisp_Object arg)
 }
 
 DEFUN ("functionp", Ffunctionp, Sfunctionp, 1, 1, 0,
-       doc: /* Return t if OBJECT is a function.  */)
+       doc: /* Return t if OBJECT is a function.
+
+An object is a function if it is callable via `funcall'; this includes
+symbols with function bindings, but excludes macros and special forms.
+
+Ordinarily return nil if OBJECT is not a function, although t might be
+returned in rare cases.  */)
      (Lisp_Object object)
 {
   if (FUNCTIONP (object))
@@ -4338,9 +4382,11 @@ alist of active lexical bindings.  */);
   defsubr (&Sdefault_toplevel_value);
   defsubr (&Sset_default_toplevel_value);
   defsubr (&Sdefvar);
+  defsubr (&Sdefvar_1);
   defsubr (&Sdefvaralias);
   DEFSYM (Qdefvaralias, "defvaralias");
   defsubr (&Sdefconst);
+  defsubr (&Sdefconst_1);
   defsubr (&Sinternal__define_uninitialized_variable);
   defsubr (&Smake_var_non_special);
   defsubr (&Slet);
diff --git a/src/fileio.c b/src/fileio.c
index c418036fc6..e29685e07b 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2718,6 +2718,20 @@ This is what happens in interactive use with M-x.  */)
           : Qnil);
       if (!NILP (symlink_target))
        Fmake_symbolic_link (symlink_target, newname, ok_if_already_exists);
+      else if (S_ISFIFO (file_st.st_mode))
+       {
+         /* If it's a FIFO, calling `copy-file' will hang if it's a
+            inter-file system move, so do it here.  (It will signal
+            an error in that case, but it won't hang in any case.)  */
+         if (!NILP (ok_if_already_exists))
+           barf_or_query_if_file_exists (newname, false,
+                                         "rename to it",
+                                         FIXNUMP (ok_if_already_exists),
+                                         false);
+         if (rename (SSDATA (encoded_file), SSDATA (encoded_newname)) != 0)
+           report_file_errno ("Renaming", list2 (file, newname), errno);
+         return Qnil;
+       }
       else
        Fcopy_file (file, newname, ok_if_already_exists, Qt, Qt, Qt);
     }
@@ -3884,6 +3898,10 @@ The optional third and fourth arguments BEG and END 
specify what portion
 of the file to insert.  These arguments count bytes in the file, not
 characters in the buffer.  If VISIT is non-nil, BEG and END must be nil.
 
+When inserting data from a special file (e.g., /dev/urandom), you
+can't specify VISIT or BEG, and END should be specified to avoid
+inserting unlimited data into the buffer.
+
 If optional fifth argument REPLACE is non-nil, replace the current
 buffer contents (in the accessible portion) with the file contents.
 This is better than simply deleting and inserting the whole thing
@@ -3911,7 +3929,7 @@ by calling `format-decode', which see.  */)
   Lisp_Object handler, val, insval, orig_filename, old_undo;
   Lisp_Object p;
   ptrdiff_t total = 0;
-  bool not_regular = 0;
+  bool regular = true;
   int save_errno = 0;
   char read_buf[READ_BUF_SIZE];
   struct coding_system coding;
@@ -3934,6 +3952,7 @@ by calling `format-decode', which see.  */)
   /* SAME_AT_END_CHARPOS counts characters, because
      restore_window_points needs the old character count.  */
   ptrdiff_t same_at_end_charpos = ZV;
+  bool seekable = true;
 
   if (current_buffer->base_buffer && ! NILP (visit))
     error ("Cannot do file visiting in an indirect buffer");
@@ -4007,7 +4026,8 @@ by calling `format-decode', which see.  */)
      least signal an error.  */
   if (!S_ISREG (st.st_mode))
     {
-      not_regular = 1;
+      regular = false;
+      seekable = lseek (fd, 0, SEEK_CUR) < 0;
 
       if (! NILP (visit))
         {
@@ -4015,7 +4035,12 @@ by calling `format-decode', which see.  */)
          goto notfound;
         }
 
-      if (! NILP (replace) || ! NILP (beg) || ! NILP (end))
+      if (!NILP (beg) && !seekable)
+       xsignal2 (Qfile_error,
+                 build_string ("cannot use a start position in a non-seekable 
file/device"),
+                 orig_filename);
+
+      if (!NILP (replace))
        xsignal2 (Qfile_error,
                  build_string ("not a regular file"), orig_filename);
     }
@@ -4037,7 +4062,7 @@ by calling `format-decode', which see.  */)
     end_offset = file_offset (end);
   else
     {
-      if (not_regular)
+      if (!regular)
        end_offset = TYPE_MAXIMUM (off_t);
       else
        {
@@ -4059,7 +4084,7 @@ by calling `format-decode', which see.  */)
   /* Check now whether the buffer will become too large,
      in the likely case where the file's length is not changing.
      This saves a lot of needless work before a buffer overflow.  */
-  if (! not_regular)
+  if (regular)
     {
       /* The likely offset where we will stop reading.  We could read
         more (or less), if the file grows (or shrinks) as we read it.  */
@@ -4097,7 +4122,7 @@ by calling `format-decode', which see.  */)
        {
          /* Don't try looking inside a file for a coding system
             specification if it is not seekable.  */
-         if (! not_regular && ! NILP (Vset_auto_coding_function))
+         if (regular && !NILP (Vset_auto_coding_function))
            {
              /* Find a coding system specified in the heading two
                 lines or in the tailing several lines of the file.
@@ -4559,7 +4584,7 @@ by calling `format-decode', which see.  */)
       goto handled;
     }
 
-  if (! not_regular)
+  if (seekable || !NILP (end))
     total = end_offset - beg_offset;
   else
     /* For a special file, all we can do is guess.  */
@@ -4605,7 +4630,7 @@ by calling `format-decode', which see.  */)
        ptrdiff_t trytry = min (total - how_much, READ_BUF_SIZE);
        ptrdiff_t this;
 
-       if (not_regular)
+       if (!seekable && NILP (end))
          {
            Lisp_Object nbytes;
 
@@ -4656,7 +4681,7 @@ by calling `format-decode', which see.  */)
           For a special file, where TOTAL is just a buffer size,
           so don't bother counting in HOW_MUCH.
           (INSERTED is where we count the number of characters inserted.)  */
-       if (! not_regular)
+       if (seekable || !NILP (end))
          how_much += this;
        inserted += this;
       }
@@ -4834,7 +4859,7 @@ by calling `format-decode', which see.  */)
            Funlock_file (BVAR (current_buffer, file_truename));
          Funlock_file (filename);
        }
-      if (not_regular)
+      if (!regular)
        xsignal2 (Qfile_error,
                  build_string ("not a regular file"), orig_filename);
     }
@@ -5958,14 +5983,19 @@ do_auto_save_eh (Lisp_Object ignore)
 
 DEFUN ("do-auto-save", Fdo_auto_save, Sdo_auto_save, 0, 2, "",
        doc: /* Auto-save all buffers that need it.
-This is all buffers that have auto-saving enabled
-and are changed since last auto-saved.
-Auto-saving writes the buffer into a file
-so that your editing is not lost if the system crashes.
-This file is not the file you visited; that changes only when you save.
+This auto-saves all buffers that have auto-saving enabled and
+were changed since last auto-saved.
+
+Auto-saving writes the buffer into a file so that your edits are
+not lost if the system crashes.
+
+The auto-save file is not the file you visited; that changes only
+when you save.
+
 Normally, run the normal hook `auto-save-hook' before saving.
 
 A non-nil NO-MESSAGE argument means do not print any message if successful.
+
 A non-nil CURRENT-ONLY argument means save only current buffer.  */)
   (Lisp_Object no_message, Lisp_Object current_only)
 {
diff --git a/src/floatfns.c b/src/floatfns.c
index f2b3b13acd..293184c70f 100644
--- a/src/floatfns.c
+++ b/src/floatfns.c
@@ -29,14 +29,20 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 
    C99 and C11 require the following math.h functions in addition to
    the C89 functions.  Of these, Emacs currently exports only the
-   starred ones to Lisp, since we haven't found a use for the others:
-   acosh, atanh, cbrt, *copysign, erf, erfc, exp2, expm1, fdim, fma,
-   fmax, fmin, fpclassify, hypot, ilogb, isfinite, isgreater,
-   isgreaterequal, isinf, isless, islessequal, islessgreater, *isnan,
-   isnormal, isunordered, lgamma, log1p, *log2 [via (log X 2)], *logb
-   (approximately), lrint/llrint, lround/llround, nan, nearbyint,
-   nextafter, nexttoward, remainder, remquo, *rint, round, scalbln,
-   scalbn, signbit, tgamma, *trunc.
+   starred ones to Lisp, since we haven't found a use for the others.
+   Also, it uses the ones marked "+" internally:
+   acosh, atanh, cbrt, copysign (implemented by signbit), erf, erfc,
+   exp2, expm1, fdim, fma, fmax, fmin, fpclassify, hypot, +ilogb,
+   isfinite, isgreater, isgreaterequal, isinf, isless, islessequal,
+   islessgreater, *isnan, isnormal, isunordered, lgamma, log1p, *log2
+   [via (log X 2)], logb (approximately; implemented by frexp),
+   +lrint/llrint, +lround/llround, nan, nearbyint, nextafter,
+   nexttoward, remainder, remquo, *rint, round, scalbln, +scalbn,
+   +signbit, tgamma, *trunc.
+
+   The C standard also requires functions for float and long double
+   that are not listed above.  Of these functions, Emacs uses only the
+   following internally: fabsf, powf, sprintf.
  */
 
 #include <config.h>
diff --git a/src/fns.c b/src/fns.c
index 4673fde28c..6094c00b27 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -2519,7 +2519,7 @@ internal_equal (Lisp_Object o1, Lisp_Object o2, enum 
equal_kind equal_kind,
   if (SYMBOL_WITH_POS_P (o2))
     o2 = SYMBOL_WITH_POS_SYM (o2);
 
-  if (EQ (o1, o2))
+  if (BASE_EQ (o1, o2))
     return true;
   if (XTYPE (o1) != XTYPE (o2))
     return false;
@@ -4113,7 +4113,7 @@ hash_table_user_defined_call (ptrdiff_t nargs, 
Lisp_Object *args,
   return unbind_to (count, Ffuncall (nargs, args));
 }
 
-/* Ignore HT and compare KEY1 and KEY2 using 'eql'.
+/* Ignore H and compare KEY1 and KEY2 using 'eql'.
    Value is true if KEY1 and KEY2 are the same.  */
 
 static Lisp_Object
@@ -4122,7 +4122,7 @@ cmpfn_eql (Lisp_Object key1, Lisp_Object key2, struct 
Lisp_Hash_Table *h)
   return Feql (key1, key2);
 }
 
-/* Ignore HT and compare KEY1 and KEY2 using 'equal'.
+/* Ignore H and compare KEY1 and KEY2 using 'equal'.
    Value is true if KEY1 and KEY2 are the same.  */
 
 static Lisp_Object
@@ -4132,7 +4132,7 @@ cmpfn_equal (Lisp_Object key1, Lisp_Object key2, struct 
Lisp_Hash_Table *h)
 }
 
 
-/* Given HT, compare KEY1 and KEY2 using HT->user_cmp_function.
+/* Given H, compare KEY1 and KEY2 using H->user_cmp_function.
    Value is true if KEY1 and KEY2 are the same.  */
 
 static Lisp_Object
@@ -4143,8 +4143,7 @@ cmpfn_user_defined (Lisp_Object key1, Lisp_Object key2,
   return hash_table_user_defined_call (ARRAYELTS (args), args, h);
 }
 
-/* Ignore HT and return a hash code for KEY which uses 'eq' to compare
-   keys.  */
+/* Ignore H and return a hash code for KEY which uses 'eq' to compare keys.  */
 
 static Lisp_Object
 hashfn_eq (Lisp_Object key, struct Lisp_Hash_Table *h)
@@ -4154,7 +4153,7 @@ hashfn_eq (Lisp_Object key, struct Lisp_Hash_Table *h)
   return make_ufixnum (XHASH (key) ^ XTYPE (key));
 }
 
-/* Ignore HT and return a hash code for KEY which uses 'equal' to compare keys.
+/* Ignore H and return a hash code for KEY which uses 'equal' to compare keys.
    The hash code is at most INTMASK.  */
 
 static Lisp_Object
@@ -4163,7 +4162,7 @@ hashfn_equal (Lisp_Object key, struct Lisp_Hash_Table *h)
   return make_ufixnum (sxhash (key));
 }
 
-/* Ignore HT and return a hash code for KEY which uses 'eql' to compare keys.
+/* Ignore H and return a hash code for KEY which uses 'eql' to compare keys.
    The hash code is at most INTMASK.  */
 
 static Lisp_Object
@@ -4172,7 +4171,7 @@ hashfn_eql (Lisp_Object key, struct Lisp_Hash_Table *h)
   return (FLOATP (key) || BIGNUMP (key) ? hashfn_equal : hashfn_eq) (key, h);
 }
 
-/* Given HT, return a hash code for KEY which uses a user-defined
+/* Given H, return a hash code for KEY which uses a user-defined
    function to compare keys.  */
 
 Lisp_Object
@@ -4479,7 +4478,7 @@ hash_put (struct Lisp_Hash_Table *h, Lisp_Object key, 
Lisp_Object value,
   /* Store key/value in the key_and_value vector.  */
   i = h->next_free;
   eassert (NILP (HASH_HASH (h, i)));
-  eassert (EQ (Qunbound, (HASH_KEY (h, i))));
+  eassert (BASE_EQ (Qunbound, (HASH_KEY (h, i))));
   h->next_free = HASH_NEXT (h, i);
   set_hash_key_slot (h, i, key);
   set_hash_value_slot (h, i, value);
@@ -5220,7 +5219,7 @@ FUNCTION is called with two arguments, KEY and VALUE.
   for (ptrdiff_t i = 0; i < HASH_TABLE_SIZE (h); ++i)
     {
       Lisp_Object k = HASH_KEY (h, i);
-      if (!EQ (k, Qunbound))
+      if (!BASE_EQ (k, Qunbound))
         call2 (function, k, HASH_VALUE (h, i));
     }
 
@@ -5870,9 +5869,12 @@ from the absolute start of the buffer, disregarding the 
narrowing.  */)
   if (!NILP (absolute))
     start = BEG_BYTE;
 
-  /* Check that POSITION is in the accessible range of the buffer. */
-  if (pos < BEGV || pos > ZV)
+  /* Check that POSITION is in the accessible range of the buffer, or,
+     if we're reporting absolute positions, in the buffer. */
+  if (NILP (absolute) && (pos < BEGV || pos > ZV))
     args_out_of_range_3 (make_int (pos), make_int (BEGV), make_int (ZV));
+  else if (!NILP (absolute) && (pos < 1 || pos > Z))
+    args_out_of_range_3 (make_int (pos), make_int (1), make_int (Z));
 
   return make_int (count_lines (start, CHAR_TO_BYTE (pos)) + 1);
 }
diff --git a/src/font.c b/src/font.c
index 6297452d3e..702536c1ca 100644
--- a/src/font.c
+++ b/src/font.c
@@ -731,7 +731,7 @@ font_put_extra (Lisp_Object font, Lisp_Object prop, 
Lisp_Object val)
     {
       Lisp_Object prev = Qnil;
 
-      if (EQ (val, Qunbound))
+      if (BASE_EQ (val, Qunbound))
        return val;
       while (CONSP (extra)
             && NILP (Fstring_lessp (prop, XCAR (XCAR (extra)))))
@@ -745,7 +745,7 @@ font_put_extra (Lisp_Object font, Lisp_Object prop, 
Lisp_Object val)
       return val;
     }
   XSETCDR (slot, val);
-  if (EQ (val, Qunbound))
+  if (BASE_EQ (val, Qunbound))
     ASET (font, FONT_EXTRA_INDEX, Fdelq (slot, extra));
   return val;
 }
diff --git a/src/frame.c b/src/frame.c
index 93028aa895..c21461d49f 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -1572,6 +1572,19 @@ do_switch_frame (Lisp_Object frame, int track, int 
for_deletion, Lisp_Object nor
   if (! FRAME_MINIBUF_ONLY_P (XFRAME (selected_frame)))
     last_nonminibuf_frame = XFRAME (selected_frame);
 
+  /* If the selected window in the target frame is its mini-window, we move
+     to a different window, the most recently used one, unless there is a
+     valid active minibuffer in the mini-window.  */
+  if (EQ (f->selected_window, f->minibuffer_window)
+      /* The following test might fail if the mini-window contains a
+        non-active minibuffer.  */
+      && NILP (Fminibufferp (XWINDOW (f->minibuffer_window)->contents, Qt)))
+    {
+      Lisp_Object w = call1 (Qget_mru_window, frame);
+      if (WINDOW_LIVE_P (w)) /* W can be nil in minibuffer-only frames.  */
+        Fset_frame_selected_window (frame, w, Qnil);
+    }
+
   Fselect_window (f->selected_window, norecord);
 
   /* We want to make sure that the next event generates a frame-switch
@@ -1988,7 +2001,8 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
        error ("Attempt to delete the only frame");
     }
 #ifdef HAVE_X_WINDOWS
-  else if (x_dnd_in_progress && f == x_dnd_frame)
+  else if ((x_dnd_in_progress && f == x_dnd_frame)
+          || (x_dnd_waiting_for_finish && f == x_dnd_finish_frame))
     error ("Attempt to delete the drop source frame");
 #endif
 #ifdef HAVE_HAIKU
@@ -2333,7 +2347,8 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
        kset_default_minibuffer_frame (kb, Qnil);
     }
 
-  /* Cause frame titles to update--necessary if we now have just one frame.  */
+  /* Cause frame titles to update--necessary if we now have just one
+     frame.  */
   if (!is_tooltip_frame)
     update_mode_lines = 15;
 
@@ -3642,7 +3657,7 @@ DEFUN ("frame-fringe-width", Ffringe_width, 
Sfringe_width, 0, 1, 0,
 
 DEFUN ("frame-child-frame-border-width", Fframe_child_frame_border_width, 
Sframe_child_frame_border_width, 0, 1, 0,
        doc: /* Return width of FRAME's child-frame border in pixels.
- If FRAME's 'child-frame-border-width' parameter is nil, return FRAME's
+ If FRAME's `child-frame-border-width' parameter is nil, return FRAME's
  internal border width instead.  */)
   (Lisp_Object frame)
 {
@@ -4276,7 +4291,7 @@ gui_set_frame_parameters (struct frame *f, Lisp_Object 
alist)
     }
 
   /* Don't die if just one of these was set.  */
-  if (EQ (left, Qunbound))
+  if (BASE_EQ (left, Qunbound))
     {
       left_no_change = 1;
       if (f->left_pos < 0)
@@ -4284,7 +4299,7 @@ gui_set_frame_parameters (struct frame *f, Lisp_Object 
alist)
       else
        XSETINT (left, f->left_pos);
     }
-  if (EQ (top, Qunbound))
+  if (BASE_EQ (top, Qunbound))
     {
       top_no_change = 1;
       if (f->top_pos < 0)
@@ -5442,7 +5457,7 @@ gui_frame_get_and_record_arg (struct frame *f, 
Lisp_Object alist,
 
   value = gui_display_get_arg (FRAME_DISPLAY_INFO (f), alist, param,
                                attribute, class, type);
-  if (! NILP (value) && ! EQ (value, Qunbound))
+  if (! NILP (value) && ! BASE_EQ (value, Qunbound))
     store_frame_param (f, param, value);
 
   return value;
@@ -5463,7 +5478,7 @@ gui_default_parameter (struct frame *f, Lisp_Object 
alist, Lisp_Object prop,
   Lisp_Object tem;
 
   tem = gui_frame_get_arg (f, alist, prop, xprop, xclass, type);
-  if (EQ (tem, Qunbound))
+  if (BASE_EQ (tem, Qunbound))
     tem = deflt;
   AUTO_FRAME_ARG (arg, prop, tem);
   gui_set_frame_parameters (f, arg);
@@ -5725,9 +5740,9 @@ gui_figure_window_size (struct frame *f, Lisp_Object 
parms, bool tabbar_p,
 
   height = gui_display_get_arg (dpyinfo, parms, Qheight, 0, 0, 
RES_TYPE_NUMBER);
   width = gui_display_get_arg (dpyinfo, parms, Qwidth, 0, 0, RES_TYPE_NUMBER);
-  if (!EQ (width, Qunbound) || !EQ (height, Qunbound))
+  if (!BASE_EQ (width, Qunbound) || !BASE_EQ (height, Qunbound))
     {
-      if (!EQ (width, Qunbound))
+      if (!BASE_EQ (width, Qunbound))
        {
          if (CONSP (width) && EQ (XCAR (width), Qtext_pixels))
            {
@@ -5763,7 +5778,7 @@ gui_figure_window_size (struct frame *f, Lisp_Object 
parms, bool tabbar_p,
            }
        }
 
-      if (!EQ (height, Qunbound))
+      if (!BASE_EQ (height, Qunbound))
        {
          if (CONSP (height) && EQ (XCAR (height), Qtext_pixels))
            {
@@ -5801,7 +5816,7 @@ gui_figure_window_size (struct frame *f, Lisp_Object 
parms, bool tabbar_p,
 
       user_size = gui_display_get_arg (dpyinfo, parms, Quser_size, 0, 0,
                                        RES_TYPE_NUMBER);
-      if (!NILP (user_size) && !EQ (user_size, Qunbound))
+      if (!NILP (user_size) && !BASE_EQ (user_size, Qunbound))
        window_prompting |= USSize;
       else
        window_prompting |= PSize;
@@ -5814,7 +5829,7 @@ gui_figure_window_size (struct frame *f, Lisp_Object 
parms, bool tabbar_p,
   left = gui_display_get_arg (dpyinfo, parms, Qleft, 0, 0, RES_TYPE_NUMBER);
   user_position = gui_display_get_arg (dpyinfo, parms, Quser_position, 0, 0,
                                        RES_TYPE_NUMBER);
-  if (! EQ (top, Qunbound) || ! EQ (left, Qunbound))
+  if (! BASE_EQ (top, Qunbound) || ! BASE_EQ (left, Qunbound))
     {
       if (EQ (top, Qminus))
        {
@@ -5837,7 +5852,7 @@ gui_figure_window_size (struct frame *f, Lisp_Object 
parms, bool tabbar_p,
       else if (FLOATP (top))
        f->top_pos = frame_float (f, top, FRAME_FLOAT_TOP, &parent_done,
                                  &outer_done, 0);
-      else if (EQ (top, Qunbound))
+      else if (BASE_EQ (top, Qunbound))
        f->top_pos = 0;
       else
        {
@@ -5867,7 +5882,7 @@ gui_figure_window_size (struct frame *f, Lisp_Object 
parms, bool tabbar_p,
       else if (FLOATP (left))
        f->left_pos = frame_float (f, left, FRAME_FLOAT_LEFT, &parent_done,
                                   &outer_done, 0);
-      else if (EQ (left, Qunbound))
+      else if (BASE_EQ (left, Qunbound))
        f->left_pos = 0;
       else
        {
@@ -5876,7 +5891,7 @@ gui_figure_window_size (struct frame *f, Lisp_Object 
parms, bool tabbar_p,
            window_prompting |= XNegative;
        }
 
-      if (!NILP (user_position) && ! EQ (user_position, Qunbound))
+      if (!NILP (user_position) && ! BASE_EQ (user_position, Qunbound))
        window_prompting |= USPosition;
       else
        window_prompting |= PPosition;
diff --git a/src/frame.h b/src/frame.h
index 4942e640d2..458b6257e4 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -127,6 +127,7 @@ struct frame
   /* This frame's selected window.
      Each frame has its own window hierarchy
      and one of the windows in it is selected within the frame.
+     This window may be the mini-window of the frame, if any.
      The selected window of the selected frame is Emacs's selected window.  */
   Lisp_Object selected_window;
 
@@ -1292,8 +1293,28 @@ SET_FRAME_VISIBLE (struct frame *f, int v)
 }
 
 /* Set iconified status of frame F.  */
-#define SET_FRAME_ICONIFIED(f, i)                              \
-  (f)->iconified = (eassert (0 <= (i) && (i) <= 1), (i))
+INLINE void
+SET_FRAME_ICONIFIED (struct frame *f, int i)
+{
+#ifdef HAVE_WINDOW_SYSTEM
+  Lisp_Object frame;
+#endif
+
+  eassert (0 <= (i) && (i) <= 1);
+
+  f->iconified = i;
+
+#ifdef HAVE_WINDOW_SYSTEM
+  /* Iconifying a frame might cause the frame title to change if no
+     title was explicitly specified.  Force the frame title to be
+     recomputed.  */
+
+  XSETFRAME (frame, f);
+
+  if (FRAME_WINDOW_P (f))
+    gui_consider_frame_title (frame);
+#endif
+}
 
 extern Lisp_Object selected_frame;
 extern Lisp_Object old_selected_frame;
diff --git a/src/ftcrfont.c b/src/ftcrfont.c
index 98a28af5f2..6bb41110d5 100644
--- a/src/ftcrfont.c
+++ b/src/ftcrfont.c
@@ -37,6 +37,9 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include "font.h"
 #include "ftfont.h"
 #include "pdumper.h"
+#ifdef HAVE_PGTK
+#include "xsettings.h"
+#endif
 
 #ifdef USE_BE_CAIRO
 #define RED_FROM_ULONG(color)  (((color) >> 16) & 0xff)
@@ -168,7 +171,12 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int 
pixel_size)
   cairo_matrix_t font_matrix, ctm;
   cairo_matrix_init_scale (&font_matrix, pixel_size, pixel_size);
   cairo_matrix_init_identity (&ctm);
+
+#ifdef HAVE_PGTK
+  cairo_font_options_t *options = xsettings_get_font_options ();
+#else
   cairo_font_options_t *options = cairo_font_options_create ();
+#endif
 #ifdef USE_BE_CAIRO
   if (be_use_subpixel_antialiasing ())
     cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_SUBPIXEL);
@@ -624,6 +632,28 @@ ftcrfont_draw (struct glyph_string *s,
   return len;
 }
 
+#ifdef HAVE_PGTK
+/* Determine if FONT_OBJECT is a valid cached font for ENTITY by
+   comparing the options used to open it with the user's current
+   preferences specified via GSettings.  */
+static bool
+ftcrfont_cached_font_ok (struct frame *f, Lisp_Object font_object,
+                        Lisp_Object entity)
+{
+  struct font_info *info = (struct font_info *) XFONT_OBJECT (font_object);
+
+  cairo_font_options_t *options = cairo_font_options_create ();
+  cairo_scaled_font_get_font_options (info->cr_scaled_font, options);
+  cairo_font_options_t *gsettings_options = xsettings_get_font_options ();
+
+  bool equal = cairo_font_options_equal (options, gsettings_options);
+  cairo_font_options_destroy (options);
+  cairo_font_options_destroy (gsettings_options);
+
+  return equal;
+}
+#endif
+
 #ifdef HAVE_HARFBUZZ
 
 static Lisp_Object
@@ -694,6 +724,9 @@ struct font_driver const ftcrfont_driver =
 #endif
   .filter_properties = ftfont_filter_properties,
   .combining_capability = ftfont_combining_capability,
+#ifdef HAVE_PGTK
+  .cached_font_ok = ftcrfont_cached_font_ok
+#endif
   };
 #ifdef HAVE_HARFBUZZ
 struct font_driver ftcrhbfont_driver;
diff --git a/src/ftfont.c b/src/ftfont.c
index 5797300d23..301a145b7a 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -645,8 +645,29 @@ ftfont_get_open_type_spec (Lisp_Object otf_spec)
   return spec;
 }
 
+#if defined HAVE_XFT && defined FC_COLOR
+static bool
+xft_color_font_whitelisted_p (const char *family)
+{
+  Lisp_Object tem, name;
+
+  tem = Vxft_color_font_whitelist;
+
+  FOR_EACH_TAIL_SAFE (tem)
+    {
+      name = XCAR (tem);
+
+      if (STRINGP (name) && !strcmp (family, SSDATA (name)))
+       return true;
+    }
+
+  return false;
+}
+#endif
+
 static FcPattern *
-ftfont_spec_pattern (Lisp_Object spec, char *otlayout, struct OpenTypeSpec 
**otspec, const char **langname)
+ftfont_spec_pattern (Lisp_Object spec, char *otlayout,
+                    struct OpenTypeSpec **otspec, const char **langname)
 {
   Lisp_Object tmp, extra;
   FcPattern *pattern = NULL;
@@ -785,6 +806,8 @@ ftfont_spec_pattern (Lisp_Object spec, char *otlayout, 
struct OpenTypeSpec **ots
   /* We really don't like color fonts, they cause Xft crashes.  See
      Bug#30874.  */
   if (xft_ignore_color_fonts
+      && (NILP (AREF (spec, FONT_FAMILY_INDEX))
+         || NILP (Vxft_color_font_whitelist))
       && ! FcPatternAddBool (pattern, FC_COLOR, FcFalse))
     goto err;
 #endif
@@ -930,7 +953,12 @@ ftfont_list (struct frame *f, Lisp_Object spec)
            returns them even when it shouldn't really do so, so we
            need to manually skip them here (Bug#37786).  */
         FcBool b;
+       FcChar8 *str;
+
         if (xft_ignore_color_fonts
+           && (FcPatternGetString (fontset->fonts[i], FC_FAMILY,
+                                   0, &str) != FcResultMatch
+               || !xft_color_font_whitelisted_p ((char *) str))
             && FcPatternGetBool (fontset->fonts[i], FC_COLOR, 0, &b)
             == FcResultMatch && b != FcFalse)
             continue;
diff --git a/src/gtkutil.c b/src/gtkutil.c
index a2ab01d02c..f2018bc01f 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -736,67 +736,74 @@ xg_check_special_colors (struct frame *f,
                          const char *color_name,
                          Emacs_Color *color)
 {
-  bool success_p = 0;
-  bool get_bg = strcmp ("gtk_selection_bg_color", color_name) == 0;
-  bool get_fg = !get_bg && strcmp ("gtk_selection_fg_color", color_name) == 0;
+  bool success_p;
+  bool get_bg;
+  bool get_fg;
+#ifdef HAVE_GTK3
+  GtkStyleContext *gsty;
+  GdkRGBA col;
+  char buf[sizeof "rgb://rrrr/gggg/bbbb"];
+  int state;
+  GdkRGBA *c;
+  unsigned short r, g, b;
+#else
+  GtkStyle *gsty;
+  GdkColor *grgb;
+#endif
+
+  get_bg = !strcmp ("gtk_selection_bg_color", color_name);
+  get_fg = !get_bg && !strcmp ("gtk_selection_fg_color", color_name);
+  success_p = false;
 
-  if (! FRAME_GTK_WIDGET (f) || ! (get_bg || get_fg))
+#ifdef HAVE_PGTK
+  while (FRAME_PARENT_FRAME (f))
+    f = FRAME_PARENT_FRAME (f);
+#endif
+
+  if (!FRAME_GTK_WIDGET (f) || !(get_bg || get_fg))
     return success_p;
 
   block_input ();
-  {
 #ifdef HAVE_GTK3
-#ifndef HAVE_PGTK
-    GtkStyleContext *gsty
-      = gtk_widget_get_style_context (FRAME_GTK_OUTER_WIDGET (f));
-#else
-    GtkStyleContext *gsty
-      = gtk_widget_get_style_context (FRAME_WIDGET (f));
-#endif
-    GdkRGBA col;
-    char buf[sizeof "rgb://rrrr/gggg/bbbb"];
-    int state = GTK_STATE_FLAG_SELECTED|GTK_STATE_FLAG_FOCUSED;
-    if (get_fg)
-      gtk_style_context_get_color (gsty, state, &col);
-    else
-      {
-        GdkRGBA *c;
-        /* FIXME: Retrieving the background color is deprecated in
-           GTK+ 3.16.  New versions of GTK+ don't use the concept of a
-           single background color any more, so we shouldn't query for
-           it.  */
-        gtk_style_context_get (gsty, state,
-                               GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &c,
-                               NULL);
-        col = *c;
-        gdk_rgba_free (c);
-      }
+  gsty = gtk_widget_get_style_context (FRAME_GTK_OUTER_WIDGET (f));
+  state = GTK_STATE_FLAG_SELECTED | GTK_STATE_FLAG_FOCUSED;
 
-    unsigned short
-      r = col.red * 65535,
-      g = col.green * 65535,
-      b = col.blue * 65535;
+  if (get_fg)
+    gtk_style_context_get_color (gsty, state, &col);
+  else
+    {
+      /* FIXME: Retrieving the background color is deprecated in
+        GTK+ 3.16.  New versions of GTK+ don't use the concept of a
+        single background color any more, so we shouldn't query for
+        it.  */
+      gtk_style_context_get (gsty, state,
+                            GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &c,
+                            NULL);
+      col = *c;
+      gdk_rgba_free (c);
+    }
+
+  r = col.red * 65535;
+  g = col.green * 65535;
+  b = col.blue * 65535;
 #ifndef HAVE_PGTK
-    sprintf (buf, "rgb:%04x/%04x/%04x", r, g, b);
-    success_p = x_parse_color (f, buf, color) != 0;
+  sprintf (buf, "rgb:%04x/%04x/%04x", r, g, b);
+  success_p = x_parse_color (f, buf, color) != 0;
 #else
-    sprintf (buf, "#%04x%04x%04x", r, g, b);
-    success_p = pgtk_parse_color (f, buf, color) != 0;
+  sprintf (buf, "#%04x%04x%04x", r, g, b);
+  success_p = pgtk_parse_color (f, buf, color) != 0;
 #endif
 #else
-    GtkStyle *gsty = gtk_widget_get_style (FRAME_GTK_WIDGET (f));
-    GdkColor *grgb = get_bg
-      ? &gsty->bg[GTK_STATE_SELECTED]
-      : &gsty->fg[GTK_STATE_SELECTED];
+  gsty = gtk_widget_get_style (FRAME_GTK_WIDGET (f));
+  grgb = (get_bg ? &gsty->bg[GTK_STATE_SELECTED]
+         : &gsty->fg[GTK_STATE_SELECTED]);
 
-    color->red = grgb->red;
-    color->green = grgb->green;
-    color->blue = grgb->blue;
-    color->pixel = grgb->pixel;
-    success_p = 1;
+  color->red = grgb->red;
+  color->green = grgb->green;
+  color->blue = grgb->blue;
+  color->pixel = grgb->pixel;
+  success_p = 1;
 #endif
-
-  }
   unblock_input ();
   return success_p;
 }
@@ -6395,6 +6402,9 @@ xg_widget_key_press_event_cb (GtkWidget *widget, GdkEvent 
*event,
   if (!f)
     return true;
 
+  if (popup_activated ())
+    return true;
+
 #ifdef HAVE_XINPUT2
   pending_keystroke_time
     = FRAME_DISPLAY_INFO (f)->pending_keystroke_time;
diff --git a/src/haiku_draw_support.cc b/src/haiku_draw_support.cc
index a8d46d000a..f0cc084bb3 100644
--- a/src/haiku_draw_support.cc
+++ b/src/haiku_draw_support.cc
@@ -285,11 +285,32 @@ BView_DrawBitmap (void *view, void *bitmap, int x, int y,
   BView *vw = get_view (view);
   BBitmap *bm = (BBitmap *) bitmap;
 
-  vw->PushState ();
   vw->SetDrawingMode (B_OP_OVER);
   vw->DrawBitmap (bm, BRect (x, y, x + width - 1, y + height - 1),
                  BRect (vx, vy, vx + vwidth - 1, vy + vheight - 1));
-  vw->PopState ();
+  vw->SetDrawingMode (B_OP_COPY);
+}
+
+void
+BView_DrawBitmapTiled (void *view, void *bitmap, int x, int y,
+                      int width, int height, int vx, int vy,
+                      int vwidth, int vheight)
+{
+  BView *vw = get_view (view);
+  BBitmap *bm = (BBitmap *) bitmap;
+  BRect bounds = bm->Bounds ();
+
+  if (width == -1)
+    width = BE_RECT_WIDTH (bounds);
+
+  if (height == -1)
+    height = BE_RECT_HEIGHT (bounds);
+
+  vw->SetDrawingMode (B_OP_OVER);
+  vw->DrawBitmap (bm, BRect (x, y, x + width - 1, y + height - 1),
+                 BRect (vx, vy, vx + vwidth - 1, vy + vheight - 1),
+                 B_TILE_BITMAP);
+  vw->SetDrawingMode (B_OP_COPY);
 }
 
 void
@@ -300,17 +321,22 @@ BView_DrawBitmapWithEraseOp (void *view, void *bitmap, 
int x,
   BBitmap *bm = (BBitmap *) bitmap;
   BBitmap bc (bm->Bounds (), B_RGBA32);
   BRect rect (x, y, x + width - 1, y + height - 1);
+  uint32_t *bits;
+  size_t stride;
+  rgb_color low_color;
+  BRect bounds;
 
   if (bc.InitCheck () != B_OK || bc.ImportBits (bm) != B_OK)
     return;
 
-  uint32_t *bits = (uint32_t *) bc.Bits ();
-  size_t stride = bc.BytesPerRow ();
+  bits = (uint32_t *) bc.Bits ();
+  stride = bc.BytesPerRow ();
 
   if (bm->ColorSpace () == B_GRAY1)
     {
-      rgb_color low_color = vw->LowColor ();
-      BRect bounds = bc.Bounds ();
+      low_color = vw->LowColor ();
+      bounds = bc.Bounds ();
+
       for (int y = 0; y < BE_RECT_HEIGHT (bounds); ++y)
        {
          for (int x = 0; x < BE_RECT_WIDTH (bounds); ++x)
@@ -323,10 +349,11 @@ BView_DrawBitmapWithEraseOp (void *view, void *bitmap, 
int x,
        }
     }
 
-  vw->PushState ();
-  vw->SetDrawingMode (bm->ColorSpace () == B_GRAY1 ? B_OP_OVER : B_OP_ERASE);
+  vw->SetDrawingMode ((bm->ColorSpace ()
+                      == B_GRAY1)
+                     ? B_OP_OVER : B_OP_ERASE);
   vw->DrawBitmap (&bc, rect);
-  vw->PopState ();
+  vw->SetDrawingMode (B_OP_COPY);
 }
 
 void
@@ -357,6 +384,7 @@ BView_DrawMask (void *src, void *view,
   vw->SetDrawingMode (B_OP_OVER);
   vw->DrawBitmap (&bm, BRect (x, y, x + width - 1, y + height - 1),
                  BRect (vx, vy, vx + vwidth - 1, vy + vheight - 1));
+  vw->SetDrawingMode (B_OP_COPY);
 }
 
 static BBitmap *
@@ -475,3 +503,40 @@ BView_InvertRect (void *view, int x, int y, int width, int 
height)
 
   vw->InvertRect (BRect (x, y, x + width - 1, y + height - 1));
 }
+
+static void
+be_draw_cross_on_pixmap_1 (BBitmap *bitmap, int x, int y, int width,
+                          int height, uint32_t color)
+{
+  BBitmap dest (bitmap->Bounds (),
+               bitmap->ColorSpace (),
+               true, false);
+  BView view (bitmap->Bounds (), NULL, B_FOLLOW_NONE, 0);
+  rgb_color high_color;
+
+  rgb32_to_rgb_color (color, &high_color);
+  dest.ImportBits (bitmap);
+
+  if (!dest.Lock ())
+    return;
+
+  dest.AddChild (&view);
+
+  view.SetHighColor (high_color);
+  view.StrokeLine (BPoint (x, y),
+                  BPoint (x + width - 1, y + height - 1));
+  view.StrokeLine (BPoint (x, y + height - 1),
+                  BPoint (x + width - 1, y));
+  view.RemoveSelf ();
+  bitmap->ImportBits (&dest);
+}
+
+void
+be_draw_cross_on_pixmap (void *bitmap, int x, int y, int width,
+                        int height, uint32_t color)
+{
+  BBitmap *target = (BBitmap *) bitmap;
+
+  be_draw_cross_on_pixmap_1 (target, x, y, width, height,
+                            color);
+}
diff --git a/src/haiku_io.c b/src/haiku_io.c
index 5d0031ef71..d345527685 100644
--- a/src/haiku_io.c
+++ b/src/haiku_io.c
@@ -105,6 +105,8 @@ haiku_len (enum haiku_event_type type)
       return sizeof (struct haiku_menu_bar_left_event);
     case SCROLL_BAR_PART_EVENT:
       return sizeof (struct haiku_scroll_bar_part_event);
+    case SCREEN_CHANGED_EVENT:
+      return sizeof (struct haiku_screen_changed_event);
     }
 
   emacs_abort ();
diff --git a/src/haiku_select.cc b/src/haiku_select.cc
index a26a0049cb..764001f62b 100644
--- a/src/haiku_select.cc
+++ b/src/haiku_select.cc
@@ -28,29 +28,64 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 
 #include "haikuselect.h"
 
+/* The clipboard object representing the primary selection.  */
 static BClipboard *primary = NULL;
+
+/* The clipboard object representing the secondary selection.  */
 static BClipboard *secondary = NULL;
+
+/* The clipboard object used by other programs, representing the
+   clipboard.  */
 static BClipboard *system_clipboard = NULL;
+
+/* The number of times the system clipboard has changed.  */
 static int64 count_clipboard = -1;
+
+/* The number of times the primary selection has changed.  */
 static int64 count_primary = -1;
+
+/* The number of times the secondary selection has changed.  */
 static int64 count_secondary = -1;
 
+static BClipboard *
+get_clipboard_object (enum haiku_clipboard clipboard)
+{
+  switch (clipboard)
+    {
+    case CLIPBOARD_PRIMARY:
+      return primary;
+
+    case CLIPBOARD_SECONDARY:
+      return secondary;
+
+    case CLIPBOARD_CLIPBOARD:
+      return system_clipboard;
+    }
+
+  abort ();
+}
+
 static char *
-BClipboard_find_data (BClipboard *cb, const char *type, ssize_t *len)
+be_find_clipboard_data_1 (BClipboard *cb, const char *type, ssize_t *len)
 {
+  BMessage *data;
+  const char *ptr;
+  ssize_t nbytes;
+  void *value;
+
   if (!cb->Lock ())
-    return 0;
+    return NULL;
+
+  data = cb->Data ();
 
-  BMessage *dat = cb->Data ();
-  if (!dat)
+  if (!data)
     {
       cb->Unlock ();
-      return 0;
+      return NULL;
     }
 
-  const char *ptr;
-  ssize_t bt;
-  dat->FindData (type, B_MIME_TYPE, (const void **) &ptr, &bt);
+  data->FindData (type, B_MIME_TYPE, (const void **) &ptr,
+                 &nbytes);
 
   if (!ptr)
     {
@@ -59,9 +94,9 @@ BClipboard_find_data (BClipboard *cb, const char *type, 
ssize_t *len)
     }
 
   if (len)
-    *len = bt;
+    *len = nbytes;
 
-  void *data = malloc (bt);
+  value = malloc (nbytes);
 
   if (!data)
     {
@@ -69,13 +104,14 @@ BClipboard_find_data (BClipboard *cb, const char *type, 
ssize_t *len)
       return NULL;
     }
 
-  memcpy (data, ptr, bt);
+  memcpy (value, ptr, nbytes);
   cb->Unlock ();
-  return (char *) data;
+
+  return (char *) value;
 }
 
 static void
-BClipboard_get_targets (BClipboard *cb, char **buf, int buf_size)
+be_get_clipboard_targets_1 (BClipboard *cb, char **buf, int buf_size)
 {
   BMessage *data;
   char *name;
@@ -122,142 +158,125 @@ BClipboard_get_targets (BClipboard *cb, char **buf, int 
buf_size)
 }
 
 static void
-BClipboard_set_data (BClipboard *cb, const char *type, const char *dat,
-                    ssize_t len, bool clear)
+be_set_clipboard_data_1 (BClipboard *cb, const char *type, const char *data,
+                        ssize_t len, bool clear)
 {
+  BMessage *message_data;
+
   if (!cb->Lock ())
     return;
 
   if (clear)
     cb->Clear ();
 
-  BMessage *mdat = cb->Data ();
-  if (!mdat)
+  message_data = cb->Data ();
+
+  if (!message_data)
     {
       cb->Unlock ();
       return;
     }
 
-  if (dat)
+  if (data)
     {
-      if (mdat->ReplaceData (type, B_MIME_TYPE, dat, len)
+      if (message_data->ReplaceData (type, B_MIME_TYPE, data, len)
          == B_NAME_NOT_FOUND)
-       mdat->AddData (type, B_MIME_TYPE, dat, len);
+       message_data->AddData (type, B_MIME_TYPE, data, len);
     }
   else
-    mdat->RemoveName (type);
+    message_data->RemoveName (type);
+
   cb->Commit ();
   cb->Unlock ();
 }
 
-char *
-BClipboard_find_system_data (const char *type, ssize_t *len)
-{
-  if (!system_clipboard)
-    return 0;
-
-  return BClipboard_find_data (system_clipboard, type, len);
-}
-
-char *
-BClipboard_find_primary_selection_data (const char *type, ssize_t *len)
-{
-  if (!primary)
-    return 0;
-
-  return BClipboard_find_data (primary, type, len);
-}
-
-char *
-BClipboard_find_secondary_selection_data (const char *type, ssize_t *len)
-{
-  if (!secondary)
-    return 0;
-
-  return BClipboard_find_data (secondary, type, len);
-}
-
-void
-BClipboard_set_system_data (const char *type, const char *data,
-                           ssize_t len, bool clear)
-{
-  if (!system_clipboard)
-    return;
-
-  count_clipboard = system_clipboard->SystemCount ();
-  BClipboard_set_data (system_clipboard, type, data, len, clear);
-}
-
 void
-BClipboard_set_primary_selection_data (const char *type, const char *data,
-                                      ssize_t len, bool clear)
+be_update_clipboard_count (enum haiku_clipboard id)
 {
-  if (!primary)
-    return;
+  switch (id)
+    {
+    case CLIPBOARD_CLIPBOARD:
+      count_clipboard = system_clipboard->SystemCount ();
+      break;
 
-  count_primary = primary->SystemCount ();
-  BClipboard_set_data (primary, type, data, len, clear);
-}
+    case CLIPBOARD_PRIMARY:
+      count_primary = primary->SystemCount ();
+      break;
 
-void
-BClipboard_set_secondary_selection_data (const char *type, const char *data,
-                                        ssize_t len, bool clear)
-{
-  if (!secondary)
-    return;
-
-  count_secondary = secondary->SystemCount ();
-  BClipboard_set_data (secondary, type, data, len, clear);
+    case CLIPBOARD_SECONDARY:
+      count_secondary = secondary->SystemCount ();
+      break;
+    }
 }
 
-void
-BClipboard_free_data (void *ptr)
+char *
+be_find_clipboard_data (enum haiku_clipboard id, const char *type,
+                       ssize_t *len)
 {
-  std::free (ptr);
+  return be_find_clipboard_data_1 (get_clipboard_object (id),
+                                  type, len);
 }
 
 void
-BClipboard_system_targets (char **buf, int len)
+be_set_clipboard_data (enum haiku_clipboard id, const char *type,
+                      const char *data, ssize_t len, bool clear)
 {
-  BClipboard_get_targets (system_clipboard, buf, len);
-}
+  be_update_clipboard_count (id);
 
-void
-BClipboard_primary_targets (char **buf, int len)
-{
-  BClipboard_get_targets (primary, buf, len);
+  be_set_clipboard_data_1 (get_clipboard_object (id), type,
+                          data, len, clear);
 }
 
 void
-BClipboard_secondary_targets (char **buf, int len)
+be_get_clipboard_targets (enum haiku_clipboard id, char **targets,
+                         int len)
 {
-  BClipboard_get_targets (secondary, buf, len);
+  be_get_clipboard_targets_1 (get_clipboard_object (id), targets,
+                             len);
 }
 
-bool
-BClipboard_owns_clipboard (void)
+static bool
+clipboard_owner_p (void)
 {
   return (count_clipboard >= 0
          && (count_clipboard + 1
              == system_clipboard->SystemCount ()));
 }
 
-bool
-BClipboard_owns_primary (void)
+static bool
+primary_owner_p (void)
 {
   return (count_primary >= 0
          && (count_primary + 1
              == primary->SystemCount ()));
 }
 
-bool
-BClipboard_owns_secondary (void)
+static bool
+secondary_owner_p (void)
 {
   return (count_secondary >= 0
          && (count_secondary + 1
              == secondary->SystemCount ()));
 }
 
+bool
+be_clipboard_owner_p (enum haiku_clipboard clipboard)
+{
+  switch (clipboard)
+    {
+    case CLIPBOARD_PRIMARY:
+      return primary_owner_p ();
+
+    case CLIPBOARD_SECONDARY:
+      return secondary_owner_p ();
+
+    case CLIPBOARD_CLIPBOARD:
+      return clipboard_owner_p ();
+    }
+
+  abort ();
+}
+
 void
 init_haiku_select (void)
 {
@@ -443,12 +462,7 @@ be_lock_clipboard_message (enum haiku_clipboard clipboard,
 {
   BClipboard *board;
 
-  if (clipboard == CLIPBOARD_PRIMARY)
-    board = primary;
-  else if (clipboard == CLIPBOARD_SECONDARY)
-    board = secondary;
-  else
-    board = system_clipboard;
+  board = get_clipboard_object (clipboard);
 
   if (!board->Lock ())
     return 1;
@@ -465,12 +479,7 @@ be_unlock_clipboard (enum haiku_clipboard clipboard, bool 
discard)
 {
   BClipboard *board;
 
-  if (clipboard == CLIPBOARD_PRIMARY)
-    board = primary;
-  else if (clipboard == CLIPBOARD_SECONDARY)
-    board = secondary;
-  else
-    board = system_clipboard;
+  board = get_clipboard_object (clipboard);
 
   if (discard)
     board->Revert ();
diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 5dfb25d6dd..182f212847 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -17,10 +17,12 @@ You should have received a copy of the GNU General Public 
License
 along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
+#include <attribute.h>
 
 #include <app/Application.h>
 #include <app/Cursor.h>
 #include <app/Messenger.h>
+#include <app/Roster.h>
 
 #include <interface/GraphicsDefs.h>
 #include <interface/InterfaceDefs.h>
@@ -81,8 +83,6 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include <csignal>
 #include <cfloat>
 
-#include <pthread.h>
-
 #ifdef USE_BE_CAIRO
 #include <cairo.h>
 #endif
@@ -107,6 +107,7 @@ enum
     SET_FONT_INDICES     = 3012,
     SET_PREVIEW_DIALOG   = 3013,
     UPDATE_PREVIEW_DIALOG = 3014,
+    SEND_MOVE_FRAME_EVENT = 3015,
   };
 
 /* X11 keysyms that we use.  */
@@ -142,7 +143,7 @@ struct font_selection_dialog_message
   /* Whether or not font selection was cancelled.  */
   bool_bf cancel : 1;
 
-  /* Whether or not a size was explictly specified.  */
+  /* Whether or not a size was explicitly specified.  */
   bool_bf size_specified : 1;
 
   /* The index of the selected font family.  */
@@ -155,44 +156,45 @@ struct font_selection_dialog_message
   int size;
 };
 
+/* The color space of the main screen.  B_NO_COLOR_SPACE means it has
+   not yet been computed.  */
 static color_space dpy_color_space = B_NO_COLOR_SPACE;
-static key_map *key_map = NULL;
-static char *key_chars = NULL;
+
+/* The keymap, or NULL if it has not been initialized.  */
+static key_map *key_map;
+
+/* Indices of characters into the keymap.  */
+static char *key_chars;
+
+/* Lock around keymap data, since it's touched from different
+   threads.  */
 static BLocker key_map_lock;
 
 /* The locking semantics of BWindows running in multiple threads are
    so complex that child frame state (which is the only state that is
    shared between different BWindows at runtime) does best with a
    single global lock.  */
-
 static BLocker child_frame_lock;
 
-/* A LeaveNotify event (well, the closest equivalent on Haiku, which
-   is a B_MOUSE_MOVED event with `transit' set to B_EXITED_VIEW) might
-   be sent out-of-order with regards to motion events from other
-   windows, such as when the mouse pointer rapidly moves from an
-   undecorated child frame to its parent.  This can cause a failure to
-   clear the mouse face on the former if an event for the latter is
-   read by Emacs first and ends up showing the mouse face there.
-
-   While this lock doesn't really ensure that the events will be
-   delivered in the correct order, it makes them arrive in the correct
-   order "most of the time" on my machine, which is good enough and
-   preferable to adding a lot of extra complexity to the event
-   handling code to sort motion events by their timestamps.
-
-   Obviously this depends on the number of execution units that are
-   available, and the scheduling priority of each thread involved in
-   the input handling, but it will be good enough for most people.  */
-
-static BLocker movement_locker;
-
+/* Variable where the popup menu thread returns the chosen menu
+   item.  */
 static BMessage volatile *popup_track_message;
+
+/* Variable in which alert dialog threads return the selected button
+   number.  */
 static int32 volatile alert_popup_value;
+
+/* The current window ID.  This is increased every time a frame is
+   created.  */
 static int current_window_id;
 
-static void *grab_view = NULL;
+/* The view that has the passive grab.  */
+static void *grab_view;
+
+/* The locker for that variable.  */
 static BLocker grab_view_locker;
+
+/* Whether or not a drag-and-drop operation is in progress.  */
 static bool drag_and_drop_in_progress;
 
 /* Many places require us to lock the child frame data, and then lock
@@ -448,13 +450,143 @@ map_normal (uint32_t kc, uint32_t *ch)
   key_map_lock.Unlock ();
 }
 
+static BRect
+get_zoom_rect (BWindow *window)
+{
+  BScreen screen;
+  BDeskbar deskbar;
+  BRect screen_frame;
+  BRect frame;
+  BRect deskbar_frame;
+  BRect window_frame;
+  BRect decorator_frame;
+
+  if (!screen.IsValid ())
+    gui_abort ("Failed to calculate screen rect");
+
+  screen_frame = frame = screen.Frame ();
+  deskbar_frame = deskbar.Frame ();
+
+  if (!(modifiers () & B_SHIFT_KEY) && !deskbar.IsAutoHide ())
+    {
+      switch (deskbar.Location ())
+       {
+       case B_DESKBAR_TOP:
+         frame.top = deskbar_frame.bottom + 2;
+         break;
+
+       case B_DESKBAR_BOTTOM:
+       case B_DESKBAR_LEFT_BOTTOM:
+       case B_DESKBAR_RIGHT_BOTTOM:
+         frame.bottom = deskbar_frame.top - 2;
+         break;
+
+       case B_DESKBAR_LEFT_TOP:
+         if (!deskbar.IsExpanded ())
+           frame.top = deskbar_frame.bottom + 2;
+         else if (!deskbar.IsAlwaysOnTop ()
+                  && !deskbar.IsAutoRaise ())
+           frame.left = deskbar_frame.right + 2;
+         break;
+
+       default:
+         if (deskbar.IsExpanded ()
+             && !deskbar.IsAlwaysOnTop ()
+             && !deskbar.IsAutoRaise ())
+           frame.right = deskbar_frame.left - 2;
+       }
+    }
+
+  if (window)
+    {
+      window_frame = window->Frame ();
+      decorator_frame = window->DecoratorFrame ();
+
+      frame.top += (window_frame.top
+                   - decorator_frame.top);
+      frame.bottom -= (decorator_frame.bottom
+                      - window_frame.bottom);
+      frame.left += (window_frame.left
+                    - decorator_frame.left);
+      frame.right -= (decorator_frame.right
+                     - window_frame.right);
+
+      if (frame.top > deskbar_frame.bottom
+         || frame.bottom < deskbar_frame.top)
+       {
+         frame.left = screen_frame.left + (window_frame.left
+                                           - decorator_frame.left);
+         frame.right = screen_frame.right - (decorator_frame.right
+                                             - window_frame.right);
+       }
+    }
+
+  return frame;
+}
+
+/* Invisible window used to get B_SCREEN_CHANGED events.  */
+class EmacsScreenChangeMonitor : public BWindow
+{
+  BRect previous_screen_frame;
+
+public:
+  EmacsScreenChangeMonitor (void) : BWindow (BRect (-100, -100, 0, 0), "",
+                                            B_NO_BORDER_WINDOW_LOOK,
+                                            B_FLOATING_ALL_WINDOW_FEEL,
+                                            B_AVOID_FRONT | B_AVOID_FOCUS)
+  {
+    BScreen screen (this);
+
+    if (!screen.IsValid ())
+      return;
+
+    previous_screen_frame = screen.Frame ();
+
+    /* Immediately show this window upon creation.  It will not steal
+       the focus or become visible.  */
+    Show ();
+
+    if (!LockLooper ())
+      return;
+
+    Hide ();
+    UnlockLooper ();
+  }
+
+  void
+  DispatchMessage (BMessage *msg, BHandler *handler)
+  {
+    struct haiku_screen_changed_event rq;
+    BRect frame;
+
+    if (msg->what == B_SCREEN_CHANGED)
+      {
+       if (msg->FindInt64 ("when", &rq.when) != B_OK)
+         rq.when = 0;
+
+       if (msg->FindRect ("frame", &frame) != B_OK
+           || frame != previous_screen_frame)
+         {
+           haiku_write (SCREEN_CHANGED_EVENT, &rq);
+
+           if (frame.IsValid ())
+             previous_screen_frame = frame;
+         }
+      }
+
+    BWindow::DispatchMessage (msg, handler);
+  }
+};
+
 class Emacs : public BApplication
 {
 public:
   BMessage settings;
-  bool settings_valid_p = false;
+  bool settings_valid_p;
+  EmacsScreenChangeMonitor *monitor;
 
-  Emacs () : BApplication ("application/x-vnd.GNU-emacs")
+  Emacs (void) : BApplication ("application/x-vnd.GNU-emacs"),
+                settings_valid_p (false)
   {
     BPath settings_path;
 
@@ -470,6 +602,15 @@ public:
       return;
 
     settings_valid_p = true;
+    monitor = new EmacsScreenChangeMonitor;
+  }
+
+  ~Emacs (void)
+  {
+    if (monitor->LockLooper ())
+      monitor->Quit ();
+    else
+      delete monitor;
   }
 
   void
@@ -518,33 +659,42 @@ public:
     struct child_frame *next;
     int xoff, yoff;
     EmacsWindow *window;
-  } *subset_windows = NULL;
+  } *subset_windows;
 
-  EmacsWindow *parent = NULL;
+  EmacsWindow *parent;
   BRect pre_fullscreen_rect;
   BRect pre_zoom_rect;
-  int x_before_zoom = INT_MIN;
-  int y_before_zoom = INT_MIN;
-  bool fullscreen_p = false;
-  bool zoomed_p = false;
-  bool shown_flag = false;
-  volatile int was_shown_p = 0;
-  bool menu_bar_active_p = false;
-  bool override_redirect_p = false;
+  int x_before_zoom;
+  int y_before_zoom;
+  bool shown_flag;
+  volatile bool was_shown_p;
+  bool menu_bar_active_p;
+  bool override_redirect_p;
   window_look pre_override_redirect_look;
   window_feel pre_override_redirect_feel;
   uint32 pre_override_redirect_workspaces;
   int window_id;
-  bool *menus_begun = NULL;
+  bool *menus_begun;
   enum haiku_z_group z_group;
-  bool tooltip_p = false;
+  bool tooltip_p;
+  enum haiku_fullscreen_mode fullscreen_mode;
 
   EmacsWindow () : BWindow (BRect (0, 0, 0, 0), "", B_TITLED_WINDOW_LOOK,
-                           B_NORMAL_WINDOW_FEEL, 
B_NO_SERVER_SIDE_WINDOW_MODIFIERS)
+                           B_NORMAL_WINDOW_FEEL, 
B_NO_SERVER_SIDE_WINDOW_MODIFIERS),
+                  subset_windows (NULL),
+                  parent (NULL),
+                  x_before_zoom (INT_MIN),
+                  y_before_zoom (INT_MIN),
+                  shown_flag (false),
+                  was_shown_p (false),
+                  menu_bar_active_p (false),
+                  override_redirect_p (false),
+                  window_id (current_window_id),
+                  menus_begun (NULL),
+                  z_group (Z_GROUP_NONE),
+                  tooltip_p (false),
+                  fullscreen_mode (FULLSCREEN_MODE_NONE)
   {
-    window_id = current_window_id++;
-    z_group = Z_GROUP_NONE;
-
     /* This pulse rate is used by scroll bars for repeating a button
        action while a button is held down.  */
     SetPulseRate (30000);
@@ -583,77 +733,6 @@ public:
       SetFeel (B_NORMAL_WINDOW_FEEL);
   }
 
-  BRect
-  CalculateZoomRect (void)
-  {
-    BScreen screen (this);
-    BDeskbar deskbar;
-    BRect screen_frame;
-    BRect frame;
-    BRect deskbar_frame;
-    BRect window_frame;
-    BRect decorator_frame;
-
-    if (!screen.IsValid ())
-      gui_abort ("Failed to calculate screen rect");
-
-    screen_frame = frame = screen.Frame ();
-    deskbar_frame = deskbar.Frame ();
-
-    if (!(modifiers () & B_SHIFT_KEY) && !deskbar.IsAutoHide ())
-      {
-       switch (deskbar.Location ())
-         {
-         case B_DESKBAR_TOP:
-           frame.top = deskbar_frame.bottom + 2;
-           break;
-
-         case B_DESKBAR_BOTTOM:
-         case B_DESKBAR_LEFT_BOTTOM:
-         case B_DESKBAR_RIGHT_BOTTOM:
-           frame.bottom = deskbar_frame.top - 2;
-           break;
-
-         case B_DESKBAR_LEFT_TOP:
-           if (!deskbar.IsExpanded ())
-             frame.top = deskbar_frame.bottom + 2;
-           else if (!deskbar.IsAlwaysOnTop ()
-                    && !deskbar.IsAutoRaise ())
-             frame.left = deskbar_frame.right + 2;
-           break;
-
-         default:
-           if (deskbar.IsExpanded ()
-               && !deskbar.IsAlwaysOnTop ()
-               && !deskbar.IsAutoRaise ())
-             frame.right = deskbar_frame.left - 2;
-         }
-      }
-
-    window_frame = Frame ();
-    decorator_frame = DecoratorFrame ();
-
-    frame.top += (window_frame.top
-                 - decorator_frame.top);
-    frame.bottom -= (decorator_frame.bottom
-                    - window_frame.bottom);
-    frame.left += (window_frame.left
-                  - decorator_frame.left);
-    frame.right -= (decorator_frame.right
-                   - window_frame.right);
-
-    if (frame.top > deskbar_frame.bottom
-       || frame.bottom < deskbar_frame.top)
-      {
-       frame.left = screen_frame.left + (window_frame.left
-                                         - decorator_frame.left);
-       frame.right = screen_frame.right - (decorator_frame.right
-                                           - window_frame.right);
-      }
-
-    return frame;
-  }
-
   void
   UpwardsSubset (EmacsWindow *w)
   {
@@ -711,12 +790,6 @@ public:
     RecomputeFeel ();
     UpwardsUnSubsetChildren (parent);
     this->RemoveFromSubset (this);
-
-    if (fullscreen_p)
-      {
-       fullscreen_p = 0;
-       MakeFullscreen (1);
-      }
     child_frame_lock.Unlock ();
   }
 
@@ -766,11 +839,6 @@ public:
     this->AddToSubset (this);
     if (!IsHidden () && this->parent)
       UpwardsSubsetChildren (parent);
-    if (fullscreen_p)
-      {
-       fullscreen_p = 0;
-       MakeFullscreen (1);
-      }
     window->LinkChild (this);
 
     child_frame_lock.Unlock ();
@@ -796,12 +864,24 @@ public:
     subset_windows = f;
   }
 
+  void
+  MoveToIncludingFrame (int x, int y)
+  {
+    BRect decorator, frame;
+
+    decorator = DecoratorFrame ();
+    frame = Frame ();
+
+    MoveTo (x + frame.left - decorator.left,
+           y + frame.top - decorator.top);
+  }
+
   void
   DoMove (struct child_frame *f)
   {
     BRect frame = this->Frame ();
-    f->window->MoveTo (frame.left + f->xoff,
-                      frame.top + f->yoff);
+    f->window->MoveToIncludingFrame (frame.left + f->xoff,
+                                    frame.top + f->yoff);
   }
 
   void
@@ -982,6 +1062,15 @@ public:
            haiku_write (WHEEL_MOVE_EVENT, &rq);
          };
       }
+    else if (msg->what == SEND_MOVE_FRAME_EVENT)
+      FrameMoved (Frame ().LeftTop ());
+    else if (msg->what == B_SCREEN_CHANGED)
+      {
+       if (fullscreen_mode != FULLSCREEN_MODE_NONE)
+         SetFullscreen (fullscreen_mode);
+
+       BWindow::DispatchMessage (msg, handler);
+      }
     else
       BWindow::DispatchMessage (msg, handler);
   }
@@ -1015,41 +1104,66 @@ public:
   {
     struct haiku_resize_event rq;
     rq.window = this;
-    rq.px_heightf = newHeight + 1.0f;
-    rq.px_widthf = newWidth + 1.0f;
+    rq.width = newWidth + 1.0f;
+    rq.height = newHeight + 1.0f;
 
     haiku_write (FRAME_RESIZED, &rq);
     BWindow::FrameResized (newWidth, newHeight);
   }
 
   void
-  FrameMoved (BPoint newPosition)
+  FrameMoved (BPoint new_position)
   {
     struct haiku_move_event rq;
+    BRect frame, decorator_frame;
+    struct child_frame *f;
+
+    if (fullscreen_mode == FULLSCREEN_MODE_WIDTH
+       && new_position.x != 0)
+      {
+       MoveTo (0, new_position.y);
+       return;
+      }
+
+    if (fullscreen_mode == FULLSCREEN_MODE_HEIGHT
+       && new_position.y != 0)
+      {
+       MoveTo (new_position.x, 0);
+       return;
+      }
+
     rq.window = this;
-    rq.x = std::lrint (newPosition.x);
-    rq.y = std::lrint (newPosition.y);
+    rq.x = std::lrint (new_position.x);
+    rq.y = std::lrint (new_position.y);
+
+    frame = Frame ();
+    decorator_frame = DecoratorFrame ();
+
+    rq.decorator_width
+      = std::lrint (frame.left - decorator_frame.left);
+    rq.decorator_height
+      = std::lrint (frame.top - decorator_frame.top);
 
     haiku_write (MOVE_EVENT, &rq);
 
     CHILD_FRAME_LOCK_INSIDE_LOOPER_CALLBACK
       {
-       for (struct child_frame *f = subset_windows;
-            f; f = f->next)
+       for (f = subset_windows; f; f = f->next)
          DoMove (f);
        child_frame_lock.Unlock ();
 
-       BWindow::FrameMoved (newPosition);
+       BWindow::FrameMoved (new_position);
       }
   }
 
   void
   WorkspacesChanged (uint32_t old, uint32_t n)
   {
+    struct child_frame *f;
+
     CHILD_FRAME_LOCK_INSIDE_LOOPER_CALLBACK
       {
-       for (struct child_frame *f = subset_windows;
-            f; f = f->next)
+       for (f = subset_windows; f; f = f->next)
          DoUpdateWorkspace (f);
 
        child_frame_lock.Unlock ();
@@ -1063,7 +1177,7 @@ public:
       gui_abort ("Failed to lock child frame state lock");
 
     if (!this->parent)
-      this->MoveTo (x, y);
+      this->MoveToIncludingFrame (x, y);
     else
       this->parent->MoveChild (this, x, y, 0);
     child_frame_lock.Unlock ();
@@ -1135,66 +1249,113 @@ public:
     child_frame_lock.Unlock ();
   }
 
-  void
-  Zoom (BPoint o, float w, float h)
+  BRect
+  ClearFullscreen (enum haiku_fullscreen_mode target_mode)
   {
-    struct haiku_zoom_event rq;
-    BRect rect;
-    rq.window = this;
-
-    if (fullscreen_p)
-      MakeFullscreen (0);
+    BRect original_frame;
 
-    if (!zoomed_p)
-      {
-       pre_zoom_rect = Frame ();
-       zoomed_p = true;
-       rect = CalculateZoomRect ();
-      }
-    else
+    switch (fullscreen_mode)
       {
-       zoomed_p = false;
-       rect = pre_zoom_rect;
-      }
+      case FULLSCREEN_MODE_MAXIMIZED:
+       original_frame = pre_zoom_rect;
 
-    rq.zoomed = zoomed_p;
-    haiku_write (ZOOM_EVENT, &rq);
+       if (target_mode == FULLSCREEN_MODE_NONE)
+         BWindow::Zoom (pre_zoom_rect.LeftTop (),
+                        BE_RECT_WIDTH (pre_zoom_rect) - 1,
+                        BE_RECT_HEIGHT (pre_zoom_rect) - 1);
+       break;
+
+      case FULLSCREEN_MODE_BOTH:
+      case FULLSCREEN_MODE_HEIGHT:
+      case FULLSCREEN_MODE_WIDTH:
+       original_frame = pre_fullscreen_rect;
+       SetFlags (Flags () & ~(B_NOT_MOVABLE
+                              | B_NOT_ZOOMABLE
+                              | B_NOT_RESIZABLE));
+
+       if (target_mode != FULLSCREEN_MODE_NONE)
+         goto out;
+
+       MoveTo (pre_fullscreen_rect.LeftTop ());
+       ResizeTo (BE_RECT_WIDTH (pre_fullscreen_rect) - 1,
+                 BE_RECT_HEIGHT (pre_fullscreen_rect) - 1);
+       break;
+
+      case FULLSCREEN_MODE_NONE:
+       original_frame = Frame ();
+       break;
+      }
 
-    BWindow::Zoom (rect.LeftTop (), BE_RECT_WIDTH (rect) - 1,
-                  BE_RECT_HEIGHT (rect) - 1);
+  out:
+    fullscreen_mode = FULLSCREEN_MODE_NONE;
+    return original_frame;
   }
 
-  void
-  UnZoom (void)
+  BRect
+  FullscreenRectForMode (enum haiku_fullscreen_mode mode)
   {
-    if (!zoomed_p)
-      return;
+    BScreen screen (this);
+    BRect frame;
+
+    if (!screen.IsValid ())
+      return BRect (0, 0, 0, 0);
+
+    frame = screen.Frame ();
+
+    if (mode == FULLSCREEN_MODE_HEIGHT)
+      frame.right -= BE_RECT_WIDTH (frame) / 2;
+    else if (mode == FULLSCREEN_MODE_WIDTH)
+      frame.bottom -= BE_RECT_HEIGHT (frame) / 2;
 
-    BWindow::Zoom ();
+    return frame;
   }
 
   void
-  GetParentWidthHeight (int *width, int *height)
+  SetFullscreen (enum haiku_fullscreen_mode mode)
   {
-    if (!child_frame_lock.Lock ())
-      gui_abort ("Failed to lock child frame state lock");
+    BRect zoom_rect, frame;
 
-    if (parent)
-      {
-       BRect frame = parent->Frame ();
-       *width = BE_RECT_WIDTH (frame);
-       *height = BE_RECT_HEIGHT (frame);
-      }
-    else
+    frame = ClearFullscreen (mode);
+
+    switch (mode)
       {
-       BScreen s (this);
-       BRect frame = s.Frame ();
+      case FULLSCREEN_MODE_MAXIMIZED:
+       pre_zoom_rect = frame;
+       zoom_rect = get_zoom_rect (this);
+       BWindow::Zoom (zoom_rect.LeftTop (),
+                      BE_RECT_WIDTH (zoom_rect) - 1,
+                      BE_RECT_HEIGHT (zoom_rect) - 1);
+       break;
+
+      case FULLSCREEN_MODE_BOTH:
+       SetFlags (Flags () | B_NOT_MOVABLE);
+       FALLTHROUGH;
+
+      case FULLSCREEN_MODE_HEIGHT:
+      case FULLSCREEN_MODE_WIDTH:
+       SetFlags (Flags () | B_NOT_ZOOMABLE | B_NOT_RESIZABLE);
+       pre_fullscreen_rect = frame;
+       zoom_rect = FullscreenRectForMode (mode);
+       ResizeTo (BE_RECT_WIDTH (zoom_rect) - 1,
+                 BE_RECT_HEIGHT (zoom_rect) - 1);
+       MoveTo (zoom_rect.left, zoom_rect.top);
+       break;
 
-       *width = BE_RECT_WIDTH (frame);
-       *height = BE_RECT_HEIGHT (frame);
+      case FULLSCREEN_MODE_NONE:
+       break;
       }
 
-    child_frame_lock.Unlock ();
+    fullscreen_mode = mode;
+  }
+
+  void
+  Zoom (BPoint origin, float width, float height)
+  {
+    struct haiku_zoom_event rq;
+
+    rq.window = this;
+    rq.fullscreen_mode = fullscreen_mode;
+    haiku_write (ZOOM_EVENT, &rq);
   }
 
   void
@@ -1217,53 +1378,6 @@ public:
     child_frame_lock.Lock ();
     gui_abort ("Trying to calculate offsets for a child frame that doesn't 
exist");
   }
-
-  void
-  MakeFullscreen (int make_fullscreen_p)
-  {
-    BScreen screen (this);
-
-    if (!screen.IsValid ())
-      gui_abort ("Trying to make a window fullscreen without a screen");
-
-    UnZoom ();
-
-    if (make_fullscreen_p == fullscreen_p)
-      return;
-
-    fullscreen_p = make_fullscreen_p;
-    uint32 flags = Flags ();
-    if (fullscreen_p)
-      {
-       if (zoomed_p)
-         UnZoom ();
-
-       flags |= B_NOT_MOVABLE | B_NOT_ZOOMABLE;
-       pre_fullscreen_rect = Frame ();
-
-       if (!child_frame_lock.Lock ())
-         gui_abort ("Failed to lock child frame state lock");
-
-       if (parent)
-         parent->OffsetChildRect (&pre_fullscreen_rect, this);
-
-       child_frame_lock.Unlock ();
-
-       int w, h;
-       EmacsMoveTo (0, 0);
-       GetParentWidthHeight (&w, &h);
-       ResizeTo (w - 1, h - 1);
-      }
-    else
-      {
-       flags &= ~(B_NOT_MOVABLE | B_NOT_ZOOMABLE);
-       EmacsMoveTo (pre_fullscreen_rect.left,
-                    pre_fullscreen_rect.top);
-       ResizeTo (BE_RECT_WIDTH (pre_fullscreen_rect) - 1,
-                 BE_RECT_HEIGHT (pre_fullscreen_rect) - 1);
-      }
-    SetFlags (flags);
-  }
 };
 
 class EmacsMenuBar : public BMenuBar
@@ -1322,11 +1436,7 @@ public:
        rq.y = std::lrint (point.y);
        rq.window = this->Window ();
 
-       if (movement_locker.Lock ())
-         {
-           haiku_write (MENU_BAR_LEFT, &rq);
-           movement_locker.Unlock ();
-         }
+       haiku_write (MENU_BAR_LEFT, &rq);
       }
 
     BMenuBar::MouseMoved (point, transit, msg);
@@ -1383,25 +1493,36 @@ public:
 class EmacsView : public BView
 {
 public:
-  uint32_t previous_buttons = 0;
-  int looper_locked_count = 0;
+  uint32_t previous_buttons;
+  int looper_locked_count;
   BRegion sb_region;
   BRegion invalid_region;
 
-  BView *offscreen_draw_view = NULL;
-  BBitmap *offscreen_draw_bitmap_1 = NULL;
-  BBitmap *copy_bitmap = NULL;
+  BView *offscreen_draw_view;
+  BBitmap *offscreen_draw_bitmap_1;
+  BBitmap *copy_bitmap;
 
 #ifdef USE_BE_CAIRO
-  cairo_surface_t *cr_surface = NULL;
-  cairo_t *cr_context = NULL;
+  cairo_surface_t *cr_surface;
+  cairo_t *cr_context;
   BLocker cr_surface_lock;
 #endif
 
   BPoint tt_absl_pos;
-  BMessage *wait_for_release_message = NULL;
-
-  EmacsView () : BView (BRect (0, 0, 0, 0), "Emacs", B_FOLLOW_NONE, 
B_WILL_DRAW)
+  BMessage *wait_for_release_message;
+
+  EmacsView () : BView (BRect (0, 0, 0, 0), "Emacs",
+                       B_FOLLOW_NONE, B_WILL_DRAW),
+                previous_buttons (0),
+                looper_locked_count (0),
+                offscreen_draw_view (NULL),
+                offscreen_draw_bitmap_1 (NULL),
+                copy_bitmap (NULL),
+#ifdef USE_BE_CAIRO
+                cr_surface (NULL),
+                cr_context (NULL),
+#endif
+                wait_for_release_message (NULL)
   {
 
   }
@@ -1549,9 +1670,7 @@ public:
 #endif
 
        if (looper_locked_count)
-         {
-           offscreen_draw_bitmap_1->Lock ();
-         }
+         offscreen_draw_bitmap_1->Lock ();
 
        UnlockLooper ();
       }
@@ -1618,16 +1737,17 @@ public:
        copy_bitmap = NULL;
       }
     if (!copy_bitmap)
-      copy_bitmap = new BBitmap (offscreen_draw_bitmap_1);
+      {
+       copy_bitmap = new BBitmap (offscreen_draw_bitmap_1);
+       SetViewBitmap (copy_bitmap, Frame (),
+                      Frame (), B_FOLLOW_NONE, 0);
+      }
     else
       copy_bitmap->ImportBits (offscreen_draw_bitmap_1);
 
     if (copy_bitmap->InitCheck () != B_OK)
       gui_abort ("Failed to init copy bitmap during buffer flip");
 
-    SetViewBitmap (copy_bitmap,
-                  Frame (), Frame (), B_FOLLOW_NONE, 0);
-
     Invalidate (&invalid_region);
     invalid_region.MakeEmpty ();
     UnlockLooper ();
@@ -1668,8 +1788,11 @@ public:
     struct haiku_mouse_motion_event rq;
     int32 windowid;
     EmacsWindow *window;
+    BToolTip *tooltip;
 
     window = (EmacsWindow *) Window ();
+    tooltip = ToolTip ();
+
     rq.just_exited_p = transit == B_EXITED_VIEW;
     rq.x = point.x;
     rq.y = point.y;
@@ -1684,9 +1807,9 @@ public:
     else
       rq.dnd_message = false;
 
-    if (ToolTip ())
-      ToolTip ()->SetMouseRelativeLocation (BPoint (-(point.x - tt_absl_pos.x),
-                                                   -(point.y - 
tt_absl_pos.y)));
+    if (tooltip)
+      tooltip->SetMouseRelativeLocation (BPoint (-(point.x - tt_absl_pos.x),
+                                                -(point.y - tt_absl_pos.y)));
 
     if (!grab_view_locker.Lock ())
       gui_abort ("Couldn't lock grab view locker");
@@ -1699,18 +1822,14 @@ public:
 
     grab_view_locker.Unlock ();
 
-    if (movement_locker.Lock ())
-      {
-       haiku_write (MOUSE_MOTION, &rq);
-       movement_locker.Unlock ();
-      }
+    haiku_write (MOUSE_MOTION, &rq);
   }
 
   void
-  MouseDown (BPoint point)
+  BasicMouseDown (BPoint point, BView *scroll_bar)
   {
     struct haiku_button_event rq;
-    uint32 buttons;
+    uint32 mods, buttons;
 
     this->GetMouse (&point, &buttons, false);
 
@@ -1721,6 +1840,7 @@ public:
     grab_view_locker.Unlock ();
 
     rq.window = this->Window ();
+    rq.scroll_bar = scroll_bar;
 
     if (!(previous_buttons & B_PRIMARY_MOUSE_BUTTON)
        && (buttons & B_PRIMARY_MOUSE_BUTTON))
@@ -1739,7 +1859,7 @@ public:
     rq.x = point.x;
     rq.y = point.y;
 
-    uint32_t mods = modifiers ();
+    mods = modifiers ();
 
     rq.modifiers = 0;
     if (mods & B_SHIFT_KEY)
@@ -1754,18 +1874,25 @@ public:
     if (mods & B_OPTION_KEY)
       rq.modifiers |= HAIKU_MODIFIER_SUPER;
 
-    SetMouseEventMask (B_POINTER_EVENTS, (B_LOCK_WINDOW_FOCUS
-                                         | B_NO_POINTER_HISTORY));
+    if (!scroll_bar)
+      SetMouseEventMask (B_POINTER_EVENTS, (B_LOCK_WINDOW_FOCUS
+                                           | B_NO_POINTER_HISTORY));
 
     rq.time = system_time ();
     haiku_write (BUTTON_DOWN, &rq);
   }
 
   void
-  MouseUp (BPoint point)
+  MouseDown (BPoint point)
+  {
+    BasicMouseDown (point, NULL);
+  }
+
+  void
+  BasicMouseUp (BPoint point, BView *scroll_bar)
   {
     struct haiku_button_event rq;
-    uint32 buttons;
+    uint32 buttons, mods;
 
     this->GetMouse (&point, &buttons, false);
 
@@ -1786,6 +1913,7 @@ public:
       }
 
     rq.window = this->Window ();
+    rq.scroll_bar = scroll_bar;
 
     if ((previous_buttons & B_PRIMARY_MOUSE_BUTTON)
        && !(buttons & B_PRIMARY_MOUSE_BUTTON))
@@ -1804,7 +1932,7 @@ public:
     rq.x = point.x;
     rq.y = point.y;
 
-    uint32_t mods = modifiers ();
+    mods = modifiers ();
 
     rq.modifiers = 0;
     if (mods & B_SHIFT_KEY)
@@ -1819,37 +1947,48 @@ public:
     if (mods & B_OPTION_KEY)
       rq.modifiers |= HAIKU_MODIFIER_SUPER;
 
-    if (!buttons)
-      SetMouseEventMask (0, 0);
-
     rq.time = system_time ();
     haiku_write (BUTTON_UP, &rq);
   }
+
+  void
+  MouseUp (BPoint point)
+  {
+    BasicMouseUp (point, NULL);
+  }
 };
 
 class EmacsScrollBar : public BScrollBar
 {
 public:
-  int dragging = 0;
+  int dragging;
   bool horizontal;
   enum haiku_scroll_bar_part current_part;
   float old_value;
   scroll_bar_info info;
 
   /* True if button events should be passed to the parent.  */
-  bool handle_button = false;
-  bool in_overscroll = false;
-  bool can_overscroll = false;
-  bool maybe_overscroll = false;
+  bool handle_button;
+  bool in_overscroll;
+  bool can_overscroll;
+  bool maybe_overscroll;
   BPoint last_overscroll;
   int last_reported_overscroll_value;
   int max_value, real_max_value;
   int overscroll_start_value;
   bigtime_t repeater_start;
-
-  EmacsScrollBar (int x, int y, int x1, int y1, bool horizontal_p) :
-    BScrollBar (BRect (x, y, x1, y1), NULL, NULL, 0, 0, horizontal_p ?
-               B_HORIZONTAL : B_VERTICAL)
+  EmacsView *parent;
+
+  EmacsScrollBar (int x, int y, int x1, int y1, bool horizontal_p,
+                 EmacsView *parent)
+    : BScrollBar (BRect (x, y, x1, y1), NULL, NULL, 0, 0, horizontal_p ?
+                 B_HORIZONTAL : B_VERTICAL),
+      dragging (0),
+      handle_button (false),
+      in_overscroll (false),
+      can_overscroll (false),
+      maybe_overscroll (false),
+      parent (parent)
   {
     BView *vw = (BView *) this;
     vw->SetResizingMode (B_FOLLOW_NONE);
@@ -2050,7 +2189,6 @@ public:
     BLooper *looper;
     BMessage *message;
     int32 buttons, mods;
-    BView *parent;
 
     looper = Looper ();
     message = NULL;
@@ -2071,8 +2209,9 @@ public:
       {
        /* Allow C-mouse-3 to split the window on a scroll bar.   */
        handle_button = true;
-       parent = Parent ();
-       parent->MouseDown (ConvertToParent (pt));
+       SetMouseEventMask (B_POINTER_EVENTS, (B_SUSPEND_VIEW_FOCUS
+                                             | B_LOCK_WINDOW_FOCUS));
+       parent->BasicMouseDown (ConvertToParent (pt), this);
 
        return;
       }
@@ -2135,7 +2274,6 @@ public:
   MouseUp (BPoint pt)
   {
     struct haiku_scroll_bar_drag_event rq;
-    BView *parent;
 
     in_overscroll = false;
     maybe_overscroll = false;
@@ -2143,8 +2281,7 @@ public:
     if (handle_button)
       {
        handle_button = false;
-       parent = Parent ();
-       parent->MouseUp (ConvertToParent (pt));
+       parent->BasicMouseUp (ConvertToParent (pt), this);
 
        return;
       }
@@ -2179,11 +2316,7 @@ public:
        rq.y = std::lrint (conv.y);
        rq.window = this->Window ();
 
-       if (movement_locker.Lock ())
-         {
-           haiku_write (MENU_BAR_LEFT, &rq);
-           movement_locker.Unlock ();
-         }
+       haiku_write (MENU_BAR_LEFT, &rq);
       }
 
     if (in_overscroll)
@@ -2280,30 +2413,26 @@ public:
 class EmacsMenuItem : public BMenuItem
 {
 public:
-  int menu_bar_id = -1;
-  void *menu_ptr = NULL;
-  void *wind_ptr = NULL;
-  char *key = NULL;
-  char *help = NULL;
-
-  EmacsMenuItem (const char *ky,
-                const char *str,
-                const char *help,
-                BMessage *message = NULL) : BMenuItem (str, message)
+  int menu_bar_id;
+  void *menu_ptr;
+  void *wind_ptr;
+  char *key;
+  char *help;
+
+  EmacsMenuItem (const char *key_label, const char *label,
+                const char *help, BMessage *message = NULL)
+    : BMenuItem (label, message),
+      menu_bar_id (-1),
+      menu_ptr (NULL),
+      wind_ptr (NULL),
+      key (NULL),
+      help (NULL)
   {
-    if (ky)
-      {
-       key = strdup (ky);
-       if (!key)
-         gui_abort ("strdup failed");
-      }
+    if (key_label)
+      key = strdup (key_label);
 
     if (help)
-      {
-       this->help = strdup (help);
-       if (!this->help)
-         gui_abort ("strdup failed");
-      }
+      this->help = strdup (help);
   }
 
   ~EmacsMenuItem ()
@@ -2383,22 +2512,6 @@ public:
   }
 };
 
-class EmacsPopUpMenu : public BPopUpMenu
-{
-public:
-  EmacsPopUpMenu (const char *name) : BPopUpMenu (name, 0)
-  {
-
-  }
-
-  void
-  FrameResized (float w, float h)
-  {
-    Invalidate ();
-    BPopUpMenu::FrameResized (w, h);
-  }
-};
-
 class EmacsFontPreviewDialog : public BWindow
 {
   BStringView text_view;
@@ -2618,13 +2731,22 @@ class EmacsFontSelectionDialog : public BWindow
   void
   UpdateStylesForIndex (int idx)
   {
-    int n, i;
+    int n, i, previous_selection;
     uint32 flags;
     font_family family;
     font_style style;
     BStringItem *item;
+    char *current_style;
 
     n = all_styles.CountItems ();
+    current_style = NULL;
+    previous_selection = font_style_pane.CurrentSelection ();
+
+    if (previous_selection >= 0)
+      {
+       item = all_styles.ItemAt (previous_selection);
+       current_style = strdup (item->Text ());
+      }
 
     font_style_pane.MakeEmpty ();
     all_styles.MakeEmpty ();
@@ -2640,6 +2762,10 @@ class EmacsFontSelectionDialog : public BWindow
            else
              item = new BStringItem ("<error>");
 
+           if (current_style && pending_selection_idx < 0
+               && !strcmp (current_style, style))
+             pending_selection_idx = i;
+
            font_style_pane.AddItem (item);
            all_styles.AddItem (item);
          }
@@ -2653,6 +2779,9 @@ class EmacsFontSelectionDialog : public BWindow
 
     pending_selection_idx = -1;
     UpdateForSelectedStyle ();
+
+    if (current_style)
+      free (current_style);
   }
 
   bool
@@ -3361,56 +3490,28 @@ BView_resize_to (void *view, int width, int height)
   vw->UnlockLooper ();
 }
 
-void *
-BCursor_create_default (void)
-{
-  return new BCursor (B_CURSOR_ID_SYSTEM_DEFAULT);
-}
-
-void *
-BCursor_create_modeline (void)
-{
-  return new BCursor (B_CURSOR_ID_CONTEXT_MENU);
-}
-
-void *
-BCursor_from_id (enum haiku_cursor cursor)
-{
-  return new BCursor ((enum BCursorID) cursor);
-}
-
-void *
-BCursor_create_i_beam (void)
-{
-  return new BCursor (B_CURSOR_ID_I_BEAM);
-}
-
-void *
-BCursor_create_progress_cursor (void)
+void
+be_delete_cursor (void *cursor)
 {
-  return new BCursor (B_CURSOR_ID_PROGRESS);
+  if (cursor)
+    delete (BCursor *) cursor;
 }
 
 void *
-BCursor_create_grab (void)
-{
-  return new BCursor (B_CURSOR_ID_GRAB);
-}
-
-void
-BCursor_delete (void *cursor)
+be_create_cursor_from_id (int id)
 {
-  if (cursor)
-    delete (BCursor *) cursor;
+  return new BCursor ((enum BCursorID) id);
 }
 
 void
 BView_set_view_cursor (void *view, void *cursor)
 {
-  if (!((BView *) view)->LockLooper ())
+  BView *v = (BView *) view;
+
+  if (!v->LockLooper ())
     gui_abort ("Failed to lock view setting cursor");
-  ((BView *) view)->SetViewCursor ((BCursor *) cursor);
-  ((BView *) view)->UnlockLooper ();
+  v->SetViewCursor ((BCursor *) cursor);
+  v->UnlockLooper ();
 }
 
 void
@@ -3421,20 +3522,22 @@ BWindow_Flush (void *window)
 
 /* Make a scrollbar, attach it to VIEW's window, and return it.  */
 void *
-BScrollBar_make_for_view (void *view, int horizontal_p,
-                         int x, int y, int x1, int y1,
-                         void *scroll_bar_ptr)
+be_make_scroll_bar_for_view (void *view, int horizontal_p,
+                            int x, int y, int x1, int y1)
 {
-  EmacsScrollBar *sb = new EmacsScrollBar (x, y, x1, y1, horizontal_p);
+  EmacsScrollBar *scroll_bar;
   BView *vw = (BView *) view;
-  BView *sv = (BView *) sb;
 
   if (!vw->LockLooper ())
     gui_abort ("Failed to lock scrollbar owner");
-  vw->AddChild ((BView *) sb);
-  sv->WindowActivated (vw->Window ()->IsActive ());
+
+  scroll_bar = new EmacsScrollBar (x, y, x1, y1, horizontal_p,
+                                  (EmacsView *) vw);
+
+  vw->AddChild (scroll_bar);
   vw->UnlockLooper ();
-  return sb;
+
+  return scroll_bar;
 }
 
 void
@@ -3599,17 +3702,6 @@ BBitmap_import_fringe_bitmap (void *bitmap, unsigned 
short *bits, int wd, int h)
     }
 }
 
-void
-BBitmap_import_mono_bits (void *bitmap, void *bits, int wd, int h)
-{
-  BBitmap *bmp = (BBitmap *) bitmap;
-
-  if (wd % 8)
-    wd += 8 - (wd % 8);
-
-  bmp->ImportBits (bits, wd / 8 * h, wd / 8, 0, B_GRAY1);
-}
-
 /* Make a scrollbar at X, Y known to the view VIEW.  */
 void
 BView_publish_scroll_bar (void *view, int x, int y, int width, int height)
@@ -3768,7 +3860,8 @@ BView_emacs_delete (void *view)
 void *
 BPopUpMenu_new (const char *name)
 {
-  BPopUpMenu *menu = new EmacsPopUpMenu (name);
+  BPopUpMenu *menu = new BPopUpMenu (name);
+
   menu->SetRadioMode (0);
   return menu;
 }
@@ -3778,9 +3871,11 @@ BPopUpMenu_new (const char *name)
 void
 BMenu_add_title (void *menu, const char *text)
 {
-  EmacsTitleMenuItem *it = new EmacsTitleMenuItem (text);
-  BMenu *mn = (BMenu *) menu;
-  mn->AddItem (it);
+  BMenu *be_menu = (BMenu *) menu;
+  EmacsTitleMenuItem *it;
+
+  it = new EmacsTitleMenuItem (text);
+  be_menu->AddItem (it);
 }
 
 /* Add an item to the menu MENU.  */
@@ -4522,30 +4617,6 @@ be_popup_file_dialog (int open_p, const char 
*default_dir, int must_match_p,
   return file_name;
 }
 
-/* Zoom WINDOW.  */
-void
-BWindow_zoom (void *window)
-{
-  BWindow *w = (BWindow *) window;
-  w->Zoom ();
-}
-
-/* Make WINDOW fullscreen if FULLSCREEN_P.  */
-void
-EmacsWindow_make_fullscreen (void *window, int fullscreen_p)
-{
-  EmacsWindow *w = (EmacsWindow *) window;
-  w->MakeFullscreen (fullscreen_p);
-}
-
-/* Unzoom (maximize) WINDOW.  */
-void
-EmacsWindow_unzoom (void *window)
-{
-  EmacsWindow *w = (EmacsWindow *) window;
-  w->UnZoom ();
-}
-
 /* Move the pointer into MBAR and start tracking.  Return whether the
    menu bar was opened correctly.  */
 bool
@@ -5082,3 +5153,172 @@ BWindow_set_sticky (void *window, bool sticky)
       w->UnlockLooper ();
     }
 }
+
+status_t
+be_roster_launch (const char *type, const char *file, char **cargs,
+                 ptrdiff_t nargs, void *message, team_id *team_id)
+{
+  BEntry entry;
+  entry_ref ref;
+
+  if (type)
+    {
+      if (message)
+       return be_roster->Launch (type, (BMessage *) message,
+                                 team_id);
+
+      return be_roster->Launch (type, (nargs > INT_MAX
+                                      ? INT_MAX : nargs),
+                               cargs, team_id);
+    }
+
+  if (entry.SetTo (file) != B_OK)
+    return B_ERROR;
+
+  if (entry.GetRef (&ref) != B_OK)
+    return B_ERROR;
+
+  if (message)
+    return be_roster->Launch (&ref, (BMessage *) message,
+                             team_id);
+
+  return be_roster->Launch (&ref, (nargs > INT_MAX
+                                  ? INT_MAX : nargs),
+                           cargs, team_id);
+}
+
+void *
+be_create_pixmap_cursor (void *bitmap, int x, int y)
+{
+  BBitmap *bm;
+  BCursor *cursor;
+
+  bm = (BBitmap *) bitmap;
+  cursor = new BCursor (bm, BPoint (x, y));
+
+  if (cursor->InitCheck () != B_OK)
+    {
+      delete cursor;
+      return NULL;
+    }
+
+  return cursor;
+}
+
+void
+be_get_window_decorator_dimensions (void *window, int *left, int *top,
+                                   int *right, int *bottom)
+{
+  BWindow *wnd;
+  BRect frame, window_frame;
+
+  wnd = (BWindow *) window;
+
+  if (!wnd->LockLooper ())
+    gui_abort ("Failed to lock window looper frame");
+
+  frame = wnd->DecoratorFrame ();
+  window_frame = wnd->Frame ();
+
+  if (left)
+    *left = window_frame.left - frame.left;
+
+  if (top)
+    *top = window_frame.top - frame.top;
+
+  if (right)
+    *right = frame.right - window_frame.right;
+
+  if (bottom)
+    *bottom = frame.bottom - window_frame.bottom;
+
+  wnd->UnlockLooper ();
+}
+
+void
+be_get_window_decorator_frame (void *window, int *left, int *top,
+                              int *width, int *height)
+{
+  BWindow *wnd;
+  BRect frame;
+
+  wnd = (BWindow *) window;
+
+  if (!wnd->LockLooper ())
+    gui_abort ("Failed to lock window looper frame");
+
+  frame = wnd->DecoratorFrame ();
+
+  *left = frame.left;
+  *top = frame.top;
+  *width = BE_RECT_WIDTH (frame);
+  *height = BE_RECT_HEIGHT (frame);
+
+  wnd->UnlockLooper ();
+}
+
+/* Request that a MOVE_EVENT be sent for WINDOW.  This is so that
+   frame offsets can be updated after a frame parameter affecting
+   decorators changes.  Sending an event instead of updating the
+   offsets directly avoids race conditions where events with older
+   information are received after the update happens.  */
+void
+be_send_move_frame_event (void *window)
+{
+  BWindow *wnd = (BWindow *) window;
+  BMessenger msg (wnd);
+
+  msg.SendMessage (SEND_MOVE_FRAME_EVENT);
+}
+
+void
+be_lock_window (void *window)
+{
+  BWindow *wnd = (BWindow *) window;
+
+  if (!wnd->LockLooper ())
+    gui_abort ("Failed to lock window looper");
+}
+
+void
+be_unlock_window (void *window)
+{
+  BWindow *wnd = (BWindow *) window;
+
+  wnd->UnlockLooper ();
+}
+
+void
+be_set_window_fullscreen_mode (void *window, enum haiku_fullscreen_mode mode)
+{
+  EmacsWindow *w = (EmacsWindow *) window;
+
+  if (!w->LockLooper ())
+    gui_abort ("Failed to lock window to set fullscreen mode");
+
+  w->SetFullscreen (mode);
+  w->UnlockLooper ();
+}
+
+bool
+be_get_explicit_workarea (int *x, int *y, int *width, int *height)
+{
+  BDeskbar deskbar;
+  BRect zoom;
+  deskbar_location location;
+
+  location = deskbar.Location ();
+
+  if (location != B_DESKBAR_TOP
+      && location != B_DESKBAR_BOTTOM)
+    return false;
+
+  zoom = get_zoom_rect (NULL);
+
+  *x = zoom.left;
+  *y = zoom.top;
+  *width = BE_RECT_WIDTH (zoom);
+  *height = BE_RECT_HEIGHT (zoom);
+
+  return true;
+}
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 5ded9300d8..7f8d471b65 100644
--- a/src/haiku_support.h
+++ b/src/haiku_support.h
@@ -38,7 +38,21 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 
 enum haiku_cursor
   {
+    CURSOR_ID_SYSTEM_DEFAULT              = 1,
+    CURSOR_ID_CONTEXT_MENU                = 3,
+    CURSOR_ID_COPY                        = 4,
+    CURSOR_ID_CREATE_LINK                 = 29,
+    CURSOR_ID_CROSS_HAIR                  = 5,
+    CURSOR_ID_FOLLOW_LINK                 = 6,
+    CURSOR_ID_GRAB                        = 7,
+    CURSOR_ID_GRABBING                    = 8,
+    CURSOR_ID_HELP                        = 9,
+    CURSOR_ID_I_BEAM                      = 2,
+    CURSOR_ID_I_BEAM_HORIZONTAL                   = 10,
+    CURSOR_ID_MOVE                        = 11,
     CURSOR_ID_NO_CURSOR                           = 12,
+    CURSOR_ID_NOT_ALLOWED                 = 13,
+    CURSOR_ID_PROGRESS                    = 14,
     CURSOR_ID_RESIZE_NORTH                = 15,
     CURSOR_ID_RESIZE_EAST                 = 16,
     CURSOR_ID_RESIZE_SOUTH                = 17,
@@ -50,7 +64,9 @@ enum haiku_cursor
     CURSOR_ID_RESIZE_NORTH_SOUTH          = 23,
     CURSOR_ID_RESIZE_EAST_WEST            = 24,
     CURSOR_ID_RESIZE_NORTH_EAST_SOUTH_WEST = 25,
-    CURSOR_ID_RESIZE_NORTH_WEST_SOUTH_EAST = 26
+    CURSOR_ID_RESIZE_NORTH_WEST_SOUTH_EAST = 26,
+    CURSOR_ID_ZOOM_IN                     = 27,
+    CURSOR_ID_ZOOM_OUT                    = 28
   };
 
 enum haiku_z_group
@@ -96,9 +112,15 @@ enum haiku_event_type
     DRAG_AND_DROP_EVENT,
     APP_QUIT_REQUESTED_EVENT,
     DUMMY_EVENT,
-    MENU_BAR_LEFT
+    SCREEN_CHANGED_EVENT,
+    MENU_BAR_LEFT,
   };
 
+struct haiku_screen_changed_event
+{
+  bigtime_t when;
+};
+
 struct haiku_quit_requested_event
 {
   void *window;
@@ -107,8 +129,8 @@ struct haiku_quit_requested_event
 struct haiku_resize_event
 {
   void *window;
-  float px_heightf;
-  float px_widthf;
+  float width;
+  float height;
 };
 
 struct haiku_expose_event
@@ -187,6 +209,7 @@ struct haiku_menu_bar_click_event
 struct haiku_button_event
 {
   void *window;
+  void *scroll_bar;
   int btn_no;
   int modifiers;
   int x;
@@ -203,8 +226,9 @@ struct haiku_iconification_event
 struct haiku_move_event
 {
   void *window;
-  int x;
-  int y;
+  int x, y;
+  int decorator_width;
+  int decorator_height;
 };
 
 struct haiku_wheel_move_event
@@ -232,7 +256,7 @@ struct haiku_menu_bar_help_event
 struct haiku_zoom_event
 {
   void *window;
-  bool zoomed;
+  int fullscreen_mode;
 };
 
 enum haiku_font_specification
@@ -299,6 +323,15 @@ enum haiku_font_weight
     HAIKU_MEDIUM      = 2000,
   };
 
+enum haiku_fullscreen_mode
+  {
+    FULLSCREEN_MODE_NONE,
+    FULLSCREEN_MODE_WIDTH,
+    FULLSCREEN_MODE_HEIGHT,
+    FULLSCREEN_MODE_BOTH,
+    FULLSCREEN_MODE_MAXIMIZED,
+  };
+
 struct haiku_font_pattern
 {
   /* Bitmask indicating which fields are set.  */
@@ -421,32 +454,14 @@ struct haiku_session_manager_reply
    dimensions of a BRect, instead of relying on the broken Width and
    Height functions.  */
 
-#define BE_RECT_HEIGHT(rect) (ceil (((rect).bottom - (rect).top) + 1))
-#define BE_RECT_WIDTH(rect) (ceil (((rect).right - (rect).left) + 1))
+#define BE_RECT_HEIGHT(rect)   (ceil (((rect).bottom - (rect).top) + 1))
+#define BE_RECT_WIDTH(rect)    (ceil (((rect).right - (rect).left) + 1))
 #endif /* __cplusplus */
 
-/* C++ code cannot include lisp.h, but file dialogs need to be able
-   to bind to the specpdl and handle quitting correctly.  */
-
-#ifdef __cplusplus
-#if SIZE_MAX > 0xffffffff
-#define WRAP_SPECPDL_REF 1
-#endif
-#ifdef WRAP_SPECPDL_REF
-typedef struct { ptrdiff_t bytes; } specpdl_ref;
-#else
-typedef ptrdiff_t specpdl_ref;
-#endif
-
-#else
-#include "lisp.h"
-#endif
-
 #ifdef __cplusplus
 extern "C"
 {
 #endif
-#include <pthread.h>
 #include <OS.h>
 
 #ifdef __cplusplus
@@ -477,6 +492,8 @@ extern void hsl_color_rgb (double, double, double, uint32_t 
*);
 extern void *BBitmap_new (int, int, int);
 extern void *BBitmap_data (void *);
 extern int BBitmap_convert (void *, void **);
+extern void be_draw_cross_on_pixmap (void *, int, int, int, int,
+                                    uint32_t);
 
 extern void BBitmap_free (void *);
 
@@ -496,7 +513,6 @@ extern void BWindow_center_on_screen (void *);
 extern void BWindow_change_decoration (void *, int);
 extern void BWindow_set_tooltip_decoration (void *);
 extern void BWindow_set_avoid_focus (void *, int);
-extern void BWindow_zoom (void *);
 extern void BWindow_set_size_alignment (void *, int, int);
 extern void BWindow_sync (void *);
 extern void BWindow_send_behind (void *, void *);
@@ -541,6 +557,8 @@ extern void BView_DrawBitmap (void *, void *, int, int, 
int, int, int, int,
 extern void BView_DrawBitmapWithEraseOp (void *, void *, int, int, int, int);
 extern void BView_DrawMask (void *, void *, int, int, int, int,        int, 
int,
                            int, int, uint32_t);
+extern void BView_DrawBitmapTiled (void *, void *, int, int,
+                                  int, int, int, int, int, int);
 
 extern void BView_resize_to (void *, int, int);
 extern void BView_set_view_cursor (void *, void *);
@@ -554,15 +572,11 @@ extern void be_get_display_resolution (double *, double 
*);
 extern void be_get_screen_dimensions (int *, int *);
 
 /* Functions for creating and freeing cursors.  */
-extern void *BCursor_create_default (void);
-extern void *BCursor_from_id (enum haiku_cursor);
-extern void *BCursor_create_modeline (void);
-extern void *BCursor_create_i_beam (void);
-extern void *BCursor_create_progress_cursor (void);
-extern void *BCursor_create_grab (void);
-extern void BCursor_delete (void *);
-
-extern void *BScrollBar_make_for_view (void *, int, int, int, int, int, void 
*);
+extern void *be_create_cursor_from_id (int);
+extern void *be_create_pixmap_cursor (void *, int, int);
+extern void be_delete_cursor (void *);
+
+extern void *be_make_scroll_bar_for_view (void *, int, int, int, int, int);
 extern void BScrollBar_delete (void *);
 extern int BScrollBar_default_size (int);
 
@@ -570,9 +584,7 @@ extern void BView_invalidate (void *);
 extern void BView_draw_lock (void *, bool, int, int, int, int);
 extern void BView_invalidate_region (void *, int, int, int, int);
 extern void BView_draw_unlock (void *);
-
 extern void BBitmap_import_fringe_bitmap (void *, unsigned short *, int, int);
-extern void BBitmap_import_mono_bits (void *, void *, int, int);
 
 extern void haiku_font_pattern_free (struct haiku_font_pattern *);
 
@@ -628,8 +640,6 @@ extern void BAlert_delete (void *);
 extern void EmacsWindow_parent_to (void *, void *);
 extern void EmacsWindow_unparent (void *);
 extern void EmacsWindow_move_weak_child (void *, void *, int, int);
-extern void EmacsWindow_make_fullscreen (void *, int);
-extern void EmacsWindow_unzoom (void *);
 
 extern void be_get_version_string (char *, int);
 extern int be_get_display_planes (void);
@@ -690,6 +700,16 @@ extern bool be_select_font (void (*) (void), bool (*) 
(void),
                            int *, bool, int, int, int);
 
 extern int be_find_font_indices (struct haiku_font_pattern *, int *, int *);
+extern status_t be_roster_launch (const char *, const char *, char **,
+                                 ptrdiff_t, void *, team_id *);
+extern void be_get_window_decorator_dimensions (void *, int *, int *, int *, 
int *);
+extern void be_get_window_decorator_frame (void *, int *, int *, int *, int *);
+extern void be_send_move_frame_event (void *);
+extern void be_set_window_fullscreen_mode (void *, enum haiku_fullscreen_mode);
+
+extern void be_lock_window (void *);
+extern void be_unlock_window (void *);
+extern bool be_get_explicit_workarea (int *, int *, int *, int *);
 #ifdef __cplusplus
 }
 
diff --git a/src/haikufns.c b/src/haikufns.c
index 8596317de2..b79443203f 100644
--- a/src/haikufns.c
+++ b/src/haikufns.c
@@ -34,6 +34,9 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include "haiku_support.h"
 #include "termhooks.h"
 
+#include "bitmaps/leftptr.xbm"
+#include "bitmaps/leftpmsk.xbm"
+
 #include <stdlib.h>
 
 #include <kernel/OS.h>
@@ -47,6 +50,9 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 /* The frame of the currently visible tooltip.  */
 Lisp_Object tip_frame;
 
+/* The X and Y deltas of the last call to `x-show-tip'.  */
+Lisp_Object tip_dx, tip_dy;
+
 /* The window-system window corresponding to the frame of the
    currently visible tooltip.  */
 static Window tip_window;
@@ -93,7 +99,7 @@ get_geometry_from_preferences (struct haiku_display_info 
*dpyinfo,
           Lisp_Object value
             = gui_display_get_arg (dpyinfo, parms, r[i].tem, r[i].val, 
r[i].cls,
                                    RES_TYPE_NUMBER);
-          if (! EQ (value, Qunbound))
+          if (! BASE_EQ (value, Qunbound))
             parms = Fcons (Fcons (r[i].tem, value), parms);
         }
     }
@@ -101,6 +107,22 @@ get_geometry_from_preferences (struct haiku_display_info 
*dpyinfo,
   return parms;
 }
 
+/* Update the left and top offsets of F after its decorators
+   change.  */
+static void
+haiku_update_after_decoration_change (struct frame *f)
+{
+  /* Don't reset offsets during initial frame creation, since the
+     contents of f->left_pos and f->top_pos won't be applied to the
+     window until `x-create-frame' finishes, so setting them here will
+     overwrite the offsets that the window should be moved to.  */
+
+  if (!FRAME_OUTPUT_DATA (f)->configury_done)
+    return;
+
+  be_send_move_frame_event (FRAME_HAIKU_WINDOW (f));
+}
+
 void
 haiku_change_tool_bar_height (struct frame *f, int height)
 {
@@ -249,6 +271,22 @@ haiku_set_tab_bar_lines (struct frame *f, Lisp_Object 
value, Lisp_Object oldval)
     haiku_change_tab_bar_height (f, nlines * FRAME_LINE_HEIGHT (f));
 }
 
+void
+gamma_correct (struct frame *f, Emacs_Color *color)
+{
+  if (f->gamma)
+    {
+      color->red = (pow (color->red / 65535.0, f->gamma)
+                   * 65535.0 + 0.5);
+      color->green = (pow (color->green / 65535.0, f->gamma)
+                     * 65535.0 + 0.5);
+      color->blue = (pow (color->blue / 65535.0, f->gamma)
+                    * 65535.0 + 0.5);
+      color->pixel = RGB_TO_ULONG (color->red / 256,
+                                  color->green / 256,
+                                  color->blue / 256);
+    }
+}
 
 int
 haiku_get_color (const char *name, Emacs_Color *color)
@@ -323,12 +361,12 @@ haiku_display_info_for_name (Lisp_Object name)
 {
   CHECK_STRING (name);
 
-  if (!NILP (Fstring_equal (name, build_string ("be"))))
+  if (!strcmp (SSDATA (name), "be"))
     {
-      if (!x_display_list)
+      if (x_display_list)
        return x_display_list;
 
-      error ("Haiku windowing not initialized");
+      return haiku_term_init ();
     }
 
   error ("Haiku displays can only be named \"be\"");
@@ -498,8 +536,12 @@ haiku_set_z_group (struct frame *f, Lisp_Object new_value,
     rc = 0;
 
   unblock_input ();
+
   if (!rc)
     error ("Invalid z-group specification");
+
+  /* Setting the Z-group can change the frame's decorator.  */
+  haiku_update_after_decoration_change (f);
 }
 
 static void
@@ -578,37 +620,34 @@ unwind_create_tip_frame (Lisp_Object frame)
   tip_frame = Qnil;
 }
 
-static void
-haiku_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object 
oldval)
+static unsigned long
+haiku_decode_color (struct frame *f, Lisp_Object color_name)
 {
-  struct haiku_output *output = FRAME_OUTPUT_DATA (f);
-  unsigned long old_fg;
+  Emacs_Color cdef;
 
-  Emacs_Color color;
+  CHECK_STRING (color_name);
 
-  if (haiku_get_color (SSDATA (arg), &color))
-    {
-      store_frame_param (f, Qforeground_color, oldval);
-      unblock_input ();
-      error ("Bad color");
-    }
+  if (!haiku_get_color (SSDATA (color_name), &cdef))
+    return cdef.pixel;
+
+  signal_error ("Undefined color", color_name);
+}
 
+static void
+haiku_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object 
oldval)
+{
+  struct haiku_output *output;
+  unsigned long fg, old_fg;
+
+  fg = haiku_decode_color (f, arg);
   old_fg = FRAME_FOREGROUND_PIXEL (f);
-  FRAME_FOREGROUND_PIXEL (f) = color.pixel;
+  FRAME_FOREGROUND_PIXEL (f) = fg;
+  output = FRAME_OUTPUT_DATA (f);
 
   if (FRAME_HAIKU_WINDOW (f))
     {
-
-      block_input ();
       if (output->cursor_color.pixel == old_fg)
-       {
-         output->cursor_color.pixel = old_fg;
-         output->cursor_color.red = RED_FROM_ULONG (old_fg);
-         output->cursor_color.green = GREEN_FROM_ULONG (old_fg);
-         output->cursor_color.blue = BLUE_FROM_ULONG (old_fg);
-       }
-
-      unblock_input ();
+       haiku_query_color (fg, &output->cursor_color);
 
       update_face_from_frame_parameter (f, Qforeground_color, arg);
 
@@ -648,7 +687,7 @@ haiku_create_frame (Lisp_Object parms)
 
   display = gui_display_get_arg (dpyinfo, parms, Qterminal, 0, 0,
                                  RES_TYPE_STRING);
-  if (EQ (display, Qunbound))
+  if (BASE_EQ (display, Qunbound))
     display = Qnil;
   dpyinfo = check_haiku_display_info (display);
   kb = dpyinfo->terminal->kboard;
@@ -659,7 +698,7 @@ haiku_create_frame (Lisp_Object parms)
   name = gui_display_get_arg (dpyinfo, parms, Qname, 0, 0,
                               RES_TYPE_STRING);
   if (!STRINGP (name)
-      && ! EQ (name, Qunbound)
+      && ! BASE_EQ (name, Qunbound)
       && ! NILP (name))
     error ("Invalid frame name--not a string or nil");
 
@@ -707,7 +746,7 @@ haiku_create_frame (Lisp_Object parms)
 
   /* Set the name; the functions to which we pass f expect the name to
      be set.  */
-  if (EQ (name, Qunbound) || NILP (name) || ! STRINGP (name))
+  if (BASE_EQ (name, Qunbound) || NILP (name) || ! STRINGP (name))
     {
       fset_name (f, Vinvocation_name);
       f->explicit_name = 0;
@@ -763,6 +802,8 @@ haiku_create_frame (Lisp_Object parms)
                          "foreground", "Foreground", RES_TYPE_STRING);
   gui_default_parameter (f, parms, Qbackground_color, build_string ("white"),
                          "background", "Background", RES_TYPE_STRING);
+  gui_default_parameter (f, parms, Qmouse_color, build_string ("font-color"),
+                         "pointerColor", "Foreground", RES_TYPE_STRING);
   gui_default_parameter (f, parms, Qline_spacing, Qnil,
                          "lineSpacing", "LineSpacing", RES_TYPE_NUMBER);
   gui_default_parameter (f, parms, Qleft_fringe, Qnil,
@@ -818,36 +859,11 @@ haiku_create_frame (Lisp_Object parms)
 
   tem = gui_display_get_arg (dpyinfo, parms, Qunsplittable, 0, 0,
                              RES_TYPE_BOOLEAN);
-  f->no_split = minibuffer_only || (!EQ (tem, Qunbound) && !NILP (tem));
-
-  block_input ();
-#define ASSIGN_CURSOR(cursor) \
-  (FRAME_OUTPUT_DATA (f)->cursor = dpyinfo->cursor)
-
-  ASSIGN_CURSOR (text_cursor);
-  ASSIGN_CURSOR (nontext_cursor);
-  ASSIGN_CURSOR (modeline_cursor);
-  ASSIGN_CURSOR (hand_cursor);
-  ASSIGN_CURSOR (hourglass_cursor);
-  ASSIGN_CURSOR (horizontal_drag_cursor);
-  ASSIGN_CURSOR (vertical_drag_cursor);
-  ASSIGN_CURSOR (left_edge_cursor);
-  ASSIGN_CURSOR (top_left_corner_cursor);
-  ASSIGN_CURSOR (top_edge_cursor);
-  ASSIGN_CURSOR (top_right_corner_cursor);
-  ASSIGN_CURSOR (right_edge_cursor);
-  ASSIGN_CURSOR (bottom_right_corner_cursor);
-  ASSIGN_CURSOR (bottom_edge_cursor);
-  ASSIGN_CURSOR (bottom_left_corner_cursor);
-  ASSIGN_CURSOR (no_cursor);
-
-  FRAME_OUTPUT_DATA (f)->current_cursor = dpyinfo->text_cursor;
-#undef ASSIGN_CURSOR
+  f->no_split = minibuffer_only || (!BASE_EQ (tem, Qunbound) && !NILP (tem));
 
   f->terminal->reference_count++;
 
   FRAME_OUTPUT_DATA (f)->window = BWindow_new (&FRAME_OUTPUT_DATA (f)->view);
-  unblock_input ();
 
   if (!FRAME_OUTPUT_DATA (f)->window)
     xsignal1 (Qerror, build_unibyte_string ("Could not create window"));
@@ -859,10 +875,11 @@ haiku_create_frame (Lisp_Object parms)
 
   Vframe_list = Fcons (frame, Vframe_list);
 
-  Lisp_Object parent_frame = gui_display_get_arg (dpyinfo, parms, 
Qparent_frame, NULL, NULL,
+  Lisp_Object parent_frame = gui_display_get_arg (dpyinfo, parms,
+                                                 Qparent_frame, NULL, NULL,
                                                  RES_TYPE_SYMBOL);
 
-  if (EQ (parent_frame, Qunbound)
+  if (BASE_EQ (parent_frame, Qunbound)
       || NILP (parent_frame)
       || !FRAMEP (parent_frame)
       || !FRAME_LIVE_P (XFRAME (parent_frame)))
@@ -916,7 +933,7 @@ haiku_create_frame (Lisp_Object parms)
 
   visibility = gui_display_get_arg (dpyinfo, parms, Qvisibility, 0, 0,
                                    RES_TYPE_SYMBOL);
-  if (EQ (visibility, Qunbound))
+  if (BASE_EQ (visibility, Qunbound))
     visibility = Qt;
   if (EQ (visibility, Qicon))
     haiku_iconify_frame (f);
@@ -989,7 +1006,7 @@ haiku_create_tip_frame (Lisp_Object parms)
   name = gui_display_get_arg (dpyinfo, parms, Qname, "name", "Name",
                               RES_TYPE_STRING);
   if (!STRINGP (name)
-      && !EQ (name, Qunbound)
+      && !BASE_EQ (name, Qunbound)
       && !NILP (name))
     error ("Invalid frame name--not a string or nil");
 
@@ -1018,7 +1035,7 @@ haiku_create_tip_frame (Lisp_Object parms)
 
   /* Set the name; the functions to which we pass f expect the name to
      be set.  */
-  if (EQ (name, Qunbound) || NILP (name))
+  if (BASE_EQ (name, Qunbound) || NILP (name))
     f->explicit_name = false;
   else
     {
@@ -1056,7 +1073,7 @@ haiku_create_tip_frame (Lisp_Object parms)
       value = gui_display_get_arg (dpyinfo, parms, Qinternal_border_width,
                                    "internalBorder", "internalBorder",
                                    RES_TYPE_NUMBER);
-      if (! EQ (value, Qunbound))
+      if (! BASE_EQ (value, Qunbound))
        parms = Fcons (Fcons (Qinternal_border_width, value),
                       parms);
     }
@@ -1076,7 +1093,10 @@ haiku_create_tip_frame (Lisp_Object parms)
 
   gui_default_parameter (f, parms, Qbackground_color, build_string ("white"),
                          "background", "Background", RES_TYPE_STRING);
-  gui_default_parameter (f, parms, Qmouse_color, build_string ("black"),
+
+  /* FIXME: is there a better method to tell Emacs to not recolor the
+     cursors other than setting the color to a special value?  */
+  gui_default_parameter (f, parms, Qmouse_color, build_string ("font-color"),
                          "pointerColor", "Foreground", RES_TYPE_STRING);
   gui_default_parameter (f, parms, Qcursor_color, build_string ("black"),
                          "cursorColor", "Foreground", RES_TYPE_STRING);
@@ -1133,6 +1153,23 @@ haiku_create_tip_frame (Lisp_Object parms)
   /* FIXME - can this be done in a similar way to normal frames?
      https://lists.gnu.org/r/emacs-devel/2007-10/msg00641.html */
 
+  {
+    Lisp_Object disptype;
+
+    if (be_get_display_planes () == 1)
+      disptype = Qmono;
+    else if (be_is_display_grayscale ())
+      disptype = Qgrayscale;
+    else
+      disptype = Qcolor;
+
+    if (NILP (Fframe_parameter (frame, Qdisplay_type)))
+      {
+       AUTO_FRAME_ARG (arg, Qdisplay_type, disptype);
+       Fmodify_frame_parameters (frame, arg);
+      }
+  }
+
   /* Set up faces after all frame parameters are known.  This call
      also merges in face attributes specified for new frames.
 
@@ -1312,6 +1349,8 @@ haiku_set_undecorated (struct frame *f, Lisp_Object 
new_value,
   FRAME_UNDECORATED (f) = !NILP (new_value);
   BWindow_change_decoration (FRAME_HAIKU_WINDOW (f), NILP (new_value));
   unblock_input ();
+
+  haiku_update_after_decoration_change (f);
 }
 
 static void
@@ -1326,6 +1365,8 @@ haiku_set_override_redirect (struct frame *f, Lisp_Object 
new_value,
                                 !NILP (new_value));
   FRAME_OVERRIDE_REDIRECT (f) = !NILP (new_value);
   unblock_input ();
+
+  haiku_update_after_decoration_change (f);
 }
 
 static void
@@ -1372,122 +1413,129 @@ haiku_set_menu_bar_lines (struct frame *f, 
Lisp_Object value, Lisp_Object oldval
 static Lisp_Object
 frame_geometry (Lisp_Object frame, Lisp_Object attribute)
 {
-  struct frame *f = decode_live_frame (frame);
-  check_window_system (f);
+  struct frame *f, *parent;
+  void *window;
+  int outer_x, outer_y, outer_width, outer_height;
+  int right_off, bottom_off, top_off;
+  int native_x, native_y;
+
+  f = decode_window_system_frame (frame);
+  parent = FRAME_PARENT_FRAME (f);
+  window = FRAME_HAIKU_WINDOW (f);
+
+  be_lock_window (window);
+  be_get_window_decorator_frame (window, &outer_x, &outer_y,
+                                &outer_width, &outer_height);
+  be_get_window_decorator_dimensions (window, NULL, &top_off,
+                                     &right_off, &bottom_off);
+  be_unlock_window (window);
+
+  native_x = FRAME_OUTPUT_DATA (f)->frame_x;
+  native_y = FRAME_OUTPUT_DATA (f)->frame_y;
+
+  if (parent)
+    {
+      /* Adjust all the coordinates by the coordinates of the parent
+        frame.  */
+      outer_x -= FRAME_OUTPUT_DATA (parent)->frame_x;
+      outer_y -= FRAME_OUTPUT_DATA (parent)->frame_y;
+      native_x -= FRAME_OUTPUT_DATA (parent)->frame_x;
+      native_y -= FRAME_OUTPUT_DATA (parent)->frame_y;
+    }
 
   if (EQ (attribute, Qouter_edges))
-    return list4i (f->left_pos, f->top_pos,
-                  f->left_pos, f->top_pos);
+    return list4i (outer_x, outer_y,
+                  outer_x + outer_width,
+                  outer_y + outer_height);
   else if (EQ (attribute, Qnative_edges))
-    return list4i (f->left_pos, f->top_pos,
-                  f->left_pos + FRAME_PIXEL_WIDTH (f),
-                  f->top_pos + FRAME_PIXEL_HEIGHT (f));
+    return list4i (native_x, native_y,
+                  native_x + FRAME_PIXEL_WIDTH (f),
+                  native_y + FRAME_PIXEL_HEIGHT (f));
   else if (EQ (attribute, Qinner_edges))
-    return list4i (f->left_pos + FRAME_INTERNAL_BORDER_WIDTH (f),
-                  f->top_pos + FRAME_INTERNAL_BORDER_WIDTH (f) +
-                  FRAME_MENU_BAR_HEIGHT (f) + FRAME_TOOL_BAR_HEIGHT (f),
-                  f->left_pos - FRAME_INTERNAL_BORDER_WIDTH (f) +
-                  FRAME_PIXEL_WIDTH (f),
-                  f->top_pos + FRAME_PIXEL_HEIGHT (f) -
-                  FRAME_INTERNAL_BORDER_WIDTH (f));
+    return list4i (native_x + FRAME_INTERNAL_BORDER_WIDTH (f),
+                  native_y + FRAME_INTERNAL_BORDER_WIDTH (f)
+                  + FRAME_MENU_BAR_HEIGHT (f) + FRAME_TOOL_BAR_HEIGHT (f),
+                  native_x - FRAME_INTERNAL_BORDER_WIDTH (f)
+                  + FRAME_PIXEL_WIDTH (f),
+                  native_y + FRAME_PIXEL_HEIGHT (f)
+                  - FRAME_INTERNAL_BORDER_WIDTH (f));
 
   else
-    return
-      list (Fcons (Qouter_position,
-                  Fcons (make_fixnum (f->left_pos),
-                         make_fixnum (f->top_pos))),
-           Fcons (Qouter_size,
-                  Fcons (make_fixnum (FRAME_PIXEL_WIDTH (f)),
-                         make_fixnum (FRAME_PIXEL_HEIGHT (f)))),
-           Fcons (Qexternal_border_size,
-                  Fcons (make_fixnum (0), make_fixnum (0))),
-           Fcons (Qtitle_bar_size,
-                  Fcons (make_fixnum (0), make_fixnum (0))),
-           Fcons (Qmenu_bar_external, Qnil),
-           Fcons (Qmenu_bar_size, Fcons (make_fixnum (FRAME_PIXEL_WIDTH (f) -
-                                                      
(FRAME_INTERNAL_BORDER_WIDTH (f) * 2)),
-                                         make_fixnum (FRAME_MENU_BAR_HEIGHT 
(f)))),
-           Fcons (Qtool_bar_external, Qnil),
-           Fcons (Qtool_bar_position, Qtop),
-           Fcons (Qtool_bar_size, Fcons (make_fixnum (FRAME_PIXEL_WIDTH (f) -
-                                                      
(FRAME_INTERNAL_BORDER_WIDTH (f) * 2)),
-                                         make_fixnum (FRAME_TOOL_BAR_HEIGHT 
(f)))),
-           Fcons (Qinternal_border_width, make_fixnum 
(FRAME_INTERNAL_BORDER_WIDTH (f))));
+    return list (Fcons (Qouter_position,
+                       Fcons (make_fixnum (outer_x),
+                              make_fixnum (outer_y))),
+                Fcons (Qouter_size,
+                       Fcons (make_fixnum (outer_width),
+                              make_fixnum (outer_height))),
+                Fcons (Qexternal_border_size,
+                       Fcons (make_fixnum (right_off),
+                              make_fixnum (bottom_off))),
+                Fcons (Qtitle_bar_size,
+                       Fcons (make_fixnum (outer_width),
+                              make_fixnum (top_off))),
+                Fcons (Qmenu_bar_external, Qnil),
+                Fcons (Qmenu_bar_size,
+                       Fcons (make_fixnum (FRAME_PIXEL_WIDTH (f)
+                                           - (FRAME_INTERNAL_BORDER_WIDTH (f) 
* 2)),
+                              make_fixnum (FRAME_MENU_BAR_HEIGHT (f)))),
+                Fcons (Qtool_bar_external, Qnil),
+                Fcons (Qtool_bar_position, Qtop),
+                Fcons (Qtool_bar_size,
+                       Fcons (make_fixnum (FRAME_PIXEL_WIDTH (f)
+                                           - (FRAME_INTERNAL_BORDER_WIDTH (f) 
* 2)),
+                              make_fixnum (FRAME_TOOL_BAR_HEIGHT (f)))),
+                Fcons (Qinternal_border_width,
+                       make_fixnum (FRAME_INTERNAL_BORDER_WIDTH (f))));
 }
 
 void
 haiku_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object 
oldval)
 {
-  Emacs_Color color;
-  struct face *defface;
+  unsigned long background;
 
-  CHECK_STRING (arg);
+  background = haiku_decode_color (f, arg);
 
-  block_input ();
-  if (haiku_get_color (SSDATA (arg), &color))
-    {
-      store_frame_param (f, Qbackground_color, oldval);
-      unblock_input ();
-      error ("Bad color");
-    }
-
-  FRAME_OUTPUT_DATA (f)->cursor_fg = color.pixel;
-  FRAME_BACKGROUND_PIXEL (f) = color.pixel;
+  FRAME_OUTPUT_DATA (f)->cursor_fg = background;
+  FRAME_BACKGROUND_PIXEL (f) = background;
 
   if (FRAME_HAIKU_VIEW (f))
     {
       BView_draw_lock (FRAME_HAIKU_VIEW (f), false, 0, 0, 0, 0);
-      BView_SetViewColor (FRAME_HAIKU_VIEW (f), color.pixel);
+      BView_SetViewColor (FRAME_HAIKU_VIEW (f), background);
       BView_draw_unlock (FRAME_HAIKU_VIEW (f));
 
-      defface = FACE_FROM_ID_OR_NULL (f, DEFAULT_FACE_ID);
-      if (defface)
-       {
-         defface->background = color.pixel;
-         update_face_from_frame_parameter (f, Qbackground_color, arg);
-         clear_frame (f);
-       }
-    }
+      FRAME_OUTPUT_DATA (f)->cursor_fg = background;
+      update_face_from_frame_parameter (f, Qbackground_color, arg);
 
-  if (FRAME_VISIBLE_P (f))
-    SET_FRAME_GARBAGED (f);
-  unblock_input ();
+      if (FRAME_VISIBLE_P (f))
+       redraw_frame (f);
+    }
 }
 
 void
 haiku_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
 {
-  Emacs_Color color, fore_pixel;
-
-  CHECK_STRING (arg);
-  block_input ();
-
-  if (haiku_get_color (SSDATA (arg), &color))
-    {
-      store_frame_param (f, Qcursor_color, oldval);
-      unblock_input ();
-      error ("Bad color");
-    }
+  unsigned long fore_pixel, pixel;
 
-  FRAME_CURSOR_COLOR (f) = color;
+  pixel = haiku_decode_color (f, arg);
 
-  if (STRINGP (Vx_cursor_fore_pixel))
+  if (!NILP (Vx_cursor_fore_pixel))
     {
-      if (haiku_get_color (SSDATA (Vx_cursor_fore_pixel),
-                          &fore_pixel))
-       error ("Bad color %s", SSDATA (Vx_cursor_fore_pixel));
-      FRAME_OUTPUT_DATA (f)->cursor_fg = fore_pixel.pixel;
+      fore_pixel = haiku_decode_color (f, Vx_cursor_fore_pixel);
+      FRAME_OUTPUT_DATA (f)->cursor_fg = fore_pixel;
     }
   else
     FRAME_OUTPUT_DATA (f)->cursor_fg = FRAME_BACKGROUND_PIXEL (f);
 
+  haiku_query_color (pixel, &FRAME_CURSOR_COLOR (f));
+
   if (FRAME_VISIBLE_P (f))
     {
-      gui_update_cursor (f, 0);
-      gui_update_cursor (f, 1);
+      gui_update_cursor (f, false);
+      gui_update_cursor (f, true);
     }
+
   update_face_from_frame_parameter (f, Qcursor_color, arg);
-  unblock_input ();
 }
 
 void
@@ -1567,6 +1615,7 @@ haiku_free_frame_resources (struct frame *f)
   dpyinfo = FRAME_DISPLAY_INFO (f);
 
   free_frame_faces (f);
+  haiku_free_custom_cursors (f);
 
   /* Free scroll bars */
   for (bar = FRAME_SCROLL_BARS (f); !NILP (bar); bar = b->next)
@@ -1792,6 +1841,279 @@ haiku_set_sticky (struct frame *f, Lisp_Object 
new_value,
   unblock_input ();
 }
 
+struct user_cursor_info
+{
+  /* A pointer to the Lisp_Object describing the cursor.  */
+  Lisp_Object *lisp_cursor;
+
+  /* The offset of the cursor in the `struct haiku_output' of each
+     frame.  */
+  ptrdiff_t output_offset;
+
+  /* The offset of the default value of the cursor in the display
+     info structure.  */
+  ptrdiff_t default_offset;
+};
+
+struct user_cursor_bitmap_info
+{
+  /* A bitmap to use instead of the font cursor to create cursors in a
+     certain color.  */
+  const void *bits;
+
+  /* The mask for that bitmap.  */
+  const void *mask;
+
+  /* The dimensions of the cursor bitmap.  */
+  int width, height;
+
+  /* The position inside the cursor bitmap corresponding to the
+     position of the mouse pointer.  */
+  int x, y;
+};
+
+#define INIT_USER_CURSOR(lisp, cursor)                 \
+  { (lisp), offsetof (struct haiku_output, cursor),    \
+      offsetof (struct haiku_display_info, cursor) }
+
+struct user_cursor_info custom_cursors[] =
+  {
+    INIT_USER_CURSOR (&Vx_pointer_shape,               text_cursor),
+    INIT_USER_CURSOR (NULL,                            nontext_cursor),
+    INIT_USER_CURSOR (NULL,                            modeline_cursor),
+    INIT_USER_CURSOR (&Vx_sensitive_text_pointer_shape,        hand_cursor),
+    INIT_USER_CURSOR (&Vx_hourglass_pointer_shape,     hourglass_cursor),
+    INIT_USER_CURSOR (NULL,                            horizontal_drag_cursor),
+    INIT_USER_CURSOR (NULL,                            vertical_drag_cursor),
+    INIT_USER_CURSOR (NULL,                            left_edge_cursor),
+    INIT_USER_CURSOR (NULL,                            top_left_corner_cursor),
+    INIT_USER_CURSOR (NULL,                            top_edge_cursor),
+    INIT_USER_CURSOR (NULL,                            
top_right_corner_cursor),
+    INIT_USER_CURSOR (NULL,                            right_edge_cursor),
+    INIT_USER_CURSOR (NULL,                            
bottom_right_corner_cursor),
+    INIT_USER_CURSOR (NULL,                            bottom_edge_cursor),
+    INIT_USER_CURSOR (NULL,                            
bottom_left_corner_cursor),
+    INIT_USER_CURSOR (NULL,                            no_cursor),
+  };
+
+struct user_cursor_bitmap_info cursor_bitmaps[] =
+  {
+    { ibeam_ptr_bits, ibeam_ptrmask_bits, 15, 15, 7, 7 },      /* text_cursor 
*/
+    { left_ptr_bits, left_ptrmsk_bits, 16, 16, 3, 1 },         /* 
nontext_cursor */
+    { left_ptr_bits, left_ptrmsk_bits, 16, 16, 3, 1 },         /* 
modeline_cursor */
+    { hand_ptr_bits, hand_ptrmask_bits, 15, 15, 4, 3 },                /* 
hand_cursor */
+    { hourglass_bits, hourglass_mask_bits, 15, 15, 7, 7 },     /* 
hourglass_cursor */
+    { horizd_ptr_bits, horizd_ptrmask_bits, 15, 15, 7, 7 },    /* 
horizontal_drag_cursor */
+    { vertd_ptr_bits, vertd_ptrmask_bits, 15, 15, 7, 7 },      /* 
vertical_drag_cursor */
+    { NULL, NULL, 0, 0, 0, 0 },                                        /* 
left_edge_cursor */
+    { NULL, NULL, 0, 0, 0, 0 },                                        /* 
top_left_corner_cursor */
+    { NULL, NULL, 0, 0, 0, 0 },                                        /* 
top_edge_cursor */
+    { NULL, NULL, 0, 0, 0, 0 },                                        /* 
top_right_corner_cursor */
+    { NULL, NULL, 0, 0, 0, 0 },                                        /* 
right_edge_cursor */
+    { NULL, NULL, 0, 0, 0, 0 },                                        /* 
bottom_right_corner_cursor */
+    { NULL, NULL, 0, 0, 0, 0 },                                        /* 
bottom_edge_cursor */
+    { NULL, NULL, 0, 0, 0, 0 },                                        /* 
bottom_left_corner_cursor */
+    { NULL, NULL, 0, 0, 0, 0 },                                        /* 
no_cursor */
+  };
+
+/* Array of cursor bitmaps for each system cursor ID.  This is used to
+   color in user-specified cursors.  */
+struct user_cursor_bitmap_info cursor_bitmaps_for_id[28] =
+  {
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { left_ptr_bits, left_ptrmsk_bits, 16, 16, 3, 1            },
+    { ibeam_ptr_bits, ibeam_ptrmask_bits, 15, 15, 7, 7         },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { cross_ptr_bits, cross_ptrmask_bits, 30, 30, 15, 15       },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { hand_ptr_bits, hand_ptrmask_bits, 15, 15, 4, 3           },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { hourglass_bits, hourglass_mask_bits, 15, 15, 7, 7                },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { horizd_ptr_bits, horizd_ptrmask_bits, 15, 15, 7, 7       },
+    { vertd_ptr_bits, vertd_ptrmask_bits, 15, 15, 7, 7         },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+    { NULL, NULL, 0, 0, 0, 0                                   },
+  };
+
+static void *
+haiku_create_colored_cursor (struct user_cursor_bitmap_info *info,
+                            uint32_t foreground, uint32_t background)
+{
+  const char *bits, *mask;
+  void *bitmap, *cursor;
+  int width, height, bytes_per_line, x, y;
+
+  bits = info->bits;
+  mask = info->mask;
+  width = info->width;
+  height = info->height;
+  bytes_per_line = (width + 7) / 8;
+
+  bitmap = BBitmap_new (width, height, false);
+
+  if (!bitmap)
+    memory_full (SIZE_MAX);
+
+  for (y = 0; y < height; ++y)
+    {
+      for (x = 0; x < width; ++x)
+       {
+         if (mask[x / 8] >> (x % 8) & 1)
+           haiku_put_pixel (bitmap, x, y,
+                            (bits[x / 8] >> (x % 8) & 1
+                             ? (foreground | 255u << 24)
+                             : (background | 255u << 24)));
+         else
+           haiku_put_pixel (bitmap, x, y, 0);
+       }
+
+      mask += bytes_per_line;
+      bits += bytes_per_line;
+    }
+
+  cursor = be_create_pixmap_cursor (bitmap, info->x, info->y);
+  BBitmap_free (bitmap);
+
+  return cursor;
+}
+
+/* Free all cursors on F that were allocated specifically for the
+   frame.  */
+void
+haiku_free_custom_cursors (struct frame *f)
+{
+  struct user_cursor_info *cursor;
+  struct haiku_output *output;
+  struct haiku_display_info *dpyinfo;
+  Emacs_Cursor *frame_cursor;
+  Emacs_Cursor *display_cursor;
+  int i;
+
+  output = FRAME_OUTPUT_DATA (f);
+  dpyinfo = FRAME_DISPLAY_INFO (f);
+
+  for (i = 0; i < ARRAYELTS (custom_cursors); ++i)
+    {
+      cursor = &custom_cursors[i];
+      frame_cursor = (Emacs_Cursor *) ((char *) output
+                                      + cursor->output_offset);
+      display_cursor = (Emacs_Cursor *) ((char *) dpyinfo
+                                        + cursor->default_offset);
+
+      if (*frame_cursor != *display_cursor && *frame_cursor)
+       {
+         if (output->current_cursor == *frame_cursor)
+           output->current_cursor = *display_cursor;
+
+         be_delete_cursor (*frame_cursor);
+       }
+
+      *frame_cursor = *display_cursor;
+    }
+}
+
+static void
+haiku_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+{
+  struct haiku_output *output;
+  Emacs_Cursor *frame_cursor, old, *recolored;
+  int i, n, rc;
+  bool color_specified_p;
+  Emacs_Color color;
+
+  CHECK_STRING (arg);
+  color_specified_p = true;
+
+  if (!strcmp (SSDATA (arg), "font-color"))
+    color_specified_p = false;
+  else
+    rc = haiku_get_color (SSDATA (arg), &color);
+
+  if (color_specified_p && rc)
+    signal_error ("Undefined color", arg);
+
+  output = FRAME_OUTPUT_DATA (f);
+
+  /* This will also reset all the cursors back to their default
+     values.  */
+  haiku_free_custom_cursors (f);
+
+  for (i = 0; i < ARRAYELTS (custom_cursors); ++i)
+    {
+      frame_cursor = (Emacs_Cursor *) ((char *) output
+                                      + custom_cursors[i].output_offset);
+      old = *frame_cursor;
+
+      if (custom_cursors[i].lisp_cursor
+         && FIXNUMP (*custom_cursors[i].lisp_cursor))
+       {
+         if (!RANGED_FIXNUMP (0, *custom_cursors[i].lisp_cursor,
+                              28)) /* 28 is the largest Haiku cursor ID.  */
+           signal_error ("Invalid cursor",
+                         *custom_cursors[i].lisp_cursor);
+
+         n = XFIXNUM (*custom_cursors[i].lisp_cursor);
+
+         if (color_specified_p && cursor_bitmaps_for_id[n].bits)
+           {
+             recolored
+               = haiku_create_colored_cursor (&cursor_bitmaps_for_id[n],
+                                              color.pixel,
+                                              FRAME_BACKGROUND_PIXEL (f));
+
+             if (recolored)
+               {
+                 *frame_cursor = recolored;
+                 continue;
+               }
+           }
+
+         /* Create and set the custom cursor.  */
+         *frame_cursor = be_create_cursor_from_id (n);
+       }
+      else if (color_specified_p && cursor_bitmaps[i].bits)
+       {
+         recolored
+           = haiku_create_colored_cursor (&cursor_bitmaps[i], color.pixel,
+                                          FRAME_BACKGROUND_PIXEL (f));
+
+         if (recolored)
+           *frame_cursor = recolored;
+       }
+    }
+
+  /* This function can be called before the frame's window is
+     created.  */
+  if (FRAME_HAIKU_WINDOW (f))
+    {
+      if (output->current_cursor == old
+         && old != *frame_cursor)
+       {
+         output->current_cursor = *frame_cursor;
+
+         BView_set_view_cursor (FRAME_HAIKU_VIEW (f),
+                                *frame_cursor);
+       }
+    }
+
+  update_face_from_frame_parameter (f, Qmouse_color, arg);
+}
+
 
 
 DEFUN ("haiku-set-mouse-absolute-pixel-position",
@@ -1890,34 +2212,28 @@ DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p, 
Sx_display_grayscale_p,
 }
 
 DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection,
-       1, 3, 0,
-       doc: /* SKIP: real doc in xfns.c.  */)
+       1, 3, 0, doc: /* SKIP: real doc in xfns.c.  */)
      (Lisp_Object display, Lisp_Object resource_string, Lisp_Object 
must_succeed)
 {
-  struct haiku_display_info *dpyinfo;
   CHECK_STRING (display);
 
   if (NILP (Fstring_equal (display, build_string ("be"))))
     {
       if (!NILP (must_succeed))
-       fatal ("Bad display");
+       fatal ("Invalid display %s", SDATA (display));
       else
-       error ("Bad display");
+       signal_error ("Invalid display", display);
     }
 
   if (x_display_list)
-    return Qnil;
-
-  dpyinfo = haiku_term_init ();
-
-  if (!dpyinfo)
     {
       if (!NILP (must_succeed))
-       fatal ("Display not responding");
+       fatal ("A display is already open");
       else
-       error ("Display not responding");
+       error ("A display is already open");
     }
 
+  haiku_term_init ();
   return Qnil;
 }
 
@@ -1944,7 +2260,7 @@ DEFUN ("x-display-pixel-height", Fx_display_pixel_height, 
Sx_display_pixel_heigh
   check_haiku_display_info (terminal);
 
   be_get_screen_dimensions (&width, &height);
-  return make_fixnum (width);
+  return make_fixnum (height);
 }
 
 DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height, 0, 
1, 0,
@@ -2039,6 +2355,9 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
   else
     CHECK_FIXNUM (dy);
 
+  tip_dx = dx;
+  tip_dy = dy;
+
   if (use_system_tooltips)
     {
       int root_x, root_y;
@@ -2579,6 +2898,7 @@ Frames are listed from topmost (first) to bottommost 
(last).  */)
 
   if (NILP (sel))
     return frames;
+
   return Fcons (sel, frames);
 }
 
@@ -2683,6 +3003,57 @@ call this function yourself.  */)
   return Qnil;
 }
 
+DEFUN ("haiku-display-monitor-attributes-list",
+       Fhaiku_display_monitor_attributes_list,
+       Shaiku_display_monitor_attributes_list,
+       0, 1, 0,
+       doc: /* Return a list of physical monitor attributes on the display 
TERMINAL.
+
+The optional argument TERMINAL specifies which display to ask about.
+TERMINAL should be a terminal object, a frame or a display name (a string).
+If omitted or nil, that stands for the selected frame's display.
+
+Internal use only, use `display-monitor-attributes-list' instead.  */)
+  (Lisp_Object terminal)
+{
+  struct MonitorInfo monitor;
+  struct haiku_display_info *dpyinfo;
+  Lisp_Object frames, tail, tem;
+
+  dpyinfo = check_haiku_display_info (terminal);
+  frames = Qnil;
+
+  FOR_EACH_FRAME (tail, tem)
+    {
+      maybe_quit ();
+
+      if (FRAME_HAIKU_P (XFRAME (tem))
+         && !FRAME_TOOLTIP_P (XFRAME (tem)))
+       frames = Fcons (tem, frames);
+    }
+
+  monitor.geom.x = 0;
+  monitor.geom.y = 0;
+  be_get_screen_dimensions ((int *) &monitor.geom.width,
+                           (int *) &monitor.geom.height);
+
+  monitor.mm_width = (monitor.geom.width
+                     / (dpyinfo->resx / 25.4));
+  monitor.mm_height = (monitor.geom.height
+                      / (dpyinfo->resy / 25.4));
+  monitor.name = (char *) "BeOS monitor";
+
+  if (!be_get_explicit_workarea ((int *) &monitor.work.x,
+                                (int *) &monitor.work.y,
+                                (int *) &monitor.work.width,
+                                (int *) &monitor.work.height))
+    monitor.work = monitor.geom;
+
+  return make_monitor_attribute_list (&monitor, 1, 0,
+                                     make_vector (1, frames),
+                                     "fallback");
+}
+
 frame_parm_handler haiku_frame_parm_handlers[] =
   {
     gui_set_autoraise,
@@ -2701,7 +3072,7 @@ frame_parm_handler haiku_frame_parm_handlers[] =
     gui_set_right_divider_width,
     gui_set_bottom_divider_width,
     haiku_set_menu_bar_lines,
-    NULL, /* set mouse color */
+    haiku_set_mouse_color,
     haiku_explicitly_set_name,
     gui_set_scroll_bar_width,
     gui_set_scroll_bar_height,
@@ -2751,6 +3122,9 @@ syms_of_haikufns (void)
   DEFSYM (Qstatic_color, "static-color");
   DEFSYM (Qstatic_gray, "static-gray");
   DEFSYM (Qtrue_color, "true-color");
+  DEFSYM (Qmono, "mono");
+  DEFSYM (Qgrayscale, "grayscale");
+  DEFSYM (Qcolor, "color");
 
   defsubr (&Sx_hide_tip);
   defsubr (&Sxw_display_color_p);
@@ -2785,6 +3159,7 @@ syms_of_haikufns (void)
   defsubr (&Sx_display_save_under);
   defsubr (&Shaiku_frame_restack);
   defsubr (&Shaiku_save_session_reply);
+  defsubr (&Shaiku_display_monitor_attributes_list);
 
   tip_timer = Qnil;
   staticpro (&tip_timer);
@@ -2796,6 +3171,10 @@ syms_of_haikufns (void)
   staticpro (&tip_last_string);
   tip_last_parms = Qnil;
   staticpro (&tip_last_parms);
+  tip_dx = Qnil;
+  staticpro (&tip_dx);
+  tip_dy = Qnil;
+  staticpro (&tip_dy);
 
   DEFVAR_LISP ("x-max-tooltip-size", Vx_max_tooltip_size,
               doc: /* SKIP: real doc in xfns.c.  */);
@@ -2805,6 +3184,19 @@ syms_of_haikufns (void)
               doc: /* SKIP: real doc in xfns.c.  */);
   Vx_cursor_fore_pixel = Qnil;
 
+  DEFVAR_LISP ("x-pointer-shape", Vx_pointer_shape,
+              doc: /* SKIP: real doc in xfns.c.  */);
+  Vx_pointer_shape = Qnil;
+
+  DEFVAR_LISP ("x-hourglass-pointer-shape", Vx_hourglass_pointer_shape,
+              doc: /* SKIP: real doc in xfns.c.  */);
+  Vx_hourglass_pointer_shape = Qnil;
+
+  DEFVAR_LISP ("x-sensitive-text-pointer-shape",
+              Vx_sensitive_text_pointer_shape,
+              doc: /* SKIP: real doc in xfns.c.  */);
+  Vx_sensitive_text_pointer_shape = Qnil;
+
   DEFVAR_LISP ("haiku-allowed-ui-colors", Vhaiku_allowed_ui_colors,
               doc: /* Vector of UI colors that Emacs can look up from the 
system.
 If this is set up incorrectly, Emacs can crash when encoutering an
diff --git a/src/haikufont.c b/src/haikufont.c
index e0db086aa0..54f11c6e41 100644
--- a/src/haikufont.c
+++ b/src/haikufont.c
@@ -1084,8 +1084,8 @@ haikufont_draw (struct glyph_string *s, int from, int to,
          s->first_glyph->slice.glyphless.lower_yoff
          - s->first_glyph->slice.glyphless.upper_yoff;
 
-      BView_SetHighColor (view, background);
-      BView_FillRectangle (view, x, y - ascent, s->width, height);
+      haiku_draw_background_rect (s, s->face, x, y - ascent,
+                                 s->width, height);
       s->background_filled_p = 1;
     }
 
diff --git a/src/haikugui.h b/src/haikugui.h
index a6cf3a4e6c..0dc127e6b6 100644
--- a/src/haikugui.h
+++ b/src/haikugui.h
@@ -95,4 +95,109 @@ typedef haiku Drawable;
 typedef haiku Window;
 typedef int Display;
 
+/* Cursor bitmaps.  These are only used to create colored cursors when
+   the user specifies a mouse color.  */
+
+MAYBE_UNUSED static unsigned char cross_ptr_bits[] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
+    0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
+    0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0xf0, 0x1f, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+    0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
+    0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char cross_ptrmask_bits[] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x01,
+    0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0,
+    0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00,
+    0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
+    0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xfc, 0x07, 0xf0, 0x1f, 0xfe, 0x0f, 0xf8, 0x3f, 0xfc, 0x07,
+    0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
+    0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01,
+    0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0,
+    0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char ibeam_ptr_bits[] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0xc0, 0x01, 0xc0, 0x01, 0xc0,
+    0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
+    0xc0, 0x01, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char ibeam_ptrmask_bits[] =
+  {
+    0x00, 0x00, 0xfc, 0x1f, 0xfe, 0x3f, 0xfc, 0x1f, 0xe0, 0x03, 0xe0,
+    0x03, 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x03,
+    0xfc, 0x1f, 0xfe, 0x3f, 0xfc, 0x1f, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char hand_ptr_bits[] =
+  {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0xa0, 0x02, 0xa0,
+   0x02, 0xf0, 0x07, 0xf0, 0x07, 0xf0, 0x07, 0xf0, 0x07, 0xf0, 0x07,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char hand_ptrmask_bits[] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0xf0, 0x07, 0xf0, 0x07, 0xf8,
+    0x0f, 0xf8, 0x0f, 0xf8, 0x0f, 0xf8, 0x0f, 0xf8, 0x0f, 0xf8, 0x0f,
+    0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char horizd_ptr_bits[] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x28,
+    0x0a, 0xf4, 0x17, 0x02, 0x20, 0xf4, 0x17, 0x28, 0x0a, 0x10, 0x04,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char horizd_ptrmask_bits[] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x38,
+    0x0e, 0xfc, 0x1f, 0xfe, 0x3f, 0xfc, 0x1f, 0x38, 0x0e, 0x10, 0x04,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char vertd_ptr_bits[] =
+  {
+    0x00, 0x00, 0x80, 0x00, 0x40, 0x01, 0x20, 0x02, 0x50, 0x05, 0x60,
+    0x03, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x60, 0x03, 0x50, 0x05,
+    0x20, 0x02, 0x40, 0x01, 0x80, 0x00, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char vertd_ptrmask_bits[] =
+  {
+    0x00, 0x00, 0x80, 0x00, 0xc0, 0x01, 0xe0, 0x03, 0xf0, 0x07, 0xe0,
+    0x03, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xe0, 0x03, 0xf0, 0x07,
+    0xe0, 0x03, 0xc0, 0x01, 0x80, 0x00, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char hourglass_bits[] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x10, 0x04, 0x08, 0x08, 0x24,
+    0x10, 0x44, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x88, 0x08,
+    0x10, 0x04, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00
+  };
+
+MAYBE_UNUSED static unsigned char hourglass_mask_bits[] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0xf0, 0x07, 0xf8, 0x0f, 0xfc,
+    0x1f, 0xfc, 0x1f, 0xfc, 0x1f, 0xfc, 0x1f, 0xfc, 0x1f, 0xf8, 0x0f,
+    0xf0, 0x07, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00
+  };
+
 #endif /* _HAIKU_GUI_H_ */
diff --git a/src/haikumenu.c b/src/haikumenu.c
index 9779c34a99..5729bed4a9 100644
--- a/src/haikumenu.c
+++ b/src/haikumenu.c
@@ -35,26 +35,35 @@ int popup_activated_p = 0;
 
 static void
 digest_menu_items (void *first_menu, int start, int menu_items_used,
-                  int mbar_p)
+                  bool is_menu_bar)
 {
   void **menus, **panes;
-  ssize_t menu_len = (menu_items_used + 1 - start) * sizeof *menus;
-  ssize_t pane_len = (menu_items_used + 1 - start) * sizeof *panes;
+  ssize_t menu_len;
+  ssize_t pane_len;
+  int i, menu_depth;
+  void *menu, *window, *view;
+  Lisp_Object pane_name, prefix;
+  const char *pane_string;
+  Lisp_Object item_name, enable, descrip, def, selected, help;
 
-  menus = alloca (menu_len);
-  panes = alloca (pane_len);
+  USE_SAFE_ALLOCA;
 
-  int i = start, menu_depth = 0;
+  menu_len = (menu_items_used + 1 - start) * sizeof *menus;
+  pane_len = (menu_items_used + 1 - start) * sizeof *panes;
+  menu = first_menu;
 
+  i = start;
+  menu_depth = 0;
+
+  menus = SAFE_ALLOCA (menu_len);
+  panes = SAFE_ALLOCA (pane_len);
   memset (menus, 0, menu_len);
   memset (panes, 0, pane_len);
-
-  void *menu = first_menu;
-
   menus[0] = first_menu;
 
-  void *window = NULL;
-  void *view = NULL;
+  window = NULL;
+  view = NULL;
+
   if (FRAMEP (Vmenu_updating_frame) &&
       FRAME_LIVE_P (XFRAME (Vmenu_updating_frame)) &&
       FRAME_HAIKU_P (XFRAME (Vmenu_updating_frame)))
@@ -83,9 +92,6 @@ digest_menu_items (void *first_menu, int start, int 
menu_items_used,
        i += 1;
       else if (EQ (AREF (menu_items, i), Qt))
        {
-         Lisp_Object pane_name, prefix;
-         const char *pane_string;
-
          if (menu_items_n_panes == 1)
            {
              i += MENU_ITEMS_PANE_LENGTH;
@@ -116,7 +122,6 @@ digest_menu_items (void *first_menu, int start, int 
menu_items_used,
        }
       else
        {
-         Lisp_Object item_name, enable, descrip, def, selected, help;
          item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME);
          enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE);
          descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY);
@@ -144,7 +149,7 @@ digest_menu_items (void *first_menu, int start, int 
menu_items_used,
            menu = BMenu_new_submenu (menu, SSDATA (item_name), !NILP (enable));
          else if (NILP (def) && menu_separator_name_p (SSDATA (item_name)))
            BMenu_add_separator (menu);
-         else if (!mbar_p)
+         else if (!is_menu_bar)
            {
              if (!use_system_tooltips || NILP (Fsymbol_value (Qtooltip_mode)))
                BMenu_add_item (menu, SSDATA (item_name),
@@ -178,6 +183,8 @@ digest_menu_items (void *first_menu, int start, int 
menu_items_used,
 
   if (view)
     BView_draw_unlock (view);
+
+  SAFE_FREE ();
 }
 
 static Lisp_Object
@@ -376,12 +383,18 @@ Lisp_Object
 haiku_menu_show (struct frame *f, int x, int y, int menuflags,
                 Lisp_Object title, const char **error_name)
 {
-  int i = 0, submenu_depth = 0;
-  void *view = FRAME_HAIKU_VIEW (f);
-  void *menu;
+  int i, submenu_depth, j;
+  void *view, *menu;
+  Lisp_Object *subprefix_stack;
+  Lisp_Object prefix, entry;
 
-  Lisp_Object *subprefix_stack =
-    alloca (menu_items_used * sizeof (Lisp_Object));
+  USE_SAFE_ALLOCA;
+
+  view = FRAME_HAIKU_VIEW (f);
+  i = 0;
+  submenu_depth = 0;
+  subprefix_stack
+    = SAFE_ALLOCA (menu_items_used * sizeof (Lisp_Object));
 
   eassert (FRAME_HAIKU_P (f));
 
@@ -390,6 +403,8 @@ haiku_menu_show (struct frame *f, int x, int y, int 
menuflags,
   if (menu_items_used <= MENU_ITEMS_PANE_LENGTH)
     {
       *error_name = "Empty menu";
+
+      SAFE_FREE ();
       return Qnil;
     }
 
@@ -417,8 +432,6 @@ haiku_menu_show (struct frame *f, int x, int y, int 
menuflags,
 
   if (menu_item_selection)
     {
-      Lisp_Object prefix, entry;
-
       prefix = entry = Qnil;
       i = 0;
       while (i < menu_items_used)
@@ -452,8 +465,6 @@ haiku_menu_show (struct frame *f, int x, int y, int 
menuflags,
                {
                  if (menuflags & MENU_KEYMAPS)
                    {
-                     int j;
-
                      entry = list1 (entry);
                      if (!NILP (prefix))
                        entry = Fcons (prefix, entry);
@@ -464,6 +475,8 @@ haiku_menu_show (struct frame *f, int x, int y, int 
menuflags,
                  block_input ();
                  BPopUpMenu_delete (menu);
                  unblock_input ();
+
+                 SAFE_FREE ();
                  return entry;
                }
              i += MENU_ITEMS_ITEM_LENGTH;
@@ -480,6 +493,8 @@ haiku_menu_show (struct frame *f, int x, int y, int 
menuflags,
   block_input ();
   BPopUpMenu_delete (menu);
   unblock_input ();
+
+  SAFE_FREE ();
   return Qnil;
 }
 
@@ -728,7 +743,7 @@ run_menu_bar_help_event (struct frame *f, int mb_idx)
 
   vec = f->menu_bar_vector;
   if ((mb_idx + MENU_ITEMS_ITEM_HELP) >= ASIZE (vec))
-    emacs_abort ();
+    return;
 
   help = AREF (vec, mb_idx + MENU_ITEMS_ITEM_HELP);
   if (STRINGP (help) || NILP (help))
diff --git a/src/haikuselect.c b/src/haikuselect.c
index a186acc66f..8a7b6f2e0b 100644
--- a/src/haikuselect.c
+++ b/src/haikuselect.c
@@ -33,8 +33,26 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
    the nested event loop inside be_drag_message.  */
 struct frame *haiku_dnd_frame;
 
+/* Whether or not to move the tip frame during drag-and-drop.  */
+bool haiku_dnd_follow_tooltip;
+
 static void haiku_lisp_to_message (Lisp_Object, void *);
 
+static enum haiku_clipboard
+haiku_get_clipboard_name (Lisp_Object clipboard)
+{
+  if (EQ (clipboard, QPRIMARY))
+    return CLIPBOARD_PRIMARY;
+
+  if (EQ (clipboard, QSECONDARY))
+    return CLIPBOARD_SECONDARY;
+
+  if (EQ (clipboard, QCLIPBOARD))
+    return CLIPBOARD_CLIPBOARD;
+
+  signal_error ("Invalid clipboard", clipboard);
+}
+
 DEFUN ("haiku-selection-data", Fhaiku_selection_data, Shaiku_selection_data,
        2, 2, 0,
        doc: /* Retrieve content typed as NAME from the clipboard
@@ -53,22 +71,15 @@ message in the format accepted by `haiku-drag-message', 
which see.  */)
   int rc;
 
   CHECK_SYMBOL (clipboard);
-
-  if (!EQ (clipboard, QPRIMARY) && !EQ (clipboard, QSECONDARY)
-      && !EQ (clipboard, QCLIPBOARD))
-    signal_error ("Invalid clipboard", clipboard);
+  clipboard_name = haiku_get_clipboard_name (clipboard);
 
   if (!NILP (name))
     {
       CHECK_STRING (name);
 
       block_input ();
-      if (EQ (clipboard, QPRIMARY))
-       dat = BClipboard_find_primary_selection_data (SSDATA (name), &len);
-      else if (EQ (clipboard, QSECONDARY))
-       dat = BClipboard_find_secondary_selection_data (SSDATA (name), &len);
-      else
-       dat = BClipboard_find_system_data (SSDATA (name), &len);
+      dat = be_find_clipboard_data (clipboard_name,
+                                   SSDATA (name), &len);
       unblock_input ();
 
       if (!dat)
@@ -83,18 +94,11 @@ message in the format accepted by `haiku-drag-message', 
which see.  */)
                          Qforeign_selection, Qt, str);
 
       block_input ();
-      BClipboard_free_data (dat);
+      free (dat);
       unblock_input ();
     }
   else
     {
-      if (EQ (clipboard, QPRIMARY))
-       clipboard_name = CLIPBOARD_PRIMARY;
-      else if (EQ (clipboard, QSECONDARY))
-       clipboard_name = CLIPBOARD_SECONDARY;
-      else
-       clipboard_name = CLIPBOARD_CLIPBOARD;
-
       block_input ();
       rc = be_lock_clipboard_message (clipboard_name, &message, false);
       unblock_input ();
@@ -139,16 +143,12 @@ In that case, the arguments after NAME are ignored.  */)
   int rc;
   void *message;
 
+  CHECK_SYMBOL (clipboard);
+  clipboard_name = haiku_get_clipboard_name (clipboard);
+
   if (CONSP (name) || NILP (name))
     {
-      if (EQ (clipboard, QPRIMARY))
-       clipboard_name = CLIPBOARD_PRIMARY;
-      else if (EQ (clipboard, QSECONDARY))
-       clipboard_name = CLIPBOARD_SECONDARY;
-      else if (EQ (clipboard, QCLIPBOARD))
-       clipboard_name = CLIPBOARD_CLIPBOARD;
-      else
-       signal_error ("Invalid clipboard", clipboard);
+      be_update_clipboard_count (clipboard_name);
 
       rc = be_lock_clipboard_message (clipboard_name,
                                      &message, true);
@@ -164,7 +164,6 @@ In that case, the arguments after NAME are ignored.  */)
       return unbind_to (ref, Qnil);
     }
 
-  CHECK_SYMBOL (clipboard);
   CHECK_STRING (name);
   if (!NILP (data))
     CHECK_STRING (data);
@@ -172,20 +171,8 @@ In that case, the arguments after NAME are ignored.  */)
   dat = !NILP (data) ? SSDATA (data) : NULL;
   len = !NILP (data) ? SBYTES (data) : 0;
 
-  if (EQ (clipboard, QPRIMARY))
-    BClipboard_set_primary_selection_data (SSDATA (name), dat, len,
-                                          !NILP (clear));
-  else if (EQ (clipboard, QSECONDARY))
-    BClipboard_set_secondary_selection_data (SSDATA (name), dat, len,
-                                            !NILP (clear));
-  else if (EQ (clipboard, QCLIPBOARD))
-    BClipboard_set_system_data (SSDATA (name), dat, len, !NILP (clear));
-  else
-    {
-      unblock_input ();
-      signal_error ("Bad clipboard", clipboard);
-    }
-
+  be_set_clipboard_data (clipboard_name, SSDATA (name), dat, len,
+                        !NILP (clear));
   return Qnil;
 }
 
@@ -193,27 +180,15 @@ DEFUN ("haiku-selection-owner-p", 
Fhaiku_selection_owner_p, Shaiku_selection_own
        0, 1, 0,
        doc: /* Whether the current Emacs process owns the given SELECTION.
 The arg should be the name of the selection in question, typically one
-of the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.  For
-convenience, the symbol nil is the same as `PRIMARY', and t is the
-same as `SECONDARY'.  */)
+of the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.  */)
   (Lisp_Object selection)
 {
   bool value;
-
-  if (NILP (selection))
-    selection = QPRIMARY;
-  else if (EQ (selection, Qt))
-    selection = QSECONDARY;
+  enum haiku_clipboard name;
 
   block_input ();
-  if (EQ (selection, QPRIMARY))
-    value = BClipboard_owns_primary ();
-  else if (EQ (selection, QSECONDARY))
-    value = BClipboard_owns_secondary ();
-  else if (EQ (selection, QCLIPBOARD))
-    value = BClipboard_owns_clipboard ();
-  else
-    value = false;
+  name = haiku_get_clipboard_name (selection);
+  value = be_clipboard_owner_p (name);
   unblock_input ();
 
   return value ? Qt : Qnil;
@@ -275,7 +250,7 @@ haiku_message_to_lisp (void *message)
              if (!pbuf)
                memory_full (SIZE_MAX);
 
-             t1 = build_string (pbuf);
+             t1 = DECODE_FILE (build_string (pbuf));
 
              free (pbuf);
              break;
@@ -320,6 +295,14 @@ haiku_message_to_lisp (void *message)
              t1 = make_int ((intmax_t) *(ssize_t *) buf);
              break;
 
+           case 'DBLE':
+             t1 = make_float (*(double *) buf);
+             break;
+
+           case 'FLOT':
+             t1 = make_float (*(float *) buf);
+             break;
+
            default:
              t1 = make_uninit_string (buf_size);
              memcpy (SDATA (t1), buf, buf_size);
@@ -378,6 +361,14 @@ haiku_message_to_lisp (void *message)
          t2 = Qpoint;
          break;
 
+       case 'DBLE':
+         t2 = Qdouble;
+         break;
+
+       case 'FLOT':
+         t2 = Qfloat;
+         break;
+
        default:
          t2 = make_int (type_code);
        }
@@ -423,6 +414,10 @@ lisp_to_type_code (Lisp_Object obj)
     return 'SSZT';
   else if (EQ (obj, Qpoint))
     return 'BPNT';
+  else if (EQ (obj, Qfloat))
+    return 'FLOT';
+  else if (EQ (obj, Qdouble))
+    return 'DBLE';
   else
     return -1;
 }
@@ -441,7 +436,8 @@ haiku_lisp_to_message (Lisp_Object obj, void *message)
   ssize_t ssizet_data;
   intmax_t t4;
   uintmax_t t5;
-  float t6, t7;
+  float t6, t7, float_data;
+  double double_data;
   int rc;
   specpdl_ref ref;
 
@@ -526,7 +522,8 @@ haiku_lisp_to_message (Lisp_Object obj, void *message)
            case 'RREF':
              CHECK_STRING (data);
 
-             if (be_add_refs_data (message, SSDATA (name), SSDATA (data))
+             if (be_add_refs_data (message, SSDATA (name),
+                                   SSDATA (ENCODE_FILE (data)))
                  && haiku_signal_invalid_refs)
                signal_error ("Invalid file name", data);
              break;
@@ -544,6 +541,30 @@ haiku_lisp_to_message (Lisp_Object obj, void *message)
                signal_error ("Invalid point", data);
              break;
 
+           case 'FLOT':
+             CHECK_NUMBER (data);
+             float_data = XFLOATINT (data);
+
+             rc = be_add_message_data (message, SSDATA (name),
+                                       type_code, &float_data,
+                                       sizeof float_data);
+
+             if (rc)
+               signal_error ("Failed to add float", data);
+             break;
+
+           case 'DBLE':
+             CHECK_NUMBER (data);
+             double_data = XFLOATINT (data);
+
+             rc = be_add_message_data (message, SSDATA (name),
+                                       type_code, &double_data,
+                                       sizeof double_data);
+
+             if (rc)
+               signal_error ("Failed to add double", data);
+             break;
+
            case 'SHRT':
              if (!TYPE_RANGED_FIXNUMP (int16, data))
                signal_error ("Invalid value", data);
@@ -737,7 +758,7 @@ haiku_unwind_drag_message (void *message)
 }
 
 DEFUN ("haiku-drag-message", Fhaiku_drag_message, Shaiku_drag_message,
-       2, 3, 0,
+       2, 4, 0,
        doc: /* Begin dragging MESSAGE from FRAME.
 
 MESSAGE an alist of strings, denoting message field names, to a list
@@ -758,6 +779,10 @@ system.  If TYPE is `ssize_t', then DATA is an integer 
that can hold
 values from -1 to the maximum value of the C data type `ssize_t' on
 the current system.  If TYPE is `point', then DATA is a cons of float
 values describing the X and Y coordinates of an on-screen location.
+If TYPE is `float', then DATA is a low-precision floating point
+number, whose exact precision is not guaranteed.  If TYPE is `double',
+then DATA is a floating point number that can represent any value a
+Lisp float can represent.
 
 If the field name is not a string but the symbol `type', then it
 associates to a 32-bit unsigned integer describing the type of the
@@ -767,8 +792,12 @@ FRAME is a window system frame that must be visible, from 
which the
 drag will originate.
 
 ALLOW-SAME-FRAME, if nil or not specified, means that MESSAGE will be
-ignored if it is dropped on top of FRAME.  */)
-  (Lisp_Object frame, Lisp_Object message, Lisp_Object allow_same_frame)
+ignored if it is dropped on top of FRAME.
+
+FOLLOW-TOOLTIP, if non-nil, will cause any non-system tooltip
+currently being displayed to move along with the mouse pointer.  */)
+  (Lisp_Object frame, Lisp_Object message, Lisp_Object allow_same_frame,
+   Lisp_Object follow_tooltip)
 {
   specpdl_ref idx;
   void *be_message;
@@ -782,23 +811,167 @@ ignored if it is dropped on top of FRAME.  */)
     error ("Frame is invisible");
 
   haiku_dnd_frame = f;
+  haiku_dnd_follow_tooltip = !NILP (follow_tooltip);
   be_message = be_create_simple_message ();
 
   record_unwind_protect_ptr (haiku_unwind_drag_message, be_message);
   haiku_lisp_to_message (message, be_message);
+
   rc = be_drag_message (FRAME_HAIKU_VIEW (f), be_message,
                        !NILP (allow_same_frame),
                        block_input, unblock_input,
                        process_pending_signals,
                        haiku_should_quit_drag);
-  FRAME_DISPLAY_INFO (f)->grabbed = 0;
 
+  /* Don't clear the mouse grab if the user decided to quit instead
+     of the drop finishing.  */
   if (rc)
     quit ();
 
+  /* Now dismiss the tooltip, since the drop presumably succeeded.  */
+  if (!NILP (follow_tooltip))
+    Fx_hide_tip ();
+
+  FRAME_DISPLAY_INFO (f)->grabbed = 0;
+
   return unbind_to (idx, Qnil);
 }
 
+DEFUN ("haiku-roster-launch", Fhaiku_roster_launch, Shaiku_roster_launch,
+       2, 2, 0,
+       doc: /* Launch an application associated with FILE-OR-TYPE.
+Return the process ID of any process created, the symbol
+`already-running' if ARGS was sent to a program that's already
+running, or nil if launching the application failed because no
+application was found for FILE-OR-TYPE.
+
+Signal an error if FILE-OR-TYPE is invalid, or if ARGS is a message
+but the application doesn't accept messages.
+
+FILE-OR-TYPE can either be a string denoting a MIME type, or a list
+with one argument FILE, denoting a file whose associated application
+will be launched.
+
+ARGS can either be a vector of strings containing the arguments that
+will be passed to the application, or a system message in the form
+accepted by `haiku-drag-message' that will be sent to the application
+after it starts.  */)
+  (Lisp_Object file_or_type, Lisp_Object args)
+{
+  char **cargs;
+  char *type, *file;
+  team_id team_id;
+  status_t rc;
+  ptrdiff_t i, nargs;
+  Lisp_Object tem, canonical;
+  void *message;
+  specpdl_ref depth;
+
+  type = NULL;
+  file = NULL;
+  cargs = NULL;
+  message = NULL;
+  nargs = 0;
+  depth = SPECPDL_INDEX ();
+
+  USE_SAFE_ALLOCA;
+
+  if (STRINGP (file_or_type))
+    SAFE_ALLOCA_STRING (type, file_or_type);
+  else
+    {
+      CHECK_LIST (file_or_type);
+      tem = XCAR (file_or_type);
+      canonical = Fexpand_file_name (tem, Qnil);
+
+      CHECK_STRING (tem);
+      SAFE_ALLOCA_STRING (file, ENCODE_FILE (canonical));
+      CHECK_LIST_END (XCDR (file_or_type), file_or_type);
+    }
+
+  if (VECTORP (args))
+    {
+      nargs = ASIZE (args);
+      cargs = SAFE_ALLOCA (nargs * sizeof *cargs);
+
+      for (i = 0; i < nargs; ++i)
+       {
+         tem = AREF (args, i);
+         CHECK_STRING (tem);
+         maybe_quit ();
+
+         cargs[i] = SAFE_ALLOCA (SBYTES (tem) + 1);
+         memcpy (cargs[i], SDATA (tem), SBYTES (tem) + 1);
+       }
+    }
+  else
+    {
+      message = be_create_simple_message ();
+
+      record_unwind_protect_ptr (BMessage_delete, message);
+      haiku_lisp_to_message (args, message);
+    }
+
+  block_input ();
+  rc = be_roster_launch (type, file, cargs, nargs, message,
+                        &team_id);
+  unblock_input ();
+
+  /* `be_roster_launch' can potentially take a while in IO, but
+     signals from async input will interrupt that operation.  If the
+     user wanted to quit, act like it.  */
+  maybe_quit ();
+
+  if (rc == B_OK)
+    return SAFE_FREE_UNBIND_TO (depth,
+                               make_uint (team_id));
+  else if (rc == B_ALREADY_RUNNING)
+    return Qalready_running;
+  else if (rc == B_BAD_VALUE)
+    signal_error ("Invalid type or bad arguments",
+                 list2 (file_or_type, args));
+
+  return SAFE_FREE_UNBIND_TO (depth, Qnil);
+}
+
+static void
+haiku_dnd_compute_tip_xy (int *root_x, int *root_y)
+{
+  int min_x, min_y, max_x, max_y;
+  int width, height;
+
+  width = FRAME_PIXEL_WIDTH (XFRAME (tip_frame));
+  height = FRAME_PIXEL_HEIGHT (XFRAME (tip_frame));
+
+  min_x = 0;
+  min_y = 0;
+  be_get_screen_dimensions (&max_x, &max_y);
+
+  if (*root_y + XFIXNUM (tip_dy) <= min_y)
+    *root_y = min_y; /* Can happen for negative dy */
+  else if (*root_y + XFIXNUM (tip_dy) + height <= max_y)
+    /* It fits below the pointer */
+    *root_y += XFIXNUM (tip_dy);
+  else if (height + XFIXNUM (tip_dy) + min_y <= *root_y)
+    /* It fits above the pointer.  */
+    *root_y -= height + XFIXNUM (tip_dy);
+  else
+    /* Put it on the top.  */
+    *root_y = min_y;
+
+  if (*root_x + XFIXNUM (tip_dx) <= min_x)
+    *root_x = 0; /* Can happen for negative dx */
+  else if (*root_x + XFIXNUM (tip_dx) + width <= max_x)
+    /* It fits to the right of the pointer.  */
+    *root_x += XFIXNUM (tip_dx);
+  else if (width + XFIXNUM (tip_dx) + min_x <= *root_x)
+    /* It fits to the left of the pointer.  */
+    *root_x -= width + XFIXNUM (tip_dx);
+  else
+    /* Put it left justified on the screen -- it ought to fit that way.  */
+    *root_x = min_x;
+}
+
 static Lisp_Object
 haiku_note_drag_motion_1 (void *data)
 {
@@ -817,6 +990,26 @@ haiku_note_drag_motion_2 (enum nonlocal_exit exit, 
Lisp_Object error)
 void
 haiku_note_drag_motion (void)
 {
+  struct frame *tip_f;
+  int x, y;
+
+  if (FRAMEP (tip_frame) && haiku_dnd_follow_tooltip
+      && FIXNUMP (tip_dx) && FIXNUMP (tip_dy))
+    {
+      tip_f = XFRAME (tip_frame);
+
+      if (FRAME_LIVE_P (tip_f) && FRAME_VISIBLE_P (tip_f))
+       {
+         BView_get_mouse (FRAME_HAIKU_VIEW (haiku_dnd_frame),
+                          &x, &y);
+         BView_convert_to_screen (FRAME_HAIKU_VIEW (haiku_dnd_frame),
+                                  &x, &y);
+
+         haiku_dnd_compute_tip_xy (&x, &y);
+         BWindow_set_offset (FRAME_HAIKU_WINDOW (tip_f), x, y);
+       }
+    }
+
   internal_catch_all (haiku_note_drag_motion_1, NULL,
                      haiku_note_drag_motion_2);
 }
@@ -855,11 +1048,15 @@ used to retrieve the current position of the mouse.  */);
   DEFSYM (Qsize_t, "size_t");
   DEFSYM (Qssize_t, "ssize_t");
   DEFSYM (Qpoint, "point");
+  DEFSYM (Qfloat, "float");
+  DEFSYM (Qdouble, "double");
+  DEFSYM (Qalready_running, "already-running");
 
   defsubr (&Shaiku_selection_data);
   defsubr (&Shaiku_selection_put);
   defsubr (&Shaiku_selection_owner_p);
   defsubr (&Shaiku_drag_message);
+  defsubr (&Shaiku_roster_launch);
 
   haiku_dnd_frame = NULL;
 }
diff --git a/src/haikuselect.h b/src/haikuselect.h
index d4f331a9cc..e9a2f2dd77 100644
--- a/src/haikuselect.h
+++ b/src/haikuselect.h
@@ -37,31 +37,17 @@ enum haiku_clipboard
 #ifdef __cplusplus
 extern "C"
 {
+/* Also declared in haikuterm.h for use in emacs.c.  */
 extern void init_haiku_select (void);
 #endif
 /* Whether or not the selection was recently changed.  */
 
-/* Find a string with the MIME type TYPE in the system clipboard.  */
-extern char *BClipboard_find_system_data (const char *, ssize_t *);
-extern char *BClipboard_find_primary_selection_data (const char *, ssize_t *);
-extern char *BClipboard_find_secondary_selection_data (const char *, ssize_t 
*);
-
-extern void BClipboard_set_system_data (const char *, const char *, ssize_t, 
bool);
-extern void BClipboard_set_primary_selection_data (const char *, const char *,
-                                                  ssize_t, bool);
-extern void BClipboard_set_secondary_selection_data (const char *, const char 
*,
-                                                    ssize_t, bool);
-
-extern void BClipboard_system_targets (char **, int);
-extern void BClipboard_primary_targets (char **, int);
-extern void BClipboard_secondary_targets (char **, int);
-
-extern bool BClipboard_owns_clipboard (void);
-extern bool BClipboard_owns_primary (void);
-extern bool BClipboard_owns_secondary (void);
-
-/* Free the returned data.  */
-extern void BClipboard_free_data (void *);
+extern char *be_find_clipboard_data (enum haiku_clipboard, const char *, 
ssize_t *);
+extern void be_set_clipboard_data (enum haiku_clipboard, const char *, const 
char *,
+                                  ssize_t, bool);
+extern void be_get_clipboard_targets (enum haiku_clipboard, char **, int);
+extern bool be_clipboard_owner_p (enum haiku_clipboard);
+extern void be_update_clipboard_count (enum haiku_clipboard);
 
 extern int be_enum_message (void *, int32 *, int32, int32 *, const char **);
 extern int be_get_message_data (void *, const char *, int32, int32,
diff --git a/src/haikuterm.c b/src/haikuterm.c
index ced16d9f09..365b23cd92 100644
--- a/src/haikuterm.c
+++ b/src/haikuterm.c
@@ -43,17 +43,24 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 /* Minimum and maximum values used for Haiku scroll bars.  */
 #define BE_SB_MAX 12000000
 
-struct haiku_display_info *x_display_list = NULL;
-extern frame_parm_handler haiku_frame_parm_handlers[];
+/* The single Haiku display (if any).  */
+struct haiku_display_info *x_display_list;
 
 /* This is used to determine when to evict the font lookup cache,
    which we do every 50 updates.  */
 static int up_to_date_count;
 
+/* List of defined fringe bitmaps.  */
 static void **fringe_bmps;
-static int max_fringe_bmp = 0;
 
+/* The amount of fringe bitmaps in that list.  */
+static int max_fringe_bmp;
+
+/* Alist of resources to their values.  */
 static Lisp_Object rdb;
+
+/* Non-zero means that a HELP_EVENT has been generated since Emacs
+   start.  */
 static bool any_help_event_p;
 
 char *
@@ -89,14 +96,9 @@ static void
 haiku_coords_from_parent (struct frame *f, int *x, int *y)
 {
   struct frame *p = FRAME_PARENT_FRAME (f);
-  eassert (p);
 
-  for (struct frame *parent = p; parent;
-       parent = FRAME_PARENT_FRAME (parent))
-    {
-      *x -= parent->left_pos;
-      *y -= parent->top_pos;
-    }
+  *x -= FRAME_OUTPUT_DATA (p)->frame_x;
+  *y -= FRAME_OUTPUT_DATA (p)->frame_y;
 }
 
 static void
@@ -115,7 +117,8 @@ haiku_delete_terminal (struct terminal *terminal)
 }
 
 static const char *
-get_string_resource (void *ignored, const char *name, const char *class)
+haiku_get_string_resource (void *ignored, const char *name,
+                          const char *class)
 {
   const char *native;
 
@@ -196,6 +199,8 @@ haiku_clip_to_string_exactly (struct glyph_string *s, 
struct glyph_string *dst)
 {
   BView_ClipToRect (FRAME_HAIKU_VIEW (s->f), s->x, s->y,
                    s->width, s->height);
+  BView_invalidate_region (FRAME_HAIKU_VIEW (s->f), s->x,
+                          s->y, s->width, s->height);
 }
 
 static void
@@ -511,6 +516,9 @@ haiku_scroll_bar_from_widget (void *scroll_bar, void 
*window)
   if (!frame)
     return NULL;
 
+  if (!scroll_bar)
+    return NULL;
+
   if (!NILP (FRAME_SCROLL_BARS (frame)))
     {
       for (tem = FRAME_SCROLL_BARS (frame); !NILP (tem);
@@ -567,20 +575,24 @@ haiku_query_frame_background_color (struct frame *f, 
Emacs_Color *bgcolor)
 }
 
 static bool
-haiku_defined_color (struct frame *f,
-                    const char *name,
-                    Emacs_Color *color,
-                    bool alloc,
-                    bool make_index)
+haiku_defined_color (struct frame *f, const char *name,
+                    Emacs_Color *color, bool alloc, bool make_index)
 {
-  return !haiku_get_color (name, color);
+  int rc;
+
+  rc = !haiku_get_color (name, color);
+
+  if (rc && f->gamma && alloc)
+    gamma_correct (f, color);
+
+  return rc;
 }
 
 /* Adapted from xterm `x_draw_box_rect'.  */
 static void
-haiku_draw_box_rect (struct glyph_string *s,
-                    int left_x, int top_y, int right_x, int bottom_y, int 
hwidth,
-                    int vwidth, bool left_p, bool right_p, struct haiku_rect 
*clip_rect)
+haiku_draw_box_rect (struct glyph_string *s, int left_x, int top_y,
+                    int right_x, int bottom_y, int hwidth, int vwidth,
+                    bool left_p, bool right_p, struct haiku_rect *clip_rect)
 {
   void *view = FRAME_HAIKU_VIEW (s->f);
   struct face *face = s->face;
@@ -604,13 +616,19 @@ static void
 haiku_calculate_relief_colors (struct glyph_string *s, uint32_t *rgbout_w,
                               uint32_t *rgbout_b)
 {
-  struct face *face = s->face;
   double h, cs, l;
   uint32_t rgbin;
   struct haiku_output *di;
 
-  rgbin = (face->use_box_color_for_shadows_p
-          ? face->box_color : face->background);
+  if (s->face->use_box_color_for_shadows_p)
+    rgbin = s->face->box_color;
+  else if (s->first_glyph->type == IMAGE_GLYPH
+          && s->img->pixmap
+          && !IMAGE_BACKGROUND_TRANSPARENT (s->img, s->f, 0))
+    rgbin = IMAGE_BACKGROUND (s->img, s->f, 0);
+  else
+    rgbin = s->face->background;
+
   di = FRAME_OUTPUT_DATA (s->f);
 
   if (s->hl == DRAW_CURSOR)
@@ -632,30 +650,35 @@ haiku_calculate_relief_colors (struct glyph_string *s, 
uint32_t *rgbout_w,
 }
 
 static void
-haiku_draw_relief_rect (struct glyph_string *s,
-                       int left_x, int top_y, int right_x, int bottom_y,
-                       int hwidth, int vwidth, bool raised_p, bool top_p,
-                       bool bot_p, bool left_p, bool right_p,
-                       struct haiku_rect *clip_rect, bool fancy_p)
+haiku_draw_relief_rect (struct glyph_string *s, int left_x, int top_y,
+                       int right_x, int bottom_y, int hwidth, int vwidth,
+                       bool raised_p, bool top_p, bool bot_p, bool left_p,
+                       bool right_p, struct haiku_rect *clip_rect)
 {
   uint32_t color_white, color_black;
   void *view;
 
+  view = FRAME_HAIKU_VIEW (s->f);
   haiku_calculate_relief_colors (s, &color_white, &color_black);
 
-  view = FRAME_HAIKU_VIEW (s->f);
   BView_SetHighColor (view, raised_p ? color_white : color_black);
+
   if (clip_rect)
     {
       BView_StartClip (view);
       haiku_clip_to_string (s);
-      BView_ClipToRect (view, clip_rect->x, clip_rect->y, clip_rect->width,
-                       clip_rect->height);
+      BView_ClipToRect (view, clip_rect->x, clip_rect->y,
+                       clip_rect->width, clip_rect->height);
     }
+
   if (top_p)
-    BView_FillRectangle (view, left_x, top_y, right_x - left_x + 1, hwidth);
+    BView_FillRectangle (view, left_x, top_y,
+                        right_x - left_x + 1, hwidth);
+
   if (left_p)
-    BView_FillRectangle (view, left_x, top_y, vwidth, bottom_y - top_y + 1);
+    BView_FillRectangle (view, left_x, top_y,
+                        vwidth, bottom_y - top_y + 1);
+
   BView_SetHighColor (view, !raised_p ? color_white : color_black);
 
   if (bot_p)
@@ -696,10 +719,10 @@ haiku_draw_relief_rect (struct glyph_string *s,
   if (vwidth > 1 && right_p)
     BView_StrokeLine (view, right_x, top_y, right_x, bottom_y);
 
-  BView_SetHighColor (view, s->face->background);
+  BView_SetHighColor (view, FRAME_BACKGROUND_PIXEL (s->f));
 
   /* Omit corner pixels.  */
-  if (hwidth > 1 || vwidth > 1)
+  if (hwidth > 1 && vwidth > 1)
     {
       if (left_p && top_p)
        BView_FillRectangle (view, left_x, top_y, 1, 1);
@@ -715,22 +738,41 @@ haiku_draw_relief_rect (struct glyph_string *s,
     BView_EndClip (view);
 }
 
+static void
+haiku_get_scale_factor (int *scale_x, int *scale_y)
+{
+  struct haiku_display_info *dpyinfo = x_display_list;
+
+  if (dpyinfo->resx > 96)
+    *scale_x = floor (dpyinfo->resx / 96);
+  if (dpyinfo->resy > 96)
+    *scale_y = floor (dpyinfo->resy / 96);
+}
+
 static void
 haiku_draw_underwave (struct glyph_string *s, int width, int x)
 {
-  int wave_height = 3, wave_length = 2;
-  int y, dx, dy, odd, xmax;
+  int wave_height, wave_length;
+  int y, dx, dy, odd, xmax, scale_x, scale_y;
   float ax, ay, bx, by;
-  void *view = FRAME_HAIKU_VIEW (s->f);
+  void *view;
+
+  scale_x = 1;
+  scale_y = 1;
+  haiku_get_scale_factor (&scale_x, &scale_y);
+  wave_height = 3 * scale_y;
+  wave_length = 2 * scale_x;
 
   dx = wave_length;
   dy = wave_height - 1;
   y = s->ybase - wave_height + 3;
   xmax = x + width;
+  view = FRAME_HAIKU_VIEW (s->f);
 
   BView_StartClip (view);
   haiku_clip_to_string (s);
   BView_ClipToRect (view, x, y, width, wave_height);
+
   ax = x - ((int) (x) % dx) + (float) 0.5;
   bx = ax + dx;
   odd = (int) (ax / dx) % 2;
@@ -741,6 +783,8 @@ haiku_draw_underwave (struct glyph_string *s, int width, 
int x)
   else
     by += dy;
 
+  BView_SetPenSize (view, scale_y);
+
   while (ax <= xmax)
     {
       BView_StrokeLine (view, ax, ay, bx, by);
@@ -748,6 +792,8 @@ haiku_draw_underwave (struct glyph_string *s, int width, 
int x)
       bx += dx, by = y + 0.5 + odd * dy;
       odd = !odd;
     }
+
+  BView_SetPenSize (view, 1);
   BView_EndClip (view);
 }
 
@@ -809,13 +855,13 @@ haiku_draw_text_decoration (struct glyph_string *s, 
struct face *face,
              val = (WINDOW_BUFFER_LOCAL_VALUE
                     (Qx_underline_at_descent_line, s->w));
              underline_at_descent_line
-               = (!(NILP (val) || EQ (val, Qunbound))
+               = (!(NILP (val) || BASE_EQ (val, Qunbound))
                   || s->face->underline_at_descent_line_p);
 
              val = (WINDOW_BUFFER_LOCAL_VALUE
                     (Qx_use_underline_position_properties, s->w));
              use_underline_position_properties
-               = !(NILP (val) || EQ (val, Qunbound));
+               = !(NILP (val) || BASE_EQ (val, Qunbound));
 
              /* Get the underline thickness.  Default is 1 pixel.  */
              if (font && font->underline_thickness > 0)
@@ -958,15 +1004,16 @@ haiku_draw_string_box (struct glyph_string *s)
   else
     haiku_draw_relief_rect (s, left_x, top_y, right_x, bottom_y, hwidth,
                            vwidth, raised_p, true, true, left_p, right_p,
-                           NULL, 1);
+                           NULL);
 }
 
 static void
 haiku_draw_plain_background (struct glyph_string *s, struct face *face,
-                            int box_line_hwidth, int box_line_vwidth)
+                            int x, int y, int width, int height)
 {
   void *view = FRAME_HAIKU_VIEW (s->f);
   unsigned long cursor_color;
+
   if (s->hl == DRAW_CURSOR)
     {
       haiku_merge_cursor_foreground (s, NULL, &cursor_color);
@@ -975,18 +1022,92 @@ haiku_draw_plain_background (struct glyph_string *s, 
struct face *face,
   else
     BView_SetHighColor (view, face->background_defaulted_p ?
                        FRAME_BACKGROUND_PIXEL (s->f) :
-                     face->background);
+                       face->background);
+
+  BView_FillRectangle (view, x, y, width, height);
+}
+
+static struct haiku_bitmap_record *
+haiku_get_bitmap_rec (struct frame *f, ptrdiff_t id)
+{
+  return &FRAME_DISPLAY_INFO (f)->bitmaps[id - 1];
+}
+
+static void
+haiku_update_bitmap_rec (struct haiku_bitmap_record *rec,
+                        uint32_t new_foreground,
+                        uint32_t new_background)
+{
+  char *bits;
+  int x, y, bytes_per_line;
+
+  if (new_foreground == rec->stipple_foreground
+      && new_background == rec->stipple_background)
+    return;
+
+  bits = rec->stipple_bits;
+  bytes_per_line = (rec->width + 7) / 8;
+
+  for (y = 0; y < rec->height; y++)
+    {
+      for (x = 0; x < rec->width; x++)
+       haiku_put_pixel (rec->img, x, y,
+                        ((bits[x / 8] >> (x % 8)) & 1
+                         ? new_foreground : new_background));
+
+      bits += bytes_per_line;
+    }
 
-  BView_FillRectangle (view, s->x,
-                      s->y + box_line_hwidth,
-                      s->background_width,
-                      s->height - 2 * box_line_hwidth);
+  rec->stipple_foreground = new_foreground;
+  rec->stipple_background = new_background;
 }
 
 static void
 haiku_draw_stipple_background (struct glyph_string *s, struct face *face,
-                              int box_line_hwidth, int box_line_vwidth)
+                              int x, int y, int width, int height,
+                              bool explicit_colors_p,
+                              uint32 explicit_background,
+                              uint32 explicit_foreground)
 {
+  struct haiku_bitmap_record *rec;
+  unsigned long foreground, background;
+  void *view;
+
+  view = FRAME_HAIKU_VIEW (s->f);
+  rec = haiku_get_bitmap_rec (s->f, s->face->stipple);
+
+  if (explicit_colors_p)
+    {
+      background = explicit_background;
+      foreground = explicit_foreground;
+    }
+  else if (s->hl == DRAW_CURSOR)
+    haiku_merge_cursor_foreground (s, &foreground, &background);
+  else
+    {
+      foreground = s->face->foreground;
+      background = s->face->background;
+    }
+
+  haiku_update_bitmap_rec (rec, foreground, background);
+
+  BView_StartClip (view);
+  haiku_clip_to_string (s);
+  BView_ClipToRect (view, x, y, width, height);
+  BView_DrawBitmapTiled (view, rec->img, 0, 0, -1, -1,
+                        0, 0, x + width, y + height);
+  BView_EndClip (view);
+}
+
+void
+haiku_draw_background_rect (struct glyph_string *s, struct face *face,
+                           int x, int y, int width, int height)
+{
+  if (!s->stippled_p)
+    haiku_draw_plain_background (s, face, x, y, width, height);
+  else
+    haiku_draw_stipple_background (s, face, x, y, width, height,
+                                  false, 0, 0);
 }
 
 static void
@@ -1002,12 +1123,10 @@ haiku_maybe_draw_background (struct glyph_string *s, 
int force_p)
          || FONT_TOO_HIGH (s->font)
           || s->font_not_found_p || s->extends_to_end_of_line_p || force_p)
        {
-         if (!face->stipple)
-           haiku_draw_plain_background (s, face, box_line_width,
-                                        box_vline_width);
-         else
-           haiku_draw_stipple_background (s, face, box_line_width,
-                                          box_vline_width);
+         haiku_draw_background_rect (s, s->face, s->x, s->y + box_line_width,
+                                     s->background_width,
+                                     s->height - 2 * box_line_width);
+
          s->background_filled_p = 1;
        }
     }
@@ -1182,9 +1301,8 @@ haiku_draw_glyphless_glyph_string_foreground (struct 
glyph_string *s)
 static void
 haiku_draw_stretch_glyph_string (struct glyph_string *s)
 {
-  eassert (s->first_glyph->type == STRETCH_GLYPH);
-
   struct face *face = s->face;
+  uint32_t bkg;
 
   if (s->hl == DRAW_CURSOR && !x_stretch_cursor_p)
     {
@@ -1232,9 +1350,11 @@ haiku_draw_stretch_glyph_string (struct glyph_string *s)
          int y = s->y;
          int w = background_width - width, h = s->height;
 
+         /* Draw stipples manually because we want the background
+            part of a stretch glyph to have a stipple even if the
+            cursor is visible on top.  */
          if (!face->stipple)
            {
-             uint32_t bkg;
              if (s->row->mouse_face_p && cursor_in_mouse_face_p (s->w))
                haiku_mouse_face_colors (s, NULL, &bkg);
              else
@@ -1243,6 +1363,16 @@ haiku_draw_stretch_glyph_string (struct glyph_string *s)
              BView_SetHighColor (view, bkg);
              BView_FillRectangle (view, x, y, w, h);
            }
+         else
+           {
+             if (s->row->mouse_face_p && cursor_in_mouse_face_p (s->w))
+               haiku_mouse_face_colors (s, NULL, &bkg);
+             else
+               bkg = face->background;
+
+             haiku_draw_stipple_background (s, s->face, x, y, w, h,
+                                            true, bkg, face->foreground);
+           }
        }
     }
   else if (!s->background_filled_p)
@@ -1260,17 +1390,8 @@ haiku_draw_stretch_glyph_string (struct glyph_string *s)
        }
 
       if (background_width > 0)
-       {
-         void *view = FRAME_HAIKU_VIEW (s->f);
-         unsigned long bkg;
-         if (s->hl == DRAW_CURSOR)
-           haiku_merge_cursor_foreground (s, NULL, &bkg);
-         else
-           bkg = s->face->background;
-
-         BView_SetHighColor (view, bkg);
-         BView_FillRectangle (view, x, s->y, background_width, s->height);
-       }
+       haiku_draw_background_rect (s, s->face, s->x, s->y,
+                                   background_width, s->height);
     }
   s->background_filled_p = 1;
 }
@@ -1504,19 +1625,20 @@ haiku_draw_image_relief (struct glyph_string *s)
 
   get_glyph_string_clip_rect (s, &r);
   haiku_draw_relief_rect (s, x, y, x1, y1, thick, thick, raised_p,
-                         top_p, bot_p, left_p, right_p, &r, 0);
+                         top_p, bot_p, left_p, right_p, &r);
 }
 
 static void
 haiku_draw_image_glyph_string (struct glyph_string *s)
 {
   struct face *face = s->face;
-
+  void *view, *bitmap, *mask;
   int box_line_hwidth = max (face->box_vertical_line_width, 0);
   int box_line_vwidth = max (face->box_horizontal_line_width, 0);
-
-  int x, y;
-  int height, width;
+  int x, y, height, width, relief;
+  struct haiku_rect nr;
+  Emacs_Rectangle cr, ir, r;
+  unsigned long background;
 
   height = s->height;
   if (s->slice.y == 0)
@@ -1537,19 +1659,22 @@ haiku_draw_image_glyph_string (struct glyph_string *s)
   if (s->slice.y == 0)
     y += box_line_vwidth;
 
-  void *view = FRAME_HAIKU_VIEW (s->f);
-  void *bitmap = s->img->pixmap;
+  view = FRAME_HAIKU_VIEW (s->f);
+  bitmap = s->img->pixmap;
 
+  /* TODO: implement stipples for images with masks.  */
   s->stippled_p = face->stipple != 0;
 
-  BView_SetHighColor (view, face->background);
+  if (s->hl == DRAW_CURSOR)
+    haiku_merge_cursor_foreground (s, NULL, &background);
+  else
+    background = face->background;
+
+  BView_SetHighColor (view, background);
   BView_FillRectangle (view, x, y, width, height);
 
   if (bitmap)
     {
-      struct haiku_rect nr;
-      Emacs_Rectangle cr, ir, r;
-
       get_glyph_string_clip_rect (s, &nr);
       CONVERT_TO_EMACS_RECT (cr, nr);
       x = s->x;
@@ -1571,7 +1696,7 @@ haiku_draw_image_glyph_string (struct glyph_string *s)
       ir.height = s->slice.height;
       r = ir;
 
-      void *mask = s->img->mask;
+      mask = s->img->mask;
 
       if (gui_intersect_rectangles (&cr, &ir, &r))
        {
@@ -1605,11 +1730,25 @@ haiku_draw_image_glyph_string (struct glyph_string *s)
            BBitmap_free (bitmap);
        }
 
-      if (s->hl == DRAW_CURSOR)
+      if (!s->img->mask)
        {
-         BView_SetPenSize (view, 1);
-         BView_SetHighColor (view, FRAME_CURSOR_COLOR (s->f).pixel);
-         BView_StrokeRectangle (view, r.x, r.y, r.width, r.height);
+         /* When the image has a mask, we can expect that at
+            least part of a mouse highlight or a block cursor will
+            be visible.  If the image doesn't have a mask, make
+            a block cursor visible by drawing a rectangle around
+            the image.  I believe it's looking better if we do
+            nothing here for mouse-face.  */
+
+         if (s->hl == DRAW_CURSOR)
+           {
+             relief = eabs (s->img->relief);
+
+             BView_SetPenSize (view, 1);
+             BView_SetHighColor (view, FRAME_CURSOR_COLOR (s->f).pixel);
+             BView_StrokeRectangle (view, x - relief, y - relief,
+                                    s->slice.width + relief * 2,
+                                    s->slice.height + relief * 2);
+           }
        }
     }
 
@@ -1622,16 +1761,14 @@ haiku_draw_image_glyph_string (struct glyph_string *s)
 static void
 haiku_draw_glyph_string (struct glyph_string *s)
 {
-  void *view;
+  void *view = FRAME_HAIKU_VIEW (s->f);;
+  struct face *face = s->face;
 
   block_input ();
-  view = FRAME_HAIKU_VIEW (s->f);
   BView_draw_lock (view, false, 0, 0, 0, 0);
   prepare_face_for_display (s->f, s->face);
 
-  struct face *face = s->face;
-  if (face != s->face)
-    prepare_face_for_display (s->f, face);
+  s->stippled_p = s->hl != DRAW_CURSOR && face->stipple;
 
   if (s->next && s->right_overhang && !s->for_overlaps)
     {
@@ -1643,13 +1780,16 @@ haiku_draw_glyph_string (struct glyph_string *s)
           width += next->width, next = next->next)
        if (next->first_glyph->type != IMAGE_GLYPH)
           {
-           prepare_face_for_display (s->f, s->next->face);
-           haiku_start_clip (s->next);
-           haiku_clip_to_string (s->next);
+           prepare_face_for_display (s->f, next->face);
+           next->stippled_p
+             = next->hl != DRAW_CURSOR && next->face->stipple;
+
+           haiku_start_clip (next);
+           haiku_clip_to_string (next);
             if (next->first_glyph->type != STRETCH_GLYPH)
-             haiku_maybe_draw_background (s->next, 1);
+             haiku_maybe_draw_background (next, true);
             else
-             haiku_draw_stretch_glyph_string (s->next);
+             haiku_draw_stretch_glyph_string (next);
            haiku_end_clip (s);
           }
     }
@@ -1774,8 +1914,21 @@ haiku_draw_glyph_string (struct glyph_string *s)
              }
        }
     }
+
   haiku_end_clip (s);
   BView_draw_unlock (view);
+
+  /* Set the stipple_p flag indicating whether or not a stipple was
+     drawn in s->row.  That is the case either when s is a stretch
+     glyph string and s->face->stipple is not NULL, or when
+     s->face->stipple exists and s->hl is not DRAW_CURSOR, and s is
+     not an image.  This is different from X.  */
+  if (s->first_glyph->type != IMAGE_GLYPH
+      && s->face->stipple
+      && (s->first_glyph->type == STRETCH_GLYPH
+         || s->hl != DRAW_CURSOR))
+    s->row->stipple_p = true;
+
   unblock_input ();
 }
 
@@ -1811,8 +1964,9 @@ haiku_after_update_window_line (struct window *w,
          void *view = FRAME_HAIKU_VIEW (f);
          BView_draw_lock (view, false, 0, 0, 0, 0);
          BView_StartClip (view);
-         BView_SetHighColor (view, face->background_defaulted_p ?
-                             FRAME_BACKGROUND_PIXEL (f) : face->background);
+         BView_SetHighColor (view, (face->background_defaulted_p
+                                    ? FRAME_BACKGROUND_PIXEL (f)
+                                    : face->background));
          BView_FillRectangle (view, 0, y, width, height);
          BView_FillRectangle (view, FRAME_PIXEL_WIDTH (f) - width,
                               y, width, height);
@@ -1847,7 +2001,7 @@ haiku_set_window_size (struct frame *f, bool 
change_gravity,
       /* Only do this if the fullscreen status has actually been
         applied.  */
       && f->want_fullscreen == FULLSCREEN_NONE
-      /* And if the configury during frame completion has been
+      /* And if the configury during frame creation has been
         completed.  Otherwise, there will be no valid "old size" to
         go back to.  */
       && FRAME_OUTPUT_DATA (f)->configury_done)
@@ -1858,134 +2012,215 @@ haiku_set_window_size (struct frame *f, bool 
change_gravity,
   if (FRAME_HAIKU_WINDOW (f))
     {
       block_input ();
-      BWindow_resize (FRAME_HAIKU_WINDOW (f), width, height);
+      BWindow_resize (FRAME_HAIKU_WINDOW (f),
+                     width, height);
+
+      if (FRAME_VISIBLE_P (f)
+         && (width != FRAME_PIXEL_WIDTH (f)
+             || height != FRAME_PIXEL_HEIGHT (f)))
+       haiku_wait_for_event (f, FRAME_RESIZED);
       unblock_input ();
     }
+
+  do_pending_window_change (false);
 }
 
 static void
-haiku_draw_window_cursor (struct window *w,
-                         struct glyph_row *glyph_row,
-                         int x, int y,
-                         enum text_cursor_kinds cursor_type,
-                         int cursor_width, bool on_p, bool active_p)
+haiku_draw_hollow_cursor (struct window *w, struct glyph_row *row)
 {
-  struct frame *f = XFRAME (WINDOW_FRAME (w));
-  struct face *face;
-  struct glyph *phys_cursor_glyph;
+  struct frame *f;
+  int x, y, wd, h;
   struct glyph *cursor_glyph;
+  uint32_t foreground;
+  void *view;
 
-  void *view = FRAME_HAIKU_VIEW (f);
-
-  int fx, fy, h, cursor_height;
+  f = XFRAME (WINDOW_FRAME (w));
+  view = FRAME_HAIKU_VIEW (f);
 
-  if (!on_p)
+  /* Get the glyph the cursor is on.  If we can't tell because
+     the current matrix is invalid or such, give up.  */
+  cursor_glyph = get_phys_cursor_glyph (w);
+  if (cursor_glyph == NULL)
     return;
 
-  if (cursor_type == NO_CURSOR)
-    {
-      w->phys_cursor_width = 0;
-      return;
-    }
+  /* Compute frame-relative coordinates for phys cursor.  */
+  get_phys_cursor_geometry (w, row, cursor_glyph, &x, &y, &h);
+  wd = w->phys_cursor_width;
 
-  w->phys_cursor_on_p = true;
-  w->phys_cursor_type = cursor_type;
+  /* The foreground of cursor_gc is typically the same as the normal
+     background color, which can cause the cursor box to be invisible.  */
+  foreground = FRAME_CURSOR_COLOR (f).pixel;
 
-  phys_cursor_glyph = get_phys_cursor_glyph (w);
+  /* When on R2L character, show cursor at the right edge of the
+     glyph, unless the cursor box is as wide as the glyph or wider
+     (the latter happens when x-stretch-cursor is non-nil).  */
+  if ((cursor_glyph->resolved_level & 1) != 0
+      && cursor_glyph->pixel_width > wd)
+    x += cursor_glyph->pixel_width - wd;
 
-  if (!phys_cursor_glyph)
-    {
-      if (glyph_row->exact_window_width_line_p
-          && w->phys_cursor.hpos >= glyph_row->used[TEXT_AREA])
-        {
-          glyph_row->cursor_in_fringe_p = 1;
-          draw_fringe_bitmap (w, glyph_row, 0);
-        }
-      return;
-    }
+  /* Set clipping, draw the rectangle, and reset clipping again.
+     This also marks the region as invalidated.  */
+
+  BView_draw_lock (view, true, x, y, wd, h);
+  BView_StartClip (view);
+  haiku_clip_to_row (w, row, TEXT_AREA);
 
-  get_phys_cursor_geometry (w, glyph_row, phys_cursor_glyph, &fx, &fy, &h);
+  /* Now set the foreground color and pen size.  */
+  BView_SetHighColor (view, foreground);
+  BView_SetPenSize (view, 1);
 
-  if (cursor_type == BAR_CURSOR)
+  /* Actually draw the rectangle.  */
+  BView_StrokeRectangle (view, x, y, wd, h);
+
+  /* Reset clipping.  */
+  BView_EndClip (view);
+  BView_draw_unlock (view);
+}
+
+static void
+haiku_draw_bar_cursor (struct window *w, struct glyph_row *row,
+                      int width, enum text_cursor_kinds kind)
+{
+  struct frame *f;
+  struct glyph *cursor_glyph;
+  struct glyph_row *r;
+  struct face *face;
+  uint32_t foreground;
+  void *view;
+  int x, y, dummy_x, dummy_y, dummy_h;
+
+  f = XFRAME (w->frame);
+
+  /* If cursor is out of bounds, don't draw garbage.  This can happen
+     in mini-buffer windows when switching between echo area glyphs
+     and mini-buffer.  */
+  cursor_glyph = get_phys_cursor_glyph (w);
+  if (cursor_glyph == NULL)
+    return;
+
+  /* If on an image, draw like a normal cursor.  That's usually better
+     visible than drawing a bar, esp. if the image is large so that
+     the bar might not be in the window.  */
+  if (cursor_glyph->type == IMAGE_GLYPH)
     {
-      if (cursor_width < 1)
-       cursor_width = max (FRAME_CURSOR_WIDTH (f), 1);
-      if (cursor_width < w->phys_cursor_width)
-        w->phys_cursor_width = cursor_width;
+      r = MATRIX_ROW (w->current_matrix, w->phys_cursor.vpos);
+      draw_phys_cursor_glyph (w, r, DRAW_CURSOR);
     }
-  else if (cursor_type == HBAR_CURSOR)
+  else
     {
-      cursor_height = (cursor_width < 1) ? lrint (0.25 * h) : cursor_width;
-      if (cursor_height > glyph_row->height)
-        cursor_height = glyph_row->height;
-      if (h > cursor_height)
-        fy += h - cursor_height;
-      h = cursor_height;
-    }
+      view = FRAME_HAIKU_VIEW (f);
+      face = FACE_FROM_ID (f, cursor_glyph->face_id);
 
-  BView_draw_lock (view, false, 0, 0, 0, 0);
-  BView_StartClip (view);
+      /* If the glyph's background equals the color we normally draw
+        the bars cursor in, the bar cursor in its normal color is
+        invisible.  Use the glyph's foreground color instead in this
+        case, on the assumption that the glyph's colors are chosen so
+        that the glyph is legible.  */
+      if (face->background == FRAME_CURSOR_COLOR (f).pixel)
+       foreground = face->foreground;
+      else
+       foreground = FRAME_CURSOR_COLOR (f).pixel;
 
-  if (cursor_type == BAR_CURSOR)
-    {
-      cursor_glyph = get_phys_cursor_glyph (w);
-      face = FACE_FROM_ID (f, cursor_glyph->face_id);
-    }
+      BView_draw_lock (view, false, 0, 0, 0, 0);
+      BView_StartClip (view);
+      BView_SetHighColor (view, foreground);
+      haiku_clip_to_row (w, row, TEXT_AREA);
 
-  /* If the glyph's background equals the color we normally draw the
-     bar cursor in, our cursor in its normal color is invisible.  Use
-     the glyph's foreground color instead in this case, on the
-     assumption that the glyph's colors are chosen so that the glyph
-     is legible.  */
+      if (kind == BAR_CURSOR)
+       {
+         x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x);
+         y = WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y);
 
-  /* xterm.c only does this for bar cursors, and nobody has
-     complained, so it would be best to do that here as well.  */
-  if (cursor_type == BAR_CURSOR
-      && face->background == FRAME_CURSOR_COLOR (f).pixel)
-    BView_SetHighColor (view, face->foreground);
-  else
-    BView_SetHighColor (view, FRAME_CURSOR_COLOR (f).pixel);
-  haiku_clip_to_row (w, glyph_row, TEXT_AREA);
+         if (width < 0)
+           width = FRAME_CURSOR_WIDTH (f);
+         width = min (cursor_glyph->pixel_width, width);
 
-  switch (cursor_type)
-    {
-    default:
-    case DEFAULT_CURSOR:
-    case NO_CURSOR:
-      break;
-    case HBAR_CURSOR:
-      BView_FillRectangle (view, fx, fy, w->phys_cursor_width, h);
-      BView_invalidate_region (view, fx, fy, w->phys_cursor_width, h);
-      break;
-    case BAR_CURSOR:
-      if (cursor_glyph->resolved_level & 1)
+         w->phys_cursor_width = width;
+
+         /* If the character under cursor is R2L, draw the bar cursor
+            on the right of its glyph, rather than on the left.  */
+         if ((cursor_glyph->resolved_level & 1) != 0)
+           x += cursor_glyph->pixel_width - width;
+
+         BView_FillRectangle (view, x, y, width, row->height);
+         BView_invalidate_region (view, x, y, width, row->height);
+       }
+      else /* HBAR_CURSOR */
        {
-         BView_FillRectangle (view, fx + cursor_glyph->pixel_width - 
w->phys_cursor_width,
-                              fy, w->phys_cursor_width, h);
-         BView_invalidate_region (view, fx + cursor_glyph->pixel_width - 
w->phys_cursor_width,
-                                  fy, w->phys_cursor_width, h);
+         x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x);
+         y = WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y +
+                                          row->height - width);
+
+         if (width < 0)
+           width = row->height;
+
+         width = min (row->height, width);
+
+         get_phys_cursor_geometry (w, row, cursor_glyph, &dummy_x,
+                                   &dummy_y, &dummy_h);
+
+         if ((cursor_glyph->resolved_level & 1) != 0
+             && cursor_glyph->pixel_width > w->phys_cursor_width - 1)
+           x += cursor_glyph->pixel_width - w->phys_cursor_width + 1;
+
+         BView_FillRectangle (view, x, y, w->phys_cursor_width - 1,
+                              width);
+         BView_invalidate_region (view, x, y, w->phys_cursor_width - 1,
+                                  width);
        }
-      else
-       BView_FillRectangle (view, fx, fy, w->phys_cursor_width, h);
 
-      BView_invalidate_region (view, fx, fy, w->phys_cursor_width, h);
-      break;
-    case HOLLOW_BOX_CURSOR:
-      if (phys_cursor_glyph->type != IMAGE_GLYPH)
+      BView_EndClip (view);
+      BView_draw_unlock (view);
+    }
+}
+
+static void
+haiku_draw_window_cursor (struct window *w, struct glyph_row *glyph_row,
+                         int x, int y, enum text_cursor_kinds cursor_type,
+                         int cursor_width, bool on_p, bool active_p)
+{
+  if (on_p)
+    {
+      w->phys_cursor_type = cursor_type;
+      w->phys_cursor_on_p = true;
+
+      if (glyph_row->exact_window_width_line_p
+         && (glyph_row->reversed_p
+             ? (w->phys_cursor.hpos < 0)
+             : (w->phys_cursor.hpos >= glyph_row->used[TEXT_AREA])))
        {
-         BView_SetPenSize (view, 1);
-         BView_StrokeRectangle (view, fx, fy, w->phys_cursor_width, h);
+         glyph_row->cursor_in_fringe_p = true;
+         draw_fringe_bitmap (w, glyph_row, glyph_row->reversed_p);
        }
       else
-       draw_phys_cursor_glyph (w, glyph_row, DRAW_CURSOR);
+       {
+         switch (cursor_type)
+           {
+           case HOLLOW_BOX_CURSOR:
+             haiku_draw_hollow_cursor (w, glyph_row);
+             break;
 
-      BView_invalidate_region (view, fx, fy, w->phys_cursor_width, h);
-      break;
-    case FILLED_BOX_CURSOR:
-      draw_phys_cursor_glyph (w, glyph_row, DRAW_CURSOR);
+           case FILLED_BOX_CURSOR:
+             draw_phys_cursor_glyph (w, glyph_row, DRAW_CURSOR);
+             break;
+
+           case BAR_CURSOR:
+             haiku_draw_bar_cursor (w, glyph_row, cursor_width, BAR_CURSOR);
+             break;
+
+           case HBAR_CURSOR:
+             haiku_draw_bar_cursor (w, glyph_row, cursor_width, HBAR_CURSOR);
+             break;
+
+           case NO_CURSOR:
+             w->phys_cursor_width = 0;
+             break;
+
+           default:
+             emacs_abort ();
+           }
+       }
     }
-  BView_EndClip (view);
-  BView_draw_unlock (view);
 }
 
 static void
@@ -2072,19 +2307,25 @@ haiku_draw_vertical_window_border (struct window *w,
 static void
 haiku_set_scroll_bar_default_width (struct frame *f)
 {
-  int unit = FRAME_COLUMN_WIDTH (f);
-  FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = BScrollBar_default_size (0) + 1;
-  FRAME_CONFIG_SCROLL_BAR_COLS (f) =
-    (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) + unit - 1) / unit;
+  int unit, size;
+
+  unit = FRAME_COLUMN_WIDTH (f);
+  size = BScrollBar_default_size (0) + 1;
+
+  FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = size;
+  FRAME_CONFIG_SCROLL_BAR_COLS (f) = (size + unit - 1) / unit;
 }
 
 static void
 haiku_set_scroll_bar_default_height (struct frame *f)
 {
-  int height = FRAME_LINE_HEIGHT (f);
-  FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) = BScrollBar_default_size (1) + 1;
-  FRAME_CONFIG_SCROLL_BAR_LINES (f) =
-    (FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) + height - 1) / height;
+  int height, size;
+
+  height = FRAME_LINE_HEIGHT (f);
+  size = BScrollBar_default_size (true) + 1;
+
+  FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) = size;
+  FRAME_CONFIG_SCROLL_BAR_LINES (f) = (size + height - 1) / height;
 }
 
 static void
@@ -2266,15 +2507,17 @@ static struct scroll_bar *
 haiku_scroll_bar_create (struct window *w, int left, int top,
                         int width, int height, bool horizontal_p)
 {
-  struct frame *f = XFRAME (WINDOW_FRAME (w));
+  struct frame *f;
   Lisp_Object barobj;
+  struct scroll_bar *bar;
+  void *scroll_bar;
+  void *view;
 
-  void *sb = NULL;
-  void *vw = FRAME_HAIKU_VIEW (f);
+  f = XFRAME (WINDOW_FRAME (w));
+  view = FRAME_HAIKU_VIEW (f);
 
   block_input ();
-  struct scroll_bar *bar
-    = ALLOCATE_PSEUDOVECTOR (struct scroll_bar, prev, PVEC_OTHER);
+  bar = ALLOCATE_PSEUDOVECTOR (struct scroll_bar, prev, PVEC_OTHER);
 
   XSETWINDOW (bar->window, w);
   bar->top = top;
@@ -2287,15 +2530,14 @@ haiku_scroll_bar_create (struct window *w, int left, 
int top,
   bar->update = -1;
   bar->horizontal = horizontal_p;
 
-  sb = BScrollBar_make_for_view (vw, horizontal_p,
-                                left, top, left + width - 1,
-                                top + height - 1, bar);
-
-  BView_publish_scroll_bar (vw, left, top, width, height);
+  scroll_bar = be_make_scroll_bar_for_view (view, horizontal_p,
+                                           left, top, left + width - 1,
+                                           top + height - 1);
+  BView_publish_scroll_bar (view, left, top, width, height);
 
   bar->next = FRAME_SCROLL_BARS (f);
   bar->prev = Qnil;
-  bar->scroll_bar = sb;
+  bar->scroll_bar = scroll_bar;
   XSETVECTOR (barobj, bar);
   fset_scroll_bars (f, barobj);
 
@@ -2309,18 +2551,20 @@ haiku_scroll_bar_create (struct window *w, int left, 
int top,
 static void
 haiku_set_horizontal_scroll_bar (struct window *w, int portion, int whole, int 
position)
 {
-  eassert (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (w));
   Lisp_Object barobj;
   struct scroll_bar *bar;
   int top, height, left, width;
   int window_x, window_width;
+  void *view;
 
+  eassert (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (w));
   /* Get window dimensions.  */
   window_box (w, ANY_AREA, &window_x, 0, &window_width, 0);
   left = window_x;
   width = window_width;
   top = WINDOW_SCROLL_BAR_AREA_Y (w);
   height = WINDOW_CONFIG_SCROLL_BAR_HEIGHT (w);
+  view = FRAME_HAIKU_VIEW (WINDOW_XFRAME (w));
 
   block_input ();
 
@@ -2335,15 +2579,15 @@ haiku_set_horizontal_scroll_bar (struct window *w, int 
portion, int whole, int p
     {
       bar = XSCROLL_BAR (w->horizontal_scroll_bar);
 
-      if (bar->left != left || bar->top != top ||
-         bar->width != width || bar->height != height)
+      if (bar->left != left || bar->top != top
+         || bar->width != width || bar->height != height)
        {
-         void *view = FRAME_HAIKU_VIEW (WINDOW_XFRAME (w));
          BView_forget_scroll_bar (view, bar->left, bar->top,
                                   bar->width, bar->height);
          BView_move_frame (bar->scroll_bar, left, top,
                            left + width - 1, top + height - 1);
          BView_publish_scroll_bar (view, left, top, width, height);
+
          bar->left = left;
          bar->top = top;
          bar->width = width;
@@ -2360,14 +2604,15 @@ haiku_set_horizontal_scroll_bar (struct window *w, int 
portion, int whole, int p
 }
 
 static void
-haiku_set_vertical_scroll_bar (struct window *w,
-                              int portion, int whole, int position)
+haiku_set_vertical_scroll_bar (struct window *w, int portion, int whole, int 
position)
 {
-  eassert (WINDOW_HAS_VERTICAL_SCROLL_BAR (w));
   Lisp_Object barobj;
   struct scroll_bar *bar;
   int top, height, left, width;
   int window_y, window_height;
+  void *view;
+
+  eassert (WINDOW_HAS_VERTICAL_SCROLL_BAR (w));
 
   /* Get window dimensions.  */
   window_box (w, ANY_AREA, 0, &window_y, 0, &window_height);
@@ -2377,8 +2622,10 @@ haiku_set_vertical_scroll_bar (struct window *w,
   /* Compute the left edge and the width of the scroll bar area.  */
   left = WINDOW_SCROLL_BAR_AREA_X (w);
   width = WINDOW_SCROLL_BAR_AREA_WIDTH (w);
-  block_input ();
 
+  view = FRAME_HAIKU_VIEW (WINDOW_XFRAME (w));
+
+  block_input ();
   if (NILP (w->vertical_scroll_bar))
     {
       bar = haiku_scroll_bar_create (w, left, top, width, height, false);
@@ -2389,15 +2636,15 @@ haiku_set_vertical_scroll_bar (struct window *w,
     {
       bar = XSCROLL_BAR (w->vertical_scroll_bar);
 
-      if (bar->left != left || bar->top != top ||
-         bar->width != width || bar->height != height)
+      if (bar->left != left || bar->top != top
+         || bar->width != width || bar->height != height)
        {
-         void *view = FRAME_HAIKU_VIEW (WINDOW_XFRAME (w));
          BView_forget_scroll_bar (view, bar->left, bar->top,
                                   bar->width, bar->height);
          BView_move_frame (bar->scroll_bar, left, top,
                            left + width - 1, top + height - 1);
          BView_publish_scroll_bar (view, left, top, width, height);
+
          bar->left = left;
          bar->top = top;
          bar->width = width;
@@ -2418,25 +2665,57 @@ static void
 haiku_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
                          struct draw_fringe_bitmap_params *p)
 {
-  void *view = FRAME_HAIKU_VIEW (XFRAME (WINDOW_FRAME (w)));
-  struct face *face = p->face;
+  struct face *face;
+  struct frame *f;
+  struct haiku_bitmap_record *rec;
+  void *view, *bitmap;
+  uint32 col;
+
+  f = XFRAME (WINDOW_FRAME (w));
+  view = FRAME_HAIKU_VIEW (f);
+  face = p->face;
 
   block_input ();
-  BView_draw_lock (view, true, p->x, p->y, p->wd, p->h);
+  BView_draw_lock (view, true, 0, 0, 0, 0);
   BView_StartClip (view);
 
+  if (p->wd && p->h)
+    BView_invalidate_region (view, p->x, p->y, p->wd, p->h);
+
   haiku_clip_to_row (w, row, ANY_AREA);
+
   if (p->bx >= 0 && !p->overlay_p)
     {
-      BView_SetHighColor (view, face->background);
-      BView_FillRectangle (view, p->bx, p->by, p->nx, p->ny);
+      BView_invalidate_region (view, p->bx, p->by, p->nx, p->ny);
+
+      if (!face->stipple)
+       {
+         BView_SetHighColor (view, face->background);
+         BView_FillRectangle (view, p->bx, p->by, p->nx, p->ny);
+       }
+      else
+       {
+         rec = haiku_get_bitmap_rec (f, face->stipple);
+         haiku_update_bitmap_rec (rec, face->foreground,
+                                  face->background);
+
+         BView_StartClip (view);
+         haiku_clip_to_row (w, row, ANY_AREA);
+         BView_ClipToRect (view, p->bx, p->by, p->nx, p->ny);
+         BView_DrawBitmapTiled (view, rec->img, 0, 0, -1, -1,
+                                0, 0, FRAME_PIXEL_WIDTH (f),
+                                FRAME_PIXEL_HEIGHT (f));
+         BView_EndClip (view);
+
+         row->stipple_p = true;
+       }
     }
 
   if (p->which
       && p->which < max_fringe_bmp
       && p->which < max_used_fringe_bitmap)
     {
-      void *bitmap = fringe_bmps[p->which];
+      bitmap = fringe_bmps[p->which];
 
       if (!bitmap)
        {
@@ -2450,8 +2729,6 @@ haiku_draw_fringe_bitmap (struct window *w, struct 
glyph_row *row,
          bitmap = fringe_bmps[p->which];
        }
 
-      uint32_t col;
-
       if (!p->cursor_p)
        col = face->foreground;
       else if (p->overlay_p)
@@ -2610,7 +2887,7 @@ haiku_mouse_position (struct frame **fp, int insist, 
Lisp_Object *bar_window,
          x_display_list->last_mouse_glyph_frame = f1;
 
          *bar_window = Qnil;
-         *part = scroll_bar_above_handle;
+         *part = scroll_bar_nowhere;
 
          /* If track-mouse is `drag-source' and the mouse pointer is
             certain to not be actually under the chosen frame, return
@@ -2658,13 +2935,6 @@ haiku_define_frame_cursor (struct frame *f, Emacs_Cursor 
cursor)
   FRAME_OUTPUT_DATA (f)->current_cursor = cursor;
 }
 
-static void
-haiku_update_window_end (struct window *w, bool cursor_on_p,
-                        bool mouse_face_overwritten_p)
-{
-
-}
-
 static void
 haiku_default_font_parameter (struct frame *f, Lisp_Object parms)
 {
@@ -2672,7 +2942,7 @@ haiku_default_font_parameter (struct frame *f, 
Lisp_Object parms)
   Lisp_Object font_param = gui_display_get_arg (dpyinfo, parms, Qfont, NULL, 
NULL,
                                                 RES_TYPE_STRING);
   Lisp_Object font = Qnil;
-  if (EQ (font_param, Qunbound))
+  if (BASE_EQ (font_param, Qunbound))
     font_param = Qnil;
 
   if (NILP (font_param))
@@ -2733,8 +3003,8 @@ static struct redisplay_interface 
haiku_redisplay_interface =
     gui_clear_end_of_line,
     haiku_scroll_run,
     haiku_after_update_window_line,
-    NULL,
-    haiku_update_window_end,
+    NULL, /* update_window_begin */
+    NULL, /* update_window_end */
     haiku_flush,
     gui_clear_window_mouse_face,
     gui_get_glyph_overhangs,
@@ -2750,7 +3020,7 @@ static struct redisplay_interface 
haiku_redisplay_interface =
     haiku_draw_window_cursor,
     haiku_draw_vertical_window_border,
     haiku_draw_window_divider,
-    0, /* shift glyphs for insert */
+    NULL, /* shift glyphs for insert */
     haiku_show_hourglass,
     haiku_hide_hourglass,
     haiku_default_font_parameter,
@@ -2759,11 +3029,20 @@ static struct redisplay_interface 
haiku_redisplay_interface =
 static void
 haiku_make_fullscreen_consistent (struct frame *f)
 {
-  Lisp_Object lval = get_frame_param (f, Qfullscreen);
-
-  if (!EQ (lval, Qmaximized) && FRAME_OUTPUT_DATA (f)->zoomed_p)
+  Lisp_Object lval;
+  struct haiku_output *output;
+
+  output = FRAME_OUTPUT_DATA (f);
+
+  if (output->fullscreen_mode == FULLSCREEN_MODE_BOTH)
+    lval = Qfullboth;
+  else if (output->fullscreen_mode == FULLSCREEN_MODE_WIDTH)
+    lval = Qfullwidth;
+  else if (output->fullscreen_mode == FULLSCREEN_MODE_HEIGHT)
+    lval = Qfullheight;
+  else if (output->fullscreen_mode == FULLSCREEN_MODE_MAXIMIZED)
     lval = Qmaximized;
-  else if (EQ (lval, Qmaximized) && !FRAME_OUTPUT_DATA (f)->zoomed_p)
+  else
     lval = Qnil;
 
   store_frame_param (f, Qfullscreen, lval);
@@ -2778,7 +3057,7 @@ haiku_flush_dirty_back_buffer_on (struct frame *f)
     haiku_flip_buffers (f);
 }
 
-/* N.B. that support for TYPE must be explictly added to
+/* N.B. that support for TYPE must be explicitly added to
    haiku_read_socket.  */
 void
 haiku_wait_for_event (struct frame *f, int type)
@@ -2816,7 +3095,7 @@ static int
 haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
 {
   int message_count;
-  static void *buf;
+  void *buf;
   ssize_t b_size;
   int button_or_motion_p, do_help;
   enum haiku_event_type type;
@@ -2825,11 +3104,10 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
   message_count = 0;
   button_or_motion_p = 0;
   do_help = 0;
-  buf = NULL;
+
+  buf = alloca (200);
 
   block_input ();
-  if (!buf)
-    buf = xmalloc (200);
   haiku_read_size (&b_size, false);
   while (b_size >= 0)
     {
@@ -2868,8 +3146,12 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
            if (!f)
              continue;
 
-           int width = lrint (b->px_widthf);
-           int height = lrint (b->px_heightf);
+           int width = lrint (b->width);
+           int height = lrint (b->height);
+
+           if (FRAME_OUTPUT_DATA (f)->wait_for_event_type
+               == FRAME_RESIZED)
+             FRAME_OUTPUT_DATA (f)->wait_for_event_type = -1;
 
            if (FRAME_TOOLTIP_P (f))
              {
@@ -2899,6 +3181,7 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
                cancel_mouse_face (f);
                haiku_clear_under_internal_border (f);
              }
+
            break;
          }
        case FRAME_EXPOSED:
@@ -3006,10 +3289,18 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
            if (FRAME_TOOLTIP_P (f))
              {
                /* Dismiss the tooltip if the mouse moves onto a
-                  tooltip frame.  FIXME: for some reason we don't get
-                  leave notification events for this.  */
-
-               if (any_help_event_p)
+                  tooltip frame (except when drag-and-drop is in
+                  progress and we are trying to move the tooltip
+                  along with the mouse pointer).  FIXME: for some
+                  reason we don't get leave notification events for
+                  this.  */
+
+               if (any_help_event_p
+                   && !(be_drag_and_drop_in_progress ()
+                        && haiku_dnd_follow_tooltip)
+                   && !((EQ (track_mouse, Qdrag_source)
+                         || EQ (track_mouse, Qdropping))
+                        && gui_mouse_grabbed (x_display_list)))
                  do_help = -1;
                break;
              }
@@ -3056,7 +3347,10 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
 
                haiku_new_focus_frame (x_display_list->focused_frame);
 
-               if (any_help_event_p)
+               if (any_help_event_p
+                   && !((EQ (track_mouse, Qdrag_source)
+                         || EQ (track_mouse, Qdropping))
+                        && gui_mouse_grabbed (x_display_list)))
                  do_help = -1;
              }
            else
@@ -3081,18 +3375,17 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
                previous_help_echo_string = help_echo_string;
                help_echo_string = Qnil;
 
-               /* A LeaveNotify event (well, the closest equivalent on Haiku, 
which
-                  is a B_MOUSE_MOVED event with `transit' set to 
B_EXITED_VIEW) might
-                  be sent out-of-order with regards to motion events from other
-                  windows, such as when the mouse pointer rapidly moves from an
-                  undecorated child frame to its parent.  This can cause a 
failure to
-                  clear the mouse face on the former if an event for the 
latter is
-                  read by Emacs first and ends up showing the mouse face there.
+               /* A crossing event might be sent out-of-order with
+                  regard to motion events from other windows, such as
+                  when the mouse pointer rapidly moves from an
+                  undecorated child frame to its parent.  This can
+                  cause a failure to clear the mouse face on the
+                  former if an event for the latter is read by Emacs
+                  first and ends up showing the mouse face there.
 
-                  In case the `movement_locker' (also see the comment
-                  there) doesn't take care of the problem, work
-                  around it by clearing the mouse face now, if it is
-                  currently shown on a different frame.  */
+                  Work around the problem by clearing the mouse face
+                  now if it is currently shown on a different
+                  frame.  */
 
                if (hlinfo->mouse_face_hidden
                    || (f != hlinfo->mouse_face_mouse_frame
@@ -3181,13 +3474,13 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
            Lisp_Object tab_bar_arg = Qnil;
            int tab_bar_p = 0, tool_bar_p = 0;
            bool up_okay_p = false;
+           struct scroll_bar *bar;
 
            if (popup_activated_p || !f)
              continue;
 
-           struct haiku_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
-
            inev.modifiers = haiku_modifiers_to_emacs (b->modifiers);
+           bar = haiku_scroll_bar_from_widget (b->scroll_bar, b->window);
 
            x_display_list->last_mouse_glyph_frame = 0;
            x_display_list->last_mouse_movement_time = b->time / 1000;
@@ -3235,34 +3528,64 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
            if (type == BUTTON_UP)
              {
                inev.modifiers |= up_modifier;
-               up_okay_p = (dpyinfo->grabbed & (1 << b->btn_no));
-               dpyinfo->grabbed &= ~(1 << b->btn_no);
+               up_okay_p = (x_display_list->grabbed & (1 << b->btn_no));
+               x_display_list->grabbed &= ~(1 << b->btn_no);
              }
            else
              {
                up_okay_p = true;
                inev.modifiers |= down_modifier;
-               dpyinfo->last_mouse_frame = f;
-               dpyinfo->grabbed |= (1 << b->btn_no);
+               x_display_list->last_mouse_frame = f;
+               x_display_list->grabbed |= (1 << b->btn_no);
                if (f && !tab_bar_p)
                  f->last_tab_bar_item = -1;
                if (f && !tool_bar_p)
                  f->last_tool_bar_item = -1;
              }
 
-           if (up_okay_p
-               && !(tab_bar_p && NILP (tab_bar_arg))
-               && !tool_bar_p)
+           if (bar)
+             {
+               inev.kind = (bar->horizontal
+                            ? HORIZONTAL_SCROLL_BAR_CLICK_EVENT
+                            : SCROLL_BAR_CLICK_EVENT);
+               inev.part = (bar->horizontal
+                            ? scroll_bar_horizontal_handle
+                            : scroll_bar_handle);
+             }
+           else if (up_okay_p
+                    && !(tab_bar_p && NILP (tab_bar_arg))
+                    && !tool_bar_p)
              inev.kind = MOUSE_CLICK_EVENT;
+
            inev.arg = tab_bar_arg;
            inev.code = b->btn_no;
 
            f->mouse_moved = false;
 
-           XSETINT (inev.x, b->x);
-           XSETINT (inev.y, b->y);
+           if (bar)
+             {
+               if (bar->horizontal)
+                 {
+                   XSETINT (inev.x, min (max (0, b->x - bar->left),
+                                         bar->width));
+                   XSETINT (inev.y, bar->width);
+                 }
+               else
+                 {
+                   XSETINT (inev.x, min (max (0, b->y - bar->top),
+                                         bar->height));
+                   XSETINT (inev.y, bar->height);
+                 }
+
+               inev.frame_or_window = bar->window;
+             }
+           else
+             {
+               XSETINT (inev.x, b->x);
+               XSETINT (inev.y, b->y);
+               XSETFRAME (inev.frame_or_window, f);
+             }
 
-           XSETFRAME (inev.frame_or_window, f);
            break;
          }
        case ICONIFICATION:
@@ -3279,7 +3602,6 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
                SET_FRAME_ICONIFIED (f, 0);
                inev.kind = DEICONIFY_EVENT;
 
-
                /* Haiku doesn't expose frames on deiconification, but
                   if we are double-buffered, the previous screen
                   contents should have been preserved. */
@@ -3303,30 +3625,36 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
          {
            struct haiku_move_event *b = buf;
            struct frame *f = haiku_window_to_frame (b->window);
+           int top, left;
+           struct frame *p;
 
            if (!f)
              continue;
 
+           FRAME_OUTPUT_DATA (f)->frame_x = b->x;
+           FRAME_OUTPUT_DATA (f)->frame_y = b->y;
+
            if (FRAME_PARENT_FRAME (f))
              haiku_coords_from_parent (f, &b->x, &b->y);
 
-           if (b->x != f->left_pos || b->y != f->top_pos)
+           left = b->x - b->decorator_width;
+           top = b->y - b->decorator_height;
+
+           if (left != f->left_pos || top != f->top_pos)
              {
                inev.kind = MOVE_FRAME_EVENT;
 
-               XSETINT (inev.x, b->x);
-               XSETINT (inev.y, b->y);
+               XSETINT (inev.x, left);
+               XSETINT (inev.y, top);
 
-               f->left_pos = b->x;
-               f->top_pos = b->y;
+               f->left_pos = left;
+               f->top_pos = top;
 
-               struct frame *p;
+               p = FRAME_PARENT_FRAME (f);
 
-               if ((p = FRAME_PARENT_FRAME (f)))
-                 {
-                   void *window = FRAME_HAIKU_WINDOW (p);
-                   EmacsWindow_move_weak_child (window, b->window, b->x, b->y);
-                 }
+               if (p)
+                 EmacsWindow_move_weak_child (FRAME_HAIKU_WINDOW (p),
+                                              b->window, left, top);
 
                XSETFRAME (inev.frame_or_window, f);
              }
@@ -3357,8 +3685,9 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
                inev.kind = (bar->horizontal
                             ? HORIZONTAL_SCROLL_BAR_CLICK_EVENT :
                             SCROLL_BAR_CLICK_EVENT);
-               inev.part = bar->horizontal ?
-                 scroll_bar_horizontal_handle : scroll_bar_handle;
+               inev.part = (bar->horizontal
+                            ? scroll_bar_horizontal_handle
+                            : scroll_bar_handle);
 
                if (bar->horizontal)
                  {
@@ -3594,14 +3923,17 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
        case ZOOM_EVENT:
          {
            struct haiku_zoom_event *b = buf;
-
            struct frame *f = haiku_window_to_frame (b->window);
 
            if (!f)
              continue;
 
-           FRAME_OUTPUT_DATA (f)->zoomed_p = b->zoomed;
-           haiku_make_fullscreen_consistent (f);
+           if (b->fullscreen_mode == FULLSCREEN_MODE_MAXIMIZED)
+             f->want_fullscreen = FULLSCREEN_NONE;
+           else
+             f->want_fullscreen = FULLSCREEN_MAXIMIZED;
+
+           FRAME_TERMINAL (f)->fullscreen_hook (f);
            break;
          }
        case DRAG_AND_DROP_EVENT:
@@ -3625,6 +3957,15 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
            BMessage_delete (b->message);
            break;
          }
+       case SCREEN_CHANGED_EVENT:
+         {
+           struct haiku_screen_changed_event *b = buf;
+
+           inev.kind = MONITORS_CHANGED_EVENT;
+           XSETTERMINAL (inev.arg, x_display_list->terminal);
+           inev.timestamp = b->when / 1000;
+           break;
+         }
        case APP_QUIT_REQUESTED_EVENT:
          inev.kind = SAVE_SESSION_EVENT;
          inev.arg = Qt;
@@ -3685,6 +4026,21 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
   return message_count;
 }
 
+static Lisp_Object
+haiku_get_focus_frame (struct frame *f)
+{
+  Lisp_Object lisp_focus;
+  struct frame *focus;
+
+  focus = FRAME_DISPLAY_INFO (f)->focused_frame;
+
+  if (!focus)
+    return Qnil;
+
+  XSETFRAME (lisp_focus, focus);
+  return lisp_focus;
+}
+
 static void
 haiku_frame_rehighlight (struct frame *frame)
 {
@@ -3833,6 +4189,8 @@ haiku_toggle_invisible_pointer (struct frame *f, bool 
invisible_p)
 static void
 haiku_fullscreen (struct frame *f)
 {
+  enum haiku_fullscreen_mode mode;
+
   /* When FRAME_OUTPUT_DATA (f)->configury_done is false, the frame is
      being created, and its regular width and height have not yet been
      set.  This function will be called again by haiku_create_frame,
@@ -3841,18 +4199,22 @@ haiku_fullscreen (struct frame *f)
     return;
 
   if (f->want_fullscreen == FULLSCREEN_MAXIMIZED)
-    BWindow_zoom (FRAME_HAIKU_WINDOW (f));
+    mode = FULLSCREEN_MODE_MAXIMIZED;
   else if (f->want_fullscreen == FULLSCREEN_BOTH)
-    EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 1);
+    mode = FULLSCREEN_MODE_BOTH;
+  else if (f->want_fullscreen == FULLSCREEN_WIDTH)
+    mode = FULLSCREEN_MODE_WIDTH;
+  else if (f->want_fullscreen == FULLSCREEN_HEIGHT)
+    mode = FULLSCREEN_MODE_HEIGHT;
   else
-    {
-      EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 0);
-      EmacsWindow_unzoom (FRAME_HAIKU_WINDOW (f));
-    }
+    mode = FULLSCREEN_MODE_NONE;
 
   f->want_fullscreen = FULLSCREEN_NONE;
+  be_set_window_fullscreen_mode (FRAME_HAIKU_WINDOW (f), mode);
+  FRAME_OUTPUT_DATA (f)->fullscreen_mode = mode;
 
   haiku_update_size_hints (f);
+  haiku_make_fullscreen_consistent (f);
 }
 
 static struct terminal *
@@ -3873,7 +4235,7 @@ haiku_create_terminal (struct haiku_display_info *dpyinfo)
   terminal->frame_visible_invisible_hook = haiku_set_frame_visible_invisible;
   terminal->set_frame_offset_hook = haiku_set_offset;
   terminal->delete_terminal_hook = haiku_delete_terminal;
-  terminal->get_string_resource_hook = get_string_resource;
+  terminal->get_string_resource_hook = haiku_get_string_resource;
   terminal->set_new_font_hook = haiku_new_font;
   terminal->defined_color_hook = haiku_defined_color;
   terminal->set_window_size_hook = haiku_set_window_size;
@@ -3904,6 +4266,7 @@ haiku_create_terminal (struct haiku_display_info *dpyinfo)
   terminal->fullscreen_hook = haiku_fullscreen;
   terminal->toolkit_position_hook = haiku_toolkit_position;
   terminal->activate_menubar_hook = haiku_activate_menubar;
+  terminal->get_focus_frame = haiku_get_focus_frame;
 
   return terminal;
 }
@@ -3959,34 +4322,24 @@ haiku_term_init (void)
 
   gui_init_fringe (terminal->rif);
 
-#define ASSIGN_CURSOR(cursor, be_cursor) (dpyinfo->cursor = be_cursor)
-  ASSIGN_CURSOR (text_cursor, BCursor_create_i_beam ());
-  ASSIGN_CURSOR (nontext_cursor, BCursor_create_default ());
-  ASSIGN_CURSOR (modeline_cursor, BCursor_create_modeline ());
-  ASSIGN_CURSOR (hand_cursor, BCursor_create_grab ());
-  ASSIGN_CURSOR (hourglass_cursor, BCursor_create_progress_cursor ());
-  ASSIGN_CURSOR (horizontal_drag_cursor,
-                BCursor_from_id (CURSOR_ID_RESIZE_EAST_WEST));
-  ASSIGN_CURSOR (vertical_drag_cursor,
-                BCursor_from_id (CURSOR_ID_RESIZE_NORTH_SOUTH));
-  ASSIGN_CURSOR (left_edge_cursor,
-                BCursor_from_id (CURSOR_ID_RESIZE_WEST));
-  ASSIGN_CURSOR (top_left_corner_cursor,
-                BCursor_from_id (CURSOR_ID_RESIZE_NORTH_WEST));
-  ASSIGN_CURSOR (top_edge_cursor,
-                BCursor_from_id (CURSOR_ID_RESIZE_NORTH));
-  ASSIGN_CURSOR (top_right_corner_cursor,
-                BCursor_from_id (CURSOR_ID_RESIZE_NORTH_EAST));
-  ASSIGN_CURSOR (right_edge_cursor,
-                BCursor_from_id (CURSOR_ID_RESIZE_EAST));
-  ASSIGN_CURSOR (bottom_right_corner_cursor,
-                BCursor_from_id (CURSOR_ID_RESIZE_SOUTH_EAST));
-  ASSIGN_CURSOR (bottom_edge_cursor,
-                BCursor_from_id (CURSOR_ID_RESIZE_SOUTH));
-  ASSIGN_CURSOR (bottom_left_corner_cursor,
-                BCursor_from_id (CURSOR_ID_RESIZE_SOUTH_WEST));
-  ASSIGN_CURSOR (no_cursor,
-                BCursor_from_id (CURSOR_ID_NO_CURSOR));
+#define ASSIGN_CURSOR(cursor, cursor_id)                       \
+  (dpyinfo->cursor = be_create_cursor_from_id (cursor_id))
+  ASSIGN_CURSOR (text_cursor,                  CURSOR_ID_I_BEAM);
+  ASSIGN_CURSOR (nontext_cursor,               CURSOR_ID_SYSTEM_DEFAULT);
+  ASSIGN_CURSOR (modeline_cursor,              CURSOR_ID_CONTEXT_MENU);
+  ASSIGN_CURSOR (hand_cursor,                  CURSOR_ID_GRAB);
+  ASSIGN_CURSOR (hourglass_cursor,             CURSOR_ID_PROGRESS);
+  ASSIGN_CURSOR (horizontal_drag_cursor,       CURSOR_ID_RESIZE_EAST_WEST);
+  ASSIGN_CURSOR (vertical_drag_cursor,         CURSOR_ID_RESIZE_NORTH_SOUTH);
+  ASSIGN_CURSOR (left_edge_cursor,             CURSOR_ID_RESIZE_WEST);
+  ASSIGN_CURSOR (top_left_corner_cursor,       CURSOR_ID_RESIZE_NORTH_WEST);
+  ASSIGN_CURSOR (top_edge_cursor,              CURSOR_ID_RESIZE_NORTH);
+  ASSIGN_CURSOR (top_right_corner_cursor,      CURSOR_ID_RESIZE_NORTH_EAST);
+  ASSIGN_CURSOR (right_edge_cursor,            CURSOR_ID_RESIZE_EAST);
+  ASSIGN_CURSOR (bottom_right_corner_cursor,   CURSOR_ID_RESIZE_SOUTH_EAST);
+  ASSIGN_CURSOR (bottom_edge_cursor,           CURSOR_ID_RESIZE_SOUTH);
+  ASSIGN_CURSOR (bottom_left_corner_cursor,    CURSOR_ID_RESIZE_SOUTH_WEST);
+  ASSIGN_CURSOR (no_cursor,                    CURSOR_ID_NO_CURSOR);
 #undef ASSIGN_CURSOR
 
   system_name = Fsystem_name ();
@@ -4082,9 +4435,15 @@ mark_haiku_display (void)
 void
 haiku_scroll_bar_remove (struct scroll_bar *bar)
 {
+  void *view;
+  struct frame *f;
+
+  f = WINDOW_XFRAME (XWINDOW (bar->window));
+  view = FRAME_HAIKU_VIEW (f);
+
   block_input ();
-  void *view = FRAME_HAIKU_VIEW (WINDOW_XFRAME (XWINDOW (bar->window)));
-  BView_forget_scroll_bar (view, bar->left, bar->top, bar->width, bar->height);
+  BView_forget_scroll_bar (view, bar->left, bar->top,
+                          bar->width, bar->height);
   BScrollBar_delete (bar->scroll_bar);
   expose_frame (WINDOW_XFRAME (XWINDOW (bar->window)),
                bar->left, bar->top, bar->width, bar->height);
@@ -4093,7 +4452,6 @@ haiku_scroll_bar_remove (struct scroll_bar *bar)
     wset_horizontal_scroll_bar (XWINDOW (bar->window), Qnil);
   else
     wset_vertical_scroll_bar (XWINDOW (bar->window), Qnil);
-
   unblock_input ();
 };
 
@@ -4101,6 +4459,22 @@ void
 haiku_set_offset (struct frame *frame, int x, int y,
                  int change_gravity)
 {
+  Lisp_Object lframe;
+
+  /* Don't allow moving a fullscreen frame: the semantics of that are
+     unclear.  */
+
+  XSETFRAME (lframe, frame);
+  if (EQ (Fframe_parameter (lframe, Qfullscreen), Qfullboth)
+      /* Only do this if the fullscreen status has actually been
+        applied.  */
+      && frame->want_fullscreen == FULLSCREEN_NONE
+      /* And if the configury during frame creation has been
+        completed.  Otherwise, there will be no valid "old position"
+        to go back to.  */
+      && FRAME_OUTPUT_DATA (frame)->configury_done)
+    return;
+
   if (change_gravity > 0)
     {
       frame->top_pos = y;
@@ -4160,7 +4534,7 @@ haiku_merge_cursor_foreground (struct glyph_string *s,
     foreground = s->face->foreground;
 
   if (background == s->face->background
-      || foreground == s->face->foreground)
+      && foreground == s->face->foreground)
     {
       background = s->face->foreground;
       foreground = s->face->background;
diff --git a/src/haikuterm.h b/src/haikuterm.h
index 30b474b1e1..ea20289b5d 100644
--- a/src/haikuterm.h
+++ b/src/haikuterm.h
@@ -52,6 +52,10 @@ struct haiku_bitmap_record
   char *file;
   int refcount;
   int height, width, depth;
+
+  uint32_t stipple_foreground;
+  uint32_t stipple_background;
+  void *stipple_bits;
 };
 
 struct haiku_display_info
@@ -156,13 +160,16 @@ struct haiku_output
   int fontset;
   int baseline_offset;
 
-  bool_bf zoomed_p : 1;
+  /* Whether or not the hourglass cursor is currently being
+     displayed.  */
   bool_bf hourglass_p : 1;
+
+  /* Whether or not the menu bar is open.  */
   bool_bf menu_bar_open_p : 1;
 
   /* Whether or not there is data in a back buffer that hasn't been
      displayed yet.  */
-  bool dirty_p;
+  bool_bf dirty_p : 1;
 
   struct font *font;
 
@@ -192,6 +199,15 @@ struct haiku_output
      They are changed only when a different background is involved.
      -1 means no color has been computed.  */
   long relief_background;
+
+  /* The absolute position of this frame.  This differs from left_pos
+     and top_pos in that the decorator and parent frames are not taken
+     into account.  */
+  int frame_x, frame_y;
+
+  /* The current fullscreen mode of this frame.  This should be `enum
+     haiku_fullscreen_mode', but that isn't available here.  */
+  int fullscreen_mode;
 };
 
 struct x_output
@@ -203,7 +219,13 @@ extern struct haiku_display_info *x_display_list;
 extern struct font_driver const haikufont_driver;
 
 extern Lisp_Object tip_frame;
+extern Lisp_Object tip_dx;
+extern Lisp_Object tip_dy;
+
 extern struct frame *haiku_dnd_frame;
+extern bool haiku_dnd_follow_tooltip;
+
+extern frame_parm_handler haiku_frame_parm_handlers[];
 
 struct scroll_bar
 {
@@ -298,6 +320,7 @@ extern void haiku_set_cursor_type (struct frame *, 
Lisp_Object, Lisp_Object);
 extern void haiku_set_internal_border_width (struct frame *, Lisp_Object, 
Lisp_Object);
 extern void haiku_change_tab_bar_height (struct frame *, int);
 extern void haiku_change_tool_bar_height (struct frame *, int);
+extern void haiku_free_custom_cursors (struct frame *);
 
 extern void haiku_query_color (uint32_t, Emacs_Color *);
 
@@ -323,6 +346,9 @@ extern int haiku_load_image (struct frame *, struct image *,
 extern void syms_of_haikuimage (void);
 #endif
 
+extern void haiku_draw_background_rect (struct glyph_string *, struct face *,
+                                       int, int, int, int);
+
 #ifdef USE_BE_CAIRO
 extern cairo_t *haiku_begin_cr_clip (struct frame *, struct glyph_string *);
 
diff --git a/src/image.c b/src/image.c
index e4b56e29cf..058c175570 100644
--- a/src/image.c
+++ b/src/image.c
@@ -542,12 +542,26 @@ image_create_bitmap_from_data (struct frame *f, char 
*bits,
 #endif /* HAVE_PGTK */
 
 #ifdef HAVE_HAIKU
-  void *bitmap = BBitmap_new (width, height, 1);
+  void *bitmap, *stipple;
+  int bytes_per_line, x, y;
+
+  bitmap = BBitmap_new (width, height, false);
 
   if (!bitmap)
     return -1;
 
-  BBitmap_import_mono_bits (bitmap, bits, width, height);
+  bytes_per_line = (width + 7) / 8;
+  stipple = xmalloc (height * bytes_per_line);
+  memcpy (stipple, bits, height * bytes_per_line);
+
+  for (y = 0; y < height; y++)
+    {
+      for (x = 0; x < width; x++)
+       PUT_PIXEL (bitmap, x, y, ((bits[8] >> (x % 8)) & 1
+                                 ? f->foreground_pixel
+                                 : f->background_pixel));
+      bits += bytes_per_line;
+    }
 #endif
 
   id = image_allocate_bitmap_record (f);
@@ -567,6 +581,11 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 #ifdef HAVE_HAIKU
   dpyinfo->bitmaps[id - 1].img = bitmap;
   dpyinfo->bitmaps[id - 1].depth = 1;
+  dpyinfo->bitmaps[id - 1].stipple_bits = stipple;
+  dpyinfo->bitmaps[id - 1].stipple_foreground
+    = f->foreground_pixel & 0xffffffff;
+  dpyinfo->bitmaps[id - 1].stipple_background
+    = f->background_pixel & 0xffffffff;
 #endif
 
   dpyinfo->bitmaps[id - 1].file = NULL;
@@ -592,24 +611,55 @@ image_create_bitmap_from_data (struct frame *f, char 
*bits,
   return id;
 }
 
+#if defined HAVE_HAIKU || defined HAVE_NS
+static char *slurp_file (int, ptrdiff_t *);
+static Lisp_Object image_find_image_fd (Lisp_Object, int *);
+static bool xbm_read_bitmap_data (struct frame *, char *, char *,
+                                 int *, int *, char **, bool);
+#endif
+
 /* Create bitmap from file FILE for frame F.  */
 
 ptrdiff_t
 image_create_bitmap_from_file (struct frame *f, Lisp_Object file)
 {
-#if defined (HAVE_NTGUI) || defined (HAVE_HAIKU)
+#if defined (HAVE_NTGUI)
   return -1;  /* W32_TODO : bitmap support */
 #else
   Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f);
 #endif
 
 #ifdef HAVE_NS
-  ptrdiff_t id;
-  void *bitmap = ns_image_from_file (file);
+  ptrdiff_t id, size;
+  int fd, width, height, rc;
+  char *contents, *data;
+  void *bitmap;
 
-  if (!bitmap)
+  if (!STRINGP (image_find_image_fd (file, &fd)))
+    return -1;
+
+  contents = slurp_file (fd, &size);
+
+  if (!contents)
+    return -1;
+
+  rc = xbm_read_bitmap_data (f, contents, contents + size,
+                            &width, &height, &data, 0);
+
+  if (!rc)
+    {
+      xfree (contents);
       return -1;
+    }
 
+  bitmap = ns_image_from_XBM (data, width, height, 0, 0);
+
+  if (!bitmap)
+    {
+      xfree (contents);
+      xfree (data);
+      return -1;
+    }
 
   id = image_allocate_bitmap_record (f);
   dpyinfo->bitmaps[id - 1].img = bitmap;
@@ -618,6 +668,9 @@ image_create_bitmap_from_file (struct frame *f, Lisp_Object 
file)
   dpyinfo->bitmaps[id - 1].depth = 1;
   dpyinfo->bitmaps[id - 1].height = ns_image_width (bitmap);
   dpyinfo->bitmaps[id - 1].width = ns_image_height (bitmap);
+
+  xfree (contents);
+  xfree (data);
   return id;
 #endif
 
@@ -637,7 +690,6 @@ image_create_bitmap_from_file (struct frame *f, Lisp_Object 
file)
   dpyinfo->bitmaps[id - 1].img = bitmap;
   dpyinfo->bitmaps[id - 1].refcount = 1;
   dpyinfo->bitmaps[id - 1].file = xlispstrdup (file);
-  //dpyinfo->bitmaps[id - 1].depth = 1;
   dpyinfo->bitmaps[id - 1].height = gdk_pixbuf_get_width (bitmap);
   dpyinfo->bitmaps[id - 1].width = gdk_pixbuf_get_height (bitmap);
   dpyinfo->bitmaps[id - 1].pattern
@@ -692,6 +744,89 @@ image_create_bitmap_from_file (struct frame *f, 
Lisp_Object file)
 
   return id;
 #endif /* HAVE_X_WINDOWS */
+
+#ifdef HAVE_HAIKU
+  ptrdiff_t id, size;
+  int fd, width, height, rc, bytes_per_line, x, y;
+  char *contents, *data, *tmp;
+  void *bitmap;
+  Lisp_Object found;
+
+  /* Look for an existing bitmap with the same name.  */
+  for (id = 0; id < dpyinfo->bitmaps_last; ++id)
+    {
+      if (dpyinfo->bitmaps[id].refcount
+         && dpyinfo->bitmaps[id].file
+         && !strcmp (dpyinfo->bitmaps[id].file, SSDATA (file)))
+       {
+         ++dpyinfo->bitmaps[id].refcount;
+         return id + 1;
+       }
+    }
+
+  /* Search bitmap-file-path for the file, if appropriate.  */
+  if (openp (Vx_bitmap_file_path, file, Qnil, &found,
+            make_fixnum (R_OK), false, false)
+      < 0)
+    return -1;
+
+  if (!STRINGP (image_find_image_fd (file, &fd))
+      && !STRINGP (image_find_image_fd (found, &fd)))
+    return -1;
+
+  contents = slurp_file (fd, &size);
+
+  if (!contents)
+    return -1;
+
+  rc = xbm_read_bitmap_data (f, contents, contents + size,
+                            &width, &height, &data, 0);
+
+  if (!rc)
+    {
+      xfree (contents);
+      return -1;
+    }
+
+  bitmap = BBitmap_new (width, height, false);
+
+  if (!bitmap)
+    {
+      xfree (contents);
+      xfree (data);
+      return -1;
+    }
+
+  id = image_allocate_bitmap_record (f);
+
+  dpyinfo->bitmaps[id - 1].img = bitmap;
+  dpyinfo->bitmaps[id - 1].depth = 1;
+  dpyinfo->bitmaps[id - 1].file = xlispstrdup (file);
+  dpyinfo->bitmaps[id - 1].height = height;
+  dpyinfo->bitmaps[id - 1].width = width;
+  dpyinfo->bitmaps[id - 1].refcount = 1;
+  dpyinfo->bitmaps[id - 1].stipple_foreground
+    = f->foreground_pixel & 0xffffffff;
+  dpyinfo->bitmaps[id - 1].stipple_background
+    = f->background_pixel & 0xffffffff;
+  dpyinfo->bitmaps[id - 1].stipple_bits = data;
+
+  bytes_per_line = (width + 7) / 8;
+  tmp = data;
+
+  for (y = 0; y < height; y++)
+    {
+      for (x = 0; x < width; x++)
+       PUT_PIXEL (bitmap, x, y, ((tmp[x / 8] >> (x % 8)) & 1
+                                 ? f->foreground_pixel
+                                 : f->background_pixel));
+
+      tmp += bytes_per_line;
+    }
+
+  xfree (contents);
+  return id;
+#endif
 }
 
 /* Free bitmap B.  */
@@ -724,6 +859,9 @@ free_bitmap_record (Display_Info *dpyinfo, Bitmap_Record 
*bm)
 
 #ifdef HAVE_HAIKU
   BBitmap_free (bm->img);
+
+  if (bm->stipple_bits)
+    xfree (bm->stipple_bits);
 #endif
 
   if (bm->file)
@@ -6169,7 +6307,7 @@ image_edge_detection (struct frame *f, struct image *img,
 }
 
 
-#if defined HAVE_X_WINDOWS || defined USE_CAIRO
+#if defined HAVE_X_WINDOWS || defined USE_CAIRO || defined HAVE_HAIKU
 static void
 image_pixmap_draw_cross (struct frame *f, Emacs_Pixmap pixmap,
                         int x, int y, unsigned int width, unsigned int height,
@@ -6203,9 +6341,11 @@ image_pixmap_draw_cross (struct frame *f, Emacs_Pixmap 
pixmap,
   XDrawLine (dpy, pixmap, gc, x, y, x + width - 1, y + height - 1);
   XDrawLine (dpy, pixmap, gc, x, y + height - 1, x + width - 1, y);
   XFreeGC (dpy, gc);
-#endif /* HAVE_X_WINDOWS */
+#elif HAVE_HAIKU
+  be_draw_cross_on_pixmap (pixmap, x, y, width, height, color);
+#endif
 }
-#endif /* HAVE_X_WINDOWS || USE_CAIRO */
+#endif /* HAVE_X_WINDOWS || USE_CAIRO || HAVE_HAIKU */
 
 /* Transform image IMG on frame F so that it looks disabled.  */
 
@@ -6247,25 +6387,23 @@ image_disable_image (struct frame *f, struct image *img)
     {
 #ifndef HAVE_NTGUI
 #ifndef HAVE_NS  /* TODO: NS support, however this not needed for toolbars */
-#ifndef HAVE_HAIKU
 
-#ifndef USE_CAIRO
+#if !defined USE_CAIRO && !defined HAVE_HAIKU
 #define CrossForeground(f) BLACK_PIX_DEFAULT (f)
 #define MaskForeground(f)  WHITE_PIX_DEFAULT (f)
-#else  /* USE_CAIRO */
+#else  /* USE_CAIRO || HAVE_HAIKU */
 #define CrossForeground(f) 0
 #define MaskForeground(f)  PIX_MASK_DRAW
-#endif /* USE_CAIRO */
+#endif /* USE_CAIRO || HAVE_HAIKU */
 
-#ifndef USE_CAIRO
+#if !defined USE_CAIRO && !defined HAVE_HAIKU
       image_sync_to_pixmaps (f, img);
-#endif /* !USE_CAIRO */
+#endif /* !USE_CAIRO && !HAVE_HAIKU */
       image_pixmap_draw_cross (f, img->pixmap, 0, 0, img->width, img->height,
                               CrossForeground (f));
       if (img->mask)
        image_pixmap_draw_cross (f, img->mask, 0, 0, img->width, img->height,
                                 MaskForeground (f));
-#endif /* !HAVE_HAIKU */
 #endif /* !HAVE_NS */
 #else
       HDC hdc, bmpdc;
@@ -8970,7 +9108,7 @@ gif_load (struct frame *f, struct image *img)
       goto gif_error;
     }
 
-  /* It's an animated image, so initalize the cache.  */
+  /* It's an animated image, so initialize the cache.  */
   if (cache && !cache->handle)
     {
       cache->handle = gif;
diff --git a/src/indent.c b/src/indent.c
index acbb9dc972..51f6f414de 100644
--- a/src/indent.c
+++ b/src/indent.c
@@ -1204,7 +1204,7 @@ compute_motion (ptrdiff_t from, ptrdiff_t frombyte, 
EMACS_INT fromvpos,
   /* Negative width means use all available text columns.  */
   if (width < 0)
     {
-      width = window_body_width (win, 0);
+      width = window_body_width (win, WINDOW_BODY_IN_CANONICAL_CHARS);
       /* We must make room for continuation marks if we don't have fringes.  */
 #ifdef HAVE_WINDOW_SYSTEM
       if (!FRAME_WINDOW_P (XFRAME (win->frame)))
@@ -1814,7 +1814,7 @@ visible section of the buffer, and pass LINE and COL as 
TOPOS.  */)
                         ? window_internal_height (w)
                         : XFIXNUM (XCDR (topos))),
                        (NILP (topos)
-                        ? (window_body_width (w, 0)
+                        ? (window_body_width (w, 
WINDOW_BODY_IN_CANONICAL_CHARS)
                            - (
 #ifdef HAVE_WINDOW_SYSTEM
                               FRAME_WINDOW_P (XFRAME (w->frame)) ? 0 :
diff --git a/src/intervals.c b/src/intervals.c
index 687b237b9e..9e28637d6b 100644
--- a/src/intervals.c
+++ b/src/intervals.c
@@ -121,7 +121,6 @@ copy_properties (INTERVAL source, INTERVAL target)
 {
   if (DEFAULT_INTERVAL_P (source) && DEFAULT_INTERVAL_P (target))
     return;
-  eassume (source && target);
 
   COPY_INTERVAL_CACHE (source, target);
   set_interval_plist (target, Fcopy_sequence (source->plist));
diff --git a/src/intervals.h b/src/intervals.h
index 484fca2e75..0ce581208e 100644
--- a/src/intervals.h
+++ b/src/intervals.h
@@ -251,7 +251,7 @@ extern void traverse_intervals_noorder (INTERVAL,
                                        void (*) (INTERVAL, void *), void *);
 extern INTERVAL split_interval_right (INTERVAL, ptrdiff_t)
   ATTRIBUTE_RETURNS_NONNULL;
-extern INTERVAL split_interval_left (INTERVAL, ptrdiff_t);
+extern INTERVAL split_interval_left (INTERVAL, ptrdiff_t) 
ATTRIBUTE_RETURNS_NONNULL;
 extern INTERVAL find_interval (INTERVAL, ptrdiff_t);
 extern INTERVAL next_interval (INTERVAL);
 extern INTERVAL previous_interval (INTERVAL);
diff --git a/src/json.c b/src/json.c
index 957f91b46b..4b3fabb3eb 100644
--- a/src/json.c
+++ b/src/json.c
@@ -364,7 +364,7 @@ lisp_to_json_nonscalar_1 (Lisp_Object lisp,
       for (ptrdiff_t i = 0; i < HASH_TABLE_SIZE (h); ++i)
         {
           Lisp_Object key = HASH_KEY (h, i);
-          if (!EQ (key, Qunbound))
+          if (!BASE_EQ (key, Qunbound))
             {
               CHECK_STRING (key);
               Lisp_Object ekey = json_encode (key);
diff --git a/src/keyboard.c b/src/keyboard.c
index 70908120cb..55d710ed62 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -95,8 +95,6 @@ volatile int interrupt_input_blocked;
    The maybe_quit function checks this.  */
 volatile bool pending_signals;
 
-enum { KBD_BUFFER_SIZE = 4096 };
-
 KBOARD *initial_kboard;
 KBOARD *current_kboard;
 static KBOARD *all_kboards;
@@ -290,14 +288,14 @@ bool input_was_pending;
 
 /* Circular buffer for pre-read keyboard input.  */
 
-static union buffered_input_event kbd_buffer[KBD_BUFFER_SIZE];
+union buffered_input_event kbd_buffer[KBD_BUFFER_SIZE];
 
 /* Pointer to next available character in kbd_buffer.
    If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty.  */
-static union buffered_input_event *kbd_fetch_ptr;
+union buffered_input_event *kbd_fetch_ptr;
 
 /* Pointer to next place to store character in kbd_buffer.  */
-static union buffered_input_event *kbd_store_ptr;
+union buffered_input_event *kbd_store_ptr;
 
 /* The above pair of variables forms a "queue empty" flag.  When we
    enqueue a non-hook event, we increment kbd_store_ptr.  When we
@@ -391,14 +389,6 @@ next_kbd_event (union buffered_input_event *ptr)
   return ptr == kbd_buffer + KBD_BUFFER_SIZE - 1 ? kbd_buffer : ptr + 1;
 }
 
-#ifdef HAVE_X11
-static union buffered_input_event *
-prev_kbd_event (union buffered_input_event *ptr)
-{
-  return ptr == kbd_buffer ? kbd_buffer + KBD_BUFFER_SIZE - 1 : ptr - 1;
-}
-#endif
-
 /* Like EVENT_START, but assume EVENT is an event.
    This pacifies gcc -Wnull-dereference, which might otherwise
    complain about earlier checks that EVENT is indeed an event.  */
@@ -3530,6 +3520,11 @@ readable_events (int flags)
        return 1;
     }
 
+#ifdef HAVE_X_WINDOWS
+  if (x_detect_pending_selection_requests ())
+    return 1;
+#endif
+
   if (!(flags & READABLE_EVENTS_IGNORE_SQUEEZABLES) && some_mouse_moved ())
     return 1;
   if (single_kboard)
@@ -3701,25 +3696,6 @@ kbd_buffer_store_buffered_event (union 
buffered_input_event *event,
     Vquit_flag = Vthrow_on_input;
 }
 
-
-#ifdef HAVE_X11
-
-/* Put a selection input event back in the head of the event queue.  */
-
-void
-kbd_buffer_unget_event (struct selection_input_event *event)
-{
-  /* Don't let the very last slot in the buffer become full,  */
-  union buffered_input_event *kp = prev_kbd_event (kbd_fetch_ptr);
-  if (kp != kbd_store_ptr)
-    {
-      kp->sie = *event;
-      kbd_fetch_ptr = kp;
-    }
-}
-
-#endif
-
 /* Limit help event positions to this range, to avoid overflow problems.  */
 #define INPUT_EVENT_POS_MAX \
   ((ptrdiff_t) min (PTRDIFF_MAX, min (TYPE_MAXIMUM (Time) / 2, \
@@ -3876,6 +3852,11 @@ kbd_buffer_get_event (KBOARD **kbp,
                       struct timespec *end_time)
 {
   Lisp_Object obj, str;
+#ifdef HAVE_X_WINDOWS
+  bool had_pending_selection_requests;
+
+  had_pending_selection_requests = false;
+#endif
 
 #ifdef subprocesses
   if (kbd_on_hold_p () && kbd_buffer_nr_stored () < KBD_BUFFER_SIZE / 4)
@@ -3928,10 +3909,18 @@ kbd_buffer_get_event (KBOARD **kbp,
 #if defined (USABLE_SIGIO) || defined (USABLE_SIGPOLL)
       gobble_input ();
 #endif
+
       if (kbd_fetch_ptr != kbd_store_ptr)
        break;
       if (some_mouse_moved ())
        break;
+#ifdef HAVE_X_WINDOWS
+      if (x_detect_pending_selection_requests ())
+       {
+         had_pending_selection_requests = true;
+         break;
+       }
+#endif
       if (end_time)
        {
          struct timespec now = current_timespec ();
@@ -3968,6 +3957,16 @@ kbd_buffer_get_event (KBOARD **kbp,
        gobble_input ();
     }
 
+#ifdef HAVE_X_WINDOWS
+  /* Handle pending selection requests.  This can happen if Emacs
+     enters a recursive edit inside a nested event loop (probably
+     because the debugger opened) or someone called
+     `read-char'.  */
+
+  if (had_pending_selection_requests)
+    x_handle_pending_selection_requests ();
+#endif
+
   if (CONSP (Vunread_command_events))
     {
       Lisp_Object first;
@@ -4022,6 +4021,11 @@ kbd_buffer_get_event (KBOARD **kbp,
          kbd_fetch_ptr = next_kbd_event (event);
          input_pending = readable_events (0);
 
+         /* This means this event was already handled in
+            `x_dnd_begin_drag_and_drop'.  */
+         if (event->ie.modifiers < x_dnd_unsupported_event_level)
+           break;
+
          f = XFRAME (event->ie.frame_or_window);
 
          if (!FRAME_LIVE_P (f))
@@ -4029,14 +4033,20 @@ kbd_buffer_get_event (KBOARD **kbp,
 
          if (!NILP (Vx_dnd_unsupported_drop_function))
            {
-             if (!NILP (call6 (Vx_dnd_unsupported_drop_function,
+             if (!NILP (call7 (Vx_dnd_unsupported_drop_function,
                                XCAR (XCDR (event->ie.arg)), event->ie.x,
                                event->ie.y, XCAR (XCDR (XCDR (event->ie.arg))),
                                make_uint (event->ie.code),
-                               event->ie.frame_or_window)))
+                               event->ie.frame_or_window,
+                               make_int (event->ie.timestamp))))
                break;
            }
 
+         /* `x-dnd-unsupported-drop-function' could have deleted the
+            event frame.  */
+         if (!FRAME_LIVE_P (f))
+           break;
+
          x_dnd_do_unsupported_drop (FRAME_DISPLAY_INFO (f),
                                     event->ie.frame_or_window,
                                     XCAR (event->ie.arg),
@@ -4049,6 +4059,18 @@ kbd_buffer_get_event (KBOARD **kbp,
        }
 #endif
 
+      case MONITORS_CHANGED_EVENT:
+       {
+         kbd_fetch_ptr = next_kbd_event (event);
+         input_pending = readable_events (0);
+
+         CALLN (Frun_hook_with_args,
+                Qdisplay_monitors_changed_functions,
+                event->ie.arg);
+
+         break;
+       }
+
 #ifdef HAVE_EXT_MENU_BAR
       case MENU_BAR_ACTIVATE_EVENT:
        {
@@ -4324,6 +4346,10 @@ kbd_buffer_get_event (KBOARD **kbp,
                              ? movement_frame->last_mouse_device
                              : virtual_core_pointer_name);
     }
+#ifdef HAVE_X_WINDOWS
+  else if (had_pending_selection_requests)
+    obj = Qnil;
+#endif
   else
     /* We were promised by the above while loop that there was
        something for us to read!  */
@@ -7220,7 +7246,10 @@ lucid_event_type_list_p (Lisp_Object object)
    If READABLE_EVENTS_FILTER_EVENTS is set in FLAGS, ignore internal
    events (FOCUS_IN_EVENT).
    If READABLE_EVENTS_IGNORE_SQUEEZABLES is set in FLAGS, ignore mouse
-   movements and toolkit scroll bar thumb drags.  */
+   movements and toolkit scroll bar thumb drags.
+
+   On X, this also returns if the selection event chain is full, since
+   that's also "keyboard input".  */
 
 static bool
 get_input_pending (int flags)
@@ -12600,6 +12629,8 @@ See also `pre-command-hook'.  */);
   DEFSYM (Qtouchscreen_end, "touchscreen-end");
   DEFSYM (Qtouchscreen_update, "touchscreen-update");
   DEFSYM (Qpinch, "pinch");
+  DEFSYM (Qdisplay_monitors_changed_functions,
+         "display-monitors-changed-functions");
 
   DEFSYM (Qcoding, "coding");
 
@@ -12840,6 +12871,14 @@ Called with three arguments:
 - the context (a string which normally goes at the start of the message),
 - the Lisp function within which the error was signaled.
 
+For instance, to make error messages stand out more in the echo area,
+you could say something like:
+
+    (setq command-error-function
+          (lambda (data _ _)
+            (message "%s" (propertize (error-message-string data)
+                                      \\='face \\='error))))
+
 Also see `set-message-function' (which controls how non-error messages
 are displayed).  */);
   Vcommand_error_function = intern ("command-error-default-function");
@@ -12854,11 +12893,12 @@ and tool-bar buttons.  */);
 
   DEFVAR_LISP ("select-active-regions",
               Vselect_active_regions,
-              doc: /* If non-nil, an active region automatically sets the 
primary selection.
-If the value is `only', only temporarily active regions (usually made
-by mouse-dragging or shift-selection) set the window selection.
+              doc: /* If non-nil, any active region automatically sets the 
primary selection.
+This variable only has an effect when Transient Mark mode is enabled.
 
-This takes effect only when Transient Mark mode is enabled.  */);
+If the value is `only', only temporarily active regions (usually made
+by mouse-dragging or shift-selection) set the window system's primary
+selection.  */);
   Vselect_active_regions = Qt;
 
   DEFVAR_LISP ("saved-region-selection",
@@ -12943,6 +12983,15 @@ Otherwise, a wheel event will be sent every time the 
mouse wheel is
 moved.  */);
   mwheel_coalesce_scroll_events = true;
 
+  DEFVAR_LISP ("display-monitors-changed-functions", 
Vdisplay_monitors_changed_functions,
+    doc: /* Abnormal hook run when the monitor configuration changes.
+This can happen if a monitor is rotated, moved, plugged in or removed
+from a multi-monitor setup, if the primary monitor changes, or if the
+resolution of a monitor changes.  The hook should accept a single
+argument, which is the terminal on which the monitor configuration
+changed.  */);
+  Vdisplay_monitors_changed_functions = Qnil;
+
   pdumper_do_now_and_after_load (syms_of_keyboard_for_pdumper);
 }
 
diff --git a/src/keyboard.h b/src/keyboard.h
index cd5f677b96..6ae2dc9c4c 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -358,6 +358,11 @@ enum menu_item_idx
   MENU_ITEMS_ITEM_LENGTH
 };
 
+enum
+  {
+    KBD_BUFFER_SIZE = 4096
+  };
+
 extern void unuse_menu_items (void);
 
 /* This is how to deal with multibyte text if HAVE_MULTILINGUAL_MENU
@@ -419,6 +424,10 @@ extern void unuse_menu_items (void);
    happens.  */
 extern struct timespec *input_available_clear_time;
 
+extern union buffered_input_event kbd_buffer[KBD_BUFFER_SIZE];
+extern union buffered_input_event *kbd_fetch_ptr;
+extern union buffered_input_event *kbd_store_ptr;
+
 extern bool ignore_mouse_drag_p;
 
 extern Lisp_Object parse_modifiers (Lisp_Object);
@@ -472,9 +481,6 @@ kbd_buffer_store_event_hold (struct input_event *event,
   kbd_buffer_store_buffered_event ((union buffered_input_event *) event,
                                   hold_quit);
 }
-#ifdef HAVE_X11
-extern void kbd_buffer_unget_event (struct selection_input_event *);
-#endif
 extern void poll_for_input_1 (void);
 extern void show_help_echo (Lisp_Object, Lisp_Object, Lisp_Object,
                             Lisp_Object);
diff --git a/src/keymap.c b/src/keymap.c
index da0a52bd2c..c8b01eed6f 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -395,7 +395,7 @@ access_keymap_1 (Lisp_Object map, Lisp_Object idx,
            if (noinherit || NILP (retval))
              /* If NOINHERIT, stop here, the rest is inherited.  */
              break;
-           else if (!EQ (retval, Qunbound))
+           else if (!BASE_EQ (retval, Qunbound))
              {
                Lisp_Object parent_entry;
                eassert (KEYMAPP (retval));
@@ -454,7 +454,7 @@ access_keymap_1 (Lisp_Object map, Lisp_Object idx,
          }
 
        /* If we found a binding, clean it up and return it.  */
-       if (!EQ (val, Qunbound))
+       if (!BASE_EQ (val, Qunbound))
          {
            if (EQ (val, Qt))
              /* A Qt binding is just like an explicit nil binding
@@ -466,12 +466,12 @@ access_keymap_1 (Lisp_Object map, Lisp_Object idx,
 
            if (!KEYMAPP (val))
              {
-               if (NILP (retval) || EQ (retval, Qunbound))
+               if (NILP (retval) || BASE_EQ (retval, Qunbound))
                  retval = val;
                if (!NILP (val))
                  break;  /* Shadows everything that follows.  */
              }
-           else if (NILP (retval) || EQ (retval, Qunbound))
+           else if (NILP (retval) || BASE_EQ (retval, Qunbound))
              retval = val;
            else if (CONSP (retval_tail))
              {
@@ -487,7 +487,8 @@ access_keymap_1 (Lisp_Object map, Lisp_Object idx,
        maybe_quit ();
       }
 
-    return EQ (Qunbound, retval) ? get_keyelt (t_binding, autoload) : retval;
+    return BASE_EQ (Qunbound, retval)
+           ? get_keyelt (t_binding, autoload) : retval;
   }
 }
 
@@ -496,7 +497,7 @@ access_keymap (Lisp_Object map, Lisp_Object idx,
               bool t_ok, bool noinherit, bool autoload)
 {
   Lisp_Object val = access_keymap_1 (map, idx, t_ok, noinherit, autoload);
-  return EQ (val, Qunbound) ? Qnil : val;
+  return BASE_EQ (val, Qunbound) ? Qnil : val;
 }
 
 static void
@@ -1550,7 +1551,7 @@ current_minor_maps (Lisp_Object **modeptr, Lisp_Object 
**mapptr)
       for ( ; CONSP (alist); alist = XCDR (alist))
        if ((assoc = XCAR (alist), CONSP (assoc))
            && (var = XCAR (assoc), SYMBOLP (var))
-           && (val = find_symbol_value (var), !EQ (val, Qunbound))
+           && (val = find_symbol_value (var), !BASE_EQ (val, Qunbound))
            && !NILP (val))
          {
            Lisp_Object temp;
diff --git a/src/lisp.h b/src/lisp.h
index 8832e76b44..361a3f63b2 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -621,7 +621,6 @@ extern Lisp_Object char_table_ref (Lisp_Object, int) 
ATTRIBUTE_PURE;
 extern void char_table_set (Lisp_Object, int, Lisp_Object);
 
 /* Defined in data.c.  */
-extern bool symbols_with_pos_enabled;
 extern AVOID args_out_of_range_3 (Lisp_Object, Lisp_Object, Lisp_Object);
 extern AVOID wrong_type_argument (Lisp_Object, Lisp_Object);
 extern Lisp_Object default_value (Lisp_Object symbol);
@@ -2097,19 +2096,17 @@ XSUB_CHAR_TABLE (Lisp_Object a)
 INLINE Lisp_Object
 CHAR_TABLE_REF_ASCII (Lisp_Object ct, ptrdiff_t idx)
 {
-  struct Lisp_Char_Table *tbl = NULL;
-  Lisp_Object val;
-  do
+  for (struct Lisp_Char_Table *tbl = XCHAR_TABLE (ct); ;
+       tbl = XCHAR_TABLE (tbl->parent))
     {
-      tbl = tbl ? XCHAR_TABLE (tbl->parent) : XCHAR_TABLE (ct);
-      val = (! SUB_CHAR_TABLE_P (tbl->ascii) ? tbl->ascii
-            : XSUB_CHAR_TABLE (tbl->ascii)->contents[idx]);
+      Lisp_Object val = (SUB_CHAR_TABLE_P (tbl->ascii)
+                        ? XSUB_CHAR_TABLE (tbl->ascii)->contents[idx]
+                        : tbl->ascii);
       if (NILP (val))
        val = tbl->defalt;
+      if (!NILP (val) || NILP (tbl->parent))
+       return val;
     }
-  while (NILP (val) && ! NILP (tbl->parent));
-
-  return val;
 }
 
 /* Almost equivalent to Faref (CT, IDX) with optimization for ASCII
@@ -3639,6 +3636,10 @@ struct handler
   struct bc_frame *act_rec;
   int poll_suppress_count;
   int interrupt_input_blocked;
+
+#ifdef HAVE_X_WINDOWS
+  int x_error_handler_depth;
+#endif
 };
 
 extern Lisp_Object memory_signal_data;
@@ -4492,6 +4493,7 @@ extern void dir_warning (const char *, Lisp_Object);
 extern void init_obarray_once (void);
 extern void init_lread (void);
 extern void syms_of_lread (void);
+extern void mark_lread (void);
 
 INLINE Lisp_Object
 intern (const char *str)
@@ -5098,9 +5100,7 @@ extern void syms_of_w32cygwinx (void);
 extern Lisp_Object Vface_alternative_font_family_alist;
 extern Lisp_Object Vface_alternative_font_registry_alist;
 extern void syms_of_xfaces (void);
-#ifdef HAVE_PDUMPER
 extern void init_xfaces (void);
-#endif
 
 #ifdef HAVE_X_WINDOWS
 /* Defined in xfns.c.  */
@@ -5503,7 +5503,7 @@ struct for_each_tail_internal
    intended for use only by the above macros.
 
    Use Brent’s teleporting tortoise-hare algorithm.  See:
-   Brent RP. BIT. 1980;20(2):176-84. doi:10.1007/BF01933190
+   Brent RP. BIT. 1980;20(2):176-184. doi:10.1007/BF01933190
    https://maths-people.anu.edu.au/~brent/pd/rpb051i.pdf
 
    This macro uses maybe_quit because of an excess of caution.  The
@@ -5520,7 +5520,7 @@ struct for_each_tail_internal
          || ((check_quit) ? maybe_quit () : (void) 0, 0 < --li.n)      \
          || (li.q = li.n = li.max <<= 1, li.n >>= USHRT_WIDTH,         \
              li.tortoise = (tail), false))                             \
-        && EQ (tail, li.tortoise))                                     \
+        && BASE_EQ (tail, li.tortoise))                                \
        ? (cycle) : (void) 0))
 
 /* Do a `for' loop over alist values.  */
diff --git a/src/lread.c b/src/lread.c
index f1ffdef04e..dfabe75113 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -656,10 +656,6 @@ struct subst
 static Lisp_Object read_internal_start (Lisp_Object, Lisp_Object,
                                         Lisp_Object, bool);
 static Lisp_Object read0 (Lisp_Object, bool);
-static Lisp_Object read1 (Lisp_Object, int *, bool, bool);
-
-static Lisp_Object read_list (bool, Lisp_Object, bool);
-static Lisp_Object read_vector (Lisp_Object, bool, bool);
 
 static Lisp_Object substitute_object_recurse (struct subst *, Lisp_Object);
 static void substitute_in_interval (INTERVAL, void *);
@@ -940,7 +936,7 @@ lisp_file_lexically_bound_p (Lisp_Object readcharfun)
         ch = READCHAR;
       if (ch == '\n') ch = READCHAR;
       /* It is OK to leave the position after a #! line, since
-         that is what read1 does.  */
+        that is what read0 does.  */
     }
 
   if (ch != ';')
@@ -1248,10 +1244,9 @@ Return t if the file exists and loads successfully.  */)
   CHECK_STRING (file);
 
   /* If file name is magic, call the handler.  */
-  /* This shouldn't be necessary any more now that `openp' handles it right.
-    handler = Ffind_file_name_handler (file, Qload);
-    if (!NILP (handler))
-      return call5 (handler, Qload, file, noerror, nomessage, nosuffix); */
+  handler = Ffind_file_name_handler (file, Qload);
+  if (!NILP (handler))
+    return call5 (handler, Qload, file, noerror, nomessage, nosuffix);
 
   /* The presence of this call is the result of a historical accident:
      it used to be in every file-operation and when it got removed
@@ -2221,7 +2216,7 @@ readevalloop (Lisp_Object readcharfun,
      lexical environment, otherwise, turn off lexical binding.  */
   lex_bound = find_symbol_value (Qlexical_binding);
   specbind (Qinternal_interpreter_environment,
-           (NILP (lex_bound) || EQ (lex_bound, Qunbound)
+           (NILP (lex_bound) || BASE_EQ (lex_bound, Qunbound)
             ? Qnil : list1 (Qt)));
   specbind (Qmacroexp__dynvars, Vmacroexp__dynvars);
 
@@ -2286,6 +2281,7 @@ readevalloop (Lisp_Object readcharfun,
       if (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r'
          || c == NO_BREAK_SPACE)
        goto read_next;
+      UNREAD (c);
 
       if (! HASH_TABLE_P (read_objects_map)
          || XHASH_TABLE (read_objects_map)->count)
@@ -2300,12 +2296,9 @@ readevalloop (Lisp_Object readcharfun,
                             DEFAULT_REHASH_SIZE, DEFAULT_REHASH_THRESHOLD,
                             Qnil, false);
       if (!NILP (Vpurify_flag) && c == '(')
-       {
-         val = read_list (0, readcharfun, false);
-       }
+       val = read0 (readcharfun, false);
       else
        {
-         UNREAD (c);
          if (!NILP (readfun))
            {
              val = call1 (readfun, readcharfun);
@@ -2349,7 +2342,7 @@ readevalloop (Lisp_Object readcharfun,
        {
          Vvalues = Fcons (val, Vvalues);
          if (EQ (Vstandard_output, Qt))
-           Fprin1 (val, Qnil);
+           Fprin1 (val, Qnil, Qnil);
          else
            Fprint (val, Qnil);
        }
@@ -2582,24 +2575,6 @@ read_internal_start (Lisp_Object stream, Lisp_Object 
start, Lisp_Object end,
   return retval;
 }
 
-
-/* Use this for recursive reads, in contexts where internal tokens
-   are not allowed.  */
-
-static Lisp_Object
-read0 (Lisp_Object readcharfun, bool locate_syms)
-{
-  register Lisp_Object val;
-  int c;
-
-  val = read1 (readcharfun, &c, 0, locate_syms);
-  if (!c)
-    return val;
-
-  invalid_syntax_lisp (Fmake_string (make_fixnum (1), make_fixnum (c), Qnil),
-                      readcharfun);
-}
-
 /* Grow a read buffer BUF that contains OFFSET useful bytes of data,
    by at least MAX_MULTIBYTE_LENGTH bytes.  Update *BUF_ADDR and
    *BUF_SIZE accordingly; 0 <= OFFSET <= *BUF_SIZE.  If *BUF_ADDR is
@@ -2658,7 +2633,7 @@ enum { UNICODE_CHARACTER_NAME_LENGTH_BOUND = 200 };
    If the escape sequence forces unibyte, return eight-bit char.  */
 
 static int
-read_escape (Lisp_Object readcharfun, bool stringp)
+read_escape (Lisp_Object readcharfun)
 {
   int c = READCHAR;
   /* \u allows up to four hex digits, \U up to eight.  Default to the
@@ -2688,12 +2663,10 @@ read_escape (Lisp_Object readcharfun, bool stringp)
       return '\t';
     case 'v':
       return '\v';
+
     case '\n':
-      return -1;
-    case ' ':
-      if (stringp)
-       return -1;
-      return ' ';
+      /* ?\LF is an error; it's probably a user mistake.  */
+      error ("Invalid escape character syntax");
 
     case 'M':
       c = READCHAR;
@@ -2701,7 +2674,7 @@ read_escape (Lisp_Object readcharfun, bool stringp)
        error ("Invalid escape character syntax");
       c = READCHAR;
       if (c == '\\')
-       c = read_escape (readcharfun, 0);
+       c = read_escape (readcharfun);
       return c | meta_modifier;
 
     case 'S':
@@ -2710,7 +2683,7 @@ read_escape (Lisp_Object readcharfun, bool stringp)
        error ("Invalid escape character syntax");
       c = READCHAR;
       if (c == '\\')
-       c = read_escape (readcharfun, 0);
+       c = read_escape (readcharfun);
       return c | shift_modifier;
 
     case 'H':
@@ -2719,7 +2692,7 @@ read_escape (Lisp_Object readcharfun, bool stringp)
        error ("Invalid escape character syntax");
       c = READCHAR;
       if (c == '\\')
-       c = read_escape (readcharfun, 0);
+       c = read_escape (readcharfun);
       return c | hyper_modifier;
 
     case 'A':
@@ -2728,19 +2701,19 @@ read_escape (Lisp_Object readcharfun, bool stringp)
        error ("Invalid escape character syntax");
       c = READCHAR;
       if (c == '\\')
-       c = read_escape (readcharfun, 0);
+       c = read_escape (readcharfun);
       return c | alt_modifier;
 
     case 's':
       c = READCHAR;
-      if (stringp || c != '-')
+      if (c != '-')
        {
          UNREAD (c);
          return ' ';
        }
       c = READCHAR;
       if (c == '\\')
-       c = read_escape (readcharfun, 0);
+       c = read_escape (readcharfun);
       return c | super_modifier;
 
     case 'C':
@@ -2751,7 +2724,7 @@ read_escape (Lisp_Object readcharfun, bool stringp)
     case '^':
       c = READCHAR;
       if (c == '\\')
-       c = read_escape (readcharfun, 0);
+       c = read_escape (readcharfun);
       if ((c & ~CHAR_MODIFIER_MASK) == '?')
        return 0177 | (c & CHAR_MODIFIER_MASK);
       else if (! ASCII_CHAR_P ((c & ~CHAR_MODIFIER_MASK)))
@@ -2902,8 +2875,8 @@ read_escape (Lisp_Object readcharfun, bool stringp)
           invalid_syntax ("Empty character name", readcharfun);
        name[length] = '\0';
 
-       /* character_name_to_code can invoke read1, recursively.
-          This is why read1's buffer is not static.  */
+       /* character_name_to_code can invoke read0, recursively.
+          This is why read0's buffer is not static.  */
        return character_name_to_code (name, length, readcharfun);
       }
 
@@ -2932,20 +2905,17 @@ digit_to_number (int character, int base)
   return digit < base ? digit : -1;
 }
 
-static char const invalid_radix_integer_format[] = "integer, radix %"pI"d";
-
-/* Small, as read1 is recursive (Bug#31995).  But big enough to hold
-   the invalid_radix_integer string.  */
-enum { stackbufsize = max (64,
-                          (sizeof invalid_radix_integer_format
-                           - sizeof "%"pI"d"
-                           + INT_STRLEN_BOUND (EMACS_INT) + 1)) };
+/* Size of the fixed-size buffer used during reading.
+   It should be at least big enough for `invalid_radix_integer' but
+   can usefully be much bigger than that.  */
+enum { stackbufsize = 1024 };
 
 static void
 invalid_radix_integer (EMACS_INT radix, char stackbuf[VLA_ELEMS 
(stackbufsize)],
                       Lisp_Object readcharfun)
 {
-  sprintf (stackbuf, invalid_radix_integer_format, radix);
+  int n = snprintf (stackbuf, stackbufsize, "integer, radix %"pI"d", radix);
+  eassert (n < stackbufsize);
   invalid_syntax (stackbuf, readcharfun);
 }
 
@@ -3011,780 +2981,1110 @@ read_integer (Lisp_Object readcharfun, int radix,
   *p = '\0';
   return unbind_to (count, string_to_number (read_buffer, radix, NULL));
 }
+
 
-/* If the next token is ')' or ']' or '.', we store that character
-   in *PCH and the return value is not interesting.  Else, we store
-   zero in *PCH and we read and return one lisp object.
-
-   FIRST_IN_LIST is true if this is the first element of a list.
-   LOCATE_SYMS true means read symbol occurrences as symbols with
-   position.  */
-
+/* Read a character literal (preceded by `?').  */
 static Lisp_Object
-read1 (Lisp_Object readcharfun, int *pch, bool first_in_list, bool locate_syms)
+read_char_literal (Lisp_Object readcharfun)
 {
-  int c;
-  bool uninterned_symbol = false;
-  bool skip_shorthand = false;
-  bool multibyte;
-  char stackbuf[stackbufsize];
-  current_thread->stack_top = stackbuf;
+  int ch = READCHAR;
+  if (ch < 0)
+    end_of_file_error ();
 
-  *pch = 0;
+  /* Accept `single space' syntax like (list ? x) where the
+     whitespace character is SPC or TAB.
+     Other literal whitespace like NL, CR, and FF are not accepted,
+     as there are well-established escape sequences for these.  */
+  if (ch == ' ' || ch == '\t')
+    return make_fixnum (ch);
 
- retry:
+  if (   ch == '(' || ch == ')' || ch == '[' || ch == ']'
+      || ch == '"' || ch == ';')
+    {
+      CHECK_LIST (Vlread_unescaped_character_literals);
+      Lisp_Object char_obj = make_fixed_natnum (ch);
+      if (NILP (Fmemq (char_obj, Vlread_unescaped_character_literals)))
+       Vlread_unescaped_character_literals =
+         Fcons (char_obj, Vlread_unescaped_character_literals);
+    }
 
-  c = READCHAR_REPORT_MULTIBYTE (&multibyte);
-  if (c < 0)
-    end_of_file_error ();
+  if (ch == '\\')
+    ch = read_escape (readcharfun);
 
-  switch (c)
-    {
-    case '(':
-      return read_list (0, readcharfun, locate_syms);
+  int modifiers = ch & CHAR_MODIFIER_MASK;
+  ch &= ~CHAR_MODIFIER_MASK;
+  if (CHAR_BYTE8_P (ch))
+    ch = CHAR_TO_BYTE8 (ch);
+  ch |= modifiers;
 
-    case '[':
-      return read_vector (readcharfun, 0, locate_syms);
+  int nch = READCHAR;
+  UNREAD (nch);
+  if (nch <= 32
+      || nch == '"' || nch == '\'' || nch == ';' || nch == '('
+      || nch == ')' || nch == '['  || nch == ']' || nch == '#'
+      || nch == '?' || nch == '`'  || nch == ',' || nch == '.')
+    return make_fixnum (ch);
 
-    case ')':
-    case ']':
-      {
-       *pch = c;
-       return Qnil;
-      }
+  invalid_syntax ("?", readcharfun);
+}
 
-    case '#':
-      c = READCHAR;
-      if (c == 's')
+/* Read a string literal (preceded by '"').  */
+static Lisp_Object
+read_string_literal (char stackbuf[VLA_ELEMS (stackbufsize)],
+                    Lisp_Object readcharfun)
+{
+  char *read_buffer = stackbuf;
+  ptrdiff_t read_buffer_size = stackbufsize;
+  specpdl_ref count = SPECPDL_INDEX ();
+  char *heapbuf = NULL;
+  char *p = read_buffer;
+  char *end = read_buffer + read_buffer_size;
+  /* True if we saw an escape sequence specifying
+     a multibyte character.  */
+  bool force_multibyte = false;
+  /* True if we saw an escape sequence specifying
+     a single-byte character.  */
+  bool force_singlebyte = false;
+  bool cancel = false;
+  ptrdiff_t nchars = 0;
+
+  int ch;
+  while ((ch = READCHAR) >= 0 && ch != '\"')
+    {
+      if (end - p < MAX_MULTIBYTE_LENGTH)
        {
-         c = READCHAR;
-         if (c == '(')
+         ptrdiff_t offset = p - read_buffer;
+         read_buffer = grow_read_buffer (read_buffer, offset,
+                                         &heapbuf, &read_buffer_size,
+                                         count);
+         p = read_buffer + offset;
+         end = read_buffer + read_buffer_size;
+       }
+
+      if (ch == '\\')
+       {
+         /* First apply string-specific escape rules:  */
+         ch = READCHAR;
+         switch (ch)
            {
-             /* Accept extended format for hash tables (extensible to
-                other types), e.g.
-                #s(hash-table size 2 test equal data (k1 v1 k2 v2))  */
-             Lisp_Object tmp = read_list (0, readcharfun, false);
-             Lisp_Object head = CAR_SAFE (tmp);
-             Lisp_Object data = Qnil;
-             Lisp_Object val = Qnil;
-             /* The size is 2 * number of allowed keywords to
-                make-hash-table.  */
-             Lisp_Object params[12];
-             Lisp_Object ht;
-             Lisp_Object key = Qnil;
-             int param_count = 0;
-
-             if (!EQ (head, Qhash_table))
+           case 's':
+             /* `\s' is always a space in strings.  */
+             ch = ' ';
+             break;
+           case ' ':
+           case '\n':
+             /* `\SPC' and `\LF' generate no characters at all.  */
+             if (p == read_buffer)
+               cancel = true;
+             continue;
+           default:
+             UNREAD (ch);
+             ch = read_escape (readcharfun);
+             break;
+           }
+
+         int modifiers = ch & CHAR_MODIFIER_MASK;
+         ch &= ~CHAR_MODIFIER_MASK;
+
+         if (CHAR_BYTE8_P (ch))
+           force_singlebyte = true;
+         else if (! ASCII_CHAR_P (ch))
+           force_multibyte = true;
+         else          /* I.e. ASCII_CHAR_P (ch).  */
+           {
+             /* Allow `\C-SPC' and `\^SPC'.  This is done here because
+                the literals ?\C-SPC and ?\^SPC (rather inconsistently)
+                yield (' ' | CHAR_CTL); see bug#55738.  */
+             if (modifiers == CHAR_CTL && ch == ' ')
+               {
+                 ch = 0;
+                 modifiers = 0;
+               }
+             if (modifiers & CHAR_SHIFT)
                {
-                 ptrdiff_t size = XFIXNUM (Flength (tmp));
-                 Lisp_Object record = Fmake_record (CAR_SAFE (tmp),
-                                                    make_fixnum (size - 1),
-                                                    Qnil);
-                 for (int i = 1; i < size; i++)
+                 /* Shift modifier is valid only with [A-Za-z].  */
+                 if (ch >= 'A' && ch <= 'Z')
+                   modifiers &= ~CHAR_SHIFT;
+                 else if (ch >= 'a' && ch <= 'z')
                    {
-                     tmp = Fcdr (tmp);
-                     ASET (record, i, Fcar (tmp));
+                     ch -= ('a' - 'A');
+                     modifiers &= ~CHAR_SHIFT;
                    }
-                 return record;
                }
 
-             tmp = CDR_SAFE (tmp);
+             if (modifiers & CHAR_META)
+               {
+                 /* Move the meta bit to the right place for a
+                    string.  */
+                 modifiers &= ~CHAR_META;
+                 ch = BYTE8_TO_CHAR (ch | 0x80);
+                 force_singlebyte = true;
+               }
+           }
+
+         /* Any modifiers remaining are invalid.  */
+         if (modifiers)
+           invalid_syntax ("Invalid modifier in string", readcharfun);
+         p += CHAR_STRING (ch, (unsigned char *) p);
+       }
+      else
+       {
+         p += CHAR_STRING (ch, (unsigned char *) p);
+         if (CHAR_BYTE8_P (ch))
+           force_singlebyte = true;
+         else if (! ASCII_CHAR_P (ch))
+           force_multibyte = true;
+       }
+      nchars++;
+    }
+
+  if (ch < 0)
+    end_of_file_error ();
+
+  /* If purifying, and string starts with \ newline,
+     return zero instead.  This is for doc strings
+     that we are really going to find in etc/DOC.nn.nn.  */
+  if (!NILP (Vpurify_flag) && NILP (Vdoc_file_name) && cancel)
+    {
+      unbind_to (count, Qnil);
+      return make_fixnum (0);
+    }
 
-             /* This is repetitive but fast and simple.  */
-             params[param_count] = QCsize;
-             params[param_count + 1] = Fplist_get (tmp, Qsize);
-             if (!NILP (params[param_count + 1]))
-               param_count += 2;
+  if (!force_multibyte && force_singlebyte)
+    {
+      /* READ_BUFFER contains raw 8-bit bytes and no multibyte
+        forms.  Convert it to unibyte.  */
+      nchars = str_as_unibyte ((unsigned char *) read_buffer,
+                              p - read_buffer);
+      p = read_buffer + nchars;
+    }
 
-             params[param_count] = QCtest;
-             params[param_count + 1] = Fplist_get (tmp, Qtest);
-             if (!NILP (params[param_count + 1]))
-               param_count += 2;
+  Lisp_Object obj = make_specified_string (read_buffer, nchars, p - 
read_buffer,
+                                          (force_multibyte
+                                           || (p - read_buffer != nchars)));
+  return unbind_to (count, obj);
+}
 
-             params[param_count] = QCweakness;
-             params[param_count + 1] = Fplist_get (tmp, Qweakness);
-             if (!NILP (params[param_count + 1]))
-               param_count += 2;
+/* Make a hash table from the constructor plist.  */
+static Lisp_Object
+hash_table_from_plist (Lisp_Object plist)
+{
+  Lisp_Object params[12];
+  Lisp_Object *par = params;
+
+  /* This is repetitive but fast and simple.  */
+#define ADDPARAM(name)                                 \
+  do {                                                 \
+    Lisp_Object val = Fplist_get (plist, Q ## name);   \
+    if (!NILP (val))                                   \
+      {                                                        \
+       *par++ = QC ## name;                            \
+       *par++ = val;                                   \
+      }                                                        \
+  } while (0)
+
+  ADDPARAM (size);
+  ADDPARAM (test);
+  ADDPARAM (weakness);
+  ADDPARAM (rehash_size);
+  ADDPARAM (rehash_threshold);
+  ADDPARAM (purecopy);
+
+  Lisp_Object data = Fplist_get (plist, Qdata);
+
+  /* Now use params to make a new hash table and fill it.  */
+  Lisp_Object ht = Fmake_hash_table (par - params, params);
+
+  Lisp_Object last = data;
+  FOR_EACH_TAIL_SAFE (data)
+    {
+      Lisp_Object key = XCAR (data);
+      data = XCDR (data);
+      if (!CONSP (data))
+       break;
+      Lisp_Object val = XCAR (data);
+      last = XCDR (data);
+      Fputhash (key, val, ht);
+    }
+  if (!NILP (last))
+    error ("Hash table data is not a list of even length");
 
-             params[param_count] = QCrehash_size;
-             params[param_count + 1] = Fplist_get (tmp, Qrehash_size);
-             if (!NILP (params[param_count + 1]))
-               param_count += 2;
+  return ht;
+}
 
-             params[param_count] = QCrehash_threshold;
-             params[param_count + 1] = Fplist_get (tmp, Qrehash_threshold);
-             if (!NILP (params[param_count + 1]))
-               param_count += 2;
+static Lisp_Object
+record_from_list (Lisp_Object elems)
+{
+  ptrdiff_t size = list_length (elems);
+  Lisp_Object obj = Fmake_record (XCAR (elems),
+                                 make_fixnum (size - 1),
+                                 Qnil);
+  Lisp_Object tl = XCDR (elems);
+  for (int i = 1; i < size; i++)
+    {
+      ASET (obj, i, XCAR (tl));
+      tl = XCDR (tl);
+    }
+  return obj;
+}
 
-              params[param_count] = QCpurecopy;
-              params[param_count + 1] = Fplist_get (tmp, Qpurecopy);
-              if (!NILP (params[param_count + 1]))
-                param_count += 2;
+/* Turn a reversed list into a vector.  */
+static Lisp_Object
+vector_from_rev_list (Lisp_Object elems)
+{
+  ptrdiff_t size = list_length (elems);
+  Lisp_Object obj = make_nil_vector (size);
+  Lisp_Object *vec = XVECTOR (obj)->contents;
+  for (ptrdiff_t i = size - 1; i >= 0; i--)
+    {
+      vec[i] = XCAR (elems);
+      Lisp_Object next = XCDR (elems);
+      free_cons (XCONS (elems));
+      elems = next;
+    }
+  return obj;
+}
 
-             /* This is the hash table data.  */
-             data = Fplist_get (tmp, Qdata);
+static Lisp_Object
+bytecode_from_rev_list (Lisp_Object elems, Lisp_Object readcharfun)
+{
+  Lisp_Object obj = vector_from_rev_list (elems);
+  Lisp_Object *vec = XVECTOR (obj)->contents;
+  ptrdiff_t size = ASIZE (obj);
+
+  if (!(size >= COMPILED_STACK_DEPTH + 1 && size <= COMPILED_INTERACTIVE + 1
+       && (FIXNUMP (vec[COMPILED_ARGLIST])
+           || CONSP (vec[COMPILED_ARGLIST])
+           || NILP (vec[COMPILED_ARGLIST]))
+       && FIXNATP (vec[COMPILED_STACK_DEPTH])))
+    invalid_syntax ("Invalid byte-code object", readcharfun);
+
+  if (load_force_doc_strings
+      && NILP (vec[COMPILED_CONSTANTS])
+      && STRINGP (vec[COMPILED_BYTECODE]))
+    {
+      /* Lazily-loaded bytecode is represented by the constant slot being nil
+        and the bytecode slot a (lazily loaded) string containing the
+        print representation of (BYTECODE . CONSTANTS).  Unpack the
+        pieces by coerceing the string to unibyte and reading the result.  */
+      Lisp_Object enc = vec[COMPILED_BYTECODE];
+      Lisp_Object pair = Fread (Fcons (enc, readcharfun));
+      if (!CONSP (pair))
+       invalid_syntax ("Invalid byte-code object", readcharfun);
 
-             /* Now use params to make a new hash table and fill it.  */
-             ht = Fmake_hash_table (param_count, params);
+      vec[COMPILED_BYTECODE] = XCAR (pair);
+      vec[COMPILED_CONSTANTS] = XCDR (pair);
+    }
 
-             Lisp_Object last = data;
-             FOR_EACH_TAIL_SAFE (data)
-               {
-                 key = XCAR (data);
-                 data = XCDR (data);
-                 if (!CONSP (data))
-                   break;
-                 val = XCAR (data);
-                 last = XCDR (data);
-                 Fputhash (key, val, ht);
-               }
-             if (!NILP (last))
-               error ("Hash table data is not a list of even length");
+  if (!((STRINGP (vec[COMPILED_BYTECODE])
+        && VECTORP (vec[COMPILED_CONSTANTS]))
+       || CONSP (vec[COMPILED_BYTECODE])))
+    invalid_syntax ("Invalid byte-code object", readcharfun);
 
-             return ht;
-           }
-         UNREAD (c);
-         invalid_syntax ("#", readcharfun);
-       }
-      if (c == '^')
-       {
-         c = READCHAR;
-         if (c == '[')
-           {
-             Lisp_Object tmp;
-             tmp = read_vector (readcharfun, 0, false);
-             if (ASIZE (tmp) < CHAR_TABLE_STANDARD_SLOTS)
-               error ("Invalid size char-table");
-             XSETPVECTYPE (XVECTOR (tmp), PVEC_CHAR_TABLE);
-             return tmp;
-           }
-         else if (c == '^')
-           {
-             c = READCHAR;
-             if (c == '[')
-               {
-                 /* Sub char-table can't be read as a regular
-                    vector because of a two C integer fields.  */
-                 Lisp_Object tbl, tmp = read_list (1, readcharfun, false);
-                 ptrdiff_t size = list_length (tmp);
-                 int i, depth, min_char;
-                 struct Lisp_Cons *cell;
-
-                 if (size == 0)
-                   error ("Zero-sized sub char-table");
-
-                 if (! RANGED_FIXNUMP (1, XCAR (tmp), 3))
-                   error ("Invalid depth in sub char-table");
-                 depth = XFIXNUM (XCAR (tmp));
-                 if (chartab_size[depth] != size - 2)
-                   error ("Invalid size in sub char-table");
-                 cell = XCONS (tmp), tmp = XCDR (tmp), size--;
-                 free_cons (cell);
-
-                 if (! RANGED_FIXNUMP (0, XCAR (tmp), MAX_CHAR))
-                   error ("Invalid minimum character in sub-char-table");
-                 min_char = XFIXNUM (XCAR (tmp));
-                 cell = XCONS (tmp), tmp = XCDR (tmp), size--;
-                 free_cons (cell);
-
-                 tbl = make_uninit_sub_char_table (depth, min_char);
-                 for (i = 0; i < size; i++)
-                   {
-                     XSUB_CHAR_TABLE (tbl)->contents[i] = XCAR (tmp);
-                     cell = XCONS (tmp), tmp = XCDR (tmp);
-                     free_cons (cell);
-                   }
-                 return tbl;
-               }
-             invalid_syntax ("#^^", readcharfun);
-           }
-         invalid_syntax ("#^", readcharfun);
-       }
-      if (c == '&')
+  if (STRINGP (vec[COMPILED_BYTECODE]))
+    {
+      if (STRING_MULTIBYTE (vec[COMPILED_BYTECODE]))
        {
-         Lisp_Object length;
-         length = read1 (readcharfun, pch, first_in_list, false);
-         c = READCHAR;
-         if (c == '"')
-           {
-             Lisp_Object tmp, val;
-             EMACS_INT size_in_chars = bool_vector_bytes (XFIXNAT (length));
-             unsigned char *data;
-
-             UNREAD (c);
-             tmp = read1 (readcharfun, pch, first_in_list, false);
-             if (STRING_MULTIBYTE (tmp)
-                 || (size_in_chars != SCHARS (tmp)
-                     /* We used to print 1 char too many
-                        when the number of bits was a multiple of 8.
-                        Accept such input in case it came from an old
-                        version.  */
-                     && ! (XFIXNAT (length)
-                           == (SCHARS (tmp) - 1) * BOOL_VECTOR_BITS_PER_CHAR)))
-               invalid_syntax ("#&...", readcharfun);
-
-             val = make_uninit_bool_vector (XFIXNAT (length));
-             data = bool_vector_uchar_data (val);
-             memcpy (data, SDATA (tmp), size_in_chars);
-             /* Clear the extraneous bits in the last byte.  */
-             if (XFIXNUM (length) != size_in_chars * BOOL_VECTOR_BITS_PER_CHAR)
-               data[size_in_chars - 1]
-                 &= (1 << (XFIXNUM (length) % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
-             return val;
-           }
-         invalid_syntax ("#&...", readcharfun);
+         /* BYTESTR must have been produced by Emacs 20.2 or earlier
+            because it produced a raw 8-bit string for byte-code and
+            now such a byte-code string is loaded as multibyte with
+            raw 8-bit characters converted to multibyte form.
+            Convert them back to the original unibyte form.  */
+         vec[COMPILED_BYTECODE] = Fstring_as_unibyte (vec[COMPILED_BYTECODE]);
        }
-      if (c == '[')
-       {
-         /* Accept compiled functions at read-time so that we don't have to
-            build them using function calls.  */
-         Lisp_Object tmp;
-         struct Lisp_Vector *vec;
-         tmp = read_vector (readcharfun, 1, false);
-         vec = XVECTOR (tmp);
-         if (! (COMPILED_STACK_DEPTH < ASIZE (tmp)
-                && (FIXNUMP (AREF (tmp, COMPILED_ARGLIST))
-                    || CONSP (AREF (tmp, COMPILED_ARGLIST))
-                    || NILP (AREF (tmp, COMPILED_ARGLIST)))
-                && ((STRINGP (AREF (tmp, COMPILED_BYTECODE))
-                     && VECTORP (AREF (tmp, COMPILED_CONSTANTS)))
-                    || CONSP (AREF (tmp, COMPILED_BYTECODE)))
-                && FIXNATP (AREF (tmp, COMPILED_STACK_DEPTH))))
-           invalid_syntax ("Invalid byte-code object", readcharfun);
-
-         if (STRINGP (AREF (tmp, COMPILED_BYTECODE)))
-           {
-             if (STRING_MULTIBYTE (AREF (tmp, COMPILED_BYTECODE)))
-               {
-                 /* BYTESTR must have been produced by Emacs 20.2 or earlier
-                    because it produced a raw 8-bit string for byte-code and
-                    now such a byte-code string is loaded as multibyte with
-                    raw 8-bit characters converted to multibyte form.
-                    Convert them back to the original unibyte form.  */
-                 ASET (tmp, COMPILED_BYTECODE,
-                       Fstring_as_unibyte (AREF (tmp, COMPILED_BYTECODE)));
-               }
-             // Bytecode must be immovable.
-             pin_string (AREF (tmp, COMPILED_BYTECODE));
-           }
+      // Bytecode must be immovable.
+      pin_string (vec[COMPILED_BYTECODE]);
+    }
 
-         XSETPVECTYPE (vec, PVEC_COMPILED);
-         return tmp;
-       }
-      if (c == '(')
-       {
-         Lisp_Object tmp;
-         int ch;
-
-         /* Read the string itself.  */
-         tmp = read1 (readcharfun, &ch, 0, false);
-         if (ch != 0 || !STRINGP (tmp))
-           invalid_syntax ("#", readcharfun);
-         /* Read the intervals and their properties.  */
-         while (1)
-           {
-             Lisp_Object beg, end, plist;
+  XSETPVECTYPE (XVECTOR (obj), PVEC_COMPILED);
+  return obj;
+}
 
-             beg = read1 (readcharfun, &ch, 0, false);
-             end = plist = Qnil;
-             if (ch == ')')
-               break;
-             if (ch == 0)
-               end = read1 (readcharfun, &ch, 0, false);
-             if (ch == 0)
-               plist = read1 (readcharfun, &ch, 0, false);
-             if (ch)
-               invalid_syntax ("Invalid string property list", readcharfun);
-             Fset_text_properties (beg, end, plist, tmp);
-           }
+static Lisp_Object
+char_table_from_rev_list (Lisp_Object elems, Lisp_Object readcharfun)
+{
+  Lisp_Object obj = vector_from_rev_list (elems);
+  if (ASIZE (obj) < CHAR_TABLE_STANDARD_SLOTS)
+    invalid_syntax ("Invalid size char-table", readcharfun);
+  XSETPVECTYPE (XVECTOR (obj), PVEC_CHAR_TABLE);
+  return obj;
 
-         return tmp;
-       }
+}
+
+static Lisp_Object
+sub_char_table_from_rev_list (Lisp_Object elems, Lisp_Object readcharfun)
+{
+  /* A sub-char-table can't be read as a regular vector because of two
+     C integer fields.  */
+  elems = Fnreverse (elems);
+  ptrdiff_t size = list_length (elems);
+  if (size < 2)
+    error ("Invalid size of sub-char-table");
+
+  if (!RANGED_FIXNUMP (1, XCAR (elems), 3))
+    error ("Invalid depth in sub-char-table");
+  int depth = XFIXNUM (XCAR (elems));
+
+  if (chartab_size[depth] != size - 2)
+    error ("Invalid size in sub-char-table");
+  elems = XCDR (elems);
+
+  if (!RANGED_FIXNUMP (0, XCAR (elems), MAX_CHAR))
+    error ("Invalid minimum character in sub-char-table");
+  int min_char = XFIXNUM (XCAR (elems));
+  elems = XCDR (elems);
+
+  Lisp_Object tbl = make_uninit_sub_char_table (depth, min_char);
+  for (int i = 0; i < size - 2; i++)
+    {
+      XSUB_CHAR_TABLE (tbl)->contents[i] = XCAR (elems);
+      elems = XCDR (elems);
+    }
+  return tbl;
+}
+
+static Lisp_Object
+string_props_from_rev_list (Lisp_Object elems, Lisp_Object readcharfun)
+{
+  elems = Fnreverse (elems);
+  if (NILP (elems) || !STRINGP (XCAR (elems)))
+    invalid_syntax ("#", readcharfun);
+  Lisp_Object obj = XCAR (elems);
+  for (Lisp_Object tl = XCDR (elems); !NILP (tl);)
+    {
+      Lisp_Object beg = XCAR (tl);
+      tl = XCDR (tl);
+      if (NILP (tl))
+       invalid_syntax ("Invalid string property list", readcharfun);
+      Lisp_Object end = XCAR (tl);
+      tl = XCDR (tl);
+      if (NILP (tl))
+       invalid_syntax ("Invalid string property list", readcharfun);
+      Lisp_Object plist = XCAR (tl);
+      tl = XCDR (tl);
+      Fset_text_properties (beg, end, plist, obj);
+    }
+  return obj;
+}
 
-      /* #@NUMBER is used to skip NUMBER following bytes.
-        That's used in .elc files to skip over doc strings
-        and function definitions.  */
-      if (c == '@')
+/* Read a bool vector (preceded by "#&").  */
+static Lisp_Object
+read_bool_vector (char stackbuf[VLA_ELEMS (stackbufsize)],
+                 Lisp_Object readcharfun)
+{
+  ptrdiff_t length = 0;
+  for (;;)
+    {
+      int c = READCHAR;
+      if (c < '0' || c > '9')
        {
-         enum { extra = 100 };
-         ptrdiff_t i, nskip = 0, digits = 0;
+         if (c != '"')
+           invalid_syntax ("#&", readcharfun);
+         break;
+       }
+      if (INT_MULTIPLY_WRAPV (length, 10, &length)
+         | INT_ADD_WRAPV (length, c - '0', &length))
+       invalid_syntax ("#&", readcharfun);
+    }
 
-         /* Read a decimal integer.  */
-         while ((c = READCHAR) >= 0
-                && c >= '0' && c <= '9')
-           {
-             if ((STRING_BYTES_BOUND - extra) / 10 <= nskip)
-               string_overflow ();
-             digits++;
-             nskip *= 10;
-             nskip += c - '0';
-             if (digits == 2 && nskip == 0)
-               { /* We've just seen #@00, which means "skip to end".  */
-                 skip_dyn_eof (readcharfun);
-                 return Qnil;
-               }
-           }
+  ptrdiff_t size_in_chars = bool_vector_bytes (length);
+  Lisp_Object str = read_string_literal (stackbuf, readcharfun);
+  if (STRING_MULTIBYTE (str)
+      || !(size_in_chars == SCHARS (str)
+          /* We used to print 1 char too many when the number of bits
+             was a multiple of 8.  Accept such input in case it came
+             from an old version.  */
+          || length == (SCHARS (str) - 1) * BOOL_VECTOR_BITS_PER_CHAR))
+    invalid_syntax ("#&...", readcharfun);
+
+  Lisp_Object obj = make_uninit_bool_vector (length);
+  unsigned char *data = bool_vector_uchar_data (obj);
+  memcpy (data, SDATA (str), size_in_chars);
+  /* Clear the extraneous bits in the last byte.  */
+  if (length != size_in_chars * BOOL_VECTOR_BITS_PER_CHAR)
+    data[size_in_chars - 1] &= (1 << (length % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
+  return obj;
+}
+
+/* Skip (and optionally remember) a lazily-loaded string
+   preceded by "#@".  */
+static void
+skip_lazy_string (Lisp_Object readcharfun)
+{
+  ptrdiff_t nskip = 0;
+  ptrdiff_t digits = 0;
+  for (;;)
+    {
+      int c = READCHAR;
+      if (c < '0' || c > '9')
+       {
          if (nskip > 0)
            /* We can't use UNREAD here, because in the code below we side-step
-               READCHAR.  Instead, assume the first char after #@NNN occupies
-               a single byte, which is the case normally since it's just
-               a space.  */
+              READCHAR.  Instead, assume the first char after #@NNN occupies
+              a single byte, which is the case normally since it's just
+              a space.  */
            nskip--;
          else
            UNREAD (c);
-
-         if (load_force_doc_strings
-             && (FROM_FILE_P (readcharfun)))
-           {
-             /* If we are supposed to force doc strings into core right now,
-                record the last string that we skipped,
-                and record where in the file it comes from.  */
-
-             /* But first exchange saved_doc_string
-                with prev_saved_doc_string, so we save two strings.  */
-             {
-               char *temp = saved_doc_string;
-               ptrdiff_t temp_size = saved_doc_string_size;
-               file_offset temp_pos = saved_doc_string_position;
-               ptrdiff_t temp_len = saved_doc_string_length;
-
-               saved_doc_string = prev_saved_doc_string;
-               saved_doc_string_size = prev_saved_doc_string_size;
-               saved_doc_string_position = prev_saved_doc_string_position;
-               saved_doc_string_length = prev_saved_doc_string_length;
-
-               prev_saved_doc_string = temp;
-               prev_saved_doc_string_size = temp_size;
-               prev_saved_doc_string_position = temp_pos;
-               prev_saved_doc_string_length = temp_len;
-             }
-
-             if (saved_doc_string_size == 0)
-               {
-                 saved_doc_string = xmalloc (nskip + extra);
-                 saved_doc_string_size = nskip + extra;
-               }
-             if (nskip > saved_doc_string_size)
-               {
-                 saved_doc_string = xrealloc (saved_doc_string, nskip + extra);
-                 saved_doc_string_size = nskip + extra;
-               }
-
-             FILE *instream = infile->stream;
-             saved_doc_string_position = (file_tell (instream)
-                                          - infile->lookahead);
-
-             /* Copy that many bytes into saved_doc_string.  */
-             i = 0;
-             for (int n = min (nskip, infile->lookahead); 0 < n; n--)
-               saved_doc_string[i++]
-                 = c = infile->buf[--infile->lookahead];
-             block_input ();
-             for (; i < nskip && 0 <= c; i++)
-               saved_doc_string[i] = c = getc (instream);
-             unblock_input ();
-
-             saved_doc_string_length = i;
-           }
-         else
-           /* Skip that many bytes.  */
-           skip_dyn_bytes (readcharfun, nskip);
-
-         goto retry;
+         break;
        }
-      if (c == '!')
+      if (INT_MULTIPLY_WRAPV (nskip, 10, &nskip)
+         | INT_ADD_WRAPV (nskip, c - '0', &nskip))
+       invalid_syntax ("#@", readcharfun);
+      digits++;
+      if (digits == 2 && nskip == 0)
        {
-         /* #! appears at the beginning of an executable file.
-            Skip the first line.  */
-         while (c != '\n' && c >= 0)
-           c = READCHAR;
-         goto retry;
+         /* #@00 means "skip to end" */
+         skip_dyn_eof (readcharfun);
+         return;
        }
-      if (c == '$')
-       return Vload_file_name;
-      if (c == '\'')
-       return list2 (Qfunction, read0 (readcharfun, locate_syms));
-      /* #:foo is the uninterned symbol named foo.  */
-      if (c == ':')
+    }
+
+  if (load_force_doc_strings && FROM_FILE_P (readcharfun))
+    {
+      /* If we are supposed to force doc strings into core right now,
+        record the last string that we skipped,
+        and record where in the file it comes from.  */
+
+      /* But first exchange saved_doc_string
+        with prev_saved_doc_string, so we save two strings.  */
+      {
+       char *temp = saved_doc_string;
+       ptrdiff_t temp_size = saved_doc_string_size;
+       file_offset temp_pos = saved_doc_string_position;
+       ptrdiff_t temp_len = saved_doc_string_length;
+
+       saved_doc_string = prev_saved_doc_string;
+       saved_doc_string_size = prev_saved_doc_string_size;
+       saved_doc_string_position = prev_saved_doc_string_position;
+       saved_doc_string_length = prev_saved_doc_string_length;
+
+       prev_saved_doc_string = temp;
+       prev_saved_doc_string_size = temp_size;
+       prev_saved_doc_string_position = temp_pos;
+       prev_saved_doc_string_length = temp_len;
+      }
+
+      enum { extra = 100 };
+      if (saved_doc_string_size == 0)
        {
-         uninterned_symbol = true;
-       read_hash_prefixed_symbol:
-         c = READCHAR;
-         if (!(c > 040
-               && c != NO_BREAK_SPACE
-               && (c >= 0200
-                   || strchr ("\"';()[]#`,", c) == NULL)))
-           {
-             /* No symbol character follows, this is the empty
-                symbol.  */
-             UNREAD (c);
-             return Fmake_symbol (empty_unibyte_string);
-           }
-         goto read_symbol;
+         saved_doc_string = xmalloc (nskip + extra);
+         saved_doc_string_size = nskip + extra;
        }
-      /* #_foo is really the symbol foo, regardless of shorthands  */
-      if (c == '_')
+      if (nskip > saved_doc_string_size)
        {
-         skip_shorthand = true;
-         goto read_hash_prefixed_symbol;
+         saved_doc_string = xrealloc (saved_doc_string, nskip + extra);
+         saved_doc_string_size = nskip + extra;
        }
-      /* ## is the empty symbol.  */
-      if (c == '#')
-       return Fintern (empty_unibyte_string, Qnil);
 
-      if (c >= '0' && c <= '9')
-       {
-         EMACS_INT n = c - '0';
-         bool overflow = false;
+      FILE *instream = infile->stream;
+      saved_doc_string_position = (file_tell (instream) - infile->lookahead);
 
-         /* Read a non-negative integer.  */
-         while ('0' <= (c = READCHAR) && c <= '9')
-           {
-             overflow |= INT_MULTIPLY_WRAPV (n, 10, &n);
-             overflow |= INT_ADD_WRAPV (n, c - '0', &n);
-           }
+      /* Copy that many bytes into saved_doc_string.  */
+      ptrdiff_t i = 0;
+      int c = 0;
+      for (int n = min (nskip, infile->lookahead); n > 0; n--)
+       saved_doc_string[i++] = c = infile->buf[--infile->lookahead];
+      block_input ();
+      for (; i < nskip && c >= 0; i++)
+       saved_doc_string[i] = c = getc (instream);
+      unblock_input ();
 
-         if (!overflow)
-           {
-             if (c == 'r' || c == 'R')
-               {
-                 if (! (2 <= n && n <= 36))
-                   invalid_radix_integer (n, stackbuf, readcharfun);
-                 return read_integer (readcharfun, n, stackbuf);
-               }
+      saved_doc_string_length = i;
+    }
+  else
+    /* Skip that many bytes.  */
+    skip_dyn_bytes (readcharfun, nskip);
+}
 
-             if (n <= MOST_POSITIVE_FIXNUM && ! NILP (Vread_circle))
-               {
-                 /* Reader forms that can reuse previously read objects.  */
 
-                 /* #n=object returns object, but associates it with
-                    n for #n#.  */
-                 if (c == '=')
-                   {
-                     /* Make a placeholder for #n# to use temporarily.  */
-                     /* Note: We used to use AUTO_CONS to allocate
-                        placeholder, but that is a bad idea, since it
-                        will place a stack-allocated cons cell into
-                        the list in read_objects_map, which is a
-                        staticpro'd global variable, and thus each of
-                        its elements is marked during each GC.  A
-                        stack-allocated object will become garbled
-                        when its stack slot goes out of scope, and
-                        some other function reuses it for entirely
-                        different purposes, which will cause crashes
-                        in GC.  */
-                     Lisp_Object placeholder = Fcons (Qnil, Qnil);
-                     struct Lisp_Hash_Table *h
-                       = XHASH_TABLE (read_objects_map);
-                     Lisp_Object number = make_fixnum (n), hash;
-
-                     ptrdiff_t i = hash_lookup (h, number, &hash);
-                     if (i >= 0)
-                       /* Not normal, but input could be malformed.  */
-                       set_hash_value_slot (h, i, placeholder);
-                     else
-                       hash_put (h, number, placeholder, hash);
-
-                     /* Read the object itself.  */
-                     Lisp_Object tem = read0 (readcharfun, locate_syms);
-
-                      if (CONSP (tem))
-                        {
-                         if (BASE_EQ (tem, placeholder))
-                           /* Catch silly games like #1=#1# */
-                           invalid_syntax ("nonsensical self-reference",
-                                           readcharfun);
+/* Length of prefix only consisting of symbol constituent characters.  */
+static ptrdiff_t
+symbol_char_span (const char *s)
+{
+  const char *p = s;
+  while (   *p == '^' || *p == '*' || *p == '+' || *p == '-' || *p == '/'
+        || *p == '<' || *p == '=' || *p == '>' || *p == '_' || *p == '|')
+    p++;
+  return p - s;
+}
 
-                         /* Optimisation: since the placeholder is already
-                            a cons, repurpose it as the actual value.
-                            This allows us to skip the substition below,
-                            since the placeholder is already referenced
-                            inside TEM at the appropriate places.  */
-                          Fsetcar (placeholder, XCAR (tem));
-                          Fsetcdr (placeholder, XCDR (tem));
-
-                         struct Lisp_Hash_Table *h2
-                           = XHASH_TABLE (read_objects_completed);
-                         ptrdiff_t i = hash_lookup (h2, placeholder, &hash);
-                         eassert (i < 0);
-                         hash_put (h2, placeholder, Qnil, hash);
-                         return placeholder;
-                       }
-
-                     /* If it can be recursive, remember it for
-                        future substitutions.  */
-                     if (! SYMBOLP (tem)
-                         && ! NUMBERP (tem)
-                         && ! (STRINGP (tem) && !string_intervals (tem)))
-                       {
-                         struct Lisp_Hash_Table *h2
-                           = XHASH_TABLE (read_objects_completed);
-                         i = hash_lookup (h2, tem, &hash);
-                         eassert (i < 0);
-                         hash_put (h2, tem, Qnil, hash);
-                       }
-
-                     /* Now put it everywhere the placeholder was...  */
-                     Flread__substitute_object_in_subtree
-                       (tem, placeholder, read_objects_completed);
-
-                     /* ...and #n# will use the real value from now on.  */
-                     i = hash_lookup (h, number, &hash);
-                     eassert (i >= 0);
-                     set_hash_value_slot (h, i, tem);
-
-                     return tem;
-                   }
+static void
+skip_space_and_comments (Lisp_Object readcharfun)
+{
+  int c;
+  do
+    {
+      c = READCHAR;
+      if (c == ';')
+       do
+         c = READCHAR;
+       while (c >= 0 && c != '\n');
+      if (c < 0)
+       end_of_file_error ();
+    }
+  while (c <= 32 || c == NO_BREAK_SPACE);
+  UNREAD (c);
+}
 
-                 /* #n# returns a previously read object.  */
-                 if (c == '#')
-                   {
-                     struct Lisp_Hash_Table *h
-                       = XHASH_TABLE (read_objects_map);
-                     ptrdiff_t i = hash_lookup (h, make_fixnum (n), NULL);
-                     if (i >= 0)
-                       return HASH_VALUE (h, i);
-                   }
-               }
-           }
-         /* Fall through to error message.  */
-       }
-      else if (c == 'x' || c == 'X')
-       return read_integer (readcharfun, 16, stackbuf);
-      else if (c == 'o' || c == 'O')
-       return read_integer (readcharfun, 8, stackbuf);
-      else if (c == 'b' || c == 'B')
-       return read_integer (readcharfun, 2, stackbuf);
-
-      char acm_buf[15];                /* FIXME!!! 2021-11-27. */
-      sprintf (acm_buf, "#%c", c);
-      invalid_syntax (acm_buf, readcharfun);
-      UNREAD (c);
-      invalid_syntax ("#", readcharfun);
+/* When an object is read, the type of the top read stack entry indicates
+   the syntactic context.  */
+enum read_entry_type
+{
+                               /* preceding syntactic context */
+  RE_list_start,               /* "(" */
 
-    case ';':
-      while ((c = READCHAR) >= 0 && c != '\n');
-      goto retry;
+  RE_list,                     /* "(" (+ OBJECT) */
+  RE_list_dot,                 /* "(" (+ OBJECT) "." */
 
-    case '\'':
-      return list2 (Qquote, read0 (readcharfun, locate_syms));
+  RE_vector,                   /* "[" (* OBJECT) */
+  RE_record,                   /* "#s(" (* OBJECT) */
+  RE_char_table,               /* "#^[" (* OBJECT) */
+  RE_sub_char_table,           /* "#^^[" (* OBJECT) */
+  RE_byte_code,                        /* "#[" (* OBJECT) */
+  RE_string_props,             /* "#(" (* OBJECT) */
 
-    case '`':
-      return list2 (Qbackquote, read0 (readcharfun, locate_syms));
+  RE_special,                  /* "'" | "#'" | "`" | "," | ",@" */
 
-    case ',':
-      {
-       Lisp_Object comma_type = Qnil;
-       Lisp_Object value;
-       int ch = READCHAR;
+  RE_numbered,                 /* "#" (+ DIGIT) "=" */
+};
 
-       if (ch == '@')
-         comma_type = Qcomma_at;
-       else
-         {
-           if (ch >= 0) UNREAD (ch);
-           comma_type = Qcomma;
-         }
+struct read_stack_entry
+{
+  enum read_entry_type type;
+  union {
+    /* RE_list, RE_list_dot */
+    struct {
+      Lisp_Object head;                /* first cons of list */
+      Lisp_Object tail;                /* last cons of list */
+    } list;
+
+    /* RE_vector, RE_record, RE_char_table, RE_sub_char_table,
+       RE_byte_code, RE_string_props */
+    struct {
+      Lisp_Object elems;       /* list of elements in reverse order */
+      bool old_locate_syms;    /* old value of locate_syms */
+    } vector;
+
+    /* RE_special */
+    struct {
+      Lisp_Object symbol;      /* symbol from special syntax */
+    } special;
+
+    /* RE_numbered */
+    struct {
+      Lisp_Object number;      /* number as a fixnum */
+      Lisp_Object placeholder; /* placeholder object */
+    } numbered;
+  } u;
+};
 
-       value = read0 (readcharfun, locate_syms);
-       return list2 (comma_type, value);
-      }
-    case '?':
-      {
-       int modifiers;
-       int next_char;
-       bool ok;
+struct read_stack
+{
+  struct read_stack_entry *stack;  /* base of stack */
+  ptrdiff_t size;                 /* allocated size in entries */
+  ptrdiff_t sp;                           /* current number of entries */
+};
 
-       c = READCHAR;
-       if (c < 0)
-         end_of_file_error ();
-
-       /* Accept `single space' syntax like (list ? x) where the
-          whitespace character is SPC or TAB.
-          Other literal whitespace like NL, CR, and FF are not accepted,
-          as there are well-established escape sequences for these.  */
-       if (c == ' ' || c == '\t')
-         return make_fixnum (c);
-
-       if (c == '(' || c == ')' || c == '[' || c == ']'
-            || c == '"' || c == ';')
+static struct read_stack rdstack = {NULL, 0, 0};
+
+void
+mark_lread (void)
+{
+  /* Mark the read stack, which may contain data not otherwise traced */
+  for (ptrdiff_t i = 0; i < rdstack.sp; i++)
+    {
+      struct read_stack_entry *e = &rdstack.stack[i];
+      switch (e->type)
+       {
+       case RE_list_start:
+         break;
+       case RE_list:
+       case RE_list_dot:
+         mark_object (e->u.list.head);
+         mark_object (e->u.list.tail);
+         break;
+       case RE_vector:
+       case RE_record:
+       case RE_char_table:
+       case RE_sub_char_table:
+       case RE_byte_code:
+       case RE_string_props:
+         mark_object (e->u.vector.elems);
+         break;
+       case RE_special:
+         mark_object (e->u.special.symbol);
+         break;
+       case RE_numbered:
+         mark_object (e->u.numbered.number);
+         mark_object (e->u.numbered.placeholder);
+         break;
+       }
+    }
+}
+
+static inline struct read_stack_entry *
+read_stack_top (void)
+{
+  eassume (rdstack.sp > 0);
+  return &rdstack.stack[rdstack.sp - 1];
+}
+
+static inline struct read_stack_entry *
+read_stack_pop (void)
+{
+  eassume (rdstack.sp > 0);
+  return &rdstack.stack[--rdstack.sp];
+}
+
+static inline bool
+read_stack_empty_p (ptrdiff_t base_sp)
+{
+  return rdstack.sp <= base_sp;
+}
+
+NO_INLINE static void
+grow_read_stack (void)
+{
+  struct read_stack *rs = &rdstack;
+  eassert (rs->sp == rs->size);
+  rs->stack = xpalloc (rs->stack, &rs->size, 1, -1, sizeof *rs->stack);
+  eassert (rs->sp < rs->size);
+}
+
+static inline void
+read_stack_push (struct read_stack_entry e)
+{
+  if (rdstack.sp >= rdstack.size)
+    grow_read_stack ();
+  rdstack.stack[rdstack.sp++] = e;
+}
+
+
+/* Read a Lisp object.
+   If LOCATE_SYMS is true, symbols are read with position.  */
+static Lisp_Object
+read0 (Lisp_Object readcharfun, bool locate_syms)
+{
+  char stackbuf[stackbufsize];
+  char *read_buffer = stackbuf;
+  ptrdiff_t read_buffer_size = sizeof stackbuf;
+  char *heapbuf = NULL;
+  specpdl_ref count = SPECPDL_INDEX ();
+
+  ptrdiff_t base_sp = rdstack.sp;
+
+  bool uninterned_symbol;
+  bool skip_shorthand;
+
+  /* Read an object into `obj'.  */
+ read_obj: ;
+  Lisp_Object obj;
+  bool multibyte;
+  int c = READCHAR_REPORT_MULTIBYTE (&multibyte);
+  if (c < 0)
+    end_of_file_error ();
+
+  switch (c)
+    {
+    case '(':
+      read_stack_push ((struct read_stack_entry) {.type = RE_list_start});
+      goto read_obj;
+
+    case ')':
+      if (read_stack_empty_p (base_sp))
+       invalid_syntax (")", readcharfun);
+      switch (read_stack_top ()->type)
+       {
+       case RE_list_start:
+         read_stack_pop ();
+         obj = Qnil;
+         break;
+       case RE_list:
+         obj = read_stack_pop ()->u.list.head;
+         break;
+       case RE_record:
          {
-            CHECK_LIST (Vlread_unescaped_character_literals);
-            Lisp_Object char_obj = make_fixed_natnum (c);
-            if (NILP (Fmemq (char_obj, Vlread_unescaped_character_literals)))
-              Vlread_unescaped_character_literals =
-                Fcons (char_obj, Vlread_unescaped_character_literals);
+           locate_syms = read_stack_top ()->u.vector.old_locate_syms;
+           Lisp_Object elems = Fnreverse (read_stack_pop ()->u.vector.elems);
+           if (NILP (elems))
+             invalid_syntax ("#s", readcharfun);
+
+           if (BASE_EQ (XCAR (elems), Qhash_table))
+             obj = hash_table_from_plist (XCDR (elems));
+           else
+             obj = record_from_list (elems);
+           break;
          }
+       case RE_string_props:
+         locate_syms = read_stack_top ()->u.vector.old_locate_syms;
+         obj = string_props_from_rev_list (read_stack_pop () ->u.vector.elems,
+                                           readcharfun);
+         break;
+       default:
+         invalid_syntax (")", readcharfun);
+       }
+      break;
 
-       if (c == '\\')
-         c = read_escape (readcharfun, 0);
-       modifiers = c & CHAR_MODIFIER_MASK;
-       c &= ~CHAR_MODIFIER_MASK;
-       if (CHAR_BYTE8_P (c))
-         c = CHAR_TO_BYTE8 (c);
-       c |= modifiers;
-
-       next_char = READCHAR;
-       ok = (next_char <= 040
-             || (next_char < 0200
-                 && strchr ("\"';()[]#?`,.", next_char) != NULL));
-       UNREAD (next_char);
-       if (ok)
-         return make_fixnum (c);
-
-       invalid_syntax ("?", readcharfun);
-      }
+    case '[':
+      read_stack_push ((struct read_stack_entry) {
+         .type = RE_vector,
+         .u.vector.elems = Qnil,
+         .u.vector.old_locate_syms = locate_syms,
+       });
+      /* FIXME: should vectors be read with locate_syms=false?  */
+      goto read_obj;
 
-    case '"':
+    case ']':
+      if (read_stack_empty_p (base_sp))
+       invalid_syntax ("]", readcharfun);
+      switch (read_stack_top ()->type)
+       {
+       case RE_vector:
+         locate_syms = read_stack_top ()->u.vector.old_locate_syms;
+         obj = vector_from_rev_list (read_stack_pop ()->u.vector.elems);
+         break;
+       case RE_byte_code:
+         locate_syms = read_stack_top ()->u.vector.old_locate_syms;
+         obj = bytecode_from_rev_list (read_stack_pop ()->u.vector.elems,
+                                       readcharfun);
+         break;
+       case RE_char_table:
+         locate_syms = read_stack_top ()->u.vector.old_locate_syms;
+         obj = char_table_from_rev_list (read_stack_pop ()->u.vector.elems,
+                                         readcharfun);
+         break;
+       case RE_sub_char_table:
+         locate_syms = read_stack_top ()->u.vector.old_locate_syms;
+         obj = sub_char_table_from_rev_list (read_stack_pop ()->u.vector.elems,
+                                             readcharfun);
+         break;
+       default:
+         invalid_syntax ("]", readcharfun);
+         break;
+       }
+      break;
+
+    case '#':
       {
-       specpdl_ref count = SPECPDL_INDEX ();
-       char *read_buffer = stackbuf;
-       ptrdiff_t read_buffer_size = sizeof stackbuf;
-       char *heapbuf = NULL;
-       char *p = read_buffer;
-       char *end = read_buffer + read_buffer_size;
-       int ch;
-       /* True if we saw an escape sequence specifying
-          a multibyte character.  */
-       bool force_multibyte = false;
-       /* True if we saw an escape sequence specifying
-          a single-byte character.  */
-       bool force_singlebyte = false;
-       bool cancel = false;
-       ptrdiff_t nchars = 0;
-
-       while ((ch = READCHAR) >= 0
-              && ch != '\"')
+       int ch = READCHAR;
+       switch (ch)
          {
-           if (end - p < MAX_MULTIBYTE_LENGTH)
+         case '\'':
+           /* #'X -- special syntax for (function X) */
+           read_stack_push ((struct read_stack_entry) {
+               .type = RE_special,
+               .u.special.symbol = Qfunction,
+             });
+           goto read_obj;
+
+         case '#':
+           /* ## -- the empty symbol */
+           obj = Fintern (empty_unibyte_string, Qnil);
+           break;
+
+         case 's':
+           /* #s(...) -- a record or hash-table */
+           ch = READCHAR;
+           if (ch != '(')
              {
-               ptrdiff_t offset = p - read_buffer;
-               read_buffer = grow_read_buffer (read_buffer, offset,
-                                               &heapbuf, &read_buffer_size,
-                                               count);
-               p = read_buffer + offset;
-               end = read_buffer + read_buffer_size;
+               UNREAD (ch);
+               invalid_syntax ("#s", readcharfun);
+             }
+           read_stack_push ((struct read_stack_entry) {
+               .type = RE_record,
+               .u.vector.elems = Qnil,
+               .u.vector.old_locate_syms = locate_syms,
+             });
+           locate_syms = false;
+           goto read_obj;
+
+         case '^':
+           /* #^[...]  -- char-table
+              #^^[...] -- sub-char-table */
+           ch = READCHAR;
+           if (ch == '^')
+             {
+               ch = READCHAR;
+               if (ch == '[')
+                 {
+                   read_stack_push ((struct read_stack_entry) {
+                       .type = RE_sub_char_table,
+                       .u.vector.elems = Qnil,
+                       .u.vector.old_locate_syms = locate_syms,
+                     });
+                   locate_syms = false;
+                   goto read_obj;
+                 }
+               else
+                 {
+                   UNREAD (ch);
+                   invalid_syntax ("#^^", readcharfun);
+                 }
+             }
+           else if (ch == '[')
+             {
+               read_stack_push ((struct read_stack_entry) {
+                   .type = RE_char_table,
+                   .u.vector.elems = Qnil,
+                   .u.vector.old_locate_syms = locate_syms,
+                 });
+               locate_syms = false;
+               goto read_obj;
+             }
+           else
+             {
+               UNREAD (ch);
+               invalid_syntax ("#^", readcharfun);
              }
 
-           if (ch == '\\')
+         case '(':
+           /* #(...) -- string with properties */
+           read_stack_push ((struct read_stack_entry) {
+               .type = RE_string_props,
+               .u.vector.elems = Qnil,
+               .u.vector.old_locate_syms = locate_syms,
+             });
+           locate_syms = false;
+           goto read_obj;
+
+         case '[':
+           /* #[...] -- byte-code */
+           read_stack_push ((struct read_stack_entry) {
+               .type = RE_byte_code,
+               .u.vector.elems = Qnil,
+               .u.vector.old_locate_syms = locate_syms,
+             });
+           locate_syms = false;
+           goto read_obj;
+
+         case '&':
+           /* #&N"..." -- bool-vector */
+           obj = read_bool_vector (stackbuf, readcharfun);
+           break;
+
+         case '!':
+           /* #! appears at the beginning of an executable file.
+              Skip the rest of the line.  */
+           {
+             int c;
+             do
+               c = READCHAR;
+             while (c >= 0 && c != '\n');
+             goto read_obj;
+           }
+
+         case 'x':
+         case 'X':
+           obj = read_integer (readcharfun, 16, stackbuf);
+           break;
+
+         case 'o':
+         case 'O':
+           obj = read_integer (readcharfun, 8, stackbuf);
+           break;
+
+         case 'b':
+         case 'B':
+           obj = read_integer (readcharfun, 2, stackbuf);
+           break;
+
+         case '@':
+           /* #@NUMBER is used to skip NUMBER following bytes.
+              That's used in .elc files to skip over doc strings
+              and function definitions that can be loaded lazily.  */
+           skip_lazy_string (readcharfun);
+           goto read_obj;
+
+         case '$':
+           /* #$ -- reference to lazy-loaded string */
+           obj = Vload_file_name;
+           break;
+
+         case ':':
+           /* #:X -- uninterned symbol */
+           c = READCHAR;
+           if (c <= 32 || c == NO_BREAK_SPACE
+               || c == '"' || c == '\'' || c == ';' || c == '#'
+               || c == '(' || c == ')'  || c == '[' || c == ']'
+               || c == '`' || c == ',')
              {
-               int modifiers;
+               /* No symbol character follows: this is the empty symbol.  */
+               UNREAD (c);
+               obj = Fmake_symbol (empty_unibyte_string);
+               break;
+             }
+           uninterned_symbol = true;
+           skip_shorthand = false;
+           goto read_symbol;
 
-               ch = read_escape (readcharfun, 1);
+         case '_':
+           /* #_X -- symbol without shorthand */
+           c = READCHAR;
+           if (c <= 32 || c == NO_BREAK_SPACE
+               || c == '"' || c == '\'' || c == ';' || c == '#'
+               || c == '(' || c == ')'  || c == '[' || c == ']'
+               || c == '`' || c == ',')
+             {
+               /* No symbol character follows: this is the empty symbol.  */
+               UNREAD (c);
+               obj = Fintern (empty_unibyte_string, Qnil);
+               break;
+             }
+           uninterned_symbol = false;
+           skip_shorthand = true;
+           goto read_symbol;
 
-               /* CH is -1 if \ newline or \ space has just been seen.  */
-               if (ch == -1)
+         default:
+           if (ch >= '0' && ch <= '9')
+             {
+               /* #N=OBJ or #N# -- first read the number N */
+               EMACS_INT n = ch - '0';
+               int c;
+               for (;;)
                  {
-                   if (p == read_buffer)
-                     cancel = true;
-                   continue;
+                   c = READCHAR;
+                   if (c < '0' || c > '9')
+                     break;
+                   if (INT_MULTIPLY_WRAPV (n, 10, &n)
+                       || INT_ADD_WRAPV (n, c - '0', &n))
+                     invalid_syntax ("#", readcharfun);
                  }
-
-               modifiers = ch & CHAR_MODIFIER_MASK;
-               ch = ch & ~CHAR_MODIFIER_MASK;
-
-               if (CHAR_BYTE8_P (ch))
-                 force_singlebyte = true;
-               else if (! ASCII_CHAR_P (ch))
-                 force_multibyte = true;
-               else            /* I.e. ASCII_CHAR_P (ch).  */
+               if (c == 'r' || c == 'R')
                  {
-                   /* Allow `\C- ' and `\C-?'.  */
-                   if (modifiers == CHAR_CTL)
-                     {
-                       if (ch == ' ')
-                         ch = 0, modifiers = 0;
-                       else if (ch == '?')
-                         ch = 127, modifiers = 0;
-                     }
-                   if (modifiers & CHAR_SHIFT)
+                   /* #NrDIGITS -- radix-N number */
+                   if (n < 0 || n > 36)
+                     invalid_radix_integer (n, stackbuf, readcharfun);
+                   obj = read_integer (readcharfun, n, stackbuf);
+                   break;
+                 }
+               else if (n <= MOST_POSITIVE_FIXNUM && !NILP (Vread_circle))
+                 {
+                   if (c == '=')
                      {
-                       /* Shift modifier is valid only with [A-Za-z].  */
-                       if (ch >= 'A' && ch <= 'Z')
-                         modifiers &= ~CHAR_SHIFT;
-                       else if (ch >= 'a' && ch <= 'z')
-                         ch -= ('a' - 'A'), modifiers &= ~CHAR_SHIFT;
+                       /* #N=OBJ -- assign number N to OBJ */
+                       Lisp_Object placeholder = Fcons (Qnil, Qnil);
+
+                       struct Lisp_Hash_Table *h
+                         = XHASH_TABLE (read_objects_map);
+                       Lisp_Object number = make_fixnum (n);
+                       Lisp_Object hash;
+                       ptrdiff_t i = hash_lookup (h, number, &hash);
+                       if (i >= 0)
+                         /* Not normal, but input could be malformed.  */
+                         set_hash_value_slot (h, i, placeholder);
+                       else
+                         hash_put (h, number, placeholder, hash);
+                       read_stack_push ((struct read_stack_entry) {
+                           .type = RE_numbered,
+                           .u.numbered.number = number,
+                           .u.numbered.placeholder = placeholder,
+                         });
+                       goto read_obj;
                      }
-
-                   if (modifiers & CHAR_META)
+                   else if (c == '#')
                      {
-                       /* Move the meta bit to the right place for a
-                          string.  */
-                       modifiers &= ~CHAR_META;
-                       ch = BYTE8_TO_CHAR (ch | 0x80);
-                       force_singlebyte = true;
+                       /* #N# -- reference to numbered object */
+                       struct Lisp_Hash_Table *h
+                         = XHASH_TABLE (read_objects_map);
+                       ptrdiff_t i = hash_lookup (h, make_fixnum (n), NULL);
+                       if (i < 0)
+                         invalid_syntax ("#", readcharfun);
+                       obj = HASH_VALUE (h, i);
+                       break;
                      }
+                   else
+                     invalid_syntax ("#", readcharfun);
                  }
-
-               /* Any modifiers remaining are invalid.  */
-               if (modifiers)
-                 invalid_syntax ("Invalid modifier in string", readcharfun);
-               p += CHAR_STRING (ch, (unsigned char *) p);
+               else
+                 invalid_syntax ("#", readcharfun);
              }
            else
-             {
-               p += CHAR_STRING (ch, (unsigned char *) p);
-               if (CHAR_BYTE8_P (ch))
-                 force_singlebyte = true;
-               else if (! ASCII_CHAR_P (ch))
-                 force_multibyte = true;
-             }
-           nchars++;
+             invalid_syntax ("#", readcharfun);
          }
+       break;
+      }
+
+    case '?':
+      obj = read_char_literal (readcharfun);
+      break;
 
-       if (ch < 0)
-         end_of_file_error ();
+    case '"':
+      obj = read_string_literal (stackbuf, readcharfun);
+      break;
 
-       /* If purifying, and string starts with \ newline,
-          return zero instead.  This is for doc strings
-          that we are really going to find in etc/DOC.nn.nn.  */
-       if (!NILP (Vpurify_flag) && NILP (Vdoc_file_name) && cancel)
-         return unbind_to (count, make_fixnum (0));
+    case '\'':
+      read_stack_push ((struct read_stack_entry) {
+         .type = RE_special,
+         .u.special.symbol = Qquote,
+       });
+      goto read_obj;
 
-       if (! force_multibyte && force_singlebyte)
+    case '`':
+      read_stack_push ((struct read_stack_entry) {
+         .type = RE_special,
+         .u.special.symbol = Qbackquote,
+       });
+      goto read_obj;
+
+    case ',':
+      {
+       int ch = READCHAR;
+       Lisp_Object sym;
+       if (ch == '@')
+         sym = Qcomma_at;
+       else
          {
-           /* READ_BUFFER contains raw 8-bit bytes and no multibyte
-              forms.  Convert it to unibyte.  */
-           nchars = str_as_unibyte ((unsigned char *) read_buffer,
-                                    p - read_buffer);
-           p = read_buffer + nchars;
+           if (ch >= 0)
+             UNREAD (ch);
+           sym = Qcomma;
          }
+       read_stack_push ((struct read_stack_entry) {
+           .type = RE_special,
+           .u.special.symbol = sym,
+         });
+       goto read_obj;
+      }
 
-       Lisp_Object result
-         = make_specified_string (read_buffer, nchars, p - read_buffer,
-                                  (force_multibyte
-                                   || (p - read_buffer != nchars)));
-       return unbind_to (count, result);
+    case ';':
+      {
+       int c;
+       do
+         c = READCHAR;
+       while (c >= 0 && c != '\n');
+       goto read_obj;
       }
 
     case '.':
       {
-       int next_char = READCHAR;
-       UNREAD (next_char);
-
-       if (next_char <= 040
-           || (next_char < 0200
-               && strchr ("\"';([#?`,", next_char) != NULL))
+       int nch = READCHAR;
+       UNREAD (nch);
+       if (nch <= 32 || nch == NO_BREAK_SPACE
+           || nch == '"' || nch == '\'' || nch == ';'
+           || nch == '(' || nch == '[' || nch == '#'
+           || nch == '?' || nch == '`' || nch == ',')
          {
-           *pch = c;
-           return Qnil;
+           if (!read_stack_empty_p (base_sp)
+               && read_stack_top ()->type ==  RE_list)
+             {
+               read_stack_top ()->type = RE_list_dot;
+               goto read_obj;
+             }
+           invalid_syntax (".", readcharfun);
          }
       }
-      /* The atom-reading loop below will now loop at least once,
-        assuring that we will not try to UNREAD two characters in a
-        row.  */
+      /* may be a number or symbol starting with a dot */
       FALLTHROUGH;
+
     default:
-      if (c <= 040) goto retry;
-      if (c == NO_BREAK_SPACE)
-       goto retry;
+      if (c <= 32 || c == NO_BREAK_SPACE)
+       goto read_obj;
 
+      uninterned_symbol = false;
+      skip_shorthand = false;
+      /* symbol or number */
     read_symbol:
       {
-       specpdl_ref count = SPECPDL_INDEX ();
-       char *read_buffer = stackbuf;
-       ptrdiff_t read_buffer_size = sizeof stackbuf;
-       char *heapbuf = NULL;
        char *p = read_buffer;
        char *end = read_buffer + read_buffer_size;
        bool quoted = false;
@@ -3805,7 +4105,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list, bool locate_syms)
            if (c == '\\')
              {
                c = READCHAR;
-               if (c == -1)
+               if (c < 0)
                  end_of_file_error ();
                quoted = true;
              }
@@ -3816,94 +4116,205 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list, bool locate_syms)
              *p++ = c;
            c = READCHAR;
          }
-       while (c > 040
+       while (c > 32
               && c != NO_BREAK_SPACE
-              && (c >= 0200
-                  || strchr ("\"';()[]#`,", c) == NULL));
+              && (c >= 128
+                  || !(   c == '"' || c == '\'' || c == ';' || c == '#'
+                       || c == '(' || c == ')'  || c == '[' || c == ']'
+                       || c == '`' || c == ',')));
 
        *p = 0;
        ptrdiff_t nbytes = p - read_buffer;
        UNREAD (c);
 
-       if (!quoted && !uninterned_symbol && !skip_shorthand)
+       /* Only attempt to parse the token as a number if it starts as one.  */
+       char c0 = read_buffer[0];
+       if (((c0 >= '0' && c0 <= '9') || c0 == '.' || c0 == '-' || c0 == '+')
+           && !quoted && !uninterned_symbol && !skip_shorthand)
          {
            ptrdiff_t len;
            Lisp_Object result = string_to_number (read_buffer, 10, &len);
-           if (! NILP (result) && len == nbytes)
-             return unbind_to (count, result);
+           if (!NILP (result) && len == nbytes)
+             {
+               obj = result;
+               break;
+             }
          }
-       {
-         Lisp_Object result;
-         ptrdiff_t nchars
-           = (multibyte
-              ? multibyte_chars_in_text ((unsigned char *) read_buffer,
-                                         nbytes)
-              : nbytes);
-
-         if (uninterned_symbol)
-           {
-             Lisp_Object name
-               = ((! NILP (Vpurify_flag)
-                   ? make_pure_string : make_specified_string)
-                  (read_buffer, nchars, nbytes, multibyte));
-             result = Fmake_symbol (name);
-           }
-         else
-           {
-             /* Don't create the string object for the name unless
-                we're going to retain it in a new symbol.
-
-                Like intern_1 but supports multibyte names.  */
-             Lisp_Object obarray = check_obarray (Vobarray);
-
-             char* longhand = NULL;
-             ptrdiff_t longhand_chars = 0;
-             ptrdiff_t longhand_bytes = 0;
-
-             Lisp_Object tem;
-             if (skip_shorthand
-                 /* The following ASCII characters are used in the
-                    only "core" Emacs Lisp symbols that are comprised
-                    entirely of characters that have the 'symbol
-                    constituent' syntax.  We exempt them from
-                    transforming according to shorthands.  */
-                 || strspn (read_buffer, "^*+-/<=>_|") >= nbytes)
-               tem = oblookup (obarray, read_buffer, nchars, nbytes);
-             else
-               tem = oblookup_considering_shorthand (obarray, read_buffer,
+
+       /* symbol, possibly uninterned */
+       ptrdiff_t nchars
+         = (multibyte
+            ? multibyte_chars_in_text ((unsigned char *)read_buffer, nbytes)
+            : nbytes);
+       Lisp_Object result;
+       if (uninterned_symbol)
+         {
+           Lisp_Object name
+             = (!NILP (Vpurify_flag)
+                ? make_pure_string (read_buffer, nchars, nbytes, multibyte)
+                : make_specified_string (read_buffer, nchars, nbytes,
+                                         multibyte));
+           result = Fmake_symbol (name);
+         }
+       else
+         {
+           /* Don't create the string object for the name unless
+              we're going to retain it in a new symbol.
+
+              Like intern_1 but supports multibyte names.  */
+           Lisp_Object obarray = check_obarray (Vobarray);
+
+           char *longhand = NULL;
+           ptrdiff_t longhand_chars = 0;
+           ptrdiff_t longhand_bytes = 0;
+
+           Lisp_Object found;
+           if (skip_shorthand
+               /* We exempt characters used in the "core" Emacs Lisp
+                  symbols that are comprised entirely of characters
+                  that have the 'symbol constituent' syntax from
+                  transforming according to shorthands.  */
+               || symbol_char_span (read_buffer) >= nbytes)
+             found = oblookup (obarray, read_buffer, nchars, nbytes);
+           else
+             found = oblookup_considering_shorthand (obarray, read_buffer,
                                                      nchars, nbytes, &longhand,
                                                      &longhand_chars,
                                                      &longhand_bytes);
 
-             if (SYMBOLP (tem))
-               result = tem;
-             else if (longhand)
-               {
-                 Lisp_Object name
-                   = make_specified_string (longhand, longhand_chars,
-                                            longhand_bytes, multibyte);
-                 xfree (longhand);
-                 result = intern_driver (name, obarray, tem);
-               }
-             else
-               {
-                 Lisp_Object name
-                   = make_specified_string (read_buffer, nchars, nbytes,
-                                            multibyte);
-                 result = intern_driver (name, obarray, tem);
-               }
-           }
-         if (locate_syms
-             && !NILP (result)
-             )
-           result = build_symbol_with_pos (result,
-                                           make_fixnum (start_position));
+           if (SYMBOLP (found))
+             result = found;
+           else if (longhand)
+             {
+               Lisp_Object name = make_specified_string (longhand,
+                                                         longhand_chars,
+                                                         longhand_bytes,
+                                                         multibyte);
+               xfree (longhand);
+               result = intern_driver (name, obarray, found);
+             }
+           else
+             {
+               Lisp_Object name = make_specified_string (read_buffer, nchars,
+                                                         nbytes, multibyte);
+               result = intern_driver (name, obarray, found);
+             }
+         }
+       if (locate_syms && !NILP (result))
+         result = build_symbol_with_pos (result,
+                                         make_fixnum (start_position));
 
-         return unbind_to (count, result);
-       }
+       obj = result;
+       break;
       }
     }
+
+  /* We have read an object in `obj'.  Use the stack to decide what to
+     do with it.  */
+  while (rdstack.sp > base_sp)
+    {
+      struct read_stack_entry *e = read_stack_top ();
+      switch (e->type)
+       {
+       case RE_list_start:
+         e->type = RE_list;
+         e->u.list.head = e->u.list.tail = Fcons (obj, Qnil);
+         goto read_obj;
+
+       case RE_list:
+         {
+           Lisp_Object tl = Fcons (obj, Qnil);
+           XSETCDR (e->u.list.tail, tl);
+           e->u.list.tail = tl;
+           goto read_obj;
+         }
+
+       case RE_list_dot:
+         {
+           skip_space_and_comments (readcharfun);
+           int ch = READCHAR;
+           if (ch != ')')
+             invalid_syntax ("expected )", readcharfun);
+           XSETCDR (e->u.list.tail, obj);
+           read_stack_pop ();
+           obj = e->u.list.head;
+           break;
+         }
+
+       case RE_vector:
+       case RE_record:
+       case RE_char_table:
+       case RE_sub_char_table:
+       case RE_byte_code:
+       case RE_string_props:
+         e->u.vector.elems = Fcons (obj, e->u.vector.elems);
+         goto read_obj;
+
+       case RE_special:
+         read_stack_pop ();
+         obj = list2 (e->u.special.symbol, obj);
+         break;
+
+       case RE_numbered:
+         {
+           read_stack_pop ();
+           Lisp_Object placeholder = e->u.numbered.placeholder;
+           if (CONSP (obj))
+             {
+               if (BASE_EQ (obj, placeholder))
+                 /* Catch silly games like #1=#1# */
+                 invalid_syntax ("nonsensical self-reference", readcharfun);
+
+               /* Optimisation: since the placeholder is already
+                  a cons, repurpose it as the actual value.
+                  This allows us to skip the substitution below,
+                  since the placeholder is already referenced
+                  inside OBJ at the appropriate places.  */
+               Fsetcar (placeholder, XCAR (obj));
+               Fsetcdr (placeholder, XCDR (obj));
+
+               struct Lisp_Hash_Table *h2
+                 = XHASH_TABLE (read_objects_completed);
+               Lisp_Object hash;
+               ptrdiff_t i = hash_lookup (h2, placeholder, &hash);
+               eassert (i < 0);
+               hash_put (h2, placeholder, Qnil, hash);
+               obj = placeholder;
+             }
+           else
+             {
+               /* If it can be recursive, remember it for future
+                  substitutions.  */
+               if (!SYMBOLP (obj) && !NUMBERP (obj)
+                   && !(STRINGP (obj) && !string_intervals (obj)))
+                 {
+                   struct Lisp_Hash_Table *h2
+                     = XHASH_TABLE (read_objects_completed);
+                   Lisp_Object hash;
+                   ptrdiff_t i = hash_lookup (h2, obj, &hash);
+                   eassert (i < 0);
+                   hash_put (h2, obj, Qnil, hash);
+                 }
+
+               /* Now put it everywhere the placeholder was...  */
+               Flread__substitute_object_in_subtree (obj, placeholder,
+                                                     read_objects_completed);
+
+               /* ...and #n# will use the real value from now on.  */
+               struct Lisp_Hash_Table *h = XHASH_TABLE (read_objects_map);
+               Lisp_Object hash;
+               ptrdiff_t i = hash_lookup (h, e->u.numbered.number, &hash);
+               eassert (i >= 0);
+               set_hash_value_slot (h, i, obj);
+             }
+           break;
+         }
+       }
+    }
+
+  return unbind_to (count, obj);
 }
+
 
 DEFUN ("lread--substitute-object-in-subtree",
        Flread__substitute_object_in_subtree,
@@ -4150,214 +4561,6 @@ string_to_number (char const *string, int base, 
ptrdiff_t *plen)
 }
 
 
-static Lisp_Object
-read_vector (Lisp_Object readcharfun, bool bytecodeflag, bool locate_syms)
-{
-  Lisp_Object tem = read_list (1, readcharfun, locate_syms);
-  ptrdiff_t size = list_length (tem);
-  Lisp_Object vector = make_nil_vector (size);
-
-  /* Avoid accessing past the end of a vector if the vector is too
-     small to be valid for bytecode.  */
-  bytecodeflag &= COMPILED_STACK_DEPTH < size;
-
-  Lisp_Object *ptr = XVECTOR (vector)->contents;
-  for (ptrdiff_t i = 0; i < size; i++)
-    {
-      Lisp_Object item = Fcar (tem);
-      /* If `load-force-doc-strings' is t when reading a lazily-loaded
-        bytecode object, the docstring containing the bytecode and
-        constants values must be treated as unibyte and passed to
-        Fread, to get the actual bytecode string and constants vector.  */
-      if (bytecodeflag && load_force_doc_strings)
-       {
-         if (i == COMPILED_BYTECODE)
-           {
-             if (!STRINGP (item))
-               error ("Invalid byte code");
-
-             /* Delay handling the bytecode slot until we know whether
-                it is lazily-loaded (we can tell by whether the
-                constants slot is nil).  */
-             ASET (vector, COMPILED_CONSTANTS, item);
-             item = Qnil;
-           }
-         else if (i == COMPILED_CONSTANTS)
-           {
-             Lisp_Object bytestr = ptr[COMPILED_CONSTANTS];
-
-             if (NILP (item))
-               {
-                 /* Coerce string to unibyte (like string-as-unibyte,
-                    but without generating extra garbage and
-                    guaranteeing no change in the contents).  */
-                 STRING_SET_CHARS (bytestr, SBYTES (bytestr));
-                 STRING_SET_UNIBYTE (bytestr);
-
-                 item = Fread (Fcons (bytestr, readcharfun));
-                 if (!CONSP (item))
-                   error ("Invalid byte code");
-
-                 struct Lisp_Cons *otem = XCONS (item);
-                 bytestr = XCAR (item);
-                 item = XCDR (item);
-                 free_cons (otem);
-               }
-
-             /* Now handle the bytecode slot.  */
-             ASET (vector, COMPILED_BYTECODE, bytestr);
-           }
-         else if (i == COMPILED_DOC_STRING
-                  && STRINGP (item)
-                  && ! STRING_MULTIBYTE (item))
-           {
-             if (EQ (readcharfun, Qget_emacs_mule_file_char))
-               item = Fdecode_coding_string (item, Qemacs_mule, Qnil, Qnil);
-             else
-               item = Fstring_as_multibyte (item);
-           }
-       }
-      ASET (vector, i, item);
-      struct Lisp_Cons *otem = XCONS (tem);
-      tem = Fcdr (tem);
-      free_cons (otem);
-    }
-  return vector;
-}
-
-/* FLAG means check for ']' to terminate rather than ')' and '.'.
-   LOCATE_SYMS true means read symbol occurrencess as symbols with
-   position. */
-
-static Lisp_Object
-read_list (bool flag, Lisp_Object readcharfun, bool locate_syms)
-{
-  Lisp_Object val, tail;
-  Lisp_Object elt, tem;
-  /* 0 is the normal case.
-     1 means this list is a doc reference; replace it with the number 0.
-     2 means this list is a doc reference; replace it with the doc string.  */
-  int doc_reference = 0;
-
-  /* Initialize this to 1 if we are reading a list.  */
-  bool first_in_list = flag <= 0;
-
-  val = Qnil;
-  tail = Qnil;
-
-  while (1)
-    {
-      int ch;
-      elt = read1 (readcharfun, &ch, first_in_list, locate_syms);
-
-      first_in_list = 0;
-
-      /* While building, if the list starts with #$, treat it specially.  */
-      if (EQ (elt, Vload_file_name)
-         && ! NILP (elt))
-       {
-         if (!NILP (Vpurify_flag))
-           doc_reference = 0;
-         else if (load_force_doc_strings)
-           doc_reference = 2;
-       }
-      if (ch)
-       {
-         if (flag > 0)
-           {
-             if (ch == ']')
-               return val;
-             invalid_syntax (") or . in a vector", readcharfun);
-           }
-         if (ch == ')')
-           return val;
-         if (ch == '.')
-           {
-             if (!NILP (tail))
-               XSETCDR (tail, read0 (readcharfun, locate_syms));
-             else
-               val = read0 (readcharfun, locate_syms);
-             read1 (readcharfun, &ch, 0, locate_syms);
-
-             if (ch == ')')
-               {
-                 if (doc_reference == 2 && FIXNUMP (XCDR (val)))
-                   {
-                     char *saved = NULL;
-                     file_offset saved_position;
-                     /* Get a doc string from the file we are loading.
-                        If it's in saved_doc_string, get it from there.
-
-                        Here, we don't know if the string is a
-                        bytecode string or a doc string.  As a
-                        bytecode string must be unibyte, we always
-                        return a unibyte string.  If it is actually a
-                        doc string, caller must make it
-                        multibyte.  */
-
-                     /* Position is negative for user variables.  */
-                     EMACS_INT pos = eabs (XFIXNUM (XCDR (val)));
-                     if (pos >= saved_doc_string_position
-                         && pos < (saved_doc_string_position
-                                   + saved_doc_string_length))
-                       {
-                         saved = saved_doc_string;
-                         saved_position = saved_doc_string_position;
-                       }
-                     /* Look in prev_saved_doc_string the same way.  */
-                     else if (pos >= prev_saved_doc_string_position
-                              && pos < (prev_saved_doc_string_position
-                                        + prev_saved_doc_string_length))
-                       {
-                         saved = prev_saved_doc_string;
-                         saved_position = prev_saved_doc_string_position;
-                       }
-                     if (saved)
-                       {
-                         ptrdiff_t start = pos - saved_position;
-                         ptrdiff_t from, to;
-
-                         /* Process quoting with ^A,
-                            and find the end of the string,
-                            which is marked with ^_ (037).  */
-                         for (from = start, to = start;
-                              saved[from] != 037;)
-                           {
-                             int c = saved[from++];
-                             if (c == 1)
-                               {
-                                 c = saved[from++];
-                                 saved[to++] = (c == 1 ? c
-                                                : c == '0' ? 0
-                                                : c == '_' ? 037
-                                                : c);
-                               }
-                             else
-                               saved[to++] = c;
-                           }
-
-                         return make_unibyte_string (saved + start,
-                                                     to - start);
-                       }
-                     else
-                       return get_doc_string (val, 1, 0);
-                   }
-
-                 return val;
-               }
-             invalid_syntax (". in wrong context", readcharfun);
-           }
-         invalid_syntax ("] in a list", readcharfun);
-       }
-      tem = list1 (elt);
-      if (!NILP (tail))
-       XSETCDR (tail, tem);
-      else
-       val = tem;
-      tail = tem;
-    }
-}
-
 static Lisp_Object initial_obarray;
 
 /* `oblookup' stores the bucket number here, for the sake of Funintern.  */
@@ -4464,7 +4667,7 @@ define_symbol (Lisp_Object sym, char const *str)
 
   /* Qunbound is uninterned, so that it's not confused with any symbol
      'unbound' created by a Lisp program.  */
-  if (! EQ (sym, Qunbound))
+  if (! BASE_EQ (sym, Qunbound))
     {
       Lisp_Object bucket = oblookup (initial_obarray, str, len, len);
       eassert (FIXNUMP (bucket));
diff --git a/src/menu.c b/src/menu.c
index 398bf9329f..eeb0c9a7e5 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -1118,7 +1118,7 @@ x_popup_menu_1 (Lisp_Object position, Lisp_Object menu)
   Lisp_Object title;
   const char *error_name = NULL;
   Lisp_Object selection = Qnil;
-  struct frame *f = NULL;
+  struct frame *f;
   Lisp_Object x, y, window;
   int menuflags = 0;
   specpdl_ref specpdl_count = SPECPDL_INDEX ();
@@ -1269,9 +1269,9 @@ x_popup_menu_1 (Lisp_Object position, Lisp_Object menu)
          }
       }
     else
-      /* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME,
+      /* ??? Not really clean; should be Qwindow_or_framep
         but I don't want to make one now.  */
-      CHECK_WINDOW (window);
+      wrong_type_argument (Qwindowp, window);
 
     xpos += check_integer_range (x,
                                 (xpos < INT_MIN - MOST_NEGATIVE_FIXNUM
diff --git a/src/minibuf.c b/src/minibuf.c
index df82bcb121..1f77a6cdc1 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -201,20 +201,12 @@ move_minibuffers_onto_frame (struct frame *of, bool 
for_deletion)
     return;
   if (FRAME_LIVE_P (f)
       && !EQ (f->minibuffer_window, of->minibuffer_window)
-      && WINDOW_LIVE_P (f->minibuffer_window) /* F not a tootip frame */
+      && WINDOW_LIVE_P (f->minibuffer_window) /* F not a tooltip frame */
       && WINDOW_LIVE_P (of->minibuffer_window))
     {
       zip_minibuffer_stacks (f->minibuffer_window, of->minibuffer_window);
       if (for_deletion && XFRAME (MB_frame) != of)
        MB_frame = selected_frame;
-      if (!for_deletion
-         && MINI_WINDOW_P (XWINDOW (FRAME_SELECTED_WINDOW (of))))
-       {
-         Lisp_Object old_frame;
-         XSETFRAME (old_frame, of);
-         Fset_frame_selected_window (old_frame,
-                                     Fframe_first_window (old_frame), Qnil);
-       }
     }
 }
 
@@ -265,7 +257,7 @@ without invoking the usual minibuffer commands.  */)
 
 static void read_minibuf_unwind (void);
 static void minibuffer_unwind (void);
-static void run_exit_minibuf_hook (void);
+static void run_exit_minibuf_hook (Lisp_Object minibuf);
 
 
 /* Read a Lisp object from VAL and return it.  If VAL is an empty
@@ -749,7 +741,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
      separately from read_minibuf_unwind because we need to make sure that
      read_minibuf_unwind is fully executed even if exit-minibuffer-hook
      signals an error.  --Stef  */
-  record_unwind_protect_void (run_exit_minibuf_hook);
+  record_unwind_protect (run_exit_minibuf_hook, minibuffer);
 
   /* Now that we can restore all those variables, start changing them.  */
 
@@ -768,7 +760,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
 
   /* If variable is unbound, make it nil.  */
   histval = find_symbol_value (histvar);
-  if (EQ (histval, Qunbound))
+  if (BASE_EQ (histval, Qunbound))
     {
       Fset (histvar, Qnil);
       histval = Qnil;
@@ -1076,9 +1068,14 @@ static EMACS_INT minibuf_c_loop_level (EMACS_INT depth)
 }
 
 static void
-run_exit_minibuf_hook (void)
+run_exit_minibuf_hook (Lisp_Object minibuf)
 {
+  specpdl_ref count = SPECPDL_INDEX ();
+  record_unwind_current_buffer ();
+  if (BUFFER_LIVE_P (XBUFFER (minibuf)))
+    Fset_buffer (minibuf);
   safe_run_hooks (Qminibuffer_exit_hook);
+  unbind_to (count, Qnil);
 }
 
 /* This variable records the expired minibuffer's frame between the
@@ -1696,7 +1693,8 @@ or from one of the possible completions.  */)
       else /* if (type == hash_table) */
        {
          while (idx < HASH_TABLE_SIZE (XHASH_TABLE (collection))
-                && EQ (HASH_KEY (XHASH_TABLE (collection), idx), Qunbound))
+                && BASE_EQ (HASH_KEY (XHASH_TABLE (collection), idx),
+                            Qunbound))
            idx++;
          if (idx >= HASH_TABLE_SIZE (XHASH_TABLE (collection)))
            break;
@@ -1933,7 +1931,8 @@ with a space are ignored unless STRING itself starts with 
a space.  */)
       else /* if (type == 3) */
        {
          while (idx < HASH_TABLE_SIZE (XHASH_TABLE (collection))
-                && EQ (HASH_KEY (XHASH_TABLE (collection), idx), Qunbound))
+                && BASE_EQ (HASH_KEY (XHASH_TABLE (collection), idx),
+                            Qunbound))
            idx++;
          if (idx >= HASH_TABLE_SIZE (XHASH_TABLE (collection)))
            break;
@@ -2012,6 +2011,8 @@ REQUIRE-MATCH can take the following values:
   input, but she needs to confirm her choice if she called
   `minibuffer-complete' right before `minibuffer-complete-and-exit'
   and the input is not an element of COLLECTION.
+- a function, which will be called with the input as the parameter.
+  If it returns a non-nil value, the minibuffer is exited with that value.
 - anything else behaves like t except that typing RET does not exit if it
   does non-null completion.
 
@@ -2140,7 +2141,7 @@ the values STRING, PREDICATE and `lambda'.  */)
        for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
           {
             tem = HASH_KEY (h, i);
-            if (EQ (tem, Qunbound)) continue;
+            if (BASE_EQ (tem, Qunbound)) continue;
             Lisp_Object strkey = (SYMBOLP (tem) ? Fsymbol_name (tem) : tem);
             if (!STRINGP (strkey)) continue;
             if (EQ (Fcompare_strings (string, Qnil, Qnil,
diff --git a/src/nsfns.m b/src/nsfns.m
index a67dafe095..5ab2b2ee35 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -47,12 +47,42 @@ GNUstep port and post-20 update by Adrian Robert 
(arobert@cogsci.ucsd.edu)
 #ifdef NS_IMPL_COCOA
 #include <IOKit/graphics/IOGraphicsLib.h>
 #include "macfont.h"
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 120000
+#include <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 120000
+#define IOMasterPort IOMainPort
+#endif
+#endif
 #endif
 
 #ifdef HAVE_NS
 
 static EmacsTooltip *ns_tooltip = nil;
 
+/* The frame of the currently visible tooltip, or nil if none.  */
+static Lisp_Object tip_frame;
+
+/* The X and Y deltas of the last call to `x-show-tip'.  */
+static Lisp_Object tip_dx, tip_dy;
+
+/* The window-system window corresponding to the frame of the
+   currently visible tooltip.  */
+static NSWindow *tip_window;
+
+/* A timer that hides or deletes the currently visible tooltip when it
+   fires.  */
+static Lisp_Object tip_timer;
+
+/* STRING argument of last `x-show-tip' call.  */
+static Lisp_Object tip_last_string;
+
+/* Normalized FRAME argument of last `x-show-tip' call.  */
+static Lisp_Object tip_last_frame;
+
+/* PARMS argument of last `x-show-tip' call.  */
+static Lisp_Object tip_last_parms;
+
 /* Static variables to handle AppleScript execution.  */
 static Lisp_Object as_script, *as_result;
 static int as_status;
@@ -769,11 +799,13 @@ ns_implicitly_set_icon_type (struct frame *f)
   Lisp_Object chain, elt;
   NSAutoreleasePool *pool;
   BOOL setMini = YES;
+  NSWorkspace *workspace;
 
   NSTRACE ("ns_implicitly_set_icon_type");
 
   block_input ();
   pool = [[NSAutoreleasePool alloc] init];
+  workspace = [NSWorkspace sharedWorkspace];
   if (f->output_data.ns->miniimage
       && [[NSString stringWithLispString:f->name]
                isEqualToString: [(NSImage *)f->output_data.ns->miniimage 
name]])
@@ -818,7 +850,21 @@ ns_implicitly_set_icon_type (struct frame *f)
 
   if (image == nil)
     {
-      image = [[[NSWorkspace sharedWorkspace] iconForFileType: @"text"] 
retain];
+#ifndef NS_IMPL_GNUSTEP
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 120000
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 120000
+      if ([workspace respondsToSelector: @selector (iconForContentType:)])
+#endif
+       image = [[workspace iconForContentType:
+                             [UTType typeWithIdentifier: @"text"]] retain];
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 120000
+      else
+#endif
+#endif
+#endif
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 120000
+       image = [[workspace iconForFileType: @"text"] retain];
+#endif
       setMini = NO;
     }
 
@@ -1021,7 +1067,7 @@ frame_parm_handler ns_frame_parm_handlers[] =
 /* Handler for signals raised during x_create_frame.
    FRAME is the frame which is partially constructed.  */
 
-static void
+static Lisp_Object
 unwind_create_frame (Lisp_Object frame)
 {
   struct frame *f = XFRAME (frame);
@@ -1030,7 +1076,7 @@ unwind_create_frame (Lisp_Object frame)
      display is disconnected after the frame has become official, but
      before x_create_frame removes the unwind protect.  */
   if (!FRAME_LIVE_P (f))
-    return;
+    return Qnil;
 
   /* If frame is ``official'', nothing to do.  */
   if (NILP (Fmemq (frame, Vframe_list)))
@@ -1057,7 +1103,18 @@ unwind_create_frame (Lisp_Object frame)
       /* Check that reference counts are indeed correct.  */
       eassert (dpyinfo->terminal->image_cache->refcount == 
image_cache_refcount);
 #endif
+
+      return Qt;
     }
+
+  return Qnil;
+}
+
+
+static void
+do_unwind_create_frame (Lisp_Object frame)
+{
+  unwind_create_frame (frame);
 }
 
 /*
@@ -1191,7 +1248,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
   FRAME_DISPLAY_INFO (f) = dpyinfo;
 
   /* With FRAME_DISPLAY_INFO set up, this unwind-protect is safe.  */
-  record_unwind_protect (unwind_create_frame, frame);
+  record_unwind_protect (do_unwind_create_frame, frame);
 
   f->output_data.ns->window_desc = desc_ctr++;
   if (TYPE_RANGED_FIXNUMP (Window, parent))
@@ -1726,7 +1783,20 @@ Optional arg DIR_ONLY_P, if non-nil, means choose only 
directories.  */)
   ns_fd_data.ret = NO;
 #ifdef NS_IMPL_COCOA
   if (! NILP (mustmatch) || ! NILP (dir_only_p))
-    [panel setAllowedFileTypes: nil];
+    {
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 120000
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 120000
+      if ([panel respondsToSelector: @selector (setAllowedContentTypes:)])
+#endif
+       [panel setAllowedContentTypes: [NSArray array]];
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 120000
+      else
+#endif
+#endif
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 120000
+       [panel setAllowedFileTypes: nil];
+#endif
+    }
   if (dirS) [panel setDirectoryURL: [NSURL fileURLWithPath: dirS]];
   if (initS && NILP (Ffile_directory_p (init)))
     [panel setNameFieldStringValue: [initS lastPathComponent]];
@@ -1792,7 +1862,7 @@ ns_get_defaults_value (const char *key)
 DEFUN ("ns-get-resource", Fns_get_resource, Sns_get_resource, 2, 2, 0,
        doc: /* Return the value of the property NAME of OWNER from the 
defaults database.
 If OWNER is nil, Emacs is assumed.  */)
-     (Lisp_Object owner, Lisp_Object name)
+  (Lisp_Object owner, Lisp_Object name)
 {
   const char *value;
 
@@ -1813,7 +1883,7 @@ DEFUN ("ns-set-resource", Fns_set_resource, 
Sns_set_resource, 3, 3, 0,
        doc: /* Set property NAME of OWNER to VALUE, from the defaults database.
 If OWNER is nil, Emacs is assumed.
 If VALUE is nil, the default is removed.  */)
-     (Lisp_Object owner, Lisp_Object name, Lisp_Object value)
+  (Lisp_Object owner, Lisp_Object name, Lisp_Object value)
 {
   check_window_system (NULL);
   if (NILP (owner))
@@ -1840,7 +1910,7 @@ DEFUN ("x-server-max-request-size", 
Fx_server_max_request_size,
        Sx_server_max_request_size,
        0, 1, 0,
        doc: /* SKIP: real doc in xfns.c.  */)
-     (Lisp_Object terminal)
+  (Lisp_Object terminal)
 {
   check_ns_display_info (terminal);
   /* This function has no real equivalent under Nextstep.  Return nil to
@@ -2702,7 +2772,8 @@ Internal use only, use `display-monitor-attributes-list' 
instead.  */)
         }
       else
         {
-          // Flip y coordinate as NS has y starting from the bottom.
+          /* Flip y coordinate as NS screen coordinates originate from
+            the bottom.  */
           y = (short) (primary_display_height - fr.size.height - fr.origin.y);
           vy = (short) (primary_display_height -
                         vfr.size.height - vfr.origin.y);
@@ -2714,11 +2785,12 @@ Internal use only, use 
`display-monitor-attributes-list' instead.  */)
       m->geom.height = (unsigned short) fr.size.height;
 
       m->work.x = (short) vfr.origin.x;
-      // y is flipped on NS, so vy - y are pixels missing at the bottom,
-      // and fr.size.height - vfr.size.height are pixels missing in total.
-      // Pixels missing at top are
-      // fr.size.height - vfr.size.height - vy + y.
-      // work.y is then pixels missing at top + y.
+      /* y is flipped on NS, so vy - y are pixels missing at the
+        bottom, and fr.size.height - vfr.size.height are pixels
+        missing in total.
+
+        Pixels missing at top are fr.size.height - vfr.size.height -
+        vy + y.  work.y is then pixels missing at top + y.  */
       m->work.y = (short) (fr.size.height - vfr.size.height) - vy + y + y;
       m->work.width = (unsigned short) vfr.size.width;
       m->work.height = (unsigned short) vfr.size.height;
@@ -2733,13 +2805,14 @@ Internal use only, use 
`display-monitor-attributes-list' instead.  */)
       }
 
 #else
-      // Assume 92 dpi as x-display-mm-height/x-display-mm-width does.
+      /* Assume 92 dpi as x-display-mm-height and x-display-mm-width
+        do.  */
       m->mm_width = (int) (25.4 * fr.size.width / 92.0);
       m->mm_height = (int) (25.4 * fr.size.height / 92.0);
 #endif
     }
 
-  // Primary monitor is always first for NS.
+  /* Primary monitor is always ordered first for NS.  */
   attributes_list = ns_make_monitor_attribute_list (monitors, n_monitors,
                                                     0, "NS");
 
@@ -2769,16 +2842,10 @@ DEFUN ("x-display-color-cells", Fx_display_color_cells, 
Sx_display_color_cells,
   return make_fixnum (1 << min (dpyinfo->n_planes, 24));
 }
 
-/* TODO: move to xdisp or similar */
 static void
-compute_tip_xy (struct frame *f,
-                Lisp_Object parms,
-                Lisp_Object dx,
-                Lisp_Object dy,
-                int width,
-                int height,
-                int *root_x,
-                int *root_y)
+compute_tip_xy (struct frame *f, Lisp_Object parms, Lisp_Object dx,
+               Lisp_Object dy, int width, int height, int *root_x,
+               int *root_y)
 {
   Lisp_Object left, top, right, bottom;
   NSPoint pt;
@@ -2847,6 +2914,299 @@ compute_tip_xy (struct frame *f,
     *root_y = screen.frame.origin.y + screen.frame.size.height - height;
 }
 
+static void
+unwind_create_tip_frame (Lisp_Object frame)
+{
+  Lisp_Object deleted;
+
+  deleted = unwind_create_frame (frame);
+  if (EQ (deleted, Qt))
+    {
+      tip_window = NULL;
+      tip_frame = Qnil;
+    }
+}
+
+/* Create a frame for a tooltip on the display described by DPYINFO.
+   PARMS is a list of frame parameters.  TEXT is the string to
+   display in the tip frame.  Value is the frame.
+
+   Note that functions called here, esp. gui_default_parameter can
+   signal errors, for instance when a specified color name is
+   undefined.  We have to make sure that we're in a consistent state
+   when this happens.  */
+
+static Lisp_Object
+ns_create_tip_frame (struct ns_display_info *dpyinfo, Lisp_Object parms)
+{
+  struct frame *f;
+  Lisp_Object frame;
+  Lisp_Object name;
+  specpdl_ref count = SPECPDL_INDEX ();
+  bool face_change_before = face_change;
+
+  if (!dpyinfo->terminal->name)
+    error ("Terminal is not live, can't create new frames on it");
+
+  parms = Fcopy_alist (parms);
+
+  /* Get the name of the frame to use for resource lookup.  */
+  name = gui_display_get_arg (dpyinfo, parms, Qname, "name", "Name",
+                              RES_TYPE_STRING);
+  if (!STRINGP (name)
+      && !EQ (name, Qunbound)
+      && !NILP (name))
+    error ("Invalid frame name--not a string or nil");
+
+  frame = Qnil;
+  f = make_frame (false);
+  f->wants_modeline = false;
+  XSETFRAME (frame, f);
+  record_unwind_protect (unwind_create_tip_frame, frame);
+
+  f->terminal = dpyinfo->terminal;
+
+  f->output_method = output_ns;
+  f->output_data.ns = xzalloc (sizeof *f->output_data.ns);
+  f->tooltip = true;
+
+  FRAME_FONTSET (f) = -1;
+  FRAME_DISPLAY_INFO (f) = dpyinfo;
+
+  block_input ();
+#ifdef NS_IMPL_COCOA
+  mac_register_font_driver (f);
+#else
+  register_font_driver (&nsfont_driver, f);
+#endif
+  unblock_input ();
+
+  image_cache_refcount =
+    FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
+
+  gui_default_parameter (f, parms, Qfont_backend, Qnil,
+                         "fontBackend", "FontBackend", RES_TYPE_STRING);
+
+  {
+#ifdef NS_IMPL_COCOA
+    /* use for default font name */
+    id font = [NSFont userFixedPitchFontOfSize: -1.0]; /* default */
+    gui_default_parameter (f, parms, Qfontsize,
+                           make_fixnum (0 /* (int)[font pointSize] */),
+                           "fontSize", "FontSize", RES_TYPE_NUMBER);
+    // Remove ' Regular', not handled by backends.
+    char *fontname = xstrdup ([[font displayName] UTF8String]);
+    int len = strlen (fontname);
+    if (len > 8 && strcmp (fontname + len - 8, " Regular") == 0)
+      fontname[len-8] = '\0';
+    gui_default_parameter (f, parms, Qfont,
+                           build_string (fontname),
+                           "font", "Font", RES_TYPE_STRING);
+    xfree (fontname);
+#else
+    gui_default_parameter (f, parms, Qfont,
+                           build_string ("fixed"),
+                           "font", "Font", RES_TYPE_STRING);
+#endif
+  }
+
+  gui_default_parameter (f, parms, Qborder_width, make_fixnum (0),
+                         "borderWidth", "BorderWidth", RES_TYPE_NUMBER);
+
+  /* This defaults to 1 in order to match xterm.  We recognize either
+     internalBorderWidth or internalBorder (which is what xterm calls
+     it).  */
+  if (NILP (Fassq (Qinternal_border_width, parms)))
+    {
+      Lisp_Object value;
+
+      value = gui_display_get_arg (dpyinfo, parms, Qinternal_border_width,
+                                   "internalBorder", "internalBorder",
+                                   RES_TYPE_NUMBER);
+      if (! EQ (value, Qunbound))
+       parms = Fcons (Fcons (Qinternal_border_width, value),
+                      parms);
+    }
+
+  gui_default_parameter (f, parms, Qinternal_border_width, make_fixnum (1),
+                         "internalBorderWidth", "internalBorderWidth",
+                         RES_TYPE_NUMBER);
+  gui_default_parameter (f, parms, Qright_divider_width, make_fixnum (0),
+                         NULL, NULL, RES_TYPE_NUMBER);
+  gui_default_parameter (f, parms, Qbottom_divider_width, make_fixnum (0),
+                         NULL, NULL, RES_TYPE_NUMBER);
+
+  /* Also do the stuff which must be set before the window exists.  */
+  gui_default_parameter (f, parms, Qforeground_color, build_string ("black"),
+                         "foreground", "Foreground", RES_TYPE_STRING);
+  gui_default_parameter (f, parms, Qbackground_color, build_string ("white"),
+                         "background", "Background", RES_TYPE_STRING);
+  gui_default_parameter (f, parms, Qmouse_color, build_string ("black"),
+                         "pointerColor", "Foreground", RES_TYPE_STRING);
+  gui_default_parameter (f, parms, Qcursor_color, build_string ("black"),
+                         "cursorColor", "Foreground", RES_TYPE_STRING);
+  gui_default_parameter (f, parms, Qborder_color, build_string ("black"),
+                         "borderColor", "BorderColor", RES_TYPE_STRING);
+  gui_default_parameter (f, parms, Qno_special_glyphs, Qnil,
+                         NULL, NULL, RES_TYPE_BOOLEAN);
+
+  /* Init faces before gui_default_parameter is called for the
+     scroll-bar-width parameter because otherwise we end up in
+     init_iterator with a null face cache, which should not happen.  */
+  init_frame_faces (f);
+
+  f->output_data.ns->parent_desc = FRAME_DISPLAY_INFO (f)->root_window;
+
+  gui_default_parameter (f, parms, Qinhibit_double_buffering, Qnil,
+                         "inhibitDoubleBuffering", "InhibitDoubleBuffering",
+                         RES_TYPE_BOOLEAN);
+
+  gui_figure_window_size (f, parms, false, false);
+
+  block_input ();
+  [[EmacsView alloc] initFrameFromEmacs: f];
+  ns_icon (f, parms);
+  unblock_input ();
+
+  gui_default_parameter (f, parms, Qauto_raise, Qnil,
+                         "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN);
+  gui_default_parameter (f, parms, Qauto_lower, Qnil,
+                         "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN);
+  gui_default_parameter (f, parms, Qcursor_type, Qbox,
+                         "cursorType", "CursorType", RES_TYPE_SYMBOL);
+  gui_default_parameter (f, parms, Qalpha, Qnil,
+                         "alpha", "Alpha", RES_TYPE_NUMBER);
+
+  /* Add `tooltip' frame parameter's default value. */
+  if (NILP (Fframe_parameter (frame, Qtooltip)))
+    {
+      AUTO_FRAME_ARG (arg, Qtooltip, Qt);
+      Fmodify_frame_parameters (frame, arg);
+    }
+
+  /* FIXME - can this be done in a similar way to normal frames?
+     https://lists.gnu.org/r/emacs-devel/2007-10/msg00641.html */
+
+  /* Set the `display-type' frame parameter before setting up faces. */
+  {
+    Lisp_Object disptype = intern ("color");
+
+    if (NILP (Fframe_parameter (frame, Qdisplay_type)))
+      {
+       AUTO_FRAME_ARG (arg, Qdisplay_type, disptype);
+       Fmodify_frame_parameters (frame, arg);
+      }
+  }
+
+  /* Set up faces after all frame parameters are known.  This call
+     also merges in face attributes specified for new frames.
+
+     Frame parameters may be changed if .Xdefaults contains
+     specifications for the default font.  For example, if there is an
+     `Emacs.default.attributeBackground: pink', the `background-color'
+     attribute of the frame gets set, which let's the internal border
+     of the tooltip frame appear in pink.  Prevent this.  */
+  {
+    Lisp_Object bg = Fframe_parameter (frame, Qbackground_color);
+
+    call2 (Qface_set_after_frame_default, frame, Qnil);
+
+    if (!EQ (bg, Fframe_parameter (frame, Qbackground_color)))
+      {
+       AUTO_FRAME_ARG (arg, Qbackground_color, bg);
+       Fmodify_frame_parameters (frame, arg);
+      }
+  }
+
+  f->no_split = true;
+
+  /* Now that the frame will be official, it counts as a reference to
+     its display and terminal.  */
+  f->terminal->reference_count++;
+
+  /* It is now ok to make the frame official even if we get an error
+     below.  And the frame needs to be on Vframe_list or making it
+     visible won't work.  */
+  Vframe_list = Fcons (frame, Vframe_list);
+  f->can_set_window_size = true;
+  adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f),
+                    0, true, Qtip_frame);
+
+  /* Setting attributes of faces of the tooltip frame from resources
+     and similar will set face_change, which leads to the clearing of
+     all current matrices.  Since this isn't necessary here, avoid it
+     by resetting face_change to the value it had before we created
+     the tip frame.  */
+  face_change = face_change_before;
+
+  /* Discard the unwind_protect.  */
+  return unbind_to (count, frame);
+}
+
+static Lisp_Object
+x_hide_tip (bool delete)
+{
+  if (!NILP (tip_timer))
+    {
+      call1 (intern ("cancel-timer"), tip_timer);
+      tip_timer = Qnil;
+    }
+
+  if (!(ns_tooltip == nil || ![ns_tooltip isActive]))
+    {
+      [ns_tooltip hide];
+      tip_last_frame = Qnil;
+      return Qt;
+    }
+
+  if ((NILP (tip_last_frame) && NILP (tip_frame))
+      || (!use_system_tooltips
+         && !delete
+         && !NILP (tip_frame)
+         && FRAME_LIVE_P (XFRAME (tip_frame))
+         && !FRAME_VISIBLE_P (XFRAME (tip_frame))))
+    /* Either there's no tooltip to hide or it's an already invisible
+       Emacs tooltip and we don't want to change its type.  Return
+       quickly.  */
+    return Qnil;
+  else
+    {
+      specpdl_ref count;
+      Lisp_Object was_open = Qnil;
+
+      count = SPECPDL_INDEX ();
+      specbind (Qinhibit_redisplay, Qt);
+      specbind (Qinhibit_quit, Qt);
+
+      /* Now look whether there's an Emacs tip around.  */
+      if (!NILP (tip_frame))
+       {
+         struct frame *f = XFRAME (tip_frame);
+
+         if (FRAME_LIVE_P (f))
+           {
+             if (delete || use_system_tooltips)
+               {
+                 /* Delete the Emacs tooltip frame when DELETE is true
+                    or we change the tooltip type from an Emacs one to
+                    a GTK+ system one.  */
+                 delete_frame (tip_frame, Qnil);
+                 tip_frame = Qnil;
+               }
+             else
+               ns_make_frame_invisible (f);
+
+             was_open = Qt;
+           }
+         else
+           tip_frame = Qnil;
+       }
+      else
+       tip_frame = Qnil;
+
+      return unbind_to (count, was_open);
+    }
+}
 
 DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
        doc: /* SKIP: real doc in xfns.c.  */)
@@ -2854,11 +3214,18 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
 {
   int root_x, root_y;
   specpdl_ref count = SPECPDL_INDEX ();
-  struct frame *f;
+  struct frame *f, *tip_f;
+  struct window *w;
+  struct buffer *old_buffer;
+  struct text_pos pos;
+  int width, height;
+  int old_windows_or_buffers_changed = windows_or_buffers_changed;
+  specpdl_ref count_1;
+  Lisp_Object window, size, tip_buf;
   char *str;
-  NSSize size;
-  NSColor *color;
-  Lisp_Object t;
+  NSWindow *nswindow;
+
+  AUTO_STRING (tip, " *tip*");
 
   specbind (Qinhibit_redisplay, Qt);
 
@@ -2879,32 +3246,253 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
   else
     CHECK_FIXNUM (dy);
 
-  block_input ();
-  if (ns_tooltip == nil)
-    ns_tooltip = [[EmacsTooltip alloc] init];
+  tip_dx = dx;
+  tip_dy = dy;
+
+  if (use_system_tooltips)
+    {
+      NSSize size;
+      NSColor *color;
+      Lisp_Object t;
+
+      block_input ();
+      if (ns_tooltip == nil)
+       ns_tooltip = [[EmacsTooltip alloc] init];
+      else
+       Fx_hide_tip ();
+
+      t = gui_display_get_arg (NULL, parms, Qbackground_color, NULL, NULL,
+                              RES_TYPE_STRING);
+      if (ns_lisp_to_color (t, &color) == 0)
+       [ns_tooltip setBackgroundColor: color];
+
+      t = gui_display_get_arg (NULL, parms, Qforeground_color, NULL, NULL,
+                              RES_TYPE_STRING);
+      if (ns_lisp_to_color (t, &color) == 0)
+       [ns_tooltip setForegroundColor: color];
+
+      [ns_tooltip setText: str];
+      size = [ns_tooltip frame].size;
+
+      /* Move the tooltip window where the mouse pointer is.  Resize and
+        show it.  */
+      compute_tip_xy (f, parms, dx, dy, (int) size.width, (int) size.height,
+                     &root_x, &root_y);
+
+      [ns_tooltip showAtX: root_x Y: root_y for: XFIXNUM (timeout)];
+      unblock_input ();
+    }
   else
-    Fx_hide_tip ();
+    {
+      if (!NILP (tip_frame) && FRAME_LIVE_P (XFRAME (tip_frame)))
+       {
+         if (FRAME_VISIBLE_P (XFRAME (tip_frame))
+             && EQ (frame, tip_last_frame)
+             && !NILP (Fequal_including_properties (tip_last_string, string))
+             && !NILP (Fequal (tip_last_parms, parms)))
+           {
+             /* Only DX and DY have changed.  */
+             tip_f = XFRAME (tip_frame);
+             if (!NILP (tip_timer))
+               {
+                 call1 (intern ("cancel-timer"), tip_timer);
+                 tip_timer = Qnil;
+               }
+
+             nswindow = [FRAME_NS_VIEW (tip_f) window];
+
+             block_input ();
+             compute_tip_xy (tip_f, parms, dx, dy, FRAME_PIXEL_WIDTH (tip_f),
+                             FRAME_PIXEL_HEIGHT (tip_f), &root_x, &root_y);
+             [nswindow setFrame: NSMakeRect (root_x, root_y,
+                                             FRAME_PIXEL_WIDTH (tip_f),
+                                             FRAME_PIXEL_HEIGHT (tip_f))
+                        display: YES];
+             [nswindow setLevel: NSPopUpMenuWindowLevel];
+             [nswindow orderFront: NSApp];
+             [nswindow display];
+
+             SET_FRAME_VISIBLE (tip_f, 1);
+             unblock_input ();
+
+             goto start_timer;
+           }
+         else if (tooltip_reuse_hidden_frame && EQ (frame, tip_last_frame))
+           {
+             bool delete = false;
+             Lisp_Object tail, elt, parm, last;
+
+             /* Check if every parameter in PARMS has the same value in
+                tip_last_parms.  This may destruct tip_last_parms which,
+                however, will be recreated below.  */
+             for (tail = parms; CONSP (tail); tail = XCDR (tail))
+               {
+                 elt = XCAR (tail);
+                 parm = Fcar (elt);
+                 /* The left, top, right and bottom parameters are handled
+                    by compute_tip_xy so they can be ignored here.  */
+                 if (!EQ (parm, Qleft) && !EQ (parm, Qtop)
+                     && !EQ (parm, Qright) && !EQ (parm, Qbottom))
+                   {
+                     last = Fassq (parm, tip_last_parms);
+                     if (NILP (Fequal (Fcdr (elt), Fcdr (last))))
+                       {
+                         /* We lost, delete the old tooltip.  */
+                         delete = true;
+                         break;
+                       }
+                     else
+                       tip_last_parms =
+                         call2 (intern ("assq-delete-all"), parm, 
tip_last_parms);
+                   }
+                 else
+                   tip_last_parms =
+                     call2 (intern ("assq-delete-all"), parm, tip_last_parms);
+               }
+
+             /* Now check if every parameter in what is left of
+                tip_last_parms with a non-nil value has an association in
+                PARMS.  */
+             for (tail = tip_last_parms; CONSP (tail); tail = XCDR (tail))
+               {
+                 elt = XCAR (tail);
+                 parm = Fcar (elt);
+                 if (!EQ (parm, Qleft) && !EQ (parm, Qtop) && !EQ (parm, 
Qright)
+                     && !EQ (parm, Qbottom) && !NILP (Fcdr (elt)))
+                   {
+                     /* We lost, delete the old tooltip.  */
+                     delete = true;
+                     break;
+                   }
+               }
+
+             x_hide_tip (delete);
+           }
+         else
+           x_hide_tip (true);
+       }
+      else
+       x_hide_tip (true);
 
-  t = gui_display_get_arg (NULL, parms, Qbackground_color, NULL, NULL,
-                           RES_TYPE_STRING);
-  if (ns_lisp_to_color (t, &color) == 0)
-    [ns_tooltip setBackgroundColor: color];
+      tip_last_frame = frame;
+      tip_last_string = string;
+      tip_last_parms = parms;
 
-  t = gui_display_get_arg (NULL, parms, Qforeground_color, NULL, NULL,
-                           RES_TYPE_STRING);
-  if (ns_lisp_to_color (t, &color) == 0)
-    [ns_tooltip setForegroundColor: color];
+      if (NILP (tip_frame) || !FRAME_LIVE_P (XFRAME (tip_frame)))
+       {
+         /* Add default values to frame parameters.  */
+         if (NILP (Fassq (Qname, parms)))
+           parms = Fcons (Fcons (Qname, build_string ("tooltip")), parms);
+         if (NILP (Fassq (Qinternal_border_width, parms)))
+           parms = Fcons (Fcons (Qinternal_border_width, make_fixnum (3)), 
parms);
+         if (NILP (Fassq (Qborder_width, parms)))
+           parms = Fcons (Fcons (Qborder_width, make_fixnum (1)), parms);
+         if (NILP (Fassq (Qborder_color, parms)))
+           parms = Fcons (Fcons (Qborder_color, build_string ("lightyellow")), 
parms);
+         if (NILP (Fassq (Qbackground_color, parms)))
+           parms = Fcons (Fcons (Qbackground_color, build_string 
("lightyellow")),
+                          parms);
+
+         /* Create a frame for the tooltip, and record it in the global
+            variable tip_frame.  */
+         if (NILP (tip_frame = ns_create_tip_frame (FRAME_DISPLAY_INFO (f), 
parms)))
+           /* Creating the tip frame failed.  */
+           return unbind_to (count, Qnil);
+       }
 
-  [ns_tooltip setText: str];
-  size = [ns_tooltip frame].size;
+      tip_f = XFRAME (tip_frame);
+      window = FRAME_ROOT_WINDOW (tip_f);
+      tip_buf = Fget_buffer_create (tip, Qnil);
+      /* We will mark the tip window a "pseudo-window" below, and such
+        windows cannot have display margins.  */
+      bset_left_margin_cols (XBUFFER (tip_buf), make_fixnum (0));
+      bset_right_margin_cols (XBUFFER (tip_buf), make_fixnum (0));
+      set_window_buffer (window, tip_buf, false, false);
+      w = XWINDOW (window);
+      w->pseudo_window_p = true;
+      /* Try to avoid that `other-window' select us (Bug#47207).  */
+      Fset_window_parameter (window, Qno_other_window, Qt);
+
+      /* Set up the frame's root window.  Note: The following code does not
+        try to size the window or its frame correctly.  Its only purpose is
+        to make the subsequent text size calculations work.  The right
+        sizes should get installed when the toolkit gets back to us.  */
+      w->left_col = 0;
+      w->top_line = 0;
+      w->pixel_left = 0;
+      w->pixel_top = 0;
+
+      if (CONSP (Vx_max_tooltip_size)
+         && RANGED_FIXNUMP (1, XCAR (Vx_max_tooltip_size), INT_MAX)
+         && RANGED_FIXNUMP (1, XCDR (Vx_max_tooltip_size), INT_MAX))
+       {
+         w->total_cols = XFIXNAT (XCAR (Vx_max_tooltip_size));
+         w->total_lines = XFIXNAT (XCDR (Vx_max_tooltip_size));
+       }
+      else
+       {
+         w->total_cols = 80;
+         w->total_lines = 40;
+       }
 
-  /* Move the tooltip window where the mouse pointer is.  Resize and
-     show it.  */
-  compute_tip_xy (f, parms, dx, dy, (int)size.width, (int)size.height,
-                 &root_x, &root_y);
+      w->pixel_width = w->total_cols * FRAME_COLUMN_WIDTH (tip_f);
+      w->pixel_height = w->total_lines * FRAME_LINE_HEIGHT (tip_f);
+      FRAME_TOTAL_COLS (tip_f) = w->total_cols;
+      adjust_frame_glyphs (tip_f);
+
+      /* Insert STRING into root window's buffer and fit the frame to the
+        buffer.  */
+      count_1 = SPECPDL_INDEX ();
+      old_buffer = current_buffer;
+      set_buffer_internal_1 (XBUFFER (w->contents));
+      bset_truncate_lines (current_buffer, Qnil);
+      specbind (Qinhibit_read_only, Qt);
+      specbind (Qinhibit_modification_hooks, Qt);
+      specbind (Qinhibit_point_motion_hooks, Qt);
+      Ferase_buffer ();
+      Finsert (1, &string);
+      clear_glyph_matrix (w->desired_matrix);
+      clear_glyph_matrix (w->current_matrix);
+      SET_TEXT_POS (pos, BEGV, BEGV_BYTE);
+      try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+      /* Calculate size of tooltip window.  */
+      size = Fwindow_text_pixel_size (window, Qnil, Qnil, Qnil,
+                                     make_fixnum (w->pixel_height), Qnil,
+                                     Qnil);
+      /* Add the frame's internal border to calculated size.  */
+      width = XFIXNUM (Fcar (size)) + 2 * FRAME_INTERNAL_BORDER_WIDTH (tip_f);
+      height = XFIXNUM (Fcdr (size)) + 2 * FRAME_INTERNAL_BORDER_WIDTH (tip_f);
+
+      /* Calculate position of tooltip frame.  */
+      compute_tip_xy (tip_f, parms, dx, dy, width,
+                     height, &root_x, &root_y);
+
+      block_input ();
+      nswindow = [FRAME_NS_VIEW (tip_f) window];
+      [nswindow setFrame: NSMakeRect (root_x, root_y,
+                                     width, height)
+                display: YES];
+      [nswindow setLevel: NSPopUpMenuWindowLevel];
+      [nswindow orderFront: NSApp];
+      [nswindow display];
+
+      SET_FRAME_VISIBLE (tip_f, YES);
+      FRAME_PIXEL_WIDTH (tip_f) = width;
+      FRAME_PIXEL_HEIGHT (tip_f) = height;
+      unblock_input ();
 
-  [ns_tooltip showAtX: root_x Y: root_y for: XFIXNUM (timeout)];
-  unblock_input ();
+      w->must_be_updated_p = true;
+      update_single_window (w);
+      flush_frame (tip_f);
+      set_buffer_internal_1 (old_buffer);
+      unbind_to (count_1, Qnil);
+      windows_or_buffers_changed = old_windows_or_buffers_changed;
+
+    start_timer:
+      /* Let the tip disappear after timeout seconds.  */
+      tip_timer = call3 (intern ("run-at-time"), timeout, Qnil,
+                        intern ("x-hide-tip"));
+    }
 
   return unbind_to (count, Qnil);
 }
@@ -2914,10 +3502,7 @@ DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0,
        doc: /* SKIP: real doc in xfns.c.  */)
      (void)
 {
-  if (ns_tooltip == nil || ![ns_tooltip isActive])
-    return Qnil;
-  [ns_tooltip hide];
-  return Qt;
+  return x_hide_tip (!tooltip_reuse_hidden_frame);
 }
 
 /* Return geometric attributes of FRAME.  According to the value of
@@ -3215,6 +3800,48 @@ all_nonzero_ascii (unsigned char *str, ptrdiff_t n)
 }
 @end
 
+void
+ns_move_tooltip_to_mouse_location (NSPoint screen_point)
+{
+  int root_x, root_y;
+  NSSize size;
+  NSWindow *window;
+  struct frame *tip_f;
+
+  window = nil;
+
+  if (!FIXNUMP (tip_dx) || !FIXNUMP (tip_dy))
+    return;
+
+  if (ns_tooltip)
+    size = [ns_tooltip frame].size;
+  else if (!FRAMEP (tip_frame)
+          || !FRAME_LIVE_P (XFRAME (tip_frame))
+          || !FRAME_VISIBLE_P (XFRAME (tip_frame)))
+    return;
+  else
+    {
+      tip_f = XFRAME (tip_frame);
+      window = [FRAME_NS_VIEW (tip_f) window];
+      size = [window frame].size;
+    }
+
+  root_x = screen_point.x;
+  root_y = screen_point.y;
+
+  /* We can directly use `compute_tip_xy' here, since it doesn't cons
+     nearly as much as it does on X.  */
+  compute_tip_xy (NULL, Qnil, tip_dx, tip_dy, (int) size.width,
+                 (int) size.height, &root_x, &root_y);
+
+  if (ns_tooltip)
+    [ns_tooltip moveTo: NSMakePoint (root_x, root_y)];
+  else
+    [window setFrame: NSMakeRect (root_x, root_y,
+                                 size.width, size.height)
+            display: YES];
+}
+
 /* ==========================================================================
 
     Lisp interface declaration
@@ -3260,6 +3887,10 @@ be used as the image of the icon representing the frame. 
 */);
 Default is t.  */);
   ns_use_proxy_icon = true;
 
+  DEFVAR_LISP ("x-max-tooltip-size", Vx_max_tooltip_size,
+    doc: /* SKIP: real doc in xfns.c.  */);
+  Vx_max_tooltip_size = Fcons (make_fixnum (80), make_fixnum (40));
+
   defsubr (&Sns_read_file_name);
   defsubr (&Sns_get_resource);
   defsubr (&Sns_set_resource);
@@ -3309,6 +3940,21 @@ Default is t.  */);
   defsubr (&Sx_show_tip);
   defsubr (&Sx_hide_tip);
 
+  tip_timer = Qnil;
+  staticpro (&tip_timer);
+  tip_frame = Qnil;
+  staticpro (&tip_frame);
+  tip_last_frame = Qnil;
+  staticpro (&tip_last_frame);
+  tip_last_string = Qnil;
+  staticpro (&tip_last_string);
+  tip_last_parms = Qnil;
+  staticpro (&tip_last_parms);
+  tip_dx = Qnil;
+  staticpro (&tip_dx);
+  tip_dy = Qnil;
+  staticpro (&tip_dy);
+
 #if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
   defsubr (&Ssystem_move_file_to_trash);
 #endif
diff --git a/src/nsfont.m b/src/nsfont.m
index e913a50cb6..ae5e134e15 100644
--- a/src/nsfont.m
+++ b/src/nsfont.m
@@ -1177,9 +1177,6 @@ nsfont_draw (struct glyph_string *s, int from, int to, 
int x, int y,
   face = s->face;
 
   r.origin.x = x;
-  if (s->face->box != FACE_NO_BOX && s->first_glyph->left_box_line_p)
-    r.origin.x += max (s->face->box_vertical_line_width, 0);
-
   r.origin.y = y;
   r.size.height = FONT_HEIGHT (font);
 
diff --git a/src/nsmenu.m b/src/nsmenu.m
index b0ab12bb87..d02d7bae4b 100644
--- a/src/nsmenu.m
+++ b/src/nsmenu.m
@@ -52,6 +52,10 @@ EmacsMenu *svcsMenu;
 /* Nonzero means a menu is currently active.  */
 static int popup_activated_flag;
 
+/* The last frame whose menubar was updated.  (This is the frame whose
+   menu bar is currently being displayed.)  */
+static struct frame *last_menubar_frame;
+
 /* NOTE: toolbar implementation is at end,
    following complete menu implementation.  */
 
@@ -71,6 +75,12 @@ void
 free_frame_menubar (struct frame *f)
 {
   id menu = [NSApp mainMenu];
+
+  if (f != last_menubar_frame)
+    return;
+
+  last_menubar_frame = NULL;
+
   for (int i = [menu numberOfItems] - 1 ; i >= 0; i--)
     {
       NSMenuItem *item = (NSMenuItem *)[menu itemAtIndex:i];
@@ -135,9 +145,9 @@ ns_update_menubar (struct frame *f, bool deep_p)
 #endif
       return;
     }
-  XSETFRAME (Vmenu_updating_frame, f);
-/*fprintf (stderr, "ns_update_menubar: frame: %p\tdeep: %d\tsub: %p\n", f, 
deep_p, submenu); */
 
+  XSETFRAME (Vmenu_updating_frame, f);
+  last_menubar_frame = f;
   block_input ();
 
   /* Menu may have been created automatically; if so, discard it.  */
@@ -155,7 +165,7 @@ ns_update_menubar (struct frame *f, bool deep_p)
 
 #if NSMENUPROFILE
   ftime (&tb);
-  t = -(1000*tb.time+tb.millitm);
+  t = -(1000 * tb.time + tb.millitm);
 #endif
 
   if (deep_p)
@@ -413,7 +423,7 @@ ns_update_menubar (struct frame *f, bool deep_p)
 
 #if NSMENUPROFILE
   ftime (&tb);
-  t += 1000*tb.time+tb.millitm;
+  t += 1000 * tb.time + tb.millitm;
   fprintf (stderr, "Menu update took %ld msec.\n", t);
 #endif
 
@@ -741,15 +751,15 @@ prettify_key (const char *key)
   /* p = [view convertPoint:p fromView: nil]; */
   p.y = NSHeight ([view frame]) - p.y;
   e = [[view window] currentEvent];
-   event = [NSEvent mouseEventWithType: NSEventTypeRightMouseDown
-                              location: p
-                         modifierFlags: 0
-                             timestamp: [e timestamp]
-                          windowNumber: [[view window] windowNumber]
-                               context: nil
-                           eventNumber: 0 /* [e eventNumber] */
-                            clickCount: 1
-                              pressure: 0];
+  event = [NSEvent mouseEventWithType: NSEventTypeRightMouseDown
+                            location: p
+                       modifierFlags: 0
+                           timestamp: [e timestamp]
+                        windowNumber: [[view window] windowNumber]
+                             context: nil
+                         eventNumber: 0 /* [e eventNumber] */
+                          clickCount: 1
+                            pressure: 0];
 
   context_menu_value = -1;
   [NSMenu popUpContextMenu: self withEvent: event forView: view];
@@ -765,13 +775,33 @@ prettify_key (const char *key)
   NSInteger idx = [item tag];
   struct frame *f = SELECTED_FRAME ();
   Lisp_Object vec = f->menu_bar_vector;
-  Lisp_Object help, frame;
-
-  if (idx >= ASIZE (vec))
-    return;
+  Lisp_Object help, frame, *client_data;
 
   XSETFRAME (frame, f);
-  help = AREF (vec, idx + MENU_ITEMS_ITEM_HELP);
+
+  /* This menu isn't a menubar, so use the pointer to the popup menu
+     data.  */
+  if (context_menu_value != 0)
+    {
+      client_data = (Lisp_Object *) idx;
+
+      if (client_data)
+       help = client_data[MENU_ITEMS_ITEM_HELP];
+      else
+       help = Qnil;
+    }
+  /* Just dismiss any help-echo that might already be in progress if
+     no menu item will be highlighted.  */
+  else if (item == nil || idx <= 0)
+    help = Qnil;
+  else
+    {
+      if (idx >= ASIZE (vec))
+       return;
+
+      /* Otherwise, get the help data from the menu bar vector.  */
+      help = AREF (vec, idx + MENU_ITEMS_ITEM_HELP);
+    }
 
   popup_activated_flag++;
   if (STRINGP (help) || NILP (help))
@@ -849,37 +879,35 @@ ns_menu_show (struct frame *f, int x, int y, int 
menuflags,
   EmacsMenu *pmenu;
   NSPoint p;
   Lisp_Object tem;
-  specpdl_ref specpdl_count = SPECPDL_INDEX ();
+  specpdl_ref specpdl_count;
   widget_value *wv, *first_wv = 0;
+  widget_value *save_wv = 0, *prev_wv = 0;
+  widget_value **submenu_stack;
+  int submenu_depth = 0;
+  int first_pane = 1;
+  int i;
   bool keymaps = (menuflags & MENU_KEYMAPS);
 
+  USE_SAFE_ALLOCA;
+
   NSTRACE ("ns_menu_show");
 
   block_input ();
 
   p.x = x; p.y = y;
 
-  /* Don't GC due to a mysterious bug.  */
-  inhibit_garbage_collection ();
-
   /* now parse stage 2 as in ns_update_menubar */
   wv = make_widget_value ("contextmenu", NULL, true, Qnil);
   wv->button_type = BUTTON_TYPE_NONE;
   first_wv = wv;
 
-#if 0
-  /* FIXME: a couple of one-line differences prevent reuse.  */
-  wv = digest_single_submenu (0, menu_items_used, 0);
-#else
-  {
-  widget_value *save_wv = 0, *prev_wv = 0;
-  widget_value **submenu_stack
-    = alloca (menu_items_used * sizeof *submenu_stack);
-  /* Lisp_Object *subprefix_stack
-       = alloca (menu_items_used * sizeof *subprefix_stack); */
-  int submenu_depth = 0;
-  int first_pane = 1;
-  int i;
+  submenu_stack
+    = SAFE_ALLOCA (menu_items_used * sizeof *submenu_stack);
+
+  specpdl_count = SPECPDL_INDEX ();
+
+  /* Don't GC due to a mysterious bug.  */
+  inhibit_garbage_collection ();
 
   /* Loop over all panes and items, filling in the tree.  */
   i = 0;
@@ -1009,8 +1037,6 @@ ns_menu_show (struct frame *f, int x, int y, int 
menuflags,
          i += MENU_ITEMS_ITEM_LENGTH;
        }
     }
-  }
-#endif
 
   if (!NILP (title))
     {
@@ -1045,6 +1071,8 @@ ns_menu_show (struct frame *f, int x, int y, int 
menuflags,
   [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow];
   unbind_to (specpdl_count, Qnil);
   unblock_input ();
+
+  SAFE_FREE ();
   return tem;
 }
 
@@ -1469,6 +1497,15 @@ update_frame_tool_bar (struct frame *f)
   [timer retain];
 }
 
+- (void) moveTo: (NSPoint) screen_point
+{
+  [win setFrame: NSMakeRect (screen_point.x,
+                            screen_point.y,
+                            [self frame].size.width,
+                            [self frame].size.height)
+       display: YES];
+}
+
 - (void) hide
 {
   [win close];
@@ -1508,31 +1545,38 @@ pop_down_menu (void *arg)
 
   if (popup_activated_flag)
     {
-      block_input ();
       popup_activated_flag = 0;
       [panel close];
+      /* For some reason this is required on macOS, or the selected
+        frame gets the keyboard focus but doesn't become
+        highlighted.  */
+#ifdef NS_IMPL_COCOA
       [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow];
-      unblock_input ();
+#endif
+      discard_menu_items ();
     }
 }
 
-
 Lisp_Object
 ns_popup_dialog (struct frame *f, Lisp_Object header, Lisp_Object contents)
 {
-  id dialog;
+  EmacsDialogPanel *dialog;
   Lisp_Object tem, title;
   NSPoint p;
-  BOOL isQ;
+  BOOL is_question;
+  const char *error_name;
+  specpdl_ref specpdl_count;
 
   NSTRACE ("ns_popup_dialog");
+  specpdl_count = SPECPDL_INDEX ();
 
-  isQ = NILP (header);
-
+  is_question = NILP (header);
   check_window_system (f);
 
-  p.x = (int)f->left_pos + ((int)FRAME_COLUMN_WIDTH (f) * f->text_cols)/2;
-  p.y = (int)f->top_pos + (FRAME_LINE_HEIGHT (f) * f->text_lines)/2;
+  p.x = ((int) f->left_pos
+        + ((int) FRAME_COLUMN_WIDTH (f) * f->text_cols) / 2);
+  p.y = ((int) f->top_pos
+        + (FRAME_LINE_HEIGHT (f) * f->text_lines) / 2);
 
   title = Fcar (contents);
   CHECK_STRING (title);
@@ -1542,21 +1586,30 @@ ns_popup_dialog (struct frame *f, Lisp_Object header, 
Lisp_Object contents)
        the dialog.  */
     contents = list2 (title, Fcons (build_string ("Ok"), Qt));
 
-  block_input ();
-  dialog = [[EmacsDialogPanel alloc] initFromContents: contents
-                                           isQuestion: isQ];
+  record_unwind_protect_void (unuse_menu_items);
+  list_of_panes (list1 (contents));
 
-  {
-    specpdl_ref specpdl_count = SPECPDL_INDEX ();
-
-    record_unwind_protect_ptr (pop_down_menu, dialog);
-    popup_activated_flag = 1;
-    tem = [dialog runDialogAt: p];
-    unbind_to (specpdl_count, Qnil);  /* calls pop_down_menu */
-  }
+  block_input ();
+  dialog = [[EmacsDialogPanel alloc] initWithTitle: SSDATA (title)
+                                       isQuestion: is_question];
 
+  [dialog processMenuItems: menu_items
+                     used: menu_items_used
+          withErrorOutput: &error_name];
+  [dialog resizeBoundsPriorToDisplay];
   unblock_input ();
 
+  if (error_name)
+    {
+      discard_menu_items ();
+      [dialog close];
+      error ("%s", error_name);
+    }
+
+  record_unwind_protect_ptr (pop_down_menu, dialog);
+  popup_activated_flag = 1;
+  tem = [dialog runDialogAt: p];
+  unbind_to (specpdl_count, Qnil);
   return tem;
 }
 
@@ -1597,7 +1650,6 @@ ns_popup_dialog (struct frame *f, Lisp_Object header, 
Lisp_Object contents)
   NSImage *img;
 
   dialog_return   = Qundefined;
-  button_values   = NULL;
   area.origin.x   = 3*SPACER;
   area.origin.y   = 2*SPACER;
   area.size.width = ICONSIZE;
@@ -1681,58 +1733,65 @@ ns_popup_dialog (struct frame *f, Lisp_Object header, 
Lisp_Object contents)
 }
 
 
-- (BOOL)windowShouldClose: (id)sender
+- (BOOL)windowShouldClose: (id) sender
 {
   window_closed = YES;
-  [NSApp stop:self];
+  [NSApp stop: self];
   return NO;
 }
 
-- (void)dealloc
+- (void) dealloc
 {
-  xfree (button_values);
   [super dealloc];
 }
 
-- (void)process_dialog: (Lisp_Object) list
+- (void) processMenuItems: (Lisp_Object) menu_items
+                    used: (ptrdiff_t) menu_items_used
+         withErrorOutput: (const char **) error_name
 {
-  Lisp_Object item, lst = list;
-  int row = 0;
-  int buttons = 0, btnnr = 0;
+  int i, nb_buttons = 0, row = 0;
+  Lisp_Object item_name, enable;
 
-  for (; CONSP (lst); lst = XCDR (lst))
+  i = MENU_ITEMS_PANE_LENGTH;
+  *error_name = NULL;
+
+  /* Loop over all panes and items, filling in the tree.  */
+  while (i < menu_items_used)
     {
-      item = XCAR (list);
-      if (CONSP (item))
-        ++buttons;
-    }
+      item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME);
+      enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE);
 
-  if (buttons > 0)
-    button_values = xmalloc (buttons * sizeof *button_values);
+      if (NILP (item_name))
+       {
+         *error_name = "Submenu in dialog items";
+         return;
+       }
 
-  for (; CONSP (list); list = XCDR (list))
-    {
-      item = XCAR (list);
-      if (STRINGP (item))
-        {
-          [self addString: SSDATA (item) row: row++];
-        }
-      else if (CONSP (item))
-        {
-          button_values[btnnr] = XCDR (item);
-          [self addButton: SSDATA (XCAR (item)) value: btnnr row: row++];
-          ++btnnr;
-        }
-      else if (NILP (item))
-        {
-          [self addSplit];
-          row = 0;
-        }
+      if (EQ (item_name, Qquote))
+       /* This is the boundary between elements on the left and those
+          on the right, but that boundary is currently not handled on
+          NS.  */
+       continue;
+
+      if (nb_buttons > 9)
+       {
+         *error_name = "Too many dialog items";
+         return;
+       }
+
+      [self addButton: SSDATA (item_name)
+               value: (NSInteger) aref_addr (menu_items, i)
+                 row: row++
+              enable: !NILP (enable)];
+
+      i += MENU_ITEMS_ITEM_LENGTH;
+      nb_buttons++;
     }
 }
 
 
-- (void)addButton: (char *)str value: (int)tag row: (int)row
+- (void) addButton: (char *) str value: (NSInteger) tag
+              row: (int) row enable: (BOOL) enable
 {
   id cell;
 
@@ -1741,7 +1800,8 @@ ns_popup_dialog (struct frame *f, Lisp_Object header, 
Lisp_Object contents)
       [matrix addRow];
       rows++;
     }
-  cell = [matrix cellAtRow: row column: cols-1];
+
+  cell = [matrix cellAtRow: row column: cols - 1];
   [cell setTarget: self];
   [cell setAction: @selector (clicked: )];
   [cell setTitle: [NSString stringWithUTF8String: str]];
@@ -1751,7 +1811,7 @@ ns_popup_dialog (struct frame *f, Lisp_Object header, 
Lisp_Object contents)
 }
 
 
-- (void)addString: (char *)str row: (int)row
+- (void)addString: (char *) str row: (int) row
 {
   id cell;
 
@@ -1774,96 +1834,95 @@ ns_popup_dialog (struct frame *f, Lisp_Object header, 
Lisp_Object contents)
 }
 
 
-- (void)clicked: sender
+- (void) clicked: sender
 {
   NSArray *sellist = nil;
-  EMACS_INT seltag;
+  NSUInteger seltag;
+  Lisp_Object *selarray;
 
   sellist = [sender selectedCells];
+
   if ([sellist count] < 1)
     return;
 
   seltag = [[sellist objectAtIndex: 0] tag];
-  dialog_return = button_values[seltag];
-  [NSApp stop:self];
+  selarray = (void *) seltag;
+  dialog_return = selarray[MENU_ITEMS_ITEM_VALUE];
+  [NSApp stop: self];
 }
 
 
-- (instancetype)initFromContents: (Lisp_Object)contents isQuestion: (BOOL)isQ
+- (instancetype) initWithTitle: (char *) title_string
+                   isQuestion: (BOOL) is_question
 {
-  Lisp_Object head;
   [super init];
 
-  if (CONSP (contents))
-    {
-      head = Fcar (contents);
-      [self process_dialog: Fcdr (contents)];
-    }
-  else
-    head = contents;
+  if (title_string)
+    [title setStringValue:
+            [NSString stringWithUTF8String: title_string]];
 
-  if (STRINGP (head))
-      [title setStringValue:
-                 [NSString stringWithUTF8String: SSDATA (head)]];
-  else if (isQ == YES)
-      [title setStringValue: @"Question"];
+  if (is_question)
+    [command setStringValue: @"Question"];
   else
-      [title setStringValue: @"Information"];
+    [command setStringValue: @"Information"];
 
-  {
-    int i;
-    NSRect r, s, t;
+  return self;
+}
 
-    if (cols == 1 && rows > 1) /* Never told where to split.  */
-      {
-        [matrix addColumn];
-        for (i = 0; i < rows/2; i++)
-          {
-            [matrix putCell: [matrix cellAtRow: (rows+1)/2 column: 0]
-                      atRow: i column: 1];
-            [matrix removeRow: (rows+1)/2];
-          }
-      }
+- (void) resizeBoundsPriorToDisplay
+{
+  int i;
+  NSRect r, s, t;
+  NSSize csize;
 
-    [matrix sizeToFit];
+  if (cols == 1 && rows > 1)
     {
-      NSSize csize = [matrix cellSize];
-      if (csize.width < MINCELLWIDTH)
-        {
-          csize.width = MINCELLWIDTH;
-          [matrix setCellSize: csize];
-          [matrix sizeToCells];
-        }
+      [matrix addColumn];
+      for (i = 0; i < rows / 2; i++)
+       {
+         [matrix putCell: [matrix cellAtRow: (rows + 1) /2
+                                     column: 0]
+                   atRow: i column: 1];
+         [matrix removeRow: (rows + 1) / 2];
+       }
     }
 
-    [title sizeToFit];
-    [command sizeToFit];
+  [matrix sizeToFit];
 
-    t = [matrix frame];
-    r = [title frame];
-    if (r.size.width+r.origin.x > t.size.width+t.origin.x)
-      {
-        t.origin.x   = r.origin.x;
-        t.size.width = r.size.width;
-      }
-    r = [command frame];
-    if (r.size.width+r.origin.x > t.size.width+t.origin.x)
-      {
-        t.origin.x   = r.origin.x;
-        t.size.width = r.size.width;
-      }
+  csize = [matrix cellSize];
+  if (csize.width < MINCELLWIDTH)
+    {
+      csize.width = MINCELLWIDTH;
+      [matrix setCellSize: csize];
+      [matrix sizeToCells];
+    }
 
-    r = [self frame];
-    s = [(NSView *)[self contentView] frame];
-    r.size.width  += t.origin.x+t.size.width +2*SPACER-s.size.width;
-    r.size.height += t.origin.y+t.size.height+SPACER-s.size.height;
-    [self setFrame: r display: NO];
-  }
+  [title sizeToFit];
+  [command sizeToFit];
 
-  return self;
-}
+  t = [matrix frame];
+  r = [title frame];
+  if (r.size.width + r.origin.x > t.size.width + t.origin.x)
+    {
+      t.origin.x = r.origin.x;
+      t.size.width = r.size.width;
+    }
 
+  r = [command frame];
+  if (r.size.width + r.origin.x > t.size.width + t.origin.x)
+    {
+      t.origin.x = r.origin.x;
+      t.size.width = r.size.width;
+    }
 
+  r = [self frame];
+  s = [(NSView *) [self contentView] frame];
+  r.size.width += (t.origin.x + t.size.width
+                  + 2 * SPACER - s.size.width);
+  r.size.height += (t.origin.y + t.size.height
+                   + SPACER - s.size.height);
+  [self setFrame: r display: NO];
+}
 
 - (void)timeout_handler: (NSTimer *)timedEntry
 {
@@ -1881,11 +1940,11 @@ ns_popup_dialog (struct frame *f, Lisp_Object header, 
Lisp_Object contents)
   /* We use stop because stopModal/abortModal out of the main loop
      does not seem to work in 10.6.  But as we use stop we must send a
      real event so the stop is seen and acted upon.  */
-  [NSApp stop:self];
+  [NSApp stop: self];
   [NSApp postEvent: nxev atStart: NO];
 }
 
-- (Lisp_Object)runDialogAt: (NSPoint)p
+- (Lisp_Object) runDialogAt: (NSPoint) p
 {
   Lisp_Object ret = Qundefined;
 
@@ -1905,13 +1964,17 @@ ns_popup_dialog (struct frame *f, Lisp_Object header, 
Lisp_Object contents)
           [[NSRunLoop currentRunLoop] addTimer: tmo
                                        forMode: NSModalPanelRunLoopMode];
         }
+
       timer_fired = NO;
       dialog_return = Qundefined;
       [NSApp runModalForWindow: self];
       ret = dialog_return;
-      if (! timer_fired)
+
+      if (!timer_fired)
         {
-          if (tmo != nil) [tmo invalidate]; /* Cancels timer.  */
+          if (tmo != nil)
+           [tmo invalidate]; /* Cancels timer.  */
+
           break;
         }
     }
diff --git a/src/nsselect.m b/src/nsselect.m
index a7ef9df0e0..c46bfeaf42 100644
--- a/src/nsselect.m
+++ b/src/nsselect.m
@@ -17,13 +17,11 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 
-/*
-Originally by Carl Edman
-Updated by Christian Limpach (chris@nice.ch)
-OpenStep/Rhapsody port by Scott Bender (sbender@harmony-ds.com)
-macOS/Aqua port by Christophe de Dinechin (descubes@earthlink.net)
-GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu)
-*/
+/* Originally by Carl Edman
+   Updated by Christian Limpach (chris@nice.ch)
+   OpenStep/Rhapsody port by Scott Bender (sbender@harmony-ds.com)
+   macOS/Aqua port by Christophe de Dinechin (descubes@earthlink.net)
+   GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu)  
*/
 
 /* This should be the first include, as it may set up #defines affecting
    interpretation of even the system includes.  */
@@ -559,6 +557,225 @@ nxatoms_of_nsselect (void)
         nil] retain];
 }
 
+static void
+ns_decode_data_to_pasteboard (Lisp_Object type, Lisp_Object data,
+                             NSPasteboard *pasteboard)
+{
+  NSArray *types, *new;
+  NSMutableArray *temp;
+  Lisp_Object tem;
+  specpdl_ref count;
+#if !NS_USE_NSPasteboardTypeFileURL
+  NSURL *url;
+#endif
+
+  types = [pasteboard types];
+  count = SPECPDL_INDEX ();
+
+  CHECK_SYMBOL (type);
+
+  if (EQ (type, Qstring))
+    {
+      CHECK_STRING (data);
+
+      new = [types arrayByAddingObject: NSPasteboardTypeString];
+
+      [pasteboard declareTypes: new
+                        owner: nil];
+      [pasteboard setString: [NSString stringWithLispString: data]
+                   forType: NSPasteboardTypeString];
+    }
+  else if (EQ (type, Qfile))
+    {
+#if NS_USE_NSPasteboardTypeFileURL
+      if (CONSP (data))
+       new = [types arrayByAddingObject: NSPasteboardTypeURL];
+      else
+       new = [types arrayByAddingObject: NSPasteboardTypeFileURL];
+#else
+      new = [types arrayByAddingObject: NSFilenamesPboardType];
+#endif
+
+      [pasteboard declareTypes: new
+                        owner: nil];
+
+      if (STRINGP (data))
+       {
+#if NS_USE_NSPasteboardTypeFileURL
+         [pasteboard setString: [NSString stringWithLispString: data]
+                       forType: NSPasteboardTypeFileURL];
+#else
+         url = [NSURL URLWithString: [NSString stringWithLispString: data]];
+
+         if (!url)
+           signal_error ("Invalid file URL", data);
+
+         [pasteboard setString: [url path]
+                       forType: NSFilenamesPboardType];
+#endif
+       }
+      else
+       {
+         CHECK_LIST (data);
+         temp = [[NSMutableArray alloc] init];
+         record_unwind_protect_ptr (ns_release_object, temp);
+
+         for (tem = data; CONSP (tem); tem = XCDR (tem))
+           {
+             CHECK_STRING (XCAR (tem));
+
+             [temp addObject: [NSString stringWithLispString: XCAR (tem)]];
+           }
+         CHECK_LIST_END (tem, data);
+#if NS_USE_NSPasteboardTypeFileURL
+         [pasteboard setPropertyList: temp
+                     /* We have to use this deprecated pasteboard
+                        type, since Apple doesn't let us use
+                        dragImage:at: to drag multiple file URLs.  */
+                             forType: @"NSFilenamesPboardType"];
+#else
+         [pasteboard setPropertyList: temp
+                             forType: NSFilenamesPboardType];
+#endif
+         unbind_to (count, Qnil);
+       }
+    }
+  else
+    signal_error ("Unknown pasteboard type", type);
+}
+
+static void
+ns_lisp_to_pasteboard (Lisp_Object object,
+                      NSPasteboard *pasteboard)
+{
+  Lisp_Object tem, type, data;
+
+  [pasteboard declareTypes: [NSArray array]
+                    owner: nil];
+
+  CHECK_LIST (object);
+  for (tem = object; CONSP (tem); tem = XCDR (tem))
+    {
+      maybe_quit ();
+
+      type = Fcar (Fcar (tem));
+      data = Fcdr (Fcar (tem));
+
+      ns_decode_data_to_pasteboard (type, data, pasteboard);
+    }
+  CHECK_LIST_END (tem, object);
+}
+
+static NSDragOperation
+ns_dnd_action_to_operation (Lisp_Object action)
+{
+  if (EQ (action, QXdndActionCopy))
+    return NSDragOperationCopy;
+
+  if (EQ (action, QXdndActionMove))
+    return NSDragOperationMove;
+
+  if (EQ (action, QXdndActionLink))
+    return NSDragOperationLink;
+
+  signal_error ("Unsupported drag-and-drop action", action);
+}
+
+static Lisp_Object
+ns_dnd_action_from_operation (NSDragOperation operation)
+{
+  switch (operation)
+    {
+    case NSDragOperationCopy:
+      return QXdndActionCopy;
+
+    case NSDragOperationMove:
+      return QXdndActionMove;
+
+    case NSDragOperationLink:
+      return QXdndActionLink;
+
+    case NSDragOperationNone:
+      return Qnil;
+
+    default:
+      return QXdndActionPrivate;
+    }
+}
+
+DEFUN ("ns-begin-drag", Fns_begin_drag, Sns_begin_drag, 3, 6, 0,
+       doc: /* Begin a drag-and-drop operation on FRAME.
+
+FRAME must be a window system frame.  PBOARD is an alist of (TYPE
+. DATA), where TYPE is one of the following data types that determine
+the meaning of DATA:
+
+  - `string' means DATA should be a string describing text that will
+    be dragged to another program.
+
+  - `file' means DATA should be a file URL that will be dragged to
+    another program.  DATA may also be a list of file names; that
+    means each file in the list will be dragged to another program.
+
+ACTION is the action that will be taken by the drop target towards the
+data inside PBOARD.
+
+Return the action that the drop target actually chose to perform, or
+nil if no action was performed (either because there was no drop
+target, or the drop was rejected).  If RETURN-FRAME is the symbol
+`now', also return any frame that mouse moves into during the
+drag-and-drop operation, whilst simultaneously cancelling it.  Any
+other non-nil value means to do the same, but to wait for the mouse to
+leave FRAME first.
+
+If ALLOW-SAME-FRAME is nil, dropping on FRAME will result in the drop
+being ignored.
+
+FOLLOW-TOOLTIP means the same thing it does in `x-begin-drag'.  */)
+  (Lisp_Object frame, Lisp_Object pboard, Lisp_Object action,
+   Lisp_Object return_frame, Lisp_Object allow_same_frame,
+   Lisp_Object follow_tooltip)
+{
+  struct frame *f, *return_to;
+  NSPasteboard *pasteboard;
+  EmacsWindow *window;
+  NSDragOperation operation;
+  enum ns_return_frame_mode mode;
+  Lisp_Object val;
+
+  if (EQ (return_frame, Qnow))
+    mode = RETURN_FRAME_NOW;
+  else if (!NILP (return_frame))
+    mode = RETURN_FRAME_EVENTUALLY;
+  else
+    mode = RETURN_FRAME_NEVER;
+
+  if (NILP (pboard))
+    signal_error ("Empty pasteboard", pboard);
+
+  f = decode_window_system_frame (frame);
+  pasteboard = [NSPasteboard pasteboardWithName: NSPasteboardNameDrag];
+  window = (EmacsWindow *) [FRAME_NS_VIEW (f) window];
+
+  operation = ns_dnd_action_to_operation (action);
+  ns_lisp_to_pasteboard (pboard, pasteboard);
+
+  operation = [window beginDrag: operation
+                 forPasteboard: pasteboard
+                      withMode: mode
+                 returnFrameTo: &return_to
+                  prohibitSame: (BOOL) NILP (allow_same_frame)
+                 followTooltip: (BOOL) !NILP (follow_tooltip)];
+
+  if (return_to)
+    {
+      XSETFRAME (val, return_to);
+      return val;
+    }
+
+  return ns_dnd_action_from_operation (operation);
+}
+
 void
 syms_of_nsselect (void)
 {
@@ -568,12 +785,18 @@ syms_of_nsselect (void)
   DEFSYM (QFILE_NAME, "FILE_NAME");
 
   DEFSYM (QTARGETS, "TARGETS");
+  DEFSYM (QXdndActionCopy, "XdndActionCopy");
+  DEFSYM (QXdndActionMove, "XdndActionMove");
+  DEFSYM (QXdndActionLink, "XdndActionLink");
+  DEFSYM (QXdndActionPrivate, "XdndActionPrivate");
+  DEFSYM (Qnow, "now");
 
   defsubr (&Sns_disown_selection_internal);
   defsubr (&Sns_get_selection);
   defsubr (&Sns_own_selection_internal);
   defsubr (&Sns_selection_exists_p);
   defsubr (&Sns_selection_owner_p);
+  defsubr (&Sns_begin_drag);
 
   Vselection_alist = Qnil;
   staticpro (&Vselection_alist);
diff --git a/src/nsterm.h b/src/nsterm.h
index 9d8a6f486f..c4fdc7054f 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -408,23 +408,48 @@ typedef id instancetype;
 @end
 #endif
 
+enum ns_return_frame_mode
+  {
+    RETURN_FRAME_NEVER,
+    RETURN_FRAME_EVENTUALLY,
+    RETURN_FRAME_NOW,
+  };
+
 /* EmacsWindow  */
 @interface EmacsWindow : NSWindow
 {
   NSPoint grabOffset;
+  NSEvent *last_drag_event;
+  NSDragOperation drag_op;
+  NSDragOperation selected_op;
+
+  struct frame *dnd_return_frame;
+  enum ns_return_frame_mode dnd_mode;
+  BOOL dnd_allow_same_frame;
+  BOOL dnd_move_tooltip_with_frame;
 }
 
 #ifdef NS_IMPL_GNUSTEP
 - (NSInteger) orderedIndex;
 #endif
 
-- (instancetype)initWithEmacsFrame:(struct frame *)f;
-- (instancetype)initWithEmacsFrame:(struct frame *)f 
fullscreen:(BOOL)fullscreen screen:(NSScreen *)screen;
-- (void)createToolbar:(struct frame *)f;
-- (void)setParentChildRelationships;
-- (NSInteger)borderWidth;
-- (BOOL)restackWindow:(NSWindow *)win above:(BOOL)above;
-- (void)setAppearance;
+- (instancetype) initWithEmacsFrame: (struct frame *) f;
+- (instancetype) initWithEmacsFrame: (struct frame *) f
+                        fullscreen: (BOOL) fullscreen
+                            screen: (NSScreen *) screen;
+- (void) createToolbar: (struct frame *) f;
+- (void) setParentChildRelationships;
+- (NSInteger) borderWidth;
+- (BOOL) restackWindow: (NSWindow *) win above: (BOOL) above;
+- (void) setAppearance;
+- (void) setLastDragEvent: (NSEvent *) event;
+- (NSDragOperation) beginDrag: (NSDragOperation) op
+               forPasteboard: (NSPasteboard *) pasteboard
+                    withMode: (enum ns_return_frame_mode) mode
+               returnFrameTo: (struct frame **) frame_return
+                prohibitSame: (BOOL) prohibit_same_frame
+               followTooltip: (BOOL) follow_tooltip;
+- (BOOL) mustNotDropOn: (NSView *) receiver;
 @end
 
 
@@ -574,22 +599,32 @@ typedef id instancetype;
    ========================================================================== 
*/
 
 @interface EmacsDialogPanel : NSPanel
-   {
-   NSTextField *command;
-   NSTextField *title;
-   NSMatrix *matrix;
-   int rows, cols;
-   BOOL timer_fired, window_closed;
-   Lisp_Object dialog_return;
-   Lisp_Object *button_values;
-   }
-- (instancetype)initFromContents: (Lisp_Object)menu isQuestion: (BOOL)isQ;
-- (void)process_dialog: (Lisp_Object)list;
-- (void)addButton: (char *)str value: (int)tag row: (int)row;
-- (void)addString: (char *)str row: (int)row;
-- (void)addSplit;
-- (Lisp_Object)runDialogAt: (NSPoint)p;
-- (void)timeout_handler: (NSTimer *)timedEntry;
+{
+  NSTextField *command;
+  NSTextField *title;
+  NSMatrix *matrix;
+  int rows, cols;
+  BOOL timer_fired, window_closed;
+  Lisp_Object dialog_return;
+}
+
+- (instancetype) initWithTitle: (char *) title_str
+                   isQuestion: (BOOL) is_question;
+- (void) processMenuItems: (Lisp_Object) menu_items
+                    used: (ptrdiff_t) menu_items_used
+         withErrorOutput: (const char **) error_name;
+
+- (void) addButton: (char *) str
+            value: (NSInteger) tag
+              row: (int) row
+           enable: (BOOL) enable;
+- (void) addString: (char *) str
+              row: (int) row;
+- (void) addSplit;
+- (void) resizeBoundsPriorToDisplay;
+
+- (Lisp_Object) runDialogAt: (NSPoint) p;
+- (void) timeout_handler: (NSTimer *) timedEntry;
 @end
 
 #ifdef NS_IMPL_COCOA
@@ -597,19 +632,21 @@ typedef id instancetype;
 #else
 @interface EmacsTooltip : NSObject
 #endif
-  {
-    NSWindow *win;
-    NSTextField *textField;
-    NSTimer *timer;
-  }
+{
+  NSWindow *win;
+  NSTextField *textField;
+  NSTimer *timer;
+}
+
 - (instancetype) init;
-- (void) setText: (char *)text;
-- (void) setBackgroundColor: (NSColor *)col;
-- (void) setForegroundColor: (NSColor *)col;
-- (void) showAtX: (int)x Y: (int)y for: (int)seconds;
+- (void) setText: (char *) text;
+- (void) setBackgroundColor: (NSColor *) col;
+- (void) setForegroundColor: (NSColor *) col;
+- (void) showAtX: (int) x Y: (int) y for: (int) seconds;
 - (void) hide;
 - (BOOL) isActive;
 - (NSRect) frame;
+- (void) moveTo: (NSPoint) screen_point;
 @end
 
 
@@ -1107,6 +1144,9 @@ extern const char *ns_get_pending_menu_title (void);
 #endif
 
 /* Implemented in nsfns, published in nsterm.  */
+#ifdef __OBJC__
+extern void ns_move_tooltip_to_mouse_location (NSPoint);
+#endif
 extern void ns_implicitly_set_name (struct frame *f, Lisp_Object arg,
                                     Lisp_Object oldval);
 extern void ns_set_scroll_bar_default_width (struct frame *f);
@@ -1176,6 +1216,7 @@ extern size_t ns_image_size_in_bytes (void *img);
 /* This in nsterm.m */
 extern float ns_antialias_threshold;
 extern void ns_make_frame_visible (struct frame *f);
+extern void ns_make_frame_invisible (struct frame *f);
 extern void ns_iconify_frame (struct frame *f);
 extern void ns_set_undecorated (struct frame *f, Lisp_Object new_value,
                                 Lisp_Object old_value);
@@ -1312,6 +1353,7 @@ enum NSWindowTabbingMode
 #if !defined (NS_IMPL_COCOA) || !defined (MAC_OS_X_VERSION_10_13)
 /* Deprecated in macOS 10.13.  */
 #define NSPasteboardNameGeneral NSGeneralPboard
+#define NSPasteboardNameDrag NSDragPboard
 #endif
 
 #if !defined (NS_IMPL_COCOA) || !defined (MAC_OS_X_VERSION_10_14)
@@ -1329,5 +1371,6 @@ enum NSWindowTabbingMode
 #define NSControlStateValueOn NSOnState
 #define NSControlStateValueOff NSOffState
 #define NSBezelStyleRounded NSRoundedBezelStyle
+#define NSButtonTypeMomentaryPushIn NSMomentaryPushInButton
 #endif
 #endif /* HAVE_NS */
diff --git a/src/nsterm.m b/src/nsterm.m
index fef7f0dc6c..891d52ea3f 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -79,6 +79,9 @@ static EmacsMenu *dockMenu;
 static EmacsMenu *mainMenu;
 #endif
 
+/* The last known monitor attributes list.  */
+static Lisp_Object last_known_monitors;
+
 /* ==========================================================================
 
    NSTRACE, Trace support.
@@ -89,8 +92,8 @@ static EmacsMenu *mainMenu;
 
 /* The following use "volatile" since they can be accessed from
    parallel threads.  */
-volatile int nstrace_num = 0;
-volatile int nstrace_depth = 0;
+volatile int nstrace_num;
+volatile int nstrace_depth;
 
 /* When 0, no trace is emitted.  This is used by NSTRACE_WHEN and
    NSTRACE_UNLESS to silence functions called.
@@ -101,33 +104,41 @@ volatile int nstrace_depth = 0;
 volatile int nstrace_enabled_global = 1;
 
 /* Called when nstrace_enabled goes out of scope.  */
-void nstrace_leave(int * pointer_to_nstrace_enabled)
+void
+nstrace_leave (int *pointer_to_nstrace_enabled)
 {
   if (*pointer_to_nstrace_enabled)
-    {
-      --nstrace_depth;
-    }
+    --nstrace_depth;
 }
 
 
 /* Called when nstrace_saved_enabled_global goes out of scope.  */
-void nstrace_restore_global_trace_state(int * pointer_to_saved_enabled_global)
+void
+nstrace_restore_global_trace_state (int *pointer_to_saved_enabled_global)
 {
   nstrace_enabled_global = *pointer_to_saved_enabled_global;
 }
 
 
-char const * nstrace_fullscreen_type_name (int fs_type)
+const char *
+nstrace_fullscreen_type_name (int fs_type)
 {
   switch (fs_type)
     {
-    case -1:                   return "-1";
-    case FULLSCREEN_NONE:      return "FULLSCREEN_NONE";
-    case FULLSCREEN_WIDTH:     return "FULLSCREEN_WIDTH";
-    case FULLSCREEN_HEIGHT:    return "FULLSCREEN_HEIGHT";
-    case FULLSCREEN_BOTH:      return "FULLSCREEN_BOTH";
-    case FULLSCREEN_MAXIMIZED: return "FULLSCREEN_MAXIMIZED";
-    default:                   return "FULLSCREEN_?????";
+    case -1:
+      return "-1";
+    case FULLSCREEN_NONE:
+      return "FULLSCREEN_NONE";
+    case FULLSCREEN_WIDTH:
+      return "FULLSCREEN_WIDTH";
+    case FULLSCREEN_HEIGHT:
+      return "FULLSCREEN_HEIGHT";
+    case FULLSCREEN_BOTH:
+      return "FULLSCREEN_BOTH";
+    case FULLSCREEN_MAXIMIZED:
+      return "FULLSCREEN_MAXIMIZED";
+    default:
+      return "FULLSCREEN_?????";
     }
 }
 #endif
@@ -429,28 +440,28 @@ ev_modifiers_helper (unsigned int flags, unsigned int 
left_mask,
 
 /* This is a piece of code which is common to all the event handling
    methods.  Maybe it should even be a function.  */
-#define EV_TRAILER(e)                                                   \
-  {                                                                     \
-    XSETFRAME (emacs_event->frame_or_window, emacsframe);               \
-    EV_TRAILER2 (e);                                                    \
+#define EV_TRAILER(e)                                          \
+  {                                                            \
+    XSETFRAME (emacs_event->frame_or_window, emacsframe);      \
+    EV_TRAILER2 (e);                                           \
   }
 
 #define EV_TRAILER2(e)                                                  \
   {                                                                     \
-      if (e) emacs_event->timestamp = EV_TIMESTAMP (e);                 \
-      if (q_event_ptr)                                                  \
-        {                                                               \
-          Lisp_Object tem = Vinhibit_quit;                              \
-          Vinhibit_quit = Qt;                                           \
-          n_emacs_events_pending++;                                     \
-          kbd_buffer_store_event_hold (emacs_event, q_event_ptr);       \
-          Vinhibit_quit = tem;                                          \
-        }                                                               \
-      else                                                              \
-        hold_event (emacs_event);                                       \
-      EVENT_INIT (*emacs_event);                                        \
-      ns_send_appdefined (-1);                                          \
-    }
+    if (e) emacs_event->timestamp = EV_TIMESTAMP (e);                  \
+    if (q_event_ptr)                                                   \
+      {                                                                        
\
+       Lisp_Object tem = Vinhibit_quit;                                \
+       Vinhibit_quit = Qt;                                             \
+       n_emacs_events_pending++;                                       \
+       kbd_buffer_store_event_hold (emacs_event, q_event_ptr);         \
+       Vinhibit_quit = tem;                                            \
+      }                                                                        
\
+    else                                                               \
+      hold_event (emacs_event);                                                
\
+    EVENT_INIT (*emacs_event);                                         \
+    ns_send_appdefined (-1);                                           \
+  }
 
 
 /* TODO: Get rid of need for these forward declarations.  */
@@ -1517,7 +1528,7 @@ ns_make_frame_visible (struct frame *f)
 }
 
 
-static void
+void
 ns_make_frame_invisible (struct frame *f)
 /* --------------------------------------------------------------------------
      Hide the window (X11 semantics)
@@ -1708,10 +1719,8 @@ ns_set_offset (struct frame *f, int xoff, int yoff, int 
change_grav)
 
 
 static void
-ns_set_window_size (struct frame *f,
-                    bool change_gravity,
-                    int width,
-                    int height)
+ns_set_window_size (struct frame *f, bool change_gravity,
+                    int width, int height)
 /* --------------------------------------------------------------------------
      Adjust window pixel size based on native sizes WIDTH and HEIGHT.
      Impl is a bit more complex than other terms, need to do some
@@ -2288,6 +2297,11 @@ ns_mouse_position (struct frame **fp, int insist, 
Lisp_Object *bar_window,
   struct frame *f = NULL;
   struct ns_display_info *dpyinfo;
   bool return_no_frame_flag = false;
+#ifdef NS_IMPL_COCOA
+  NSPoint screen_position;
+  NSInteger window_number;
+  NSWindow *w;
+#endif
 
   NSTRACE ("ns_mouse_position");
 
@@ -2314,18 +2328,29 @@ ns_mouse_position (struct frame **fp, int insist, 
Lisp_Object *bar_window,
      This doesn't work on GNUstep, although in recent versions there
      is compatibility code that makes it a noop.  */
 
-  NSPoint screen_position = [NSEvent mouseLocation];
-  NSInteger window_number = 0;
+  screen_position = [NSEvent mouseLocation];
+  window_number = 0;
+
   do
     {
-      NSWindow *w;
+      window_number = [NSWindow windowNumberAtPoint: screen_position
+                        belowWindowWithWindowNumber: window_number];
+      w = [NSApp windowWithWindowNumber: window_number];
 
-      window_number = [NSWindow windowNumberAtPoint:screen_position
-                        belowWindowWithWindowNumber:window_number];
-      w = [NSApp windowWithWindowNumber:window_number];
+      if ((EQ (track_mouse, Qdrag_source)
+          || EQ (track_mouse, Qdropping))
+         && w && [[w delegate] isKindOfClass: [EmacsTooltip class]])
+       continue;
 
-      if (w && [[w delegate] isKindOfClass:[EmacsView class]])
-        f = ((EmacsView *)[w delegate])->emacsframe;
+      if (w && [[w delegate] isKindOfClass: [EmacsView class]])
+        f = ((EmacsView *) [w delegate])->emacsframe;
+      else if (EQ (track_mouse, Qdrag_source))
+       break;
+
+      if (f && (EQ (track_mouse, Qdrag_source)
+               || EQ (track_mouse, Qdropping))
+         && FRAME_TOOLTIP_P (f))
+       continue;
     }
   while (window_number > 0 && !f);
 #endif
@@ -2340,6 +2365,9 @@ ns_mouse_position (struct frame **fp, int insist, 
Lisp_Object *bar_window,
   if (!FRAME_NS_P (f))
     f = NULL;
 
+  if (f && FRAME_TOOLTIP_P (f))
+    f = dpyinfo->last_mouse_frame;
+
   /* While dropping, use the last mouse frame only if there is no
      currently focused frame.  */
   if (!f && (EQ (track_mouse, Qdropping)
@@ -3079,7 +3107,9 @@ ns_draw_window_cursor (struct window *w, struct glyph_row 
*glyph_row,
       break;
     case HOLLOW_BOX_CURSOR:
       draw_phys_cursor_glyph (w, glyph_row, DRAW_NORMAL_TEXT);
-      [NSBezierPath strokeRect: r];
+
+      /* This works like it does in PostScript, not X Windows.  */
+      [NSBezierPath strokeRect: NSInsetRect (r, 0.5, 0.5)];
       break;
     case HBAR_CURSOR:
       NSRectFill (r);
@@ -3448,36 +3478,35 @@ ns_draw_box (NSRect r, CGFloat hthickness, CGFloat 
vthickness,
 
 static void
 ns_draw_relief (NSRect outer, int hthickness, int vthickness, char raised_p,
-               char top_p, char bottom_p, char left_p, char right_p,
-               struct glyph_string *s)
+               char top_p, char bottom_p, char left_p, char right_p,
+               struct glyph_string *s)
 /* --------------------------------------------------------------------------
     Draw a relief rect inside r, optionally leaving some sides open.
     Note we can't just use an NSDrawBezel command, because of the possibility
     of some sides not being drawn, and because the rect will be filled.
    -------------------------------------------------------------------------- 
*/
 {
-  static NSColor *baseCol = nil, *lightCol = nil, *darkCol = nil;
-  NSColor *newBaseCol = nil;
+  static NSColor *baseCol, *lightCol, *darkCol;
+  NSColor *newBaseCol;
   NSRect inner;
+  NSBezierPath *p;
+
+  baseCol = nil;
+  lightCol = nil;
+  newBaseCol = nil;
+  p = nil;
 
   NSTRACE ("ns_draw_relief");
 
   /* set up colors */
 
   if (s->face->use_box_color_for_shadows_p)
-    {
-      newBaseCol = [NSColor colorWithUnsignedLong:s->face->box_color];
-    }
-/*     else if (s->first_glyph->type == IMAGE_GLYPH
-          && s->img->pixmap
-          && !IMAGE_BACKGROUND_TRANSPARENT (s->img, s->f, 0))
-       {
-         newBaseCol = IMAGE_BACKGROUND  (s->img, s->f, 0);
-       } */
+    newBaseCol = [NSColor colorWithUnsignedLong: s->face->box_color];
   else
-    {
-      newBaseCol = [NSColor colorWithUnsignedLong:s->face->background];
-    }
+    newBaseCol = [NSColor colorWithUnsignedLong: s->face->background];
+
+  if (s->hl == DRAW_CURSOR)
+    newBaseCol = FRAME_CURSOR_COLOR (s->f);
 
   if (newBaseCol == nil)
     newBaseCol = [NSColor grayColor];
@@ -3487,35 +3516,49 @@ ns_draw_relief (NSRect outer, int hthickness, int 
vthickness, char raised_p,
       [baseCol release];
       baseCol = [newBaseCol retain];
       [lightCol release];
-      lightCol = [[baseCol highlightWithLevel: 0.2] retain];
+      lightCol = [[baseCol highlightWithLevel: 0.4] retain];
       [darkCol release];
-      darkCol = [[baseCol shadowWithLevel: 0.3] retain];
+      darkCol = [[baseCol shadowWithLevel: 0.4] retain];
     }
 
   /* Calculate the inner rectangle.  */
-  inner = NSMakeRect (NSMinX (outer) + (left_p ? hthickness : 0),
-                      NSMinY (outer) + (top_p ? vthickness : 0),
-                      NSWidth (outer) - (left_p ? hthickness : 0)
-                                      - (right_p ? hthickness : 0),
-                      NSHeight (outer) - (top_p ? vthickness : 0)
-                                       - (bottom_p ? vthickness : 0));
+  inner = outer;
+
+  if (left_p)
+    {
+      inner.origin.x += vthickness;
+      inner.size.width -= vthickness;
+    }
+
+  if (right_p)
+    inner.size.width -= vthickness;
+
+  if (top_p)
+    {
+      inner.origin.y += hthickness;
+      inner.size.height -= hthickness;
+    }
+
+  if (bottom_p)
+    inner.size.height -= hthickness;
 
   [(raised_p ? lightCol : darkCol) set];
 
   if (top_p || left_p)
     {
-      NSBezierPath *p = [NSBezierPath bezierPath];
-      [p moveToPoint:NSMakePoint (NSMinX (outer), NSMinY (outer))];
+      p = [NSBezierPath bezierPath];
+
+      [p moveToPoint: NSMakePoint (NSMinX (outer), NSMinY (outer))];
       if (top_p)
         {
-          [p lineToPoint:NSMakePoint (NSMaxX (outer), NSMinY (outer))];
-          [p lineToPoint:NSMakePoint (NSMaxX (inner), NSMinY (inner))];
+          [p lineToPoint: NSMakePoint (NSMaxX (outer), NSMinY (outer))];
+          [p lineToPoint: NSMakePoint (NSMaxX (inner), NSMinY (inner))];
         }
-      [p lineToPoint:NSMakePoint (NSMinX (inner), NSMinY (inner))];
+      [p lineToPoint: NSMakePoint (NSMinX (inner), NSMinY (inner))];
       if (left_p)
         {
-          [p lineToPoint:NSMakePoint (NSMinX (inner), NSMaxY (inner))];
-          [p lineToPoint:NSMakePoint (NSMinX (outer), NSMaxY (outer))];
+          [p lineToPoint: NSMakePoint (NSMinX (inner), NSMaxY (inner))];
+          [p lineToPoint: NSMakePoint (NSMinX (outer), NSMaxY (outer))];
         }
       [p closePath];
       [p fill];
@@ -3523,24 +3566,93 @@ ns_draw_relief (NSRect outer, int hthickness, int 
vthickness, char raised_p,
 
   [(raised_p ? darkCol : lightCol) set];
 
-    if (bottom_p || right_p)
+  if (bottom_p || right_p)
     {
-      NSBezierPath *p = [NSBezierPath bezierPath];
-      [p moveToPoint:NSMakePoint (NSMaxX (outer), NSMaxY (outer))];
+      p = [NSBezierPath bezierPath];
+
+      [p moveToPoint: NSMakePoint (NSMaxX (outer), NSMaxY (outer))];
       if (right_p)
         {
-          [p lineToPoint:NSMakePoint (NSMaxX (outer), NSMinY (outer))];
-          [p lineToPoint:NSMakePoint (NSMaxX (inner), NSMinY (inner))];
+          [p lineToPoint: NSMakePoint (NSMaxX (outer), NSMinY (outer))];
+          [p lineToPoint: NSMakePoint (NSMaxX (inner), NSMinY (inner))];
         }
       [p lineToPoint:NSMakePoint (NSMaxX (inner), NSMaxY (inner))];
       if (bottom_p)
         {
-          [p lineToPoint:NSMakePoint (NSMinX (inner), NSMaxY (inner))];
-          [p lineToPoint:NSMakePoint (NSMinX (outer), NSMaxY (outer))];
+          [p lineToPoint: NSMakePoint (NSMinX (inner), NSMaxY (inner))];
+          [p lineToPoint: NSMakePoint (NSMinX (outer), NSMaxY (outer))];
         }
       [p closePath];
       [p fill];
     }
+
+  /* If one of h/vthickness are more than 1, draw the outermost line
+     on the respective sides in the black relief color.  */
+
+  if (p)
+    [p removeAllPoints];
+  else
+    p = [NSBezierPath bezierPath];
+
+  if (hthickness > 1 && top_p)
+    {
+      [p moveToPoint: NSMakePoint (NSMinX (outer),
+                                  NSMinY (outer) + 0.5)];
+      [p lineToPoint: NSMakePoint (NSMaxX (outer),
+                                  NSMinY (outer) + 0.5)];
+    }
+
+  if (hthickness > 1 && bottom_p)
+    {
+      [p moveToPoint: NSMakePoint (NSMinX (outer),
+                                  NSMaxY (outer) - 0.5)];
+      [p lineToPoint: NSMakePoint (NSMaxX (outer),
+                                  NSMaxY (outer) - 0.5)];
+    }
+
+  if (vthickness > 1 && left_p)
+    {
+      [p moveToPoint: NSMakePoint (NSMinX (outer) + 0.5,
+                                  NSMinY (outer) + 0.5)];
+      [p lineToPoint: NSMakePoint (NSMinX (outer) + 0.5,
+                                  NSMaxY (outer) - 0.5)];
+    }
+
+  if (vthickness > 1 && left_p)
+    {
+      [p moveToPoint: NSMakePoint (NSMinX (outer) + 0.5,
+                                  NSMinY (outer) + 0.5)];
+      [p lineToPoint: NSMakePoint (NSMinX (outer) + 0.5,
+                                  NSMaxY (outer) - 0.5)];
+    }
+
+  [darkCol set];
+  [p stroke];
+
+  if (vthickness > 1 && hthickness > 1)
+    {
+      [FRAME_BACKGROUND_COLOR (s->f) set];
+
+      if (left_p && top_p)
+       [NSBezierPath fillRect: NSMakeRect (NSMinX (outer),
+                                           NSMinY (outer),
+                                           1, 1)];
+
+      if (right_p && top_p)
+       [NSBezierPath fillRect: NSMakeRect (NSMaxX (outer) - 1,
+                                           NSMinY (outer),
+                                           1, 1)];
+
+      if (right_p && bottom_p)
+       [NSBezierPath fillRect: NSMakeRect (NSMaxX (outer) - 1,
+                                           NSMaxY (outer) - 1,
+                                           1, 1)];
+
+      if (left_p && bottom_p)
+       [NSBezierPath fillRect: NSMakeRect (NSMinX (outer),
+                                           NSMaxY (outer) - 1,
+                                           1, 1)];
+    }
 }
 
 
@@ -3622,6 +3734,7 @@ ns_maybe_dumpglyphs_background (struct glyph_string *s, 
char force_p)
   if (!s->background_filled_p/* || s->hl == DRAW_MOUSE_FACE*/)
     {
       int box_line_width = max (s->face->box_horizontal_line_width, 0);
+
       if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width
          /* When xdisp.c ignores FONT_HEIGHT, we cannot trust font
             dimensions, since the actual glyphs might be much
@@ -3648,7 +3761,7 @@ ns_maybe_dumpglyphs_background (struct glyph_string *s, 
char force_p)
 
          NSRect r = NSMakeRect (s->x, s->y + box_line_width,
                                 s->background_width,
-                                s->height-2*box_line_width);
+                                s->height - 2 * box_line_width);
          NSRectFill (r);
 
          s->background_filled_p = 1;
@@ -3656,6 +3769,92 @@ ns_maybe_dumpglyphs_background (struct glyph_string *s, 
char force_p)
     }
 }
 
+static void
+ns_draw_image_relief (struct glyph_string *s)
+{
+  int x1, y1, thick;
+  bool raised_p, top_p, bot_p, left_p, right_p;
+  int extra_x, extra_y;
+  int x = s->x;
+  int y = s->ybase - image_ascent (s->img, s->face, &s->slice);
+
+  /* If first glyph of S has a left box line, start drawing it to the
+     right of that line.  */
+  if (s->face->box != FACE_NO_BOX
+      && s->first_glyph->left_box_line_p
+      && s->slice.x == 0)
+    x += max (s->face->box_vertical_line_width, 0);
+
+  /* If there is a margin around the image, adjust x- and y-position
+     by that margin.  */
+  if (s->slice.x == 0)
+    x += s->img->hmargin;
+  if (s->slice.y == 0)
+    y += s->img->vmargin;
+
+  if (s->hl == DRAW_IMAGE_SUNKEN
+      || s->hl == DRAW_IMAGE_RAISED)
+    {
+      if (s->face->id == TAB_BAR_FACE_ID)
+       thick = (tab_bar_button_relief < 0
+                ? DEFAULT_TAB_BAR_BUTTON_RELIEF
+                : min (tab_bar_button_relief, 1000000));
+      else
+       thick = (tool_bar_button_relief < 0
+                ? DEFAULT_TOOL_BAR_BUTTON_RELIEF
+                : min (tool_bar_button_relief, 1000000));
+      raised_p = s->hl == DRAW_IMAGE_RAISED;
+    }
+  else
+    {
+      thick = eabs (s->img->relief);
+      raised_p = s->img->relief > 0;
+    }
+
+  x1 = x + s->slice.width - 1;
+  y1 = y + s->slice.height - 1;
+
+  extra_x = extra_y = 0;
+  if (s->face->id == TAB_BAR_FACE_ID)
+    {
+      if (CONSP (Vtab_bar_button_margin)
+         && FIXNUMP (XCAR (Vtab_bar_button_margin))
+         && FIXNUMP (XCDR (Vtab_bar_button_margin)))
+       {
+         extra_x = XFIXNUM (XCAR (Vtab_bar_button_margin)) - thick;
+         extra_y = XFIXNUM (XCDR (Vtab_bar_button_margin)) - thick;
+       }
+      else if (FIXNUMP (Vtab_bar_button_margin))
+       extra_x = extra_y = XFIXNUM (Vtab_bar_button_margin) - thick;
+    }
+
+  if (s->face->id == TOOL_BAR_FACE_ID)
+    {
+      if (CONSP (Vtool_bar_button_margin)
+         && FIXNUMP (XCAR (Vtool_bar_button_margin))
+         && FIXNUMP (XCDR (Vtool_bar_button_margin)))
+       {
+         extra_x = XFIXNUM (XCAR (Vtool_bar_button_margin));
+         extra_y = XFIXNUM (XCDR (Vtool_bar_button_margin));
+       }
+      else if (FIXNUMP (Vtool_bar_button_margin))
+       extra_x = extra_y = XFIXNUM (Vtool_bar_button_margin);
+    }
+
+  top_p = bot_p = left_p = right_p = false;
+
+  if (s->slice.x == 0)
+    x -= thick + extra_x, left_p = true;
+  if (s->slice.y == 0)
+    y -= thick + extra_y, top_p = true;
+  if (s->slice.x + s->slice.width == s->img->width)
+    x1 += thick + extra_x, right_p = true;
+  if (s->slice.y + s->slice.height == s->img->height)
+    y1 += thick + extra_y, bot_p = true;
+
+  ns_draw_relief (NSMakeRect (x, y, x1 - x + 1, y1 - y + 1), thick,
+                 thick, raised_p, top_p, bot_p, left_p, right_p, s);
+}
 
 static void
 ns_dumpglyphs_image (struct glyph_string *s, NSRect r)
@@ -3667,8 +3866,6 @@ ns_dumpglyphs_image (struct glyph_string *s, NSRect r)
   int box_line_vwidth = max (s->face->box_horizontal_line_width, 0);
   int x = s->x, y = s->ybase - image_ascent (s->img, s->face, &s->slice);
   int bg_x, bg_y, bg_height;
-  int th;
-  char raised_p;
   NSRect br;
   struct face *face = s->face;
   NSColor *tdCol;
@@ -3762,51 +3959,29 @@ ns_dumpglyphs_image (struct glyph_string *s, NSRect r)
   if (s->hl == DRAW_CURSOR)
     {
       [FRAME_CURSOR_COLOR (s->f) set];
-      tdCol = [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)];
+      tdCol = [NSColor colorWithUnsignedLong: NS_FACE_BACKGROUND (face)];
     }
   else
-    {
-      tdCol = [NSColor colorWithUnsignedLong:NS_FACE_FOREGROUND (face)];
-    }
+    tdCol = [NSColor colorWithUnsignedLong: NS_FACE_FOREGROUND (face)];
 
   /* Draw underline, overline, strike-through.  */
   ns_draw_text_decoration (s, face, tdCol, br.size.width, br.origin.x);
 
-  /* Draw relief, if requested */
-  if (s->img->relief || s->hl ==DRAW_IMAGE_RAISED || s->hl ==DRAW_IMAGE_SUNKEN)
-    {
-      if (s->hl == DRAW_IMAGE_SUNKEN || s->hl == DRAW_IMAGE_RAISED)
-        {
-          th = (tool_bar_button_relief < 0
-               ? DEFAULT_TOOL_BAR_BUTTON_RELIEF
-               : min (tool_bar_button_relief, 1000000));
-          raised_p = (s->hl == DRAW_IMAGE_RAISED);
-        }
-      else
-        {
-          th = abs (s->img->relief);
-          raised_p = (s->img->relief > 0);
-        }
-
-      r.origin.x = x - th;
-      r.origin.y = y - th;
-      r.size.width = s->slice.width + 2*th-1;
-      r.size.height = s->slice.height + 2*th-1;
-      ns_draw_relief (r, th, th, raised_p,
-                      s->slice.y == 0,
-                      s->slice.y + s->slice.height == s->img->height,
-                      s->slice.x == 0,
-                      s->slice.x + s->slice.width == s->img->width, s);
-    }
+  /* If we must draw a relief around the image, do it.  */
+  if (s->img->relief
+      || s->hl == DRAW_IMAGE_RAISED
+      || s->hl == DRAW_IMAGE_SUNKEN)
+    ns_draw_image_relief (s);
 
-  /* If there is no mask, the background won't be seen,
-     so draw a rectangle on the image for the cursor.
-     Do this for all images, getting transparency right is not reliable.  */
+  /* If there is no mask, the background won't be seen, so draw a
+     rectangle on the image for the cursor.  Do this for all images,
+     getting transparency right is not reliable.  */
   if (s->hl == DRAW_CURSOR)
     {
       int thickness = abs (s->img->relief);
       if (thickness == 0) thickness = 1;
-      ns_draw_box (br, thickness, thickness, FRAME_CURSOR_COLOR (s->f), 1, 1);
+      ns_draw_box (br, thickness, thickness,
+                  FRAME_CURSOR_COLOR (s->f), 1, 1);
     }
 }
 
@@ -4035,6 +4210,10 @@ ns_draw_glyphless_glyph_string_foreground (struct 
glyph_string *s)
                      YES, YES);
       x += glyph->pixel_width;
    }
+
+  /* GCC 12 complains even though nothing ever uses s->char2b after
+     this function returns.  */
+  s->char2b = NULL;
 }
 
 static void
@@ -4363,11 +4542,14 @@ check_native_fs ()
 
 
 static int
-ns_read_socket (struct terminal *terminal, struct input_event *hold_quit)
+ns_read_socket_1 (struct terminal *terminal, struct input_event *hold_quit,
+                 BOOL no_release)
 /* --------------------------------------------------------------------------
      External (hook): Post an event to ourself and keep reading events until
      we read it back again.  In effect process all events which were waiting.
      From 21+ we have to manage the event buffer ourselves.
+
+     NO_RELEASE means not to touch the global autorelease pool.
    -------------------------------------------------------------------------- 
*/
 {
   struct input_event ev;
@@ -4398,11 +4580,14 @@ ns_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
       ns_init_events (&ev);
       q_event_ptr = hold_quit;
 
-      /* We manage autorelease pools by allocate/reallocate each time around
-         the loop; strict nesting is occasionally violated but seems not to
-         matter... earlier methods using full nesting caused major memory 
leaks.  */
-      [outerpool release];
-      outerpool = [[NSAutoreleasePool alloc] init];
+      if (!no_release)
+       {
+         /* We manage autorelease pools by allocate/reallocate each time around
+            the loop; strict nesting is occasionally violated but seems not to
+            matter... earlier methods using full nesting caused major memory 
leaks.  */
+         [outerpool release];
+         outerpool = [[NSAutoreleasePool alloc] init];
+       }
 
       /* If have pending open-file requests, attend to the next one of those.  
*/
       if (ns_pending_files && [ns_pending_files count] != 0
@@ -4441,6 +4626,12 @@ ns_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
   return nevents;
 }
 
+static int
+ns_read_socket (struct terminal *terminal, struct input_event *hold_quit)
+{
+  return ns_read_socket_1 (terminal, hold_quit, NO);
+}
+
 
 static int
 ns_select_1 (int nfds, fd_set *readfds, fd_set *writefds,
@@ -5022,11 +5213,22 @@ ns_update_window_end (struct window *w, bool 
cursor_on_p,
 }
 #endif
 
-/* This and next define (many of the) public functions in this file.  */
-/* gui_* are generic versions in xdisp.c that we, and other terms, get away
-         with using despite presence in the "system dependent" redisplay
-         interface.  In addition, many of the ns_ methods have code that is
-         shared with all terms, indicating need for further refactoring.  */
+static void
+ns_flush_display (struct frame *f)
+{
+  struct input_event ie;
+
+  EVENT_INIT (ie);
+  ns_read_socket_1 (FRAME_TERMINAL (f), &ie, YES);
+}
+
+/* This and next define (many of the) public functions in this
+   file.  */
+/* gui_* are generic versions in xdisp.c that we, and other terms, get
+   away with using despite presence in the "system dependent"
+   redisplay interface.  In addition, many of the ns_ methods have
+   code that is shared with all terms, indicating need for further
+   refactoring.  */
 extern frame_parm_handler ns_frame_parm_handlers[];
 static struct redisplay_interface ns_redisplay_interface =
 {
@@ -5043,7 +5245,7 @@ static struct redisplay_interface ns_redisplay_interface =
 #else
   ns_update_window_end,
 #endif
-  0, /* flush_display */
+  ns_flush_display,
   gui_clear_window_mouse_face,
   gui_get_glyph_overhangs,
   gui_fix_overlapping_area,
@@ -5064,6 +5266,39 @@ static struct redisplay_interface ns_redisplay_interface 
=
   ns_default_font_parameter
 };
 
+#ifdef NS_IMPL_COCOA
+static void
+ns_displays_reconfigured (CGDirectDisplayID display,
+                         CGDisplayChangeSummaryFlags flags,
+                         void *user_info)
+{
+  struct input_event ie;
+  union buffered_input_event *ev;
+  Lisp_Object new_monitors;
+
+  EVENT_INIT (ie);
+
+  new_monitors = Fns_display_monitor_attributes_list (Qnil);
+
+  if (!NILP (Fequal (new_monitors, last_known_monitors)))
+    return;
+
+  last_known_monitors = new_monitors;
+
+  ev = (kbd_store_ptr == kbd_buffer
+       ? kbd_buffer + KBD_BUFFER_SIZE - 1
+       : kbd_store_ptr - 1);
+
+  if (kbd_store_ptr != kbd_fetch_ptr
+      && ev->ie.kind == MONITORS_CHANGED_EVENT)
+    return;
+
+  ie.kind = MONITORS_CHANGED_EVENT;
+  XSETTERMINAL (ie.arg, x_display_list->terminal);
+
+  kbd_buffer_store_event (&ie);
+}
+#endif
 
 static void
 ns_delete_display (struct ns_display_info *dpyinfo)
@@ -5419,6 +5654,16 @@ ns_term_init (Lisp_Object display_name)
   catch_child_signal ();
 #endif
 
+#ifdef NS_IMPL_COCOA
+  /* Begin listening for display reconfiguration, so we can run the
+     appropriate hooks.  FIXME: is this called when the resolution of
+     a monitor changes?  */
+
+  CGDisplayRegisterReconfigurationCallback (ns_displays_reconfigured,
+                                           NULL);
+#endif
+  last_known_monitors = Fns_display_monitor_attributes_list (Qnil);
+
   NSTRACE_MSG ("ns_term_init done");
 
   unblock_input ();
@@ -5459,6 +5704,10 @@ ns_term_shutdown (int sig)
 
 - (id)init
 {
+#ifdef NS_IMPL_GNUSTEP
+  NSNotificationCenter *notification_center;
+#endif
+
   NSTRACE ("[EmacsApp init]");
 
   if ((self = [super init]))
@@ -5471,6 +5720,14 @@ ns_term_shutdown (int sig)
 #endif
     }
 
+#ifdef NS_IMPL_GNUSTEP
+  notification_center = [NSNotificationCenter defaultCenter];
+  [notification_center addObserver: self
+                         selector: @selector(updateMonitors:)
+                             name: 
NSApplicationDidChangeScreenParametersNotification
+                           object: nil];
+#endif
+
   return self;
 }
 
@@ -5483,11 +5740,11 @@ ns_term_shutdown (int sig)
 #define NSAppKitVersionNumber10_9 1265
 #endif
 
-    if ((int)NSAppKitVersionNumber != NSAppKitVersionNumber10_9)
-      {
-        [super run];
-        return;
-      }
+  if ((int) NSAppKitVersionNumber != NSAppKitVersionNumber10_9)
+    {
+      [super run];
+      return;
+    }
 
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
@@ -5671,6 +5928,36 @@ ns_term_shutdown (int sig)
   return YES;
 }
 
+#ifdef NS_IMPL_GNUSTEP
+- (void) updateMonitors: (NSNotification *) notification
+{
+  struct input_event ie;
+  union buffered_input_event *ev;
+  Lisp_Object new_monitors;
+
+  EVENT_INIT (ie);
+
+  new_monitors = Fns_display_monitor_attributes_list (Qnil);
+
+  if (!NILP (Fequal (new_monitors, last_known_monitors)))
+    return;
+
+  last_known_monitors = new_monitors;
+
+  ev = (kbd_store_ptr == kbd_buffer
+       ? kbd_buffer + KBD_BUFFER_SIZE - 1
+       : kbd_store_ptr - 1);
+
+  if (kbd_store_ptr != kbd_fetch_ptr
+      && ev->ie.kind == MONITORS_CHANGED_EVENT)
+    return;
+
+  ie.kind = MONITORS_CHANGED_EVENT;
+  XSETTERMINAL (ie.arg, x_display_list->terminal);
+
+  kbd_buffer_store_event (&ie);
+}
+#endif
 
 /* **************************************************************************
 
@@ -6814,17 +7101,24 @@ ns_create_font_panel_buttons (id target, SEL select, 
SEL cancel_action)
 {
   struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (emacsframe);
   NSPoint p = [self convertPoint: [theEvent locationInWindow] fromView: nil];
+  EmacsWindow *window;
 
   NSTRACE ("[EmacsView mouseDown:]");
 
   if (!emacs_event)
     return;
 
+  if (FRAME_TOOLTIP_P (emacsframe))
+    return;
+
   dpyinfo->last_mouse_frame = emacsframe;
   /* Appears to be needed to prevent spurious movement events generated on
      button clicks.  */
   emacsframe->mouse_moved = 0;
 
+  window = (EmacsWindow *) [self window];
+  [window setLastDragEvent: theEvent];
+
   if ([theEvent type] == NSEventTypeScrollWheel)
     {
 #if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
@@ -7017,7 +7311,8 @@ ns_create_font_panel_buttons (id target, SEL select, SEL 
cancel_action)
          tab_bar_p = EQ (window, emacsframe->tab_bar_window);
 
          if (tab_bar_p)
-           tab_bar_arg = handle_tab_bar_click (emacsframe, x, y, 
EV_UDMODIFIERS (theEvent) & down_modifier,
+           tab_bar_arg = handle_tab_bar_click (emacsframe, x, y,
+                                               EV_UDMODIFIERS (theEvent) & 
down_modifier,
                                                EV_MODIFIERS (theEvent) | 
EV_UDMODIFIERS (theEvent));
        }
 
@@ -7092,6 +7387,9 @@ ns_create_font_panel_buttons (id target, SEL select, SEL 
cancel_action)
   NSPoint pt;
   BOOL dragging;
 
+  if (FRAME_TOOLTIP_P (emacsframe))
+    return;
+
   NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "[EmacsView mouseMoved:]");
 
   dpyinfo->last_mouse_movement_time = EV_TIMESTAMP (e);
@@ -8330,13 +8628,30 @@ ns_create_font_panel_buttons (id target, SEL select, 
SEL cancel_action)
 
 -(NSDragOperation) draggingEntered: (id <NSDraggingInfo>) sender
 {
+  id source;
+
   NSTRACE ("[EmacsView draggingEntered:]");
+
+  source = [sender draggingSource];
+
+  if (source && [source respondsToSelector: @selector(mustNotDropOn:)]
+      && [source mustNotDropOn: self])
+    return NSDragOperationNone;
+
   return NSDragOperationGeneric;
 }
 
 
--(BOOL)prepareForDragOperation: (id <NSDraggingInfo>) sender
+-(BOOL) prepareForDragOperation: (id <NSDraggingInfo>) sender
 {
+  id source;
+
+  source = [sender draggingSource];
+
+  if (source && [source respondsToSelector: @selector(mustNotDropOn:)]
+      && [source mustNotDropOn: self])
+    return NO;
+
   return YES;
 }
 
@@ -8347,12 +8662,24 @@ ns_create_font_panel_buttons (id target, SEL select, 
SEL cancel_action)
 
 - (NSDragOperation) draggingUpdated: (id <NSDraggingInfo>) sender
 {
+#ifdef NS_IMPL_GNUSTEP
   struct input_event ie;
+#else
+  Lisp_Object frame;
+#endif
   NSPoint position;
   int x, y;
+  NSAutoreleasePool *ap;
+  specpdl_ref count;
 
+  ap = [[NSAutoreleasePool alloc] init];
+  count = SPECPDL_INDEX ();
+  record_unwind_protect_ptr (ns_release_autorelease_pool, ap);
+
+#ifdef NS_IMPL_GNUSTEP
   EVENT_INIT (ie);
   ie.kind = DRAG_N_DROP_EVENT;
+#endif
 
   /* Get rid of mouse face.  */
   [self mouseExited: [[self window] currentEvent]];
@@ -8362,6 +8689,7 @@ ns_create_font_panel_buttons (id target, SEL select, SEL 
cancel_action)
   x = lrint (position.x);
   y = lrint (position.y);
 
+#ifdef NS_IMPL_GNUSTEP
   XSETINT (ie.x, x);
   XSETINT (ie.y, y);
   XSETFRAME (ie.frame_or_window, emacsframe);
@@ -8369,28 +8697,44 @@ ns_create_font_panel_buttons (id target, SEL select, 
SEL cancel_action)
   ie.modifiers = 0;
 
   kbd_buffer_store_event (&ie);
+#else
+  /* Input events won't be processed until the drop happens on macOS,
+     so call this function instead.  */
+  XSETFRAME (frame, emacsframe);
+
+  safe_call (4, Vns_drag_motion_function, frame,
+            make_fixnum (x), make_fixnum (y));
+
+  redisplay ();
+#endif
+
+  unbind_to (count, Qnil);
   return NSDragOperationGeneric;
 }
 
--(BOOL)performDragOperation: (id <NSDraggingInfo>) sender
+- (BOOL) performDragOperation: (id <NSDraggingInfo>) sender
 {
-  id pb;
+  id pb, source;
   int x, y;
   NSString *type;
-  NSEvent *theEvent = [[self window] currentEvent];
   NSPoint position;
   NSDragOperation op = [sender draggingSourceOperationMask];
   Lisp_Object operations = Qnil;
   Lisp_Object strings = Qnil;
   Lisp_Object type_sym;
+  struct input_event ie;
 
-  NSTRACE ("[EmacsView performDragOperation:]");
+  NSTRACE (@"[EmacsView performDragOperation:]");
 
-  if (!emacs_event)
+  source = [sender draggingSource];
+
+  if (source && [source respondsToSelector: @selector(mustNotDropOn:)]
+      && [source mustNotDropOn: self])
     return NO;
 
   position = [self convertPoint: [sender draggingLocation] fromView: nil];
-  x = lrint (position.x);  y = lrint (position.y);
+  x = lrint (position.x);
+  y = lrint (position.y);
 
   pb = [sender draggingPasteboard];
   type = [pb availableTypeFromArray: ns_drag_types];
@@ -8406,11 +8750,9 @@ ns_create_font_panel_buttons (id target, SEL select, SEL 
cancel_action)
   if (op & NSDragOperationGeneric || NILP (operations))
     operations = Fcons (Qns_drag_operation_generic, operations);
 
-  if (type == 0)
-    {
-      return NO;
-    }
-#if NS_USE_NSPasteboardTypeFileURL != 0
+  if (!type)
+    return NO;
+#if NS_USE_NSPasteboardTypeFileURL
   else if ([type isEqualToString: NSPasteboardTypeFileURL])
     {
       type_sym = Qfile;
@@ -8425,18 +8767,29 @@ ns_create_font_panel_buttons (id target, SEL select, 
SEL cancel_action)
 #else  // !NS_USE_NSPasteboardTypeFileURL
   else if ([type isEqualToString: NSFilenamesPboardType])
     {
-      NSArray *files;
+      id files;
       NSEnumerator *fenum;
       NSString *file;
 
-      if (!(files = [pb propertyListForType: type]))
+      files = [pb propertyListForType: type];
+
+      if (!files)
         return NO;
 
       type_sym = Qfile;
 
-      fenum = [files objectEnumerator];
-      while ( (file = [fenum nextObject]) )
-        strings = Fcons ([file lispString], strings);
+      /* On GNUstep, files might be a string.  */
+
+      if ([files respondsToSelector: @selector (objectEnumerator:)])
+       {
+         fenum = [files objectEnumerator];
+
+         while ((file = [fenum nextObject]))
+           strings = Fcons ([file lispString], strings);
+       }
+      else
+       /* Then `files' is an NSString.  */
+       strings = list1 ([files lispString]);
     }
 #endif   // !NS_USE_NSPasteboardTypeFileURL
   else if ([type isEqualToString: NSPasteboardTypeURL])
@@ -8453,29 +8806,26 @@ ns_create_font_panel_buttons (id target, SEL select, 
SEL cancel_action)
     {
       NSString *data;
 
-      if (! (data = [pb stringForType: type]))
+      data = [pb stringForType: type];
+
+      if (!data)
         return NO;
 
       type_sym = Qnil;
-
       strings = list1 ([data lispString]);
     }
   else
-    {
-      fputs ("Invalid data type in dragging pasteboard\n", stderr);
-      return NO;
-    }
-
-  emacs_event->kind = DRAG_N_DROP_EVENT;
-  XSETINT (emacs_event->x, x);
-  XSETINT (emacs_event->y, y);
-  emacs_event->modifiers = 0;
+    return NO;
 
-  emacs_event->arg = Fcons (type_sym,
-                            Fcons (operations,
-                                   strings));
-  EV_TRAILER (theEvent);
+  EVENT_INIT (ie);
+  ie.kind = DRAG_N_DROP_EVENT;
+  ie.arg = Fcons (type_sym, Fcons (operations,
+                                  strings));
+  XSETINT (ie.x, x);
+  XSETINT (ie.y, y);
+  XSETFRAME (ie.frame_or_window, emacsframe);
 
+  kbd_buffer_store_event (&ie);
   return YES;
 }
 
@@ -8582,17 +8932,18 @@ ns_create_font_panel_buttons (id target, SEL select, 
SEL cancel_action)
 @implementation EmacsWindow
 
 
-- (instancetype) initWithEmacsFrame:(struct frame *)f
+- (instancetype) initWithEmacsFrame: (struct frame *) f
 {
   return [self initWithEmacsFrame:f fullscreen:NO screen:nil];
 }
 
 
-- (instancetype) initWithEmacsFrame:(struct frame *)f
-                         fullscreen:(BOOL)fullscreen
-                             screen:(NSScreen *)screen
+- (instancetype) initWithEmacsFrame: (struct frame *) f
+                         fullscreen: (BOOL) fullscreen
+                             screen: (NSScreen *) screen
 {
   NSWindowStyleMask styleMask;
+  int width, height;
 
   NSTRACE ("[EmacsWindow initWithEmacsFrame:fullscreen:screen:]");
 
@@ -8605,20 +8956,24 @@ ns_create_font_panel_buttons (id target, SEL select, 
SEL cancel_action)
       styleMask |= NSWindowStyleMaskResizable;
 #endif
     }
+  else if (f->tooltip)
+    styleMask = 0;
   else
-    styleMask = NSWindowStyleMaskTitled
-      | NSWindowStyleMaskResizable
-      | NSWindowStyleMaskMiniaturizable
-      | NSWindowStyleMaskClosable;
-
-  self = [super initWithContentRect:
-                  NSMakeRect (0, 0,
-                              FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, f->text_cols),
-                              FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, 
f->text_lines))
-                          styleMask:styleMask
-                            backing:NSBackingStoreBuffered
-                              defer:YES
-                             screen:screen];
+    styleMask = (NSWindowStyleMaskTitled
+                | NSWindowStyleMaskResizable
+                | NSWindowStyleMaskMiniaturizable
+                | NSWindowStyleMaskClosable);
+
+  last_drag_event = nil;
+
+  width = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, f->text_cols);
+  height = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, f->text_lines);
+
+  self = [super initWithContentRect: NSMakeRect (0, 0, width, height)
+                          styleMask: styleMask
+                            backing: NSBackingStoreBuffered
+                              defer: YES
+                             screen: screen];
   if (self)
     {
       NSString *name;
@@ -8726,6 +9081,11 @@ ns_create_font_panel_buttons (id target, SEL select, SEL 
cancel_action)
 
   /* We need to release the toolbar ourselves.  */
   [[self toolbar] release];
+
+  /* Also the last button press event .  */
+  if (last_drag_event)
+    [last_drag_event release];
+
   [super dealloc];
 }
 
@@ -9250,6 +9610,153 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c)
   return YES;
 }
 
+- (void) setLastDragEvent: (NSEvent *) event
+{
+  if (last_drag_event)
+    [last_drag_event release];
+  last_drag_event = [event copy];
+}
+
+- (NSDragOperation) draggingSourceOperationMaskForLocal: (BOOL) is_local
+{
+  return drag_op;
+}
+
+- (void) draggedImage: (NSImage *) image
+             endedAt: (NSPoint) screen_point
+           operation: (NSDragOperation) operation
+{
+  selected_op = operation;
+}
+
+- (void) draggedImage: (NSImage *) dragged_image
+             movedTo: (NSPoint) screen_point
+{
+  NSPoint mouse_loc;
+#ifdef NS_IMPL_COCOA
+  NSInteger window_number;
+  NSWindow *w;
+#endif
+
+  mouse_loc = [NSEvent mouseLocation];
+
+#ifdef NS_IMPL_COCOA
+  if (dnd_mode != RETURN_FRAME_NEVER)
+    {
+      window_number = [NSWindow windowNumberAtPoint: mouse_loc
+                       belowWindowWithWindowNumber: 0];
+      w = [NSApp windowWithWindowNumber: window_number];
+
+      if (!w || w != self)
+       dnd_mode = RETURN_FRAME_NOW;
+
+      if (dnd_mode != RETURN_FRAME_NOW
+         || ![[w delegate] isKindOfClass: [EmacsView class]]
+         || ((EmacsView *) [w delegate])->emacsframe->tooltip)
+       goto out;
+
+      dnd_return_frame = ((EmacsView *) [w delegate])->emacsframe;
+
+      /* FIXME: there must be a better way to leave the event loop.  */
+      [NSException raise: @""
+                 format: @"Must return DND frame"];
+    }
+
+ out:
+#endif
+
+  if (dnd_move_tooltip_with_frame)
+    ns_move_tooltip_to_mouse_location (mouse_loc);
+}
+
+- (BOOL) mustNotDropOn: (NSView *) receiver
+{
+  return ([receiver window] == self
+         ? !dnd_allow_same_frame : NO);
+}
+
+- (NSDragOperation) beginDrag: (NSDragOperation) op
+               forPasteboard: (NSPasteboard *) pasteboard
+                    withMode: (enum ns_return_frame_mode) mode
+               returnFrameTo: (struct frame **) frame_return
+                prohibitSame: (BOOL) prohibit_same_frame
+               followTooltip: (BOOL) follow_tooltip
+{
+  NSImage *image;
+#ifdef NS_IMPL_COCOA
+  NSInteger window_number;
+  NSWindow *w;
+#endif
+  drag_op = op;
+  selected_op = NSDragOperationNone;
+  image = [[NSImage alloc] initWithSize: NSMakeSize (1.0, 1.0)];
+  dnd_mode = mode;
+  dnd_return_frame = NULL;
+  dnd_allow_same_frame = !prohibit_same_frame;
+  dnd_move_tooltip_with_frame = follow_tooltip;
+
+  /* Now draw transparency onto the image.  */
+  [image lockFocus];
+  [[NSColor colorWithUnsignedLong: 0] set];
+  NSRectFillUsingOperation (NSMakeRect (0, 0, 1, 1),
+                           NSCompositingOperationCopy);
+  [image unlockFocus];
+
+  block_input ();
+#ifdef NS_IMPL_COCOA
+  if (mode == RETURN_FRAME_NOW)
+    {
+      window_number = [NSWindow windowNumberAtPoint: [NSEvent mouseLocation]
+                       belowWindowWithWindowNumber: 0];
+      w = [NSApp windowWithWindowNumber: window_number];
+
+      if (w && [[w delegate] isKindOfClass: [EmacsView class]]
+         && !((EmacsView *) [w delegate])->emacsframe->tooltip)
+       {
+         *frame_return = ((EmacsView *) [w delegate])->emacsframe;
+         [image release];
+         unblock_input ();
+
+         return NSDragOperationNone;
+       }
+    }
+
+  @try
+    {
+#endif
+      if (last_drag_event)
+       [self dragImage: image
+                    at: NSMakePoint (0, 0)
+                offset: NSMakeSize (0, 0)
+                 event: last_drag_event
+            pasteboard: pasteboard
+                source: self
+             slideBack: NO];
+#ifdef NS_IMPL_COCOA
+    }
+  @catch (NSException *e)
+    {
+      /* Ignore.  This is probably the wrong way to leave the
+        drag-and-drop run loop.  */
+    }
+#endif
+  unblock_input ();
+
+  /* The drop happened, so delete the tooltip.  */
+  if (follow_tooltip)
+    Fx_hide_tip ();
+
+  /* Assume all buttons have been released since the drag-and-drop
+     operation is now over.  */
+  if (!dnd_return_frame)
+    x_display_list->grabbed = 0;
+
+  [image release];
+
+  *frame_return = dnd_return_frame;
+  return selected_op;
+}
+
 @end /* EmacsWindow */
 
 
@@ -10182,6 +10689,7 @@ syms_of_nsterm (void)
   DEFSYM (Qns_drag_operation_copy, "ns-drag-operation-copy");
   DEFSYM (Qns_drag_operation_link, "ns-drag-operation-link");
   DEFSYM (Qns_drag_operation_generic, "ns-drag-operation-generic");
+  DEFSYM (Qns_handle_drag_motion, "ns-handle-drag-motion");
 
   Fput (Qalt, Qmodifier_value, make_fixnum (alt_modifier));
   Fput (Qhyper, Qmodifier_value, make_fixnum (hyper_modifier));
@@ -10189,117 +10697,117 @@ syms_of_nsterm (void)
   Fput (Qsuper, Qmodifier_value, make_fixnum (super_modifier));
   Fput (Qcontrol, Qmodifier_value, make_fixnum (ctrl_modifier));
 
-  DEFVAR_LISP ("ns-input-file", ns_input_file,
-              "The file specified in the last NS event.");
-  ns_input_file =Qnil;
+ DEFVAR_LISP ("ns-input-font", ns_input_font,
+   doc: /* The font specified in the last NS event. */);
+ ns_input_font = Qnil;
 
-  DEFVAR_LISP ("ns-working-text", ns_working_text,
-              "String for visualizing working composition sequence.");
-  ns_working_text =Qnil;
+ DEFVAR_LISP ("ns-input-fontsize", ns_input_fontsize,
+   doc: /* The fontsize specified in the last NS event. */);
+ ns_input_fontsize = Qnil;
 
-  DEFVAR_LISP ("ns-input-font", ns_input_font,
-              "The font specified in the last NS event.");
-  ns_input_font =Qnil;
+ DEFVAR_LISP ("ns-input-line", ns_input_line,
+   doc: /* The line specified in the last NS event. */);
+ ns_input_line = Qnil;
 
-  DEFVAR_LISP ("ns-input-fontsize", ns_input_fontsize,
-              "The fontsize specified in the last NS event.");
-  ns_input_fontsize =Qnil;
+ DEFVAR_LISP ("ns-input-spi-name", ns_input_spi_name,
+   doc: /* The service name specified in the last NS event. */);
+ ns_input_spi_name = Qnil;
 
-  DEFVAR_LISP ("ns-input-line", ns_input_line,
-               "The line specified in the last NS event.");
-  ns_input_line =Qnil;
+ DEFVAR_LISP ("ns-input-spi-arg", ns_input_spi_arg,
+   doc: /* The service argument specified in the last NS event. */);
+  ns_input_spi_arg = Qnil;
 
-  DEFVAR_LISP ("ns-input-spi-name", ns_input_spi_name,
-               "The service name specified in the last NS event.");
-  ns_input_spi_name =Qnil;
+  DEFVAR_LISP ("ns-input-file", ns_input_file,
+    doc: /* The file specified in the last NS event.  */);
+  ns_input_file = Qnil;
 
-  DEFVAR_LISP ("ns-input-spi-arg", ns_input_spi_arg,
-               "The service argument specified in the last NS event.");
-  ns_input_spi_arg =Qnil;
+  DEFVAR_LISP ("ns-working-text", ns_working_text,
+    doc: /* String for visualizing working composition sequence.  */);
+  ns_working_text = Qnil;
 
   DEFVAR_LISP ("ns-alternate-modifier", ns_alternate_modifier,
-               "This variable describes the behavior of the alternate or 
option key.\n\
-Either SYMBOL, describing the behavior for any event,\n\
-or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior\n\
-separately for ordinary keys, function keys, and mouse events.\n\
-\n\
-Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.\n\
-If `none', the key is ignored by Emacs and retains its standard meaning.");
+    doc: /* This variable describes the behavior of the alternate or option 
key.
+Either SYMBOL, describing the behavior for any event,
+or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior
+separately for ordinary keys, function keys, and mouse events.
+
+Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.
+If `none', the key is ignored by Emacs and retains its standard meaning.  */);
   ns_alternate_modifier = Qmeta;
 
   DEFVAR_LISP ("ns-right-alternate-modifier", ns_right_alternate_modifier,
-               "This variable describes the behavior of the right alternate or 
option key.\n\
-Either SYMBOL, describing the behavior for any event,\n\
-or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior\n\
-separately for ordinary keys, function keys, and mouse events.\n\
-It can also be `left' to use the value of `ns-alternate-modifier' instead.\n\
-\n\
-Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.\n\
-If `none', the key is ignored by Emacs and retains its standard meaning.");
+    doc: /* This variable describes the behavior of the right alternate or 
option key.
+Either SYMBOL, describing the behavior for any event,
+or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior
+separately for ordinary keys, function keys, and mouse events.
+It can also be `left' to use the value of `ns-alternate-modifier' instead.
+
+Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.
+If `none', the key is ignored by Emacs and retains its standard meaning.  */);
   ns_right_alternate_modifier = Qleft;
 
   DEFVAR_LISP ("ns-command-modifier", ns_command_modifier,
-               "This variable describes the behavior of the command key.\n\
-Either SYMBOL, describing the behavior for any event,\n\
-or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior\n\
-separately for ordinary keys, function keys, and mouse events.\n\
-\n\
-Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.\n\
-If `none', the key is ignored by Emacs and retains its standard meaning.");
+    doc: /* This variable describes the behavior of the command key.
+Either SYMBOL, describing the behavior for any event,
+or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior
+separately for ordinary keys, function keys, and mouse events.
+
+Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.
+If `none', the key is ignored by Emacs and retains its standard meaning.  */);
   ns_command_modifier = Qsuper;
 
   DEFVAR_LISP ("ns-right-command-modifier", ns_right_command_modifier,
-               "This variable describes the behavior of the right command 
key.\n\
-Either SYMBOL, describing the behavior for any event,\n\
-or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior\n\
-separately for ordinary keys, function keys, and mouse events.\n\
-It can also be `left' to use the value of `ns-command-modifier' instead.\n\
-\n\
-Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.\n\
-If `none', the key is ignored by Emacs and retains its standard meaning.");
+    doc: /* This variable describes the behavior of the right command key.
+Either SYMBOL, describing the behavior for any event,
+or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior
+separately for ordinary keys, function keys, and mouse events.
+It can also be `left' to use the value of `ns-command-modifier' instead.
+
+Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.
+If `none', the key is ignored by Emacs and retains its standard meaning.  */);
   ns_right_command_modifier = Qleft;
 
   DEFVAR_LISP ("ns-control-modifier", ns_control_modifier,
-               "This variable describes the behavior of the control key.\n\
-Either SYMBOL, describing the behavior for any event,\n\
-or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior\n\
-separately for ordinary keys, function keys, and mouse events.\n\
-\n\
-Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.\n\
-If `none', the key is ignored by Emacs and retains its standard meaning.");
+    doc: /* This variable describes the behavior of the control key.
+Either SYMBOL, describing the behavior for any event,
+or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior
+separately for ordinary keys, function keys, and mouse events.
+
+Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.
+If `none', the key is ignored by Emacs and retains its standard meaning.  */);
   ns_control_modifier = Qcontrol;
 
   DEFVAR_LISP ("ns-right-control-modifier", ns_right_control_modifier,
-               "This variable describes the behavior of the right control 
key.\n\
-Either SYMBOL, describing the behavior for any event,\n\
-or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior\n\
-separately for ordinary keys, function keys, and mouse events.\n\
-It can also be `left' to use the value of `ns-control-modifier' instead.\n\
-\n\
-Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.\n\
-If `none', the key is ignored by Emacs and retains its standard meaning.");
+    doc: /* This variable describes the behavior of the right control key.
+Either SYMBOL, describing the behavior for any event,
+or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior
+separately for ordinary keys, function keys, and mouse events.
+It can also be `left' to use the value of `ns-control-modifier' instead.
+
+Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.
+If `none', the key is ignored by Emacs and retains its standard meaning.  */);
   ns_right_control_modifier = Qleft;
 
   DEFVAR_LISP ("ns-function-modifier", ns_function_modifier,
-               "This variable describes the behavior of the function (fn) 
key.\n\
-Either SYMBOL, describing the behavior for any event,\n\
-or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior\n\
-separately for ordinary keys, function keys, and mouse events.\n\
-\n\
-Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.\n\
-If `none', the key is ignored by Emacs and retains its standard meaning.");
+    doc: /* This variable describes the behavior of the function (fn) key.
+Either SYMBOL, describing the behavior for any event,
+or (:ordinary SYMBOL :function SYMBOL :mouse SYMBOL), describing behavior
+separately for ordinary keys, function keys, and mouse events.
+
+Each SYMBOL is `control', `meta', `alt', `super', `hyper' or `none'.
+If `none', the key is ignored by Emacs and retains its standard meaning.  */);
   ns_function_modifier = Qnone;
 
   DEFVAR_LISP ("ns-antialias-text", ns_antialias_text,
-               "Non-nil (the default) means to render text antialiased.");
+    doc: /* Non-nil (the default) means to render text antialiased.  */);
   ns_antialias_text = Qt;
 
   DEFVAR_LISP ("ns-use-thin-smoothing", ns_use_thin_smoothing,
-               "Non-nil turns on a font smoothing method that produces thinner 
strokes.");
+    doc: /* Non-nil turns on a font smoothing method that produces thinner 
strokes.  */);
   ns_use_thin_smoothing = Qnil;
 
   DEFVAR_LISP ("ns-confirm-quit", ns_confirm_quit,
-               "Whether to confirm application quit using dialog.");
+    doc: /* Whether to confirm application quit using dialog.  */);
   ns_confirm_quit = Qnil;
 
   DEFVAR_LISP ("ns-auto-hide-menu-bar", ns_auto_hide_menu_bar,
@@ -10369,6 +10877,16 @@ This variable is ignored on macOS < 10.7 and GNUstep.  
Default is t.  */);
  mice with smooth scrolling capability.  */);
   Vns_scroll_event_delta_factor = make_float (1.0);
 
+  DEFVAR_LISP ("ns-drag-motion-function", Vns_drag_motion_function,
+    doc: /* Function called when another program drags items over Emacs.
+
+It is called with three arguments FRAME, X, and Y, whenever the user
+moves the mouse over an Emacs frame as part of a drag-and-drop
+operation.  FRAME is the frame the mouse is on top of, and X and Y are
+the frame-relative positions of the mouse in the X and Y axises
+respectively.  */);
+  Vns_drag_motion_function = Qns_handle_drag_motion;
+
   /* Tell Emacs about this window system.  */
   Fprovide (Qns, Qnil);
 
@@ -10389,4 +10907,6 @@ This variable is ignored on macOS < 10.7 and GNUstep.  
Default is t.  */);
   syms_of_nsfont ();
 #endif
 
+  last_known_monitors = Qnil;
+  staticpro (&last_known_monitors);
 }
diff --git a/src/nsxwidget.m b/src/nsxwidget.m
index f79873235c..be0eba0bcb 100644
--- a/src/nsxwidget.m
+++ b/src/nsxwidget.m
@@ -69,10 +69,13 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
   [configuration.preferences setValue:@YES
                                forKey:@"developerExtrasEnabled"];
 
+#if 0 /* Plugins are not supported by Mac OS X anymore.  */
   Lisp_Object enablePlugins =
     Fintern (build_string ("xwidget-webkit-enable-plugins"), Qnil);
+
   if (!EQ (Fsymbol_value (enablePlugins), Qnil))
     configuration.preferences.plugInsEnabled = YES;
+#endif
 
   self = [super initWithFrame:frame configuration:configuration];
   if (self)
diff --git a/src/pdumper.c b/src/pdumper.c
index 5923d9b1d8..50ae4f85e7 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -1069,7 +1069,7 @@ dump_queue_enqueue (struct dump_queue *dump_queue,
         }
     }
 
-  if (!EQ (weights, orig_weights))
+  if (!BASE_EQ (weights, orig_weights))
     Fputhash (object, weights, dump_queue->link_weights);
 }
 
@@ -1383,7 +1383,7 @@ print_paths_to_root_1 (struct dump_context *ctx,
     {
       Lisp_Object referrer = XCAR (referrers);
       referrers = XCDR (referrers);
-      Lisp_Object repr = Fprin1_to_string (referrer, Qnil);
+      Lisp_Object repr = Fprin1_to_string (referrer, Qnil, Qnil);
       for (int i = 0; i < level; ++i)
        putc (' ', stderr);
       fwrite (SDATA (repr), 1, SBYTES (repr), stderr);
@@ -3758,7 +3758,7 @@ decode_emacs_reloc (struct dump_context *ctx, Lisp_Object 
lreloc)
             reloc.u.dump_offset = dump_recall_object (ctx, target_value);
             if (reloc.u.dump_offset <= 0)
               {
-                Lisp_Object repr = Fprin1_to_string (target_value, Qnil);
+                Lisp_Object repr = Fprin1_to_string (target_value, Qnil, Qnil);
                 error ("relocation target was not dumped: %s", SDATA (repr));
               }
             dump_check_dump_off (ctx, reloc.u.dump_offset);
@@ -5543,7 +5543,10 @@ pdumper_load (const char *dump_filename, char *argv0)
 
   struct dump_header header_buf = { 0 };
   struct dump_header *header = &header_buf;
-  struct dump_memory_map sections[NUMBER_DUMP_SECTIONS] = { 0 };
+  struct dump_memory_map sections[NUMBER_DUMP_SECTIONS];
+
+  /* Use memset instead of "= { 0 }" to work around GCC bug 105961.  */
+  memset (sections, 0, sizeof sections);
 
   const struct timespec start_time = current_timespec ();
   char *dump_filename_copy;
diff --git a/src/pgtkfns.c b/src/pgtkfns.c
index a0fcf70f31..294bdb3791 100644
--- a/src/pgtkfns.c
+++ b/src/pgtkfns.c
@@ -566,15 +566,23 @@ pgtk_set_tool_bar_lines (struct frame *f, Lisp_Object 
value, Lisp_Object oldval)
 static void
 pgtk_set_child_frame_border_width (struct frame *f, Lisp_Object arg, 
Lisp_Object oldval)
 {
-  int border = check_int_nonnegative (arg);
+  int border;
+
+  if (NILP (arg))
+    border = -1;
+  else if (RANGED_FIXNUMP (0, arg, INT_MAX))
+    border = XFIXNAT (arg);
+  else
+    signal_error ("Invalid child frame border width", arg);
 
   if (border != FRAME_CHILD_FRAME_BORDER_WIDTH (f))
     {
       f->child_frame_border_width = border;
 
-      if (FRAME_X_WINDOW (f))
+      if (FRAME_GTK_WIDGET (f))
        {
-         adjust_frame_size (f, -1, -1, 3, false, Qchild_frame_border_width);
+         adjust_frame_size (f, -1, -1, 3,
+                            false, Qchild_frame_border_width);
          pgtk_clear_under_internal_border (f);
        }
     }
@@ -848,7 +856,7 @@ pgtk_set_scroll_bar_background (struct frame *f, 
Lisp_Object new_value,
        error ("Unknown color.");
 
       /* On pgtk, this frame parameter should be ignored, and honor
-        gtk theme.  (It honors the GTK theme if not explictly set, so
+        gtk theme.  (It honors the GTK theme if not explicitly set, so
         I see no harm in letting users tinker a bit more.)  */
       char css[64];
       sprintf (css, "scrollbar trough { background-color: #%06x; }",
@@ -1060,7 +1068,7 @@ pgtk_default_font_parameter (struct frame *f, Lisp_Object 
parms)
     gui_display_get_arg (dpyinfo, parms, Qfont, NULL, NULL,
                         RES_TYPE_STRING);
   Lisp_Object font = Qnil;
-  if (EQ (font_param, Qunbound))
+  if (BASE_EQ (font_param, Qunbound))
     font_param = Qnil;
 
   if (NILP (font_param))
@@ -1213,10 +1221,10 @@ This function is an internal primitive--use 
`make-frame' instead.  */ )
 
   display =
     gui_display_get_arg (dpyinfo, parms, Qterminal, 0, 0, RES_TYPE_NUMBER);
-  if (EQ (display, Qunbound))
+  if (BASE_EQ (display, Qunbound))
     display =
       gui_display_get_arg (dpyinfo, parms, Qdisplay, 0, 0, RES_TYPE_STRING);
-  if (EQ (display, Qunbound))
+  if (BASE_EQ (display, Qunbound))
     display = Qnil;
   dpyinfo = check_pgtk_display_info (display);
   kb = dpyinfo->terminal->kboard;
@@ -1227,7 +1235,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */ )
   name =
     gui_display_get_arg (dpyinfo, parms, Qname, "name", "Name",
                         RES_TYPE_STRING);
-  if (!STRINGP (name) && !EQ (name, Qunbound) && !NILP (name))
+  if (!STRINGP (name) && !BASE_EQ (name, Qunbound) && !NILP (name))
     error ("Invalid frame name--not a string or nil");
 
   if (STRINGP (name))
@@ -1237,7 +1245,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */ )
   parent =
     gui_display_get_arg (dpyinfo, parms, Qparent_id, NULL, NULL,
                         RES_TYPE_NUMBER);
-  if (EQ (parent, Qunbound))
+  if (BASE_EQ (parent, Qunbound))
     parent = Qnil;
   if (!NILP (parent))
     CHECK_NUMBER (parent);
@@ -1263,7 +1271,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */ )
                         RES_TYPE_SYMBOL);
   /* Accept parent-frame iff parent-id was not specified.  */
   if (!NILP (parent)
-      || EQ (parent_frame, Qunbound)
+      || BASE_EQ (parent_frame, Qunbound)
       || NILP (parent_frame)
       || !FRAMEP (parent_frame)
       || !FRAME_LIVE_P (XFRAME (parent_frame))
@@ -1277,7 +1285,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */ )
       (tem =
        (gui_display_get_arg
        (dpyinfo, parms, Qundecorated, NULL, NULL, RES_TYPE_BOOLEAN)))
-      && !(EQ (tem, Qunbound)))
+      && !(BASE_EQ (tem, Qunbound)))
     undecorated = true;
 
   FRAME_UNDECORATED (f) = undecorated;
@@ -1287,7 +1295,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */ )
       (tem =
        (gui_display_get_arg
        (dpyinfo, parms, Qoverride_redirect, NULL, NULL, RES_TYPE_BOOLEAN)))
-      && !(EQ (tem, Qunbound)))
+      && !(BASE_EQ (tem, Qunbound)))
     override_redirect = true;
 
   FRAME_OVERRIDE_REDIRECT (f) = override_redirect;
@@ -1363,7 +1371,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */ )
 
   /* Set the name; the functions to which we pass f expect the name to
      be set.  */
-  if (EQ (name, Qunbound) || NILP (name))
+  if (BASE_EQ (name, Qunbound) || NILP (name))
     {
       fset_name (f, build_string (dpyinfo->x_id_name));
       f->explicit_name = false;
@@ -1406,7 +1414,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */ )
       value = gui_display_get_arg (dpyinfo, parms, Qinternal_border_width,
                                   "internalBorder", "internalBorder",
                                   RES_TYPE_NUMBER);
-      if (!EQ (value, Qunbound))
+      if (!BASE_EQ (value, Qunbound))
        parms = Fcons (Fcons (Qinternal_border_width, value), parms);
     }
 
@@ -1423,14 +1431,13 @@ This function is an internal primitive--use 
`make-frame' instead.  */ )
       value = gui_display_get_arg (dpyinfo, parms, Qchild_frame_border_width,
                                    "childFrameBorder", "childFrameBorder",
                                    RES_TYPE_NUMBER);
-      if (! EQ (value, Qunbound))
+      if (! BASE_EQ (value, Qunbound))
        parms = Fcons (Fcons (Qchild_frame_border_width, value),
                       parms);
 
     }
 
-  gui_default_parameter (f, parms, Qchild_frame_border_width,
-                        make_fixnum (0),
+  gui_default_parameter (f, parms, Qchild_frame_border_width, Qnil,
                         "childFrameBorderWidth", "childFrameBorderWidth",
                         RES_TYPE_NUMBER);
   gui_default_parameter (f, parms, Qright_divider_width, make_fixnum (0),
@@ -1688,7 +1695,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */ )
        }
       else
        {
-         if (EQ (visibility, Qunbound))
+         if (BASE_EQ (visibility, Qunbound))
            visibility = Qt;
 
          if (!NILP (visibility))
@@ -1702,7 +1709,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */ )
         from `x-create-frame-with-faces' (see above comment).  */
       f->was_invisible
        = (f->was_invisible
-          && (!EQ (height, Qunbound) || !EQ (width, Qunbound)));
+          && (!BASE_EQ (height, Qunbound) || !BASE_EQ (width, Qunbound)));
 
       store_frame_param (f, Qvisibility, visibility);
     }
@@ -2670,7 +2677,7 @@ x_create_tip_frame (struct pgtk_display_info *dpyinfo, 
Lisp_Object parms, struct
   name = gui_display_get_arg (dpyinfo, parms, Qname, "name", "Name",
                               RES_TYPE_STRING);
   if (!STRINGP (name)
-      && !EQ (name, Qunbound)
+      && !BASE_EQ (name, Qunbound)
       && !NILP (name))
     error ("Invalid frame name--not a string or nil");
 
@@ -2721,7 +2728,7 @@ x_create_tip_frame (struct pgtk_display_info *dpyinfo, 
Lisp_Object parms, struct
 
   /* Set the name; the functions to which we pass f expect the name to
      be set.  */
-  if (EQ (name, Qunbound) || NILP (name))
+  if (BASE_EQ (name, Qunbound) || NILP (name))
     {
       fset_name (f, build_string (dpyinfo->x_id_name));
       f->explicit_name = false;
@@ -2762,7 +2769,7 @@ x_create_tip_frame (struct pgtk_display_info *dpyinfo, 
Lisp_Object parms, struct
       value = gui_display_get_arg (dpyinfo, parms, Qinternal_border_width,
                                    "internalBorder", "internalBorder",
                                    RES_TYPE_NUMBER);
-      if (! EQ (value, Qunbound))
+      if (! BASE_EQ (value, Qunbound))
        parms = Fcons (Fcons (Qinternal_border_width, value),
                       parms);
     }
@@ -2853,7 +2860,7 @@ x_create_tip_frame (struct pgtk_display_info *dpyinfo, 
Lisp_Object parms, struct
      Frame parameters may be changed if .Xdefaults contains
      specifications for the default font.  For example, if there is an
      `Emacs.default.attributeBackground: pink', the `background-color'
-     attribute of the frame get's set, which let's the internal border
+     attribute of the frame gets set, which lets the internal border
      of the tooltip frame appear in pink.  Prevent this.  */
   {
     Lisp_Object bg = Fframe_parameter (frame, Qbackground_color);
diff --git a/src/pgtkmenu.c b/src/pgtkmenu.c
index eec9f419d0..2eabf6ac1b 100644
--- a/src/pgtkmenu.c
+++ b/src/pgtkmenu.c
@@ -610,11 +610,6 @@ pgtk_menu_show (struct frame *f, int x, int y, int 
menuflags,
 
   *error_name = NULL;
 
-  if (!FRAME_GTK_OUTER_WIDGET (f)) {
-    *error_name = "Can't popup from child frames.";
-    return Qnil;
-  }
-
   if (menu_items_used <= MENU_ITEMS_PANE_LENGTH)
     {
       *error_name = "Empty menu";
@@ -919,11 +914,6 @@ pgtk_dialog_show (struct frame *f, Lisp_Object title,
 
   *error_name = NULL;
 
-  if (!FRAME_GTK_OUTER_WIDGET (f)) {
-    *error_name = "Can't popup from child frames.";
-    return Qnil;
-  }
-
   if (menu_items_n_panes > 1)
     {
       *error_name = "Multiple panes in dialog box";
diff --git a/src/pgtkselect.c b/src/pgtkselect.c
index 4c87aaa7ea..76901b9eb1 100644
--- a/src/pgtkselect.c
+++ b/src/pgtkselect.c
@@ -323,7 +323,7 @@ nil, it defaults to the selected frame. */)
       gtk_target_list_unref (list);
     }
 
-  if (!EQ (Vpgtk_sent_selection_hooks, Qunbound))
+  if (!BASE_EQ (Vpgtk_sent_selection_hooks, Qunbound))
     {
       /* FIXME: Use run-hook-with-args!  */
       for (rest = Vpgtk_sent_selection_hooks; CONSP (rest);
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index c8c8bd0d85..da958a6664 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -1333,9 +1333,7 @@ pgtk_draw_glyph_string_background (struct glyph_string 
*s, bool force_p)
       if (s->stippled_p)
        {
          /* Fill background with a stipple pattern.  */
-
-         fill_background (s,
-                          s->x, s->y + box_line_width,
+         fill_background (s, s->x, s->y + box_line_width,
                           s->background_width,
                           s->height - 2 * box_line_width);
          s->background_filled_p = true;
@@ -1589,6 +1587,10 @@ pgtk_draw_glyphless_glyph_string_foreground (struct 
glyph_string *s)
                             false);
       x += glyph->pixel_width;
     }
+
+  /* Pacify GCC 12 even though s->char2b is not used after this
+     function returns.  */
+  s->char2b = NULL;
 }
 
 /* Brightness beyond which a color won't have its highlight brightness
@@ -2501,9 +2503,7 @@ pgtk_draw_glyph_string (struct glyph_string *s)
              if (s->face->underline_defaulted_p)
                pgtk_draw_underwave (s, s->xgcv.foreground);
              else
-               {
-                 pgtk_draw_underwave (s, s->face->underline_color);
-               }
+               pgtk_draw_underwave (s, s->face->underline_color);
            }
          else if (s->face->underline == FACE_UNDER_LINE)
            {
@@ -2555,7 +2555,7 @@ pgtk_draw_glyph_string (struct glyph_string *s)
                    }
 
                  /* Ignore minimum_offset if the amount of pixels was
-                    explictly specified.  */
+                    explicitly specified.  */
                  if (!s->face->underline_pixels_above_descent_line)
                    position = max (position, underline_minimum_offset);
                }
@@ -2670,6 +2670,11 @@ pgtk_draw_glyph_string (struct glyph_string *s)
        }
     }
 
+  /* TODO: figure out in which cases the stipple is actually drawn on
+     PGTK.  */
+  if (!s->row->stipple_p)
+    s->row->stipple_p = s->face->stipple;
+
   /* Reset clipping.  */
   pgtk_end_cr_clip (s->f);
   s->num_clips = 0;
@@ -3346,15 +3351,10 @@ pgtk_mouse_position (struct frame **fp, int insist, 
Lisp_Object * bar_window,
   if (gui_mouse_grabbed (dpyinfo)
       && (!EQ (track_mouse, Qdropping)
          && !EQ (track_mouse, Qdrag_source)))
-    {
-      /* 1.1. use last_mouse_frame as frame where the pointer is
-        on.  */
-      f1 = dpyinfo->last_mouse_frame;
-    }
+    f1 = dpyinfo->last_mouse_frame;
   else
     {
       f1 = *fp;
-      /* 1.2. get frame where the pointer is on.  */
       win = gtk_widget_get_window (FRAME_GTK_WIDGET (*fp));
       seat = gdk_display_get_default_seat (dpyinfo->gdpy);
       device = gdk_seat_get_pointer (seat);
@@ -3380,19 +3380,17 @@ pgtk_mouse_position (struct frame **fp, int insist, 
Lisp_Object * bar_window,
       return;
     }
 
-  /* 2. get the display and the device. */
   win = gtk_widget_get_window (FRAME_GTK_WIDGET (f1));
-  GdkDisplay *gdpy = gdk_window_get_display (win);
-  seat = gdk_display_get_default_seat (gdpy);
+  seat = gdk_display_get_default_seat (dpyinfo->gdpy);
   device = gdk_seat_get_pointer (seat);
 
-  /* 3. get x, y relative to edit window of the frame. */
-  win = gdk_window_get_device_position (win, device, &win_x, &win_y, &mask);
+  win = gdk_window_get_device_position (win, device,
+                                       &win_x, &win_y, &mask);
 
   if (f1 != NULL)
     {
-      dpyinfo = FRAME_DISPLAY_INFO (f1);
-      remember_mouse_glyph (f1, win_x, win_y, &dpyinfo->last_mouse_glyph);
+      remember_mouse_glyph (f1, win_x, win_y,
+                           &dpyinfo->last_mouse_glyph);
       dpyinfo->last_mouse_glyph_frame = f1;
 
       *bar_window = Qnil;
@@ -3505,9 +3503,7 @@ pgtk_draw_fringe_bitmap (struct window *w, struct 
glyph_row *row,
          mono-displays, the fill style may have been changed to
          FillSolid in pgtk_draw_glyph_string_background.  */
       if (face->stipple)
-       {
-         fill_background_by_face (f, face, p->bx, p->by, p->nx, p->ny);
-       }
+       fill_background_by_face (f, face, p->bx, p->by, p->nx, p->ny);
       else
        {
          pgtk_set_cr_source_with_color (f, face->background, true);
@@ -6164,6 +6160,20 @@ drag_data_received (GtkWidget *widget, GdkDragContext 
*context,
   gtk_drag_finish (context, TRUE, FALSE, time);
 }
 
+static void
+pgtk_monitors_changed_cb (GdkScreen *screen, gpointer user_data)
+{
+  struct terminal *terminal;
+  union buffered_input_event inev;
+
+  EVENT_INIT (inev.ie);
+  terminal = user_data;
+  inev.ie.kind = MONITORS_CHANGED_EVENT;
+  XSETTERMINAL (inev.ie.arg, terminal);
+
+  evq_enqueue (&inev);
+}
+
 void
 pgtk_set_event_handler (struct frame *f)
 {
@@ -6282,26 +6292,6 @@ same_x_server (const char *name1, const char *name2)
          && (*name2 == '.' || *name2 == '\0'));
 }
 
-#define GNOME_INTERFACE_SCHEMA "org.gnome.desktop.interface"
-
-static gdouble pgtk_text_scaling_factor (void)
-{
-  GSettingsSchemaSource *schema_source = g_settings_schema_source_get_default 
();
-  if (schema_source != NULL)
-    {
-      GSettingsSchema *schema = g_settings_schema_source_lookup (schema_source,
-         GNOME_INTERFACE_SCHEMA, true);
-      if (schema != NULL)
-        {
-         g_settings_schema_unref (schema);
-         GSettings *set = g_settings_new (GNOME_INTERFACE_SCHEMA);
-         return g_settings_get_double (set, "text-scaling-factor");
-       }
-    }
-  return 1;
-}
-
-
 /* Open a connection to X display DISPLAY_NAME, and return
    the structure that describes the open display.
    If we cannot contact the display, return null.  */
@@ -6318,6 +6308,8 @@ pgtk_term_init (Lisp_Object display_name, char 
*resource_name)
   char *dpy_name;
   static void *handle = NULL;
   Lisp_Object lisp_dpy_name = Qnil;
+  GdkScreen *gscr;
+  gdouble dpi;
 
   block_input ();
 
@@ -6468,21 +6460,22 @@ pgtk_term_init (Lisp_Object display_name, char 
*resource_name)
 
   reset_mouse_highlight (&dpyinfo->mouse_highlight);
 
-  {
-    GdkScreen *gscr = gdk_display_get_default_screen (dpyinfo->gdpy);
+  gscr = gdk_display_get_default_screen (dpyinfo->gdpy);
+  dpi = gdk_screen_get_resolution (gscr);
 
-    gdouble dpi = gdk_screen_get_resolution (gscr);
-    if (dpi < 0)
-       dpi = 96.0;
+  if (dpi < 0)
+    dpi = 96.0;
 
-    dpi *= pgtk_text_scaling_factor ();
-    dpyinfo->resx = dpi;
-    dpyinfo->resy = dpi;
-  }
+  dpyinfo->resx = dpi;
+  dpyinfo->resy = dpi;
+
+  g_signal_connect (G_OBJECT (gscr), "monitors-changed",
+                   G_CALLBACK (pgtk_monitors_changed_cb),
+                   terminal);
 
-  /* smooth scroll setting */
-  dpyinfo->scroll.x_per_char = 2;
-  dpyinfo->scroll.y_per_line = 2;
+  /* Set up scrolling increments.  */
+  dpyinfo->scroll.x_per_char = 1;
+  dpyinfo->scroll.y_per_line = 1;
 
   dpyinfo->connection = -1;
 
@@ -6608,9 +6601,9 @@ pgtk_xlfd_to_fontname (const char *xlfd)
 }
 
 bool
-pgtk_defined_color (struct frame *f,
-                   const char *name,
-                   Emacs_Color * color_def, bool alloc, bool makeIndex)
+pgtk_defined_color (struct frame *f, const char *name,
+                   Emacs_Color *color_def, bool alloc,
+                   bool makeIndex)
 /* --------------------------------------------------------------------------
          Return true if named color found, and set color_def rgb accordingly.
          If makeIndex and alloc are nonzero put the color in the color_table,
diff --git a/src/pgtkterm.h b/src/pgtkterm.h
index 20c161e63b..e31e62ae19 100644
--- a/src/pgtkterm.h
+++ b/src/pgtkterm.h
@@ -96,7 +96,7 @@ struct scroll_bar
      editing large files, we establish a minimum height by always
      drawing handle bottoms VERTICAL_SCROLL_BAR_MIN_HANDLE pixels below
      where they would be normally; the bottom and top are in a
-     different co-ordinate system.  */
+     different coordinate system.  */
   int start, end;
 
   /* If the scroll bar handle is currently being dragged by the user,
diff --git a/src/print.c b/src/print.c
index 81b524d79f..5aee5731e4 100644
--- a/src/print.c
+++ b/src/print.c
@@ -624,7 +624,86 @@ If PRINTCHARFUN is omitted or nil, the value of 
`standard-output' is used.  */)
   return val;
 }
 
-DEFUN ("prin1", Fprin1, Sprin1, 1, 2, 0,
+static Lisp_Object Vprint_variable_mapping;
+
+static void
+print_bind_all_defaults (void)
+{
+  for (Lisp_Object vars = Vprint_variable_mapping; !NILP (vars);
+       vars = XCDR (vars))
+    {
+      Lisp_Object elem = XCDR (XCAR (vars));
+      specbind (XCAR (elem), XCAR (XCDR (elem)));
+    }
+}
+
+static void
+print_create_variable_mapping (void)
+{
+  Lisp_Object total[] = {
+    list3 (intern ("length"), intern ("print-length"), Qnil),
+    list3 (intern ("level"), intern ("print-level"), Qnil),
+    list3 (intern ("circle"), intern ("print-circle"), Qnil),
+    list3 (intern ("quoted"), intern ("print-quoted"), Qt),
+    list3 (intern ("escape-newlines"), intern ("print-escape-newlines"), Qnil),
+    list3 (intern ("escape-control-characters"),
+          intern ("print-escape-control-characters"), Qnil),
+    list3 (intern ("escape-nonascii"), intern ("print-escape-nonascii"), Qnil),
+    list3 (intern ("escape-multibyte"),
+          intern ("print-escape-multibyte"), Qnil),
+    list3 (intern ("charset-text-property"),
+          intern ("print-charset-text-property"), Qnil),
+    list3 (intern ("unreadeable-function"),
+          intern ("print-unreadable-function"), Qnil),
+    list3 (intern ("gensym"), intern ("print-gensym"), Qnil),
+    list3 (intern ("continuous-numbering"),
+          intern ("print-continuous-numbering"), Qnil),
+    list3 (intern ("number-table"), intern ("print-number-table"), Qnil),
+    list3 (intern ("float-format"), intern ("float-output-format"), Qnil),
+    list3 (intern ("integers-as-characters"),
+          intern ("print-integers-as-characters"), Qnil),
+  };
+
+  Vprint_variable_mapping = CALLMANY (Flist, total);
+}
+
+static void
+print_bind_overrides (Lisp_Object overrides)
+{
+  if (NILP (Vprint_variable_mapping))
+    print_create_variable_mapping ();
+
+  if (EQ (overrides, Qt))
+    print_bind_all_defaults ();
+  else if (!CONSP (overrides))
+    xsignal (Qwrong_type_argument, Qconsp);
+  else
+    {
+      while (!NILP (overrides))
+       {
+         Lisp_Object setting = XCAR (overrides);
+         if (EQ (setting, Qt))
+           print_bind_all_defaults ();
+         else if (!CONSP (setting))
+           xsignal (Qwrong_type_argument, Qconsp);
+         else
+           {
+             Lisp_Object key = XCAR (setting),
+               value = XCDR (setting);
+             Lisp_Object map = Fassq (key, Vprint_variable_mapping);
+             if (NILP (map))
+               xsignal2 (Qwrong_type_argument, Qsymbolp, map);
+             specbind (XCAR (XCDR (map)), value);
+           }
+
+         if (!NILP (XCDR (overrides)) && !CONSP (XCDR (overrides)))
+           xsignal (Qwrong_type_argument, Qconsp);
+         overrides = XCDR (overrides);
+       }
+    }
+}
+
+DEFUN ("prin1", Fprin1, Sprin1, 1, 3, 0,
        doc: /* Output the printed representation of OBJECT, any Lisp object.
 Quoting characters are printed when needed to make output that `read'
 can handle, whenever this is possible.  For complex objects, the behavior
@@ -646,21 +725,43 @@ of these:
    - t, in which case the output is displayed in the echo area.
 
 If PRINTCHARFUN is omitted, the value of `standard-output' (which see)
-is used instead.  */)
-  (Lisp_Object object, Lisp_Object printcharfun)
+is used instead.
+
+Optional argument OVERRIDES should be a list of settings for print-related
+variables.  An element in this list can be the symbol t, which means "reset
+all the values to their defaults".  Otherwise, an element should be a pair,
+where the `car' or the pair is the setting symbol, and the `cdr' is the
+value of of the setting to use for this `prin1' call.
+
+For instance:
+
+  (prin1 object nil \\='((length . 100) (circle . t))).
+
+See the manual entry `(elisp)Output Overrides' for a list of possible
+values.
+
+As a special case, OVERRIDES can also simply be the symbol t, which
+means "use default values for all the print-related settings".  */)
+  (Lisp_Object object, Lisp_Object printcharfun, Lisp_Object overrides)
 {
+  specpdl_ref count = SPECPDL_INDEX ();
+
   if (NILP (printcharfun))
     printcharfun = Vstandard_output;
+  if (!NILP (overrides))
+    print_bind_overrides (overrides);
+
   PRINTPREPARE;
   print (object, printcharfun, 1);
   PRINTFINISH;
-  return object;
+
+  return unbind_to (count, object);
 }
 
 /* A buffer which is used to hold output being built by prin1-to-string.  */
 Lisp_Object Vprin1_to_string_buffer;
 
-DEFUN ("prin1-to-string", Fprin1_to_string, Sprin1_to_string, 1, 2, 0,
+DEFUN ("prin1-to-string", Fprin1_to_string, Sprin1_to_string, 1, 3, 0,
        doc: /* Return a string containing the printed representation of OBJECT.
 OBJECT can be any Lisp object.  This function outputs quoting characters
 when necessary to make output that `read' can handle, whenever possible,
@@ -670,13 +771,18 @@ the behavior is controlled by `print-level' and 
`print-length', which see.
 OBJECT is any of the Lisp data types: a number, a string, a symbol,
 a list, a buffer, a window, a frame, etc.
 
+See `prin1' for the meaning of OVERRIDES.
+
 A printed representation of an object is text which describes that object.  */)
-  (Lisp_Object object, Lisp_Object noescape)
+  (Lisp_Object object, Lisp_Object noescape, Lisp_Object overrides)
 {
   specpdl_ref count = SPECPDL_INDEX ();
 
   specbind (Qinhibit_modification_hooks, Qt);
 
+  if (!NILP (overrides))
+    print_bind_overrides (overrides);
+
   /* Save and restore this: we are altering a buffer
      but we don't want to deactivate the mark just for that.
      No need for specbind, since errors deactivate the mark.  */
@@ -732,7 +838,13 @@ is used instead.  */)
   if (NILP (printcharfun))
     printcharfun = Vstandard_output;
   PRINTPREPARE;
-  print (object, printcharfun, 0);
+  if (STRINGP (object)
+      && !string_intervals (object)
+      && NILP (Vprint_continuous_numbering))
+    /* fast path for plain strings */
+    print_string (object, printcharfun);
+  else
+    print (object, printcharfun, 0);
   PRINTFINISH;
   return object;
 }
@@ -851,7 +963,7 @@ append to existing target file.  */)
 void
 debug_print (Lisp_Object arg)
 {
-  Fprin1 (arg, Qexternal_debugging_output);
+  Fprin1 (arg, Qexternal_debugging_output, Qnil);
   fputs ("\r\n", stderr);
 }
 
@@ -999,7 +1111,7 @@ print_error_message (Lisp_Object data, Lisp_Object stream, 
const char *context,
            || EQ (errname, Qend_of_file) || EQ (errname, Quser_error))
          Fprinc (obj, stream);
        else
-         Fprin1 (obj, stream);
+         Fprin1 (obj, stream, Qnil);
       }
   }
 }
@@ -1147,7 +1259,6 @@ print (Lisp_Object obj, Lisp_Object printcharfun, bool 
escapeflag)
     {
       /* Construct Vprint_number_table.
         This increments print_number_index for the objects added.  */
-      print_depth = 0;
       print_preprocess (obj);
 
       if (HASH_TABLE_P (Vprint_number_table))
@@ -1159,7 +1270,7 @@ print (Lisp_Object obj, Lisp_Object printcharfun, bool 
escapeflag)
          for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
             {
               Lisp_Object key =  HASH_KEY (h, i);
-             if (!EQ (key, Qunbound)
+             if (!BASE_EQ (key, Qunbound)
                  && EQ (HASH_VALUE (h, i), Qt))
                Fremhash (key, Vprint_number_table);
             }
@@ -1171,10 +1282,7 @@ print (Lisp_Object obj, Lisp_Object printcharfun, bool 
escapeflag)
 }
 
 #define PRINT_CIRCLE_CANDIDATE_P(obj)                     \
-  ((STRINGP (obj)                                          \
-       && (string_intervals (obj)                          \
-          || print_depth > 1                              \
-          || !NILP (Vprint_continuous_numbering)))        \
+  (STRINGP (obj)                                           \
    || CONSP (obj)                                         \
    || (VECTORLIKEP (obj)                                  \
        && (VECTORP (obj) || COMPILEDP (obj)               \
@@ -1185,6 +1293,78 @@ print (Lisp_Object obj, Lisp_Object printcharfun, bool 
escapeflag)
        && SYMBOLP (obj)                                           \
        && !SYMBOL_INTERNED_P (obj)))
 
+/* The print preprocess stack, used to traverse data structures.  */
+
+struct print_pp_entry {
+  ptrdiff_t n;                 /* number of values, or 0 if a single value */
+  union {
+    Lisp_Object value;         /* when n = 0 */
+    Lisp_Object *values;       /* when n > 0 */
+  } u;
+};
+
+struct print_pp_stack {
+  struct print_pp_entry *stack;         /* base of stack */
+  ptrdiff_t size;               /* allocated size in entries */
+  ptrdiff_t sp;                         /* current number of entries */
+};
+
+static struct print_pp_stack ppstack = {NULL, 0, 0};
+
+NO_INLINE static void
+grow_pp_stack (void)
+{
+  struct print_pp_stack *ps = &ppstack;
+  eassert (ps->sp == ps->size);
+  ps->stack = xpalloc (ps->stack, &ps->size, 1, -1, sizeof *ps->stack);
+  eassert (ps->sp < ps->size);
+}
+
+static inline void
+pp_stack_push_value (Lisp_Object value)
+{
+  if (ppstack.sp >= ppstack.size)
+    grow_pp_stack ();
+  ppstack.stack[ppstack.sp++] = (struct print_pp_entry){.n = 0,
+                                                       .u.value = value};
+}
+
+static inline void
+pp_stack_push_values (Lisp_Object *values, ptrdiff_t n)
+{
+  eassume (n >= 0);
+  if (n == 0)
+    return;
+  if (ppstack.sp >= ppstack.size)
+    grow_pp_stack ();
+  ppstack.stack[ppstack.sp++] = (struct print_pp_entry){.n = n,
+                                                       .u.values = values};
+}
+
+static inline bool
+pp_stack_empty_p (void)
+{
+  return ppstack.sp <= 0;
+}
+
+static inline Lisp_Object
+pp_stack_pop (void)
+{
+  eassume (!pp_stack_empty_p ());
+  struct print_pp_entry *e = &ppstack.stack[ppstack.sp - 1];
+  if (e->n == 0)               /* single value */
+    {
+      --ppstack.sp;
+      return e->u.value;
+    }
+  /* Array of values: pop them left to right, which seems to be slightly
+     faster than right to left.  */
+  e->n--;
+  if (e->n == 0)
+    --ppstack.sp;              /* last value consumed */
+  return (++e->u.values)[-1];
+}
+
 /* Construct Vprint_number_table for the print-circle feature
    according to the structure of OBJ.  OBJ itself and all its elements
    will be added to Vprint_number_table recursively if it is a list,
@@ -1196,86 +1376,81 @@ print (Lisp_Object obj, Lisp_Object printcharfun, bool 
escapeflag)
 static void
 print_preprocess (Lisp_Object obj)
 {
-  int i;
-  ptrdiff_t size;
-  int loop_count = 0;
-  Lisp_Object halftail;
-
   eassert (!NILP (Vprint_circle));
+  ptrdiff_t base_sp = ppstack.sp;
 
-  print_depth++;
-  halftail = obj;
-
- loop:
-  if (PRINT_CIRCLE_CANDIDATE_P (obj))
+  for (;;)
     {
-      if (!HASH_TABLE_P (Vprint_number_table))
-       Vprint_number_table = CALLN (Fmake_hash_table, QCtest, Qeq);
-
-      Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil);
-      if (!NILP (num)
-         /* If Vprint_continuous_numbering is non-nil and OBJ is a gensym,
-            always print the gensym with a number.  This is a special for
-            the lisp function byte-compile-output-docform.  */
-         || (!NILP (Vprint_continuous_numbering)
-             && SYMBOLP (obj)
-             && !SYMBOL_INTERNED_P (obj)))
-       { /* OBJ appears more than once.  Let's remember that.  */
-         if (!FIXNUMP (num))
-           {
-             print_number_index++;
-             /* Negative number indicates it hasn't been printed yet.  */
-             Fputhash (obj, make_fixnum (- print_number_index),
-                       Vprint_number_table);
+      if (PRINT_CIRCLE_CANDIDATE_P (obj))
+       {
+         if (!HASH_TABLE_P (Vprint_number_table))
+           Vprint_number_table = CALLN (Fmake_hash_table, QCtest, Qeq);
+
+         Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil);
+         if (!NILP (num)
+             /* If Vprint_continuous_numbering is non-nil and OBJ is a gensym,
+                always print the gensym with a number.  This is a special for
+                the lisp function byte-compile-output-docform.  */
+             || (!NILP (Vprint_continuous_numbering)
+                 && SYMBOLP (obj)
+                 && !SYMBOL_INTERNED_P (obj)))
+           { /* OBJ appears more than once.  Let's remember that.  */
+             if (!FIXNUMP (num))
+               {
+                 print_number_index++;
+                 /* Negative number indicates it hasn't been printed yet.  */
+                 Fputhash (obj, make_fixnum (- print_number_index),
+                           Vprint_number_table);
+               }
            }
-         print_depth--;
-         return;
-       }
-      else
-       /* OBJ is not yet recorded.  Let's add to the table.  */
-       Fputhash (obj, Qt, Vprint_number_table);
+         else
+           {
+             /* OBJ is not yet recorded.  Let's add to the table.  */
+             Fputhash (obj, Qt, Vprint_number_table);
 
-      switch (XTYPE (obj))
-       {
-       case Lisp_String:
-         /* A string may have text properties, which can be circular.  */
-         traverse_intervals_noorder (string_intervals (obj),
-                                     print_preprocess_string, NULL);
-         break;
+             switch (XTYPE (obj))
+               {
+               case Lisp_String:
+                 /* A string may have text properties,
+                    which can be circular. */
+                 traverse_intervals_noorder (string_intervals (obj),
+                                             print_preprocess_string, NULL);
+                 break;
 
-       case Lisp_Cons:
-         /* Use HALFTAIL and LOOP_COUNT to detect circular lists,
-            just as in print_object.  */
-         if (loop_count && EQ (obj, halftail))
-           break;
-         print_preprocess (XCAR (obj));
-         obj = XCDR (obj);
-         loop_count++;
-         if (!(loop_count & 1))
-           halftail = XCDR (halftail);
-         goto loop;
-
-       case Lisp_Vectorlike:
-         size = ASIZE (obj);
-         if (size & PSEUDOVECTOR_FLAG)
-           size &= PSEUDOVECTOR_SIZE_MASK;
-         for (i = (SUB_CHAR_TABLE_P (obj)
-                   ? SUB_CHAR_TABLE_OFFSET : 0); i < size; i++)
-           print_preprocess (AREF (obj, i));
-         if (HASH_TABLE_P (obj))
-           { /* For hash tables, the key_and_value slot is past
-                `size' because it needs to be marked specially in case
-                the table is weak.  */
-             struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
-             print_preprocess (h->key_and_value);
-           }
-         break;
+               case Lisp_Cons:
+                 if (!NILP (XCDR (obj)))
+                   pp_stack_push_value (XCDR (obj));
+                 obj = XCAR (obj);
+                 continue;
 
-       default:
-         break;
+               case Lisp_Vectorlike:
+                 {
+                   struct Lisp_Vector *vec = XVECTOR (obj);
+                   ptrdiff_t size = ASIZE (obj);
+                   if (size & PSEUDOVECTOR_FLAG)
+                     size &= PSEUDOVECTOR_SIZE_MASK;
+                   ptrdiff_t start = (SUB_CHAR_TABLE_P (obj)
+                                      ? SUB_CHAR_TABLE_OFFSET : 0);
+                   pp_stack_push_values (vec->contents + start, size - start);
+                   if (HASH_TABLE_P (obj))
+                     {
+                       struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
+                       obj = h->key_and_value;
+                       continue;
+                     }
+                   break;
+                 }
+
+               default:
+                 break;
+               }
+           }
        }
+
+      if (ppstack.sp <= base_sp)
+       break;
+      obj = pp_stack_pop ();
     }
-  print_depth--;
 }
 
 DEFUN ("print--preprocess", Fprint_preprocess, Sprint_preprocess, 1, 1, 0,
@@ -1467,162 +1642,6 @@ print_vectorlike (Lisp_Object obj, Lisp_Object 
printcharfun, bool escapeflag,
       }
       return true;
 
-    case PVEC_HASH_TABLE:
-      {
-       struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
-       /* Implement a readable output, e.g.:
-         #s(hash-table size 2 test equal data (k1 v1 k2 v2)) */
-       /* Always print the size.  */
-       int len = sprintf (buf, "#s(hash-table size %"pD"d",
-                           HASH_TABLE_SIZE (h));
-       strout (buf, len, len, printcharfun);
-
-       if (!NILP (h->test.name))
-         {
-           print_c_string (" test ", printcharfun);
-           print_object (h->test.name, printcharfun, escapeflag);
-         }
-
-       if (!NILP (h->weak))
-         {
-           print_c_string (" weakness ", printcharfun);
-           print_object (h->weak, printcharfun, escapeflag);
-         }
-
-       print_c_string (" rehash-size ", printcharfun);
-       print_object (Fhash_table_rehash_size (obj),
-                     printcharfun, escapeflag);
-
-       print_c_string (" rehash-threshold ", printcharfun);
-       print_object (Fhash_table_rehash_threshold (obj),
-                     printcharfun, escapeflag);
-
-       if (h->purecopy)
-         {
-           print_c_string (" purecopy ", printcharfun);
-           print_object (h->purecopy ? Qt : Qnil, printcharfun, escapeflag);
-         }
-
-       print_c_string (" data ", printcharfun);
-
-       /* Print the data here as a plist. */
-       ptrdiff_t real_size = HASH_TABLE_SIZE (h);
-       ptrdiff_t size = h->count;
-
-       /* Don't print more elements than the specified maximum.  */
-       if (FIXNATP (Vprint_length) && XFIXNAT (Vprint_length) < size)
-         size = XFIXNAT (Vprint_length);
-
-       printchar ('(', printcharfun);
-       ptrdiff_t j = 0;
-       for (ptrdiff_t i = 0; i < real_size; i++)
-          {
-            Lisp_Object key = HASH_KEY (h, i);
-           if (!EQ (key, Qunbound))
-             {
-               if (j++) printchar (' ', printcharfun);
-               print_object (key, printcharfun, escapeflag);
-               printchar (' ', printcharfun);
-               print_object (HASH_VALUE (h, i), printcharfun, escapeflag);
-               if (j == size)
-                 break;
-             }
-          }
-
-       if (j < h->count)
-         {
-           if (j)
-             printchar (' ', printcharfun);
-           print_c_string ("...", printcharfun);
-         }
-
-       print_c_string ("))", printcharfun);
-      }
-      return true;
-
-    case PVEC_RECORD:
-      {
-       ptrdiff_t size = PVSIZE (obj);
-
-       /* Don't print more elements than the specified maximum.  */
-       ptrdiff_t n
-         = (FIXNATP (Vprint_length) && XFIXNAT (Vprint_length) < size
-            ? XFIXNAT (Vprint_length) : size);
-
-       print_c_string ("#s(", printcharfun);
-       for (ptrdiff_t i = 0; i < n; i ++)
-         {
-           if (i) printchar (' ', printcharfun);
-           print_object (AREF (obj, i), printcharfun, escapeflag);
-         }
-       if (n < size)
-         print_c_string (" ...", printcharfun);
-       printchar (')', printcharfun);
-      }
-      return true;
-
-    case PVEC_SUB_CHAR_TABLE:
-    case PVEC_COMPILED:
-    case PVEC_CHAR_TABLE:
-    case PVEC_NORMAL_VECTOR:
-      {
-       ptrdiff_t size = ASIZE (obj);
-       if (COMPILEDP (obj))
-         {
-           printchar ('#', printcharfun);
-           size &= PSEUDOVECTOR_SIZE_MASK;
-         }
-       if (CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj))
-         {
-           /* Print a char-table as if it were a vector,
-              lumping the parent and default slots in with the
-              character slots.  But add #^ as a prefix.  */
-
-           /* Make each lowest sub_char_table start a new line.
-              Otherwise we'll make a line extremely long, which
-              results in slow redisplay.  */
-           if (SUB_CHAR_TABLE_P (obj)
-               && XSUB_CHAR_TABLE (obj)->depth == 3)
-             printchar ('\n', printcharfun);
-           print_c_string ("#^", printcharfun);
-           if (SUB_CHAR_TABLE_P (obj))
-             printchar ('^', printcharfun);
-           size &= PSEUDOVECTOR_SIZE_MASK;
-         }
-       if (size & PSEUDOVECTOR_FLAG)
-         return false;
-
-       printchar ('[', printcharfun);
-
-       int idx = SUB_CHAR_TABLE_P (obj) ? SUB_CHAR_TABLE_OFFSET : 0;
-       Lisp_Object tem;
-       ptrdiff_t real_size = size;
-
-       /* For a sub char-table, print heading non-Lisp data first.  */
-       if (SUB_CHAR_TABLE_P (obj))
-         {
-           int i = sprintf (buf, "%d %d", XSUB_CHAR_TABLE (obj)->depth,
-                            XSUB_CHAR_TABLE (obj)->min_char);
-           strout (buf, i, i, printcharfun);
-         }
-
-       /* Don't print more elements than the specified maximum.  */
-       if (FIXNATP (Vprint_length)
-           && XFIXNAT (Vprint_length) < size)
-         size = XFIXNAT (Vprint_length);
-
-       for (int i = idx; i < size; i++)
-         {
-           if (i) printchar (' ', printcharfun);
-           tem = AREF (obj, i);
-           print_object (tem, printcharfun, escapeflag);
-         }
-       if (size < real_size)
-         print_c_string (" ...", printcharfun);
-       printchar (']', printcharfun);
-      }
-      return true;
-
     default:
       break;
     }
@@ -2028,32 +2047,132 @@ named_escape (int i)
   return 0;
 }
 
+enum print_entry_type
+  {
+    PE_list,                   /* print rest of list */
+    PE_rbrac,                  /* print ")" */
+    PE_vector,                 /* print rest of vector */
+    PE_hash,                   /* print rest of hash data */
+  };
+
+struct print_stack_entry
+{
+  enum print_entry_type type;
+
+  union
+  {
+    struct
+    {
+      Lisp_Object last;                /* cons whose car was just printed  */
+      intmax_t maxlen;         /* max number of elements left to print */
+      /* State for Brent cycle detection.  See
+        Brent RP. BIT. 1980;20(2):176-184. doi:10.1007/BF01933190
+        https://maths-people.anu.edu.au/~brent/pd/rpb051i.pdf */
+      Lisp_Object tortoise;     /* slow pointer */
+      ptrdiff_t n;             /* tortoise step countdown */
+      ptrdiff_t m;             /* tortoise step period */
+      intmax_t tortoise_idx;   /* index of tortoise */
+    } list;
+
+    struct
+    {
+      Lisp_Object obj;         /* object to print after " . " */
+    } dotted_cdr;
+
+    struct
+    {
+      Lisp_Object obj;         /* vector object */
+      ptrdiff_t size;          /* length of vector */
+      ptrdiff_t idx;           /* index of next element */
+      const char *end;         /* string to print at end */
+      bool truncated;          /* whether to print "..." before end */
+    } vector;
+
+    struct
+    {
+      Lisp_Object obj;         /* hash-table object */
+      ptrdiff_t nobjs;         /* number of keys and values to print */
+      ptrdiff_t idx;           /* index of key-value pair */
+      ptrdiff_t printed;       /* number of keys and values printed */
+      bool truncated;          /* whether to print "..." before end */
+    } hash;
+  } u;
+};
+
+struct print_stack
+{
+  struct print_stack_entry *stack;  /* base of stack */
+  ptrdiff_t size;                  /* allocated size in entries */
+  ptrdiff_t sp;                            /* current number of entries */
+};
+
+static struct print_stack prstack = {NULL, 0, 0};
+
+NO_INLINE static void
+grow_print_stack (void)
+{
+  struct print_stack *ps = &prstack;
+  eassert (ps->sp == ps->size);
+  ps->stack = xpalloc (ps->stack, &ps->size, 1, -1, sizeof *ps->stack);
+  eassert (ps->sp < ps->size);
+}
+
+static inline void
+print_stack_push (struct print_stack_entry e)
+{
+  if (prstack.sp >= prstack.size)
+    grow_print_stack ();
+  prstack.stack[prstack.sp++] = e;
+}
+
+static void
+print_stack_push_vector (const char *lbrac, const char *rbrac,
+                        Lisp_Object obj, ptrdiff_t start, ptrdiff_t size,
+                        Lisp_Object printcharfun)
+{
+  print_c_string (lbrac, printcharfun);
+
+  ptrdiff_t print_size = ((FIXNATP (Vprint_length)
+                          && XFIXNAT (Vprint_length) < size)
+                         ? XFIXNAT (Vprint_length) : size);
+  print_stack_push ((struct print_stack_entry){
+      .type = PE_vector,
+      .u.vector.obj = obj,
+      .u.vector.size = print_size,
+      .u.vector.idx = start,
+      .u.vector.end = rbrac,
+      .u.vector.truncated = (print_size < size),
+    });
+}
+
 static void
 print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag)
 {
+  ptrdiff_t base_depth = print_depth;
+  ptrdiff_t base_sp = prstack.sp;
   char buf[max (sizeof "from..to..in " + 2 * INT_STRLEN_BOUND (EMACS_INT),
                max (sizeof " . #" + INT_STRLEN_BOUND (intmax_t),
                     max ((sizeof " with data 0x"
                           + (sizeof (uintmax_t) * CHAR_BIT + 4 - 1) / 4),
                          40)))];
   current_thread->stack_top = buf;
+
+ print_obj:
   maybe_quit ();
 
   /* Detect circularities and truncate them.  */
   if (NILP (Vprint_circle))
     {
       /* Simple but incomplete way.  */
-      int i;
-
       if (print_depth >= PRINT_CIRCLE)
        error ("Apparently circular structure being printed");
 
-      for (i = 0; i < print_depth; i++)
+      for (int i = 0; i < print_depth; i++)
        if (BASE_EQ (obj, being_printed[i]))
          {
            int len = sprintf (buf, "#%d", i);
            strout (buf, len, len, printcharfun);
-           return;
+           goto next_obj;
          }
       being_printed[print_depth] = obj;
     }
@@ -2077,7 +2196,7 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, 
bool escapeflag)
              /* Just print #n# if OBJ has already been printed.  */
              int len = sprintf (buf, "#%"pI"d#", n);
              strout (buf, len, len, printcharfun);
-             return;
+             goto next_obj;
            }
        }
     }
@@ -2151,7 +2270,8 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, 
bool escapeflag)
          for (i = 0, i_byte = 0; i_byte < size_byte;)
            {
              /* Here, we must convert each multi-byte form to the
-                corresponding character code before handing it to printchar.  
*/
+                corresponding character code before handing it to
+                printchar.  */
              int c = fetch_string_char_advance (obj, &i, &i_byte);
 
              maybe_quit ();
@@ -2171,7 +2291,8 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, 
bool escapeflag)
              else if (multibyte
                       && ! ASCII_CHAR_P (c) && print_escape_multibyte)
                {
-                 /* When requested, print multibyte chars using hex escapes.  
*/
+                 /* When requested, print multibyte chars using
+                    hex escapes.  */
                  char outbuf[sizeof "\\x" + INT_STRLEN_BOUND (c)];
                  int len = sprintf (outbuf, "\\x%04x", c + 0u);
                  strout (outbuf, len, len, printcharfun);
@@ -2282,14 +2403,22 @@ print_object (Lisp_Object obj, Lisp_Object 
printcharfun, bool escapeflag)
               && EQ (XCAR (obj), Qquote))
        {
          printchar ('\'', printcharfun);
-         print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
+         obj = XCAR (XCDR (obj));
+         --print_depth;        /* tail recursion */
+         goto print_obj;
        }
       else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
               && EQ (XCAR (obj), Qfunction))
        {
          print_c_string ("#'", printcharfun);
-         print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
+         obj = XCAR (XCDR (obj));
+         --print_depth;        /* tail recursion */
+         goto print_obj;
        }
+      /* FIXME: Do we really need the new_backquote_output gating of
+        special syntax for comma and comma-at?  There is basically no
+        benefit from it at all, and it would be nice to get rid of
+        the recursion here without additional complexity.  */
       else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
               && EQ (XCAR (obj), Qbackquote))
        {
@@ -2299,9 +2428,9 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, 
bool escapeflag)
          new_backquote_output--;
        }
       else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
-              && new_backquote_output
               && (EQ (XCAR (obj), Qcomma)
-                  || EQ (XCAR (obj), Qcomma_at)))
+                  || EQ (XCAR (obj), Qcomma_at))
+              && new_backquote_output)
        {
          print_object (XCAR (obj), printcharfun, false);
          new_backquote_output--;
@@ -2311,70 +2440,135 @@ print_object (Lisp_Object obj, Lisp_Object 
printcharfun, bool escapeflag)
       else
        {
          printchar ('(', printcharfun);
-
          /* Negative values of print-length are invalid in CL.
             Treat them like nil, as CMUCL does.  */
          intmax_t print_length = (FIXNATP (Vprint_length)
                                   ? XFIXNAT (Vprint_length)
                                   : INTMAX_MAX);
-         Lisp_Object objtail = Qnil;
-         intmax_t i = 0;
-         FOR_EACH_TAIL_SAFE (obj)
+         if (print_length == 0)
+           print_c_string ("...)", printcharfun);
+         else
            {
-             if (i != 0)
-               {
-                 printchar (' ', printcharfun);
-
-                 if (!NILP (Vprint_circle))
-                   {
-                     /* With the print-circle feature.  */
-                     Lisp_Object num = Fgethash (obj, Vprint_number_table,
-                                                 Qnil);
-                     if (FIXNUMP (num))
-                       {
-                         print_c_string (". ", printcharfun);
-                         print_object (obj, printcharfun, escapeflag);
-                         goto end_of_list;
-                       }
-                   }
-               }
-
-             if (print_length <= i)
-               {
-                 print_c_string ("...", printcharfun);
-                 goto end_of_list;
-               }
-
-             i++;
-             print_object (XCAR (obj), printcharfun, escapeflag);
-             objtail = XCDR (obj);
+             print_stack_push ((struct print_stack_entry){
+                 .type = PE_list,
+                 .u.list.last = obj,
+                 .u.list.maxlen = print_length,
+                 .u.list.tortoise = obj,
+                 .u.list.n = 2,
+                 .u.list.m = 2,
+                 .u.list.tortoise_idx = 0,
+               });
+             /* print the car */
+             obj = XCAR (obj);
+             goto print_obj;
            }
+       }
+      break;
 
-         /* OBJTAIL non-nil here means it's the end of a dotted list
-            or FOR_EACH_TAIL_SAFE detected a circular list.  */
-         if (!NILP (objtail))
-           {
-             print_c_string (" . ", printcharfun);
+    case Lisp_Vectorlike:
+      /* First do all the vectorlike types that have a readable syntax.  */
+      switch (PSEUDOVECTOR_TYPE (XVECTOR (obj)))
+       {
+       case PVEC_NORMAL_VECTOR:
+         {
+           print_stack_push_vector ("[", "]", obj, 0, ASIZE (obj),
+                                    printcharfun);
+           goto next_obj;
+         }
+       case PVEC_RECORD:
+         {
+           print_stack_push_vector ("#s(", ")", obj, 0, PVSIZE (obj),
+                                    printcharfun);
+           goto next_obj;
+         }
+       case PVEC_COMPILED:
+         {
+           print_stack_push_vector ("#[", "]", obj, 0, PVSIZE (obj),
+                                    printcharfun);
+           goto next_obj;
+         }
+       case PVEC_CHAR_TABLE:
+         {
+           print_stack_push_vector ("#^[", "]", obj, 0, PVSIZE (obj),
+                                    printcharfun);
+           goto next_obj;
+         }
+       case PVEC_SUB_CHAR_TABLE:
+         {
+           /* Make each lowest sub_char_table start a new line.
+              Otherwise we'll make a line extremely long, which
+              results in slow redisplay.  */
+           if (XSUB_CHAR_TABLE (obj)->depth == 3)
+             printchar ('\n', printcharfun);
+           print_c_string ("#^^[", printcharfun);
+           int n = sprintf (buf, "%d %d",
+                            XSUB_CHAR_TABLE (obj)->depth,
+                            XSUB_CHAR_TABLE (obj)->min_char);
+           strout (buf, n, n, printcharfun);
+           print_stack_push_vector ("", "]", obj,
+                                    SUB_CHAR_TABLE_OFFSET, PVSIZE (obj),
+                                    printcharfun);
+           goto next_obj;
+         }
+       case PVEC_HASH_TABLE:
+         {
+           struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
+           /* Implement a readable output, e.g.:
+              #s(hash-table size 2 test equal data (k1 v1 k2 v2)) */
+           /* Always print the size.  */
+           int len = sprintf (buf, "#s(hash-table size %"pD"d",
+                              HASH_TABLE_SIZE (h));
+           strout (buf, len, len, printcharfun);
 
-             if (CONSP (objtail) && NILP (Vprint_circle))
-               {
-                 int len = sprintf (buf, "#%"PRIdMAX, i >> 1);
-                 strout (buf, len, len, printcharfun);
-                 goto end_of_list;
-               }
+           if (!NILP (h->test.name))
+             {
+               print_c_string (" test ", printcharfun);
+               print_object (h->test.name, printcharfun, escapeflag);
+             }
 
-             print_object (objtail, printcharfun, escapeflag);
-           }
+           if (!NILP (h->weak))
+             {
+               print_c_string (" weakness ", printcharfun);
+               print_object (h->weak, printcharfun, escapeflag);
+             }
 
-       end_of_list:
-         printchar (')', printcharfun);
+           print_c_string (" rehash-size ", printcharfun);
+           print_object (Fhash_table_rehash_size (obj),
+                         printcharfun, escapeflag);
+
+           print_c_string (" rehash-threshold ", printcharfun);
+           print_object (Fhash_table_rehash_threshold (obj),
+                         printcharfun, escapeflag);
+
+           if (h->purecopy)
+             print_c_string (" purecopy t", printcharfun);
+
+           print_c_string (" data (", printcharfun);
+
+           ptrdiff_t size = h->count;
+           /* Don't print more elements than the specified maximum.  */
+           if (FIXNATP (Vprint_length) && XFIXNAT (Vprint_length) < size)
+             size = XFIXNAT (Vprint_length);
+
+           print_stack_push ((struct print_stack_entry){
+               .type = PE_hash,
+               .u.hash.obj = obj,
+               .u.hash.nobjs = size * 2,
+               .u.hash.idx = 0,
+               .u.hash.printed = 0,
+               .u.hash.truncated = (size < h->count),
+             });
+           goto next_obj;
+         }
+
+       default:
+         break;
        }
-      break;
 
-    case Lisp_Vectorlike:
       if (print_vectorlike (obj, printcharfun, escapeflag, buf))
        break;
       FALLTHROUGH;
+
     default:
       {
        int len;
@@ -2389,10 +2583,157 @@ print_object (Lisp_Object obj, Lisp_Object 
printcharfun, bool escapeflag)
        print_c_string ((" Save your buffers immediately"
                         " and please report this bug>"),
                        printcharfun);
+       break;
       }
     }
-
   print_depth--;
+
+ next_obj:
+  if (prstack.sp > base_sp)
+    {
+      /* Handle a continuation on the print stack.  */
+      struct print_stack_entry *e = &prstack.stack[prstack.sp - 1];
+      switch (e->type)
+       {
+       case PE_list:
+         {
+           /* after "(" ELEM (* " " ELEM) */
+           Lisp_Object next = XCDR (e->u.list.last);
+           if (NILP (next))
+             {
+               /* end of list: print ")" */
+               printchar (')', printcharfun);
+               --prstack.sp;
+               --print_depth;
+               goto next_obj;
+             }
+           else if (CONSP (next))
+             {
+               if (!NILP (Vprint_circle))
+                 {
+                   /* With the print-circle feature.  */
+                   Lisp_Object num = Fgethash (next, Vprint_number_table,
+                                               Qnil);
+                   if (FIXNUMP (num))
+                     {
+                       print_c_string (" . ", printcharfun);
+                       obj = next;
+                       e->type = PE_rbrac;
+                       goto print_obj;
+                     }
+                 }
+
+               /* list continues: print " " ELEM ... */
+
+               printchar (' ', printcharfun);
+
+               --e->u.list.maxlen;
+               if (e->u.list.maxlen <= 0)
+                 {
+                   print_c_string ("...)", printcharfun);
+                   --prstack.sp;
+                   --print_depth;
+                   goto next_obj;
+                 }
+
+               e->u.list.last = next;
+               e->u.list.n--;
+               if (e->u.list.n == 0)
+                 {
+                   /* Double tortoise update period and teleport it.  */
+                   e->u.list.tortoise_idx += e->u.list.m;
+                   e->u.list.m <<= 1;
+                   e->u.list.n = e->u.list.m;
+                   e->u.list.tortoise = next;
+                 }
+               else if (BASE_EQ (next, e->u.list.tortoise))
+                 {
+                   /* FIXME: This #N tail index is somewhat ambiguous;
+                      see bug#55395.  */
+                   int len = sprintf (buf, ". #%" PRIdMAX ")",
+                                      e->u.list.tortoise_idx);
+                   strout (buf, len, len, printcharfun);
+                   --prstack.sp;
+                   --print_depth;
+                   goto next_obj;
+                 }
+               obj = XCAR (next);
+             }
+           else
+             {
+               /* non-nil ending: print " . " ELEM ")" */
+               print_c_string (" . ", printcharfun);
+               obj = next;
+               e->type = PE_rbrac;
+             }
+           break;
+         }
+
+       case PE_rbrac:
+         printchar (')', printcharfun);
+         --prstack.sp;
+         --print_depth;
+         goto next_obj;
+
+       case PE_vector:
+         if (e->u.vector.idx >= e->u.vector.size)
+           {
+             if (e->u.vector.truncated)
+               {
+                 if (e->u.vector.idx > 0)
+                   printchar (' ', printcharfun);
+                 print_c_string ("...", printcharfun);
+               }
+             print_c_string (e->u.vector.end, printcharfun);
+             --prstack.sp;
+             --print_depth;
+             goto next_obj;
+           }
+         if (e->u.vector.idx > 0)
+           printchar (' ', printcharfun);
+         obj = AREF (e->u.vector.obj, e->u.vector.idx);
+         e->u.vector.idx++;
+         break;
+
+       case PE_hash:
+         if (e->u.hash.printed >= e->u.hash.nobjs)
+           {
+             if (e->u.hash.truncated)
+               {
+                 if (e->u.hash.printed)
+                   printchar (' ', printcharfun);
+                 print_c_string ("...", printcharfun);
+               }
+             print_c_string ("))", printcharfun);
+             --prstack.sp;
+             --print_depth;
+             goto next_obj;
+           }
+
+         if (e->u.hash.printed)
+           printchar (' ', printcharfun);
+
+         struct Lisp_Hash_Table *h = XHASH_TABLE (e->u.hash.obj);
+         if ((e->u.hash.printed & 1) == 0)
+           {
+             Lisp_Object key;
+             ptrdiff_t idx = e->u.hash.idx;
+             while (BASE_EQ ((key = HASH_KEY (h, idx)), Qunbound))
+               idx++;
+             e->u.hash.idx = idx;
+             obj = key;
+           }
+         else
+           {
+             obj = HASH_VALUE (h, e->u.hash.idx);
+             e->u.hash.idx++;
+           }
+         e->u.hash.printed++;
+         break;
+       }
+      goto print_obj;
+    }
+  eassert (print_depth == base_depth);
 }
 
 
@@ -2602,4 +2943,7 @@ be printed.  */);
   DEFSYM (Qprint_unreadable_function, "print-unreadable-function");
 
   defsubr (&Sflush_standard_output);
+
+  /* Initialized in print_create_variable_mapping.  */
+  staticpro (&Vprint_variable_mapping);
 }
diff --git a/src/process.c b/src/process.c
index 08a02ad942..ccfc0bdf54 100644
--- a/src/process.c
+++ b/src/process.c
@@ -1071,13 +1071,24 @@ record_deleted_pid (pid_t pid, Lisp_Object filename)
 
 }
 
-DEFUN ("delete-process", Fdelete_process, Sdelete_process, 1, 1, 0,
+DEFUN ("delete-process", Fdelete_process, Sdelete_process, 0, 1,
+       "(list 'message)",
        doc: /* Delete PROCESS: kill it and forget about it immediately.
 PROCESS may be a process, a buffer, the name of a process or buffer, or
-nil, indicating the current buffer's process.  */)
+nil, indicating the current buffer's process.
+
+Interactively, it will kill the current buffer's process.  */)
   (register Lisp_Object process)
 {
   register struct Lisp_Process *p;
+  bool mess = false;
+
+  /* We use this to see whether we were called interactively.  */
+  if (EQ (process, Qmessage))
+    {
+      mess = true;
+      process = Qnil;
+    }
 
   process = get_process (process);
   p = XPROCESS (process);
@@ -1131,6 +1142,8 @@ nil, indicating the current buffer's process.  */)
        }
     }
   remove_process (process);
+  if (mess)
+    message ("Deleted process");
   return Qnil;
 }
 
@@ -2132,6 +2145,10 @@ create_process (Lisp_Object process, char **new_argv, 
Lisp_Object current_dir)
       inchannel = p->open_fd[READ_FROM_SUBPROCESS];
       forkout = p->open_fd[SUBPROCESS_STDOUT];
 
+#if defined(GNU_LINUX) && defined(F_SETPIPE_SZ)
+      fcntl (inchannel, F_SETPIPE_SZ, read_process_output_max);
+#endif
+
       if (!NILP (p->stderrproc))
        {
          struct Lisp_Process *pp = XPROCESS (p->stderrproc);
@@ -4766,7 +4783,7 @@ corresponding connection was closed.  */)
                 SDATA (proc->name),
                 STRINGP (proc_thread_name)
                 ? SDATA (proc_thread_name)
-                : SDATA (Fprin1_to_string (proc->thread, Qt)));
+                : SDATA (Fprin1_to_string (proc->thread, Qt, Qnil)));
        }
     }
   else
@@ -8618,7 +8635,10 @@ returns non-nil.  */);
   DEFVAR_INT ("read-process-output-max", read_process_output_max,
              doc: /* Maximum number of bytes to read from subprocess in a 
single chunk.
 Enlarge the value only if the subprocess generates very large (megabytes)
-amounts of data in one go.  */);
+amounts of data in one go.
+
+On GNU/Linux systems, the value should not exceed
+/proc/sys/fs/pipe-max-size.  See pipe(7) manpage for details.  */);
   read_process_output_max = 4096;
 
   DEFVAR_INT ("process-error-pause-time", process_error_pause_time,
@@ -8637,6 +8657,7 @@ sentinel or a process filter function has an error.  */);
 
   DEFSYM (Qnull, "null");
   DEFSYM (Qpipe_process_p, "pipe-process-p");
+  DEFSYM (Qmessage, "message");
 
   defsubr (&Sprocessp);
   defsubr (&Sget_process);
diff --git a/src/profiler.c b/src/profiler.c
index 31a46d1b5e..5cb42d54fa 100644
--- a/src/profiler.c
+++ b/src/profiler.c
@@ -132,7 +132,7 @@ static void evict_lower_half (log_t *log)
          XSET_HASH_TABLE (tmp, log); /* FIXME: Use make_lisp_ptr.  */
          Fremhash (key, tmp);
        }
-        eassert (EQ (Qunbound, HASH_KEY (log, i)));
+        eassert (BASE_EQ (Qunbound, HASH_KEY (log, i)));
        eassert (log->next_free == i);
 
        eassert (VECTORP (key));
@@ -158,7 +158,7 @@ record_backtrace (log_t *log, EMACS_INT count)
 
   /* Get a "working memory" vector.  */
   Lisp_Object backtrace = HASH_VALUE (log, index);
-  eassert (EQ (Qunbound, HASH_KEY (log, index)));
+  eassert (BASE_EQ (Qunbound, HASH_KEY (log, index)));
   get_backtrace (backtrace);
 
   { /* We basically do a `gethash+puthash' here, except that we have to be
diff --git a/src/regex-emacs.c b/src/regex-emacs.c
index 700a6c357d..8662fe8d6d 100644
--- a/src/regex-emacs.c
+++ b/src/regex-emacs.c
@@ -1244,21 +1244,22 @@ static int analyze_first (re_char *p, re_char *pend,
       return REG_ESIZE;                                                        
\
     ptrdiff_t b_off = b - old_buffer;                                  \
     ptrdiff_t begalt_off = begalt - old_buffer;                                
\
-    bool fixup_alt_jump_set = !!fixup_alt_jump;                                
\
-    bool laststart_set = !!laststart;                                  \
-    bool pending_exact_set = !!pending_exact;                          \
-    ptrdiff_t fixup_alt_jump_off, laststart_off, pending_exact_off;    \
-    if (fixup_alt_jump_set) fixup_alt_jump_off = fixup_alt_jump - old_buffer; \
-    if (laststart_set) laststart_off = laststart - old_buffer;         \
-    if (pending_exact_set) pending_exact_off = pending_exact - old_buffer; \
+    ptrdiff_t fixup_alt_jump_off =                                     \
+      fixup_alt_jump ? fixup_alt_jump - old_buffer : -1;               \
+    ptrdiff_t laststart_off = laststart ? laststart - old_buffer : -1; \
+    ptrdiff_t pending_exact_off =                                      \
+      pending_exact ? pending_exact - old_buffer : -1;                 \
     bufp->buffer = xpalloc (bufp->buffer, &bufp->allocated,            \
                            requested_extension, MAX_BUF_SIZE, 1);      \
     unsigned char *new_buffer = bufp->buffer;                          \
     b = new_buffer + b_off;                                            \
     begalt = new_buffer + begalt_off;                                  \
-    if (fixup_alt_jump_set) fixup_alt_jump = new_buffer + fixup_alt_jump_off; \
-    if (laststart_set) laststart = new_buffer + laststart_off;         \
-    if (pending_exact_set) pending_exact = new_buffer + pending_exact_off; \
+    if (0 <= fixup_alt_jump_off)                                       \
+      fixup_alt_jump = new_buffer + fixup_alt_jump_off;                        
\
+    if (0 <= laststart_off)                                            \
+      laststart = new_buffer + laststart_off;                          \
+    if (0 <= pending_exact_off)                                                
\
+      pending_exact = new_buffer + pending_exact_off;                  \
   } while (false)
 
 
diff --git a/src/sort.c b/src/sort.c
index c7ccfc2305..d10ae692d3 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -783,7 +783,7 @@ merge_at (merge_state *ms, const ptrdiff_t i)
 }
 
 
-/* Compute the "power" of the first of two adjacent runs begining at
+/* Compute the "power" of the first of two adjacent runs beginning at
    index S1, with the first having length N1 and the second (starting
    at index S1+N1) having length N2.  The run has total length N.  */
 
diff --git a/src/sysstdio.h b/src/sysstdio.h
index 727a466be5..efedc3e450 100644
--- a/src/sysstdio.h
+++ b/src/sysstdio.h
@@ -28,7 +28,8 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include <attribute.h>
 #include <unlocked-io.h>
 
-extern FILE *emacs_fopen (char const *, char const *) ATTRIBUTE_MALLOC;
+extern FILE *emacs_fopen (char const *, char const *)
+  ATTRIBUTE_MALLOC ATTRIBUTE_DEALLOC (fclose, 1);
 extern void errputc (int);
 extern void errwrite (void const *, ptrdiff_t);
 extern void close_output_streams (void);
diff --git a/src/term.c b/src/term.c
index bad1127c93..3bea621dbd 100644
--- a/src/term.c
+++ b/src/term.c
@@ -2287,9 +2287,9 @@ A suspended tty may be resumed by calling `resume-tty' on 
it.  */)
       delete_keyboard_wait_descriptor (fileno (f));
 
 #ifndef MSDOS
-      fclose (f);
       if (f != t->display_info.tty->output)
         fclose (t->display_info.tty->output);
+      fclose (f);
 #endif
 
       t->display_info.tty->input = 0;
diff --git a/src/termhooks.h b/src/termhooks.h
index 8c193914ba..d7190e7736 100644
--- a/src/termhooks.h
+++ b/src/termhooks.h
@@ -31,7 +31,8 @@ struct glyph;
 
 INLINE_HEADER_BEGIN
 
-enum scroll_bar_part {
+enum scroll_bar_part
+{
   scroll_bar_nowhere,
   scroll_bar_above_handle,
   scroll_bar_handle,
@@ -223,6 +224,11 @@ enum event_kind
                                  gives the timestamp where the drop
                                  happened.
 
+                                 .modifiers gives a number that
+                                 determines if an event was already
+                                 handled by
+                                 `x_dnd_begin_drag_and_drop'.
+
                                  .x and .y give the coordinates of
                                  the drop originating from the root
                                  window.  */
@@ -296,8 +302,9 @@ enum event_kind
 #endif
 
 #ifdef HAVE_XWIDGETS
-  /* events generated by xwidgets*/
+  /* An event generated by an xwidget to tell us something.  */
    , XWIDGET_EVENT
+
    /* Event generated when WebKit asks us to display another widget.  */
    , XWIDGET_DISPLAY_EVENT
 #endif
@@ -344,6 +351,11 @@ enum event_kind
          positive delta represents a change clockwise, and a negative
          delta represents a change counter-clockwise.  */
   , PINCH_EVENT
+
+  /* In a MONITORS_CHANGED_EVENT, .arg gives the terminal on which the
+     monitor configuration changed.  .timestamp gives the time on
+     which the monitors changed.  */
+  , MONITORS_CHANGED_EVENT
 };
 
 /* Bit width of an enum event_kind tag at the start of structs and unions.  */
diff --git a/src/terminal.c b/src/terminal.c
index 80f3aed700..dcde8e9f55 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -290,13 +290,13 @@ create_terminal (enum output_method type, struct 
redisplay_interface *rif)
   keyboard_coding =
     find_symbol_value (intern ("default-keyboard-coding-system"));
   if (NILP (keyboard_coding)
-      || EQ (keyboard_coding, Qunbound)
+      || BASE_EQ (keyboard_coding, Qunbound)
       || NILP (Fcoding_system_p (keyboard_coding)))
     keyboard_coding = Qno_conversion;
   terminal_coding =
     find_symbol_value (intern ("default-terminal-coding-system"));
   if (NILP (terminal_coding)
-      || EQ (terminal_coding, Qunbound)
+      || BASE_EQ (terminal_coding, Qunbound)
       || NILP (Fcoding_system_p (terminal_coding)))
     terminal_coding = Qundecided;
 
diff --git a/src/textprop.c b/src/textprop.c
index 072aac2866..c11ee98f02 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -341,7 +341,7 @@ set_properties (Lisp_Object properties, INTERVAL interval, 
Lisp_Object object)
       for (sym = properties;
           PLIST_ELT_P (sym, value);
           sym = XCDR (value))
-       if (EQ (property_value (interval->plist, XCAR (sym)), Qunbound))
+       if (BASE_EQ (property_value (interval->plist, XCAR (sym)), Qunbound))
          {
            record_property_change (interval->position, LENGTH (interval),
                                    XCAR (sym), Qnil,
diff --git a/src/tparam.h b/src/tparam.h
index 653f01bdde..4f4bdc8820 100644
--- a/src/tparam.h
+++ b/src/tparam.h
@@ -20,6 +20,8 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #ifndef EMACS_TPARAM_H
 #define EMACS_TPARAM_H
 
+#include <stdlib.h>
+
 #include <attribute.h>
 
 /* Don't try to include termcap.h.  On some systems, configure finds a
@@ -32,7 +34,8 @@ int tgetnum (const char *);
 char *tgetstr (const char *, char **);
 char *tgoto (const char *, int, int);
 
-char *tparam (const char *, char *, int, int, int, int, int) ATTRIBUTE_MALLOC;
+char *tparam (const char *, char *, int, int, int, int, int)
+  ATTRIBUTE_MALLOC ATTRIBUTE_DEALLOC_FREE;
 
 extern char PC;
 extern char *BC;
diff --git a/src/w32.c b/src/w32.c
index 1b10b9965f..590d9e85d9 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -10297,7 +10297,8 @@ check_windows_init_file (void)
        openp (Vload_path, init_file, Fget_load_suffixes (), NULL, Qnil, 0, 0);
       if (fd < 0)
        {
-         Lisp_Object load_path_print = Fprin1_to_string (Vload_path, Qnil);
+         Lisp_Object load_path_print = Fprin1_to_string (Vload_path,
+                                                         Qnil, Qnil);
          char *init_file_name = SSDATA (init_file);
          char *load_path = SSDATA (load_path_print);
          char *buffer = alloca (1024
diff --git a/src/w32fns.c b/src/w32fns.c
index 0f25c1a594..8716b762eb 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -247,6 +247,8 @@ static HWND w32_visible_system_caret_hwnd;
 
 static int w32_unicode_gui;
 
+static bool w32_selection_dialog_open;
+
 /* From w32menu.c  */
 int menubar_in_use = 0;
 
@@ -4184,6 +4186,16 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM 
lParam)
                       update_rect.left, update_rect.top,
                       update_rect.right, update_rect.bottom));
 #endif
+           /* Under double-buffering, update the frame from the back
+              buffer, to prevent a "ghost" of the selection dialog to
+              be left on display while the user selects in the dialog.  */
+           if (w32_selection_dialog_open
+               && !w32_disable_double_buffering
+               && FRAME_OUTPUT_DATA (f)->paint_dc)
+             BitBlt (FRAME_OUTPUT_DATA (f)->paint_buffer_handle,
+                     0, 0, FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f),
+                     FRAME_OUTPUT_DATA (f)->paint_dc, 0, 0, SRCCOPY);
+
            EndPaint (hwnd, &paintStruct);
            leave_crit ();
 
@@ -5536,11 +5548,11 @@ my_create_window (struct frame * f)
                                  RES_TYPE_NUMBER);
       top = gui_display_get_arg (dpyinfo, Qnil, Qtop, "top", "Top",
                                 RES_TYPE_NUMBER);
-      if (EQ (left, Qunbound))
+      if (BASE_EQ (left, Qunbound))
        coords[0] = CW_USEDEFAULT;
       else
        coords[0] = XFIXNUM (left);
-      if (EQ (top, Qunbound))
+      if (BASE_EQ (top, Qunbound))
        coords[1] = CW_USEDEFAULT;
       else
        coords[1] = XFIXNUM (top);
@@ -5656,12 +5668,12 @@ w32_icon (struct frame *f, Lisp_Object parms)
                                 RES_TYPE_NUMBER);
   icon_y = gui_display_get_arg (dpyinfo, parms, Qicon_top, 0, 0,
                                 RES_TYPE_NUMBER);
-  if (!EQ (icon_x, Qunbound) && !EQ (icon_y, Qunbound))
+  if (!BASE_EQ (icon_x, Qunbound) && !BASE_EQ (icon_y, Qunbound))
     {
       CHECK_FIXNUM (icon_x);
       CHECK_FIXNUM (icon_y);
     }
-  else if (!EQ (icon_x, Qunbound) || !EQ (icon_y, Qunbound))
+  else if (!BASE_EQ (icon_x, Qunbound) || !BASE_EQ (icon_y, Qunbound))
     error ("Both left and top icon corners of icon must be specified");
 
   block_input ();
@@ -5756,7 +5768,7 @@ w32_default_font_parameter (struct frame *f, Lisp_Object 
parms)
                                                 parms, Qfont, NULL, NULL,
                                                 RES_TYPE_STRING);
   Lisp_Object font;
-  if (EQ (font_param, Qunbound))
+  if (BASE_EQ (font_param, Qunbound))
     font_param = Qnil;
   font = !NILP (font_param) ? font_param
     : gui_display_get_arg (dpyinfo, parms, Qfont, "font", "Font",
@@ -5821,10 +5833,10 @@ DEFUN ("x-create-frame", Fx_create_frame, 
Sx_create_frame,
 
   display = gui_display_get_arg (dpyinfo, parameters, Qterminal, 0, 0,
                                  RES_TYPE_NUMBER);
-  if (EQ (display, Qunbound))
+  if (BASE_EQ (display, Qunbound))
     display = gui_display_get_arg (dpyinfo, parameters, Qdisplay, 0, 0,
                                    RES_TYPE_STRING);
-  if (EQ (display, Qunbound))
+  if (BASE_EQ (display, Qunbound))
     display = Qnil;
   dpyinfo = check_x_display_info (display);
   kb = dpyinfo->terminal->kboard;
@@ -5835,7 +5847,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
   name = gui_display_get_arg (dpyinfo, parameters, Qname, "name", "Name",
                               RES_TYPE_STRING);
   if (!STRINGP (name)
-      && ! EQ (name, Qunbound)
+      && ! BASE_EQ (name, Qunbound)
       && ! NILP (name))
     error ("Invalid frame name--not a string or nil");
 
@@ -5845,7 +5857,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
   /* See if parent window is specified.  */
   parent = gui_display_get_arg (dpyinfo, parameters, Qparent_id, NULL, NULL,
                                 RES_TYPE_NUMBER);
-  if (EQ (parent, Qunbound))
+  if (BASE_EQ (parent, Qunbound))
     parent = Qnil;
   else if (!NILP (parent))
     CHECK_FIXNUM (parent);
@@ -5888,14 +5900,14 @@ DEFUN ("x-create-frame", Fx_create_frame, 
Sx_create_frame,
 
   tem = gui_display_get_arg (dpyinfo, parameters, Qundecorated, NULL, NULL,
                              RES_TYPE_BOOLEAN);
-  FRAME_UNDECORATED (f) = !NILP (tem) && !EQ (tem, Qunbound);
+  FRAME_UNDECORATED (f) = !NILP (tem) && !BASE_EQ (tem, Qunbound);
   store_frame_param (f, Qundecorated, FRAME_UNDECORATED (f) ? Qt : Qnil);
 
   tem = gui_display_get_arg (dpyinfo, parameters, Qskip_taskbar, NULL, NULL,
                              RES_TYPE_BOOLEAN);
-  FRAME_SKIP_TASKBAR (f) = !NILP (tem) && !EQ (tem, Qunbound);
+  FRAME_SKIP_TASKBAR (f) = !NILP (tem) && !BASE_EQ (tem, Qunbound);
   store_frame_param (f, Qskip_taskbar,
-                    (NILP (tem) || EQ (tem, Qunbound)) ? Qnil : Qt);
+                    (NILP (tem) || BASE_EQ (tem, Qunbound)) ? Qnil : Qt);
 
   /* By default, make scrollbars the system standard width and height. */
   FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = GetSystemMetrics (SM_CXVSCROLL);
@@ -5951,7 +5963,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
 
   /* Set the name; the functions to which we pass f expect the name to
      be set.  */
-  if (EQ (name, Qunbound) || NILP (name))
+  if (BASE_EQ (name, Qunbound) || NILP (name))
     {
       fset_name (f, build_string (dpyinfo->w32_id_name));
       f->explicit_name = false;
@@ -5991,7 +6003,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
       value = gui_display_get_arg (dpyinfo, parameters, Qinternal_border_width,
                                    "internalBorder", "internalBorder",
                                    RES_TYPE_NUMBER);
-      if (! EQ (value, Qunbound))
+      if (! BASE_EQ (value, Qunbound))
        parameters = Fcons (Fcons (Qinternal_border_width, value),
                            parameters);
     }
@@ -6008,7 +6020,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
       value = gui_display_get_arg (dpyinfo, parameters, 
Qchild_frame_border_width,
                                    "childFrameBorder", "childFrameBorder",
                                    RES_TYPE_NUMBER);
-      if (!EQ (value, Qunbound))
+      if (!BASE_EQ (value, Qunbound))
        parameters = Fcons (Fcons (Qchild_frame_border_width, value),
                       parameters);
     }
@@ -6207,7 +6219,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
        w32_iconify_frame (f);
       else
        {
-         if (EQ (visibility, Qunbound))
+         if (BASE_EQ (visibility, Qunbound))
            visibility = Qt;
 
          if (!NILP (visibility))
@@ -6999,7 +7011,7 @@ w32_create_tip_frame (struct w32_display_info *dpyinfo, 
Lisp_Object parms)
   name = gui_display_get_arg (dpyinfo, parms, Qname, "name", "Name",
                               RES_TYPE_STRING);
   if (!STRINGP (name)
-      && !EQ (name, Qunbound)
+      && !BASE_EQ (name, Qunbound)
       && !NILP (name))
     error ("Invalid frame name--not a string or nil");
   Vx_resource_name = name;
@@ -7033,7 +7045,7 @@ w32_create_tip_frame (struct w32_display_info *dpyinfo, 
Lisp_Object parms)
 
   /* Set the name; the functions to which we pass f expect the name to
      be set.  */
-  if (EQ (name, Qunbound) || NILP (name))
+  if (BASE_EQ (name, Qunbound) || NILP (name))
     {
       fset_name (f, build_string (dpyinfo->w32_id_name));
       f->explicit_name = false;
@@ -7072,7 +7084,7 @@ w32_create_tip_frame (struct w32_display_info *dpyinfo, 
Lisp_Object parms)
       value = gui_display_get_arg (dpyinfo, parms, Qinternal_border_width,
                                    "internalBorder", "internalBorder",
                                    RES_TYPE_NUMBER);
-      if (! EQ (value, Qunbound))
+      if (! BASE_EQ (value, Qunbound))
        parms = Fcons (Fcons (Qinternal_border_width, value),
                       parms);
     }
@@ -7755,6 +7767,15 @@ w32_dialog_in_progress (Lisp_Object in_progress)
 {
   Lisp_Object frames, frame;
 
+  /* Indicate to w32_wnd_proc that the selection dialog is about to be
+     open (or was closed, if IN_PROGRESS is nil).  */
+  if (!w32_disable_double_buffering)
+    {
+      enter_crit ();
+      w32_selection_dialog_open = !NILP (in_progress);
+      leave_crit ();
+    }
+
   /* Don't let frames in `above' z-group obscure dialog windows.  */
   FOR_EACH_FRAME (frames, frame)
     {
@@ -10769,21 +10790,6 @@ bass-down, bass-boost, bass-up, treble-down, treble-up 
 */);
               doc: /* SKIP: real doc in xfns.c.  */);
   Vx_pixel_size_width_font_regexp = Qnil;
 
-  DEFVAR_LISP ("w32-bdf-filename-alist",
-              Vw32_bdf_filename_alist,
-              doc: /* List of bdf fonts and their corresponding filenames.  
*/);
-  Vw32_bdf_filename_alist = Qnil;
-
-  DEFVAR_BOOL ("w32-strict-fontnames",
-              w32_strict_fontnames,
-              doc: /* Non-nil means only use fonts that are exact matches for 
those requested.
-Default is nil, which allows old fontnames that are not XLFD compliant,
-and allows third-party CJK display to work by specifying false charset
-fields to trick Emacs into translating to Big5, SJIS etc.
-Setting this to t will prevent wrong fonts being selected when
-fontsets are automatically created.  */);
-  w32_strict_fontnames = 0;
-
   DEFVAR_BOOL ("w32-strict-painting",
               w32_strict_painting,
               doc: /* Non-nil means use strict rules for repainting frames.
diff --git a/src/w32font.c b/src/w32font.c
index 1f93f6d5e0..611a0c8965 100644
--- a/src/w32font.c
+++ b/src/w32font.c
@@ -1540,6 +1540,19 @@ add_font_entity_to_list (ENUMLOGFONTEX *logical_font,
     || physical_font->ntmFontSig.fsUsb[1]
     || physical_font->ntmFontSig.fsUsb[0] & 0x3fffffff;
 
+  /* Kludgey fix for Arial Unicode MS font that claims support for
+     scripts it doesn't actually cover.  */
+  if (strncmp (logical_font->elfLogFont.lfFaceName,
+              "Arial Unicode MS", 16) == 0)
+    {
+      /* Reset bits 4 (Phonetic), 12 (Vai), 14 (Nko), 27 (Balinese).  */
+      physical_font->ntmFontSig.fsUsb[0] &= 0xf7ffafef;
+      /* Reset bits 53 (Phags-pa) and 58 (Phoenician).  */
+      physical_font->ntmFontSig.fsUsb[1] &= 0xfbdfffff;
+      /* Set bit 70 (Tibetan).  */
+      physical_font->ntmFontSig.fsUsb[2] |= 0x00000040;
+    }
+
   /* Skip non matching fonts.  */
 
   /* For uniscribe backend, consider only truetype or opentype fonts
@@ -2834,18 +2847,18 @@ syms_of_w32font (void)
   DEFSYM (Qhanunoo, "hanunoo");
   DEFSYM (Qkharoshthi, "kharoshthi");
   DEFSYM (Qlimbu, "limbu");
-  DEFSYM (Qlinear_b, "linear_b");
+  DEFSYM (Qlinear_b, "linear-b");
   DEFSYM (Qaegean_number, "aegean-number");
-  DEFSYM (Qold_italic, "old_italic");
-  DEFSYM (Qold_persian, "old_persian");
+  DEFSYM (Qold_italic, "old-italic");
+  DEFSYM (Qold_persian, "old-persian");
   DEFSYM (Qosmanya, "osmanya");
   DEFSYM (Qphags_pa, "phags-pa");
   DEFSYM (Qphoenician, "phoenician");
   DEFSYM (Qshavian, "shavian");
-  DEFSYM (Qsyloti_nagri, "syloti_nagri");
+  DEFSYM (Qsyloti_nagri, "syloti-nagri");
   DEFSYM (Qtagalog, "tagalog");
   DEFSYM (Qtagbanwa, "tagbanwa");
-  DEFSYM (Qtai_le, "tai_le");
+  DEFSYM (Qtai_le, "tai-le");
   DEFSYM (Qtifinagh, "tifinagh");
   DEFSYM (Qugaritic, "ugaritic");
   DEFSYM (Qlycian, "lycian");
diff --git a/src/w32menu.c b/src/w32menu.c
index 5cd6c3310e..b10239d5cc 100644
--- a/src/w32menu.c
+++ b/src/w32menu.c
@@ -556,10 +556,8 @@ w32_menu_show (struct frame *f, int x, int y, int 
menuflags,
   HMENU menu;
   POINT pos;
   widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0;
-  widget_value **submenu_stack
-    = (widget_value **) alloca (menu_items_used * sizeof (widget_value *));
-  Lisp_Object *subprefix_stack
-    = (Lisp_Object *) alloca (menu_items_used * word_size);
+  widget_value **submenu_stack;
+  Lisp_Object *subprefix_stack;
   int submenu_depth = 0;
   bool first_pane;
 
@@ -574,6 +572,11 @@ w32_menu_show (struct frame *f, int x, int y, int 
menuflags,
       return Qnil;
     }
 
+  USE_SAFE_ALLOCA;
+
+  submenu_stack = SAFE_ALLOCA (menu_items_used * sizeof (widget_value *));
+  subprefix_stack = SAFE_ALLOCA (menu_items_used * word_size);
+
   block_input ();
 
   /* Create a tree of widget_value objects
@@ -816,6 +819,7 @@ w32_menu_show (struct frame *f, int x, int y, int menuflags,
                          entry = Fcons (subprefix_stack[j], entry);
                    }
                  unblock_input ();
+                 SAFE_FREE ();
                  return entry;
                }
              i += MENU_ITEMS_ITEM_LENGTH;
@@ -830,6 +834,7 @@ w32_menu_show (struct frame *f, int x, int y, int menuflags,
     }
 
   unblock_input ();
+  SAFE_FREE ();
   return Qnil;
 }
 
diff --git a/src/w32notify.c b/src/w32notify.c
index ccefecb659..72e634f77c 100644
--- a/src/w32notify.c
+++ b/src/w32notify.c
@@ -519,16 +519,16 @@ watched for some reason, this function signals a 
`file-error' error.
 FILTER is a list of conditions for reporting an event.  It can include
 the following symbols:
 
-  'file-name'          -- report file creation, deletion, or renaming
-  'directory-name'     -- report directory creation, deletion, or renaming
-  'attributes'         -- report changes in attributes
-  'size'               -- report changes in file-size
-  'last-write-time'    -- report changes in last-write time
-  'last-access-time'   -- report changes in last-access time
-  'creation-time'      -- report changes in creation time
-  'security-desc'      -- report changes in security descriptor
-
-If FILE is a directory, and FILTER includes 'subtree', then all the
+  `file-name'          -- report file creation, deletion, or renaming
+  `directory-name'     -- report directory creation, deletion, or renaming
+  `attributes'         -- report changes in attributes
+  `size'               -- report changes in file-size
+  `last-write-time'    -- report changes in last-write time
+  `last-access-time'   -- report changes in last-access time
+  `creation-time'      -- report changes in creation time
+  `security-desc'      -- report changes in security descriptor
+
+If FILE is a directory, and FILTER includes `subtree', then all the
 subdirectories will also be watched and changes in them reported.
 
 When any event happens that satisfies the conditions specified by
@@ -541,11 +541,11 @@ DESCRIPTOR is the same object as the one returned by this 
function.
 ACTION is the description of the event.  It could be any one of the
 following:
 
-  'added'        -- FILE was added
-  'removed'      -- FILE was deleted
-  'modified'     -- FILE's contents or its attributes were modified
-  'renamed-from' -- a file was renamed whose old name was FILE
-  'renamed-to'   -- a file was renamed and its new name is FILE
+  `added'        -- FILE was added
+  `removed'      -- FILE was deleted
+  `modified'     -- FILE's contents or its attributes were modified
+  `renamed-from' -- a file was renamed whose old name was FILE
+  `renamed-to'   -- a file was renamed and its new name is FILE
 
 FILE is the name of the file whose event is being reported.
 
diff --git a/src/w32proc.c b/src/w32proc.c
index 781a19f480..7acfba64d7 100644
--- a/src/w32proc.c
+++ b/src/w32proc.c
@@ -63,6 +63,8 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include "w32term.h"
 #include "coding.h"
 
+void w32_raise (int);
+
 #define RVA_TO_PTR(var,section,filedata) \
   ((void *)((section)->PointerToRawData                                        
\
            + ((DWORD_PTR)(var) - (section)->VirtualAddress)            \
@@ -311,6 +313,21 @@ sigismember (const sigset_t *set, int signo)
   return (*set & (1U << signo)) != 0;
 }
 
+/* A fuller emulation of 'raise', which supports signals that MS
+   runtime doesn't know about.  */
+void
+w32_raise (int signo)
+{
+  if (!(signo == SIGCHLD || signo == SIGALRM || signo == SIGPROF))
+    raise (signo);
+
+  /* Call the handler directly for the signals that we handle
+     ourselves.  */
+  signal_handler handler = sig_handlers[signo];
+  if (!(handler == SIG_DFL || handler == SIG_IGN || handler == SIG_ERR))
+    handler (signo);
+}
+
 pid_t
 getpgrp (void)
 {
diff --git a/src/w32term.c b/src/w32term.c
index 19786da3a6..d0577efccc 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -2682,13 +2682,13 @@ w32_draw_glyph_string (struct glyph_string *s)
                  val = (WINDOW_BUFFER_LOCAL_VALUE
                         (Qx_underline_at_descent_line, s->w));
                  underline_at_descent_line
-                   = (!(NILP (val) || EQ (val, Qunbound))
+                   = (!(NILP (val) || BASE_EQ (val, Qunbound))
                       || s->face->underline_at_descent_line_p);
 
                  val = (WINDOW_BUFFER_LOCAL_VALUE
                         (Qx_use_underline_position_properties, s->w));
                  use_underline_position_properties
-                   = !(NILP (val) || EQ (val, Qunbound));
+                   = !(NILP (val) || BASE_EQ (val, Qunbound));
 
                   /* Get the underline thickness.  Default is 1 pixel.  */
                   if (font && font->underline_thickness > 0)
@@ -2720,7 +2720,7 @@ w32_draw_glyph_string (struct glyph_string *s)
 
                  if (!(s->face->underline_at_descent_line_p
                        /* Ignore minimum_offset if the amount of pixels
-                          was explictly specified.  */
+                          was explicitly specified.  */
                        && s->face->underline_pixels_above_descent_line))
                    position = max (position, minimum_offset);
                 }
@@ -5912,6 +5912,29 @@ w32_read_socket (struct terminal *terminal,
                         (short) HIWORD (msg.msg.lParam)));
            }
 
+         /* According to the MS documentation, this message is sent
+            to each window whenever a monitor is added, removed, or
+            has its resolution change.  Detect duplicate events when
+            there are multiple frames by ensuring only one event is
+            put in the keyboard buffer at any given time.  */
+         {
+           union buffered_input_event *ev;
+
+           ev = (kbd_store_ptr == kbd_buffer
+                 ? kbd_buffer + KBD_BUFFER_SIZE - 1
+                 : kbd_store_ptr - 1);
+
+           if (kbd_store_ptr != kbd_fetch_ptr
+               && ev->ie.kind == MONITORS_CHANGED_EVENT
+               && XTERMINAL (ev->ie.arg) == dpyinfo->terminal)
+             /* Don't store a MONITORS_CHANGED_EVENT if there is
+                already an undelivered event on the queue.  */
+             break;
+
+           inev.kind = MONITORS_CHANGED_EVENT;
+           XSETTERMINAL (inev.arg, dpyinfo->terminal);
+         }
+
          check_visibility = 1;
          break;
 
diff --git a/src/window.c b/src/window.c
index 15d6cf94b0..ac8408a9a9 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1014,11 +1014,22 @@ WINDOW must be a valid window and defaults to the 
selected one.  */)
   return make_fixnum (decode_valid_window (window)->top_line);
 }
 
+static enum window_body_unit
+window_body_unit_from_symbol (Lisp_Object unit)
+{
+  return
+    EQ (unit, Qremap)
+    ? WINDOW_BODY_IN_REMAPPED_CHARS
+    : (NILP (unit)
+       ? WINDOW_BODY_IN_CANONICAL_CHARS
+       : WINDOW_BODY_IN_PIXELS);
+}
+
 /* Return the number of lines/pixels of W's body.  Don't count any mode
    or header line or horizontal divider of W.  Rounds down to nearest
    integer when not working pixelwise. */
 static int
-window_body_height (struct window *w, bool pixelwise)
+window_body_height (struct window *w, enum window_body_unit pixelwise)
 {
   int height = (w->pixel_height
                - WINDOW_TAB_LINE_HEIGHT (w)
@@ -1029,11 +1040,27 @@ window_body_height (struct window *w, bool pixelwise)
                - WINDOW_MODE_LINE_HEIGHT (w)
                - WINDOW_BOTTOM_DIVIDER_WIDTH (w));
 
+  int denom = 1;
+  if (pixelwise == WINDOW_BODY_IN_REMAPPED_CHARS)
+    {
+      if (!NILP (Vface_remapping_alist))
+       {
+         struct frame *f = XFRAME (WINDOW_FRAME (w));
+         int face_id = lookup_named_face (NULL, f, Qdefault, true);
+         struct face *face = FACE_FROM_ID_OR_NULL (f, face_id);
+         if (face && face->font && face->font->height)
+           denom = face->font->height;
+       }
+      /* For performance, use canonical chars if no face remapping.  */
+      else
+       pixelwise = WINDOW_BODY_IN_CANONICAL_CHARS;
+    }
+
+  if (pixelwise == WINDOW_BODY_IN_CANONICAL_CHARS)
+    denom = FRAME_LINE_HEIGHT (WINDOW_XFRAME (w));
+
   /* Don't return a negative value.  */
-  return max (pixelwise
-             ? height
-             : height / FRAME_LINE_HEIGHT (WINDOW_XFRAME (w)),
-             0);
+  return max (height / denom, 0);
 }
 
 /* Return the number of columns/pixels of W's body.  Don't count columns
@@ -1042,7 +1069,7 @@ window_body_height (struct window *w, bool pixelwise)
    fringes either.  Round down to nearest integer when not working
    pixelwise.  */
 int
-window_body_width (struct window *w, bool pixelwise)
+window_body_width (struct window *w, enum window_body_unit pixelwise)
 {
   struct frame *f = XFRAME (WINDOW_FRAME (w));
 
@@ -1059,50 +1086,76 @@ window_body_width (struct window *w, bool pixelwise)
                   ? WINDOW_FRINGES_WIDTH (w)
                   : 0));
 
+  int denom = 1;
+  if (pixelwise == WINDOW_BODY_IN_REMAPPED_CHARS)
+    {
+      if (!NILP (Vface_remapping_alist))
+       {
+         int face_id = lookup_named_face (NULL, f, Qdefault, true);
+         struct face *face = FACE_FROM_ID_OR_NULL (f, face_id);
+         if (face && face->font)
+           {
+             if (face->font->average_width)
+               denom = face->font->average_width;
+             else if (face->font->space_width)
+               denom = face->font->space_width;
+           }
+       }
+      /* For performance, use canonical chars if no face remapping.  */
+      else
+       pixelwise = WINDOW_BODY_IN_CANONICAL_CHARS;
+    }
+
+  if (pixelwise == WINDOW_BODY_IN_CANONICAL_CHARS)
+    denom = FRAME_COLUMN_WIDTH (WINDOW_XFRAME (w));
+
   /* Don't return a negative value.  */
-  return max (pixelwise
-             ? width
-             : width / FRAME_COLUMN_WIDTH (WINDOW_XFRAME (w)),
-             0);
+  return max (width / denom, 0);
 }
 
 DEFUN ("window-body-width", Fwindow_body_width, Swindow_body_width, 0, 2, 0,
        doc: /* Return the width of WINDOW's text area.
-WINDOW must be a live window and defaults to the selected one.  Optional
-argument PIXELWISE non-nil means return the width in pixels.  The return
-value does not include any vertical dividers, fringes or marginal areas,
-or scroll bars.
+WINDOW must be a live window and defaults to the selected one.  The
+return value does not include any vertical dividers, fringes or
+marginal areas, or scroll bars.
 
-If PIXELWISE is nil, return the largest integer smaller than WINDOW's
-pixel width divided by the character width of WINDOW's frame.  This
-means that if a column at the right of the text area is only partially
-visible, that column is not counted.
+The optional argument PIXELWISE defines the units to use for the
+width.  If nil, return the largest integer smaller than WINDOW's pixel
+width in units of the character width of WINDOW's frame.  If PIXELWISE
+is `remap' and the default face is remapped (see
+`face-remapping-alist'), use the remapped face to determine the
+character width.  For any other non-nil value, return the width in
+pixels.
 
 Note that the returned value includes the column reserved for the
 continuation glyph.
 
-Also see `window-max-characters-per-line'.  */)
+Also see `window-max-chars-per-line'.  */)
   (Lisp_Object window, Lisp_Object pixelwise)
 {
-  return make_fixnum (window_body_width (decode_live_window (window),
-                                        !NILP (pixelwise)));
+  return (make_fixnum
+         (window_body_width (decode_live_window (window),
+                             window_body_unit_from_symbol (pixelwise))));
 }
 
 DEFUN ("window-body-height", Fwindow_body_height, Swindow_body_height, 0, 2, 0,
        doc: /* Return the height of WINDOW's text area.
-WINDOW must be a live window and defaults to the selected one.  Optional
-argument PIXELWISE non-nil means return the height of WINDOW's text area
-in pixels.  The return value does not include the mode line or header
-line or any horizontal divider.
-
-If PIXELWISE is nil, return the largest integer smaller than WINDOW's
-pixel height divided by the character height of WINDOW's frame.  This
-means that if a line at the bottom of the text area is only partially
-visible, that line is not counted.  */)
+WINDOW must be a live window and defaults to the selected one.  The
+return value does not include the mode line or header line or any
+horizontal divider.
+
+The optional argument PIXELWISE defines the units to use for the
+height.  If nil, return the largest integer smaller than WINDOW's
+pixel height in units of the character height of WINDOW's frame.  If
+PIXELWISE is `remap' and the default face is remapped (see
+`face-remapping-alist'), use the remapped face to determine the
+character height.  For any other non-nil value, return the height in
+pixels.  */)
   (Lisp_Object window, Lisp_Object pixelwise)
 {
-  return make_fixnum (window_body_height (decode_live_window (window),
-                                         !NILP (pixelwise)));
+  return (make_fixnum
+         (window_body_height (decode_live_window (window),
+                              window_body_unit_from_symbol (pixelwise))));
 }
 
 DEFUN ("window-old-body-pixel-width",
@@ -2124,7 +2177,8 @@ though when run from an idle timer with a delay of zero 
seconds.  */)
   struct glyph_row *row, *end_row;
   int max_y = NILP (body) ? WINDOW_PIXEL_HEIGHT (w) : window_text_bottom_y (w);
   Lisp_Object rows = Qnil;
-  int window_width = NILP (body) ? w->pixel_width : window_body_width (w, 
true);
+  int window_width = NILP (body)
+    ? w->pixel_width : window_body_width (w, WINDOW_BODY_IN_PIXELS);
   int tab_line_height = WINDOW_TAB_LINE_HEIGHT (w);
   int header_line_height = WINDOW_HEADER_LINE_HEIGHT (w);
   int subtract = NILP (body) ? 0 : (tab_line_height + header_line_height);
@@ -3657,8 +3711,10 @@ window_change_record_windows (Lisp_Object window, int 
stamp, ptrdiff_t number)
          wset_old_buffer (w, w->contents);
          w->old_pixel_width = w->pixel_width;
          w->old_pixel_height = w->pixel_height;
-         w->old_body_pixel_width = window_body_width (w, true);
-         w->old_body_pixel_height = window_body_height (w, true);
+         w->old_body_pixel_width
+           = window_body_width (w, WINDOW_BODY_IN_PIXELS);
+         w->old_body_pixel_height
+           = window_body_height (w, WINDOW_BODY_IN_PIXELS);
        }
 
       w = NILP (w->next) ? 0 : XWINDOW (w->next);
@@ -3903,8 +3959,10 @@ run_window_change_functions (void)
             && (window_buffer_change
                 || w->pixel_width != w->old_pixel_width
                 || w->pixel_height != w->old_pixel_height
-                || window_body_width (w, true) != w->old_body_pixel_width
-                || window_body_height (w, true) != w->old_body_pixel_height));
+                || (window_body_width (w, WINDOW_BODY_IN_PIXELS)
+                    != w->old_body_pixel_width)
+                || (window_body_height (w, WINDOW_BODY_IN_PIXELS)
+                    != w->old_body_pixel_height)));
 
          /* The following two are needed when running the default
             values for this frame below.  */
@@ -4768,7 +4826,8 @@ resize_frame_windows (struct frame *f, int size, bool 
horflag)
   Lisp_Object mini = f->minibuffer_window;
   struct window *m = WINDOWP (mini) ? XWINDOW (mini) : NULL;
   int mini_height = ((FRAME_HAS_MINIBUF_P (f) && !FRAME_MINIBUF_ONLY_P (f))
-                    ? unit + m->pixel_height - window_body_height (m, true)
+                    ? (unit + m->pixel_height
+                       - window_body_height (m, WINDOW_BODY_IN_PIXELS))
                     : 0);
 
   new_pixel_size = max (horflag ? size : size - mini_height, unit);
@@ -5255,7 +5314,7 @@ void
 grow_mini_window (struct window *w, int delta)
 {
   struct frame *f = XFRAME (w->frame);
-  int old_height = window_body_height (w, true);
+  int old_height = window_body_height (w, WINDOW_BODY_IN_PIXELS);
   int min_height = FRAME_LINE_HEIGHT (f);
 
   eassert (MINI_WINDOW_P (w));
@@ -5289,7 +5348,8 @@ void
 shrink_mini_window (struct window *w)
 {
   struct frame *f = XFRAME (w->frame);
-  int delta = window_body_height (w, true) - FRAME_LINE_HEIGHT (f);
+  int delta = (window_body_height (w, WINDOW_BODY_IN_PIXELS)
+              - FRAME_LINE_HEIGHT (f));
 
   eassert (MINI_WINDOW_P (w));
 
@@ -5636,7 +5696,8 @@ window_scroll_pixel_based (Lisp_Object window, int n, 
bool whole, bool noerror)
              if (w->vscroll < 0 && rtop > 0)
                {
                  px = max (0, -w->vscroll - min (rtop, -dy));
-                 Fset_window_vscroll (window, make_fixnum (px), Qt);
+                 Fset_window_vscroll (window, make_fixnum (px), Qt,
+                                      Qnil);
                  return;
                }
            }
@@ -5646,7 +5707,8 @@ window_scroll_pixel_based (Lisp_Object window, int n, 
bool whole, bool noerror)
              if (rbot > 0 && (w->vscroll < 0 || vpos == 0))
                {
                  px = max (0, -w->vscroll + min (rbot, dy));
-                 Fset_window_vscroll (window, make_fixnum (px), Qt);
+                 Fset_window_vscroll (window, make_fixnum (px), Qt,
+                                      Qnil);
                  return;
                }
 
@@ -5655,7 +5717,8 @@ window_scroll_pixel_based (Lisp_Object window, int n, 
bool whole, bool noerror)
                {
                  ptrdiff_t spos;
 
-                 Fset_window_vscroll (window, make_fixnum (0), Qt);
+                 Fset_window_vscroll (window, make_fixnum (0), Qt,
+                                      Qnil);
                  /* If there are other text lines above the current row,
                     move window start to current row.  Else to next row. */
                  if (rbot > 0)
@@ -5674,7 +5737,7 @@ window_scroll_pixel_based (Lisp_Object window, int n, 
bool whole, bool noerror)
            }
        }
       /* Cancel previous vscroll.  */
-      Fset_window_vscroll (window, make_fixnum (0), Qt);
+      Fset_window_vscroll (window, make_fixnum (0), Qt, Qnil);
     }
 
   itdata = bidi_shelve_cache ();
@@ -6353,9 +6416,10 @@ by this function.  This happens in an interactive call.  
*/)
   (register Lisp_Object arg, Lisp_Object set_minimum)
 {
   struct window *w = XWINDOW (selected_window);
-  EMACS_INT requested_arg = (NILP (arg)
-                            ? window_body_width (w, 0) - 2
-                            : XFIXNUM (Fprefix_numeric_value (arg)));
+  EMACS_INT requested_arg =
+    (NILP (arg)
+     ? window_body_width (w, WINDOW_BODY_IN_CANONICAL_CHARS) - 2
+     : XFIXNUM (Fprefix_numeric_value (arg)));
   Lisp_Object result = set_window_hscroll (w, w->hscroll + requested_arg);
 
   if (!NILP (set_minimum))
@@ -6378,9 +6442,10 @@ by this function.  This happens in an interactive call.  
*/)
   (register Lisp_Object arg, Lisp_Object set_minimum)
 {
   struct window *w = XWINDOW (selected_window);
-  EMACS_INT requested_arg = (NILP (arg)
-                            ? window_body_width (w, 0) - 2
-                            : XFIXNUM (Fprefix_numeric_value (arg)));
+  EMACS_INT requested_arg =
+    (NILP (arg)
+     ? window_body_width (w, WINDOW_BODY_IN_CANONICAL_CHARS) - 2
+     : XFIXNUM (Fprefix_numeric_value (arg)));
   Lisp_Object result = set_window_hscroll (w, w->hscroll - requested_arg);
 
   if (!NILP (set_minimum))
@@ -7944,7 +8009,7 @@ optional second arg PIXELS-P means value is measured in 
pixels.  */)
 
 
 DEFUN ("set-window-vscroll", Fset_window_vscroll, Sset_window_vscroll,
-       2, 3, 0,
+       2, 4, 0,
        doc: /* Set amount by which WINDOW should be scrolled vertically to 
VSCROLL.
 This takes effect when displaying tall lines or images.
 
@@ -7954,8 +8019,12 @@ optional third arg PIXELS-P non-nil means that VSCROLL 
is in pixels.
 If PIXELS-P is nil, VSCROLL may have to be rounded so that it
 corresponds to an integral number of pixels.  The return value is the
 result of this rounding.
-If PIXELS-P is non-nil, the return value is VSCROLL.  */)
-  (Lisp_Object window, Lisp_Object vscroll, Lisp_Object pixels_p)
+If PIXELS-P is non-nil, the return value is VSCROLL.
+
+PRESERVE-VSCROLL-P makes setting the start of WINDOW preserve the
+vscroll if its start is "frozen" due to a resized mini-window.  */)
+  (Lisp_Object window, Lisp_Object vscroll, Lisp_Object pixels_p,
+   Lisp_Object preserve_vscroll_p)
 {
   struct window *w = decode_live_window (window);
   struct frame *f = XFRAME (w->frame);
@@ -7980,7 +8049,12 @@ If PIXELS-P is non-nil, the return value is VSCROLL.  */)
 
          /* Prevent redisplay shortcuts.  */
          XBUFFER (w->contents)->prevent_redisplay_optimizations_p = true;
+
+         /* Mark W for redisplay.  (bug#55299) */
+         wset_redisplay (w);
        }
+
+      w->preserve_vscroll_p = !NILP (preserve_vscroll_p);
     }
 
   return Fwindow_vscroll (window, pixels_p);
@@ -8109,11 +8183,11 @@ compare_window_configurations (Lisp_Object 
configuration1,
   return true;
 }
 
-DEFUN ("compare-window-configurations", Fcompare_window_configurations,
-       Scompare_window_configurations, 2, 2, 0,
-       doc: /* Compare two window configurations as regards the structure of 
windows.
-This function ignores details such as the values of point
-and scrolling positions.  */)
+DEFUN ("window-configuration-equal-p", Fwindow_configuration_equal_p,
+       Swindow_configuration_equal_p, 2, 2, 0,
+       doc: /* Say whether two window configurations have the same window 
layout.
+This function ignores details such as the values of point and
+scrolling positions.  */)
   (Lisp_Object x, Lisp_Object y)
 {
   if (compare_window_configurations (x, y))
@@ -8601,7 +8675,7 @@ displayed after a scrolling operation to be somewhat 
inaccurate.  */);
   defsubr (&Swindow_scroll_bars);
   defsubr (&Swindow_vscroll);
   defsubr (&Sset_window_vscroll);
-  defsubr (&Scompare_window_configurations);
+  defsubr (&Swindow_configuration_equal_p);
   defsubr (&Swindow_bump_use_time);
   defsubr (&Swindow_list);
   defsubr (&Swindow_list_1);
diff --git a/src/window.h b/src/window.h
index 387a3be36a..298a80a536 100644
--- a/src/window.h
+++ b/src/window.h
@@ -445,6 +445,10 @@ struct window
        window.  */
     bool_bf suspend_auto_hscroll : 1;
 
+    /* True if vscroll should be preserved while forcing the start due
+       to a frozen window.  */
+    bool_bf preserve_vscroll_p : 1;
+
     /* Amount by which lines of this window are scrolled in
        y-direction (smooth scrolling).  */
     int vscroll;
@@ -1182,7 +1186,13 @@ extern bool window_wants_mode_line (struct window *);
 extern bool window_wants_header_line (struct window *);
 extern bool window_wants_tab_line (struct window *);
 extern int window_internal_height (struct window *);
-extern int window_body_width (struct window *w, bool);
+enum window_body_unit
+  {
+    WINDOW_BODY_IN_CANONICAL_CHARS,
+    WINDOW_BODY_IN_PIXELS,
+    WINDOW_BODY_IN_REMAPPED_CHARS
+  };
+extern int window_body_width (struct window *w, enum window_body_unit);
 enum margin_unit { MARGIN_IN_LINES, MARGIN_IN_PIXELS };
 extern int window_scroll_margin (struct window *, enum margin_unit);
 extern void temp_output_buffer_show (Lisp_Object);
diff --git a/src/xdisp.c b/src/xdisp.c
index 50efa50c55..b02375ab2d 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -5894,7 +5894,7 @@ handle_single_display_spec (struct it *it, Lisp_Object 
spec, Lisp_Object object,
        location = tem;
     }
 
-  if (EQ (location, Qunbound))
+  if (BASE_EQ (location, Qunbound))
     {
       location = Qnil;
       value = spec;
@@ -11234,7 +11234,7 @@ argument if the size of the buffer is large or unknown.
 
 Optional argument MODE-LINES nil or omitted means do not include the
 height of the mode-, tab- or header-line of WINDOW in the return value.
-If it is the symbol `mode-line', 'tab-line' or `header-line', include
+If it is the symbol `mode-line', `tab-line' or `header-line', include
 only the height of that line, if present, in the return value.  If t,
 include the height of any of these, if present, in the return value.
 
@@ -13148,7 +13148,7 @@ store_mode_line_noprop (const char *string, int 
field_width, int precision)
    Vicon_title_format if FRAME is iconified, otherwise it is
    frame_title_format.  */
 
-static void
+void
 gui_consider_frame_title (Lisp_Object frame)
 {
   struct frame *f = XFRAME (frame);
@@ -13200,8 +13200,9 @@ gui_consider_frame_title (Lisp_Object frame)
         mode_line_noprop_buf; then display the title.  */
       record_unwind_protect (unwind_format_mode_line,
                             format_mode_line_unwind_data
-                            (NULL, current_buffer, Qnil, false));
+                            (f, current_buffer, selected_window, false));
 
+      Fselect_window (f->selected_window, Qt);
       set_buffer_internal_1
        (XBUFFER (XWINDOW (f->selected_window)->contents));
       fmt = FRAME_ICONIFIED_P (f) ? Vicon_title_format : Vframe_title_format;
@@ -17006,6 +17007,7 @@ mark_window_display_accurate_1 (struct window *w, bool 
accurate_p)
 
       w->window_end_valid = true;
       w->update_mode_line = false;
+      w->preserve_vscroll_p = false;
     }
 
   w->redisplay = !accurate_p;
@@ -17850,7 +17852,7 @@ cursor_row_fully_visible_p (struct window *w, bool 
force_p,
     buffer_local_value (Qmake_cursor_line_fully_visible, w->contents);
 
   /* If no local binding, use the global value.  */
-  if (EQ (mclfv_p, Qunbound))
+  if (BASE_EQ (mclfv_p, Qunbound))
     mclfv_p = Vmake_cursor_line_fully_visible;
   /* Follow mode sets the variable to a Lisp function in buffers that
      are under Follow mode.  */
@@ -19168,7 +19170,14 @@ redisplay_window (Lisp_Object window, bool 
just_this_one_p)
       int new_vpos = -1;
 
       w->force_start = false;
-      w->vscroll = 0;
+
+      /* The vscroll should be preserved in this case, since
+        `pixel-scroll-precision-mode' must continue working normally
+        when a mini-window is resized.  (bug#55312) */
+      if (!w->preserve_vscroll_p || !window_frozen_p (w))
+       w->vscroll = 0;
+
+      w->preserve_vscroll_p = false;
       w->window_end_valid = false;
 
       /* Forget any recorded base line for line number display.  */
@@ -22463,6 +22472,13 @@ compute_line_metrics (struct it *it)
 }
 
 
+static void
+clear_position (struct it *it)
+{
+  it->position.charpos = 0;
+  it->position.bytepos = 0;
+}
+
 /* Append one space to the glyph row of iterator IT if doing a
    window-based redisplay.  The space has the same face as
    IT->face_id.  Value is true if a space was added.
@@ -22498,7 +22514,7 @@ append_space_for_newline (struct it *it, bool 
default_face_p)
       struct face *face;
 
       it->what = IT_CHARACTER;
-      memset (&it->position, 0, sizeof it->position);
+      clear_position (it);
       it->object = Qnil;
       it->len = 1;
 
@@ -22827,7 +22843,7 @@ extend_face_to_end_of_line (struct it *it)
              const int stretch_width =
                indicator_column - it->current_x - char_width;
 
-             memset (&it->position, 0, sizeof it->position);
+             clear_position (it);
 
              /* Only generate a stretch glyph if there is distance
                 between current_x and the indicator position.  */
@@ -22861,7 +22877,7 @@ extend_face_to_end_of_line (struct it *it)
 
              if (stretch_width > 0)
                {
-                 memset (&it->position, 0, sizeof it->position);
+                 clear_position (it);
                  append_stretch_glyph (it, Qnil, stretch_width,
                                        it->ascent + it->descent,
                                        stretch_ascent);
@@ -22911,7 +22927,7 @@ extend_face_to_end_of_line (struct it *it)
                (((it->ascent + it->descent)
                  * FONT_BASE (font)) / FONT_HEIGHT (font));
              saved_pos = it->position;
-             memset (&it->position, 0, sizeof it->position);
+             clear_position (it);
              saved_avoid_cursor = it->avoid_cursor_p;
              it->avoid_cursor_p = true;
              saved_face_id = it->face_id;
@@ -22949,7 +22965,7 @@ extend_face_to_end_of_line (struct it *it)
       enum display_element_type saved_what = it->what;
 
       it->what = IT_CHARACTER;
-      memset (&it->position, 0, sizeof it->position);
+      clear_position (it);
       it->object = Qnil;
       it->c = it->char_to_display = ' ';
       it->len = 1;
@@ -28357,7 +28373,7 @@ calc_pixel_width_or_height (double *res, struct it *it, 
Lisp_Object prop,
        }
 
       prop = buffer_local_value (prop, it->w->contents);
-      if (EQ (prop, Qunbound))
+      if (BASE_EQ (prop, Qunbound))
        prop = Qnil;
     }
 
@@ -28420,13 +28436,13 @@ calc_pixel_width_or_height (double *res, struct it 
*it, Lisp_Object prop,
            }
 
          car = buffer_local_value (car, it->w->contents);
-         if (EQ (car, Qunbound))
+         if (BASE_EQ (car, Qunbound))
            car = Qnil;
        }
 
       /* '(NUM)': absolute number of pixels.  */
       if (NUMBERP (car))
-{
+       {
          double fact;
          int offset =
            width_p && align_to && *align_to < 0 ? it->lnum_pixel_width : 0;
@@ -32015,14 +32031,16 @@ gui_insert_glyphs (struct window *w, struct glyph_row 
*updated_row,
 
 void
 gui_clear_end_of_line (struct window *w, struct glyph_row *updated_row,
-                    enum glyph_row_area updated_area, int to_x)
+                      enum glyph_row_area updated_area, int to_x)
 {
   struct frame *f;
   int max_x, min_y, max_y;
   int from_x, from_y, to_y;
+  struct face *face;
 
   eassert (updated_row);
   f = XFRAME (w->frame);
+  face = FACE_FROM_ID_OR_NULL (f, DEFAULT_FACE_ID);
 
   if (updated_row->full_width_p)
     max_x = (WINDOW_PIXEL_WIDTH (w)
@@ -32074,6 +32092,9 @@ gui_clear_end_of_line (struct window *w, struct 
glyph_row *updated_row,
       block_input ();
       FRAME_RIF (f)->clear_frame_area (f, from_x, from_y,
                                        to_x - from_x, to_y - from_y);
+
+      if (face && !updated_row->stipple_p)
+       updated_row->stipple_p = face->stipple;
       unblock_input ();
     }
 }
@@ -32638,7 +32659,7 @@ display_and_set_cursor (struct window *w, bool on,
 {
   struct frame *f = XFRAME (w->frame);
   int new_cursor_type;
-  int new_cursor_width;
+  int new_cursor_width UNINIT;
   bool active_cursor;
   struct glyph_row *glyph_row;
   struct glyph *glyph;
@@ -36229,7 +36250,7 @@ they return to their normal size when the minibuffer is 
closed, or the
 echo area becomes empty.
 
 This variable does not affect resizing of the minibuffer window of
-minibuffer-only frames.  These are handled by 'resize-mini-frames'
+minibuffer-only frames.  These are handled by `resize-mini-frames'
 only.  */);
   /* Contrary to the doc string, we initialize this to nil, so that
      loading loadup.el won't try to resize windows before loading
@@ -36453,7 +36474,7 @@ see biditest.el in the test suite.  */);
     doc: /* Non-nil means inhibit the Bidirectional Parentheses Algorithm.
 Disabling the BPA makes redisplay faster, but might produce incorrect
 display reordering of bidirectional text with embedded parentheses and
-other bracket characters whose 'paired-bracket' Unicode property is
+other bracket characters whose `paired-bracket' Unicode property is
 non-nil, see `get-char-code-property'.  */);
   bidi_inhibit_bpa = false;
 
diff --git a/src/xfaces.c b/src/xfaces.c
index 05e0df4b7d..7395ce157e 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -6871,7 +6871,6 @@ DEFUN ("show-face-resources", Fshow_face_resources, 
Sshow_face_resources,
                            Initialization
  ***********************************************************************/
 
-#ifdef HAVE_PDUMPER
 /* All the faces defined during loadup are recorded in
    face-new-frame-defaults.  We need to set next_lface_id to the next
    face ID number, so that any new faces defined in this session will
@@ -6881,26 +6880,35 @@ DEFUN ("show-face-resources", Fshow_face_resources, 
Sshow_face_resources,
 void
 init_xfaces (void)
 {
-  int nfaces = XFIXNAT (Fhash_table_count (Vface_new_frame_defaults));
-  if (nfaces > 0)
-    {
-      /* Allocate the lface_id_to_name[] array.  */
-      lface_id_to_name_size = next_lface_id = nfaces;
-      lface_id_to_name = xnmalloc (next_lface_id, sizeof *lface_id_to_name);
+#ifdef HAVE_PDUMPER
+  int nfaces;
 
-      /* Store the faces.  */
-      struct Lisp_Hash_Table* table = XHASH_TABLE (Vface_new_frame_defaults);
-      for (ptrdiff_t idx = 0; idx < nfaces; ++idx)
+  if (dumped_with_pdumper_p ())
+    {
+      nfaces = XFIXNAT (Fhash_table_count (Vface_new_frame_defaults));
+      if (nfaces > 0)
        {
-         Lisp_Object lface = HASH_KEY (table, idx);
-         Lisp_Object face_id = CAR (HASH_VALUE (table, idx));
-          if (FIXNATP (face_id)) {
-              int id = XFIXNAT (face_id);
-              eassert (id >= 0);
-              lface_id_to_name[id] = lface;
-            }
+         /* Allocate the lface_id_to_name[] array.  */
+         lface_id_to_name_size = next_lface_id = nfaces;
+         lface_id_to_name = xnmalloc (next_lface_id, sizeof *lface_id_to_name);
+
+         /* Store the faces.  */
+         struct Lisp_Hash_Table* table = XHASH_TABLE 
(Vface_new_frame_defaults);
+         for (ptrdiff_t idx = 0; idx < nfaces; ++idx)
+           {
+             Lisp_Object lface = HASH_KEY (table, idx);
+             Lisp_Object face_id = CAR (HASH_VALUE (table, idx));
+             if (FIXNATP (face_id))
+               {
+                 int id = XFIXNAT (face_id);
+                 eassert (id >= 0);
+                 lface_id_to_name[id] = lface;
+               }
+           }
        }
     }
+#endif
+
   face_attr_sym[0] = Qface;
   face_attr_sym[LFACE_FOUNDRY_INDEX] = QCfoundry;
   face_attr_sym[LFACE_SWIDTH_INDEX] = QCwidth;
@@ -6921,7 +6929,6 @@ init_xfaces (void)
   face_attr_sym[LFACE_DISTANT_FOREGROUND_INDEX] = QCdistant_foreground;
   face_attr_sym[LFACE_EXTEND_INDEX] = QCextend;
 }
-#endif
 
 void
 syms_of_xfaces (void)
diff --git a/src/xfns.c b/src/xfns.c
index dc8f02780c..05023524a7 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -973,7 +973,7 @@ x_set_parent_frame (struct frame *f, Lisp_Object new_value, 
Lisp_Object old_valu
       if (p)
        {
          window = gtk_widget_get_window (FRAME_GTK_OUTER_WIDGET (f));
-         gdk_x11_window_set_frame_sync_enabled (window, false);
+         gdk_x11_window_set_frame_sync_enabled (window, FALSE);
        }
 #endif
       unblock_input ();
@@ -1261,25 +1261,27 @@ struct mouse_cursor_types {
 };
 
 /* This array must stay in sync with enum mouse_cursor above!  */
-static const struct mouse_cursor_types mouse_cursor_types[] = {
-  { "text",      &Vx_pointer_shape,                    XC_xterm               
},
-  { "nontext",   &Vx_nontext_pointer_shape,            XC_left_ptr            
},
-  { "hourglass", &Vx_hourglass_pointer_shape,          XC_watch               
},
-  { "modeline",  &Vx_mode_pointer_shape,               XC_xterm               
},
-  { NULL,        &Vx_sensitive_text_pointer_shape,     XC_hand2               
},
-  { NULL,        &Vx_window_horizontal_drag_shape,     XC_sb_h_double_arrow   
},
-  { NULL,        &Vx_window_vertical_drag_shape,       XC_sb_v_double_arrow   
},
-  { NULL,        &Vx_window_left_edge_shape,           XC_left_side           
},
-  { NULL,        &Vx_window_top_left_corner_shape,     XC_top_left_corner     
},
-  { NULL,        &Vx_window_top_edge_shape,            XC_top_side            
},
-  { NULL,        &Vx_window_top_right_corner_shape,    XC_top_right_corner    
},
-  { NULL,        &Vx_window_right_edge_shape,          XC_right_side          
},
-  { NULL,        &Vx_window_bottom_right_corner_shape, XC_bottom_right_corner 
},
-  { NULL,        &Vx_window_bottom_edge_shape,         XC_bottom_side         
},
-  { NULL,        &Vx_window_bottom_left_corner_shape,  XC_bottom_left_corner  
},
-};
+static const struct mouse_cursor_types mouse_cursor_types[] =
+  {
+    { "text",      &Vx_pointer_shape,                    XC_xterm              
 },
+    { "nontext",   &Vx_nontext_pointer_shape,            XC_left_ptr           
 },
+    { "hourglass", &Vx_hourglass_pointer_shape,          XC_watch              
 },
+    { "modeline",  &Vx_mode_pointer_shape,               XC_xterm              
 },
+    { NULL,        &Vx_sensitive_text_pointer_shape,     XC_hand2              
 },
+    { NULL,        &Vx_window_horizontal_drag_shape,     XC_sb_h_double_arrow  
 },
+    { NULL,        &Vx_window_vertical_drag_shape,       XC_sb_v_double_arrow  
 },
+    { NULL,        &Vx_window_left_edge_shape,           XC_left_side          
 },
+    { NULL,        &Vx_window_top_left_corner_shape,     XC_top_left_corner    
 },
+    { NULL,        &Vx_window_top_edge_shape,            XC_top_side           
 },
+    { NULL,        &Vx_window_top_right_corner_shape,    XC_top_right_corner   
 },
+    { NULL,        &Vx_window_right_edge_shape,          XC_right_side         
 },
+    { NULL,        &Vx_window_bottom_right_corner_shape, 
XC_bottom_right_corner },
+    { NULL,        &Vx_window_bottom_edge_shape,         XC_bottom_side        
 },
+    { NULL,        &Vx_window_bottom_left_corner_shape,  XC_bottom_left_corner 
 },
+  };
 
-struct mouse_cursor_data {
+struct mouse_cursor_data
+{
   /* Last index for which XCreateFontCursor has been called, and thus
      the last index for which x_request_serial[] is valid.  */
   int last_cursor_create_request;
@@ -1360,8 +1362,10 @@ x_set_mouse_color (struct frame *f, Lisp_Object arg, 
Lisp_Object oldval)
     {
       cursor_data.x_request_serial[i] = XNextRequest (dpy);
       cursor_data.last_cursor_create_request = i;
-      cursor_data.cursor[i] = XCreateFontCursor (dpy,
-                                                cursor_data.cursor_num[i]);
+
+      cursor_data.cursor[i]
+       = x_create_font_cursor (FRAME_DISPLAY_INFO (f),
+                               cursor_data.cursor_num[i]);
     }
 
   /* Now sync up and process all received errors from cursor
@@ -2372,6 +2376,63 @@ x_set_scroll_bar_default_height (struct frame *f)
 #endif
 }
 
+static void
+x_set_alpha (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+{
+  double alpha = 1.0;
+  double newval[2];
+  int i;
+  Lisp_Object item;
+  bool alpha_identical_p;
+
+  alpha_identical_p = true;
+
+  for (i = 0; i < 2; i++)
+    {
+      newval[i] = 1.0;
+      if (CONSP (arg))
+        {
+          item = CAR (arg);
+          arg  = CDR (arg);
+
+         alpha_identical_p = false;
+        }
+      else
+        item = arg;
+
+      if (NILP (item))
+       alpha = - 1.0;
+      else if (FLOATP (item))
+       {
+         alpha = XFLOAT_DATA (item);
+         if (! (0 <= alpha && alpha <= 1.0))
+           args_out_of_range (make_float (0.0), make_float (1.0));
+       }
+      else if (FIXNUMP (item))
+       {
+         EMACS_INT ialpha = XFIXNUM (item);
+         if (! (0 <= ialpha && ialpha <= 100))
+           args_out_of_range (make_fixnum (0), make_fixnum (100));
+         alpha = ialpha / 100.0;
+       }
+      else
+       wrong_type_argument (Qnumberp, item);
+      newval[i] = alpha;
+    }
+
+  for (i = 0; i < 2; i++)
+    f->alpha[i] = newval[i];
+
+  FRAME_X_OUTPUT (f)->alpha_identical_p = alpha_identical_p;
+
+  if (FRAME_TERMINAL (f)->set_frame_alpha_hook)
+    {
+      block_input ();
+      FRAME_TERMINAL (f)->set_frame_alpha_hook (f);
+      unblock_input ();
+    }
+}
+
 
 /* Record in frame F the specified or default value according to ALIST
    of the parameter named PROP (a Lisp symbol).  If no value is
@@ -2389,7 +2450,7 @@ x_default_scroll_bar_color_parameter (struct frame *f,
 
   tem = gui_display_get_arg (dpyinfo, alist, prop, xprop, xclass,
                              RES_TYPE_STRING);
-  if (EQ (tem, Qunbound))
+  if (BASE_EQ (tem, Qunbound))
     {
 #ifdef USE_TOOLKIT_SCROLL_BARS
 
@@ -4163,12 +4224,12 @@ x_icon_verify (struct frame *f, Lisp_Object parms)
      icons in an icon window.  */
   icon_x = gui_frame_get_and_record_arg (f, parms, Qicon_left, 0, 0, 
RES_TYPE_NUMBER);
   icon_y = gui_frame_get_and_record_arg (f, parms, Qicon_top, 0, 0, 
RES_TYPE_NUMBER);
-  if (!EQ (icon_x, Qunbound) && !EQ (icon_y, Qunbound))
+  if (!BASE_EQ (icon_x, Qunbound) && !BASE_EQ (icon_y, Qunbound))
     {
       CHECK_FIXNUM (icon_x);
       CHECK_FIXNUM (icon_y);
     }
-  else if (!EQ (icon_x, Qunbound) || !EQ (icon_y, Qunbound))
+  else if (!BASE_EQ (icon_x, Qunbound) || !BASE_EQ (icon_y, Qunbound))
     error ("Both left and top icon corners of icon must be specified");
 }
 
@@ -4187,8 +4248,8 @@ x_icon (struct frame *f, Lisp_Object parms)
     = gui_frame_get_and_record_arg (f, parms, Qicon_top, 0, 0, 
RES_TYPE_NUMBER);
   int icon_xval, icon_yval;
 
-  bool xgiven = !EQ (icon_x, Qunbound);
-  bool ygiven = !EQ (icon_y, Qunbound);
+  bool xgiven = !BASE_EQ (icon_x, Qunbound);
+  bool ygiven = !BASE_EQ (icon_y, Qunbound);
   if (xgiven != ygiven)
     error ("Both left and top icon corners of icon must be specified");
   if (xgiven)
@@ -4373,7 +4434,7 @@ x_default_font_parameter (struct frame *f, Lisp_Object 
parms)
   Lisp_Object font_param = gui_display_get_arg (dpyinfo, parms, Qfont, NULL, 
NULL,
                                                 RES_TYPE_STRING);
   Lisp_Object font = Qnil;
-  if (EQ (font_param, Qunbound))
+  if (BASE_EQ (font_param, Qunbound))
     font_param = Qnil;
 
   if (NILP (font_param))
@@ -4490,6 +4551,9 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
   struct x_display_info *dpyinfo = NULL;
   Lisp_Object parent, parent_frame;
   struct kboard *kb;
+#ifdef HAVE_GTK3
+  GdkWindow *gwin;
+#endif
 
   parms = Fcopy_alist (parms);
 
@@ -4499,10 +4563,10 @@ This function is an internal primitive--use 
`make-frame' instead.  */)
 
   display = gui_display_get_arg (dpyinfo, parms, Qterminal, 0, 0,
                                  RES_TYPE_NUMBER);
-  if (EQ (display, Qunbound))
+  if (BASE_EQ (display, Qunbound))
     display = gui_display_get_arg (dpyinfo, parms, Qdisplay, 0, 0,
                                    RES_TYPE_STRING);
-  if (EQ (display, Qunbound))
+  if (BASE_EQ (display, Qunbound))
     display = Qnil;
   dpyinfo = check_x_display_info (display);
   kb = dpyinfo->terminal->kboard;
@@ -4513,7 +4577,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
   name = gui_display_get_arg (dpyinfo, parms, Qname, "name", "Name",
                               RES_TYPE_STRING);
   if (!STRINGP (name)
-      && ! EQ (name, Qunbound)
+      && ! BASE_EQ (name, Qunbound)
       && ! NILP (name))
     error ("Invalid frame name--not a string or nil");
 
@@ -4523,7 +4587,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
   /* See if parent window is specified.  */
   parent = gui_display_get_arg (dpyinfo, parms, Qparent_id, NULL, NULL,
                                 RES_TYPE_NUMBER);
-  if (EQ (parent, Qunbound))
+  if (BASE_EQ (parent, Qunbound))
     parent = Qnil;
   if (! NILP (parent))
     CHECK_FIXNUM (parent);
@@ -4552,7 +4616,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
                                       RES_TYPE_SYMBOL);
   /* Accept parent-frame iff parent-id was not specified.  */
   if (!NILP (parent)
-      || EQ (parent_frame, Qunbound)
+      || BASE_EQ (parent_frame, Qunbound)
       || NILP (parent_frame)
       || !FRAMEP (parent_frame)
       || !FRAME_LIVE_P (XFRAME (parent_frame))
@@ -4568,7 +4632,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
                                          NULL,
                                          NULL,
                                          RES_TYPE_BOOLEAN)))
-      && !(EQ (tem, Qunbound)))
+      && !(BASE_EQ (tem, Qunbound)))
     undecorated = true;
 
   FRAME_UNDECORATED (f) = undecorated;
@@ -4580,7 +4644,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
                                          NULL,
                                          NULL,
                                          RES_TYPE_BOOLEAN)))
-      && !(EQ (tem, Qunbound)))
+      && !(BASE_EQ (tem, Qunbound)))
     override_redirect = true;
 
   FRAME_OVERRIDE_REDIRECT (f) = override_redirect;
@@ -4661,7 +4725,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
 
   /* Set the name; the functions to which we pass f expect the name to
      be set.  */
-  if (EQ (name, Qunbound) || NILP (name))
+  if (BASE_EQ (name, Qunbound) || NILP (name))
     {
       fset_name (f, build_string (dpyinfo->x_id_name));
       f->explicit_name = false;
@@ -4724,7 +4788,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
       value = gui_display_get_arg (dpyinfo, parms, Qinternal_border_width,
                                    "internalBorder", "internalBorder",
                                    RES_TYPE_NUMBER);
-      if (! EQ (value, Qunbound))
+      if (! BASE_EQ (value, Qunbound))
        parms = Fcons (Fcons (Qinternal_border_width, value),
                       parms);
     }
@@ -4746,7 +4810,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
       value = gui_display_get_arg (dpyinfo, parms, Qchild_frame_border_width,
                                    "childFrameBorder", "childFrameBorder",
                                    RES_TYPE_NUMBER);
-      if (! EQ (value, Qunbound))
+      if (! BASE_EQ (value, Qunbound))
        parms = Fcons (Fcons (Qchild_frame_border_width, value),
                       parms);
     }
@@ -4916,6 +4980,10 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
       if (EQ (x_gtk_resize_child_frames, Qresize_mode))
        gtk_container_set_resize_mode
          (GTK_CONTAINER (FRAME_GTK_OUTER_WIDGET (f)), GTK_RESIZE_IMMEDIATE);
+#endif
+#ifdef HAVE_GTK3
+      gwin = gtk_widget_get_window (FRAME_GTK_OUTER_WIDGET (f));
+      gdk_x11_window_set_frame_sync_enabled (gwin, FALSE);
 #endif
       unblock_input ();
     }
@@ -4984,7 +5052,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
        }
       else
        {
-         if (EQ (visibility, Qunbound))
+         if (BASE_EQ (visibility, Qunbound))
            visibility = Qt;
 
          if (!NILP (visibility))
@@ -4998,7 +5066,7 @@ This function is an internal primitive--use `make-frame' 
instead.  */)
         from `x-create-frame-with-faces' (see above comment).  */
       f->was_invisible
        = (f->was_invisible
-          && (!EQ (height, Qunbound) || !EQ (width, Qunbound)));
+          && (!BASE_EQ (height, Qunbound) || !BASE_EQ (width, Qunbound)));
 
       store_frame_param (f, Qvisibility, visibility);
     }
@@ -5366,6 +5434,9 @@ for each physical monitor, use 
`display-monitor-attributes-list'.  */)
 {
   struct x_display_info *dpyinfo = check_x_display_info (terminal);
 
+  if (dpyinfo->screen_mm_height)
+    return make_fixnum (dpyinfo->screen_mm_height);
+
   return make_fixnum (HeightMMOfScreen (dpyinfo->screen));
 }
 
@@ -5383,6 +5454,9 @@ for each physical monitor, use 
`display-monitor-attributes-list'.  */)
 {
   struct x_display_info *dpyinfo = check_x_display_info (terminal);
 
+  if (dpyinfo->screen_mm_width)
+    return make_fixnum (dpyinfo->screen_mm_width);
+
   return make_fixnum (WidthMMOfScreen (dpyinfo->screen));
 }
 
@@ -6526,17 +6600,61 @@ menu bar or tool bar of FRAME.  */)
  * WINDOW to FRAMES and return FRAMES.
  */
 static Lisp_Object
-x_frame_list_z_order (Display* dpy, Window window)
+x_frame_list_z_order (struct x_display_info *dpyinfo, Window window)
 {
+  Display *dpy;
   Window root, parent, *children;
   unsigned int nchildren;
-  int i;
-  Lisp_Object frames = Qnil;
+  unsigned long i;
+  Lisp_Object frames, val;
+  Atom type;
+  Window *toplevels;
+  int format, rc;
+  unsigned long nitems, bytes_after;
+  unsigned char *data;
+  struct frame *f;
+
+  dpy = dpyinfo->display;
+  data = NULL;
+  frames = Qnil;
+
+  if (window == dpyinfo->root_window
+      && x_wm_supports_1 (dpyinfo,
+                         dpyinfo->Xatom_net_client_list_stacking))
+    {
+      rc = XGetWindowProperty (dpyinfo->display, dpyinfo->root_window,
+                              dpyinfo->Xatom_net_client_list_stacking,
+                              0, LONG_MAX, False, XA_WINDOW, &type,
+                              &format, &nitems, &bytes_after, &data);
+
+      if (rc != Success)
+       return Qnil;
+
+      if (format != 32 || type != XA_WINDOW)
+       {
+         XFree (data);
+         return Qnil;
+       }
+
+      toplevels = (Window *) data;
+
+      for (i = 0; i < nitems; ++i)
+       {
+         f = x_top_window_to_frame (dpyinfo, toplevels[i]);
+
+         if (f)
+           {
+             XSETFRAME (val, f);
+             frames = Fcons (val, frames);
+           }
+       }
+
+      XFree (data);
+      return frames;
+    }
 
-  block_input ();
   if (XQueryTree (dpy, window, &root, &parent, &children, &nchildren))
     {
-      unblock_input ();
       for (i = 0; i < nchildren; i++)
        {
          Lisp_Object frame, tail;
@@ -6554,10 +6672,9 @@ x_frame_list_z_order (Display* dpy, Window window)
             }
        }
 
-      if (children) XFree ((char *)children);
+      if (children)
+       XFree (children);
     }
-  else
-    unblock_input ();
 
   return frames;
 }
@@ -6578,7 +6695,6 @@ Frames are listed from topmost (first) to bottommost 
(last).  */)
   (Lisp_Object terminal)
 {
   struct x_display_info *dpyinfo = check_x_display_info (terminal);
-  Display *dpy = dpyinfo->display;
   Window window;
 
   if (FRAMEP (terminal) && FRAME_LIVE_P (XFRAME (terminal)))
@@ -6586,7 +6702,7 @@ Frames are listed from topmost (first) to bottommost 
(last).  */)
   else
     window = dpyinfo->root_window;
 
-  return x_frame_list_z_order (dpy, window);
+  return x_frame_list_z_order (dpyinfo, window);
 }
 
 /**
@@ -6715,7 +6831,7 @@ The coordinates X and Y are interpreted in pixels 
relative to a position
   return Qnil;
 }
 
-DEFUN ("x-begin-drag", Fx_begin_drag, Sx_begin_drag, 1, 5, 0,
+DEFUN ("x-begin-drag", Fx_begin_drag, Sx_begin_drag, 1, 6, 0,
        doc: /* Begin dragging contents on FRAME, with targets TARGETS.
 TARGETS is a list of strings, which defines the X selection targets
 that will be available to the drop target.  Block until the mouse
@@ -6724,8 +6840,9 @@ buttons are released, then return the action chosen by 
the target, or
 starts when the mouse is pressed on FRAME, and the contents of the
 selection `XdndSelection' will be sent to the X window underneath the
 mouse pointer (the drop target) when the mouse button is released.
-ACTION is a symbol which tells the target what the source will do, and
-can be one of the following:
+
+ACTION is a symbol which tells the target what it should do, and can
+be one of the following:
 
  - `XdndActionCopy', which means to copy the contents from the drag
    source (FRAME) to the drop target.
@@ -6737,6 +6854,10 @@ can be one of the following:
 `XdndActionPrivate' is also a valid return value, and means that the
 drop target chose to perform an unspecified or unknown action.
 
+The source is also expected to cooperate with the target to perform
+the action chosen by the target.  For example, callers should delete
+the buffer text that was dragged if `XdndActionMove' is returned.
+
 There are also some other valid values of ACTION that depend on
 details of both the drop target's implementation details and that of
 Emacs.  For that reason, they are not mentioned here.  Consult
@@ -6759,20 +6880,29 @@ instead.
 
 If ALLOW-CURRENT-FRAME is not specified or nil, then the drop target
 is allowed to be FRAME.  Otherwise, no action will be taken if the
-mouse buttons are released on top of FRAME.  */)
+mouse buttons are released on top of FRAME.
+
+If FOLLOW-TOOLTIP is non-nil, any tooltip currently being displayed
+will be moved to follow the mouse pointer while the drag is in
+progress.  Note that this does not work with system tooltips (tooltips
+created when `use-system-tooltips' is non-nil).
+
+This function will sometimes return immediately if no mouse buttons
+are currently held down.  It should only be called when it is known
+that mouse buttons are being held down, such as immediately after a
+`down-mouse-1' (or similar) event.  */)
   (Lisp_Object targets, Lisp_Object action, Lisp_Object frame,
-   Lisp_Object return_frame, Lisp_Object allow_current_frame)
+   Lisp_Object return_frame, Lisp_Object allow_current_frame,
+   Lisp_Object follow_tooltip)
 {
   struct frame *f = decode_window_system_frame (frame);
   int ntargets = 0, nnames = 0;
-  ptrdiff_t len;
   char *target_names[2048];
   Atom *target_atoms;
   Lisp_Object lval, original, tem, t1, t2;
   Atom xaction;
   Atom action_list[2048];
   char *name_list[2048];
-  char *scratch;
 
   USE_SAFE_ALLOCA;
 
@@ -6786,10 +6916,8 @@ mouse buttons are released on top of FRAME.  */)
 
       if (ntargets < 2048)
        {
-         scratch = SSDATA (XCAR (targets));
-         len = strlen (scratch);
-         target_names[ntargets] = SAFE_ALLOCA (len + 1);
-         strncpy (target_names[ntargets], scratch, len + 1);
+         SAFE_ALLOCA_STRING (target_names[ntargets],
+                             XCAR (targets));
          ntargets++;
        }
       else
@@ -6839,10 +6967,8 @@ mouse buttons are released on top of FRAME.  */)
              else
                signal_error ("Invalid drag-and-drop action", tem);
 
-             scratch = SSDATA (ENCODE_UTF_8 (t2));
-             len = strlen (scratch);
-             name_list[nnames] = SAFE_ALLOCA (len + 1);
-             strncpy (name_list[nnames], scratch, len + 1);
+             SAFE_ALLOCA_STRING (name_list[nnames],
+                                 ENCODE_SYSTEM (t2));
 
              nnames++;
            }
@@ -6854,18 +6980,22 @@ mouse buttons are released on top of FRAME.  */)
   else
     signal_error ("Invalid drag-and-drop action", action);
 
-  target_atoms = xmalloc (ntargets * sizeof *target_atoms);
+  target_atoms = SAFE_ALLOCA (ntargets * sizeof *target_atoms);
 
-  block_input ();
+  /* Catch errors since interning lots of targets can potentially
+     generate a BadAlloc error.  */
+  x_catch_errors (FRAME_X_DISPLAY (f));
   XInternAtoms (FRAME_X_DISPLAY (f), target_names,
                ntargets, False, target_atoms);
-  unblock_input ();
+  x_check_errors (FRAME_X_DISPLAY (f),
+                 "Failed to intern target atoms: %s");
+  x_uncatch_errors_after_check ();
 
-  x_set_dnd_targets (target_atoms, ntargets);
   lval = x_dnd_begin_drag_and_drop (f, FRAME_DISPLAY_INFO (f)->last_user_time,
                                    xaction, return_frame, action_list,
                                    (const char **) &name_list, nnames,
-                                   !NILP (allow_current_frame));
+                                   !NILP (allow_current_frame), target_atoms,
+                                   ntargets, original, !NILP (follow_tooltip));
 
   SAFE_FREE ();
   return lval;
@@ -7184,19 +7314,28 @@ converted to an atom and the value of the atom is used. 
 If an element
 is a cons, it is converted to a 32 bit number where the car is the 16
 top bits and the cdr is the lower 16 bits.
 
-FRAME nil or omitted means use the selected frame.
-If TYPE is given and non-nil, it is the name of the type of VALUE.
- If TYPE is not given or nil, the type is STRING.
-FORMAT gives the size in bits of each element if VALUE is a list.
- It must be one of 8, 16 or 32.
- If VALUE is a string or FORMAT is nil or not given, FORMAT defaults to 8.
-If OUTER-P is non-nil, the property is changed for the outer X window of
- FRAME.  Default is to change on the edit X window.
-If WINDOW-ID is non-nil, change the property of that window instead
- of FRAME's X window; the number 0 denotes the root window.  This argument
- is separate from FRAME because window IDs are not unique across X
- displays or screens on the same display, so FRAME provides context
- for the window ID. */)
+FRAME nil or omitted means use the selected frame.  If TYPE is given
+and non-nil, it is the name of the type of VALUE.  If TYPE is not
+given or nil, the type is STRING.
+
+FORMAT gives the size in bits of each element if VALUE is a list.  It
+must be one of 8, 16 or 32.
+
+If VALUE is a string or FORMAT is nil or not given, FORMAT defaults to
+8.  If OUTER-P is non-nil, the property is changed for the outer X
+window of FRAME.  Default is to change on the edit X window.
+
+If WINDOW-ID is non-nil, change the property of that window instead of
+FRAME's X window; the number 0 denotes the root window.  This argument
+is separate from FRAME because window IDs are not unique across X
+displays or screens on the same display, so FRAME provides context for
+the window ID.
+
+If VALUE is a string and FORMAT is 32, then the format of VALUE is
+system-specific.  VALUE must contain unsigned integer data in native
+endian-ness in multiples of the size of the C type 'long': the low 32
+bits of each such number are used as the value of each element of the
+property.  */)
   (Lisp_Object prop, Lisp_Object value, Lisp_Object frame,
    Lisp_Object type, Lisp_Object format, Lisp_Object outer_p,
    Lisp_Object window_id)
@@ -7209,6 +7348,8 @@ If WINDOW-ID is non-nil, change the property of that 
window instead
   int nelements;
   Window target_window;
 #ifdef USE_XCB
+  bool intern_prop;
+  bool intern_target;
   xcb_intern_atom_cookie_t prop_atom_cookie;
   xcb_intern_atom_cookie_t target_type_cookie;
   xcb_intern_atom_reply_t *reply;
@@ -7279,41 +7420,62 @@ If WINDOW-ID is non-nil, change the property of that 
window instead
 
   block_input ();
 #ifndef USE_XCB
-  prop_atom = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (prop), False);
+  prop_atom = x_intern_cached_atom (FRAME_DISPLAY_INFO (f),
+                                   SSDATA (prop), false);
   if (! NILP (type))
     {
       CHECK_STRING (type);
-      target_type = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (type), False);
+      target_type = x_intern_cached_atom (FRAME_DISPLAY_INFO (f),
+                                         SSDATA (type), false);
     }
 #else
   rc = true;
-  prop_atom_cookie
-    = xcb_intern_atom (FRAME_DISPLAY_INFO (f)->xcb_connection,
-                      0, SBYTES (prop), SSDATA (prop));
+  intern_target = true;
+  intern_prop = true;
+
+  prop_atom = x_intern_cached_atom (FRAME_DISPLAY_INFO (f),
+                                   SSDATA (prop), true);
+
+  if (prop_atom != None)
+    intern_prop = false;
+  else
+    prop_atom_cookie
+      = xcb_intern_atom (FRAME_DISPLAY_INFO (f)->xcb_connection,
+                        0, SBYTES (prop), SSDATA (prop));
 
   if (!NILP (type))
     {
       CHECK_STRING (type);
-      target_type_cookie
-       = xcb_intern_atom (FRAME_DISPLAY_INFO (f)->xcb_connection,
-                          0, SBYTES (type), SSDATA (type));
-    }
 
-  reply = xcb_intern_atom_reply (FRAME_DISPLAY_INFO (f)->xcb_connection,
-                                prop_atom_cookie, &generic_error);
+      target_type = x_intern_cached_atom (FRAME_DISPLAY_INFO (f),
+                                         SSDATA (type), true);
 
-  if (reply)
-    {
-      prop_atom = (Atom) reply->atom;
-      free (reply);
+      if (target_type)
+       intern_target = false;
+      else
+       target_type_cookie
+         = xcb_intern_atom (FRAME_DISPLAY_INFO (f)->xcb_connection,
+                            0, SBYTES (type), SSDATA (type));
     }
-  else
+
+  if (intern_prop)
     {
-      free (generic_error);
-      rc = false;
+      reply = xcb_intern_atom_reply (FRAME_DISPLAY_INFO (f)->xcb_connection,
+                                    prop_atom_cookie, &generic_error);
+
+      if (reply)
+       {
+         prop_atom = (Atom) reply->atom;
+         free (reply);
+       }
+      else
+       {
+         free (generic_error);
+         rc = false;
+       }
     }
 
-  if (!NILP (type))
+  if (!NILP (type) && intern_target)
     {
       reply = xcb_intern_atom_reply (FRAME_DISPLAY_INFO (f)->xcb_connection,
                                     target_type_cookie, &generic_error);
@@ -7334,16 +7496,17 @@ If WINDOW-ID is non-nil, change the property of that 
window instead
     error ("Failed to intern type or property atom");
 #endif
 
+  x_catch_errors (FRAME_X_DISPLAY (f));
   XChangeProperty (FRAME_X_DISPLAY (f), target_window,
                   prop_atom, target_type, element_format, PropModeReplace,
                   data, nelements);
 
   if (CONSP (value)) xfree (data);
+  x_check_errors (FRAME_X_DISPLAY (f),
+                 "Couldn't change window property: %s");
+  x_uncatch_errors_after_check ();
 
-  /* Make sure the property is set when we return.  */
-  XFlush (FRAME_X_DISPLAY (f));
   unblock_input ();
-
   return value;
 }
 
@@ -7375,13 +7538,16 @@ Value is PROP.  */)
     }
 
   block_input ();
-  prop_atom = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (prop), False);
+  prop_atom = x_intern_cached_atom (FRAME_DISPLAY_INFO (f),
+                                   SSDATA (prop), false);
+
+  x_catch_errors (FRAME_X_DISPLAY (f));
   XDeleteProperty (FRAME_X_DISPLAY (f), target_window, prop_atom);
+  x_check_errors (FRAME_X_DISPLAY (f),
+                 "Couldn't delete window property: %s");
+  x_uncatch_errors_after_check ();
 
-  /* Make sure the property is removed when we return.  */
-  XFlush (FRAME_X_DISPLAY (f));
   unblock_input ();
-
   return prop;
 }
 
@@ -7501,15 +7667,19 @@ if PROP has no value of TYPE (always a string in the MS 
Windows case). */)
     }
 
   block_input ();
+  x_catch_errors (FRAME_X_DISPLAY (f));
+
   if (STRINGP (type))
     {
       if (strcmp ("AnyPropertyType", SSDATA (type)) == 0)
         target_type = AnyPropertyType;
       else
-        target_type = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (type), False);
+        target_type = x_intern_cached_atom (FRAME_DISPLAY_INFO (f),
+                                           SSDATA (type), false);
     }
 
-  prop_atom = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (prop), False);
+  prop_atom = x_intern_cached_atom (FRAME_DISPLAY_INFO (f),
+                                   SSDATA (prop), false);
   prop_value = x_window_property_intern (f,
                                          target_window,
                                          prop_atom,
@@ -7531,6 +7701,9 @@ if PROP has no value of TYPE (always a string in the MS 
Windows case). */)
                                              &found);
     }
 
+  x_check_errors (FRAME_X_DISPLAY (f),
+                 "Can't retrieve window property: %s");
+  x_uncatch_errors_after_check ();
 
   unblock_input ();
   return prop_value;
@@ -7576,7 +7749,9 @@ Otherwise, the return value is a vector with the 
following fields:
 
   block_input ();
 
-  prop_atom = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (prop), False);
+  x_catch_errors (FRAME_X_DISPLAY (f));
+  prop_atom = x_intern_cached_atom (FRAME_DISPLAY_INFO (f),
+                                   SSDATA (prop), false);
   rc = XGetWindowProperty (FRAME_X_DISPLAY (f), target_window,
                           prop_atom, 0, 0, False, AnyPropertyType,
                           &actual_type, &actual_format, &actual_size,
@@ -7606,6 +7781,10 @@ Otherwise, the return value is a vector with the 
following fields:
                         make_fixnum (bytes_remaining / (actual_format >> 3)));
     }
 
+  x_check_errors (FRAME_X_DISPLAY (f),
+                 "Can't retrieve window property: %s");
+  x_uncatch_errors_after_check ();
+
   unblock_input ();
   return prop_attr;
 }
@@ -7618,12 +7797,15 @@ static void compute_tip_xy (struct frame *, 
Lisp_Object, Lisp_Object,
                            Lisp_Object, int, int, int *, int *);
 
 /* The frame of the currently visible tooltip, or nil if none.  */
-static Lisp_Object tip_frame;
+Lisp_Object tip_frame;
 
 /* The window-system window corresponding to the frame of the
    currently visible tooltip.  */
 Window tip_window;
 
+/* The X and Y deltas of the last call to `x-show-tip'.  */
+Lisp_Object tip_dx, tip_dy;
+
 /* A timer that hides or deletes the currently visible tooltip when it
    fires.  */
 static Lisp_Object tip_timer;
@@ -7679,7 +7861,7 @@ x_create_tip_frame (struct x_display_info *dpyinfo, 
Lisp_Object parms)
   name = gui_display_get_arg (dpyinfo, parms, Qname, "name", "Name",
                               RES_TYPE_STRING);
   if (!STRINGP (name)
-      && !EQ (name, Qunbound)
+      && !BASE_EQ (name, Qunbound)
       && !NILP (name))
     error ("Invalid frame name--not a string or nil");
 
@@ -7746,7 +7928,7 @@ x_create_tip_frame (struct x_display_info *dpyinfo, 
Lisp_Object parms)
 
   /* Set the name; the functions to which we pass f expect the name to
      be set.  */
-  if (EQ (name, Qunbound) || NILP (name))
+  if (BASE_EQ (name, Qunbound) || NILP (name))
     {
       fset_name (f, build_string (dpyinfo->x_id_name));
       f->explicit_name = false;
@@ -7802,7 +7984,7 @@ x_create_tip_frame (struct x_display_info *dpyinfo, 
Lisp_Object parms)
       value = gui_display_get_arg (dpyinfo, parms, Qinternal_border_width,
                                    "internalBorder", "internalBorder",
                                    RES_TYPE_NUMBER);
-      if (! EQ (value, Qunbound))
+      if (! BASE_EQ (value, Qunbound))
        parms = Fcons (Fcons (Qinternal_border_width, value),
                       parms);
     }
@@ -8029,9 +8211,9 @@ x_create_tip_frame (struct x_display_info *dpyinfo, 
Lisp_Object parms)
    the display in *ROOT_X, and *ROOT_Y.  */
 
 static void
-compute_tip_xy (struct frame *f,
-               Lisp_Object parms, Lisp_Object dx, Lisp_Object dy,
-               int width, int height, int *root_x, int *root_y)
+compute_tip_xy (struct frame *f, Lisp_Object parms, Lisp_Object dx,
+               Lisp_Object dy, int width, int height, int *root_x,
+               int *root_y)
 {
   Lisp_Object left, top, right, bottom;
   int win_x, win_y;
@@ -8057,7 +8239,7 @@ compute_tip_xy (struct frame *f,
                     &root, &child, root_x, root_y, &win_x, &win_y, &pmask);
       unblock_input ();
 
-      XSETFRAME(frame, f);
+      XSETFRAME (frame, f);
       attributes = Fx_display_monitor_attributes_list (frame);
 
       /* Try to determine the monitor where the mouse pointer is and
@@ -8072,11 +8254,13 @@ compute_tip_xy (struct frame *f,
               min_y = XFIXNUM (Fnth (make_fixnum (2), geometry));
               max_x = min_x + XFIXNUM (Fnth (make_fixnum (3), geometry));
               max_y = min_y + XFIXNUM (Fnth (make_fixnum (4), geometry));
+
               if (min_x <= *root_x && *root_x < max_x
                   && min_y <= *root_y && *root_y < max_y)
                 {
                   break;
                 }
+
               max_y = -1;
             }
 
@@ -8086,7 +8270,7 @@ compute_tip_xy (struct frame *f,
 
   /* It was not possible to determine the monitor's geometry, so we
      assign some sane defaults here: */
-  if ( max_y < 0 )
+  if (max_y < 0)
     {
       min_x = 0;
       min_y = 0;
@@ -8335,6 +8519,9 @@ Text larger than the specified size is clipped.  */)
   else
     CHECK_FIXNUM (dy);
 
+  tip_dx = dx;
+  tip_dy = dy;
+
 #ifdef USE_GTK
   if (use_system_tooltips)
     {
@@ -8360,7 +8547,7 @@ Text larger than the specified size is clipped.  */)
   if (!NILP (tip_frame) && FRAME_LIVE_P (XFRAME (tip_frame)))
     {
       if (FRAME_VISIBLE_P (XFRAME (tip_frame))
-         && EQ (frame, tip_last_frame)
+         && BASE_EQ (frame, tip_last_frame)
          && !NILP (Fequal_including_properties (tip_last_string, string))
          && !NILP (Fequal (tip_last_parms, parms)))
        {
@@ -8381,7 +8568,7 @@ Text larger than the specified size is clipped.  */)
 
          goto start_timer;
        }
-      else if (tooltip_reuse_hidden_frame && EQ (frame, tip_last_frame))
+      else if (tooltip_reuse_hidden_frame && BASE_EQ (frame, tip_last_frame))
        {
          bool delete = false;
          Lisp_Object tail, elt, parm, last;
@@ -8714,6 +8901,9 @@ DEFUN ("x-file-dialog", Fx_file_dialog, Sx_file_dialog, 
2, 5, 0,
   /* Prevent redisplay.  */
   specbind (Qinhibit_redisplay, Qt);
 
+  /* Defer selection requests.  */
+  DEFER_SELECTIONS;
+
   block_input ();
 
   /* Create the dialog with PROMPT as title, using DIR as initial
@@ -9368,7 +9558,7 @@ frame_parm_handler x_frame_parm_handlers[] =
   x_set_wait_for_wm,
   gui_set_fullscreen,
   gui_set_font_backend,
-  gui_set_alpha,
+  x_set_alpha,
   x_set_sticky,
   x_set_tool_bar_position,
 #ifdef HAVE_XDBE
@@ -9638,11 +9828,11 @@ default and usually works with most desktops.  Some 
desktop environments
 however, may refuse to resize a child frame when Emacs is built with
 GTK3.  For those environments, the two settings below are provided.
 
-If this equals the symbol 'hide', Emacs temporarily hides the child
+If this equals the symbol `hide', Emacs temporarily hides the child
 frame during resizing.  This approach seems to work reliably, may
 however induce some flicker when the frame is made visible again.
 
-If this equals the symbol 'resize-mode', Emacs uses GTK's resize mode to
+If this equals the symbol `resize-mode', Emacs uses GTK's resize mode to
 always trigger an immediate resize of the child frame.  This method is
 deprecated by GTK and may not work in future versions of that toolkit.
 It also may freeze Emacs when used with other desktop environments.  It
@@ -9757,6 +9947,10 @@ eliminated in future versions of Emacs.  */);
   staticpro (&tip_last_string);
   tip_last_parms = Qnil;
   staticpro (&tip_last_parms);
+  tip_dx = Qnil;
+  staticpro (&tip_dx);
+  tip_dy = Qnil;
+  staticpro (&tip_dy);
 
   defsubr (&Sx_uses_old_gtk_dialog);
 #if defined (USE_MOTIF) || defined (USE_GTK)
diff --git a/src/xfont.c b/src/xfont.c
index 684c28ab21..74237e8aa8 100644
--- a/src/xfont.c
+++ b/src/xfont.c
@@ -295,7 +295,7 @@ xfont_list_pattern (Display *display, const char *pattern,
 {
   Lisp_Object list = Qnil;
   Lisp_Object chars = Qnil;
-  struct charset *encoding, *repertory = NULL;
+  struct charset *encoding = NULL, *repertory = NULL;
   int i, limit, num_fonts;
   char **names;
   /* Large enough to decode the longest XLFD (255 bytes). */
diff --git a/src/xftfont.c b/src/xftfont.c
index 31fb877c35..6043ef9f94 100644
--- a/src/xftfont.c
+++ b/src/xftfont.c
@@ -797,6 +797,15 @@ syms_of_xftfont (void)
 This is needed with some fonts to correct vertical overlap of glyphs.  */);
   xft_font_ascent_descent_override = 0;
 
+  DEFVAR_LISP ("xft-color-font-whitelist", Vxft_color_font_whitelist,
+    doc: /* List of "color" font families that don't actually have color 
glyphs.
+Some fonts (such as Source Code Pro) are reported as color fonts, but
+do not actually have glyphs with colors that can cause Xft crashes.
+
+The font families in this list will not be ignored when
+`xft-ignore-color-fonts' is non-nil.  */);
+  Vxft_color_font_whitelist = list1 (build_pure_c_string ("Source Code Pro"));
+
   pdumper_do_now_and_after_load (syms_of_xftfont_for_pdumper);
 }
 
diff --git a/src/xgselect.c b/src/xgselect.c
index 7252210c68..6e09a15fa8 100644
--- a/src/xgselect.c
+++ b/src/xgselect.c
@@ -33,6 +33,9 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 static ptrdiff_t threads_holding_glib_lock;
 static GMainContext *glib_main_context;
 
+/* The depth of xg_select suppression.  */
+static int xg_select_suppress_count;
+
 void
 release_select_lock (void)
 {
@@ -69,6 +72,23 @@ acquire_select_lock (GMainContext *context)
 #endif
 }
 
+/* Call this to not use xg_select when using it would be a bad idea,
+   i.e. during drag-and-drop.  */
+void
+suppress_xg_select (void)
+{
+  ++xg_select_suppress_count;
+}
+
+void
+release_xg_select (void)
+{
+  if (!xg_select_suppress_count)
+    emacs_abort ();
+
+  --xg_select_suppress_count;
+}
+
 /* `xg_select' is a `pselect' replacement.  Why do we need a separate function?
    1. Timeouts.  Glib and Gtk rely on timer events.  If we did pselect
       with a greater timeout then the one scheduled by Glib, we would
@@ -100,6 +120,9 @@ xg_select (int fds_lim, fd_set *rfds, fd_set *wfds, fd_set 
*efds,
   bool already_has_events;
 #endif
 
+  if (xg_select_suppress_count)
+    return pselect (fds_lim, rfds, wfds, efds, timeout, sigmask);
+
   context = g_main_context_default ();
   acquire_select_lock (context);
 
diff --git a/src/xgselect.h b/src/xgselect.h
index 15482cbf92..156d4bde59 100644
--- a/src/xgselect.h
+++ b/src/xgselect.h
@@ -25,9 +25,10 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 
 struct timespec;
 
-extern int xg_select (int max_fds,
-                     fd_set *rfds, fd_set *wfds, fd_set *efds,
-                     struct timespec *timeout, sigset_t *sigmask);
+extern int xg_select (int, fd_set *, fd_set *, fd_set *,
+                     struct timespec *, sigset_t *);
+extern void suppress_xg_select (void);
+extern void release_xg_select (void);
 
 extern void release_select_lock (void);
 
diff --git a/src/xmenu.c b/src/xmenu.c
index aaf53569a7..7134bf22c8 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -198,6 +198,10 @@ x_menu_wait_for_event (void *data)
       struct x_display_info *dpyinfo;
       int n = 0;
 
+      /* ISTM that if timer_check is okay, this should be too, since
+        both can run random Lisp.  */
+      x_handle_pending_selection_requests ();
+
       FD_ZERO (&read_fds);
       for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
         {
@@ -1579,6 +1583,8 @@ create_and_show_popup_menu (struct frame *f, widget_value 
*first_wv,
     }
 #endif
 
+  DEFER_SELECTIONS;
+
   /* Display the menu.  */
   gtk_widget_show_all (menu);
 
@@ -1868,6 +1874,8 @@ create_and_show_popup_menu (struct frame *f, widget_value 
*first_wv,
   {
     specpdl_ref specpdl_count = SPECPDL_INDEX ();
 
+    DEFER_SELECTIONS;
+
     record_unwind_protect_int (pop_down_menu, (int) menu_id);
 #ifdef HAVE_XINPUT2
     record_unwind_protect_ptr (leave_toolkit_menu, f);
@@ -1894,13 +1902,19 @@ x_menu_show (struct frame *f, int x, int y, int 
menuflags,
 {
   int i;
   widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0;
-  widget_value **submenu_stack
-    = alloca (menu_items_used * sizeof *submenu_stack);
-  Lisp_Object *subprefix_stack
-    = alloca (menu_items_used * sizeof *subprefix_stack);
+  widget_value **submenu_stack;
+  Lisp_Object *subprefix_stack;
   int submenu_depth = 0;
+  specpdl_ref specpdl_count;
 
-  specpdl_ref specpdl_count = SPECPDL_INDEX ();
+  USE_SAFE_ALLOCA;
+
+  submenu_stack = SAFE_ALLOCA (menu_items_used
+                              * sizeof *submenu_stack);
+  subprefix_stack = SAFE_ALLOCA (menu_items_used
+                                * sizeof *subprefix_stack);
+
+  specpdl_count = SPECPDL_INDEX ();
 
   eassert (FRAME_X_P (f));
 
@@ -1909,6 +1923,7 @@ x_menu_show (struct frame *f, int x, int y, int menuflags,
   if (menu_items_used <= MENU_ITEMS_PANE_LENGTH)
     {
       *error_name = "Empty menu";
+      SAFE_FREE ();
       return Qnil;
     }
 
@@ -2141,6 +2156,8 @@ x_menu_show (struct frame *f, int x, int y, int menuflags,
                          entry = Fcons (subprefix_stack[j], entry);
                    }
                  unblock_input ();
+
+                 SAFE_FREE ();
                  return entry;
                }
              i += MENU_ITEMS_ITEM_LENGTH;
@@ -2155,6 +2172,8 @@ x_menu_show (struct frame *f, int x, int y, int menuflags,
     }
 
   unblock_input ();
+
+  SAFE_FREE ();
   return Qnil;
 }
 
@@ -2188,6 +2207,8 @@ create_and_show_dialog (struct frame *f, widget_value 
*first_wv)
   if (menu)
     {
       specpdl_ref specpdl_count = SPECPDL_INDEX ();
+
+      DEFER_SELECTIONS;
       record_unwind_protect_ptr (pop_down_menu, menu);
 
       /* Display the menu.  */
@@ -2244,6 +2265,8 @@ create_and_show_dialog (struct frame *f, widget_value 
*first_wv)
   {
     specpdl_ref count = SPECPDL_INDEX ();
 
+    DEFER_SELECTIONS;
+
     /* xdialog_show_unwind is responsible for popping the dialog box down.  */
 
     record_unwind_protect_int (pop_down_menu, (int) dialog_id);
@@ -2704,18 +2727,18 @@ x_menu_show (struct frame *f, int x, int y, int 
menuflags,
   y = max (y, 1);
   XMenuLocate (FRAME_X_DISPLAY (f), menu, 0, 0, x, y,
               &ulx, &uly, &width, &height);
-  if (ulx+width > dispwidth)
+  if (ulx + width > dispwidth)
     {
       x -= (ulx + width) - dispwidth;
       ulx = dispwidth - width;
     }
-  if (uly+height > dispheight)
+  if (uly + height > dispheight)
     {
       y -= (uly + height) - dispheight;
       uly = dispheight - height;
     }
 #ifndef HAVE_X_WINDOWS
-  if (FRAME_HAS_MINIBUF_P (f) && uly+height > dispheight - 1)
+  if (FRAME_HAS_MINIBUF_P (f) && uly + height > dispheight - 1)
     {
       /* Move the menu away of the echo area, to avoid overwriting the
         menu with help echo messages or vice versa.  */
@@ -2739,8 +2762,8 @@ x_menu_show (struct frame *f, int x, int y, int menuflags,
       /* If position was not given by a mouse click, adjust so upper left
          corner of the menu as a whole ends up at given coordinates.  This
          is what x-popup-menu says in its documentation.  */
-      x += width/2;
-      y += 1.5*height/(maxlines+2);
+      x += width / 2;
+      y += 1.5 * height/ (maxlines + 2);
     }
 
   XMenuSetAEQ (menu, true);
@@ -2748,6 +2771,8 @@ x_menu_show (struct frame *f, int x, int y, int menuflags,
   pane = selidx = 0;
 
 #ifndef MSDOS
+  DEFER_SELECTIONS;
+
   XMenuActivateSetWaitFunction (x_menu_wait_for_event, FRAME_X_DISPLAY (f));
 #ifdef HAVE_XINPUT2
   XMenuActivateSetTranslateFunction (x_menu_translate_generic_event);
diff --git a/src/xrdb.c b/src/xrdb.c
index aa79d719c8..faeea04a53 100644
--- a/src/xrdb.c
+++ b/src/xrdb.c
@@ -486,11 +486,7 @@ x_get_resource (XrmDatabase rdb, const char *name, const 
char *class,
   if (XrmQGetResource (rdb, namelist, classlist, &type, &value) == True
       && (type == expected_type))
     {
-      if (type == x_rm_string)
-       ret_value->addr = (char *) value.addr;
-      else
-       memcpy (ret_value->addr, value.addr, ret_value->size);
-
+      *ret_value = value;
       return value.size;
     }
 
diff --git a/src/xselect.c b/src/xselect.c
index 3acfcbe94b..96c1e9830f 100644
--- a/src/xselect.c
+++ b/src/xselect.c
@@ -112,96 +112,10 @@ selection_quantum (Display *display)
          : MAX_SELECTION_QUANTUM);
 }
 
-#define LOCAL_SELECTION(selection_symbol,dpyinfo)                      \
+#define LOCAL_SELECTION(selection_symbol, dpyinfo)                     \
   assq_no_quit (selection_symbol, dpyinfo->terminal->Vselection_alist)
 
 
-/* Define a queue to save up SELECTION_REQUEST_EVENT events for later
-   handling.  */
-
-struct selection_event_queue
-  {
-    struct selection_input_event event;
-    struct selection_event_queue *next;
-  };
-
-static struct selection_event_queue *selection_queue;
-
-/* Nonzero means queue up SELECTION_REQUEST_EVENT events.  */
-
-static int x_queue_selection_requests;
-
-/* True if the input events are duplicates.  */
-
-static bool
-selection_input_event_equal (struct selection_input_event *a,
-                            struct selection_input_event *b)
-{
-  return (a->kind == b->kind && a->dpyinfo == b->dpyinfo
-         && a->requestor == b->requestor && a->selection == b->selection
-         && a->target == b->target && a->property == b->property
-         && a->time == b->time);
-}
-
-/* Queue up an SELECTION_REQUEST_EVENT *EVENT, to be processed later.  */
-
-static void
-x_queue_event (struct selection_input_event *event)
-{
-  struct selection_event_queue *queue_tmp;
-
-  /* Don't queue repeated requests.
-     This only happens for large requests which uses the incremental protocol. 
 */
-  for (queue_tmp = selection_queue; queue_tmp; queue_tmp = queue_tmp->next)
-    {
-      if (selection_input_event_equal (event, &queue_tmp->event))
-       {
-         TRACE1 ("DECLINE DUP SELECTION EVENT %p", queue_tmp);
-         x_decline_selection_request (event);
-         return;
-       }
-    }
-
-  queue_tmp = xmalloc (sizeof *queue_tmp);
-  TRACE1 ("QUEUE SELECTION EVENT %p", queue_tmp);
-  queue_tmp->event = *event;
-  queue_tmp->next = selection_queue;
-  selection_queue = queue_tmp;
-}
-
-/* Start queuing SELECTION_REQUEST_EVENT events.  */
-
-static void
-x_start_queuing_selection_requests (void)
-{
-  if (x_queue_selection_requests)
-    emacs_abort ();
-
-  x_queue_selection_requests++;
-  TRACE1 ("x_start_queuing_selection_requests %d", x_queue_selection_requests);
-}
-
-/* Stop queuing SELECTION_REQUEST_EVENT events.  */
-
-static void
-x_stop_queuing_selection_requests (void)
-{
-  TRACE1 ("x_stop_queuing_selection_requests %d", x_queue_selection_requests);
-  --x_queue_selection_requests;
-
-  /* Take all the queued events and put them back
-     so that they get processed afresh.  */
-
-  while (selection_queue != NULL)
-    {
-      struct selection_event_queue *queue_tmp = selection_queue;
-      TRACE1 ("RESTORE SELECTION EVENT %p", queue_tmp);
-      kbd_buffer_unget_event (&queue_tmp->event);
-      selection_queue = queue_tmp->next;
-      xfree (queue_tmp);
-    }
-}
-
 
 /* This converts a Lisp symbol to a server Atom, avoiding a server
    roundtrip whenever possible.  */
@@ -256,7 +170,7 @@ symbol_to_x_atom (struct x_display_info *dpyinfo, 
Lisp_Object sym)
 
   TRACE1 (" XInternAtom %s", SSDATA (SYMBOL_NAME (sym)));
   block_input ();
-  val = XInternAtom (dpyinfo->display, SSDATA (SYMBOL_NAME (sym)), False);
+  val = x_intern_cached_atom (dpyinfo, SSDATA (SYMBOL_NAME (sym)), false);
   unblock_input ();
   return val;
 }
@@ -265,7 +179,7 @@ symbol_to_x_atom (struct x_display_info *dpyinfo, 
Lisp_Object sym)
 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
    and calls to intern whenever possible.  */
 
-static Lisp_Object
+Lisp_Object
 x_atom_to_symbol (struct x_display_info *dpyinfo, Atom atom)
 {
   char *str;
@@ -319,18 +233,17 @@ x_atom_to_symbol (struct x_display_info *dpyinfo, Atom 
atom)
   if (atom == dpyinfo->Xatom_XmTRANSFER_FAILURE)
     return QXmTRANSFER_FAILURE;
 
-  block_input ();
   x_catch_errors (dpyinfo->display);
-  str = XGetAtomName (dpyinfo->display, atom);
+  str = x_get_atom_name (dpyinfo, atom, NULL);
   x_uncatch_errors ();
-  unblock_input ();
+
+  TRACE0 ("XGetAtomName --> NULL");
+  if (!str)
+    return Qnil;
   TRACE1 ("XGetAtomName --> %s", str);
-  if (! str) return Qnil;
+
   val = intern (str);
-  block_input ();
-  /* This was allocated by Xlib, so use XFree.  */
-  XFree (str);
-  unblock_input ();
+  xfree (str);
   return val;
 }
 
@@ -399,7 +312,7 @@ static Lisp_Object
 x_get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type,
                       bool local_request, struct x_display_info *dpyinfo)
 {
-  Lisp_Object local_value;
+  Lisp_Object local_value, tem;
   Lisp_Object handler_fn, value, check;
 
   local_value = LOCAL_SELECTION (selection_symbol, dpyinfo);
@@ -426,10 +339,24 @@ x_get_local_selection (Lisp_Object selection_symbol, 
Lisp_Object target_type,
       if (CONSP (handler_fn))
        handler_fn = XCDR (handler_fn);
 
+      tem = XCAR (XCDR (local_value));
+
+      if (STRINGP (tem))
+       {
+         local_value = Fget_text_property (make_fixnum (0),
+                                           target_type, tem);
+
+         if (!NILP (local_value))
+           tem = local_value;
+       }
+
       if (!NILP (handler_fn))
-       value = call3 (handler_fn,
-                      selection_symbol, (local_request ? Qnil : target_type),
-                      XCAR (XCDR (local_value)));
+       value = call3 (handler_fn, selection_symbol,
+                      ((local_request
+                        && NILP (Vx_treat_local_requests_remotely))
+                       ? Qnil
+                       : target_type),
+                      tem);
       else
        value = Qnil;
       value = unbind_to (count, value);
@@ -492,14 +419,6 @@ x_decline_selection_request (struct selection_input_event 
*event)
   unblock_input ();
 }
 
-/* This is the selection request currently being processed.
-   It is set to zero when the request is fully processed.  */
-static struct selection_input_event *x_selection_current_request;
-
-/* Display info in x_selection_request.  */
-
-static struct x_display_info *selection_request_dpyinfo;
-
 /* Raw selection data, for sending to a requestor window.  */
 
 struct selection_data
@@ -517,12 +436,59 @@ struct selection_data
   struct selection_data *next;
 };
 
-/* Linked list of the above (in support of MULTIPLE targets).  */
+struct x_selection_request
+{
+  /* The last element in this stack.  */
+  struct x_selection_request *last;
+
+  /* Its display info.  */
+  struct x_display_info *dpyinfo;
+
+  /* Its selection input event.  */
+  struct selection_input_event *request;
+
+  /* Linked list of the above (in support of MULTIPLE targets).  */
+  struct selection_data *converted_selections;
+
+  /* "Data" to send a requestor for a failed MULTIPLE subtarget.  */
+  Atom conversion_fail_tag;
+
+  /* Whether or not conversion was successful.  */
+  bool converted;
+};
+
+/* Stack of selections currently being processed.
+   NULL if all requests have been fully processed.  */
 
-static struct selection_data *converted_selections;
+struct x_selection_request *selection_request_stack;
 
-/* "Data" to send a requestor for a failed MULTIPLE subtarget.  */
-static Atom conversion_fail_tag;
+static void
+x_push_current_selection_request (struct selection_input_event *se,
+                                 struct x_display_info *dpyinfo)
+{
+  struct x_selection_request *frame;
+
+  frame = xmalloc (sizeof *frame);
+  frame->converted = false;
+  frame->last = selection_request_stack;
+  frame->request = se;
+  frame->dpyinfo = dpyinfo;
+  frame->converted_selections = NULL;
+  frame->conversion_fail_tag = None;
+
+  selection_request_stack = frame;
+}
+
+static void
+x_pop_current_selection_request (void)
+{
+  struct x_selection_request *tem;
+
+  tem = selection_request_stack;
+  selection_request_stack = selection_request_stack->last;
+
+  xfree (tem);
+}
 
 /* Used as an unwind-protect clause so that, if a selection-converter signals
    an error, we tell the requestor that we were unable to do what they wanted
@@ -532,19 +498,21 @@ static void
 x_selection_request_lisp_error (void)
 {
   struct selection_data *cs, *next;
+  struct x_selection_request *frame;
+
+  frame = selection_request_stack;
 
-  for (cs = converted_selections; cs; cs = next)
+  for (cs = frame->converted_selections; cs; cs = next)
     {
       next = cs->next;
       if (! cs->nofree && cs->data)
        xfree (cs->data);
       xfree (cs);
     }
-  converted_selections = NULL;
+  frame->converted_selections = NULL;
 
-  if (x_selection_current_request != 0
-      && selection_request_dpyinfo->display)
-    x_decline_selection_request (x_selection_current_request);
+  if (!frame->converted && frame->dpyinfo->display)
+    x_decline_selection_request (frame->request);
 }
 
 static void
@@ -610,6 +578,9 @@ x_reply_selection_request (struct selection_input_event 
*event,
   int max_bytes = selection_quantum (display);
   specpdl_ref count = SPECPDL_INDEX ();
   struct selection_data *cs;
+  struct x_selection_request *frame;
+
+  frame = selection_request_stack;
 
   reply->type = SelectionNotify;
   reply->display = display;
@@ -633,7 +604,7 @@ x_reply_selection_request (struct selection_input_event 
*event,
      (section 2.7.2 of ICCCM).  Note that we store the data for a
      MULTIPLE request in the opposite order; the ICCM says only that
      the conversion itself must be done in the same order. */
-  for (cs = converted_selections; cs; cs = cs->next)
+  for (cs = frame->converted_selections; cs; cs = cs->next)
     {
       if (cs->property == None)
        continue;
@@ -688,7 +659,7 @@ x_reply_selection_request (struct selection_input_event 
*event,
      be improved; there's a chance of deadlock if more than one
      subtarget in a MULTIPLE selection requires an INCR transfer, and
      the requestor and Emacs loop waiting on different transfers.  */
-  for (cs = converted_selections; cs; cs = cs->next)
+  for (cs = frame->converted_selections; cs; cs = cs->next)
     if (cs->wait_object)
       {
        int format_bytes = cs->format / 8;
@@ -793,7 +764,6 @@ static void
 x_handle_selection_request (struct selection_input_event *event)
 {
   Time local_selection_time;
-
   struct x_display_info *dpyinfo = SELECTION_EVENT_DPYINFO (event);
   Atom selection = SELECTION_EVENT_SELECTION (event);
   Lisp_Object selection_symbol = x_atom_to_symbol (dpyinfo, selection);
@@ -803,8 +773,12 @@ x_handle_selection_request (struct selection_input_event 
*event)
   Lisp_Object local_selection_data;
   bool success = false;
   specpdl_ref count = SPECPDL_INDEX ();
+  bool pushed;
+
+  pushed = false;
 
-  if (!dpyinfo) goto DONE;
+  if (!dpyinfo)
+    goto DONE;
 
   /* This is how the XDND protocol recommends dropping text onto a
      target that doesn't support XDND.  */
@@ -824,14 +798,12 @@ x_handle_selection_request (struct selection_input_event 
*event)
       && local_selection_time > SELECTION_EVENT_TIME (event))
     goto DONE;
 
-  x_selection_current_request = event;
-  selection_request_dpyinfo = dpyinfo;
+  block_input ();
+  pushed = true;
+  x_push_current_selection_request (event, dpyinfo);
+  record_unwind_protect_void (x_pop_current_selection_request);
   record_unwind_protect_void (x_selection_request_lisp_error);
-
-  /* We might be able to handle nested x_handle_selection_requests,
-     but this is difficult to test, and seems unimportant.  */
-  x_start_queuing_selection_requests ();
-  record_unwind_protect_void (x_stop_queuing_selection_requests);
+  unblock_input ();
 
   TRACE2 ("x_handle_selection_request: selection=%s, target=%s",
          SDATA (SYMBOL_NAME (selection_symbol)),
@@ -888,15 +860,17 @@ x_handle_selection_request (struct selection_input_event 
*event)
 
  DONE:
 
+  if (pushed)
+    selection_request_stack->converted = true;
+
   if (success)
     x_reply_selection_request (event, dpyinfo);
   else
     x_decline_selection_request (event);
-  x_selection_current_request = 0;
 
   /* Run the `x-sent-selection-functions' abnormal hook.  */
   if (!NILP (Vx_sent_selection_functions)
-      && !EQ (Vx_sent_selection_functions, Qunbound))
+      && !BASE_EQ (Vx_sent_selection_functions, Qunbound))
     CALLN (Frun_hook_with_args, Qx_sent_selection_functions,
           selection_symbol, target_symbol, success ? Qt : Qnil);
 
@@ -917,11 +891,14 @@ x_convert_selection (Lisp_Object selection_symbol,
 {
   Lisp_Object lisp_selection;
   struct selection_data *cs;
+  struct x_selection_request *frame;
 
   lisp_selection
     = x_get_local_selection (selection_symbol, target_symbol,
                             false, dpyinfo);
 
+  frame = selection_request_stack;
+
   /* A nil return value means we can't perform the conversion.  */
   if (NILP (lisp_selection)
       || (CONSP (lisp_selection) && NILP (XCDR (lisp_selection))))
@@ -929,15 +906,16 @@ x_convert_selection (Lisp_Object selection_symbol,
       if (for_multiple)
        {
          cs = xmalloc (sizeof *cs);
-         cs->data = (unsigned char *) &conversion_fail_tag;
+         cs->data = ((unsigned char *)
+                     &selection_request_stack->conversion_fail_tag);
          cs->size = 1;
          cs->format = 32;
          cs->type = XA_ATOM;
          cs->nofree = true;
          cs->property = property;
          cs->wait_object = NULL;
-         cs->next = converted_selections;
-         converted_selections = cs;
+         cs->next = frame->converted_selections;
+         frame->converted_selections = cs;
        }
 
       return false;
@@ -949,8 +927,8 @@ x_convert_selection (Lisp_Object selection_symbol,
   cs->nofree = true;
   cs->property = property;
   cs->wait_object = NULL;
-  cs->next = converted_selections;
-  converted_selections = cs;
+  cs->next = frame->converted_selections;
+  frame->converted_selections = cs;
   lisp_data_to_selection_data (dpyinfo, lisp_selection, cs);
   return true;
 }
@@ -1008,6 +986,12 @@ x_handle_selection_clear (struct selection_input_event 
*event)
   /* Run the `x-lost-selection-functions' abnormal hook.  */
   CALLN (Frun_hook_with_args, Qx_lost_selection_functions, selection_symbol);
 
+  /* If Emacs lost ownership of XdndSelection during drag-and-drop,
+     there is no point in continuing the drag-and-drop session.  */
+  if (x_dnd_in_progress
+      && EQ (selection_symbol, QXdndSelection))
+    error ("Lost ownership of XdndSelection");
+
   redisplay_preserve_echo_area (20);
 }
 
@@ -1017,8 +1001,6 @@ x_handle_selection_event (struct selection_input_event 
*event)
   TRACE0 ("x_handle_selection_event");
   if (event->kind != SELECTION_REQUEST_EVENT)
     x_handle_selection_clear (event);
-  else if (x_queue_selection_requests)
-    x_queue_event (event);
   else
     x_handle_selection_request (event);
 }
@@ -1148,8 +1130,13 @@ wait_for_property_change (struct prop_location *location)
       intmax_t secs = timeout / 1000;
       int nsecs = (timeout % 1000) * 1000000;
       TRACE2 ("  Waiting %"PRIdMAX" secs, %d nsecs", secs, nsecs);
-      wait_reading_process_output (secs, nsecs, 0, false,
-                                  property_change_reply, NULL, 0);
+
+      if (!input_blocked_p ())
+       wait_reading_process_output (secs, nsecs, 0, false,
+                                    property_change_reply, NULL, 0);
+      else
+       x_wait_for_cell_change (property_change_reply,
+                               make_timespec (secs, nsecs));
 
       if (NILP (XCAR (property_change_reply)))
        {
@@ -1256,9 +1243,22 @@ x_get_foreign_selection (Lisp_Object selection_symbol, 
Lisp_Object target_type,
   intmax_t secs = timeout / 1000;
   int nsecs = (timeout % 1000) * 1000000;
   TRACE1 ("  Start waiting %"PRIdMAX" secs for SelectionNotify", secs);
-  wait_reading_process_output (secs, nsecs, 0, false,
-                              reading_selection_reply, NULL, 0);
-  TRACE1 ("  Got event = %d", !NILP (XCAR (reading_selection_reply)));
+  /* This function can be called with input blocked inside Xt or GTK
+     timeouts run inside popup menus, so use a function that works
+     when input is blocked.  Prefer wait_reading_process_output
+     otherwise, or the toolkit might not get some events.
+     (bug#22214) */
+  if (!input_blocked_p ())
+    wait_reading_process_output (secs, nsecs, 0, false,
+                                reading_selection_reply, NULL, 0);
+  else
+    x_wait_for_cell_change (reading_selection_reply,
+                           make_timespec (secs, nsecs));
+  TRACE1 ("  Got event = %s", (!NILP (XCAR (reading_selection_reply))
+                              ? (SYMBOLP (XCAR (reading_selection_reply))
+                                 ? SSDATA (SYMBOL_NAME (XCAR 
(reading_selection_reply)))
+                                 : "YES")
+                              : "NO"));
 
   if (NILP (XCAR (reading_selection_reply)))
     error ("Timed out waiting for reply from selection owner");
@@ -1953,7 +1953,7 @@ x_handle_selection_notify (const XSelectionEvent *event)
   if (event->selection != reading_which_selection)
     return;
 
-  TRACE0 ("Received SelectionNotify");
+  TRACE1 ("Received SelectionNotify: %d", (int) event->property);
   XSETCAR (reading_selection_reply,
           (event->property != 0 ? Qt : Qlambda));
 }
@@ -2454,28 +2454,29 @@ If the value is 0 or the atom is not known, return the 
empty string.  */)
   (Lisp_Object value, Lisp_Object frame)
 {
   struct frame *f = decode_window_system_frame (frame);
-  char *name = 0;
-  char empty[] = "";
-  Lisp_Object ret = Qnil;
   Display *dpy = FRAME_X_DISPLAY (f);
+  struct x_display_info *dpyinfo;
   Atom atom;
-  bool had_errors_p;
+  bool had_errors_p, need_sync;
+  char *name;
+  Lisp_Object ret;
 
+  dpyinfo = FRAME_DISPLAY_INFO (f);
   CONS_TO_INTEGER (value, Atom, atom);
 
-  block_input ();
   x_catch_errors (dpy);
-  name = atom ? XGetAtomName (dpy, atom) : empty;
-  had_errors_p = x_had_errors_p (dpy);
+  name = x_get_atom_name (dpyinfo, atom, &need_sync);
+  had_errors_p = need_sync && x_had_errors_p (dpy);
   x_uncatch_errors_after_check ();
 
-  if (!had_errors_p)
-    ret = build_string (name);
+  ret = empty_unibyte_string;
 
-  if (atom && name) XFree (name);
-  if (NILP (ret)) ret = empty_unibyte_string;
-
-  unblock_input ();
+  if (name)
+    {
+      if (!had_errors_p)
+       ret = build_string (name);
+      xfree (name);
+    }
 
   return ret;
 }
@@ -2492,13 +2493,13 @@ FRAME is on.  If FRAME is nil, the selected frame is 
used.  */)
   ptrdiff_t i;
   struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
 
-
   if (SYMBOLP (atom))
     x_atom = symbol_to_x_atom (dpyinfo, atom);
   else if (STRINGP (atom))
     {
       block_input ();
-      x_atom = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (atom), False);
+      x_atom = x_intern_cached_atom (dpyinfo, SSDATA (atom),
+                                    false);
       unblock_input ();
     }
   else
@@ -2521,7 +2522,8 @@ FRAME is on.  If FRAME is nil, the selected frame is 
used.  */)
 
 bool
 x_handle_dnd_message (struct frame *f, const XClientMessageEvent *event,
-                      struct x_display_info *dpyinfo, struct input_event *bufp)
+                      struct x_display_info *dpyinfo, struct input_event *bufp,
+                     bool root_window_coords, int root_x, int root_y)
 {
   Lisp_Object vec;
   Lisp_Object frame;
@@ -2531,6 +2533,7 @@ x_handle_dnd_message (struct frame *f, const 
XClientMessageEvent *event,
   unsigned char *data = (unsigned char *) event->data.b;
   int idata[5];
   ptrdiff_t i;
+  Window child_return;
 
   for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
     if (dpyinfo->x_dnd_atoms[i] == event->message_type) break;
@@ -2562,7 +2565,15 @@ x_handle_dnd_message (struct frame *f, const 
XClientMessageEvent *event,
                                         event->format,
                                         size));
 
-  x_relative_mouse_position (f, &x, &y);
+  if (!root_window_coords)
+    x_relative_mouse_position (f, &x, &y);
+  else
+    XTranslateCoordinates (dpyinfo->display,
+                          dpyinfo->root_window,
+                          FRAME_X_WINDOW (f),
+                          root_x, root_y,
+                          &x, &y, &child_return);
+
   bufp->kind = DRAG_N_DROP_EVENT;
   bufp->frame_or_window = frame;
   bufp->timestamp = CurrentTime;
@@ -2799,6 +2810,14 @@ A value of 0 means wait as long as necessary.  This is 
initialized from the
 \"*selectionTimeout\" resource.  */);
   x_selection_timeout = 0;
 
+  DEFVAR_LISP ("x-treat-local-requests-remotely", 
Vx_treat_local_requests_remotely,
+    doc: /* Whether to treat local selection requests as remote ones.
+
+If non-nil, selection converters for string types (`STRING',
+`UTF8_STRING', `COMPOUND_TEXT', etc) will encode the strings, even
+when Emacs itself is converting the selection.  */);
+  Vx_treat_local_requests_remotely = Qnil;
+
   /* QPRIMARY is defined in keyboard.c.  */
   DEFSYM (QSECONDARY, "SECONDARY");
   DEFSYM (QSTRING, "STRING");
@@ -2838,6 +2857,4 @@ syms_of_xselect_for_pdumper (void)
   property_change_wait_list = 0;
   prop_location_identifier = 0;
   property_change_reply = Fcons (Qnil, Qnil);
-  converted_selections = NULL;
-  conversion_fail_tag = None;
 }
diff --git a/src/xsettings.c b/src/xsettings.c
index 71d02e6152..c29a844e0a 100644
--- a/src/xsettings.c
+++ b/src/xsettings.c
@@ -206,6 +206,11 @@ struct xsettings
   unsigned seen;
 };
 
+#ifdef HAVE_PGTK
+/* The cairo font_options as obtained using gsettings.  */
+static cairo_font_options_t *font_options;
+#endif
+
 #ifdef HAVE_GSETTINGS
 #define GSETTINGS_SCHEMA         "org.gnome.desktop.interface"
 #define GSETTINGS_TOOL_BAR_STYLE "toolbar-style"
@@ -215,11 +220,162 @@ struct xsettings
 #define GSETTINGS_FONT_NAME  "font-name"
 #endif
 
+#ifdef HAVE_PGTK
+#define GSETTINGS_FONT_ANTIALIASING  "font-antialiasing"
+#define GSETTINGS_FONT_RGBA_ORDER    "font-rgba-order"
+#define GSETTINGS_FONT_HINTING       "font-hinting"
+#endif
 
 /* The single GSettings instance, or NULL if not connected to GSettings.  */
 
 static GSettings *gsettings_client;
 
+#if defined HAVE_PGTK && defined HAVE_GSETTINGS
+
+static bool
+xg_settings_key_valid_p (GSettings *settings, const char *key)
+{
+#ifdef GLIB_VERSION_2_32
+  GSettingsSchema *schema;
+  bool rc;
+
+  g_object_get (G_OBJECT (settings),
+               "settings-schema", &schema,
+               NULL);
+
+  if (!schema)
+    return false;
+
+  rc = g_settings_schema_has_key (schema, key);
+  g_settings_schema_unref (schema);
+
+  return rc;
+#else
+  return false;
+#endif
+}
+
+#endif
+
+#ifdef HAVE_PGTK
+/* Store an event for re-rendering of the fonts.  */
+static void
+store_font_options_changed (void)
+{
+  if (dpyinfo_valid (first_dpyinfo))
+    store_config_changed_event (Qfont_render,
+                               XCAR (first_dpyinfo->name_list_element));
+}
+
+/* Apply changes in the hinting system setting.  */
+static void
+apply_gsettings_font_hinting (GSettings *settings)
+{
+  GVariant *val;
+  const char *hinting;
+
+  if (!xg_settings_key_valid_p (settings, GSETTINGS_FONT_HINTING))
+    return;
+
+  val = g_settings_get_value (settings, GSETTINGS_FONT_HINTING);
+
+  if (val)
+    {
+      g_variant_ref_sink (val);
+
+      if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
+       {
+         hinting = g_variant_get_string (val, NULL);
+
+         if (!strcmp (hinting, "full"))
+           cairo_font_options_set_hint_style (font_options,
+                                              CAIRO_HINT_STYLE_FULL);
+         else if (!strcmp (hinting, "medium"))
+           cairo_font_options_set_hint_style (font_options,
+                                              CAIRO_HINT_STYLE_MEDIUM);
+         else if (!strcmp (hinting, "slight"))
+           cairo_font_options_set_hint_style (font_options,
+                                              CAIRO_HINT_STYLE_SLIGHT);
+         else if (!strcmp (hinting, "none"))
+           cairo_font_options_set_hint_style (font_options,
+                                              CAIRO_HINT_STYLE_NONE);
+       }
+      g_variant_unref (val);
+    }
+}
+
+/* Apply changes in the antialiasing system setting.  */
+static void
+apply_gsettings_font_antialias (GSettings *settings)
+{
+  GVariant *val;
+  const char *antialias;
+
+  if (!xg_settings_key_valid_p (settings, GSETTINGS_FONT_ANTIALIASING))
+    return;
+
+  val = g_settings_get_value (settings, GSETTINGS_FONT_ANTIALIASING);
+
+  if (val)
+    {
+      g_variant_ref_sink (val);
+      if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
+       {
+         antialias = g_variant_get_string (val, NULL);
+
+         if (!strcmp (antialias, "none"))
+           cairo_font_options_set_antialias (font_options,
+                                             CAIRO_ANTIALIAS_NONE);
+         else if (!strcmp (antialias, "grayscale"))
+           cairo_font_options_set_antialias (font_options,
+                                             CAIRO_ANTIALIAS_GRAY);
+         else if (!strcmp (antialias, "rgba"))
+           cairo_font_options_set_antialias (font_options,
+                                             CAIRO_ANTIALIAS_SUBPIXEL);
+       }
+      g_variant_unref (val);
+    }
+}
+
+/* Apply the settings for the rgb element ordering.  */
+static void
+apply_gsettings_font_rgba_order (GSettings *settings)
+{
+  GVariant *val;
+  const char *rgba_order;
+
+  if (!xg_settings_key_valid_p (settings, GSETTINGS_FONT_RGBA_ORDER))
+    return;
+
+  val = g_settings_get_value (settings,
+                             GSETTINGS_FONT_RGBA_ORDER);
+
+  if (val)
+    {
+      g_variant_ref_sink (val);
+
+      if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
+       {
+         rgba_order = g_variant_get_string (val, NULL);
+
+         if (!strcmp (rgba_order, "rgb"))
+           cairo_font_options_set_subpixel_order (font_options,
+                                                  CAIRO_SUBPIXEL_ORDER_RGB);
+         else if (!strcmp (rgba_order, "bgr"))
+           cairo_font_options_set_subpixel_order (font_options,
+                                                  CAIRO_SUBPIXEL_ORDER_BGR);
+         else if (!strcmp (rgba_order, "vrgb"))
+           cairo_font_options_set_subpixel_order (font_options,
+                                                  CAIRO_SUBPIXEL_ORDER_VRGB);
+         else if (!strcmp (rgba_order, "vbgr"))
+           cairo_font_options_set_subpixel_order (font_options,
+                                                  CAIRO_SUBPIXEL_ORDER_VBGR);
+       }
+      g_variant_unref (val);
+    }
+}
+#endif /* HAVE_PGTK */
+
 /* Callback called when something changed in GSettings.  */
 
 static void
@@ -273,6 +429,23 @@ something_changed_gsettingsCB (GSettings *settings,
         }
     }
 #endif /* USE_CAIRO || HAVE_XFT */
+#ifdef HAVE_PGTK
+  else if (!strcmp (key, GSETTINGS_FONT_ANTIALIASING))
+    {
+      apply_gsettings_font_antialias (settings);
+      store_font_options_changed ();
+    }
+  else if (!strcmp (key, GSETTINGS_FONT_HINTING))
+    {
+      apply_gsettings_font_hinting (settings);
+      store_font_options_changed ();
+    }
+  else if (!strcmp (key, GSETTINGS_FONT_RGBA_ORDER))
+    {
+      apply_gsettings_font_rgba_order (settings);
+      store_font_options_changed ();
+    }
+#endif /* HAVE_PGTK */
 }
 
 #endif /* HAVE_GSETTINGS */
@@ -900,6 +1073,16 @@ init_gsettings (void)
         dupstring (&current_font, g_variant_get_string (val, NULL));
       g_variant_unref (val);
     }
+
+  /* Only use the gsettings font entries for the Cairo backend
+     running on PGTK.  */
+#ifdef HAVE_PGTK
+  font_options = cairo_font_options_create ();
+  apply_gsettings_font_antialias (gsettings_client);
+  apply_gsettings_font_hinting (gsettings_client);
+  apply_gsettings_font_rgba_order (gsettings_client);
+#endif /* HAVE_PGTK */
+
 #endif /* USE_CAIRO || HAVE_XFT */
 
 #endif /* HAVE_GSETTINGS */
@@ -1021,6 +1204,21 @@ xsettings_get_system_normal_font (void)
 }
 #endif
 
+#ifdef HAVE_PGTK
+/* Return the cairo font options, updated from the gsettings font
+   config entries.  The caller should call cairo_font_options_destroy
+   on the result.  */
+cairo_font_options_t *
+xsettings_get_font_options (void)
+{
+  if (font_options != NULL)
+    return cairo_font_options_copy (font_options);
+  else
+    /* GSettings is not configured.  */
+    return cairo_font_options_create ();
+}
+#endif
+
 DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font,
        Sfont_get_system_normal_font,
        0, 0, 0,
@@ -1073,6 +1271,10 @@ syms_of_xsettings (void)
   gconf_client = NULL;
   PDUMPER_IGNORE (gconf_client);
 #endif
+#ifdef HAVE_PGTK
+  font_options = NULL;
+  PDUMPER_IGNORE (font_options);
+#endif
 
   DEFSYM (Qmonospace_font_name, "monospace-font-name");
   DEFSYM (Qfont_name, "font-name");
diff --git a/src/xsettings.h b/src/xsettings.h
index ccaa36489d..5e5df37062 100644
--- a/src/xsettings.h
+++ b/src/xsettings.h
@@ -23,6 +23,8 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #ifndef HAVE_PGTK
 #include "dispextern.h"
 #include <X11/Xlib.h>
+#else
+#include <cairo.h>
 #endif
 
 struct x_display_info;
@@ -41,5 +43,8 @@ extern const char *xsettings_get_system_font (void);
 extern const char *xsettings_get_system_normal_font (void);
 #endif
 
+#ifdef HAVE_PGTK
+extern cairo_font_options_t *xsettings_get_font_options (void);
+#endif
 
 #endif /* XSETTINGS_H */
diff --git a/src/xterm.c b/src/xterm.c
index 2141964c74..2cc17b455d 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -78,7 +78,7 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
    INPUT FOCUS
 
    Under X, the window where keyboard input is sent is not always
-   explictly defined.  When there is a focus window, it receives what
+   explicitly defined.  When there is a focus window, it receives what
    is referred to as "explicit focus", but when there is none, it
    receives "implicit focus" whenever the pointer enters it, and loses
    that focus when the pointer leaves.  When the toplevel window of a
@@ -550,6 +550,7 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include <config.h>
 #include <stdlib.h>
 #include <math.h>
+#include <signal.h>
 
 #include "lisp.h"
 #include "blockinput.h"
@@ -699,6 +700,10 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #endif
 #endif
 
+#ifdef USE_GTK
+#include <xgselect.h>
+#endif
+
 #include "bitmaps/gray.xbm"
 
 #ifdef HAVE_XKB
@@ -784,6 +789,227 @@ static int current_finish;
 static struct input_event *current_hold_quit;
 #endif
 
+/* Queue selection requests in `pending_selection_requests' if more
+   than 0.  */
+static int x_use_pending_selection_requests;
+
+static void x_push_selection_request (struct selection_input_event *);
+
+/* Defer selection requests.  Between this and
+   x_release_selection_requests, any selection requests can be
+   processed by calling `x_handle_pending_selection_requests'.
+
+   Also run through and queue all the selection events already in the
+   keyboard buffer.  */
+void
+x_defer_selection_requests (void)
+{
+  union buffered_input_event *event;
+  bool between;
+
+  between = false;
+
+  block_input ();
+  if (!x_use_pending_selection_requests)
+    {
+      event = kbd_fetch_ptr;
+
+      while (event != kbd_store_ptr)
+       {
+         if (event->ie.kind == SELECTION_REQUEST_EVENT
+             || event->ie.kind == SELECTION_CLEAR_EVENT)
+           {
+             x_push_selection_request (&event->sie);
+
+             /* Mark this selection event as invalid.   */
+             SELECTION_EVENT_DPYINFO (&event->sie) = NULL;
+
+             /* Move the kbd_fetch_ptr along if doing so would not
+                result in any other events being skipped.  This
+                avoids exhausting the keyboard buffer with some
+                over-enthusiastic clipboard managers.  */
+             if (!between)
+               kbd_fetch_ptr = (event == kbd_buffer + KBD_BUFFER_SIZE - 1
+                                ? kbd_buffer : event + 1);
+           }
+         else
+           between = true;
+
+         event = (event == kbd_buffer + KBD_BUFFER_SIZE - 1
+                  ? kbd_buffer : event + 1);
+       }
+    }
+
+  x_use_pending_selection_requests++;
+  unblock_input ();
+}
+
+static void
+x_release_selection_requests (void)
+{
+  x_use_pending_selection_requests--;
+}
+
+void
+x_release_selection_requests_and_flush (void)
+{
+  x_release_selection_requests ();
+
+  if (!x_use_pending_selection_requests)
+    x_handle_pending_selection_requests ();
+}
+
+struct x_selection_request_event
+{
+  /* The selection request event.  */
+  struct selection_input_event se;
+
+  /* The next unprocessed selection request event.  */
+  struct x_selection_request_event *next;
+};
+
+/* Chain of unprocessed selection request events.  Used to handle
+   selection requests inside long-lasting modal event loops, such as
+   the drag-and-drop loop.  */
+
+struct x_selection_request_event *pending_selection_requests;
+
+/* Compare two request serials A and B with OP, handling
+   wraparound.  */
+#define X_COMPARE_SERIALS(a, op ,b) \
+  (((long) (a) - (long) (b)) op 0)
+
+struct x_atom_ref
+{
+  /* Atom name.  */
+  const char *name;
+
+  /* Offset of atom in the display info structure.  */
+  int offset;
+};
+
+/* List of all atoms that should be interned when connecting to a
+   display.  */
+static const struct x_atom_ref x_atom_refs[] =
+  {
+#define ATOM_REFS_INIT(string, member)                         \
+    { string, offsetof (struct x_display_info, member) },
+    ATOM_REFS_INIT ("WM_PROTOCOLS", Xatom_wm_protocols)
+    ATOM_REFS_INIT ("WM_TAKE_FOCUS", Xatom_wm_take_focus)
+    ATOM_REFS_INIT ("WM_SAVE_YOURSELF", Xatom_wm_save_yourself)
+    ATOM_REFS_INIT ("WM_DELETE_WINDOW", Xatom_wm_delete_window)
+    ATOM_REFS_INIT ("WM_CHANGE_STATE", Xatom_wm_change_state)
+    ATOM_REFS_INIT ("WM_STATE", Xatom_wm_state)
+    ATOM_REFS_INIT ("WM_CONFIGURE_DENIED", Xatom_wm_configure_denied)
+    ATOM_REFS_INIT ("WM_MOVED", Xatom_wm_window_moved)
+    ATOM_REFS_INIT ("WM_CLIENT_LEADER", Xatom_wm_client_leader)
+    ATOM_REFS_INIT ("WM_TRANSIENT_FOR", Xatom_wm_transient_for)
+    ATOM_REFS_INIT ("Editres", Xatom_editres)
+    ATOM_REFS_INIT ("CLIPBOARD", Xatom_CLIPBOARD)
+    ATOM_REFS_INIT ("TIMESTAMP", Xatom_TIMESTAMP)
+    ATOM_REFS_INIT ("TEXT", Xatom_TEXT)
+    ATOM_REFS_INIT ("COMPOUND_TEXT", Xatom_COMPOUND_TEXT)
+    ATOM_REFS_INIT ("UTF8_STRING", Xatom_UTF8_STRING)
+    ATOM_REFS_INIT ("DELETE", Xatom_DELETE)
+    ATOM_REFS_INIT ("MULTIPLE", Xatom_MULTIPLE)
+    ATOM_REFS_INIT ("INCR", Xatom_INCR)
+    ATOM_REFS_INIT ("_EMACS_TMP_",  Xatom_EMACS_TMP)
+    ATOM_REFS_INIT ("EMACS_SERVER_TIME_PROP", Xatom_EMACS_SERVER_TIME_PROP)
+    ATOM_REFS_INIT ("TARGETS", Xatom_TARGETS)
+    ATOM_REFS_INIT ("NULL", Xatom_NULL)
+    ATOM_REFS_INIT ("ATOM", Xatom_ATOM)
+    ATOM_REFS_INIT ("ATOM_PAIR", Xatom_ATOM_PAIR)
+    ATOM_REFS_INIT ("CLIPBOARD_MANAGER", Xatom_CLIPBOARD_MANAGER)
+    ATOM_REFS_INIT ("_XEMBED_INFO", Xatom_XEMBED_INFO)
+    ATOM_REFS_INIT ("_MOTIF_WM_HINTS", Xatom_MOTIF_WM_HINTS)
+    /* For properties of font.  */
+    ATOM_REFS_INIT ("PIXEL_SIZE", Xatom_PIXEL_SIZE)
+    ATOM_REFS_INIT ("AVERAGE_WIDTH", Xatom_AVERAGE_WIDTH)
+    ATOM_REFS_INIT ("_MULE_BASELINE_OFFSET", Xatom_MULE_BASELINE_OFFSET)
+    ATOM_REFS_INIT ("_MULE_RELATIVE_COMPOSE", Xatom_MULE_RELATIVE_COMPOSE)
+    ATOM_REFS_INIT ("_MULE_DEFAULT_ASCENT", Xatom_MULE_DEFAULT_ASCENT)
+    /* Ghostscript support.  */
+    ATOM_REFS_INIT ("DONE", Xatom_DONE)
+    ATOM_REFS_INIT ("PAGE", Xatom_PAGE)
+    ATOM_REFS_INIT ("SCROLLBAR", Xatom_Scrollbar)
+    ATOM_REFS_INIT ("HORIZONTAL_SCROLLBAR", Xatom_Horizontal_Scrollbar)
+    ATOM_REFS_INIT ("_XEMBED", Xatom_XEMBED)
+    /* EWMH */
+    ATOM_REFS_INIT ("_NET_WM_STATE", Xatom_net_wm_state)
+    ATOM_REFS_INIT ("_NET_WM_STATE_FULLSCREEN", Xatom_net_wm_state_fullscreen)
+    ATOM_REFS_INIT ("_NET_WM_STATE_MAXIMIZED_HORZ",
+                   Xatom_net_wm_state_maximized_horz)
+    ATOM_REFS_INIT ("_NET_WM_STATE_MAXIMIZED_VERT",
+                   Xatom_net_wm_state_maximized_vert)
+    ATOM_REFS_INIT ("_NET_WM_STATE_STICKY", Xatom_net_wm_state_sticky)
+    ATOM_REFS_INIT ("_NET_WM_STATE_SHADED", Xatom_net_wm_state_shaded)
+    ATOM_REFS_INIT ("_NET_WM_STATE_HIDDEN", Xatom_net_wm_state_hidden)
+    ATOM_REFS_INIT ("_NET_WM_WINDOW_TYPE", Xatom_net_window_type)
+    ATOM_REFS_INIT ("_NET_WM_WINDOW_TYPE_TOOLTIP",
+                   Xatom_net_window_type_tooltip)
+    ATOM_REFS_INIT ("_NET_WM_ICON_NAME", Xatom_net_wm_icon_name)
+    ATOM_REFS_INIT ("_NET_WM_NAME", Xatom_net_wm_name)
+    ATOM_REFS_INIT ("_NET_SUPPORTED",  Xatom_net_supported)
+    ATOM_REFS_INIT ("_NET_SUPPORTING_WM_CHECK", Xatom_net_supporting_wm_check)
+    ATOM_REFS_INIT ("_NET_WM_WINDOW_OPACITY", Xatom_net_wm_window_opacity)
+    ATOM_REFS_INIT ("_NET_ACTIVE_WINDOW", Xatom_net_active_window)
+    ATOM_REFS_INIT ("_NET_FRAME_EXTENTS", Xatom_net_frame_extents)
+    ATOM_REFS_INIT ("_NET_CURRENT_DESKTOP", Xatom_net_current_desktop)
+    ATOM_REFS_INIT ("_NET_WORKAREA", Xatom_net_workarea)
+    ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST", Xatom_net_wm_sync_request)
+    ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST_COUNTER", 
Xatom_net_wm_sync_request_counter)
+    ATOM_REFS_INIT ("_NET_WM_FRAME_DRAWN", Xatom_net_wm_frame_drawn)
+    ATOM_REFS_INIT ("_NET_WM_USER_TIME", Xatom_net_wm_user_time)
+    ATOM_REFS_INIT ("_NET_WM_USER_TIME_WINDOW", Xatom_net_wm_user_time_window)
+    ATOM_REFS_INIT ("_NET_CLIENT_LIST_STACKING", 
Xatom_net_client_list_stacking)
+    /* Session management */
+    ATOM_REFS_INIT ("SM_CLIENT_ID", Xatom_SM_CLIENT_ID)
+    ATOM_REFS_INIT ("_XSETTINGS_SETTINGS", Xatom_xsettings_prop)
+    ATOM_REFS_INIT ("MANAGER", Xatom_xsettings_mgr)
+    ATOM_REFS_INIT ("_NET_WM_STATE_SKIP_TASKBAR", 
Xatom_net_wm_state_skip_taskbar)
+    ATOM_REFS_INIT ("_NET_WM_STATE_ABOVE", Xatom_net_wm_state_above)
+    ATOM_REFS_INIT ("_NET_WM_STATE_BELOW", Xatom_net_wm_state_below)
+    ATOM_REFS_INIT ("_NET_WM_OPAQUE_REGION", Xatom_net_wm_opaque_region)
+    ATOM_REFS_INIT ("_NET_WM_PING", Xatom_net_wm_ping)
+    ATOM_REFS_INIT ("_NET_WM_PID", Xatom_net_wm_pid)
+#ifdef HAVE_XKB
+    ATOM_REFS_INIT ("Meta", Xatom_Meta)
+    ATOM_REFS_INIT ("Super", Xatom_Super)
+    ATOM_REFS_INIT ("Hyper", Xatom_Hyper)
+    ATOM_REFS_INIT ("ShiftLock", Xatom_ShiftLock)
+    ATOM_REFS_INIT ("Alt", Xatom_Alt)
+#endif
+    /* DND source.  */
+    ATOM_REFS_INIT ("XdndAware", Xatom_XdndAware)
+    ATOM_REFS_INIT ("XdndSelection", Xatom_XdndSelection)
+    ATOM_REFS_INIT ("XdndTypeList", Xatom_XdndTypeList)
+    ATOM_REFS_INIT ("XdndActionCopy", Xatom_XdndActionCopy)
+    ATOM_REFS_INIT ("XdndActionMove", Xatom_XdndActionMove)
+    ATOM_REFS_INIT ("XdndActionLink", Xatom_XdndActionLink)
+    ATOM_REFS_INIT ("XdndActionAsk", Xatom_XdndActionAsk)
+    ATOM_REFS_INIT ("XdndActionPrivate", Xatom_XdndActionPrivate)
+    ATOM_REFS_INIT ("XdndActionList", Xatom_XdndActionList)
+    ATOM_REFS_INIT ("XdndActionDescription", Xatom_XdndActionDescription)
+    ATOM_REFS_INIT ("XdndProxy", Xatom_XdndProxy)
+    ATOM_REFS_INIT ("XdndEnter", Xatom_XdndEnter)
+    ATOM_REFS_INIT ("XdndPosition", Xatom_XdndPosition)
+    ATOM_REFS_INIT ("XdndStatus", Xatom_XdndStatus)
+    ATOM_REFS_INIT ("XdndLeave", Xatom_XdndLeave)
+    ATOM_REFS_INIT ("XdndDrop", Xatom_XdndDrop)
+    ATOM_REFS_INIT ("XdndFinished", Xatom_XdndFinished)
+    /* Motif drop protocol support.  */
+    ATOM_REFS_INIT ("_MOTIF_DRAG_WINDOW", Xatom_MOTIF_DRAG_WINDOW)
+    ATOM_REFS_INIT ("_MOTIF_DRAG_TARGETS", Xatom_MOTIF_DRAG_TARGETS)
+    ATOM_REFS_INIT ("_MOTIF_DRAG_AND_DROP_MESSAGE",
+                   Xatom_MOTIF_DRAG_AND_DROP_MESSAGE)
+    ATOM_REFS_INIT ("_MOTIF_DRAG_INITIATOR_INFO",
+                   Xatom_MOTIF_DRAG_INITIATOR_INFO)
+    ATOM_REFS_INIT ("_MOTIF_DRAG_RECEIVER_INFO",
+                   Xatom_MOTIF_DRAG_RECEIVER_INFO)
+    ATOM_REFS_INIT ("XmTRANSFER_SUCCESS", Xatom_XmTRANSFER_SUCCESS)
+    ATOM_REFS_INIT ("XmTRANSFER_FAILURE", Xatom_XmTRANSFER_FAILURE)
+  };
+
 enum
 {
   X_EVENT_NORMAL,
@@ -863,19 +1089,39 @@ static void x_scroll_bar_end_update (struct 
x_display_info *, struct scroll_bar
 static int x_filter_event (struct x_display_info *, XEvent *);
 #endif
 
+static struct frame *x_tooltip_window_to_frame (struct x_display_info *,
+                                               Window, bool *);
+static Window x_get_window_below (Display *, Window, int, int, int *, int *);
+
 /* Global state maintained during a drag-and-drop operation.  */
 
 /* Flag that indicates if a drag-and-drop operation is in progress.  */
 bool x_dnd_in_progress;
 
+/* Number that indicates the last "generation" of
+   UNSUPPORTED_DROP_EVENTs handled.  */
+unsigned x_dnd_unsupported_event_level;
+
 /* The frame where the drag-and-drop operation originated.  */
 struct frame *x_dnd_frame;
 
+/* That frame, but set when x_dnd_waiting_for_finish is true.  Used to
+   prevent the frame from being deleted inside selection handlers and
+   other callbacks.  */
+struct frame *x_dnd_finish_frame;
+
 /* Flag that indicates if a drag-and-drop operation is no longer in
    progress, but the nested event loop should continue to run, because
    handle_one_xevent is waiting for the drop target to return some
    important information.  */
-static bool x_dnd_waiting_for_finish;
+bool x_dnd_waiting_for_finish;
+
+/* Whether or not to move the tooltip along with the mouse pointer
+   during drag-and-drop.  */
+static bool x_dnd_update_tooltip;
+
+/* Monitor attribute list used for updating the tooltip position.  */
+static Lisp_Object x_dnd_monitors;
 
 /* The display the drop target that is supposed to send information is
    on.  */
@@ -916,6 +1162,10 @@ static int x_dnd_waiting_for_finish_proto;
    where the drag-and-drop operation originated.  */
 static bool x_dnd_allow_current_frame;
 
+/* Whether or not the `XdndTypeList' property has already been set on
+   the drag frame.  */
+static bool x_dnd_init_type_lists;
+
 /* Whether or not to return a frame from `x_dnd_begin_drag_and_drop'.
 
    0 means to do nothing.  1 means to wait for the mouse to first exit
@@ -943,6 +1193,10 @@ static Window x_dnd_end_window;
    did not support XDND.  */
 static int x_dnd_last_protocol_version;
 
+/* Whether or not the last seen window is actually one of our
+   frames.  */
+static bool x_dnd_last_window_is_frame;
+
 /* The Motif drag and drop protocol style of `x_dnd_last_seen_window'.
    XM_DRAG_STYLE_NONE means the window does not support the Motif drag
    or drop protocol.  XM_DRAG_STYLE_DROP_ONLY means the window does
@@ -974,13 +1228,25 @@ static XRectangle x_dnd_mouse_rect;
    protocol, this is set to the atom XdndActionPrivate.  */
 static Atom x_dnd_action;
 
+/* The symbol to return from `x-begin-drag' if non-nil.  Takes
+   precedence over `x_dnd_action`.  */
+static Lisp_Object x_dnd_action_symbol;
+
 /* The action we want the drop target to perform.  The drop target may
    elect to perform some different action, which is guaranteed to be
    in `x_dnd_action' upon completion of a drop.  */
 static Atom x_dnd_wanted_action;
 
+/* The set of optional actions available to a Motif drop target
+   computed at the start of the drag-and-drop operation.  */
+static uint8_t x_dnd_motif_operations;
+
+/* The preferred optional action out of that set.  Only takes effect
+   if `x_dnd_action' is XdndAsk.  */
+static uint8_t x_dnd_first_motif_operation;
+
 /* Array of selection targets available to the drop target.  */
-static Atom *x_dnd_targets = NULL;
+static Atom *x_dnd_targets;
 
 /* The number of elements in that array.  */
 static int x_dnd_n_targets;
@@ -1009,42 +1275,86 @@ static unsigned int x_dnd_keyboard_state;
 
 /* jmp_buf that gets us out of the IO error handler if an error occurs
    terminating DND as part of the display disconnect handler.  */
-static jmp_buf x_dnd_disconnect_handler;
+static sigjmp_buf x_dnd_disconnect_handler;
+
+/* Whether or not the current invocation of handle_one_xevent
+   happened inside the drag_and_drop event loop.  */
+static bool x_dnd_inside_handle_one_xevent;
 
+/* The recursive edit depth when the drag-and-drop operation was
+   started.  */
+static int x_dnd_recursion_depth;
+
+/* Structure describing a single window that can be the target of
+   drag-and-drop operations.  */
 struct x_client_list_window
 {
+  /* The window itself.  */
   Window window;
+
+  /* The display that window is on.  */
   Display *dpy;
+
+  /* Its X and Y coordinates from the root window.  */
   int x, y;
+
+  /* The width and height of the window.  */
   int width, height;
+
+  /* Whether or not the window is mapped.  */
   bool mapped_p;
+
+  /* A bitmask describing events Emacs was listening for from the
+     window before some extra events were added in
+     `x_dnd_compute_toplevels'.  */
   long previous_event_mask;
+
+  /* The window manager state of the window.  */
   unsigned long wm_state;
 
+  /* The next window in this list.  */
   struct x_client_list_window *next;
+
+  /* The Motif protocol style of this window, if any.  */
   uint8_t xm_protocol_style;
 
+  /* The extents of the frame window in each direction.  */
   int frame_extents_left;
   int frame_extents_right;
   int frame_extents_top;
   int frame_extents_bottom;
 
 #ifdef HAVE_XSHAPE
+  /* The border width of this window.  */
   int border_width;
 
+  /* The rectangles making up the input shape.  */
   XRectangle *input_rects;
+
+  /* The number of rectangles composing the input shape.  */
   int n_input_rects;
 
+  /* The rectangles making up the bounding shape.  */
   XRectangle *bounding_rects;
+
+  /* The number of rectangles composing the bounding shape.  */
   int n_bounding_rects;
 #endif
 };
 
-static struct x_client_list_window *x_dnd_toplevels = NULL;
+/* List of all toplevels in stacking order, from top to bottom.  */
+static struct x_client_list_window *x_dnd_toplevels;
+
+/* Whether or not the window manager supports the required features
+   for `x_dnd_toplevels' to work.  */
 static bool x_dnd_use_toplevels;
 
 /* Motif drag-and-drop protocol support.  */
 
+/* Pointer to a variable which stores whether or not an X error
+   occured while trying to create the Motif drag window.  */
+static volatile bool *xm_drag_window_error;
+
 typedef enum xm_byte_order
   {
     XM_BYTE_ORDER_LSB_FIRST = 'l',
@@ -1078,8 +1388,8 @@ typedef enum xm_byte_order
   }
 
 #else
-#define SWAPCARD32(l)  bswap_32 (l)
-#define SWAPCARD16(l)  bswap_16 (l)
+#define SWAPCARD32(l)  ((l) = bswap_32 (l))
+#define SWAPCARD16(l)  ((l) = bswap_16 (l))
 #endif
 
 typedef struct xm_targets_table_header
@@ -1181,34 +1491,50 @@ typedef struct xm_top_level_leave_message
 /* #define XM_DRAG_SIDE_EFFECT_OPERATIONS(effect)      (((effect) & 0xf00) >> 
8) */
 #define XM_DRAG_SIDE_EFFECT_DROP_ACTION(effect)        (((effect) & 0xf000) >> 
12)
 
-#define XM_DRAG_NOOP 0
-#define XM_DRAG_MOVE (1L << 0)
-#define XM_DRAG_COPY (1L << 1)
-#define XM_DRAG_LINK (1L << 2)
+enum xm_drag_operation
+  {
+    XM_DRAG_NOOP = 0,
+    XM_DRAG_MOVE = (1L << 0),
+    XM_DRAG_COPY = (1L << 1),
+    XM_DRAG_LINK = (1L << 2),
+  };
 
-#define XM_DROP_ACTION_DROP            0
-#define XM_DROP_ACTION_DROP_HELP       1
-#define XM_DROP_ACTION_DROP_CANCEL     2
+enum xm_drag_action
+  {
+    XM_DROP_ACTION_DROP               = 0,
+    XM_DROP_ACTION_DROP_HELP   = 1,
+    XM_DROP_ACTION_DROP_CANCEL = 2,
+  };
 
 #define XM_DRAG_REASON(originator, code)       ((code) | ((originator) << 7))
 #define XM_DRAG_REASON_ORIGINATOR(reason)      (((reason) & 0x80) ? 1 : 0)
 #define XM_DRAG_REASON_CODE(reason)            ((reason) & 0x7f)
 
-#define XM_DRAG_REASON_DROP_START      5
-#define XM_DRAG_REASON_TOP_LEVEL_ENTER 0
-#define XM_DRAG_REASON_TOP_LEVEL_LEAVE 1
-#define XM_DRAG_REASON_DRAG_MOTION     2
-#define XM_DRAG_ORIGINATOR_INITIATOR   0
-#define XM_DRAG_ORIGINATOR_RECEIVER    1
-
-#define XM_DRAG_STYLE_NONE             0
+enum xm_drag_reason
+  {
+    XM_DRAG_REASON_DROP_START     = 5,
+    XM_DRAG_REASON_TOP_LEVEL_ENTER = 0,
+    XM_DRAG_REASON_TOP_LEVEL_LEAVE = 1,
+    XM_DRAG_REASON_DRAG_MOTION    = 2,
+  };
 
-#define XM_DRAG_STYLE_DROP_ONLY                1
-#define XM_DRAG_STYLE_DROP_ONLY_REC    3
+enum xm_drag_originator
+  {
+    XM_DRAG_ORIGINATOR_INITIATOR = 0,
+    XM_DRAG_ORIGINATOR_RECEIVER         = 1,
+  };
 
-#define XM_DRAG_STYLE_DYNAMIC          5
-#define XM_DRAG_STYLE_DYNAMIC_REC      2
-#define XM_DRAG_STYLE_DYNAMIC_REC1     4
+enum xm_drag_style
+  {
+    /* The values ending with _REC should be treated as equivalent to
+       the ones without in messages from the receiver.  */
+    XM_DRAG_STYLE_NONE         = 0,
+    XM_DRAG_STYLE_DROP_ONLY    = 1,
+    XM_DRAG_STYLE_DROP_ONLY_REC = 3,
+    XM_DRAG_STYLE_DYNAMIC      = 5,
+    XM_DRAG_STYLE_DYNAMIC_REC  = 2,
+    XM_DRAG_STYLE_DYNAMIC_REC1 = 4,
+  };
 
 #define XM_DRAG_STYLE_IS_DROP_ONLY(n)  ((n) == XM_DRAG_STYLE_DROP_ONLY \
                                         || (n) == XM_DRAG_STYLE_DROP_ONLY_REC)
@@ -1216,9 +1542,16 @@ typedef struct xm_top_level_leave_message
                                         || (n) == XM_DRAG_STYLE_DYNAMIC_REC \
                                         || (n) == XM_DRAG_STYLE_DYNAMIC_REC1)
 
-#define XM_DROP_SITE_VALID     3
-/* #define XM_DROP_SITE_INVALID        2 */
-#define XM_DROP_SITE_NONE      1
+enum xm_drop_site_status
+  {
+    XM_DROP_SITE_VALID  = 3,
+    XM_DROP_SITE_INVALID = 2,
+    XM_DROP_SITE_NONE   = 1,
+  };
+
+/* The version of the Motif drag-and-drop protocols that Emacs
+   supports.  */
+#define XM_DRAG_PROTOCOL_VERSION       0
 
 static uint8_t
 xm_side_effect_from_action (struct x_display_info *dpyinfo, Atom action)
@@ -1229,10 +1562,34 @@ xm_side_effect_from_action (struct x_display_info 
*dpyinfo, Atom action)
     return XM_DRAG_MOVE;
   else if (action == dpyinfo->Xatom_XdndActionLink)
     return XM_DRAG_LINK;
+  else if (action == dpyinfo->Xatom_XdndActionAsk)
+    return x_dnd_first_motif_operation;
 
   return XM_DRAG_NOOP;
 }
 
+static uint8_t
+xm_operations_from_actions (struct x_display_info *dpyinfo,
+                           Atom *ask_actions, int n_ask_actions)
+{
+  int i;
+  uint8_t flags;
+
+  flags = 0;
+
+  for (i = 0; i < n_ask_actions; ++i)
+    {
+      if (ask_actions[i] == dpyinfo->Xatom_XdndActionCopy)
+       flags |= XM_DRAG_COPY;
+      else if (ask_actions[i] == dpyinfo->Xatom_XdndActionMove)
+       flags |= XM_DRAG_MOVE;
+      else if (ask_actions[i] == dpyinfo->Xatom_XdndActionLink)
+       flags |= XM_DRAG_LINK;
+    }
+
+  return flags;
+}
+
 static int
 xm_read_targets_table_header (uint8_t *bytes, ptrdiff_t length,
                              xm_targets_table_header *header_return,
@@ -1396,6 +1753,9 @@ xm_write_drag_initiator_info (Display *dpy, Window wdesc,
 static int
 xm_drag_window_error_handler (Display *display, XErrorEvent *event)
 {
+  if (xm_drag_window_error)
+    *xm_drag_window_error = true;
+
   return 0;
 }
 
@@ -1404,7 +1764,7 @@ xm_drag_window_io_error_handler (Display *dpy)
 {
   /* DPY isn't created through GDK, so it doesn't matter if we don't
      crash here.  */
-  longjmp (x_dnd_disconnect_handler, 1);
+  siglongjmp (x_dnd_disconnect_handler, 1);
 }
 
 static Window
@@ -1418,6 +1778,9 @@ xm_get_drag_window (struct x_display_info *dpyinfo)
   XSetWindowAttributes attrs;
   Display *temp_display;
   void *old_handler, *old_io_handler;
+  /* These are volatile because GCC mistakenly warns about them being
+     clobbered by longjmp.  */
+  volatile bool error, created;
 
   drag_window = None;
   rc = XGetWindowProperty (dpyinfo->display, dpyinfo->root_window,
@@ -1473,6 +1836,9 @@ xm_get_drag_window (struct x_display_info *dpyinfo)
          return None;
        }
 
+      error = false;
+      xm_drag_window_error = &error;
+
       XGrabServer (temp_display);
       XSetCloseDownMode (temp_display, RetainPermanent);
 
@@ -1483,6 +1849,9 @@ xm_get_drag_window (struct x_display_info *dpyinfo)
       _MOTIF_DRAG_WINDOW = XInternAtom (temp_display,
                                        "_MOTIF_DRAG_WINDOW", False);
 
+      if (error)
+       goto give_up;
+
       /* Some other program might've created a drag window between now
         and when we first looked.  Use that if it exists.  */
 
@@ -1500,8 +1869,12 @@ xm_get_drag_window (struct x_display_info *dpyinfo)
       if (tmp_data)
        XFree (tmp_data);
 
+      error = false;
+
       if (drag_window == None)
        {
+         created = true;
+
          attrs.override_redirect = True;
          drag_window = XCreateWindow (temp_display, DefaultRootWindow 
(temp_display),
                                       -1, -1, 1, 1, 0, CopyFromParent, 
InputOnly,
@@ -1510,8 +1883,41 @@ xm_get_drag_window (struct x_display_info *dpyinfo)
                           _MOTIF_DRAG_WINDOW, XA_WINDOW, 32, PropModeReplace,
                           (unsigned char *) &drag_window, 1);
        }
+      else
+       created = false;
+
+      /* Handle all errors now.   */
+      XSync (temp_display, False);
+
+    give_up:
+
+      /* Some part of the drag window creation process failed, so
+        punt.  */
+      if (error)
+       {
+         /* If the drag window was actually created, delete it now.
+            Probably, a BadAlloc happened during the XChangeProperty
+            request.  */
+         if (created)
+           {
+             if (drag_window != None)
+               XDestroyWindow (temp_display, drag_window);
+
+             XDeleteProperty (temp_display, DefaultRootWindow (temp_display),
+                              _MOTIF_DRAG_WINDOW);
+           }
+
+         drag_window = None;
+       }
 
+      xm_drag_window_error = NULL;
+
+      /* FIXME: why does XCloseDisplay hang if SIGIO arrives and there
+        are multiple displays? */
+      unrequest_sigio ();
       XCloseDisplay (temp_display);
+      request_sigio ();
+
       XSetErrorHandler (old_handler);
       XSetIOErrorHandler (old_io_handler);
 
@@ -1633,7 +2039,7 @@ xm_setup_dnd_targets (struct x_display_info *dpyinfo,
   if (!rc)
     {
       header.byte_order = XM_BYTE_ORDER_CUR_FIRST;
-      header.protocol = 0;
+      header.protocol = XM_DRAG_PROTOCOL_VERSION;
       header.target_list_count = 1;
       header.total_data_size = 8 + 2 + ntargets * 4;
 
@@ -1678,7 +2084,7 @@ xm_setup_dnd_targets (struct x_display_info *dpyinfo,
              xfree (recs);
 
              header.byte_order = XM_BYTE_ORDER_CUR_FIRST;
-             header.protocol = 0;
+             header.protocol = XM_DRAG_PROTOCOL_VERSION;
              header.target_list_count = 1;
              header.total_data_size = 8 + 2 + ntargets * 4;
 
@@ -1715,10 +2121,17 @@ xm_setup_dnd_targets (struct x_display_info *dpyinfo,
         data format.  To avoid confusing Motif when that happens, set
         it back to 0.  There will probably be no more updates to the
         protocol either.  */
-      header.protocol = 0;
+      header.protocol = XM_DRAG_PROTOCOL_VERSION;
+
+      x_catch_errors (dpyinfo->display);
       xm_write_targets_table (dpyinfo->display, drag_window,
                              dpyinfo->Xatom_MOTIF_DRAG_TARGETS,
                              &header, recs);
+      /* Presumably we got a BadAlloc upon writing the targets
+        table.  */
+      if (x_had_errors_p (dpyinfo->display))
+       idx = -1;
+      x_uncatch_errors_after_check ();
     }
 
   XUngrabServer (dpyinfo->display);
@@ -1745,7 +2158,7 @@ xm_setup_drag_info (struct x_display_info *dpyinfo,
   if (idx != -1)
     {
       drag_initiator_info.byteorder = XM_BYTE_ORDER_CUR_FIRST;
-      drag_initiator_info.protocol = 0;
+      drag_initiator_info.protocol = XM_DRAG_PROTOCOL_VERSION;
       drag_initiator_info.table_index = idx;
       drag_initiator_info.selection = dpyinfo->Xatom_XdndSelection;
 
@@ -1862,7 +2275,7 @@ xm_send_top_level_leave_message (struct x_display_info 
*dpyinfo, Window source,
       mmsg.byteorder = XM_BYTE_ORDER_CUR_FIRST;
       mmsg.side_effects = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action 
(dpyinfo,
                                                                           
x_dnd_wanted_action),
-                                              XM_DROP_SITE_NONE, XM_DRAG_NOOP,
+                                              XM_DROP_SITE_NONE, 
x_dnd_motif_operations,
                                               XM_DROP_ACTION_DROP_CANCEL);
       mmsg.timestamp = dmsg->timestamp;
       mmsg.x = 65535;
@@ -1926,6 +2339,44 @@ xm_read_drop_start_reply (const XEvent *msg, 
xm_drop_start_reply *reply)
   return 0;
 }
 
+static int
+xm_read_drop_start_message (const XEvent *msg,
+                           xm_drop_start_message *dmsg)
+{
+  const uint8_t *data;
+
+  data = (const uint8_t *) &msg->xclient.data.b[0];
+
+  if ((XM_DRAG_REASON_ORIGINATOR (data[0])
+       != XM_DRAG_ORIGINATOR_INITIATOR)
+      || (XM_DRAG_REASON_CODE (data[0])
+         != XM_DRAG_REASON_DROP_START))
+    return 1;
+
+  dmsg->reason = *(data++);
+  dmsg->byte_order = *(data++);
+  dmsg->side_effects = *(uint16_t *) data;
+  dmsg->timestamp = *(uint32_t *) (data + 2);
+  dmsg->x = *(uint16_t *) (data + 6);
+  dmsg->y = *(uint16_t *) (data + 8);
+  dmsg->index_atom = *(uint32_t *) (data + 10);
+  dmsg->source_window = *(uint32_t *) (data + 14);
+
+  if (dmsg->byte_order != XM_BYTE_ORDER_CUR_FIRST)
+    {
+      SWAPCARD16 (dmsg->side_effects);
+      SWAPCARD32 (dmsg->timestamp);
+      SWAPCARD16 (dmsg->x);
+      SWAPCARD16 (dmsg->y);
+      SWAPCARD32 (dmsg->index_atom);
+      SWAPCARD32 (dmsg->source_window);
+    }
+
+  dmsg->byte_order = XM_BYTE_ORDER_CUR_FIRST;
+
+  return 0;
+}
+
 static int
 xm_read_drag_receiver_info (struct x_display_info *dpyinfo,
                            Window wdesc, xm_drag_receiver_info *rec)
@@ -1955,6 +2406,9 @@ xm_read_drag_receiver_info (struct x_display_info 
*dpyinfo,
     {
       data = (uint8_t *) tmp_data;
 
+      if (data[1] > XM_DRAG_PROTOCOL_VERSION)
+       return 1;
+
       rec->byteorder = data[0];
       rec->protocol = data[1];
       rec->protocol_style = data[2];
@@ -1979,6 +2433,40 @@ xm_read_drag_receiver_info (struct x_display_info 
*dpyinfo,
   return !rc;
 }
 
+static int
+xm_read_drag_motion_message (const XEvent *msg,
+                            xm_drag_motion_message *dmsg)
+{
+  const uint8_t *data;
+
+  data = (const uint8_t *) &msg->xclient.data.b[0];
+
+  if ((XM_DRAG_REASON_CODE (data[0])
+       != XM_DRAG_REASON_DRAG_MOTION)
+      || (XM_DRAG_REASON_ORIGINATOR (data[0])
+         != XM_DRAG_ORIGINATOR_INITIATOR))
+    return 1;
+
+  dmsg->reason = *(data++);
+  dmsg->byteorder = *(data++);
+  dmsg->side_effects = *(uint16_t *) data;
+  dmsg->timestamp = *(uint32_t *) (data + 2);
+  dmsg->x = *(uint16_t *) (data + 6);
+  dmsg->y = *(uint16_t *) (data + 8);
+
+  if (dmsg->byteorder != XM_BYTE_ORDER_CUR_FIRST)
+    {
+      SWAPCARD16 (dmsg->side_effects);
+      SWAPCARD32 (dmsg->timestamp);
+      SWAPCARD16 (dmsg->x);
+      SWAPCARD16 (dmsg->y);
+    }
+
+  dmsg->byteorder = XM_BYTE_ORDER_CUR_FIRST;
+
+  return 0;
+}
+
 static void
 x_dnd_send_xm_leave_for_drop (struct x_display_info *dpyinfo,
                              struct frame *f, Window wdesc,
@@ -1999,23 +2487,57 @@ x_dnd_send_xm_leave_for_drop (struct x_display_info 
*dpyinfo,
 }
 
 static void
-x_dnd_free_toplevels (void)
+x_dnd_free_toplevels (bool display_alive)
 {
   struct x_client_list_window *last;
   struct x_client_list_window *tem = x_dnd_toplevels;
+  ptrdiff_t n_windows, i, buffer_size;
+  Window *destroy_windows;
+  unsigned long *prev_masks;
+  specpdl_ref count;
+  Display *dpy;
 
+  if (!x_dnd_toplevels)
+    /* Probably called inside an IO error handler.  */
+    return;
+
+  /* Pacify GCC.  */
+  prev_masks = NULL;
+  destroy_windows = NULL;
+
+  if (display_alive)
+    {
+      buffer_size = 1024;
+      destroy_windows = xmalloc (sizeof *destroy_windows
+                                * buffer_size);
+      prev_masks = xmalloc (sizeof *prev_masks *
+                           buffer_size);
+      n_windows = 0;
+    }
+
+  block_input ();
   while (tem)
     {
       last = tem;
       tem = tem->next;
 
-      x_catch_errors (last->dpy);
-      XSelectInput (last->dpy, last->window,
-                   last->previous_event_mask);
-#ifdef HAVE_XSHAPE
-      XShapeSelectInput (last->dpy, last->window, None);
-#endif
-      x_uncatch_errors ();
+      if (display_alive)
+       {
+         if (++n_windows >= buffer_size)
+           {
+             buffer_size += 1024;
+             destroy_windows
+               = xrealloc (destroy_windows, (sizeof *destroy_windows
+                                             * buffer_size));
+             prev_masks
+               = xrealloc (prev_masks, (sizeof *prev_masks
+                                        * buffer_size));
+           }
+
+         dpy = last->dpy;
+         prev_masks[n_windows - 1] = last->previous_event_mask;
+         destroy_windows[n_windows - 1] = last->window;
+       }
 
 #ifdef HAVE_XSHAPE
       if (last->n_input_rects != -1)
@@ -2028,6 +2550,34 @@ x_dnd_free_toplevels (void)
     }
 
   x_dnd_toplevels = NULL;
+
+  if (!display_alive)
+    {
+      unblock_input ();
+      return;
+    }
+
+  count = SPECPDL_INDEX ();
+  record_unwind_protect_ptr (xfree, destroy_windows);
+  record_unwind_protect_ptr (xfree, prev_masks);
+
+  if (display_alive)
+    {
+      x_catch_errors (dpy);
+
+      for (i = 0; i < n_windows; ++i)
+       {
+         XSelectInput (dpy, destroy_windows[i], prev_masks[i]);
+#ifdef HAVE_XSHAPE
+         XShapeSelectInput (dpy, destroy_windows[i], None);
+#endif
+       }
+
+      x_uncatch_errors ();
+    }
+
+  unbind_to (count, Qnil);
+  unblock_input ();
 }
 
 static int
@@ -2102,27 +2652,29 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo)
   toplevels = (Window *) data;
 
 #ifdef USE_XCB
+  USE_SAFE_ALLOCA;
+
   window_attribute_cookies
-    = alloca (sizeof *window_attribute_cookies * nitems);
+    = SAFE_ALLOCA (sizeof *window_attribute_cookies * nitems);
   translate_coordinate_cookies
-    = alloca (sizeof *translate_coordinate_cookies * nitems);
+    = SAFE_ALLOCA (sizeof *translate_coordinate_cookies * nitems);
   get_property_cookies
-    = alloca (sizeof *get_property_cookies * nitems);
+    = SAFE_ALLOCA (sizeof *get_property_cookies * nitems);
   xm_property_cookies
-    = alloca (sizeof *xm_property_cookies * nitems);
+    = SAFE_ALLOCA (sizeof *xm_property_cookies * nitems);
   extent_property_cookies
-    = alloca (sizeof *extent_property_cookies * nitems);
+    = SAFE_ALLOCA (sizeof *extent_property_cookies * nitems);
   get_geometry_cookies
-    = alloca (sizeof *get_geometry_cookies * nitems);
+    = SAFE_ALLOCA (sizeof *get_geometry_cookies * nitems);
 
 #ifdef HAVE_XCB_SHAPE
   bounding_rect_cookies
-    = alloca (sizeof *bounding_rect_cookies * nitems);
+    = SAFE_ALLOCA (sizeof *bounding_rect_cookies * nitems);
 #endif
 
 #ifdef HAVE_XCB_SHAPE_INPUT_RECTS
   input_rect_cookies
-    = alloca (sizeof *input_rect_cookies * nitems);
+    = SAFE_ALLOCA (sizeof *input_rect_cookies * nitems);
 #endif
 
   for (i = 0; i < nitems; ++i)
@@ -2353,7 +2905,9 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo)
              && xcb_get_property_value_length (xm_property_reply) >= 4)
            {
              xmdata = xcb_get_property_value (xm_property_reply);
-             tem->xm_protocol_style = xmdata[2];
+
+             if (xmdata[1] <= XM_DRAG_PROTOCOL_VERSION)
+               tem->xm_protocol_style = xmdata[2];
            }
 #endif
 
@@ -2509,7 +3063,7 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo)
            }
 
          /* And the common case where there is no input rect and the
-            bouding rect equals the window dimensions.  */
+            bounding rect equals the window dimensions.  */
 
          if (tem->n_input_rects == -1
              && tem->n_bounding_rects == 1
@@ -2602,6 +3156,13 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo)
 #endif
     }
 
+#ifdef USE_XCB
+  SAFE_FREE ();
+#endif
+
+  if (data)
+    XFree (data);
+
   return 0;
 }
 
@@ -2611,7 +3172,7 @@ x_dnd_io_error_handler (Display *display)
 #ifdef USE_GTK
   emacs_abort ();
 #else
-  longjmp (x_dnd_disconnect_handler, 1);
+  siglongjmp (x_dnd_disconnect_handler, 1);
 #endif
 }
 
@@ -2978,7 +3539,6 @@ x_dnd_do_unsupported_drop (struct x_display_info *dpyinfo,
   int dest_x, dest_y;
   Window child_return, child;
 
-  event.xbutton.type = ButtonPress;
   event.xbutton.serial = 0;
   event.xbutton.send_event = True;
   event.xbutton.display = dpyinfo->display;
@@ -2992,39 +3552,37 @@ x_dnd_do_unsupported_drop (struct x_display_info 
*dpyinfo,
   dest_x = root_x;
   dest_y = root_y;
 
-  while (XTranslateCoordinates (dpyinfo->display, child,
-                               child, root_x, root_y, &dest_x,
-                               &dest_y, &child_return)
-        && child_return != None
-        && XTranslateCoordinates (dpyinfo->display, child,
-                                  child_return, root_x, root_y,
-                                  &dest_x, &dest_y, &child))
-    {
-      child = child_return;
-      root_x = dest_x;
-      root_y = dest_y;
-    }
+  while (XTranslateCoordinates (dpyinfo->display, dpyinfo->root_window,
+                               child, root_x, root_y, &dest_x, &dest_y,
+                               &child_return)
+        && child_return != None)
+    child = child_return;
 
   if (CONSP (value))
     x_own_selection (QPRIMARY, Fnth (make_fixnum (1), value),
                     frame);
   else
-    x_own_selection (QPRIMARY, Qnil, frame);
+    error ("Lost ownership of XdndSelection");
 
   event.xbutton.window = child;
+  event.xbutton.subwindow = None;
   event.xbutton.x = dest_x;
   event.xbutton.y = dest_y;
   event.xbutton.state = 0;
   event.xbutton.button = 2;
   event.xbutton.same_screen = True;
-  event.xbutton.time = before + 1;
-  event.xbutton.time = before + 2;
 
   x_set_pending_dnd_time (before);
 
+  event.xbutton.type = ButtonPress;
+  event.xbutton.time = before + 1;
+
   XSendEvent (dpyinfo->display, child,
              True, ButtonPressMask, &event);
+
   event.xbutton.type = ButtonRelease;
+  event.xbutton.time = before + 2;
+
   XSendEvent (dpyinfo->display, child,
              True, ButtonReleaseMask, &event);
 
@@ -3057,19 +3615,20 @@ x_dnd_send_unsupported_drop (struct x_display_info 
*dpyinfo, Window target_windo
       XFree (atom_names[i - 1]);
     }
 
-  name = XGetAtomName (dpyinfo->display,
-                      x_dnd_wanted_action);
+  name = x_get_atom_name (dpyinfo, x_dnd_wanted_action,
+                         NULL);
 
   if (name)
     {
       arg = intern (name);
-      XFree (name);
+      xfree (name);
     }
   else
     arg = Qnil;
 
   ie.kind = UNSUPPORTED_DROP_EVENT;
   ie.code = (unsigned) target_window;
+  ie.modifiers = x_dnd_unsupported_event_level;
   ie.arg = list3 (assq_no_quit (QXdndSelection,
                                dpyinfo->terminal->Vselection_alist),
                  targets, arg);
@@ -3085,16 +3644,20 @@ x_dnd_send_unsupported_drop (struct x_display_info 
*dpyinfo, Window target_windo
 static Window
 x_dnd_get_target_window (struct x_display_info *dpyinfo,
                         int root_x, int root_y, int *proto_out,
-                        int *motif_out, Window *toplevel_out)
+                        int *motif_out, Window *toplevel_out,
+                        bool *was_frame)
 {
-  Window child_return, child, dummy, proxy;
+  Window child_return, child, proxy;
   int dest_x_return, dest_y_return, rc, proto, motif;
+  int parent_x, parent_y;
   bool extents_p;
 #if defined HAVE_XCOMPOSITE && (XCOMPOSITE_MAJOR > 0 || XCOMPOSITE_MINOR > 2)
   Window overlay_window;
   XWindowAttributes attrs;
 #endif
   int wmstate;
+  struct frame *tooltip, *f;
+  bool unrelated;
 
   child_return = dpyinfo->root_window;
   dest_x_return = root_x;
@@ -3103,6 +3666,7 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
   proto = -1;
   *motif_out = XM_DRAG_STYLE_NONE;
   *toplevel_out = None;
+  *was_frame = false;
 
   if (x_dnd_use_toplevels)
     {
@@ -3115,10 +3679,21 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
          && FRAME_X_WINDOW (x_dnd_frame) == child)
        *motif_out = XM_DRAG_STYLE_NONE;
 
+      f = x_top_window_to_frame (dpyinfo, child);
+
       *toplevel_out = child;
 
       if (child != None)
        {
+         if (f)
+           {
+             *was_frame = true;
+             *proto_out = -1;
+             *motif_out = XM_DRAG_STYLE_NONE;
+
+             return child;
+           }
+
 #ifndef USE_XCB
          proxy = x_dnd_get_window_proxy (dpyinfo, child);
 #else
@@ -3161,10 +3736,13 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
                                  dpyinfo->Xatom_NET_WM_CM_Sn) != None)
            {
              x_catch_errors (dpyinfo->display);
+             XGrabServer (dpyinfo->display);
              overlay_window = XCompositeGetOverlayWindow (dpyinfo->display,
                                                           
dpyinfo->root_window);
              XCompositeReleaseOverlayWindow (dpyinfo->display,
                                              dpyinfo->root_window);
+             XUngrabServer (dpyinfo->display);
+
              if (!x_had_errors_p (dpyinfo->display))
                {
                  XGetWindowAttributes (dpyinfo->display, overlay_window, 
&attrs);
@@ -3222,13 +3800,13 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
   while (child_return != None)
     {
       child = child_return;
+      parent_x = dest_x_return;
+      parent_y = dest_y_return;
 
       x_catch_errors (dpyinfo->display);
-      rc = XTranslateCoordinates (dpyinfo->display,
-                                 child_return, child_return,
-                                 dest_x_return, dest_y_return,
-                                 &dest_x_return, &dest_y_return,
-                                 &child_return);
+      rc = XTranslateCoordinates (dpyinfo->display, dpyinfo->root_window,
+                                 child_return, root_x, root_y, &dest_x_return,
+                                 &dest_y_return, &child_return);
 
       if (x_had_errors_p (dpyinfo->display) || !rc)
        {
@@ -3238,6 +3816,35 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
 
       if (child_return)
        {
+         /* If child_return is a tooltip frame, look beneath it.  We
+            never want to drop anything onto a tooltip frame.  */
+
+         tooltip = x_tooltip_window_to_frame (dpyinfo, child_return,
+                                              &unrelated);
+
+         if (tooltip || unrelated)
+           child_return = x_get_window_below (dpyinfo->display, child_return,
+                                              parent_x, parent_y, 
&dest_x_return,
+                                              &dest_y_return);
+
+         if (!child_return)
+           {
+             x_uncatch_errors ();
+             break;
+           }
+
+         f = x_top_window_to_frame (dpyinfo, child_return);
+
+         if (f)
+           {
+             *proto_out = -1;
+             *motif_out = XM_DRAG_STYLE_NONE;
+             *toplevel_out = child_return;
+             *was_frame = true;
+
+             return child_return;
+           }
+
          if (x_dnd_get_wm_state_and_proto (dpyinfo, child_return,
                                            &wmstate, &proto, &motif,
                                            &proxy)
@@ -3266,23 +3873,9 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
                  return proxy;
                }
            }
-
-         rc = XTranslateCoordinates (dpyinfo->display,
-                                     child, child_return,
-                                     dest_x_return, dest_y_return,
-                                     &dest_x_return, &dest_y_return,
-                                     &dummy);
-
-         if (x_had_errors_p (dpyinfo->display) || !rc)
-           {
-             x_uncatch_errors_after_check ();
-             *proto_out = -1;
-             *toplevel_out = dpyinfo->root_window;
-             return None;
-           }
        }
 
-      x_uncatch_errors_after_check ();
+      x_uncatch_errors ();
     }
 
 #if defined HAVE_XCOMPOSITE && (XCOMPOSITE_MAJOR > 0 || XCOMPOSITE_MINOR > 2)
@@ -3319,10 +3912,13 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
                              dpyinfo->Xatom_NET_WM_CM_Sn) != None)
        {
          x_catch_errors (dpyinfo->display);
+         XGrabServer (dpyinfo->display);
          overlay_window = XCompositeGetOverlayWindow (dpyinfo->display,
                                                       dpyinfo->root_window);
          XCompositeReleaseOverlayWindow (dpyinfo->display,
                                          dpyinfo->root_window);
+         XUngrabServer (dpyinfo->display);
+
          if (!x_had_errors_p (dpyinfo->display))
            {
              XGetWindowAttributes (dpyinfo->display, overlay_window, &attrs);
@@ -3456,9 +4052,6 @@ x_dnd_send_enter (struct frame *f, Window target, int 
supported)
   int i;
   XEvent msg;
 
-  if (x_top_window_to_frame (dpyinfo, target))
-    return;
-
   msg.xclient.type = ClientMessage;
   msg.xclient.message_type = dpyinfo->Xatom_XdndEnter;
   msg.xclient.format = 32;
@@ -3474,12 +4067,16 @@ x_dnd_send_enter (struct frame *f, Window target, int 
supported)
   for (i = 0; i < min (3, x_dnd_n_targets); ++i)
     msg.xclient.data.l[i + 2] = x_dnd_targets[i];
 
-  if (x_dnd_n_targets > 3)
+  if (x_dnd_n_targets > 3 && !x_dnd_init_type_lists)
     XChangeProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
                     dpyinfo->Xatom_XdndTypeList, XA_ATOM, 32,
                     PropModeReplace, (unsigned char *) x_dnd_targets,
                     x_dnd_n_targets);
 
+  /* Now record that the type list has already been set (if required),
+     so we don't have to set it again.  */
+  x_dnd_init_type_lists = true;
+
   x_catch_errors (dpyinfo->display);
   XSendEvent (FRAME_X_DISPLAY (f), target, False, NoEventMask, &msg);
   x_uncatch_errors ();
@@ -3493,23 +4090,6 @@ x_dnd_send_position (struct frame *f, Window target, int 
supported,
 {
   struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
   XEvent msg;
-  struct frame *target_frame;
-  int dest_x, dest_y;
-  Window child_return;
-
-  target_frame = x_top_window_to_frame (dpyinfo, target);
-
-  if (target_frame && XTranslateCoordinates (dpyinfo->display,
-                                            dpyinfo->root_window,
-                                            FRAME_X_WINDOW (target_frame),
-                                            root_x, root_y, &dest_x,
-                                            &dest_y, &child_return))
-    {
-      x_dnd_movement_frame = target_frame;
-      x_dnd_movement_x = dest_x;
-      x_dnd_movement_y = dest_y;
-      return;
-    }
 
   if (target == x_dnd_mouse_rect_target
       && x_dnd_mouse_rect.width
@@ -3533,7 +4113,7 @@ x_dnd_send_position (struct frame *f, Window target, int 
supported,
 
   if (supported >= 5)
     {
-      if (button >= 4 && button <= 8)
+      if (button >= 4 && button <= 7)
        {
          msg.xclient.data.l[1] |= (1 << 9);
          msg.xclient.data.l[1] |= (button - 4) << 7;
@@ -3567,9 +4147,6 @@ x_dnd_send_leave (struct frame *f, Window target)
   struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
   XEvent msg;
 
-  if (x_top_window_to_frame (dpyinfo, target))
-    return;
-
   msg.xclient.type = ClientMessage;
   msg.xclient.message_type = dpyinfo->Xatom_XdndLeave;
   msg.xclient.format = 32;
@@ -3589,74 +4166,17 @@ static bool
 x_dnd_send_drop (struct frame *f, Window target, Time timestamp,
                 int supported)
 {
-  struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
+  struct x_display_info *dpyinfo;
   XEvent msg;
-  struct input_event ie;
-  struct frame *self_frame;
-  int root_x, root_y, win_x, win_y, i;
-  unsigned int mask;
-  Window root, child;
-  Lisp_Object lval;
-  char **atom_names;
-  char *name;
-
-  self_frame = x_top_window_to_frame (dpyinfo, target);
 
-  if (self_frame)
-    {
-      if (!x_dnd_allow_current_frame
-         && self_frame == x_dnd_frame)
-       return false;
-
-      /* Send a special drag-and-drop event when dropping on top of an
-        Emacs frame to avoid all the overhead involved with sending
-        client events.  */
-      EVENT_INIT (ie);
-
-      if (XQueryPointer (dpyinfo->display, FRAME_X_WINDOW (self_frame),
-                        &root, &child, &root_x, &root_y, &win_x, &win_y,
-                        &mask))
-       {
-         ie.kind = DRAG_N_DROP_EVENT;
-         XSETFRAME (ie.frame_or_window, self_frame);
-
-         lval = Qnil;
-         atom_names = alloca (x_dnd_n_targets * sizeof *atom_names);
-         name = XGetAtomName (dpyinfo->display, x_dnd_wanted_action);
-
-         if (!XGetAtomNames (dpyinfo->display, x_dnd_targets,
-                             x_dnd_n_targets, atom_names))
-           {
-             XFree (name);
-             return false;
-           }
-
-         for (i = x_dnd_n_targets; i != 0; --i)
-           {
-             lval = Fcons (intern (atom_names[i - 1]), lval);
-             XFree (atom_names[i - 1]);
-           }
-
-         lval = Fcons (intern (name), lval);
-         lval = Fcons (QXdndSelection, lval);
-         ie.arg = lval;
-         ie.timestamp = CurrentTime;
-
-         XSETINT (ie.x, win_x);
-         XSETINT (ie.y, win_y);
-
-         XFree (name);
-         kbd_buffer_store_event (&ie);
-
-         return false;
-       }
-    }
-  else if (x_dnd_action == None)
+  if (x_dnd_action == None)
     {
       x_dnd_send_leave (f, target);
       return false;
     }
 
+  dpyinfo = FRAME_DISPLAY_INFO (f);
+
   msg.xclient.type = ClientMessage;
   msg.xclient.message_type = dpyinfo->Xatom_XdndDrop;
   msg.xclient.format = 32;
@@ -3676,14 +4196,48 @@ x_dnd_send_drop (struct frame *f, Window target, Time 
timestamp,
   return true;
 }
 
-void
+static void
 x_set_dnd_targets (Atom *targets, int ntargets)
 {
   if (x_dnd_targets)
     xfree (x_dnd_targets);
 
-  x_dnd_targets = targets;
+  block_input ();
+  x_dnd_targets = xmalloc (sizeof *targets * ntargets);
   x_dnd_n_targets = ntargets;
+
+  memcpy (x_dnd_targets, targets,
+         sizeof *targets * ntargets);
+  unblock_input ();
+}
+
+static void
+x_free_dnd_targets (void)
+{
+  if (!x_dnd_targets)
+    return;
+
+  xfree (x_dnd_targets);
+  x_dnd_targets = NULL;
+  x_dnd_n_targets = 0;
+}
+
+static void
+x_clear_dnd_monitors (void)
+{
+  x_dnd_monitors = Qnil;
+}
+
+static void
+x_free_dnd_toplevels (void)
+{
+  if (!x_dnd_use_toplevels || !x_dnd_toplevels)
+    return;
+
+  /* If the display is deleted, x_dnd_toplevels will already be
+     NULL, so we can always assume the display is alive here.  */
+
+  x_dnd_free_toplevels (true);
 }
 
 static void
@@ -3716,9 +4270,7 @@ x_dnd_cleanup_drag_and_drop (void *frame)
          dmsg.side_effects
            = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action 
(FRAME_DISPLAY_INFO (f),
                                                               
x_dnd_wanted_action),
-                                  XM_DROP_SITE_VALID,
-                                  xm_side_effect_from_action 
(FRAME_DISPLAY_INFO (f),
-                                                              
x_dnd_wanted_action),
+                                  XM_DROP_SITE_VALID, x_dnd_motif_operations,
                                   XM_DROP_ACTION_DROP_CANCEL);
          dmsg.x = 0;
          dmsg.y = 0;
@@ -3739,12 +4291,8 @@ x_dnd_cleanup_drag_and_drop (void *frame)
       x_dnd_in_progress = false;
     }
 
-  x_set_dnd_targets (NULL, 0);
   x_dnd_waiting_for_finish = false;
 
-  if (x_dnd_use_toplevels)
-    x_dnd_free_toplevels ();
-
   FRAME_DISPLAY_INFO (f)->grabbed = 0;
 #ifdef USE_GTK
   current_hold_quit = NULL;
@@ -3768,11 +4316,123 @@ x_dnd_cleanup_drag_and_drop (void *frame)
   if (x_dnd_motif_setup_p)
     XDeleteProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
                     FRAME_DISPLAY_INFO (f)->Xatom_XdndSelection);
+
+  /* Remove any type list set as well.  */
+  if (x_dnd_init_type_lists && x_dnd_n_targets > 3)
+    XDeleteProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+                    FRAME_DISPLAY_INFO (f)->Xatom_XdndTypeList);
+
   unblock_input ();
 
   x_dnd_frame = NULL;
 }
 
+static void
+x_dnd_note_self_position (struct x_display_info *dpyinfo, Window target,
+                         unsigned short root_x, unsigned short root_y)
+{
+  struct frame *f;
+  int dest_x, dest_y;
+  Window child_return;
+
+  f = x_top_window_to_frame (dpyinfo, target);
+
+  if (f && XTranslateCoordinates (dpyinfo->display,
+                                 dpyinfo->root_window,
+                                 FRAME_X_WINDOW (f),
+                                 root_x, root_y, &dest_x,
+                                 &dest_y, &child_return))
+    {
+      x_dnd_movement_frame = f;
+      x_dnd_movement_x = dest_x;
+      x_dnd_movement_y = dest_y;
+
+      return;
+    }
+}
+
+static void
+x_dnd_note_self_drop (struct x_display_info *dpyinfo, Window target,
+                     unsigned short root_x, unsigned short root_y,
+                     Time timestamp)
+{
+  struct input_event ie;
+  struct frame *f;
+  Lisp_Object lval;
+  char **atom_names;
+  char *name;
+  int win_x, win_y, i;
+  Window dummy;
+
+  if (!x_dnd_allow_current_frame
+      && (FRAME_OUTER_WINDOW (x_dnd_frame)
+         == target))
+    return;
+
+  f = x_top_window_to_frame (dpyinfo, target);
+
+  if (!f)
+    return;
+
+  if (NILP (Vx_dnd_native_test_function))
+    return;
+
+  if (!XTranslateCoordinates (dpyinfo->display, dpyinfo->root_window,
+                             FRAME_X_WINDOW (f), root_x, root_y,
+                             &win_x, &win_y, &dummy))
+    return;
+
+  /* Emacs can't respond to DND events inside the nested event loop,
+     so when dragging items to itself, call the test function
+     manually.  */
+
+  XSETFRAME (lval, f);
+  x_dnd_action = None;
+  x_dnd_action_symbol
+    = safe_call2 (Vx_dnd_native_test_function,
+                 Fposn_at_x_y (make_fixnum (win_x),
+                               make_fixnum (win_y),
+                               lval, Qnil),
+                 x_atom_to_symbol (dpyinfo,
+                                   x_dnd_wanted_action));
+
+  if (!SYMBOLP (x_dnd_action_symbol))
+    return;
+
+  EVENT_INIT (ie);
+
+  ie.kind = DRAG_N_DROP_EVENT;
+  XSETFRAME (ie.frame_or_window, f);
+
+  lval = Qnil;
+  atom_names = alloca (x_dnd_n_targets * sizeof *atom_names);
+  name = x_get_atom_name (dpyinfo, x_dnd_wanted_action, NULL);
+
+  if (!XGetAtomNames (dpyinfo->display, x_dnd_targets,
+                     x_dnd_n_targets, atom_names))
+    {
+      xfree (name);
+      return;
+    }
+
+  for (i = x_dnd_n_targets; i != 0; --i)
+    {
+      lval = Fcons (intern (atom_names[i - 1]), lval);
+      XFree (atom_names[i - 1]);
+    }
+
+  lval = Fcons (intern (name), lval);
+  lval = Fcons (QXdndSelection, lval);
+  ie.arg = lval;
+  ie.timestamp = timestamp;
+
+  XSETINT (ie.x, win_x);
+  XSETINT (ie.y, win_y);
+
+  xfree (name);
+  kbd_buffer_store_event (&ie);
+}
+
 /* Flush display of frame F.  */
 
 static void
@@ -3967,11 +4627,16 @@ x_update_opaque_region (struct frame *f, XEvent 
*configure)
                     (unsigned char *) &opaque_region, 4);
   else
     {
-      object_class = G_OBJECT_GET_CLASS (FRAME_GTK_OUTER_WIDGET (f));
-      class = GTK_WIDGET_CLASS (object_class);
+      /* This causes child frames to not update correctly for an
+        unknown reason.  (bug#55779) */
+      if (!FRAME_PARENT_FRAME (f))
+       {
+         object_class = G_OBJECT_GET_CLASS (FRAME_GTK_OUTER_WIDGET (f));
+         class = GTK_WIDGET_CLASS (object_class);
 
-      if (class->style_updated)
-       class->style_updated (FRAME_GTK_OUTER_WIDGET (f));
+         if (class->style_updated)
+           class->style_updated (FRAME_GTK_OUTER_WIDGET (f));
+       }
     }
 #endif
   unblock_input ();
@@ -4062,27 +4727,48 @@ x_free_xi_devices (struct x_display_info *dpyinfo)
   unblock_input ();
 }
 
+#ifdef HAVE_XINPUT2_1
+struct xi_known_valuator
+{
+  /* The current value of this valuator.  */
+  double current_value;
+
+  /* The number of the valuator.  */
+  int number;
+
+  /* The next valuator whose value we already know.  */
+  struct xi_known_valuator *next;
+};
+#endif
+
 static void
 xi_populate_device_from_info (struct xi_device_t *xi_device,
                              XIDeviceInfo *device)
 {
 #ifdef HAVE_XINPUT2_1
   struct xi_scroll_valuator_t *valuator;
+  struct xi_known_valuator *values, *tem;
   int actual_valuator_count;
   XIScrollClassInfo *info;
+  XIValuatorClassInfo *val_info;
 #endif
+  int c;
 #ifdef HAVE_XINPUT2_2
   XITouchClassInfo *touch_info;
 #endif
-  int c;
+
+#ifdef HAVE_XINPUT2_1
+  USE_SAFE_ALLOCA;
+#endif
 
   xi_device->device_id = device->deviceid;
   xi_device->grab = 0;
 
 #ifdef HAVE_XINPUT2_1
   actual_valuator_count = 0;
-  xi_device->valuators =
-    xmalloc (sizeof *xi_device->valuators * device->num_classes);
+  xi_device->valuators = xmalloc (sizeof *xi_device->valuators
+                                 * device->num_classes);
+  values = NULL;
 #endif
 #ifdef HAVE_XINPUT2_2
   xi_device->touchpoints = NULL;
@@ -4114,7 +4800,21 @@ xi_populate_device_from_info (struct xi_device_t 
*xi_device,
 
            break;
          }
+
+       case XIValuatorClass:
+         {
+           val_info = (XIValuatorClassInfo *) device->classes[c];
+           tem = SAFE_ALLOCA (sizeof *tem);
+
+           tem->next = values;
+           tem->number = val_info->number;
+           tem->current_value = val_info->value;
+
+           values = tem;
+           break;
+         }
 #endif
+
 #ifdef HAVE_XINPUT2_2
        case XITouchClass:
          {
@@ -4129,6 +4829,25 @@ xi_populate_device_from_info (struct xi_device_t 
*xi_device,
 
 #ifdef HAVE_XINPUT2_1
   xi_device->scroll_valuator_count = actual_valuator_count;
+
+  /* Now look through all the valuators whose values are already known
+     and populate our client-side records with their current
+     values.  */
+
+  for (tem = values; values; values = values->next)
+    {
+      for (c = 0; c < xi_device->scroll_valuator_count; ++c)
+       {
+         if (xi_device->valuators[c].number == tem->number)
+           {
+             xi_device->valuators[c].invalid_p = false;
+             xi_device->valuators[c].current_value = tem->current_value;
+             xi_device->valuators[c].pending_enter_reset = true;
+           }
+       }
+    }
+
+  SAFE_FREE ();
 #endif
 }
 
@@ -4242,6 +4961,7 @@ x_get_scroll_valuator_delta (struct x_display_info 
*dpyinfo,
        }
     }
 
+  *valuator_return = NULL;
   return DBL_MAX;
 }
 
@@ -5305,6 +6025,20 @@ x_set_frame_alpha (struct frame *f)
   unsigned long opac;
   Window parent;
 
+#ifndef USE_XCB
+  unsigned char *data = NULL;
+  Atom actual;
+  int rc, format;
+  unsigned long n, left;
+  unsigned long value;
+#else
+  xcb_get_property_cookie_t opacity_cookie;
+  xcb_get_property_reply_t *opacity_reply;
+  xcb_generic_error_t *error;
+  bool rc;
+  uint32_t value;
+#endif
+
   if (dpyinfo->highlight_frame == f)
     alpha = f->alpha[0];
   else
@@ -5343,19 +6077,22 @@ x_set_frame_alpha (struct frame *f)
 
   /* return unless necessary */
   {
-    unsigned char *data = NULL;
-    Atom actual;
-    int rc, format;
-    unsigned long n, left;
-
+#ifndef USE_XCB
     rc = XGetWindowProperty (dpy, win, dpyinfo->Xatom_net_wm_window_opacity,
                             0, 1, False, XA_CARDINAL,
                             &actual, &format, &n, &left,
                             &data);
 
-    if (rc == Success && actual != None && data)
+    if (rc == Success && actual != None
+       && n && format == XA_CARDINAL && data)
       {
-        unsigned long value = *(unsigned long *) data;
+        value = *(unsigned long *) data;
+
+       /* Xlib sign-extends values greater than 0x7fffffff on 64-bit
+          machines.  Get the low bits by ourself.  */
+
+       value &= 0xffffffff;
+
        if (value == opac)
          {
            x_uncatch_errors ();
@@ -5366,6 +6103,37 @@ x_set_frame_alpha (struct frame *f)
 
     if (data)
       XFree (data);
+#else
+    /* Avoid the confusing Xlib sign-extension mess by using XCB
+       instead.  */
+    opacity_cookie
+      = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) win,
+                         (xcb_atom_t) dpyinfo->Xatom_net_wm_window_opacity,
+                         XCB_ATOM_CARDINAL, 0, 1);
+    opacity_reply
+      = xcb_get_property_reply (dpyinfo->xcb_connection,
+                               opacity_cookie, &error);
+
+    rc = opacity_reply;
+
+    if (!opacity_reply)
+      free (error);
+    else
+      {
+       rc = (opacity_reply->format == 32
+             && opacity_reply->type == XCB_ATOM_CARDINAL
+             && (xcb_get_property_value_length (opacity_reply) >= 4));
+
+       if (rc)
+         value = *(uint32_t *) xcb_get_property_value (opacity_reply);
+      }
+
+    if (opacity_reply)
+      free (opacity_reply);
+
+    if (rc && value == opac)
+      return;
+#endif
   }
 
   XChangeProperty (dpy, win, dpyinfo->Xatom_net_wm_window_opacity,
@@ -5504,6 +6272,15 @@ show_back_buffer (struct frame *f)
 static void
 x_flip_and_flush (struct frame *f)
 {
+  /* Flipping buffers requires a working connection to the X server,
+     which isn't always present if `inhibit-redisplay' is t, since
+     this can be called from the IO error handler.  */
+  if (!NILP (Vinhibit_redisplay)
+      /* This has to work for tooltip frames, however, and redisplay
+        cannot happen when they are being flushed anyway.  (bug#55519) */
+      && !FRAME_TOOLTIP_P (f))
+    return;
+
   block_input ();
 #ifdef HAVE_XDBE
   if (FRAME_X_NEED_BUFFER_FLIP (f))
@@ -5745,7 +6522,8 @@ x_after_update_window_line (struct window *w, struct 
glyph_row *desired_row)
 }
 
 static void
-x_draw_fringe_bitmap (struct window *w, struct glyph_row *row, struct 
draw_fringe_bitmap_params *p)
+x_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
+                     struct draw_fringe_bitmap_params *p)
 {
   struct frame *f = XFRAME (WINDOW_FRAME (w));
   Display *display = FRAME_X_DISPLAY (f);
@@ -5762,15 +6540,21 @@ x_draw_fringe_bitmap (struct window *w, struct 
glyph_row *row, struct draw_fring
         mono-displays, the fill style may have been changed to
         FillSolid in x_draw_glyph_string_background.  */
       if (face->stipple)
-       XSetFillStyle (display, face->gc, FillOpaqueStippled);
-      else
-       XSetBackground (display, face->gc, face->background);
-
-      x_clear_rectangle (f, face->gc, p->bx, p->by, p->nx, p->ny,
-                        true);
+       {
+         XSetFillStyle (display, face->gc, FillOpaqueStippled);
+         x_fill_rectangle (f, face->gc, p->bx, p->by, p->nx, p->ny,
+                           true);
+         XSetFillStyle (display, face->gc, FillSolid);
 
-      if (!face->stipple)
-       XSetForeground (display, face->gc, face->foreground);
+         row->stipple_p = true;
+       }
+      else
+       {
+         XSetBackground (display, face->gc, face->background);
+         x_clear_rectangle (f, face->gc, p->bx, p->by, p->nx, p->ny,
+                          true);
+         XSetForeground (display, face->gc, face->foreground);
+       }
     }
 
 #ifdef USE_CAIRO
@@ -6231,6 +7015,31 @@ x_clear_glyph_string_rect (struct glyph_string *s, int 
x, int y, int w, int h)
   x_clear_rectangle (s->f, s->gc, x, y, w, h, s->hl != DRAW_CURSOR);
 }
 
+#ifndef USE_CAIRO
+
+static void
+x_clear_point (struct frame *f, GC gc, int x, int y,
+              bool respect_alpha_background)
+{
+  XGCValues xgcv;
+  Display *dpy;
+
+  dpy = FRAME_X_DISPLAY (f);
+
+  if (f->alpha_background != 1.0
+      && respect_alpha_background)
+    {
+      x_clear_rectangle (f, gc, x, y, 1, 1, true);
+      return;
+    }
+
+  XGetGCValues (dpy, gc, GCBackground | GCForeground, &xgcv);
+  XSetForeground (dpy, gc, xgcv.background);
+  XDrawPoint (dpy, FRAME_X_DRAWABLE (f), gc, x, y);
+  XSetForeground (dpy, gc, xgcv.foreground);
+}
+
+#endif
 
 /* Draw the background of glyph_string S.  If S->background_filled_p
    is non-zero don't draw it.  FORCE_P non-zero means draw the
@@ -6561,6 +7370,10 @@ x_draw_glyphless_glyph_string_foreground (struct 
glyph_string *s)
                        glyph->ascent + glyph->descent - 1);
       x += glyph->pixel_width;
    }
+
+  /* Defend against hypothetical bad code elsewhere that uses
+     s->char2b after this function returns.  */
+  s->char2b = NULL;
 }
 
 #ifdef USE_X_TOOLKIT
@@ -6923,21 +7736,21 @@ x_hash_string_ignore_case (const char *string)
 /* On frame F, translate the color name to RGB values.  Use cached
    information, if possible.
 
-   Note that there is currently no way to clean old entries out of the
-   cache.  However, it is limited to names in the server's database,
-   and names we've actually looked up; list-colors-display is probably
-   the most color-intensive case we're likely to hit.  */
+   If too many entries are placed in the cache, the least recently
+   used entries are removed.  */
 
 Status
 x_parse_color (struct frame *f, const char *color_name,
               XColor *color)
 {
   unsigned short r, g, b;
-  Display *dpy = FRAME_X_DISPLAY (f);
-  Colormap cmap = FRAME_X_COLORMAP (f);
+  Display *dpy;
+  Colormap cmap;
   struct x_display_info *dpyinfo;
-  struct color_name_cache_entry *cache_entry;
+  struct color_name_cache_entry *cache_entry, *last;
+  struct color_name_cache_entry *next, *color_entry;
   unsigned int hash, idx;
+  int rc, i;
 
   /* Don't pass #RGB strings directly to XParseColor, because that
      follows the X convention of zero-extending each channel
@@ -6949,37 +7762,94 @@ x_parse_color (struct frame *f, const char *color_name,
       color->red = r;
       color->green = g;
       color->blue = b;
+
       return 1;
     }
 
+  /* Some X servers send BadValue on empty color names.  */
+  if (!strlen (color_name))
+    return 0;
+
+  cmap = FRAME_X_COLORMAP (f);
+  dpy = FRAME_X_DISPLAY (f);
   dpyinfo = FRAME_DISPLAY_INFO (f);
+
   hash = x_hash_string_ignore_case (color_name);
   idx = hash % dpyinfo->color_names_size;
 
-  for (cache_entry = FRAME_DISPLAY_INFO (f)->color_names[idx];
+  last = NULL;
+
+  for (cache_entry = dpyinfo->color_names[idx];
        cache_entry; cache_entry = cache_entry->next)
     {
       if (!xstrcasecmp (cache_entry->name, color_name))
        {
-         *color = cache_entry->rgb;
-         return 1;
+         /* Move recently used entries to the start of the color
+            cache.  */
+
+         if (last)
+           {
+             last->next = cache_entry->next;
+             cache_entry->next = dpyinfo->color_names[idx];
+
+             dpyinfo->color_names[idx] = cache_entry;
+           }
+
+         if (cache_entry->valid)
+           *color = cache_entry->rgb;
+
+         return cache_entry->valid;
        }
-    }
 
-  /* Some X servers send BadValue on empty color names.  */
-  if (!strlen (color_name))
-    return 0;
+      last = cache_entry;
+    }
 
-  if (XParseColor (dpy, cmap, color_name, color) == 0)
-    /* No caching of negative results, currently.  */
-    return 0;
+  block_input ();
+  rc = XParseColor (dpy, cmap, color_name, color);
+  unblock_input ();
 
   cache_entry = xzalloc (sizeof *cache_entry);
-  cache_entry->rgb = *color;
+  dpyinfo->color_names_length[idx] += 1;
+
+  if (rc)
+    cache_entry->rgb = *color;
+
+  cache_entry->valid = rc;
   cache_entry->name = xstrdup (color_name);
-  cache_entry->next = FRAME_DISPLAY_INFO (f)->color_names[idx];
-  FRAME_DISPLAY_INFO (f)->color_names[idx] = cache_entry;
-  return 1;
+  cache_entry->next = dpyinfo->color_names[idx];
+
+  dpyinfo->color_names[idx] = cache_entry;
+
+  /* Don't let the color cache become too big.  */
+  if (dpyinfo->color_names_length[idx] > (x_color_cache_bucket_size > 0
+                                         ? x_color_cache_bucket_size : 128))
+    {
+      i = 0;
+
+      for (last = dpyinfo->color_names[idx]; last; last = last->next)
+       {
+         if (++i == (x_color_cache_bucket_size > 0
+                     ? x_color_cache_bucket_size : 128))
+           {
+             next = last->next;
+             last->next = NULL;
+
+             for (color_entry = next; color_entry; color_entry = last)
+               {
+                 last = color_entry->next;
+
+                 xfree (color_entry->name);
+                 xfree (color_entry);
+
+                 dpyinfo->color_names_length[idx] -= 1;
+               }
+
+             return rc;
+           }
+       }
+    }
+
+  return rc;
 }
 
 
@@ -7358,20 +8228,62 @@ x_setup_relief_colors (struct glyph_string *s)
     }
 }
 
+#ifndef USE_CAIRO
+static void
+x_fill_triangle (struct frame *f, GC gc, XPoint point1,
+                XPoint point2, XPoint point3)
+{
+  XPoint abc[3];
+
+  abc[0] = point1;
+  abc[1] = point2;
+  abc[2] = point3;
+
+  XFillPolygon (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f),
+               gc, abc, 3, Convex, CoordModeOrigin);
+}
+
+static XPoint
+x_make_point (int x, int y)
+{
+  XPoint pt;
+
+  pt.x = x;
+  pt.y = y;
+
+  return pt;
+}
+
+static bool
+x_inside_rect_p (XRectangle *rects, int nrects, int x, int y)
+{
+  int i;
+
+  for (i = 0; i < nrects; ++i)
+    {
+      if (x >= rects[i].x && y >= rects[i].y
+         && x < rects[i].x + rects[i].width
+         && y < rects[i].y + rects[i].height)
+       return true;
+    }
+
+  return false;
+}
+#endif
 
 /* Draw a relief on frame F inside the rectangle given by LEFT_X,
-   TOP_Y, RIGHT_X, and BOTTOM_Y.  WIDTH is the thickness of the relief
-   to draw, it must be >= 0.  RAISED_P means draw a raised
-   relief.  LEFT_P means draw a relief on the left side of
-   the rectangle.  RIGHT_P means draw a relief on the right
-   side of the rectangle.  CLIP_RECT is the clipping rectangle to use
-   when drawing.  */
+   TOP_Y, RIGHT_X, and BOTTOM_Y.  VWIDTH and HWIDTH are respectively
+   the thickness of the vertical relief (left and right) and
+   horizontal relief (top and bottom) to draw, it must be >= 0.
+   RAISED_P means draw a raised relief.  LEFT_P means draw a relief on
+   the left side of the rectangle.  RIGHT_P means draw a relief on the
+   right side of the rectangle.  CLIP_RECT is the clipping rectangle
+   to use when drawing.  */
 
 static void
-x_draw_relief_rect (struct frame *f,
-                   int left_x, int top_y, int right_x, int bottom_y,
-                   int hwidth, int vwidth, bool raised_p, bool top_p, bool 
bot_p,
-                   bool left_p, bool right_p,
+x_draw_relief_rect (struct frame *f, int left_x, int top_y, int right_x,
+                   int bottom_y, int hwidth, int vwidth, bool raised_p,
+                   bool top_p, bool bot_p, bool left_p, bool right_p,
                    XRectangle *clip_rect)
 {
 #ifdef USE_CAIRO
@@ -7447,90 +8359,118 @@ x_draw_relief_rect (struct frame *f,
   x_reset_clip_rectangles (f, top_left_gc);
   x_reset_clip_rectangles (f, bottom_right_gc);
 #else
-  Display *dpy = FRAME_X_DISPLAY (f);
-  Drawable drawable = FRAME_X_DRAWABLE (f);
-  int i;
-  GC gc;
-
-  if (raised_p)
-    gc = f->output_data.x->white_relief.gc;
-  else
-    gc = f->output_data.x->black_relief.gc;
-  XSetClipRectangles (dpy, gc, 0, 0, clip_rect, 1, Unsorted);
+  GC gc, white_gc, black_gc, normal_gc;
+  Drawable drawable;
+  Display *dpy;
 
   /* This code is more complicated than it has to be, because of two
      minor hacks to make the boxes look nicer: (i) if width > 1, draw
      the outermost line using the black relief.  (ii) Omit the four
      corner pixels.  */
 
-  /* Top.  */
-  if (top_p)
-    {
-      if (hwidth == 1)
-        XDrawLine (dpy, drawable, gc,
-                  left_x + left_p, top_y,
-                  right_x + !right_p, top_y);
-
-      for (i = 1; i < hwidth; ++i)
-        XDrawLine (dpy, drawable, gc,
-                  left_x  + i * left_p, top_y + i,
-                  right_x + 1 - i * right_p, top_y + i);
-    }
+  white_gc = f->output_data.x->white_relief.gc;
+  black_gc = f->output_data.x->black_relief.gc;
+  normal_gc = f->output_data.x->normal_gc;
 
-  /* Left.  */
-  if (left_p)
-    {
-      if (vwidth == 1)
-        XDrawLine (dpy, drawable, gc, left_x, top_y + 1, left_x, bottom_y);
+  drawable = FRAME_X_DRAWABLE (f);
+  dpy = FRAME_X_DISPLAY (f);
 
-      for (i = 1; i < vwidth; ++i)
-        XDrawLine (dpy, drawable, gc,
-                  left_x + i, top_y + (i + 1) * top_p,
-                  left_x + i, bottom_y + 1 - (i + 1) * bot_p);
-    }
+  x_set_clip_rectangles (f, white_gc, clip_rect, 1);
+  x_set_clip_rectangles (f, black_gc, clip_rect, 1);
 
-  XSetClipMask (dpy, gc, None);
   if (raised_p)
-    gc = f->output_data.x->black_relief.gc;
+    gc = white_gc;
   else
-    gc = f->output_data.x->white_relief.gc;
-  XSetClipRectangles (dpy, gc, 0, 0, clip_rect, 1, Unsorted);
+    gc = black_gc;
 
-  /* Outermost top line.  */
-  if (top_p && hwidth > 1)
-    XDrawLine (dpy, drawable, gc,
-              left_x  + left_p, top_y,
-              right_x + !right_p, top_y);
+  /* Draw lines.  */
 
-  /* Outermost left line.  */
-  if (left_p && vwidth > 1)
-    XDrawLine (dpy, drawable, gc, left_x, top_y + 1, left_x, bottom_y);
+  if (top_p)
+    x_fill_rectangle (f, gc, left_x, top_y,
+                     right_x - left_x + 1, hwidth,
+                     false);
+
+  if (left_p)
+    x_fill_rectangle (f, gc, left_x, top_y, vwidth,
+                     bottom_y - top_y + 1, false);
+
+  if (raised_p)
+    gc = black_gc;
+  else
+    gc = white_gc;
 
-  /* Bottom.  */
   if (bot_p)
+    x_fill_rectangle (f, gc, left_x, bottom_y - hwidth + 1,
+                     right_x - left_x + 1, hwidth, false);
+
+  if (right_p)
+    x_fill_rectangle (f, gc, right_x - vwidth + 1, top_y,
+                     vwidth, bottom_y - top_y + 1, false);
+
+  /* Draw corners.  */
+
+  if (bot_p && left_p)
+    x_fill_triangle (f, raised_p ? white_gc : black_gc,
+                    x_make_point (left_x, bottom_y - hwidth),
+                    x_make_point (left_x + vwidth, bottom_y - hwidth),
+                    x_make_point (left_x, bottom_y));
+
+  if (top_p && right_p)
+    x_fill_triangle (f, raised_p ? white_gc : black_gc,
+                    x_make_point (right_x - vwidth, top_y),
+                    x_make_point (right_x, top_y),
+                    x_make_point (right_x - vwidth, top_y + hwidth));
+
+  /* Draw outer line.  */
+
+  if (top_p && left_p && bot_p && right_p
+      && hwidth > 1 && vwidth > 1)
+    x_draw_rectangle (f, black_gc, left_x, top_y,
+                     right_x - left_x, bottom_y - top_y);
+  else
     {
-      if (hwidth >= 1)
-        XDrawLine (dpy, drawable, gc,
-                  left_x + left_p, bottom_y,
-                  right_x + !right_p, bottom_y);
+      if (top_p && hwidth > 1)
+       XDrawLine (dpy, drawable, black_gc, left_x, top_y,
+                  right_x + 1, top_y);
+
+      if (bot_p && hwidth > 1)
+       XDrawLine (dpy, drawable, black_gc, left_x, bottom_y,
+                  right_x + 1, bottom_y);
+
+      if (left_p && vwidth > 1)
+       XDrawLine (dpy, drawable, black_gc, left_x, top_y,
+                  left_x, bottom_y + 1);
 
-      for (i = 1; i < hwidth; ++i)
-        XDrawLine (dpy, drawable, gc,
-                  left_x  + i * left_p, bottom_y - i,
-                  right_x + 1 - i * right_p, bottom_y - i);
+      if (right_p && vwidth > 1)
+       XDrawLine (dpy, drawable, black_gc, right_x, top_y,
+                  right_x, bottom_y + 1);
     }
 
-  /* Right.  */
-  if (right_p)
+  /* Erase corners.  */
+
+  if (hwidth > 1 && vwidth > 1)
     {
-      for (i = 0; i < vwidth; ++i)
-        XDrawLine (dpy, drawable, gc,
-                  right_x - i, top_y + (i + 1) * top_p,
-                  right_x - i, bottom_y + 1 - (i + 1) * bot_p);
-    }
+      if (left_p && top_p && x_inside_rect_p (clip_rect, 1,
+                                             left_x, top_y))
+       /* This should respect `alpha-background' since it's being
+          cleared with the background color of the frame.  */
+       x_clear_point (f, normal_gc, left_x, top_y, true);
 
-  x_reset_clip_rectangles (f, gc);
+      if (left_p && bot_p && x_inside_rect_p (clip_rect, 1,
+                                             left_x, bottom_y))
+       x_clear_point (f, normal_gc, left_x, bottom_y, true);
+
+      if (right_p && top_p && x_inside_rect_p (clip_rect, 1,
+                                              right_x, top_y))
+       x_clear_point (f, normal_gc, right_x, top_y, true);
+
+      if (right_p && bot_p && x_inside_rect_p (clip_rect, 1,
+                                              right_x, bottom_y))
+       x_clear_point (f, normal_gc, right_x, bottom_y, true);
+    }
 
+  x_reset_clip_rectangles (f, white_gc);
+  x_reset_clip_rectangles (f, black_gc);
 #endif
 }
 
@@ -8039,6 +8979,9 @@ x_draw_image_glyph_string (struct glyph_string *s)
       || s->img->pixmap == 0
       || s->width != s->background_width)
     {
+      if (s->stippled_p)
+       s->row->stipple_p = true;
+
 #ifndef USE_CAIRO
       if (s->img->mask)
        {
@@ -8219,6 +9162,8 @@ x_draw_stretch_glyph_string (struct glyph_string *s)
              XSetFillStyle (display, gc, FillOpaqueStippled);
              x_fill_rectangle (s->f, gc, x, y, w, h, true);
              XSetFillStyle (display, gc, FillSolid);
+
+             s->row->stipple_p = true;
            }
          else
            {
@@ -8245,8 +9190,13 @@ x_draw_stretch_glyph_string (struct glyph_string *s)
          background_width -= text_left_x - x;
          x = text_left_x;
        }
+
+      if (!s->row->stipple_p)
+       s->row->stipple_p = s->stippled_p;
+
       if (background_width > 0)
-       x_draw_glyph_string_bg_rect (s, x, s->y, background_width, s->height);
+       x_draw_glyph_string_bg_rect (s, x, s->y,
+                                    background_width, s->height);
     }
 
   s->background_filled_p = true;
@@ -8522,13 +9472,13 @@ x_draw_glyph_string (struct glyph_string *s)
                  val = (WINDOW_BUFFER_LOCAL_VALUE
                         (Qx_underline_at_descent_line, s->w));
                  underline_at_descent_line
-                   = (!(NILP (val) || EQ (val, Qunbound))
+                   = (!(NILP (val) || BASE_EQ (val, Qunbound))
                       || s->face->underline_at_descent_line_p);
 
                  val = (WINDOW_BUFFER_LOCAL_VALUE
                         (Qx_use_underline_position_properties, s->w));
                  use_underline_position_properties
-                   = !(NILP (val) || EQ (val, Qunbound));
+                   = !(NILP (val) || BASE_EQ (val, Qunbound));
 
                   /* Get the underline thickness.  Default is 1 pixel.  */
                   if (font && font->underline_thickness > 0)
@@ -8560,7 +9510,7 @@ x_draw_glyph_string (struct glyph_string *s)
                     }
 
                  /* Ignore minimum_offset if the amount of pixels was
-                    explictly specified.  */
+                    explicitly specified.  */
                  if (!s->face->underline_pixels_above_descent_line)
                    position = max (position, minimum_offset);
                 }
@@ -8695,6 +9645,14 @@ x_draw_glyph_string (struct glyph_string *s)
   /* Reset clipping.  */
   x_reset_clip_rectangles (s->f, s->gc);
   s->num_clips = 0;
+
+  /* Set the stippled flag that tells redisplay whether or not a
+     stipple was actually draw.  */
+
+  if (s->first_glyph->type != STRETCH_GLYPH
+      && s->first_glyph->type != IMAGE_GLYPH
+      && !s->row->stipple_p)
+    s->row->stipple_p = s->stippled_p;
 }
 
 /* Shift display to make room for inserted glyphs.   */
@@ -8724,13 +9682,15 @@ x_delete_glyphs (struct frame *f, int n)
 /* Like XClearArea, but check that WIDTH and HEIGHT are reasonable.
    If they are <= 0, this is probably an error.  */
 
-MAYBE_UNUSED static void
+#if defined USE_GTK || !defined USE_CAIRO
+static void
 x_clear_area1 (Display *dpy, Window window,
                int x, int y, int width, int height, int exposures)
 {
   eassert (width > 0 && height > 0);
   XClearArea (dpy, window, x, y, width, height, exposures);
 }
+#endif
 
 void
 x_clear_area (struct frame *f, int x, int y, int width, int height)
@@ -9439,8 +10399,24 @@ x_toggle_visible_pointer (struct frame *f, bool 
invisible)
   if (dpyinfo->invisible_cursor == None)
     dpyinfo->invisible_cursor = make_invisible_cursor (dpyinfo);
 
+#ifndef HAVE_XFIXES
   if (dpyinfo->invisible_cursor == None)
     invisible = false;
+#else
+  /* But if Xfixes is available, try using it instead.  */
+  if (dpyinfo->invisible_cursor == None)
+    {
+      if (x_probe_xfixes_extension (dpyinfo))
+       {
+         dpyinfo->fixes_pointer_blanking = true;
+         xfixes_toggle_visible_pointer (f, invisible);
+
+         return;
+       }
+      else
+       invisible = false;
+    }
+#endif
 
   if (invisible)
     XDefineCursor (dpyinfo->display, FRAME_X_WINDOW (f),
@@ -9588,6 +10564,67 @@ x_window_to_frame (struct x_display_info *dpyinfo, int 
wdesc)
   return 0;
 }
 
+/* Like x_any_window_to_frame but only try to find tooltip frames.
+
+   If wdesc is a toolkit tooltip without an associated frame, set
+   UNRELATED_TOOLTIP_P to true.  Otherwise, set it to false.  */
+static struct frame *
+x_tooltip_window_to_frame (struct x_display_info *dpyinfo,
+                          Window wdesc, bool *unrelated_tooltip_p)
+{
+  Lisp_Object tail, frame;
+  struct frame *f;
+#ifdef USE_GTK
+  GtkWidget *widget;
+  GdkWindow *tooltip_window;
+#endif
+
+  *unrelated_tooltip_p = false;
+
+  FOR_EACH_FRAME (tail, frame)
+    {
+      f = XFRAME (frame);
+
+      if (FRAME_X_P (f) && FRAME_TOOLTIP_P (f)
+         && FRAME_DISPLAY_INFO (f) == dpyinfo
+         && FRAME_X_WINDOW (f) == wdesc)
+       return f;
+
+#ifdef USE_GTK
+      if (!FRAME_X_P (f))
+       continue;
+
+      if (FRAME_X_OUTPUT (f)->ttip_window)
+       widget = GTK_WIDGET (FRAME_X_OUTPUT (f)->ttip_window);
+      else
+       widget = NULL;
+
+      if (widget)
+       tooltip_window = gtk_widget_get_window (widget);
+      else
+       tooltip_window = NULL;
+
+#ifdef HAVE_GTK3
+      if (tooltip_window
+         && (gdk_x11_window_get_xid (tooltip_window) == wdesc))
+       {
+         *unrelated_tooltip_p = true;
+         break;
+       }
+#else
+      if (tooltip_window
+         && (GDK_WINDOW_XID (tooltip_window) == wdesc))
+       {
+         *unrelated_tooltip_p = true;
+         break;
+       }
+#endif
+#endif
+    }
+
+  return NULL;
+}
+
 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
 
 /* Like x_window_to_frame but also compares the window with the widget's
@@ -9742,8 +10779,11 @@ static void
 x_next_event_from_any_display (XEvent *event)
 {
   struct x_display_info *dpyinfo;
-  fd_set fds;
-  int fd, maxfd;
+  fd_set fds, rfds;
+  int fd, maxfd, rc;
+
+  rc = -1;
+  FD_ZERO (&rfds);
 
   while (true)
     {
@@ -9753,47 +10793,113 @@ x_next_event_from_any_display (XEvent *event)
       for (dpyinfo = x_display_list; dpyinfo;
           dpyinfo = dpyinfo->next)
        {
-         if (XPending (dpyinfo->display))
+         fd = ConnectionNumber (dpyinfo->display);
+
+         if ((rc < 0 || FD_ISSET (fd, &rfds))
+             && XPending (dpyinfo->display))
            {
              XNextEvent (dpyinfo->display, event);
              return;
            }
 
-         fd = XConnectionNumber (dpyinfo->display);
-
          if (fd > maxfd)
            maxfd = fd;
 
          eassert (fd < FD_SETSIZE);
-         FD_SET (XConnectionNumber (dpyinfo->display), &fds);
+         FD_SET (fd, &fds);
        }
 
       eassert (maxfd >= 0);
 
-      /* We don't have to check the return of pselect, because if an
+      /* Continue to read input even if pselect fails, because if an
         error occurs XPending will call the IO error handler, which
         then brings us out of this loop.  */
-      pselect (maxfd, &fds, NULL, NULL, NULL, NULL);
+      rc = pselect (maxfd + 1, &fds, NULL, NULL, NULL, NULL);
+
+      if (rc >= 0)
+       rfds = fds;
     }
 }
 
 #endif /* USE_X_TOOLKIT || USE_GTK */
 
 static void
-x_clear_dnd_targets (void)
+x_handle_pending_selection_requests_1 (struct x_selection_request_event *tem)
 {
-  if (x_dnd_unwind_flag)
-    x_set_dnd_targets (NULL, 0);
+  specpdl_ref count;
+  struct selection_input_event se;
+
+  count = SPECPDL_INDEX ();
+  se = tem->se;
+
+  record_unwind_protect_ptr (xfree, tem);
+  x_handle_selection_event (&se);
+  unbind_to (count, Qnil);
+}
+
+/* Handle all pending selection request events from modal event
+   loops.  */
+void
+x_handle_pending_selection_requests (void)
+{
+  struct x_selection_request_event *tem;
+
+  while (pending_selection_requests)
+    {
+      tem = pending_selection_requests;
+      pending_selection_requests = tem->next;
+
+      x_handle_pending_selection_requests_1 (tem);
+    }
+}
+
+static void
+x_push_selection_request (struct selection_input_event *se)
+{
+  struct x_selection_request_event *tem;
+
+  tem = xmalloc (sizeof *tem);
+  tem->next = pending_selection_requests;
+  tem->se = *se;
+  pending_selection_requests = tem;
+}
+
+bool
+x_detect_pending_selection_requests (void)
+{
+  return pending_selection_requests;
+}
+
+static void
+x_clear_dnd_action (void)
+{
+  x_dnd_action_symbol = Qnil;
 }
 
 /* This function is defined far away from the rest of the XDND code so
    it can utilize `x_any_window_to_frame'.  */
 
+/* Implementors beware!  On most other platforms (where drag-and-drop
+   data is not provided via selections, but some kind of serialization
+   mechanism), it is usually much easier to implement a suitable
+   primitive instead of copying the C code here, and then to build
+   `x-begin-drag' on top of that, by making it a wrapper function in
+   Lisp that converts the list of targets and value of `XdndSelection'
+   to serialized data.  Also be sure to update the data types used in
+   dnd.el.
+
+   For examples of how to do this, see `haiku-drag-message' and
+   `x-begin-drag' in haikuselect.c and lisp/term/haiku-win.el, and
+   `ns-begin-drag' and `x-begin-drag' in nsselect.m and
+   lisp/term/ns-win.el.  */
+
 Lisp_Object
 x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
                           Lisp_Object return_frame, Atom *ask_action_list,
                           const char **ask_action_names, size_t n_ask_actions,
-                          bool allow_current_frame)
+                          bool allow_current_frame, Atom *target_atoms,
+                          int ntargets, Lisp_Object selection_target_list,
+                          bool follow_tooltip)
 {
 #ifndef USE_GTK
   XEvent next_event;
@@ -9801,60 +10907,119 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time 
time, Atom xaction,
 #endif
   XWindowAttributes root_window_attrs;
   struct input_event hold_quit;
-  struct frame *any;
   char *atom_name, *ask_actions;
   Lisp_Object action, ltimestamp;
-  specpdl_ref ref;
+  specpdl_ref ref, count, base;
   ptrdiff_t i, end, fill;
   XTextProperty prop;
   xm_drop_start_message dmsg;
   Lisp_Object frame_object, x, y, frame, local_value;
-  bool signals_were_pending;
+  bool signals_were_pending, need_sync;
 #ifdef HAVE_XKB
   XkbStateRec keyboard_state;
 #endif
 #ifndef USE_GTK
   struct x_display_info *event_display;
 #endif
+  union buffered_input_event *events, *event;
+  int n_events;
+  struct frame *event_frame;
+
+  base = SPECPDL_INDEX ();
+
+  /* Bind this here to avoid juggling bindings and SAFE_FREE in
+     Fx_begin_drag.  */
+  specbind (Qx_dnd_targets_list, selection_target_list);
+
+  /* Before starting drag-and-drop, walk through the keyboard buffer
+     to see if there are any UNSUPPORTED_DROP_EVENTs, and run them now
+     if they exist, to prevent race conditions from happening due to
+     multiple unsupported drops running at once.  */
+
+  block_input ();
+  events = alloca (sizeof *events * KBD_BUFFER_SIZE);
+  n_events = 0;
+  event = kbd_fetch_ptr;
+
+  while (event != kbd_store_ptr)
+    {
+      if (event->ie.kind == UNSUPPORTED_DROP_EVENT
+         && event->ie.modifiers < x_dnd_unsupported_event_level)
+       events[n_events++] = *event;
 
-  if (!FRAME_VISIBLE_P (f))
+      event = (event == kbd_buffer + KBD_BUFFER_SIZE - 1
+              ? kbd_buffer : event + 1);
+    }
+
+  x_dnd_unsupported_event_level += 1;
+  unblock_input ();
+
+  for (i = 0; i < n_events; ++i)
     {
-      x_set_dnd_targets (NULL, 0);
-      error ("Frame is invisible");
+      maybe_quit ();
+
+      event = &events[i];
+      event_frame = XFRAME (event->ie.frame_or_window);
+
+      if (!FRAME_LIVE_P (event_frame))
+       continue;
+
+      if (!NILP (Vx_dnd_unsupported_drop_function))
+       {
+         if (!NILP (call7 (Vx_dnd_unsupported_drop_function,
+                           XCAR (XCDR (event->ie.arg)), event->ie.x,
+                           event->ie.y, XCAR (XCDR (XCDR (event->ie.arg))),
+                           make_uint (event->ie.code),
+                           event->ie.frame_or_window,
+                           make_int (event->ie.timestamp))))
+           continue;
+       }
+
+      /* `x-dnd-unsupported-drop-function' could have deleted the
+        event frame.  */
+      if (!FRAME_LIVE_P (event_frame))
+       continue;
+
+      x_dnd_do_unsupported_drop (FRAME_DISPLAY_INFO (event_frame),
+                                event->ie.frame_or_window,
+                                XCAR (event->ie.arg),
+                                XCAR (XCDR (event->ie.arg)),
+                                (Window) event->ie.code,
+                                XFIXNUM (event->ie.x),
+                                XFIXNUM (event->ie.y),
+                                event->ie.timestamp);
+      break;
     }
 
+  if (!FRAME_VISIBLE_P (f))
+    error ("Frame must be visible");
+
   XSETFRAME (frame, f);
   local_value = assq_no_quit (QXdndSelection,
                              FRAME_TERMINAL (f)->Vselection_alist);
 
   if (x_dnd_in_progress || x_dnd_waiting_for_finish)
-    {
-      x_set_dnd_targets (NULL, 0);
-      error ("A drag-and-drop session is already in progress");
-    }
+    error ("A drag-and-drop session is already in progress");
 
-  if (CONSP (local_value))
-    {
-      ref = SPECPDL_INDEX ();
+  DEFER_SELECTIONS;
 
-      record_unwind_protect_void (x_clear_dnd_targets);
-      x_dnd_unwind_flag = true;
-      x_own_selection (QXdndSelection,
-                      Fnth (make_fixnum (1), local_value), frame);
-      x_dnd_unwind_flag = false;
-      unbind_to (ref, Qnil);
-    }
+  /* If local_value is nil, then we lost ownership of XdndSelection.
+     Signal a more informative error than args-out-of-range.  */
+  if (NILP (local_value))
+    error ("Lost ownership of XdndSelection");
+
+  if (CONSP (local_value))
+    x_own_selection (QXdndSelection,
+                    Fnth (make_fixnum (1), local_value), frame);
   else
-    {
-      x_set_dnd_targets (NULL, 0);
-      error ("No local value for XdndSelection");
-    }
+    error ("No local value for XdndSelection");
 
   if (popup_activated ())
-    {
-      x_set_dnd_targets (NULL, 0);
-      error ("Trying to drag-and-drop from within a menu-entry");
-    }
+    error ("Trying to drag-and-drop from within a menu-entry");
+
+  x_set_dnd_targets (target_atoms, ntargets);
+  record_unwind_protect_void (x_free_dnd_targets);
+  record_unwind_protect_void (x_clear_dnd_action);
 
   ltimestamp = x_timestamp_for_selection (FRAME_DISPLAY_INFO (f),
                                          QXdndSelection);
@@ -9864,10 +11029,24 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
   else
     x_dnd_selection_timestamp = XFIXNUM (ltimestamp);
 
+  x_dnd_motif_operations
+    = xm_side_effect_from_action (FRAME_DISPLAY_INFO (f), xaction);
+
+  x_dnd_first_motif_operation = XM_DRAG_NOOP;
+
   if (n_ask_actions)
     {
+      x_dnd_motif_operations
+       = xm_operations_from_actions (FRAME_DISPLAY_INFO (f),
+                                     ask_action_list,
+                                     n_ask_actions);
+      x_dnd_first_motif_operation
+       = xm_side_effect_from_action (FRAME_DISPLAY_INFO (f),
+                                     ask_action_list[0]);
+
       ask_actions = NULL;
       end = 0;
+      count = SPECPDL_INDEX ();
 
       for (i = 0; i < n_ask_actions; ++i)
        {
@@ -9889,16 +11068,25 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
       prop.format = 8;
       prop.nitems = end;
 
+      record_unwind_protect_ptr (xfree, ask_actions);
+
+      /* This can potentially store a lot of data in window
+        properties, so check for allocation errors.  */
       block_input ();
+      x_catch_errors (FRAME_X_DISPLAY (f));
       XSetTextProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
                        &prop, FRAME_DISPLAY_INFO 
(f)->Xatom_XdndActionDescription);
-      xfree (ask_actions);
 
       XChangeProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
                       FRAME_DISPLAY_INFO (f)->Xatom_XdndActionList, XA_ATOM, 
32,
                       PropModeReplace, (unsigned char *) ask_action_list,
                       n_ask_actions);
+      x_check_errors (FRAME_X_DISPLAY (f),
+                     "Can't set action descriptions: %s");
+      x_uncatch_errors_after_check ();
       unblock_input ();
+
+      unbind_to (count, Qnil);
     }
   else
     {
@@ -9914,14 +11102,45 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
       unblock_input ();
     }
 
+  if (follow_tooltip)
+    {
+#if defined HAVE_XRANDR || defined USE_GTK
+      x_dnd_monitors
+       = FRAME_DISPLAY_INFO (f)->last_monitor_attributes_list;
+
+      if (NILP (x_dnd_monitors))
+#endif
+       x_dnd_monitors
+         = Fx_display_monitor_attributes_list (frame);
+
+      record_unwind_protect_void (x_clear_dnd_monitors);
+    }
+
+  x_dnd_update_tooltip = follow_tooltip;
+
+  /* This shouldn't happen.  */
+  if (x_dnd_toplevels)
+    x_dnd_free_toplevels (true);
+
+#ifdef USE_GTK
+  /* Prevent GTK+ timeouts from being run, since they can call
+     handle_one_xevent behind our back.  */
+  suppress_xg_select ();
+  record_unwind_protect_void (release_xg_select);
+#endif
+
+  /* Initialize most of the state for the drag-and-drop operation.  */
   x_dnd_in_progress = true;
+  x_dnd_recursion_depth = command_loop_level + minibuf_level;
   x_dnd_frame = f;
   x_dnd_last_seen_window = None;
   x_dnd_last_seen_toplevel = None;
   x_dnd_last_protocol_version = -1;
+  x_dnd_last_window_is_frame = false;
   x_dnd_last_motif_style = XM_DRAG_STYLE_NONE;
   x_dnd_mouse_rect_target = None;
   x_dnd_action = None;
+  x_dnd_action_symbol = Qnil;
   x_dnd_wanted_action = xaction;
   x_dnd_return_frame = 0;
   x_dnd_waiting_for_finish = false;
@@ -9934,6 +11153,7 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
   x_dnd_toplevels = NULL;
   x_dnd_allow_current_frame = allow_current_frame;
   x_dnd_movement_frame = NULL;
+  x_dnd_init_type_lists = false;
 #ifdef HAVE_XKB
   x_dnd_keyboard_state = 0;
 
@@ -9953,9 +11173,11 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
     {
       if (x_dnd_compute_toplevels (FRAME_DISPLAY_INFO (f)))
        {
-         x_dnd_free_toplevels ();
+         x_dnd_free_toplevels (true);
          x_dnd_use_toplevels = false;
        }
+      else
+       record_unwind_protect_void (x_free_dnd_toplevels);
     }
 
   if (!NILP (return_frame))
@@ -9983,14 +11205,17 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
 
   while (x_dnd_in_progress || x_dnd_waiting_for_finish)
     {
-      hold_quit.kind = NO_EVENT;
+      EVENT_INIT (hold_quit);
+
 #ifdef USE_GTK
       current_finish = X_EVENT_NORMAL;
       current_hold_quit = &hold_quit;
       current_count = 0;
+      xg_pending_quit_event.kind = NO_EVENT;
 #endif
 
       block_input ();
+      x_dnd_inside_handle_one_xevent = true;
 #ifdef USE_GTK
       gtk_main_iteration ();
 #elif defined USE_X_TOOLKIT
@@ -10027,7 +11252,12 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
                             &next_event, &finish, &hold_quit);
 #endif
        }
+#else
+      /* Clear these before the read_socket_hook can be called.  */
+      current_count = -1;
+      current_hold_quit = NULL;
 #endif
+      x_dnd_inside_handle_one_xevent = false;
 
       /* The unblock_input below might try to read input, but
         XTread_socket does nothing inside a drag-and-drop event
@@ -10042,7 +11272,16 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
       if (event_display == FRAME_DISPLAY_INFO (f))
        {
 #endif
-         if (x_dnd_movement_frame)
+         if (x_dnd_movement_frame
+             /* FIXME: how come this can end up with movement frames
+                from other displays on GTK builds?  */
+             && (FRAME_X_DISPLAY (x_dnd_movement_frame)
+                 == FRAME_X_DISPLAY (f))
+             /* If both those variables are false, then F is no
+                longer protected from deletion by Lisp code.  This
+                can only happen during the final iteration of the DND
+                event loop.  */
+             && (x_dnd_in_progress || x_dnd_waiting_for_finish))
            {
              XSETFRAME (frame_object, x_dnd_movement_frame);
              XSETINT (x, x_dnd_movement_x);
@@ -10050,6 +11289,7 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
              x_dnd_movement_frame = NULL;
 
              if (!NILP (Vx_dnd_movement_function)
+                 && FRAME_LIVE_P (XFRAME (frame_object))
                  && !FRAME_TOOLTIP_P (XFRAME (frame_object))
                  && x_dnd_movement_x >= 0
                  && x_dnd_movement_y >= 0
@@ -10071,19 +11311,6 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
 
          if (hold_quit.kind != NO_EVENT)
            {
-             if (hold_quit.kind == SELECTION_REQUEST_EVENT)
-               {
-                 x_dnd_old_window_attrs = root_window_attrs;
-                 x_dnd_unwind_flag = true;
-
-                 ref = SPECPDL_INDEX ();
-                 record_unwind_protect_ptr (x_dnd_cleanup_drag_and_drop, f);
-                 x_handle_selection_event ((struct selection_input_event *) 
&hold_quit);
-                 x_dnd_unwind_flag = false;
-                 unbind_to (ref, Qnil);
-                 continue;
-               }
-
              if (x_dnd_in_progress)
                {
                  if (x_dnd_last_seen_window != None
@@ -10101,9 +11328,7 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
                      dmsg.side_effects
                        = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action 
(FRAME_DISPLAY_INFO (f),
                                                                           
x_dnd_wanted_action),
-                                              XM_DROP_SITE_VALID,
-                                              xm_side_effect_from_action 
(FRAME_DISPLAY_INFO (f),
-                                                                          
x_dnd_wanted_action),
+                                              XM_DROP_SITE_VALID, 
x_dnd_motif_operations,
                                               XM_DROP_ACTION_DROP_CANCEL);
                      dmsg.x = 0;
                      dmsg.y = 0;
@@ -10124,19 +11349,107 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time 
time, Atom xaction,
                  x_dnd_frame = NULL;
                }
 
-             x_set_dnd_targets (NULL, 0);
              x_dnd_waiting_for_finish = false;
+             x_dnd_return_frame_object = NULL;
+             x_dnd_movement_frame = NULL;
+
+             /* Don't clear dpyinfo->grabbed if we're quitting.  */
+
+#ifdef USE_GTK
+             current_hold_quit = NULL;
+#endif
+             /* Restore the old event mask.  */
+             XSelectInput (FRAME_X_DISPLAY (f),
+                           FRAME_DISPLAY_INFO (f)->root_window,
+                           root_window_attrs.your_event_mask);
+#ifdef HAVE_XKB
+             if (FRAME_DISPLAY_INFO (f)->supports_xkb)
+               XkbSelectEvents (FRAME_X_DISPLAY (f), XkbUseCoreKbd,
+                                XkbStateNotifyMask, 0);
+#endif
+             /* Delete the Motif drag initiator info if it was set up.  */
+             if (x_dnd_motif_setup_p)
+               XDeleteProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+                                FRAME_DISPLAY_INFO (f)->Xatom_XdndSelection);
+
+
+             /* Remove any type list set as well.  */
+             if (x_dnd_init_type_lists && x_dnd_n_targets > 3)
+               XDeleteProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+                                FRAME_DISPLAY_INFO (f)->Xatom_XdndTypeList);
+
+             /* Call kbd_buffer_store event, which calls
+                handle_interrupt and sets `last-event-frame' along
+                with various other things.  */
+             kbd_buffer_store_event (&hold_quit);
+             /* Now quit anyway.  */
+             quit ();
+           }
+
+         if (pending_selection_requests
+             && (x_dnd_in_progress || x_dnd_waiting_for_finish))
+           {
+             x_dnd_old_window_attrs = root_window_attrs;
+             x_dnd_unwind_flag = true;
+
+             ref = SPECPDL_INDEX ();
+             record_unwind_protect_ptr (x_dnd_cleanup_drag_and_drop, f);
+             x_handle_pending_selection_requests ();
+             x_dnd_unwind_flag = false;
+             unbind_to (ref, Qnil);
+           }
+
+#ifdef USE_GTK
+         if (xg_pending_quit_event.kind != NO_EVENT)
+           {
+             xg_pending_quit_event.kind = NO_EVENT;
+
+             if (x_dnd_in_progress)
+               {
+                 if (x_dnd_last_seen_window != None
+                     && x_dnd_last_protocol_version != -1)
+                   x_dnd_send_leave (f, x_dnd_last_seen_window);
+                 else if (x_dnd_last_seen_window != None
+                          && !XM_DRAG_STYLE_IS_DROP_ONLY 
(x_dnd_last_motif_style)
+                          && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE
+                          && x_dnd_motif_setup_p)
+                   {
+                     dmsg.reason = XM_DRAG_REASON 
(XM_DRAG_ORIGINATOR_INITIATOR,
+                                                   XM_DRAG_REASON_DROP_START);
+                     dmsg.byte_order = XM_BYTE_ORDER_CUR_FIRST;
+                     dmsg.timestamp = xg_pending_quit_event.timestamp;
+                     dmsg.side_effects
+                       = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action 
(FRAME_DISPLAY_INFO (f),
+                                                                          
x_dnd_wanted_action),
+                                              XM_DROP_SITE_VALID, 
x_dnd_motif_operations,
+                                              XM_DROP_ACTION_DROP_CANCEL);
+                     dmsg.x = 0;
+                     dmsg.y = 0;
+                     dmsg.index_atom = FRAME_DISPLAY_INFO 
(f)->Xatom_XdndSelection;
+                     dmsg.source_window = FRAME_X_WINDOW (f);
+
+                     x_dnd_send_xm_leave_for_drop (FRAME_DISPLAY_INFO (f), f,
+                                                   x_dnd_last_seen_window,
+                                                   
xg_pending_quit_event.timestamp);
+                     xm_send_drop_message (FRAME_DISPLAY_INFO (f), 
FRAME_X_WINDOW (f),
+                                           x_dnd_last_seen_window, &dmsg);
+                   }
 
-             if (x_dnd_use_toplevels)
-               x_dnd_free_toplevels ();
+                 x_dnd_end_window = x_dnd_last_seen_window;
+                 x_dnd_last_seen_window = None;
+                 x_dnd_last_seen_toplevel = None;
+                 x_dnd_in_progress = false;
+                 x_dnd_frame = NULL;
+               }
 
+             x_dnd_waiting_for_finish = false;
              x_dnd_return_frame_object = NULL;
              x_dnd_movement_frame = NULL;
 
              FRAME_DISPLAY_INFO (f)->grabbed = 0;
-#ifdef USE_GTK
              current_hold_quit = NULL;
-#endif
+
+             block_input ();
              /* Restore the old event mask.  */
              XSelectInput (FRAME_X_DISPLAY (f),
                            FRAME_DISPLAY_INFO (f)->root_window,
@@ -10150,9 +11463,17 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
              if (x_dnd_motif_setup_p)
                XDeleteProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
                                 FRAME_DISPLAY_INFO (f)->Xatom_XdndSelection);
+
+
+             /* Remove any type list set as well.  */
+             if (x_dnd_init_type_lists && x_dnd_n_targets > 3)
+               XDeleteProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+                                FRAME_DISPLAY_INFO (f)->Xatom_XdndTypeList);
+             unblock_input ();
+
              quit ();
            }
-#ifndef USE_GTK
+#else
        }
       else
        {
@@ -10165,7 +11486,6 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
 #endif
     }
 
-  x_set_dnd_targets (NULL, 0);
   x_dnd_waiting_for_finish = false;
 
 #ifdef USE_GTK
@@ -10187,6 +11507,11 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
   if (x_dnd_motif_setup_p)
     XDeleteProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
                     FRAME_DISPLAY_INFO (f)->Xatom_XdndSelection);
+
+  /* Remove any type list set as well.  */
+  if (x_dnd_init_type_lists && x_dnd_n_targets > 3)
+    XDeleteProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+                    FRAME_DISPLAY_INFO (f)->Xatom_XdndTypeList);
   unblock_input ();
 
   if (x_dnd_return_frame == 3
@@ -10202,45 +11527,43 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time 
time, Atom xaction,
 
       XSETFRAME (action, x_dnd_return_frame_object);
       x_dnd_return_frame_object = NULL;
-      return action;
+
+      return unbind_to (base, action);
     }
 
   x_dnd_return_frame_object = NULL;
-
-  if (x_dnd_use_toplevels)
-    x_dnd_free_toplevels ();
   FRAME_DISPLAY_INFO (f)->grabbed = 0;
 
-  /* Emacs can't respond to DND events inside the nested event
-     loop, so when dragging items to itself, always return
-     XdndActionPrivate.  */
-  if (x_dnd_end_window != None
-      && (any = x_any_window_to_frame (FRAME_DISPLAY_INFO (f),
-                                      x_dnd_end_window))
-      && (allow_current_frame || any != f))
-    return QXdndActionPrivate;
+  if (!NILP (x_dnd_action_symbol))
+    return unbind_to (base, x_dnd_action_symbol);
 
   if (x_dnd_action != None)
     {
       block_input ();
       x_catch_errors (FRAME_X_DISPLAY (f));
-      atom_name = XGetAtomName (FRAME_X_DISPLAY (f),
-                               x_dnd_action);
-      x_uncatch_errors ();
+      atom_name = x_get_atom_name (FRAME_DISPLAY_INFO (f),
+                                  x_dnd_action, &need_sync);
+
+      if (need_sync)
+       x_uncatch_errors ();
+      else
+       /* No protocol request actually happened, so avoid the extra
+          sync by calling x_uncatch_errors_after_check instead.  */
+       x_uncatch_errors_after_check ();
 
       if (atom_name)
        {
          action = intern (atom_name);
-         XFree (atom_name);
+         xfree (atom_name);
        }
       else
        action = Qnil;
       unblock_input ();
 
-      return action;
+      return unbind_to (base, action);
     }
 
-  return Qnil;
+  return unbind_to (base, Qnil);
 }
 
 /* The focus may have changed.  Figure out if it is a real focus change,
@@ -10780,6 +12103,80 @@ x_note_mouse_movement (struct frame *frame, const 
XMotionEvent *event,
   return false;
 }
 
+/* Get a sibling below WINDOW on DPY at PARENT_X and PARENT_Y.  */
+static Window
+x_get_window_below (Display *dpy, Window window,
+                   int parent_x, int parent_y,
+                   int *inner_x, int *inner_y)
+{
+  int rc, i, cx, cy;
+  XWindowAttributes attrs;
+  unsigned int nchildren;
+  Window root, parent, *children, value;
+  bool window_seen;
+
+  /* TODO: rewrite to have less dependencies.  */
+
+  children = NULL;
+  window_seen = false;
+  value = None;
+
+  rc = XQueryTree (dpy, window, &root, &parent,
+                  &children, &nchildren);
+
+  if (rc)
+    {
+      if (children)
+       XFree (children);
+
+      rc = XQueryTree (dpy, parent, &root,
+                      &parent, &children, &nchildren);
+    }
+
+  if (rc)
+    {
+      for (i = nchildren - 1; i >= 0; --i)
+       {
+         if (children[i] == window)
+           {
+             window_seen = true;
+             continue;
+           }
+
+         if (!window_seen)
+           continue;
+
+         rc = XGetWindowAttributes (dpy, children[i], &attrs);
+
+         if (rc && attrs.map_state != IsViewable)
+           continue;
+
+         if (rc && parent_x >= attrs.x
+             && parent_y >= attrs.y
+             && parent_x < attrs.x + attrs.width
+             && parent_y < attrs.y + attrs.height)
+           {
+             value = children[i];
+             cx = parent_x - attrs.x;
+             cy = parent_y - attrs.y;
+
+             break;
+           }
+       }
+    }
+
+  if (children)
+    XFree (children);
+
+  if (value)
+    {
+      *inner_x = cx;
+      *inner_y = cy;
+    }
+
+  return value;
+}
+
 /* Return the current position of the mouse.
    *FP should be a frame which indicates which display to ask about.
 
@@ -10805,8 +12202,9 @@ XTmouse_position (struct frame **fp, int insist, 
Lisp_Object *bar_window,
                  enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y,
                  Time *timestamp)
 {
-  struct frame *f1;
+  struct frame *f1, *maybe_tooltip;
   struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp);
+  bool unrelated_tooltip;
 
   block_input ();
 
@@ -10861,9 +12259,11 @@ XTmouse_position (struct frame **fp, int insist, 
Lisp_Object *bar_window,
        Window first_win = 0;
 #endif
        int win_x, win_y;
-       int parent_x = 0, parent_y = 0;
+       int parent_x, parent_y;
 
        win = root;
+       parent_x = root_x;
+       parent_y = root_y;
 
        /* XTranslateCoordinates can get errors if the window
           structure is changing at the same time this function
@@ -10898,6 +12298,22 @@ XTmouse_position (struct frame **fp, int insist, 
Lisp_Object *bar_window,
                                       root_x, root_y, &win_x, &win_y,
                                       /* Child of win.  */
                                       &child);
+
+               /* If CHILD is a tooltip frame, look below it if
+                  track-mouse is drag-source.  */
+               if (child != None
+                   && (EQ (track_mouse, Qdrag_source)
+                       || EQ (track_mouse, Qdropping)))
+                 {
+                   maybe_tooltip = x_tooltip_window_to_frame (dpyinfo, child,
+                                                              
&unrelated_tooltip);
+
+                   if (maybe_tooltip || unrelated_tooltip)
+                     child = x_get_window_below (dpyinfo->display, child,
+                                                 parent_x, parent_y, &win_x,
+                                                 &win_y);
+                 }
+
                if (child == None || child == win)
                  {
 #ifdef USE_GTK
@@ -13695,6 +15111,13 @@ x_filter_event (struct x_display_info *dpyinfo, XEvent 
*event)
       result = xg_filter_key (f1, event);
       unblock_input ();
 
+      /* Clear `xg_pending_quit_event' so we don't end up reacting to quit
+        events sent outside the main event loop (i.e. those sent from
+        inside a popup menu event loop).  */
+
+      if (popup_activated ())
+       xg_pending_quit_event.kind = NO_EVENT;
+
       if (result && f1)
        /* There will probably be a GDK event generated soon, so
           exercise the wire to make pselect return.  */
@@ -13900,6 +15323,132 @@ mouse_or_wdesc_frame (struct x_display_info *dpyinfo, 
int wdesc)
     }
 }
 
+static void
+x_dnd_compute_tip_xy (int *root_x, int *root_y, Lisp_Object attributes)
+{
+  Lisp_Object monitor, geometry;
+  int min_x, min_y, max_x, max_y;
+  int width, height;
+
+  width = FRAME_PIXEL_WIDTH (XFRAME (tip_frame));
+  height = FRAME_PIXEL_HEIGHT (XFRAME (tip_frame));
+
+  max_y = -1;
+
+  /* Try to determine the monitor where the mouse pointer is and
+     its geometry.  See bug#22549.  */
+  while (CONSP (attributes))
+    {
+      monitor = XCAR (attributes);
+      geometry = assq_no_quit (Qgeometry, monitor);
+
+      if (CONSP (geometry))
+       {
+         min_x = XFIXNUM (Fnth (make_fixnum (1), geometry));
+         min_y = XFIXNUM (Fnth (make_fixnum (2), geometry));
+         max_x = min_x + XFIXNUM (Fnth (make_fixnum (3), geometry));
+         max_y = min_y + XFIXNUM (Fnth (make_fixnum (4), geometry));
+
+         if (min_x <= *root_x && *root_x < max_x
+             && min_y <= *root_y && *root_y < max_y)
+           break;
+
+         max_y = -1;
+       }
+
+      attributes = XCDR (attributes);
+    }
+
+  /* It was not possible to determine the monitor's geometry, so we
+     assign some sane defaults here: */
+  if (max_y < 0)
+    {
+      min_x = 0;
+      min_y = 0;
+      max_x = x_display_pixel_width (FRAME_DISPLAY_INFO (x_dnd_frame));
+      max_y = x_display_pixel_height (FRAME_DISPLAY_INFO (x_dnd_frame));
+    }
+
+  if (*root_y + XFIXNUM (tip_dy) <= min_y)
+    *root_y = min_y; /* Can happen for negative dy */
+  else if (*root_y + XFIXNUM (tip_dy) + height <= max_y)
+    /* It fits below the pointer */
+    *root_y += XFIXNUM (tip_dy);
+  else if (height + XFIXNUM (tip_dy) + min_y <= *root_y)
+    /* It fits above the pointer.  */
+    *root_y -= height + XFIXNUM (tip_dy);
+  else
+    /* Put it on the top.  */
+    *root_y = min_y;
+
+  if (*root_x + XFIXNUM (tip_dx) <= min_x)
+    *root_x = 0; /* Can happen for negative dx */
+  else if (*root_x + XFIXNUM (tip_dx) + width <= max_x)
+    /* It fits to the right of the pointer.  */
+    *root_x += XFIXNUM (tip_dx);
+  else if (width + XFIXNUM (tip_dx) + min_x <= *root_x)
+    /* It fits to the left of the pointer.  */
+    *root_x -= width + XFIXNUM (tip_dx);
+  else
+    /* Put it left justified on the screen -- it ought to fit that way.  */
+    *root_x = min_x;
+}
+
+static void
+x_dnd_update_tooltip_position (int root_x, int root_y)
+{
+  struct frame *tip_f;
+
+  if (!x_dnd_in_progress || !x_dnd_update_tooltip)
+    return;
+
+  if (!FRAMEP (tip_frame))
+    return;
+
+  tip_f = XFRAME (tip_frame);
+
+  if (!FRAME_LIVE_P (tip_f)
+      || !FRAME_VISIBLE_P (tip_f)
+      || (FRAME_X_DISPLAY (tip_f)
+         != FRAME_X_DISPLAY (x_dnd_frame)))
+    return;
+
+  if (tip_window != None
+      && FIXNUMP (tip_dx) && FIXNUMP (tip_dy))
+    {
+      x_dnd_compute_tip_xy (&root_x, &root_y,
+                           x_dnd_monitors);
+
+      XMoveWindow (FRAME_X_DISPLAY (x_dnd_frame),
+                  tip_window, root_x, root_y);
+    }
+}
+
+static void
+x_dnd_update_tooltip_now (void)
+{
+  int root_x, root_y;
+  Window root, child;
+  int win_x, win_y;
+  unsigned int mask;
+  Bool rc;
+  struct x_display_info *dpyinfo;
+
+  if (!x_dnd_in_progress || !x_dnd_update_tooltip)
+    return;
+
+  dpyinfo = FRAME_DISPLAY_INFO (x_dnd_frame);
+
+  rc = XQueryPointer (dpyinfo->display,
+                     dpyinfo->root_window,
+                     &root, &child, &root_x,
+                     &root_y, &win_x, &win_y,
+                     &mask);
+
+  if (rc)
+    x_dnd_update_tooltip_position (root_x, root_y);
+}
+
 /* Get the window underneath the pointer, see if it moved, and update
    the DND state accordingly.  */
 static void
@@ -13912,6 +15461,7 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
   xm_top_level_enter_message emsg;
   xm_drag_motion_message dmsg;
   xm_drop_start_message dsmsg;
+  bool was_frame;
 
   if (XQueryPointer (dpyinfo->display,
                     dpyinfo->root_window,
@@ -13922,7 +15472,8 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
     {
       target = x_dnd_get_target_window (dpyinfo, root_x,
                                        root_y, &target_proto,
-                                       &motif_style, &toplevel);
+                                       &motif_style, &toplevel,
+                                       &was_frame);
 
       if (toplevel != x_dnd_last_seen_toplevel)
        {
@@ -13939,6 +15490,7 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
                x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
              else if (x_dnd_last_seen_window != None
                       && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
+                      && !x_dnd_disable_motif_drag
                       && x_dnd_last_seen_window != FRAME_OUTER_WINDOW 
(x_dnd_frame))
                {
                  if (!x_dnd_motif_setup_p)
@@ -13978,6 +15530,7 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
            x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
          else if (x_dnd_last_seen_window != None
                   && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
+                  && !x_dnd_disable_motif_drag
                   && x_dnd_last_seen_window != FRAME_OUTER_WINDOW 
(x_dnd_frame))
            {
              if (!x_dnd_motif_setup_p)
@@ -13999,11 +15552,13 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
          x_dnd_last_seen_window = target;
          x_dnd_last_protocol_version = target_proto;
          x_dnd_last_motif_style = motif_style;
+         x_dnd_last_window_is_frame = was_frame;
 
          if (target != None && x_dnd_last_protocol_version != -1)
            x_dnd_send_enter (x_dnd_frame, target,
                              x_dnd_last_protocol_version);
-         else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC 
(x_dnd_last_motif_style))
+         else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC 
(x_dnd_last_motif_style)
+                  && !x_dnd_disable_motif_drag)
            {
              if (!x_dnd_motif_setup_p)
                xm_setup_drag_info (dpyinfo, x_dnd_frame);
@@ -14022,7 +15577,9 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
            }
        }
 
-      if (x_dnd_last_protocol_version != -1 && target != None)
+      if (x_dnd_last_window_is_frame && target != None)
+       x_dnd_note_self_position (dpyinfo, target, root_x, root_y);
+      else if (x_dnd_last_protocol_version != -1 && target != None)
        x_dnd_send_position (x_dnd_frame, target,
                             x_dnd_last_protocol_version,
                             root_x, root_y,
@@ -14034,7 +15591,8 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
                             0
 #endif
                             );
-      else if (XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) && target != 
None)
+      else if (XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) && target != 
None
+              && !x_dnd_disable_motif_drag)
        {
          if (!x_dnd_motif_setup_p)
            xm_setup_drag_info (dpyinfo, x_dnd_frame);
@@ -14045,9 +15603,7 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
          dmsg.side_effects
            = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action (dpyinfo,
                                                               
x_dnd_wanted_action),
-                                  XM_DROP_SITE_VALID,
-                                  xm_side_effect_from_action (dpyinfo,
-                                                              
x_dnd_wanted_action),
+                                  XM_DROP_SITE_VALID, x_dnd_motif_operations,
                                   (!x_dnd_xm_use_help
                                    ? XM_DROP_ACTION_DROP
                                    : XM_DROP_ACTION_DROP_HELP));
@@ -14059,6 +15615,8 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
            xm_send_drag_motion_message (dpyinfo, FRAME_X_WINDOW (x_dnd_frame),
                                         target, &dmsg);
        }
+
+      x_dnd_update_tooltip_position (root_x, root_y);
     }
   /* The pointer moved out of the screen.  */
   else if (x_dnd_last_protocol_version != -1)
@@ -14079,9 +15637,7 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
          dsmsg.side_effects
            = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action (dpyinfo,
                                                               
x_dnd_wanted_action),
-                                  XM_DROP_SITE_VALID,
-                                  xm_side_effect_from_action (dpyinfo,
-                                                              
x_dnd_wanted_action),
+                                  XM_DROP_SITE_VALID, x_dnd_motif_operations,
                                   XM_DROP_ACTION_DROP_CANCEL);
          dsmsg.x = 0;
          dsmsg.y = 0;
@@ -14104,6 +15660,236 @@ x_dnd_update_state (struct x_display_info *dpyinfo, 
Time timestamp)
     }
 }
 
+int
+x_display_pixel_height (struct x_display_info *dpyinfo)
+{
+  if (dpyinfo->screen_height)
+    return dpyinfo->screen_height;
+
+  return HeightOfScreen (dpyinfo->screen);
+}
+
+int
+x_display_pixel_width (struct x_display_info *dpyinfo)
+{
+  if (dpyinfo->screen_width)
+    return dpyinfo->screen_width;
+
+  return WidthOfScreen (dpyinfo->screen);
+}
+
+/* Handle events from each display until CELL's car becomes non-nil,
+   or TIMEOUT elapses.  */
+void
+x_wait_for_cell_change (Lisp_Object cell, struct timespec timeout)
+{
+  struct x_display_info *dpyinfo;
+  fd_set fds;
+  int fd, maxfd;
+#ifndef USE_GTK
+  int finish, rc;
+  XEvent event;
+  fd_set rfds;
+#endif
+  struct input_event hold_quit;
+  struct timespec current, at;
+
+  at = timespec_add (current_timespec (), timeout);
+
+#ifndef USE_GTK
+  FD_ZERO (&rfds);
+  rc = -1;
+#endif
+
+  while (true)
+    {
+      FD_ZERO (&fds);
+      maxfd = -1;
+
+      for (dpyinfo = x_display_list; dpyinfo;
+          dpyinfo = dpyinfo->next)
+       {
+         fd = ConnectionNumber (dpyinfo->display);
+
+#ifndef USE_GTK
+         if ((rc < 0 || FD_ISSET (fd, &rfds))
+             /* If pselect failed, the erroring display's IO error
+                handler will eventually be called.  */
+             && XPending (dpyinfo->display))
+           {
+             while (XPending (dpyinfo->display))
+               {
+                 EVENT_INIT (hold_quit);
+
+                 XNextEvent (dpyinfo->display, &event);
+                 handle_one_xevent (dpyinfo, &event,
+                                    &finish, &hold_quit);
+
+                 if (!NILP (XCAR (cell)))
+                   return;
+
+                 if (finish == X_EVENT_GOTO_OUT)
+                   break;
+
+                 /* Make us quit now.  */
+                 if (hold_quit.kind != NO_EVENT)
+                   kbd_buffer_store_event (&hold_quit);
+               }
+           }
+#endif
+
+         if (fd > maxfd)
+           maxfd = fd;
+
+         eassert (fd < FD_SETSIZE);
+         FD_SET (fd, &fds);
+       }
+
+      /* Prevent events from being lost (from GTK's point of view) by
+        using GDK to run the event loop.  */
+#ifdef USE_GTK
+      while (gtk_events_pending ())
+       {
+         EVENT_INIT (hold_quit);
+         current_count = 0;
+         current_hold_quit = &hold_quit;
+         current_finish = X_EVENT_NORMAL;
+
+         gtk_main_iteration ();
+
+         current_count = -1;
+         current_hold_quit = NULL;
+
+         /* Make us quit now.  */
+         if (hold_quit.kind != NO_EVENT)
+           kbd_buffer_store_event (&hold_quit);
+
+         if (!NILP (XCAR (cell)))
+           return;
+
+         if (current_finish == X_EVENT_GOTO_OUT)
+           break;
+       }
+#endif
+
+      eassert (maxfd >= 0);
+
+      current = current_timespec ();
+
+      if (timespec_cmp (at, current) < 0
+         || !NILP (XCAR (cell)))
+       return;
+
+      timeout = timespec_sub (at, current);
+
+#ifndef USE_GTK
+      rc = pselect (maxfd + 1, &fds, NULL, NULL, &timeout, NULL);
+
+      if (rc >= 0)
+       rfds = fds;
+#else
+      pselect (maxfd + 1, &fds, NULL, NULL, &timeout, NULL);
+#endif
+    }
+}
+
+#ifdef USE_GTK
+static void
+x_monitors_changed_cb (GdkScreen *gscr, gpointer user_data)
+{
+  struct x_display_info *dpyinfo;
+  struct input_event ie;
+  Lisp_Object current_monitors, terminal;
+  GdkDisplay *gdpy;
+  Display *dpy;
+
+  gdpy = gdk_screen_get_display (gscr);
+  dpy = gdk_x11_display_get_xdisplay (gdpy);
+  dpyinfo = x_display_info_for_display (dpy);
+
+  if (!dpyinfo)
+    return;
+
+  XSETTERMINAL (terminal, dpyinfo->terminal);
+
+  current_monitors
+    = Fx_display_monitor_attributes_list (terminal);
+
+  if (NILP (Fequal (current_monitors,
+                   dpyinfo->last_monitor_attributes_list)))
+    {
+      EVENT_INIT (ie);
+      ie.kind = MONITORS_CHANGED_EVENT;
+      ie.arg = terminal;
+
+      kbd_buffer_store_event (&ie);
+
+      if (x_dnd_in_progress && x_dnd_update_tooltip)
+       x_dnd_monitors = current_monitors;
+
+      x_dnd_update_tooltip_now ();
+    }
+
+  dpyinfo->last_monitor_attributes_list = current_monitors;
+}
+#endif
+
+/* Extract the root window coordinates from the client message EVENT
+   if it is a message that we already understand.  Return false if the
+   event was not understood.  */
+static bool
+x_coords_from_dnd_message (struct x_display_info *dpyinfo,
+                          XEvent *event, int *x_out, int *y_out)
+{
+  xm_drag_motion_message dmsg;
+  xm_drop_start_message smsg;
+  xm_drop_start_reply reply;
+
+  if (event->type != ClientMessage)
+    return false;
+
+  if (event->xclient.message_type == dpyinfo->Xatom_XdndPosition)
+    {
+      if (event->xclient.format != 32)
+       return false;
+
+      *x_out = (((unsigned long) event->xclient.data.l[2]) >> 16
+               & 0xffff);
+      *y_out = (event->xclient.data.l[2] & 0xffff);
+
+      return true;
+    }
+
+  if ((event->xclient.message_type
+       == dpyinfo->Xatom_MOTIF_DRAG_AND_DROP_MESSAGE)
+      && event->xclient.format == 8)
+    {
+      if (!xm_read_drag_motion_message (event, &dmsg))
+       {
+         *x_out = dmsg.x;
+         *y_out = dmsg.y;
+
+         return true;
+       }
+      else if (!xm_read_drop_start_message (event, &smsg))
+       {
+         *x_out = smsg.x;
+         *y_out = smsg.y;
+
+         return true;
+       }
+      else if (!xm_read_drop_start_reply (event, &reply))
+       {
+         *x_out = reply.better_x;
+         *y_out = reply.better_y;
+
+         return true;
+       }
+    }
+
+  return false;
+}
+
 /* Handles the XEvent EVENT on display DPYINFO.
 
    *FINISH is X_EVENT_GOTO_OUT if caller should stop reading events.
@@ -14146,6 +15932,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
   GdkEvent *copy = NULL;
   GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (dpyinfo->display);
 #endif
+  int dx, dy;
+  USE_SAFE_ALLOCA;
 
   *finish = X_EVENT_NORMAL;
 
@@ -14176,11 +15964,14 @@ handle_one_xevent (struct x_display_info *dpyinfo,
     {
     case ClientMessage:
       {
+       int rc;
+
        if (x_dnd_in_progress
            && FRAME_DISPLAY_INFO (x_dnd_frame) == dpyinfo
            && event->xclient.message_type == dpyinfo->Xatom_XdndStatus)
          {
            Window target;
+           unsigned long r1, r2;
 
            target = event->xclient.data.l[0];
 
@@ -14188,11 +15979,14 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                && target == x_dnd_last_seen_window
                && event->xclient.data.l[1] & 2)
              {
+               r1 = event->xclient.data.l[2];
+               r2 = event->xclient.data.l[2];
+
                x_dnd_mouse_rect_target = target;
-               x_dnd_mouse_rect.x = (event->xclient.data.l[2] & 0xffff0000) >> 
16;
-               x_dnd_mouse_rect.y = (event->xclient.data.l[2] & 0xffff);
-               x_dnd_mouse_rect.width = (event->xclient.data.l[3] & 
0xffff0000) >> 16;
-               x_dnd_mouse_rect.height = (event->xclient.data.l[3] & 0xffff);
+               x_dnd_mouse_rect.x = (r1 & 0xffff0000) >> 16;
+               x_dnd_mouse_rect.y = (r1 & 0xffff);
+               x_dnd_mouse_rect.width = (r2 & 0xffff0000) >> 16;
+               x_dnd_mouse_rect.height = (r2 & 0xffff);
              }
            else
              x_dnd_mouse_rect_target = None;
@@ -14377,25 +16171,23 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
 
            if (event->xclient.data.l[0] == dpyinfo->Xatom_net_wm_ping
+               /* Handling window stacking changes during
+                  drag-and-drop requires Emacs to select for
+                  SubstructureNotifyMask, which in turn causes the
+                  message to be sent to Emacs itself using the event
+                  mask specified by the EWMH.  To avoid an infinite
+                  loop, make sure the client message's window is not
+                  the root window if DND is in progress.  */
+               && (!(x_dnd_in_progress
+                     || x_dnd_waiting_for_finish)
+                   || event->xclient.window != dpyinfo->root_window)
                && event->xclient.format == 32)
              {
                XEvent send_event = *event;
 
                send_event.xclient.window = dpyinfo->root_window;
                XSendEvent (dpyinfo->display, dpyinfo->root_window, False,
-                           /* FIXME: handling window stacking changes
-                              during drag-and-drop requires Emacs to
-                              select for SubstructureNotifyMask,
-                              which in turn causes the message to be
-                              sent to Emacs itself using the event
-                              mask specified by the EWMH.  To avoid
-                              an infinite loop, just use
-                              SubstructureRedirectMask when a
-                              drag-and-drop operation is in
-                              progress.  */
-                           ((x_dnd_in_progress || x_dnd_waiting_for_finish)
-                            ? SubstructureRedirectMask
-                            : SubstructureRedirectMask | 
SubstructureNotifyMask),
+                           SubstructureRedirectMask | SubstructureNotifyMask,
                            &send_event);
 
                *finish = X_EVENT_DROP;
@@ -14435,17 +16227,21 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                    *finish = X_EVENT_DROP;
 #else
                    widget = FRAME_GTK_OUTER_WIDGET (f);
+                   window = gtk_widget_get_window (widget);
+                   eassert (window);
+
+                   /* This could be a (former) child frame for which
+                      frame synchronization was disabled.  Enable it
+                      now.  */
+                   gdk_x11_window_set_frame_sync_enabled (window, TRUE);
 
                    if (widget && !FRAME_X_OUTPUT (f)->xg_sync_end_pending_p)
                      {
-                       window = gtk_widget_get_window (widget);
-                       eassert (window);
                        frame_clock = gdk_window_get_frame_clock (window);
                        eassert (frame_clock);
 
                        gdk_frame_clock_request_phase (frame_clock,
                                                       
GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT);
-
                        FRAME_X_OUTPUT (f)->xg_sync_end_pending_p = true;
                      }
 #endif
@@ -14503,7 +16299,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              goto OTHER;
 #ifndef USE_CAIRO
             Pixmap pixmap = (Pixmap) event->xclient.data.l[1];
+           /* FIXME: why does this sometimes generate a BadMatch
+              error?  */
+           x_catch_errors (dpyinfo->display);
             x_kill_gs_process (pixmap, f);
+           x_uncatch_errors ();
             expose_frame (f, 0, 0, 0, 0);
 #endif /* !USE_CAIRO */
            goto done;
@@ -14542,24 +16342,34 @@ handle_one_xevent (struct x_display_info *dpyinfo,
        f = any;
        if (!f)
          goto OTHER;
-       if (x_handle_dnd_message (f, &event->xclient, dpyinfo, &inev.ie))
+
+       /* These values are always used initialized, but GCC doesn't
+          know that.  */
+       dx = 0;
+       dy = 0;
+
+       rc = x_coords_from_dnd_message (dpyinfo, (XEvent *) event,
+                                       &dx, &dy);
+
+       if (x_handle_dnd_message (f, &event->xclient, dpyinfo, &inev.ie,
+                                 rc, dx, dy))
          *finish = X_EVENT_DROP;
       }
       break;
 
     case SelectionNotify:
-#ifdef USE_X_TOOLKIT
-      if (! x_window_to_frame (dpyinfo, event->xselection.requestor))
+#if defined USE_X_TOOLKIT || defined USE_GTK
+      if (!x_window_to_frame (dpyinfo, event->xselection.requestor))
         goto OTHER;
-#endif /* not USE_X_TOOLKIT */
+#endif /* not USE_X_TOOLKIT and not USE_GTK */
       x_handle_selection_notify (&event->xselection);
       break;
 
     case SelectionClear:       /* Someone has grabbed ownership.  */
-#ifdef USE_X_TOOLKIT
-      if (! x_window_to_frame (dpyinfo, event->xselectionclear.window))
+#if defined USE_X_TOOLKIT || defined USE_GTK
+      if (!x_window_to_frame (dpyinfo, event->xselectionclear.window))
         goto OTHER;
-#endif /* USE_X_TOOLKIT */
+#endif /* not USE_X_TOOLKIT and not USE_GTK */
       {
         const XSelectionClearEvent *eventp = &event->xselectionclear;
 
@@ -14567,6 +16377,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
         SELECTION_EVENT_DPYINFO (&inev.sie) = dpyinfo;
         SELECTION_EVENT_SELECTION (&inev.sie) = eventp->selection;
         SELECTION_EVENT_TIME (&inev.sie) = eventp->time;
+
+       if (x_use_pending_selection_requests)
+         {
+           x_push_selection_request (&inev.sie);
+           EVENT_INIT (inev.ie);
+         }
       }
       break;
 
@@ -14590,11 +16406,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
           events immediately, by setting hold_quit to the input
           event.  */
 
-       if (x_dnd_in_progress || x_dnd_waiting_for_finish)
+       if (x_use_pending_selection_requests)
          {
-           eassume (hold_quit);
-
-           *hold_quit = inev.ie;
+           x_push_selection_request (&inev.sie);
            EVENT_INIT (inev.ie);
          }
 
@@ -14604,7 +16418,14 @@ handle_one_xevent (struct x_display_info *dpyinfo,
            && eventp->selection == dpyinfo->Xatom_XdndSelection
            && (eventp->target == dpyinfo->Xatom_XmTRANSFER_SUCCESS
                || eventp->target == dpyinfo->Xatom_XmTRANSFER_FAILURE))
-         x_dnd_waiting_for_finish = false;
+         {
+           x_dnd_waiting_for_finish = false;
+
+           /* If the transfer failed, then return nil from
+              `x-begin-drag'.  */
+           if (eventp->target == dpyinfo->Xatom_XmTRANSFER_FAILURE)
+             x_dnd_action = None;
+         }
       }
       break;
 
@@ -14625,7 +16446,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                  unsigned long nitems, bytesafter;
                  unsigned char *data = NULL;
 
-
                  if (event->xproperty.state == PropertyDelete)
                    {
                      if (!last)
@@ -14714,6 +16534,107 @@ handle_one_xevent (struct x_display_info *dpyinfo,
            }
        }
 
+      if (f && FRAME_X_OUTPUT (f)->alpha_identical_p
+         && (event->xproperty.atom
+             == dpyinfo->Xatom_net_wm_window_opacity))
+       {
+#ifndef USE_XCB
+         int rc, actual_format;
+         Atom actual;
+         unsigned char *tmp_data;
+         unsigned long n, left, opacity;
+
+         tmp_data = NULL;
+#else
+         xcb_get_property_cookie_t opacity_cookie;
+         xcb_get_property_reply_t *opacity_reply;
+         xcb_generic_error_t *error;
+         bool rc;
+         uint32_t value;
+#endif
+
+         if (event->xproperty.state == PropertyDelete)
+           {
+             f->alpha[0] = 1.0;
+             f->alpha[1] = 1.0;
+
+             store_frame_param (f, Qalpha, Qnil);
+           }
+         else
+           {
+#ifndef USE_XCB
+             rc = XGetWindowProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f),
+                                      dpyinfo->Xatom_net_wm_window_opacity,
+                                      0, 1, False, AnyPropertyType, &actual,
+                                      &actual_format, &n, &left, &tmp_data);
+
+             if (rc == Success && actual_format == 32
+                 && (actual == XA_CARDINAL
+                     /* Some broken programs set the opacity property
+                        to those types, but window managers accept
+                        them anyway.  */
+                     || actual == XA_ATOM
+                     || actual == XA_WINDOW) && n)
+               {
+                 opacity = *(unsigned long *) tmp_data & OPAQUE;
+                 f->alpha[0] = (double) opacity / (double) OPAQUE;
+                 f->alpha[1] = (double) opacity / (double) OPAQUE;
+
+                 store_frame_param (f, Qalpha, make_float (f->alpha[0]));
+               }
+             else
+               {
+                 f->alpha[0] = 1.0;
+                 f->alpha[1] = 1.0;
+
+                 store_frame_param (f, Qalpha, Qnil);
+               }
+#else
+             opacity_cookie
+               = xcb_get_property (dpyinfo->xcb_connection, 0,
+                                   (xcb_window_t) FRAME_OUTER_WINDOW (f),
+                                   (xcb_atom_t) 
dpyinfo->Xatom_net_wm_window_opacity,
+                                   XCB_ATOM_CARDINAL, 0, 1);
+             opacity_reply
+               = xcb_get_property_reply (dpyinfo->xcb_connection,
+                                         opacity_cookie, &error);
+
+             if (!opacity_reply)
+               free (error), rc = false;
+             else
+               rc = (opacity_reply->format == 32
+                     && (opacity_reply->type == XCB_ATOM_CARDINAL
+                         || opacity_reply->type == XCB_ATOM_ATOM
+                         || opacity_reply->type == XCB_ATOM_WINDOW)
+                     && (xcb_get_property_value_length (opacity_reply) >= 4));
+
+             if (rc)
+               {
+                 value = *(uint32_t *) xcb_get_property_value (opacity_reply);
+
+                 f->alpha[0] = (double) value / (double) OPAQUE;
+                 f->alpha[1] = (double) value / (double) OPAQUE;
+                 store_frame_param (f, Qalpha, make_float (f->alpha[0]));
+               }
+             else
+               {
+                 f->alpha[0] = 1.0;
+                 f->alpha[1] = 1.0;
+
+                 store_frame_param (f, Qalpha, Qnil);
+               }
+
+             if (opacity_reply)
+               free (opacity_reply);
+#endif
+           }
+
+#ifndef USE_XCB
+         if (tmp_data)
+           XFree (tmp_data);
+#endif
+       }
+
       if (event->xproperty.window == dpyinfo->root_window
          && (event->xproperty.atom == dpyinfo->Xatom_net_client_list_stacking
              || event->xproperty.atom == dpyinfo->Xatom_net_current_desktop)
@@ -14722,11 +16643,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
        {
          if (x_dnd_use_toplevels)
            {
-             x_dnd_free_toplevels ();
+             x_dnd_free_toplevels (true);
 
              if (x_dnd_compute_toplevels (dpyinfo))
                {
-                 x_dnd_free_toplevels ();
+                 x_dnd_free_toplevels (true);
                  x_dnd_use_toplevels = false;
                }
            }
@@ -15223,9 +17144,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
             memset (&compose_status, 0, sizeof (compose_status));
 
 #ifdef HAVE_XKB
-         if (FRAME_DISPLAY_INFO (f)->xkb_desc)
+         if (dpyinfo->xkb_desc)
            {
-             XkbDescRec *rec = FRAME_DISPLAY_INFO (f)->xkb_desc;
+             XkbDescRec *rec = dpyinfo->xkb_desc;
 
              if (rec->map->modmap && rec->map->modmap[xkey.keycode])
                goto done_keysym;
@@ -15256,7 +17177,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
               if (status_return == XBufferOverflow)
                 {
                   copy_bufsiz = nbytes + 1;
-                  copy_bufptr = alloca (copy_bufsiz);
+                  copy_bufptr = SAFE_ALLOCA (copy_bufsiz);
                   nbytes = XmbLookupString (FRAME_XIC (f),
                                             &xkey, (char *) copy_bufptr,
                                             copy_bufsiz, &keysym,
@@ -15594,7 +17515,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
       if (f && x_mouse_click_focus_ignore_position)
        {
-         ignore_next_mouse_click_timeout = event->xmotion.time + 200;
+         ignore_next_mouse_click_timeout = (event->xmotion.time
+                                            + x_mouse_click_focus_ignore_time);
          mouse_click_timeout_display = dpyinfo;
        }
 
@@ -15693,7 +17615,13 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              Do it only if there's something to cancel.
              Otherwise, the startup message is cleared when
              the mouse leaves the frame.  */
-          if (any_help_event_p)
+          if (any_help_event_p
+             /* But never if `mouse-drag-and-drop-region' is in
+                progress, since that results in the tooltip being
+                dismissed when the mouse moves on top.  */
+             && !((EQ (track_mouse, Qdrag_source)
+                   || EQ (track_mouse, Qdropping))
+                  && gui_mouse_grabbed (dpyinfo)))
            do_help = -1;
         }
 #ifdef USE_GTK
@@ -15724,6 +17652,13 @@ handle_one_xevent (struct x_display_info *dpyinfo,
        f = mouse_or_wdesc_frame (dpyinfo, event->xmotion.window);
 
        if (x_dnd_in_progress
+           /* Handle these events normally if the recursion
+              level is higher than when the drag-and-drop
+              operation was initiated.  This is so that mouse
+              input works while we're in the debugger for, say,
+              `x-dnd-movement-function`.  */
+           && (command_loop_level + minibuf_level
+               <= x_dnd_recursion_depth)
            && dpyinfo == FRAME_DISPLAY_INFO (x_dnd_frame))
          {
            Window target, toplevel;
@@ -15731,6 +17666,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
            xm_top_level_leave_message lmsg;
            xm_top_level_enter_message emsg;
            xm_drag_motion_message dmsg;
+           XRectangle *r;
+           bool was_frame;
+
+           /* Always clear mouse face.  */
+           clear_mouse_face (hlinfo);
+           hlinfo->mouse_face_hidden = true;
 
            /* Sometimes the drag-and-drop operation starts with the
               pointer of a frame invisible due to input.  Since
@@ -15738,13 +17679,35 @@ handle_one_xevent (struct x_display_info *dpyinfo,
               visible manually.  */
 
            if (f)
-             XTtoggle_invisible_pointer (f, false);
+             {
+               XTtoggle_invisible_pointer (f, false);
+
+               r = &dpyinfo->last_mouse_glyph;
+
+               /* Also remember the mouse glyph and set
+                  mouse_moved.  */
+               if (f != dpyinfo->last_mouse_glyph_frame
+                   || event->xmotion.x < r->x
+                   || event->xmotion.x >= r->x + r->width
+                   || event->xmotion.y < r->y
+                   || event->xmotion.y >= r->y + r->height)
+                 {
+                   f->mouse_moved = true;
+                   f->last_mouse_device = Qnil;
+                   dpyinfo->last_mouse_scroll_bar = NULL;
+
+                   remember_mouse_glyph (f, event->xmotion.x,
+                                         event->xmotion.y, r);
+                   dpyinfo->last_mouse_glyph_frame = f;
+                 }
+             }
 
            target = x_dnd_get_target_window (dpyinfo,
                                              event->xmotion.x_root,
                                              event->xmotion.y_root,
                                              &target_proto,
-                                             &motif_style, &toplevel);
+                                             &motif_style, &toplevel,
+                                             &was_frame);
 
            if (toplevel != x_dnd_last_seen_toplevel)
              {
@@ -15761,6 +17724,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                      x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
                    else if (x_dnd_last_seen_window != None
                             && XM_DRAG_STYLE_IS_DYNAMIC 
(x_dnd_last_motif_style)
+                            && !x_dnd_disable_motif_drag
                             && x_dnd_last_seen_window != FRAME_OUTER_WINDOW 
(x_dnd_frame))
                      {
                        if (!x_dnd_motif_setup_p)
@@ -15800,6 +17764,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                  x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
                else if (x_dnd_last_seen_window != None
                         && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
+                        && x_dnd_disable_motif_drag
                         && x_dnd_last_seen_window != FRAME_OUTER_WINDOW 
(x_dnd_frame))
                  {
                    if (!x_dnd_motif_setup_p)
@@ -15816,7 +17781,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                    dmsg.byteorder = XM_BYTE_ORDER_CUR_FIRST;
                    dmsg.side_effects = XM_DRAG_SIDE_EFFECT 
(xm_side_effect_from_action (dpyinfo,
                                                                                
         x_dnd_wanted_action),
-                                                            XM_DROP_SITE_NONE, 
XM_DRAG_NOOP,
+                                                            XM_DROP_SITE_NONE, 
x_dnd_motif_operations,
                                                             
XM_DROP_ACTION_DROP_CANCEL);
                    dmsg.timestamp = event->xmotion.time;
                    dmsg.x = event->xmotion.x_root;
@@ -15842,11 +17807,13 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                x_dnd_last_seen_window = target;
                x_dnd_last_protocol_version = target_proto;
                x_dnd_last_motif_style = motif_style;
+               x_dnd_last_window_is_frame = was_frame;
 
                if (target != None && x_dnd_last_protocol_version != -1)
                  x_dnd_send_enter (x_dnd_frame, target,
                                    x_dnd_last_protocol_version);
-               else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC 
(x_dnd_last_motif_style))
+               else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC 
(x_dnd_last_motif_style)
+                        && !x_dnd_disable_motif_drag)
                  {
                    if (!x_dnd_motif_setup_p)
                      xm_setup_drag_info (dpyinfo, x_dnd_frame);
@@ -15865,7 +17832,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                  }
              }
 
-           if (x_dnd_last_protocol_version != -1 && target != None)
+           if (x_dnd_last_window_is_frame && target != None)
+             x_dnd_note_self_position (dpyinfo, target,
+                                       event->xbutton.x_root,
+                                       event->xbutton.y_root);
+           else if (x_dnd_last_protocol_version != -1 && target != None)
              x_dnd_send_position (x_dnd_frame, target,
                                   x_dnd_last_protocol_version,
                                   event->xmotion.x_root,
@@ -15873,7 +17844,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                                   x_dnd_selection_timestamp,
                                   x_dnd_wanted_action, 0,
                                   event->xmotion.state);
-           else if (XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) && 
target != None)
+           else if (XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) && 
target != None
+                    && !x_dnd_disable_motif_drag)
              {
                if (!x_dnd_motif_setup_p)
                  xm_setup_drag_info (dpyinfo, x_dnd_frame);
@@ -15883,9 +17855,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                dmsg.byteorder = XM_BYTE_ORDER_CUR_FIRST;
                dmsg.side_effects = XM_DRAG_SIDE_EFFECT 
(xm_side_effect_from_action (dpyinfo,
                                                                                
     x_dnd_wanted_action),
-                                                        XM_DROP_SITE_VALID,
-                                                        
xm_side_effect_from_action (dpyinfo,
-                                                                               
     x_dnd_wanted_action),
+                                                        XM_DROP_SITE_VALID, 
x_dnd_motif_operations,
                                                         (!x_dnd_xm_use_help
                                                          ? XM_DROP_ACTION_DROP
                                                          : 
XM_DROP_ACTION_DROP_HELP));
@@ -15898,6 +17868,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                                               target, &dmsg);
              }
 
+           x_dnd_update_tooltip_position (event->xmotion.x_root,
+                                          event->xmotion.y_root);
+
            goto OTHER;
          }
 
@@ -16000,6 +17973,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
          So if this ConfigureNotify is immediately followed by another
          for the same window, use the info from the latest update, and
          consider the events all handled.  */
+
       /* Opaque resize may be trickier; ConfigureNotify events are
          mixed with Expose events for multiple windows.  */
       configureEvent = *event;
@@ -16021,6 +17995,36 @@ handle_one_xevent (struct x_display_info *dpyinfo,
            configureEvent = next_event;
         }
 
+      /* If we get a ConfigureNotify for the root window, this means
+        the dimensions of the screen it's on changed.  */
+
+      if (configureEvent.xconfigure.window == dpyinfo->root_window)
+       {
+#ifdef HAVE_XRANDR
+         /* This function is OK to call even if the X server doesn't
+            support RandR.  */
+         XRRUpdateConfiguration (&configureEvent);
+#elif !defined USE_GTK
+         /* Catch screen size changes even if RandR is not available
+            on the client.  GTK does this internally.  */
+
+         if (configureEvent.xconfigure.width != dpyinfo->screen_width
+             || configureEvent.xconfigure.height != dpyinfo->screen_height)
+           {
+             inev.ie.kind = MONITORS_CHANGED_EVENT;
+             XSETTERMINAL (inev.ie.arg, dpyinfo->terminal);
+
+             /* Store this event now since inev.ie.type could be set to
+                MOVE_FRAME_EVENT later.  */
+             kbd_buffer_store_event (&inev.ie);
+             inev.ie.kind = NO_EVENT;
+           }
+#endif
+
+         dpyinfo->screen_width = configureEvent.xconfigure.width;
+         dpyinfo->screen_height = configureEvent.xconfigure.height;
+       }
+
       if (x_dnd_in_progress && x_dnd_use_toplevels
          && dpyinfo == FRAME_DISPLAY_INFO (x_dnd_frame))
        {
@@ -16182,15 +18186,14 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 #endif
            x_net_wm_state (f, configureEvent.xconfigure.window);
 
-#ifdef USE_X_TOOLKIT
+#if defined USE_X_TOOLKIT || defined USE_GTK
           /* Tip frames are pure X window, set size for them.  */
           if (FRAME_TOOLTIP_P (f))
             {
               if (FRAME_PIXEL_HEIGHT (f) != configureEvent.xconfigure.height
                   || FRAME_PIXEL_WIDTH (f) != configureEvent.xconfigure.width)
-                {
-                  SET_FRAME_GARBAGED (f);
-                }
+               SET_FRAME_GARBAGED (f);
+
               FRAME_PIXEL_HEIGHT (f) = configureEvent.xconfigure.height;
               FRAME_PIXEL_WIDTH (f) = configureEvent.xconfigure.width;
             }
@@ -16317,8 +18320,31 @@ handle_one_xevent (struct x_display_info *dpyinfo,
        bool dnd_grab = false;
 
        if (x_dnd_in_progress
+           /* Handle these events normally if the recursion
+              level is higher than when the drag-and-drop
+              operation was initiated.  This is so that mouse
+              input works while we're in the debugger for, say,
+              `x-dnd-movement-function`.  */
+           && (command_loop_level + minibuf_level
+               <= x_dnd_recursion_depth)
            && dpyinfo == FRAME_DISPLAY_INFO (x_dnd_frame))
          {
+           f = mouse_or_wdesc_frame (dpyinfo, event->xbutton.window);
+
+           if (event->type == ButtonPress)
+             {
+               dpyinfo->grabbed |= (1 << event->xbutton.button);
+               dpyinfo->last_mouse_frame = f;
+               if (f && !tab_bar_p)
+                 f->last_tab_bar_item = -1;
+#if ! defined (USE_GTK)
+               if (f && !tool_bar_p)
+                 f->last_tool_bar_item = -1;
+#endif /* not USE_GTK */
+             }
+           else
+             dpyinfo->grabbed &= ~(1 << event->xbutton.button);
+
            if (event->xbutton.type == ButtonPress
                && x_dnd_last_seen_window != None
                && x_dnd_last_protocol_version != -1)
@@ -16350,7 +18376,26 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                    x_dnd_end_window = x_dnd_last_seen_window;
                    x_dnd_in_progress = false;
 
+                   if (x_dnd_update_tooltip
+                       && FRAMEP (tip_frame)
+                       && FRAME_LIVE_P (XFRAME (tip_frame))
+                       && (FRAME_X_DISPLAY (XFRAME (tip_frame))
+                           == FRAME_X_DISPLAY (x_dnd_frame)))
+                     Fx_hide_tip ();
+
+                   x_dnd_finish_frame = x_dnd_frame;
+
                    if (x_dnd_last_seen_window != None
+                       && x_dnd_last_window_is_frame)
+                     {
+                       x_dnd_waiting_for_finish = false;
+                       x_dnd_note_self_drop (dpyinfo,
+                                             x_dnd_last_seen_window,
+                                             event->xbutton.x_root,
+                                             event->xbutton.y_root,
+                                             event->xbutton.time);
+                     }
+                   else if (x_dnd_last_seen_window != None
                        && x_dnd_last_protocol_version != -1)
                      {
                        x_dnd_pending_finish_target = x_dnd_last_seen_window;
@@ -16386,9 +18431,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                                dmsg.side_effects
                                  = XM_DRAG_SIDE_EFFECT 
(xm_side_effect_from_action (dpyinfo,
                                                                                
     x_dnd_wanted_action),
-                                                        XM_DROP_SITE_VALID,
-                                                        
xm_side_effect_from_action (dpyinfo,
-                                                                               
     x_dnd_wanted_action),
+                                                        XM_DROP_SITE_VALID, 
x_dnd_motif_operations,
                                                         (!x_dnd_xm_use_help
                                                          ? XM_DROP_ACTION_DROP
                                                          : 
XM_DROP_ACTION_DROP_HELP));
@@ -16436,15 +18479,17 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                    x_dnd_last_motif_style = XM_DRAG_STYLE_NONE;
                    x_dnd_last_seen_window = None;
                    x_dnd_last_seen_toplevel = None;
+                   x_dnd_last_window_is_frame = false;
                    x_dnd_frame = NULL;
-                   x_set_dnd_targets (NULL, 0);
                  }
              }
 
            goto OTHER;
          }
 
-       if (x_dnd_in_progress)
+       if (x_dnd_in_progress
+           && (command_loop_level + minibuf_level
+               <= x_dnd_recursion_depth))
          goto OTHER;
 
        memset (&compose_status, 0, sizeof (compose_status));
@@ -16480,7 +18525,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
            f = x_any_window_to_frame (dpyinfo, event->xbutton.window);
 
            if (event->xbutton.button > 3
-               && event->xbutton.button < 9
+               && event->xbutton.button < 8
                && f)
              {
                if (ignore_next_mouse_click_timeout
@@ -16794,7 +18839,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              ev.window = enter->event;
              ev.time = enter->time;
 
-             x_display_set_last_user_time (dpyinfo, xi_event->time);
+             x_display_set_last_user_time (dpyinfo, enter->time);
 
 #ifdef USE_MOTIF
              use_copy = true;
@@ -16852,7 +18897,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
              if (f && x_mouse_click_focus_ignore_position)
                {
-                 ignore_next_mouse_click_timeout = xev->time + 200;
+                 ignore_next_mouse_click_timeout = (enter->time
+                                                    + 
x_mouse_click_focus_ignore_time);
                  mouse_click_timeout_display = dpyinfo;
                }
 
@@ -16896,7 +18942,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
 #ifdef USE_X_TOOLKIT
              if (popup_activated ()
-                 && leave->mode == XINotifyPassiveUngrab)
+                 && (leave->mode == XINotifyPassiveUngrab
+                     || leave->mode == XINotifyUngrab))
                any = x_any_window_to_frame (dpyinfo, leave->event);
 #endif
 
@@ -16941,7 +18988,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                                                         leave->deviceid, 
false);
 #endif
 
-             x_display_set_last_user_time (dpyinfo, xi_event->time);
+             x_display_set_last_user_time (dpyinfo, leave->time);
 
 #ifdef HAVE_XWIDGETS
              {
@@ -16968,6 +19015,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                 masks are set on the frame widget's window.  */
              f = x_window_to_frame (dpyinfo, leave->event);
 
+             /* Also do this again here, since the test for `any'
+                above may not have found a frame, as that usually
+                just looks up a top window on Xt builds.  */
+
+#ifdef HAVE_XINPUT2_1
+             if (leave->detail != XINotifyInferior && f)
+               xi_reset_scroll_valuators_for_device_id (dpyinfo,
+                                                        leave->deviceid, 
false);
+#endif
+
              if (!f)
                f = x_top_window_to_frame (dpyinfo, leave->event);
 #endif
@@ -16985,7 +19042,14 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                     Do it only if there's something to cancel.
                     Otherwise, the startup message is cleared when
                     the mouse leaves the frame.  */
-                 if (any_help_event_p)
+                 if (any_help_event_p
+                     /* But never if `mouse-drag-and-drop-region' is
+                        in progress, since that results in the
+                        tooltip being dismissed when the mouse moves
+                        on top.  */
+                     && !((EQ (track_mouse, Qdrag_source)
+                           || EQ (track_mouse, Qdropping))
+                          && gui_mouse_grabbed (dpyinfo)))
                    do_help = -1;
                }
 #ifdef USE_GTK
@@ -17004,6 +19068,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              XIValuatorState *states;
              double *values;
              bool found_valuator = false;
+             bool other_valuators_found = false;
 #endif
              /* A fake XMotionEvent for x_note_mouse_movement. */
              XMotionEvent ev;
@@ -17061,6 +19126,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                                                           i, *values, &val);
                      values++;
 
+                     if (!val)
+                       {
+                         other_valuators_found = true;
+                         continue;
+                       }
+
                      if (delta != DBL_MAX)
                        {
                          if (!f)
@@ -17208,12 +19279,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                         So instead of that, just ignore XI wheel
                         events which land on a scroll bar.
 
-                       Here we assume anything which isn't the edit
-                       widget window is a scroll bar.  */
+                        Here we assume anything which isn't the edit
+                        widget window is a scroll bar.  */
 
                      if (xev->child != None
                          && xev->child != FRAME_X_WINDOW (f))
-                       goto OTHER;
+                       goto XI_OTHER;
 #endif
 
                      if (fabs (total_x) > 0 || fabs (total_y) > 0)
@@ -17249,7 +19320,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                      if (source && !NILP (source->name))
                        inev.ie.device = source->name;
 
-                     goto XI_OTHER;
+                     if (!other_valuators_found)
+                       goto XI_OTHER;
                    }
 #ifdef HAVE_XWIDGETS
                }
@@ -17304,10 +19376,23 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              f = mouse_or_wdesc_frame (dpyinfo, xev->event);
 
              if (x_dnd_in_progress
+                 /* Handle these events normally if the recursion
+                    level is higher than when the drag-and-drop
+                    operation was initiated.  This is so that mouse
+                    input works while we're in the debugger for, say,
+                    `x-dnd-movement-function`.  */
+                 && (command_loop_level + minibuf_level
+                     <= x_dnd_recursion_depth)
                  && dpyinfo == FRAME_DISPLAY_INFO (x_dnd_frame))
                {
                  Window target, toplevel;
                  int target_proto, motif_style;
+                 XRectangle *r;
+                 bool was_frame;
+
+                 /* Always clear mouse face.  */
+                 clear_mouse_face (hlinfo);
+                 hlinfo->mouse_face_hidden = true;
 
                  /* Sometimes the drag-and-drop operation starts with the
                     pointer of a frame invisible due to input.  Since
@@ -17315,14 +19400,37 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                     visible manually.  */
 
                  if (f)
-                   XTtoggle_invisible_pointer (f, false);
+                   {
+                     XTtoggle_invisible_pointer (f, false);
+
+                     r = &dpyinfo->last_mouse_glyph;
+
+                     /* Also remember the mouse glyph and set
+                        mouse_moved.  */
+                     if (f != dpyinfo->last_mouse_glyph_frame
+                         || xev->event_x < r->x
+                         || xev->event_x >= r->x + r->width
+                         || xev->event_y < r->y
+                         || xev->event_y >= r->y + r->height)
+                       {
+                         f->mouse_moved = true;
+                         f->last_mouse_device = (source ? source->name
+                                                 : Qnil);
+                         dpyinfo->last_mouse_scroll_bar = NULL;
+
+                         remember_mouse_glyph (f, xev->event_x,
+                                               xev->event_y, r);
+                         dpyinfo->last_mouse_glyph_frame = f;
+                       }
+                   }
 
                  target = x_dnd_get_target_window (dpyinfo,
                                                    xev->root_x,
                                                    xev->root_y,
                                                    &target_proto,
                                                    &motif_style,
-                                                   &toplevel);
+                                                   &toplevel,
+                                                   &was_frame);
 
                  if (toplevel != x_dnd_last_seen_toplevel)
                    {
@@ -17339,6 +19447,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                            x_dnd_send_leave (x_dnd_frame, 
x_dnd_last_seen_window);
                          else if (x_dnd_last_seen_window != None
                                   && XM_DRAG_STYLE_IS_DYNAMIC 
(x_dnd_last_motif_style)
+                                  && !x_dnd_disable_motif_drag
                                   && x_dnd_last_seen_window != 
FRAME_OUTER_WINDOW (x_dnd_frame))
                            {
                              if (!x_dnd_motif_setup_p)
@@ -17378,6 +19487,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                        x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
                      else if (x_dnd_last_seen_window != None
                               && XM_DRAG_STYLE_IS_DYNAMIC 
(x_dnd_last_motif_style)
+                              && !x_dnd_disable_motif_drag
                               && x_dnd_last_seen_window != FRAME_OUTER_WINDOW 
(x_dnd_frame))
                        {
                          if (!x_dnd_motif_setup_p)
@@ -17396,7 +19506,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                          dmsg.side_effects
                            = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action 
(dpyinfo,
                                                                               
x_dnd_wanted_action),
-                                                  XM_DROP_SITE_NONE, 
XM_DRAG_NOOP,
+                                                  XM_DROP_SITE_NONE, 
x_dnd_motif_operations,
                                                   XM_DROP_ACTION_DROP_CANCEL);
                          dmsg.timestamp = xev->time;
                          dmsg.x = lrint (xev->root_x);
@@ -17422,11 +19532,13 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                      x_dnd_last_seen_window = target;
                      x_dnd_last_protocol_version = target_proto;
                      x_dnd_last_motif_style = motif_style;
+                     x_dnd_last_window_is_frame = was_frame;
 
                      if (target != None && x_dnd_last_protocol_version != -1)
                        x_dnd_send_enter (x_dnd_frame, target,
                                          x_dnd_last_protocol_version);
-                     else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC 
(x_dnd_last_motif_style))
+                     else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC 
(x_dnd_last_motif_style)
+                              && !x_dnd_disable_motif_drag)
                        {
                          if (!x_dnd_motif_setup_p)
                            xm_setup_drag_info (dpyinfo, x_dnd_frame);
@@ -17445,7 +19557,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                        }
                    }
 
-                 if (x_dnd_last_protocol_version != -1 && target != None)
+                 if (x_dnd_last_window_is_frame && target != None)
+                   x_dnd_note_self_position (dpyinfo, target,
+                                             xev->root_x, xev->root_y);
+                 else if (x_dnd_last_protocol_version != -1 && target != None)
                    {
                      dnd_state = xev->mods.effective;
 
@@ -17466,7 +19581,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                                           x_dnd_wanted_action, 0,
                                           dnd_state);
                    }
-                 else if (XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) && 
target != None)
+                 else if (XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) && 
target != None
+                          && !x_dnd_disable_motif_drag)
                    {
                      if (!x_dnd_motif_setup_p)
                        xm_setup_drag_info (dpyinfo, x_dnd_frame);
@@ -17477,9 +19593,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                      dmsg.side_effects
                        = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action 
(dpyinfo,
                                                                           
x_dnd_wanted_action),
-                                              XM_DROP_SITE_VALID,
-                                              xm_side_effect_from_action 
(dpyinfo,
-                                                                          
x_dnd_wanted_action),
+                                              XM_DROP_SITE_VALID, 
x_dnd_motif_operations,
                                               (!x_dnd_xm_use_help
                                                ? XM_DROP_ACTION_DROP
                                                : XM_DROP_ACTION_DROP_HELP));
@@ -17492,6 +19606,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                                                     target, &dmsg);
                    }
 
+                 x_dnd_update_tooltip_position (xev->root_x, xev->root_y);
+
                  goto XI_OTHER;
                }
 
@@ -17558,7 +19674,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                {
 #ifndef USE_TOOLKIT_SCROLL_BARS
                  struct scroll_bar *bar
-                   = x_window_to_scroll_bar (xi_event->display, xev->event, 2);
+                   = x_window_to_scroll_bar (dpyinfo->display, xev->event, 2);
 
                  if (bar)
                    x_scroll_bar_note_movement (bar, &ev);
@@ -17595,8 +19711,26 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              int dnd_state;
 
              if (x_dnd_in_progress
+                 && (command_loop_level + minibuf_level
+                     <= x_dnd_recursion_depth)
                  && dpyinfo == FRAME_DISPLAY_INFO (x_dnd_frame))
                {
+                 f = mouse_or_wdesc_frame (dpyinfo, xev->event);
+
+                 if (xev->evtype == XI_ButtonPress)
+                   {
+                     dpyinfo->grabbed |= (1 << xev->detail);
+                     dpyinfo->last_mouse_frame = f;
+                     if (f && !tab_bar_p)
+                       f->last_tab_bar_item = -1;
+#if ! defined (USE_GTK)
+                     if (f && !tool_bar_p)
+                       f->last_tool_bar_item = -1;
+#endif /* not USE_GTK */
+                   }
+                 else
+                   dpyinfo->grabbed &= ~(1 << xev->detail);
+
                  if (xev->evtype == XI_ButtonPress
                      && x_dnd_last_seen_window != None
                      && x_dnd_last_protocol_version != -1)
@@ -17634,8 +19768,33 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                          x_dnd_end_window = x_dnd_last_seen_window;
                          x_dnd_in_progress = false;
 
+                         /* If a tooltip that we're following is
+                            displayed, hide it now.  */
+
+                         if (x_dnd_update_tooltip
+                             && FRAMEP (tip_frame)
+                             && FRAME_LIVE_P (XFRAME (tip_frame))
+                             && (FRAME_X_DISPLAY (XFRAME (tip_frame))
+                                 == FRAME_X_DISPLAY (x_dnd_frame)))
+                           Fx_hide_tip ();
+
+                         /* This doesn't have to be marked since it
+                            is only accessed if
+                            x_dnd_waiting_for_finish is true, which
+                            is only possible inside the DND event
+                            loop where that frame is on the
+                            stack.  */
+                         x_dnd_finish_frame = x_dnd_frame;
+
                          if (x_dnd_last_seen_window != None
-                             && x_dnd_last_protocol_version != -1)
+                             && x_dnd_last_window_is_frame)
+                           {
+                             x_dnd_waiting_for_finish = false;
+                             x_dnd_note_self_drop (dpyinfo, 
x_dnd_last_seen_window,
+                                                   xev->root_x, xev->root_y, 
xev->time);
+                           }
+                         else if (x_dnd_last_seen_window != None
+                                  && x_dnd_last_protocol_version != -1)
                            {
                              x_dnd_pending_finish_target = 
x_dnd_last_seen_window;
                              x_dnd_waiting_for_finish_proto = 
x_dnd_last_protocol_version;
@@ -17670,9 +19829,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                                      dmsg.side_effects
                                        = XM_DRAG_SIDE_EFFECT 
(xm_side_effect_from_action (dpyinfo,
                                                                                
           x_dnd_wanted_action),
-                                                              
XM_DROP_SITE_VALID,
-                                                              
xm_side_effect_from_action (dpyinfo,
-                                                                               
           x_dnd_wanted_action),
+                                                              
XM_DROP_SITE_VALID, x_dnd_motif_operations,
                                                               
(!x_dnd_xm_use_help
                                                                ? 
XM_DROP_ACTION_DROP
                                                                : 
XM_DROP_ACTION_DROP_HELP));
@@ -17727,15 +19884,17 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                          x_dnd_last_motif_style = XM_DRAG_STYLE_NONE;
                          x_dnd_last_seen_window = None;
                          x_dnd_last_seen_toplevel = None;
+                         x_dnd_last_window_is_frame = false;
                          x_dnd_frame = NULL;
-                         x_set_dnd_targets (NULL, 0);
 
                          goto XI_OTHER;
                        }
                    }
                }
 
-             if (x_dnd_in_progress)
+             if (x_dnd_in_progress
+                 && (command_loop_level + minibuf_level
+                     <= x_dnd_recursion_depth))
                goto XI_OTHER;
 
 #ifdef USE_MOTIF
@@ -17801,9 +19960,17 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
              g_object_ref (copy->button.window);
 
-             if (popup_activated ()
-                 && xev->evtype == XI_ButtonRelease)
-               goto XI_OTHER;
+             if (popup_activated ())
+               {
+                 /* GTK+ popup menus don't respond to core buttons
+                    after Button3, so don't dismiss popup menus upon
+                    wheel movement here either.  */
+                 if (xev->detail > 3)
+                   *finish = X_EVENT_DROP;
+
+                 if (xev->evtype == XI_ButtonRelease)
+                   goto XI_OTHER;
+               }
 #endif
 
 #ifdef HAVE_XINPUT2_1
@@ -17896,7 +20063,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
                  f = x_any_window_to_frame (dpyinfo, xev->event);
 
-                 if (xev->detail > 3 && xev->detail < 9 && f)
+                 if (xev->detail > 3 && xev->detail < 8 && f)
                    {
                      if (xev->evtype == XI_ButtonRelease)
                        {
@@ -17939,7 +20106,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
              if (f)
                {
-                 if (xev->detail >= 4 && xev->detail <= 8)
+                 if (xev->detail >= 4 && xev->detail < 8)
                    {
                      if (xev->evtype == XI_ButtonRelease)
                        {
@@ -18260,9 +20427,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              state |= x_emacs_to_x_modifiers (dpyinfo, 
extra_keyboard_modifiers);
 
 #ifdef HAVE_XKB
-             if (FRAME_DISPLAY_INFO (f)->xkb_desc)
+             if (dpyinfo->xkb_desc)
                {
-                 XkbDescRec *rec = FRAME_DISPLAY_INFO (f)->xkb_desc;
+                 XkbDescRec *rec = dpyinfo->xkb_desc;
 
                  if (rec->map->modmap && rec->map->modmap[xev->detail])
                    goto xi_done_keysym;
@@ -18352,7 +20519,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                      if (status_return == XBufferOverflow)
                        {
                          copy_bufsiz = nbytes + 1;
-                         copy_bufptr = alloca (copy_bufsiz);
+                         copy_bufptr = SAFE_ALLOCA (copy_bufsiz);
                          nbytes = XmbLookupString (FRAME_XIC (f),
                                                    &xkey, (char *) copy_bufptr,
                                                    copy_bufsiz, &keysym,
@@ -18384,8 +20551,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                                                       copy_bufsiz, &overflow);
                          if (overflow)
                            {
-                             copy_bufptr = alloca ((copy_bufsiz += overflow)
-                                                   * sizeof *copy_bufptr);
+                             copy_bufptr = SAFE_ALLOCA ((copy_bufsiz += 
overflow)
+                                                        * sizeof *copy_bufptr);
                              overflow = 0;
                              nbytes = XkbTranslateKeySym (dpyinfo->display, 
&sym,
                                                           state & ~mods_rtrn, 
copy_bufptr,
@@ -18696,7 +20863,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              struct xi_touch_point_t *tem, *last;
 #endif
 
-             disabled = alloca (sizeof *disabled * hev->num_info);
+             disabled = SAFE_ALLOCA (sizeof *disabled * hev->num_info);
              n_disabled = 0;
 
              for (i = 0; i < hev->num_info; ++i)
@@ -18995,6 +21162,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
              if (!menu_bar_p && !tool_bar_p)
                {
+                 x_catch_errors (dpyinfo->display);
+
                  if (f && device->direct_p)
                    {
                      *finish = X_EVENT_DROP;
@@ -19023,6 +21192,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                    XIAllowTouchEvents (dpyinfo->display, xev->deviceid,
                                        xev->detail, xev->event, XIRejectTouch);
 #endif
+                 x_uncatch_errors ();
                }
              else
                {
@@ -19135,7 +21305,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
              device = xi_device_from_id (dpyinfo, pev->deviceid);
              source = xi_device_from_id (dpyinfo, pev->sourceid);
-             x_display_set_last_user_time (dpyinfo, xi_event->time);
+             x_display_set_last_user_time (dpyinfo, pev->time);
 
              if (!device)
                goto XI_OTHER;
@@ -19466,7 +21636,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                    }
 
                  /* And the common case where there is no input rect and the
-                    bouding rect equals the window dimensions.  */
+                    bounding rect equals the window dimensions.  */
 
                  if (tem->n_input_rects == -1
                      && tem->n_bounding_rects == 1
@@ -19483,6 +21653,75 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                }
            }
        }
+#endif
+#if defined HAVE_XRANDR && !defined USE_GTK
+      if (dpyinfo->xrandr_supported_p
+         && (event->type == (dpyinfo->xrandr_event_base
+                             + RRScreenChangeNotify)
+             || event->type == (dpyinfo->xrandr_event_base
+                                + RRNotify)))
+       {
+         union buffered_input_event *ev;
+         Time timestamp;
+         Lisp_Object current_monitors;
+         XRRScreenChangeNotifyEvent *notify;
+
+         if (event->type == (dpyinfo->xrandr_event_base
+                             + RRScreenChangeNotify))
+           XRRUpdateConfiguration (event);
+
+         if (event->type == (dpyinfo->xrandr_event_base
+                             + RRScreenChangeNotify))
+           {
+             notify = ((XRRScreenChangeNotifyEvent *) event);
+             timestamp = notify->timestamp;
+
+             /* Don't set screen dimensions if the notification is
+                for a different screen.  */
+             if (notify->root == dpyinfo->root_window)
+               {
+                 dpyinfo->screen_width = notify->width;
+                 dpyinfo->screen_height = notify->height;
+                 dpyinfo->screen_mm_width = notify->mwidth;
+                 dpyinfo->screen_mm_height = notify->mheight;
+               }
+           }
+         else
+           timestamp = 0;
+
+         ev = (kbd_store_ptr == kbd_buffer
+               ? kbd_buffer + KBD_BUFFER_SIZE - 1
+               : kbd_store_ptr - 1);
+
+         if (kbd_store_ptr != kbd_fetch_ptr
+             && ev->ie.kind == MONITORS_CHANGED_EVENT
+             && XTERMINAL (ev->ie.arg) == dpyinfo->terminal)
+           /* Don't store a MONITORS_CHANGED_EVENT if there is
+              already an undelivered event on the queue.  */
+           goto OTHER;
+
+         inev.ie.kind = MONITORS_CHANGED_EVENT;
+         inev.ie.timestamp = timestamp;
+         XSETTERMINAL (inev.ie.arg, dpyinfo->terminal);
+
+         /* Also don't do anything if the monitor configuration
+            didn't really change.  */
+
+         current_monitors
+           = Fx_display_monitor_attributes_list (inev.ie.arg);
+
+         if (!NILP (Fequal (current_monitors,
+                            dpyinfo->last_monitor_attributes_list)))
+           inev.ie.kind = NO_EVENT;
+
+         dpyinfo->last_monitor_attributes_list = current_monitors;
+
+         if (x_dnd_in_progress && x_dnd_update_tooltip)
+           x_dnd_monitors = current_monitors;
+
+         if (inev.ie.kind != NO_EVENT)
+           x_dnd_update_tooltip_now ();
+       }
 #endif
     OTHER:
 #ifdef USE_X_TOOLKIT
@@ -19566,6 +21805,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
   if (any && any != f)
     flush_dirty_back_buffer_on (any);
 #endif
+
+  SAFE_FREE ();
   return count;
 }
 
@@ -19611,8 +21852,18 @@ XTread_socket (struct terminal *terminal, struct 
input_event *hold_quit)
   /* Don't allow XTread_socket to do anything if drag-and-drop is in
      progress.  If unblock_input causes XTread_socket to be called and
      read X events while the drag-and-drop event loop is in progress,
-     things can go wrong very quick.  */
-  if (x_dnd_in_progress || x_dnd_waiting_for_finish)
+     things can go wrong very quick.
+
+     When x_dnd_unwind_flag is true, the above doesn't apply, since
+     the surrounding code takes special precautions to keep it safe.
+
+     That doesn't matter for events from displays other than the
+     display of the drag-and-drop operation, though.  */
+  if (!x_dnd_unwind_flag
+      && ((x_dnd_in_progress
+          && dpyinfo->display == FRAME_X_DISPLAY (x_dnd_frame))
+         || (x_dnd_waiting_for_finish
+             && dpyinfo->display == x_dnd_finish_display)))
     return 0;
 
   block_input ();
@@ -20129,70 +22380,131 @@ x_text_icon (struct frame *f, const char *icon_name)
   return false;
 }
 
-#define X_ERROR_MESSAGE_SIZE 200
-
-/* If non-nil, this should be a string.
-   It means catch X errors  and store the error message in this string.
 
-   The reason we use a stack is that x_catch_error/x_uncatch_error can
-   be called from a signal handler.
-*/
+struct x_error_message_stack
+{
+  /* Pointer to the error message of any error that was generated, or
+     NULL.  */
+  char *string;
 
-struct x_error_message_stack {
-  char string[X_ERROR_MESSAGE_SIZE];
+  /* The display this error handler applies to.  */
   Display *dpy;
+
+  /* A function to call upon an error if non-NULL.  */
   x_special_error_handler handler;
+
+  /* Some data to pass to that handler function.  */
   void *handler_data;
+
+  /* The previous handler in this stack.  */
   struct x_error_message_stack *prev;
+
+  /* The first request that this error handler applies to.  Keeping
+     track of this allows us to avoid an XSync yet still have errors
+     for previously made requests be handled correctly.  */
+  unsigned long first_request;
 };
+
+/* Stack of X error message handlers.  Whenever an error is generated
+   on a display, look in this stack for an appropriate error handler,
+   set its `string' to the error message and call its `handler' with
+   `handler_data'.  If no handler applies to the error, don't catch
+   it, and let it crash Emacs instead.
+
+   This used to be a pointer to a string in which any error would be
+   placed before 2006.  */
 static struct x_error_message_stack *x_error_message;
 
-/* An X error handler which stores the error message in
-   *x_error_message.  This is called from x_error_handler if
-   x_catch_errors is in effect.  */
+/* The amount of items (depth) in that stack.  */
+int x_error_message_count;
+
+static struct x_error_message_stack *
+x_find_error_handler (Display *dpy, XErrorEvent *event)
+{
+  struct x_error_message_stack *stack;
+
+  stack = x_error_message;
+
+  while (stack)
+    {
+      if (X_COMPARE_SERIALS (event->serial, >=,
+                            stack->first_request)
+         && dpy == stack->dpy)
+       return stack;
+
+      stack = stack->prev;
+    }
+
+  return NULL;
+}
+
+void
+x_unwind_errors_to (int depth)
+{
+  while (x_error_message_count > depth)
+    /* This is safe to call because we check whether or not
+       x_error_message->dpy is still alive before calling XSync.  */
+    x_uncatch_errors ();
+}
+
+#define X_ERROR_MESSAGE_SIZE 200
+
+/* An X error handler which stores the error message in the first
+   applicable handler in the x_error_message stack.  This is called
+   from *x_error_handler if an x_catch_errors for DISPLAY is in
+   effect.  */
 
 static void
-x_error_catcher (Display *display, XErrorEvent *event)
+x_error_catcher (Display *display, XErrorEvent *event,
+                struct x_error_message_stack *stack)
 {
+  char buf[X_ERROR_MESSAGE_SIZE];
+
   XGetErrorText (display, event->error_code,
-                x_error_message->string,
-                X_ERROR_MESSAGE_SIZE);
-  if (x_error_message->handler)
-    x_error_message->handler (display, event, x_error_message->string,
-                             x_error_message->handler_data);
+                buf, X_ERROR_MESSAGE_SIZE);
+
+  if (stack->string)
+    xfree (stack->string);
+
+  stack->string = xstrdup (buf);
+
+  if (stack->handler)
+    stack->handler (display, event, stack->string,
+                   stack->handler_data);
 }
 
-/* Begin trapping X errors for display DPY.  Actually we trap X errors
-   for all displays, but DPY should be the display you are actually
-   operating on.
+/* Begin trapping X errors for display DPY.
 
-   After calling this function, X protocol errors no longer cause
-   Emacs to exit; instead, they are recorded in the string
-   stored in *x_error_message.
+   After calling this function, X protocol errors generated on DPY no
+   longer cause Emacs to exit; instead, they are recorded in an error
+   handler pushed onto the stack `x_error_message'.
 
    Calling x_check_errors signals an Emacs error if an X error has
    occurred since the last call to x_catch_errors or x_check_errors.
 
-   Calling x_uncatch_errors resumes the normal error handling.
-   Calling x_uncatch_errors_after_check is similar, but skips an XSync
-   to the server, and should be used only immediately after
-   x_had_errors_p or x_check_errors.  */
+   Calling x_uncatch_errors resumes the normal error handling,
+   skipping an XSync if the last request made is known to have been
+   processed.  Calling x_uncatch_errors_after_check is similar, but
+   always skips an XSync to the server, and should be used only
+   immediately after x_had_errors_p or x_check_errors, or when it is
+   known that no requests have been made since the last x_catch_errors
+   call for DPY.  */
 
 void
 x_catch_errors_with_handler (Display *dpy, x_special_error_handler handler,
                             void *handler_data)
 {
-  struct x_error_message_stack *data = xmalloc (sizeof *data);
-
-  /* Make sure any errors from previous requests have been dealt with.  */
-  XSync (dpy, False);
+  struct x_error_message_stack *data;
 
+  data = xzalloc (sizeof *data);
   data->dpy = dpy;
-  data->string[0] = 0;
   data->handler = handler;
   data->handler_data = handler_data;
   data->prev = x_error_message;
+  data->first_request = NextRequest (dpy);
   x_error_message = data;
+
+  ++x_error_message_count;
 }
 
 void
@@ -20216,12 +22528,14 @@ x_uncatch_errors_after_check (void)
   block_input ();
   tmp = x_error_message;
   x_error_message = x_error_message->prev;
+  --x_error_message_count;
+  if (tmp->string)
+    xfree (tmp->string);
   xfree (tmp);
   unblock_input ();
 }
 
-/* Undo the last x_catch_errors call.
-   DPY should be the display that was passed to x_catch_errors.  */
+/* Undo the last x_catch_errors call.  */
 
 void
 x_uncatch_errors (void)
@@ -20239,11 +22553,22 @@ x_uncatch_errors (void)
 
   /* The display may have been closed before this function is called.
      Check if it is still open before calling XSync.  */
-  if (x_display_info_for_display (x_error_message->dpy) != 0)
+  if (x_display_info_for_display (x_error_message->dpy) != 0
+      /* There is no point in making this extra sync if all requests
+        are known to have been fully processed.  */
+      && (LastKnownRequestProcessed (x_error_message->dpy)
+         != NextRequest (x_error_message->dpy) - 1)
+      /* Likewise if no request was made since the trap was
+        installed.  */
+      && (NextRequest (x_error_message->dpy)
+         > x_error_message->first_request))
     XSync (x_error_message->dpy, False);
 
   tmp = x_error_message;
   x_error_message = x_error_message->prev;
+  --x_error_message_count;
+  if (tmp->string)
+    xfree (tmp->string);
   xfree (tmp);
   unblock_input ();
 }
@@ -20255,36 +22580,64 @@ x_uncatch_errors (void)
 void
 x_check_errors (Display *dpy, const char *format)
 {
-  /* Make sure to catch any errors incurred so far.  */
-  XSync (dpy, False);
+  char *string;
+
+  /* This shouldn't happen, since x_check_errors should be called
+     immediately inside an x_catch_errors block.  */
+  if (dpy != x_error_message->dpy)
+    emacs_abort ();
+
+  /* There is no point in making this extra sync if all requests
+     are known to have been fully processed.  */
+  if ((LastKnownRequestProcessed (dpy)
+       != NextRequest (dpy) - 1)
+      && (NextRequest (dpy)
+         > x_error_message->first_request))
+    XSync (dpy, False);
 
-  if (x_error_message->string[0])
+  if (x_error_message->string)
     {
-      char string[X_ERROR_MESSAGE_SIZE];
-      memcpy (string, x_error_message->string, X_ERROR_MESSAGE_SIZE);
-      x_uncatch_errors ();
+      string = alloca (strlen (x_error_message->string) + 1);
+      strcpy (string, x_error_message->string);
+
       error (format, string);
     }
 }
 
-/* Nonzero if we had any X protocol errors
-   since we did x_catch_errors on DPY.  */
+/* Nonzero if any X protocol errors were generated since the last call
+   to x_catch_errors on DPY.  */
 
 bool
 x_had_errors_p (Display *dpy)
 {
+  /* This shouldn't happen, since x_check_errors should be called
+     immediately inside an x_catch_errors block.  */
+  if (dpy != x_error_message->dpy)
+    emacs_abort ();
+
   /* Make sure to catch any errors incurred so far.  */
-  XSync (dpy, False);
+  if ((LastKnownRequestProcessed (dpy)
+       != NextRequest (dpy) - 1)
+      && (NextRequest (dpy)
+         > x_error_message->first_request))
+    XSync (dpy, False);
 
-  return x_error_message->string[0] != 0;
+  return x_error_message->string;
 }
 
-/* Forget about any errors we have had, since we did x_catch_errors on DPY.  */
+/* Forget about any errors we have had, since we did x_catch_errors on
+   DPY.  */
 
 void
 x_clear_errors (Display *dpy)
 {
-  x_error_message->string[0] = 0;
+  /* This shouldn't happen, since x_check_errors should be called
+     immediately inside an x_catch_errors block.  */
+  if (dpy != x_error_message->dpy)
+    emacs_abort ();
+
+  xfree (x_error_message->string);
+  x_error_message->string = NULL;
 }
 
 #if false
@@ -20302,9 +22655,12 @@ x_fully_uncatch_errors (void)
 
 #if false
 static unsigned int x_wire_count;
-x_trace_wire (void)
+
+static int
+x_trace_wire (Display *dpy)
 {
-  fprintf (stderr, "Lib call: %d\n", ++x_wire_count);
+  fprintf (stderr, "Lib call: %u\n", ++x_wire_count);
+  return 0;
 }
 #endif
 
@@ -20344,63 +22700,64 @@ x_connection_closed (Display *dpy, const char 
*error_message, bool ioerror)
 
   if (x_dnd_in_progress || x_dnd_waiting_for_finish)
     {
-      /* Handle display disconnect errors here because this function
-        is not reentrant at this particular spot.  */
-      io_error_handler = XSetIOErrorHandler (x_dnd_io_error_handler);
-
-      if (!sigsetjmp (x_dnd_disconnect_handler, 1)
-         && x_dnd_in_progress
-         && dpy != (x_dnd_waiting_for_finish
-                    ? x_dnd_finish_display
-                    : FRAME_X_DISPLAY (x_dnd_frame)))
+      if (!ioerror)
        {
-         /* Clean up drag and drop if the drag frame's display isn't
-            the one being disconnected.  */
-         f = x_dnd_frame;
-
-         if (x_dnd_last_seen_window != None
-             && x_dnd_last_protocol_version != -1)
-           x_dnd_send_leave (x_dnd_frame,
-                             x_dnd_last_seen_window);
-         else if (x_dnd_last_seen_window != None
-                  && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style)
-                  && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE
-                  && x_dnd_motif_setup_p)
+         /* Handle display disconnect errors here because this function
+            is not reentrant at this particular spot.  */
+         io_error_handler = XSetIOErrorHandler (x_dnd_io_error_handler);
+
+         if (!!sigsetjmp (x_dnd_disconnect_handler, 1)
+             && x_dnd_in_progress
+             && dpy == (x_dnd_waiting_for_finish
+                        ? x_dnd_finish_display
+                        : FRAME_X_DISPLAY (x_dnd_frame)))
            {
-             dmsg.reason = XM_DRAG_REASON (XM_DRAG_ORIGINATOR_INITIATOR,
-                                           XM_DRAG_REASON_DROP_START);
-             dmsg.byte_order = XM_BYTE_ORDER_CUR_FIRST;
-             dmsg.timestamp = FRAME_DISPLAY_INFO (f)->last_user_time;
-             dmsg.side_effects
-               = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action 
(FRAME_DISPLAY_INFO (f),
-                                                                  
x_dnd_wanted_action),
-                                      XM_DROP_SITE_VALID,
-                                      xm_side_effect_from_action 
(FRAME_DISPLAY_INFO (f),
-                                                                  
x_dnd_wanted_action),
-                                      XM_DROP_ACTION_DROP_CANCEL);
-             dmsg.x = 0;
-             dmsg.y = 0;
-             dmsg.index_atom = FRAME_DISPLAY_INFO (f)->Xatom_XdndSelection;
-             dmsg.source_window = FRAME_X_WINDOW (f);
-
-             x_dnd_send_xm_leave_for_drop (FRAME_DISPLAY_INFO (f), f,
-                                           x_dnd_last_seen_window, 0);
-             xm_send_drop_message (FRAME_DISPLAY_INFO (f), FRAME_X_WINDOW (f),
-                                   x_dnd_last_seen_window, &dmsg);
+             /* Clean up drag and drop if the drag frame's display isn't
+                the one being disconnected.  */
+             f = x_dnd_frame;
+
+             if (x_dnd_last_seen_window != None
+                 && x_dnd_last_protocol_version != -1)
+               x_dnd_send_leave (x_dnd_frame,
+                                 x_dnd_last_seen_window);
+             else if (x_dnd_last_seen_window != None
+                      && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style)
+                      && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE
+                      && x_dnd_motif_setup_p)
+               {
+                 dmsg.reason = XM_DRAG_REASON (XM_DRAG_ORIGINATOR_INITIATOR,
+                                               XM_DRAG_REASON_DROP_START);
+                 dmsg.byte_order = XM_BYTE_ORDER_CUR_FIRST;
+                 dmsg.timestamp = FRAME_DISPLAY_INFO (f)->last_user_time;
+                 dmsg.side_effects
+                   = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action 
(FRAME_DISPLAY_INFO (f),
+                                                                      
x_dnd_wanted_action),
+                                          XM_DROP_SITE_VALID, 
x_dnd_motif_operations,
+                                          XM_DROP_ACTION_DROP_CANCEL);
+                 dmsg.x = 0;
+                 dmsg.y = 0;
+                 dmsg.index_atom = FRAME_DISPLAY_INFO (f)->Xatom_XdndSelection;
+                 dmsg.source_window = FRAME_X_WINDOW (f);
+
+                 x_dnd_send_xm_leave_for_drop (FRAME_DISPLAY_INFO (f), f,
+                                               x_dnd_last_seen_window, 0);
+                 xm_send_drop_message (FRAME_DISPLAY_INFO (f), FRAME_X_WINDOW 
(f),
+                                       x_dnd_last_seen_window, &dmsg);
+               }
            }
+
+         XSetIOErrorHandler (io_error_handler);
        }
 
-      XSetIOErrorHandler (io_error_handler);
       dpyinfo = x_display_info_for_display (dpy);
 
       x_dnd_last_seen_window = None;
       x_dnd_last_seen_toplevel = None;
       x_dnd_in_progress = false;
-      x_set_dnd_targets (NULL, 0);
       x_dnd_waiting_for_finish = false;
 
       if (x_dnd_use_toplevels)
-       x_dnd_free_toplevels ();
+       x_dnd_free_toplevels (!ioerror);
 
       x_dnd_return_frame_object = NULL;
       x_dnd_movement_frame = NULL;
@@ -20417,6 +22774,12 @@ x_connection_closed (Display *dpy, const char 
*error_message, bool ioerror)
        dpyinfo->display = 0;
     }
 
+  /* delete_frame can still try to read async input (even though we
+     tell pass `noelisp'), because looking up the `delete-before'
+     parameter calls Fassq which then calls maybe_quit.  So block
+     input while deleting frames.  */
+  block_input ();
+
   /* First delete frames whose mini-buffers are on frames
      that are on the dead display.  */
   FOR_EACH_FRAME (tail, frame)
@@ -20481,6 +22844,8 @@ For details, see etc/PROBLEMS.\n",
       }
     }
 
+  unblock_input ();
+
   if (terminal_list == 0)
     {
       fprintf (stderr, "%s\n", error_msg);
@@ -20506,16 +22871,16 @@ static void x_error_quitter (Display *, XErrorEvent 
*);
 static int
 x_error_handler (Display *display, XErrorEvent *event)
 {
+  struct x_error_message_stack *stack;
 #ifdef HAVE_XINPUT2
   struct x_display_info *dpyinfo;
 #endif
 
 #if defined USE_GTK && defined HAVE_GTK3
-  if ((event->error_code == BadMatch || event->error_code == BadWindow)
+  if ((event->error_code == BadMatch
+       || event->error_code == BadWindow)
       && event->request_code == X_SetInputFocus)
-    {
-      return 0;
-    }
+    return 0;
 #endif
 
   /* If we try to ungrab or grab a device that doesn't exist anymore
@@ -20536,8 +22901,10 @@ x_error_handler (Display *display, XErrorEvent *event)
     return 0;
 #endif
 
-  if (x_error_message)
-    x_error_catcher (display, event);
+  stack = x_find_error_handler (display, event);
+
+  if (stack)
+    x_error_catcher (display, event, stack);
   else
     x_error_quitter (display, event);
   return 0;
@@ -21043,17 +23410,16 @@ x_set_offset (struct frame *f, int xoff, int yoff, 
int change_gravity)
    https://freedesktop.org/wiki/Specifications/wm-spec/.  */
 
 bool
-x_wm_supports (struct frame *f, Atom want_atom)
+x_wm_supports_1 (struct x_display_info *dpyinfo, Atom want_atom)
 {
   Atom actual_type;
   unsigned long actual_size, bytes_remaining;
   int i, rc, actual_format;
   bool ret;
   Window wmcheck_window;
-  struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
   Window target_window = dpyinfo->root_window;
   int max_len = 65536;
-  Display *dpy = FRAME_X_DISPLAY (f);
+  Display *dpy = dpyinfo->display;
   unsigned char *tmp_data = NULL;
   Atom target_type = XA_WINDOW;
 
@@ -21127,6 +23493,13 @@ x_wm_supports (struct frame *f, Atom want_atom)
   return ret;
 }
 
+bool
+x_wm_supports (struct frame *f, Atom want_atom)
+{
+  return x_wm_supports_1 (FRAME_DISPLAY_INFO (f),
+                         want_atom);
+}
+
 static void
 set_wm_state (Lisp_Object frame, bool add, Atom atom, Atom value)
 {
@@ -21289,15 +23662,20 @@ x_get_current_wm_state (struct frame *f,
 #ifdef USE_XCB
   xcb_get_property_cookie_t prop_cookie;
   xcb_get_property_reply_t *prop;
-  xcb_atom_t *reply_data UNINIT;
+  typedef xcb_atom_t reply_data_object;
 #else
   Display *dpy = FRAME_X_DISPLAY (f);
   unsigned long bytes_remaining;
   int rc, actual_format;
   Atom actual_type;
   unsigned char *tmp_data = NULL;
-  Atom *reply_data UNINIT;
+  typedef Atom reply_data_object;
 #endif
+  reply_data_object *reply_data;
+# if defined GCC_LINT || defined lint
+  reply_data_object reply_data_dummy;
+  reply_data = &reply_data_dummy;
+# endif
 
   *sticky = false;
   *size_state = FULLSCREEN_NONE;
@@ -21648,7 +24026,7 @@ x_check_expected_move (struct frame *f, int 
expected_left, int expected_top)
       int adjusted_left;
       int adjusted_top;
 
-        FRAME_DISPLAY_INFO (f)->wm_type = X_WMTYPE_A;
+      FRAME_DISPLAY_INFO (f)->wm_type = X_WMTYPE_A;
       FRAME_X_OUTPUT (f)->move_offset_left = expected_left - current_left;
       FRAME_X_OUTPUT (f)->move_offset_top = expected_top - current_top;
 
@@ -21665,7 +24043,6 @@ x_check_expected_move (struct frame *f, int 
expected_left, int expected_top)
   else
     /* It's a "Type B" window manager.  We don't have to adjust the
        frame's position. */
-
       FRAME_DISPLAY_INFO (f)->wm_type = X_WMTYPE_B;
 }
 
@@ -21679,11 +24056,17 @@ x_check_expected_move (struct frame *f, int 
expected_left, int expected_top)
 static void
 x_sync_with_move (struct frame *f, int left, int top, bool fuzzy)
 {
-  int count = 0;
+  sigset_t emptyset;
+  int count, current_left, current_top;
+  struct timespec fallback;
+
+  sigemptyset (&emptyset);
+  count = 0;
 
   while (count++ < 50)
     {
-      int current_left = 0, current_top = 0;
+      current_left = 0;
+      current_top = 0;
 
       /* In theory, this call to XSync only needs to happen once, but in
          practice, it doesn't seem to work, hence the need for the surrounding
@@ -21708,7 +24091,14 @@ x_sync_with_move (struct frame *f, int left, int top, 
bool fuzzy)
   /* As a last resort, just wait 0.5 seconds and hope that XGetGeometry
      will then return up-to-date position info. */
 
-  wait_reading_process_output (0, 500000000, 0, false, Qnil, NULL, 0);
+  fallback = dtotimespec (0.5);
+
+  /* This will hang if input is blocked, so use pselect to wait
+     instead.  */
+  if (input_blocked_p ())
+    pselect (0, NULL, NULL, NULL, &fallback, &emptyset);
+  else
+    wait_reading_process_output (0, 500000000, 0, false, Qnil, NULL, 0);
 }
 
 
@@ -22375,6 +24765,18 @@ x_make_frame_visible_invisible (struct frame *f, bool 
visible)
     x_make_frame_invisible (f);
 }
 
+Cursor
+x_create_font_cursor (struct x_display_info *dpyinfo, int glyph)
+{
+  if (glyph <= 65535)
+    return XCreateFontCursor (dpyinfo->display, glyph);
+
+  /* x-pointer-invisible cannot fit in CARD16, and thus cannot be any
+     existing cursor.  */
+  return make_invisible_cursor (dpyinfo);
+}
+
+
 /* Change window state from mapped to iconified.  */
 
 void
@@ -22462,6 +24864,10 @@ x_iconify_frame (struct frame *f)
     msg.xclient.message_type = FRAME_DISPLAY_INFO (f)->Xatom_wm_change_state;
     msg.xclient.format = 32;
     msg.xclient.data.l[0] = IconicState;
+    msg.xclient.data.l[1] = 0;
+    msg.xclient.data.l[2] = 0;
+    msg.xclient.data.l[3] = 0;
+    msg.xclient.data.l[4] = 0;
 
     if (! XSendEvent (FRAME_X_DISPLAY (f),
                      FRAME_DISPLAY_INFO (f)->root_window,
@@ -22691,7 +25097,6 @@ x_destroy_window (struct frame *f)
     x_free_frame_resources (f);
 
   xfree (f->output_data.x->saved_menu_event);
-  xfree (f->output_data.x);
 
 #ifdef HAVE_X_I18N
   if (f->output_data.x->preedit_chars)
@@ -22703,11 +25108,162 @@ x_destroy_window (struct frame *f)
     XFree (f->output_data.x->xi_masks);
 #endif
 
+  xfree (f->output_data.x);
   f->output_data.x = NULL;
 
   dpyinfo->reference_count--;
 }
 
+/* Intern NAME in DPYINFO, but check to see if the atom was already
+   interned when the X connection was opened, and use that instead.
+
+   If PREDEFINED_ONLY, return None if the atom was not interned during
+   connection setup or is predefined.  */
+Atom
+x_intern_cached_atom (struct x_display_info *dpyinfo,
+                     const char *name, bool predefined_only)
+{
+  int i;
+  char *ptr;
+  Atom *atom;
+
+  /* Special atoms that depend on the screen number.  */
+  char xsettings_atom_name[sizeof "_XSETTINGS_S%d" - 2
+                          + INT_STRLEN_BOUND (int)];
+  char cm_atom_name[sizeof "_NET_WM_CM_S%d" - 2
+                   + INT_STRLEN_BOUND (int)];
+
+  sprintf (xsettings_atom_name, "_XSETTINGS_S%d",
+          XScreenNumberOfScreen (dpyinfo->screen));
+  sprintf (cm_atom_name, "_NET_WM_CM_S%d",
+          XScreenNumberOfScreen (dpyinfo->screen));
+
+  if (!strcmp (name, xsettings_atom_name))
+    return dpyinfo->Xatom_xsettings_sel;
+
+  if (!strcmp (name, cm_atom_name))
+    return dpyinfo->Xatom_NET_WM_CM_Sn;
+
+  /* Now do some common predefined atoms.  */
+  if (!strcmp (name, "PRIMARY"))
+    return XA_PRIMARY;
+
+  if (!strcmp (name, "SECONDARY"))
+    return XA_SECONDARY;
+
+  if (!strcmp (name, "STRING"))
+    return XA_STRING;
+
+  if (!strcmp (name, "INTEGER"))
+    return XA_INTEGER;
+
+  if (!strcmp (name, "ATOM"))
+    return XA_ATOM;
+
+  if (!strcmp (name, "CARDINAL"))
+    return XA_CARDINAL;
+
+  if (!strcmp (name, "WINDOW"))
+    return XA_WINDOW;
+
+  for (i = 0; i < ARRAYELTS (x_atom_refs); ++i)
+    {
+      ptr = (char *) dpyinfo;
+
+      if (!strcmp (x_atom_refs[i].name, name))
+       {
+         atom = (Atom *) (ptr + x_atom_refs[i].offset);
+
+         return *atom;
+       }
+    }
+
+  if (predefined_only)
+    return None;
+
+  return XInternAtom (dpyinfo->display, name, False);
+}
+
+/* Get the name of ATOM, but try not to make a request to the X
+   server.  Whether or not a request to the X server happened is
+   placed in NEED_SYNC.  */
+char *
+x_get_atom_name (struct x_display_info *dpyinfo, Atom atom,
+                bool *need_sync)
+{
+  char *dpyinfo_pointer, *name, *value, *buffer;
+  int i;
+  Atom ref_atom;
+
+  dpyinfo_pointer = (char *) dpyinfo;
+  value = NULL;
+
+  if (need_sync)
+    *need_sync = false;
+
+  buffer = alloca (45 + INT_STRLEN_BOUND (int));
+
+  switch (atom)
+    {
+    case XA_PRIMARY:
+      return xstrdup ("PRIMARY");
+
+    case XA_SECONDARY:
+      return xstrdup ("SECONDARY");
+
+    case XA_INTEGER:
+      return xstrdup ("INTEGER");
+
+    case XA_ATOM:
+      return xstrdup ("ATOM");
+
+    case XA_CARDINAL:
+      return xstrdup ("CARDINAL");
+
+    case XA_WINDOW:
+      return xstrdup ("WINDOW");
+
+    default:
+      if (atom == dpyinfo->Xatom_xsettings_sel)
+       {
+         sprintf (buffer, "_XSETTINGS_S%d",
+                  XScreenNumberOfScreen (dpyinfo->screen));
+         return xstrdup (buffer);
+       }
+
+      if (atom == dpyinfo->Xatom_NET_WM_CM_Sn)
+       {
+         sprintf (buffer, "_NET_WM_CM_S%d",
+                  XScreenNumberOfScreen (dpyinfo->screen));
+         return xstrdup (buffer);
+       }
+
+      for (i = 0; i < ARRAYELTS (x_atom_refs); ++i)
+       {
+         ref_atom = *(Atom *) (dpyinfo_pointer
+                               + x_atom_refs[i].offset);
+
+         if (atom == ref_atom)
+           return xstrdup (x_atom_refs[i].name);
+       }
+
+      name = XGetAtomName (dpyinfo->display, atom);
+
+      if (need_sync)
+       *need_sync = true;
+
+      if (name)
+       {
+         value = xstrdup (name);
+         XFree (name);
+       }
+
+      break;
+    }
+
+  return value;
+}
+
 
 /* Setting window manager hints.  */
 
@@ -23152,7 +25708,12 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
 #ifdef USE_XCB
   xcb_connection_t *xcb_conn;
 #endif
-  char *cm_atom_sprintf;
+  static char const cm_atom_fmt[] = "_NET_WM_CM_S%d";
+  char cm_atom_sprintf[sizeof cm_atom_fmt - 2 + INT_STRLEN_BOUND (int)];
+#ifdef USE_GTK
+  GdkDisplay *gdpy;
+  GdkScreen *gscr;
+#endif
 
   block_input ();
 
@@ -23314,6 +25875,11 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
     }
 #endif
 
+  /* Select for structure events on the root window, since this allows
+     us to record changes to the size of the screen.  */
+
+  XSelectInput (dpy, DefaultRootWindow (dpy), StructureNotifyMask);
+
   /* We have definitely succeeded.  Record the new connection.  */
 
   dpyinfo = xzalloc (sizeof *dpyinfo);
@@ -23332,7 +25898,8 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
       {
        terminal->kboard = allocate_kboard (Qx);
 
-       if (!EQ (XSYMBOL (Qvendor_specific_keysyms)->u.s.function, Qunbound))
+       if (!BASE_EQ (XSYMBOL (Qvendor_specific_keysyms)->u.s.function,
+                     Qunbound))
          {
            char *vendor = ServerVendor (dpy);
 
@@ -23375,12 +25942,14 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
   dpyinfo->color_names_size = 256;
   dpyinfo->color_names = xzalloc (dpyinfo->color_names_size
                                  * sizeof *dpyinfo->color_names);
+  dpyinfo->color_names_length = xzalloc (dpyinfo->color_names_size
+                                        * sizeof *dpyinfo->color_names_length);
 
   /* Set the name of the terminal. */
   terminal->name = xlispstrdup (display_name);
 
 #if false
-  XSetAfterFunction (x_current_display, x_trace_wire);
+  XSetAfterFunction (dpyinfo->display, x_trace_wire);
 #endif
 
   Lisp_Object system_name = Fsystem_name ();
@@ -23754,17 +26323,59 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
   ;
 #endif
 
+#if defined HAVE_XRANDR || defined USE_GTK
+  Lisp_Object term;
+
+  XSETTERMINAL (term, terminal);
+#endif
+
 #ifdef HAVE_XRANDR
-  int xrr_event_base, xrr_error_base;
-  bool xrr_ok = false;
-  xrr_ok = XRRQueryExtension (dpy, &xrr_event_base, &xrr_error_base);
-  if (xrr_ok)
+  dpyinfo->xrandr_supported_p
+    = XRRQueryExtension (dpy, &dpyinfo->xrandr_event_base,
+                        &dpyinfo->xrandr_error_base);
+
+#ifndef USE_GTK
+  dpyinfo->last_monitor_attributes_list = Qnil;
+#endif
+
+  if (dpyinfo->xrandr_supported_p)
     {
       XRRQueryVersion (dpy, &dpyinfo->xrandr_major_version,
                       &dpyinfo->xrandr_minor_version);
+
+#ifndef USE_GTK
+      if (dpyinfo->xrandr_major_version == 1
+         && dpyinfo->xrandr_minor_version >= 2)
+       {
+         XRRSelectInput (dpyinfo->display,
+                         dpyinfo->root_window,
+                         (RRScreenChangeNotifyMask
+                          | RRCrtcChangeNotifyMask
+                          | RROutputChangeNotifyMask
+                          /* Emacs doesn't actually need this, but GTK
+                             selects for it when the display is
+                             initialized.  */
+                          | RROutputPropertyNotifyMask));
+
+         dpyinfo->last_monitor_attributes_list
+           = Fx_display_monitor_attributes_list (term);
+       }
+#endif
     }
 #endif
 
+#ifdef USE_GTK
+  dpyinfo->last_monitor_attributes_list
+    = Fx_display_monitor_attributes_list (term);
+
+  gdpy = gdk_x11_lookup_xdisplay (dpyinfo->display);
+  gscr = gdk_display_get_default_screen (gdpy);
+
+  g_signal_connect (G_OBJECT (gscr), "monitors-changed",
+                   G_CALLBACK (x_monitors_changed_cb),
+                   NULL);
+#endif
+
 #ifdef HAVE_XKB
   int xkb_major, xkb_minor, xkb_op, xkb_error_code;
   xkb_major = XkbMajorVersion;
@@ -23843,141 +26454,12 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
       dpyinfo->resx = (mm < 1) ? 100 : pixels * 25.4 / mm;
     }
 
-  {
-    int n = snprintf (NULL, 0, "_NET_WM_CM_S%d",
-                     XScreenNumberOfScreen (dpyinfo->screen));
-    cm_atom_sprintf = alloca (n + 1);
-
-    snprintf (cm_atom_sprintf, n + 1, "_NET_WM_CM_S%d",
-             XScreenNumberOfScreen (dpyinfo->screen));
-  }
+  sprintf (cm_atom_sprintf, cm_atom_fmt,
+          XScreenNumberOfScreen (dpyinfo->screen));
 
   {
-    static const struct
-    {
-      const char *name;
-      int offset;
-    } atom_refs[] = {
-#define ATOM_REFS_INIT(string, member) \
-      { string, offsetof (struct x_display_info, member) },
-      ATOM_REFS_INIT ("WM_PROTOCOLS", Xatom_wm_protocols)
-      ATOM_REFS_INIT ("WM_TAKE_FOCUS", Xatom_wm_take_focus)
-      ATOM_REFS_INIT ("WM_SAVE_YOURSELF", Xatom_wm_save_yourself)
-      ATOM_REFS_INIT ("WM_DELETE_WINDOW", Xatom_wm_delete_window)
-      ATOM_REFS_INIT ("WM_CHANGE_STATE", Xatom_wm_change_state)
-      ATOM_REFS_INIT ("WM_STATE", Xatom_wm_state)
-      ATOM_REFS_INIT ("WM_CONFIGURE_DENIED", Xatom_wm_configure_denied)
-      ATOM_REFS_INIT ("WM_MOVED", Xatom_wm_window_moved)
-      ATOM_REFS_INIT ("WM_CLIENT_LEADER", Xatom_wm_client_leader)
-      ATOM_REFS_INIT ("WM_TRANSIENT_FOR", Xatom_wm_transient_for)
-      ATOM_REFS_INIT ("Editres", Xatom_editres)
-      ATOM_REFS_INIT ("CLIPBOARD", Xatom_CLIPBOARD)
-      ATOM_REFS_INIT ("TIMESTAMP", Xatom_TIMESTAMP)
-      ATOM_REFS_INIT ("TEXT", Xatom_TEXT)
-      ATOM_REFS_INIT ("COMPOUND_TEXT", Xatom_COMPOUND_TEXT)
-      ATOM_REFS_INIT ("UTF8_STRING", Xatom_UTF8_STRING)
-      ATOM_REFS_INIT ("DELETE", Xatom_DELETE)
-      ATOM_REFS_INIT ("MULTIPLE", Xatom_MULTIPLE)
-      ATOM_REFS_INIT ("INCR", Xatom_INCR)
-      ATOM_REFS_INIT ("_EMACS_TMP_",  Xatom_EMACS_TMP)
-      ATOM_REFS_INIT ("EMACS_SERVER_TIME_PROP", Xatom_EMACS_SERVER_TIME_PROP)
-      ATOM_REFS_INIT ("TARGETS", Xatom_TARGETS)
-      ATOM_REFS_INIT ("NULL", Xatom_NULL)
-      ATOM_REFS_INIT ("ATOM", Xatom_ATOM)
-      ATOM_REFS_INIT ("ATOM_PAIR", Xatom_ATOM_PAIR)
-      ATOM_REFS_INIT ("CLIPBOARD_MANAGER", Xatom_CLIPBOARD_MANAGER)
-      ATOM_REFS_INIT ("_XEMBED_INFO", Xatom_XEMBED_INFO)
-      ATOM_REFS_INIT ("_MOTIF_WM_HINTS", Xatom_MOTIF_WM_HINTS)
-      /* For properties of font.  */
-      ATOM_REFS_INIT ("PIXEL_SIZE", Xatom_PIXEL_SIZE)
-      ATOM_REFS_INIT ("AVERAGE_WIDTH", Xatom_AVERAGE_WIDTH)
-      ATOM_REFS_INIT ("_MULE_BASELINE_OFFSET", Xatom_MULE_BASELINE_OFFSET)
-      ATOM_REFS_INIT ("_MULE_RELATIVE_COMPOSE", Xatom_MULE_RELATIVE_COMPOSE)
-      ATOM_REFS_INIT ("_MULE_DEFAULT_ASCENT", Xatom_MULE_DEFAULT_ASCENT)
-      /* Ghostscript support.  */
-      ATOM_REFS_INIT ("DONE", Xatom_DONE)
-      ATOM_REFS_INIT ("PAGE", Xatom_PAGE)
-      ATOM_REFS_INIT ("SCROLLBAR", Xatom_Scrollbar)
-      ATOM_REFS_INIT ("HORIZONTAL_SCROLLBAR", Xatom_Horizontal_Scrollbar)
-      ATOM_REFS_INIT ("_XEMBED", Xatom_XEMBED)
-      /* EWMH */
-      ATOM_REFS_INIT ("_NET_WM_STATE", Xatom_net_wm_state)
-      ATOM_REFS_INIT ("_NET_WM_STATE_FULLSCREEN", 
Xatom_net_wm_state_fullscreen)
-      ATOM_REFS_INIT ("_NET_WM_STATE_MAXIMIZED_HORZ",
-                     Xatom_net_wm_state_maximized_horz)
-      ATOM_REFS_INIT ("_NET_WM_STATE_MAXIMIZED_VERT",
-                     Xatom_net_wm_state_maximized_vert)
-      ATOM_REFS_INIT ("_NET_WM_STATE_STICKY", Xatom_net_wm_state_sticky)
-      ATOM_REFS_INIT ("_NET_WM_STATE_SHADED", Xatom_net_wm_state_shaded)
-      ATOM_REFS_INIT ("_NET_WM_STATE_HIDDEN", Xatom_net_wm_state_hidden)
-      ATOM_REFS_INIT ("_NET_WM_WINDOW_TYPE", Xatom_net_window_type)
-      ATOM_REFS_INIT ("_NET_WM_WINDOW_TYPE_TOOLTIP",
-                     Xatom_net_window_type_tooltip)
-      ATOM_REFS_INIT ("_NET_WM_ICON_NAME", Xatom_net_wm_icon_name)
-      ATOM_REFS_INIT ("_NET_WM_NAME", Xatom_net_wm_name)
-      ATOM_REFS_INIT ("_NET_SUPPORTED",  Xatom_net_supported)
-      ATOM_REFS_INIT ("_NET_SUPPORTING_WM_CHECK", 
Xatom_net_supporting_wm_check)
-      ATOM_REFS_INIT ("_NET_WM_WINDOW_OPACITY", Xatom_net_wm_window_opacity)
-      ATOM_REFS_INIT ("_NET_ACTIVE_WINDOW", Xatom_net_active_window)
-      ATOM_REFS_INIT ("_NET_FRAME_EXTENTS", Xatom_net_frame_extents)
-      ATOM_REFS_INIT ("_NET_CURRENT_DESKTOP", Xatom_net_current_desktop)
-      ATOM_REFS_INIT ("_NET_WORKAREA", Xatom_net_workarea)
-      ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST", Xatom_net_wm_sync_request)
-      ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST_COUNTER", 
Xatom_net_wm_sync_request_counter)
-      ATOM_REFS_INIT ("_NET_WM_FRAME_DRAWN", Xatom_net_wm_frame_drawn)
-      ATOM_REFS_INIT ("_NET_WM_USER_TIME", Xatom_net_wm_user_time)
-      ATOM_REFS_INIT ("_NET_WM_USER_TIME_WINDOW", 
Xatom_net_wm_user_time_window)
-      ATOM_REFS_INIT ("_NET_CLIENT_LIST_STACKING", 
Xatom_net_client_list_stacking)
-      /* Session management */
-      ATOM_REFS_INIT ("SM_CLIENT_ID", Xatom_SM_CLIENT_ID)
-      ATOM_REFS_INIT ("_XSETTINGS_SETTINGS", Xatom_xsettings_prop)
-      ATOM_REFS_INIT ("MANAGER", Xatom_xsettings_mgr)
-      ATOM_REFS_INIT ("_NET_WM_STATE_SKIP_TASKBAR", 
Xatom_net_wm_state_skip_taskbar)
-      ATOM_REFS_INIT ("_NET_WM_STATE_ABOVE", Xatom_net_wm_state_above)
-      ATOM_REFS_INIT ("_NET_WM_STATE_BELOW", Xatom_net_wm_state_below)
-      ATOM_REFS_INIT ("_NET_WM_OPAQUE_REGION", Xatom_net_wm_opaque_region)
-      ATOM_REFS_INIT ("_NET_WM_PING", Xatom_net_wm_ping)
-      ATOM_REFS_INIT ("_NET_WM_PID", Xatom_net_wm_pid)
-#ifdef HAVE_XKB
-      ATOM_REFS_INIT ("Meta", Xatom_Meta)
-      ATOM_REFS_INIT ("Super", Xatom_Super)
-      ATOM_REFS_INIT ("Hyper", Xatom_Hyper)
-      ATOM_REFS_INIT ("ShiftLock", Xatom_ShiftLock)
-      ATOM_REFS_INIT ("Alt", Xatom_Alt)
-#endif
-      /* DND source.  */
-      ATOM_REFS_INIT ("XdndAware", Xatom_XdndAware)
-      ATOM_REFS_INIT ("XdndSelection", Xatom_XdndSelection)
-      ATOM_REFS_INIT ("XdndTypeList", Xatom_XdndTypeList)
-      ATOM_REFS_INIT ("XdndActionCopy", Xatom_XdndActionCopy)
-      ATOM_REFS_INIT ("XdndActionMove", Xatom_XdndActionMove)
-      ATOM_REFS_INIT ("XdndActionLink", Xatom_XdndActionLink)
-      ATOM_REFS_INIT ("XdndActionAsk", Xatom_XdndActionAsk)
-      ATOM_REFS_INIT ("XdndActionPrivate", Xatom_XdndActionPrivate)
-      ATOM_REFS_INIT ("XdndActionList", Xatom_XdndActionList)
-      ATOM_REFS_INIT ("XdndActionDescription", Xatom_XdndActionDescription)
-      ATOM_REFS_INIT ("XdndProxy", Xatom_XdndProxy)
-      ATOM_REFS_INIT ("XdndEnter", Xatom_XdndEnter)
-      ATOM_REFS_INIT ("XdndPosition", Xatom_XdndPosition)
-      ATOM_REFS_INIT ("XdndStatus", Xatom_XdndStatus)
-      ATOM_REFS_INIT ("XdndLeave", Xatom_XdndLeave)
-      ATOM_REFS_INIT ("XdndDrop", Xatom_XdndDrop)
-      ATOM_REFS_INIT ("XdndFinished", Xatom_XdndFinished)
-      /* Motif drop protocol support.  */
-      ATOM_REFS_INIT ("_MOTIF_DRAG_WINDOW", Xatom_MOTIF_DRAG_WINDOW)
-      ATOM_REFS_INIT ("_MOTIF_DRAG_TARGETS", Xatom_MOTIF_DRAG_TARGETS)
-      ATOM_REFS_INIT ("_MOTIF_DRAG_AND_DROP_MESSAGE",
-                     Xatom_MOTIF_DRAG_AND_DROP_MESSAGE)
-      ATOM_REFS_INIT ("_MOTIF_DRAG_INITIATOR_INFO",
-                     Xatom_MOTIF_DRAG_INITIATOR_INFO)
-      ATOM_REFS_INIT ("_MOTIF_DRAG_RECEIVER_INFO",
-                     Xatom_MOTIF_DRAG_RECEIVER_INFO)
-      ATOM_REFS_INIT ("XmTRANSFER_SUCCESS", Xatom_XmTRANSFER_SUCCESS)
-      ATOM_REFS_INIT ("XmTRANSFER_FAILURE", Xatom_XmTRANSFER_FAILURE)
-    };
-
     int i;
-    enum { atom_count = ARRAYELTS (atom_refs) };
+    enum { atom_count = ARRAYELTS (x_atom_refs) };
     /* 1 for _XSETTINGS_SN.  */
     enum { total_atom_count = 2 + atom_count };
     Atom atoms_return[total_atom_count];
@@ -23987,7 +26469,7 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
                             + INT_STRLEN_BOUND (int)];
 
     for (i = 0; i < atom_count; i++)
-      atom_names[i] = (char *) atom_refs[i].name;
+      atom_names[i] = (char *) x_atom_refs[i].name;
 
     /* Build _XSETTINGS_SN atom name.  */
     sprintf (xsettings_atom_name, xsettings_fmt,
@@ -23999,7 +26481,7 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
                   False, atoms_return);
 
     for (i = 0; i < atom_count; i++)
-      *(Atom *) ((char *) dpyinfo + atom_refs[i].offset) = atoms_return[i];
+      *(Atom *) ((char *) dpyinfo + x_atom_refs[i].offset) = atoms_return[i];
 
     /* Manually copy last two atoms.  */
     dpyinfo->Xatom_xsettings_sel = atoms_return[i];
@@ -24126,7 +26608,7 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
   /* Only do this for the very first display in the Emacs session.
      Ignore X session management when Emacs was first started on a
      tty or started as a daemon.  */
-  if (terminal->id == 1 && ! IS_DAEMON)
+  if (!dpyinfo->next && ! IS_DAEMON)
     x_session_initialize (dpyinfo);
 #endif
 
@@ -24154,6 +26636,7 @@ x_delete_display (struct x_display_info *dpyinfo)
   struct terminal *t;
   struct color_name_cache_entry *color_entry, *next_color_entry;
   int i;
+  struct x_selection_request_event *ie, *last, *temp;
 
   /* Close all frames and delete the generic struct terminal for this
      X display.  */
@@ -24169,6 +26652,30 @@ x_delete_display (struct x_display_info *dpyinfo)
         break;
       }
 
+  /* Find any pending selection requests for this display and unchain
+     them.  */
+
+  last = NULL;
+
+  for (ie = pending_selection_requests; ie; ie = ie->next)
+    {
+    again:
+
+      if (SELECTION_EVENT_DPYINFO (&ie->se) == dpyinfo)
+       {
+         if (last)
+           last->next = ie->next;
+
+         temp = ie;
+         ie = ie->next;
+         xfree (temp);
+
+         goto again;
+       }
+
+      last = ie;
+    }
+
   if (next_noop_dpyinfo == dpyinfo)
     next_noop_dpyinfo = dpyinfo->next;
 
@@ -24199,6 +26706,7 @@ x_delete_display (struct x_display_info *dpyinfo)
     }
 
   xfree (dpyinfo->color_names);
+  xfree (dpyinfo->color_names_length);
   xfree (dpyinfo->x_id_name);
   xfree (dpyinfo->x_dnd_atoms);
   xfree (dpyinfo->color_cells);
@@ -24335,11 +26843,12 @@ x_delete_terminal (struct terminal *terminal)
          x_dnd_last_seen_window = None;
          x_dnd_last_seen_toplevel = None;
          x_dnd_in_progress = false;
-         x_set_dnd_targets (NULL, 0);
          x_dnd_waiting_for_finish = false;
 
+         /* The display is going away, so there's no point in
+            de-selecting for input on the DND toplevels.  */
          if (x_dnd_use_toplevels)
-           x_dnd_free_toplevels ();
+           x_dnd_free_toplevels (false);
 
          x_dnd_return_frame_object = NULL;
          x_dnd_movement_frame = NULL;
@@ -24576,7 +27085,8 @@ mark_xterm (void)
       mark_object (val);
     }
 
-#if defined HAVE_XINPUT2 || defined USE_TOOLKIT_SCROLL_BARS
+#if defined HAVE_XINPUT2 || defined USE_TOOLKIT_SCROLL_BARS \
+  || defined HAVE_XRANDR || defined USE_GTK
   for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
     {
 #ifdef HAVE_XINPUT2
@@ -24586,6 +27096,9 @@ mark_xterm (void)
 #ifdef USE_TOOLKIT_SCROLL_BARS
       for (i = 0; i < dpyinfo->n_protected_windows; ++i)
        mark_object (dpyinfo->protected_windows[i]);
+#endif
+#if defined HAVE_XRANDR || defined USE_GTK
+      mark_object (dpyinfo->last_monitor_attributes_list);
 #endif
     }
 #endif
@@ -24597,9 +27110,16 @@ syms_of_xterm (void)
   x_error_message = NULL;
   PDUMPER_IGNORE (x_error_message);
 
+  x_dnd_monitors = Qnil;
+  staticpro (&x_dnd_monitors);
+
+  x_dnd_action_symbol = Qnil;
+  staticpro (&x_dnd_action_symbol);
+
   DEFSYM (Qvendor_specific_keysyms, "vendor-specific-keysyms");
   DEFSYM (Qlatin_1, "latin-1");
   DEFSYM (Qnow, "now");
+  DEFSYM (Qx_dnd_targets_list, "x-dnd-targets-list");
 
 #ifdef USE_GTK
   xg_default_icon_file = build_pure_c_string 
("icons/hicolor/scalable/apps/emacs.svg");
@@ -24637,9 +27157,21 @@ This variable is used only when the window manager 
requires that you
 click on a frame to select it (give it focus).  In that case, a value
 of nil, means that the selected window and cursor position changes to
 reflect the mouse click position, while a non-nil value means that the
-selected window or cursor position is preserved.  */);
+selected window or cursor position is preserved.
+
+This option works by ignoring button press events for a given amount
+of time after a frame might've been focused.  If it does not work for
+you, try increasing the value of
+`x-mouse-click-focus-ignore-time'.  */);
   x_mouse_click_focus_ignore_position = false;
 
+  DEFVAR_INT ("x-mouse-click-focus-ignore-time", 
x_mouse_click_focus_ignore_time,
+    doc: /* Number of miliseconds for which to ignore buttons after focus 
change.
+This variable only takes effect if
+`x-mouse-click-focus-ignore-position' is non-nil, and should be
+adjusted if the default value does not work for whatever reason.  */);
+  x_mouse_click_focus_ignore_time = 200;
+
   DEFVAR_LISP ("x-toolkit-scroll-bars", Vx_toolkit_scroll_bars,
     doc: /* Which toolkit scroll bars Emacs uses, if any.
 A value of nil means Emacs doesn't use toolkit scroll bars.
@@ -24791,6 +27323,13 @@ during a drag-and-drop session, to work around broken 
implementations
 of Motif.  */);
   x_dnd_fix_motif_leave = true;
 
+  DEFVAR_BOOL ("x-dnd-disable-motif-drag", x_dnd_disable_motif_drag,
+              doc: /* Disable the Motif drag protocol during DND.
+This reduces network usage, but also means you can no longer scroll
+around inside the Motif window underneath the cursor during
+drag-and-drop.  */);
+  x_dnd_disable_motif_drag = false;
+
   DEFVAR_LISP ("x-dnd-movement-function", Vx_dnd_movement_function,
     doc: /* Function called upon mouse movement on a frame during 
drag-and-drop.
 It should either be nil, or accept two arguments FRAME and POSITION,
@@ -24800,16 +27339,41 @@ mouse position list.  */);
 
   DEFVAR_LISP ("x-dnd-unsupported-drop-function", 
Vx_dnd_unsupported_drop_function,
     doc: /* Function called when trying to drop on an unsupported window.
-This function is called whenever the user tries to drop
-something on a window that does not support either the XDND or
-Motif protocols for drag-and-drop.  It should return a non-nil
-value if the drop was handled by the function, and nil if it was
-not.  It should accept several arguments TARGETS, X, Y, ACTION,
-WINDOW-ID and FRAME, where TARGETS is the list of targets that
-was passed to `x-begin-drag', WINDOW-ID is the numeric XID of
-the window that is being dropped on, X and Y are the root
-window-relative coordinates where the drop happened, ACTION
-is the action that was passed to `x-begin-drag', and FRAME is
-the frame which initiated the drag-and-drop operation.  */);
+This function is called whenever the user tries to drop something on a
+window that does not support either the XDND or Motif protocols for
+drag-and-drop.  It should return a non-nil value if the drop was
+handled by the function, and nil if it was not.  It should accept
+several arguments TARGETS, X, Y, ACTION, WINDOW-ID, FRAME and TIME,
+where TARGETS is the list of targets that was passed to
+`x-begin-drag', WINDOW-ID is the numeric XID of the window that is
+being dropped on, X and Y are the root window-relative coordinates
+where the drop happened, ACTION is the action that was passed to
+`x-begin-drag', FRAME is the frame which initiated the drag-and-drop
+operation, and TIME is the X server time when the drop happened.  */);
   Vx_dnd_unsupported_drop_function = Qnil;
+
+  DEFVAR_INT ("x-color-cache-bucket-size", x_color_cache_bucket_size,
+    doc: /* Max number of buckets allowed per display in the internal color 
cache.
+Values less than 1 mean 128.  This option is for debugging only.  */);
+  x_color_cache_bucket_size = 128;
+
+  DEFVAR_LISP ("x-dnd-targets-list", Vx_dnd_targets_list,
+    doc: /* List of drag-and-drop targets.
+This variable contains the list of drag-and-drop selection targets
+during a drag-and-drop operation, in the same format as the TARGET
+argument to `x-begin-drag'.  */);
+  Vx_dnd_targets_list = Qnil;
+
+  DEFVAR_LISP ("x-dnd-native-test-function", Vx_dnd_native_test_function,
+    doc: /* Function that determines return value of drag-and-drop on Emacs 
frames.
+If the value is a function, `x-begin-drag' will call it with two
+arguments, POS and ACTION, where POS is a mouse position list
+that specifies the location of the drop, and ACTION is the
+action specified by the caller of `x-begin-drag'.  The function
+should return a symbol describing what to return from
+`x-begin-drag' if the drop happens on an Emacs frame.
+
+If the value is nil, or the function returns a value that is not
+a symbol, a drop on an Emacs frame will be canceled.  */);
+  Vx_dnd_native_test_function = Qnil;
 }
diff --git a/src/xterm.h b/src/xterm.h
index 3e06564bee..82b4308041 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -196,8 +196,15 @@ extern cairo_pattern_t *x_bitmap_stipple (struct frame *, 
Pixmap);
 struct color_name_cache_entry
 {
   struct color_name_cache_entry *next;
+
+  /* The color values of the cached color entry.  */
   XColor rgb;
+
+  /* The name of the cached color.  */
   char *name;
+
+  /* Whether or not RGB is valid (i.e. the color actually exists).  */
+  bool_bf valid : 1;
 };
 
 #ifdef HAVE_XINPUT2
@@ -513,6 +520,9 @@ struct x_display_info
   /* A cache mapping color names to RGB values.  */
   struct color_name_cache_entry **color_names;
 
+  /* The number of buckets for each hash in that hash table.  */
+  ptrdiff_t *color_names_length;
+
   /* The size of that hash table.  */
   int color_names_size;
 
@@ -595,10 +605,19 @@ struct x_display_info
   XModifierKeymap *modmap;
 
 #ifdef HAVE_XRANDR
+  bool xrandr_supported_p;
+  int xrandr_event_base;
+  int xrandr_error_base;
   int xrandr_major_version;
   int xrandr_minor_version;
 #endif
 
+#if defined HAVE_XRANDR || defined USE_GTK
+  /* This is used to determine if the monitor configuration really
+     changed upon receiving a monitor change event.  */
+  Lisp_Object last_monitor_attributes_list;
+#endif
+
 #if defined USE_CAIRO || defined HAVE_XRENDER
   XExtCodes *ext_codes;
 #endif
@@ -683,6 +702,17 @@ struct x_display_info
   int n_protected_windows;
   int protected_windows_max;
 #endif
+
+  /* The current dimensions of the screen.  This is updated when a
+     ConfigureNotify is received for the root window, and is zero if
+     that didn't happen.  */
+  int screen_width;
+  int screen_height;
+
+  /* The mm width and height of the screen.  Updated on
+     RRScreenChangeNotify.  */
+  int screen_mm_width;
+  int screen_mm_height;
 };
 
 #ifdef HAVE_X_I18N
@@ -706,6 +736,9 @@ extern bool x_display_ok (const char *);
 extern void select_visual (struct x_display_info *);
 
 extern Window tip_window;
+extern Lisp_Object tip_dx;
+extern Lisp_Object tip_dy;
+extern Lisp_Object tip_frame;
 
 /* Each X frame object points to its own struct x_output object
    in the output_data.x field.  The x_output structure contains
@@ -925,6 +958,10 @@ struct x_output
      false, tell Xt not to wait.  */
   bool_bf wait_for_wm : 1;
 
+  /* True if this frame's alpha value is the same for both the active
+     and inactive states.  */
+  bool_bf alpha_identical_p : 1;
+
 #ifdef HAVE_X_I18N
   /* Input context (currently, this means Compose key handler setup).  */
   XIC xic;
@@ -1352,8 +1389,8 @@ extern const char *x_get_string_resource (void *, const 
char *, const char *);
 
 /* Defined in xterm.c */
 
-typedef void (*x_special_error_handler)(Display *, XErrorEvent *, char *,
-                                       void *);
+typedef void (*x_special_error_handler) (Display *, XErrorEvent *, char *,
+                                        void *);
 
 extern bool x_text_icon (struct frame *, const char *);
 extern void x_catch_errors (Display *);
@@ -1362,6 +1399,7 @@ extern void x_catch_errors_with_handler (Display *, 
x_special_error_handler,
 extern void x_check_errors (Display *, const char *)
   ATTRIBUTE_FORMAT_PRINTF (2, 0);
 extern bool x_had_errors_p (Display *);
+extern void x_unwind_errors_to (int);
 extern void x_uncatch_errors (void);
 extern void x_uncatch_errors_after_check (void);
 extern void x_clear_errors (Display *);
@@ -1372,7 +1410,8 @@ extern void x_iconify_frame (struct frame *f);
 extern void x_free_frame_resources (struct frame *);
 extern void x_wm_set_size_hint (struct frame *, long, bool);
 
-extern void x_delete_terminal (struct terminal *terminal);
+extern void x_delete_terminal (struct terminal *);
+extern Cursor x_create_font_cursor (struct x_display_info *, int);
 extern unsigned long x_copy_color (struct frame *, unsigned long);
 #ifdef USE_X_TOOLKIT
 extern XtAppContext Xt_app_con;
@@ -1390,6 +1429,7 @@ extern void x_clear_area (struct frame *f, int, int, int, 
int);
   || (!defined USE_X_TOOLKIT && !defined USE_GTK)
 extern void x_mouse_leave (struct x_display_info *);
 #endif
+extern void x_wait_for_cell_change (Lisp_Object, struct timespec);
 
 #ifndef USE_GTK
 extern int x_dispatch_event (XEvent *, Display *);
@@ -1419,25 +1459,24 @@ extern void x_xr_reset_ext_clip (struct frame *f);
 extern void x_scroll_bar_configure (GdkEvent *);
 #endif
 
+#define DEFER_SELECTIONS                                               \
+  x_defer_selection_requests ();                                       \
+  record_unwind_protect_void (x_release_selection_requests_and_flush)
+
+extern void x_defer_selection_requests (void);
+extern void x_release_selection_requests_and_flush (void);
+extern void x_handle_pending_selection_requests (void);
+extern bool x_detect_pending_selection_requests (void);
 extern Lisp_Object x_dnd_begin_drag_and_drop (struct frame *, Time, Atom,
                                              Lisp_Object, Atom *, const char 
**,
-                                             size_t, bool);
+                                             size_t, bool, Atom *, int,
+                                             Lisp_Object, bool);
 extern void x_dnd_do_unsupported_drop (struct x_display_info *, Lisp_Object,
                                       Lisp_Object, Lisp_Object, Window, int,
                                       int, Time);
-extern void x_set_dnd_targets (Atom *, int);
-
-INLINE int
-x_display_pixel_height (struct x_display_info *dpyinfo)
-{
-  return HeightOfScreen (dpyinfo->screen);
-}
 
-INLINE int
-x_display_pixel_width (struct x_display_info *dpyinfo)
-{
-  return WidthOfScreen (dpyinfo->screen);
-}
+extern int x_display_pixel_height (struct x_display_info *);
+extern int x_display_pixel_width (struct x_display_info *);
 
 INLINE unsigned long
 x_make_truecolor_pixel (struct x_display_info *dpyinfo, int r, int g, int b)
@@ -1471,6 +1510,7 @@ extern void x_set_shaded (struct frame *, Lisp_Object, 
Lisp_Object);
 extern void x_set_skip_taskbar (struct frame *, Lisp_Object, Lisp_Object);
 extern void x_set_z_group (struct frame *, Lisp_Object, Lisp_Object);
 extern bool x_wm_supports (struct frame *, Atom);
+extern bool x_wm_supports_1 (struct x_display_info *, Atom);
 extern void x_wait_for_event (struct frame *, int);
 extern void x_clear_under_internal_border (struct frame *f);
 
@@ -1495,11 +1535,13 @@ extern void x_handle_property_notify (const 
XPropertyEvent *);
 extern void x_handle_selection_notify (const XSelectionEvent *);
 extern void x_handle_selection_event (struct selection_input_event *);
 extern void x_clear_frame_selections (struct frame *);
+extern Lisp_Object x_atom_to_symbol (struct x_display_info *, Atom);
 
 extern bool x_handle_dnd_message (struct frame *,
                                  const XClientMessageEvent *,
                                  struct x_display_info *,
-                                 struct input_event *);
+                                 struct input_event *,
+                                 bool, int, int);
 extern int x_check_property_data (Lisp_Object);
 extern void x_fill_property_data (Display *,
                                   Lisp_Object,
@@ -1518,6 +1560,10 @@ extern Lisp_Object x_timestamp_for_selection (struct 
x_display_info *,
                                              Lisp_Object);
 extern void x_set_pending_dnd_time (Time);
 extern void x_own_selection (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Atom x_intern_cached_atom (struct x_display_info *, const char *,
+                                 bool);
+extern char *x_get_atom_name (struct x_display_info *, Atom, bool *)
+  ATTRIBUTE_MALLOC ATTRIBUTE_DEALLOC_FREE;
 
 #ifdef USE_GTK
 extern bool xg_set_icon (struct frame *, Lisp_Object);
@@ -1578,7 +1624,11 @@ extern struct input_event xg_pending_quit_event;
 #endif
 
 extern bool x_dnd_in_progress;
+extern bool x_dnd_waiting_for_finish;
 extern struct frame *x_dnd_frame;
+extern struct frame *x_dnd_finish_frame;
+extern unsigned x_dnd_unsupported_event_level;
+extern int x_error_message_count;
 
 #ifdef HAVE_XINPUT2
 extern struct xi_device_t *xi_device_from_id (struct x_display_info *, int);
diff --git a/test/README b/test/README
index 3d865de78b..17783a4bac 100644
--- a/test/README
+++ b/test/README
@@ -118,11 +118,12 @@ If the $EMACS_TEST_JUNIT_REPORT environment variable is 
set to a file
 name, a JUnit test report is generated under this name.
 
 Some of the tests require a remote temporary directory
-(autorevert-tests.el, filenotify-tests.el, shadowfile-tests.el and
-tramp-tests.el).  Per default, a mock-up connection method is used
-(this might not be possible when running on MS Windows).  If you want
-to test a real remote connection, set $REMOTE_TEMPORARY_FILE_DIRECTORY
-to a suitable value in order to overwrite the default value:
+(autorevert-tests.el, dnd-tests.el, filenotify-tests.el,
+shadowfile-tests.el and tramp-tests.el).  Per default, a mock-up
+connection method is used (this might not be possible when running on
+MS Windows).  If you want to test a real remote connection, set
+$REMOTE_TEMPORARY_FILE_DIRECTORY to a suitable value in order to
+overwrite the default value:
 
     env REMOTE_TEMPORARY_FILE_DIRECTORY=/ssh:host:/tmp make ...
 
diff --git a/test/lisp/ansi-color-tests.el b/test/lisp/ansi-color-tests.el
index 2ff7fc6aaf..1b04e8e9de 100644
--- a/test/lisp/ansi-color-tests.el
+++ b/test/lisp/ansi-color-tests.el
@@ -173,7 +173,7 @@ strings with `eq', this function compares them with 
`equal'."
       (should (ansi-color-tests-equal-props
                propertized-str (buffer-string))))
 
-    ;; \e not followed by '[' and invalid ANSI escape seqences
+    ;; \e not followed by '[' and invalid ANSI escape sequences
     (dolist (fun (list ansi-filt ansi-app))
       (with-temp-buffer
         (should (equal (funcall fun "\e") ""))
diff --git a/test/lisp/autorevert-tests.el b/test/lisp/autorevert-tests.el
index d26e0f5a15..54b1a16b5d 100644
--- a/test/lisp/autorevert-tests.el
+++ b/test/lisp/autorevert-tests.el
@@ -52,10 +52,9 @@
 
 ;;; Code:
 
-(require 'ert)
+(require 'tramp)
 (require 'ert-x)
 (require 'autorevert)
-(require 'tramp)
 
 (setq auto-revert-debug nil
       auto-revert-notify-exclude-dir-regexp "nothing-to-be-excluded"
@@ -70,30 +69,6 @@
 (defvar auto-revert--messages nil
   "Used to collect messages issued during a section of a test.")
 
-;; There is no default value on w32 systems, which could work out of the box.
-(defconst auto-revert-test-remote-temporary-file-directory
-  (cond
-   ((getenv "REMOTE_TEMPORARY_FILE_DIRECTORY"))
-   ((eq system-type 'windows-nt) null-device)
-   (t (add-to-list
-       'tramp-methods
-       '("mock"
-        (tramp-login-program        "sh")
-        (tramp-login-args           (("-i")))
-        (tramp-remote-shell         "/bin/sh")
-        (tramp-remote-shell-args    ("-c"))
-        (tramp-connection-timeout   10)))
-      (add-to-list
-       'tramp-default-host-alist
-       `("\\`mock\\'" nil ,(system-name)))
-      ;; Emacs' Makefile sets $HOME to a nonexistent value.  Needed in
-      ;; batch mode only, therefore.  `temporary-file-directory' might
-      ;; be quoted, so we unquote it just in case.
-      (unless (and (null noninteractive) (file-directory-p "~/"))
-        (setenv "HOME" (file-name-unquote temporary-file-directory)))
-      (format "/mock::%s" temporary-file-directory)))
-  "Temporary directory for Tramp tests.")
-
 ;; Filter suppressed remote file-notify libraries.
 (when (stringp (getenv "REMOTE_FILE_NOTIFY_LIBRARY"))
   (dolist (lib '("inotifywait" "gio-monitor" "gvfs-monitor-dir"))
@@ -114,10 +89,9 @@ being the result.")
       t (ignore-errors
          (and
           (not (getenv "EMACS_HYDRA_CI"))
-          (file-remote-p auto-revert-test-remote-temporary-file-directory)
-          (file-directory-p auto-revert-test-remote-temporary-file-directory)
-          (file-writable-p
-            auto-revert-test-remote-temporary-file-directory))))))
+          (file-remote-p ert-remote-temporary-file-directory)
+          (file-directory-p ert-remote-temporary-file-directory)
+          (file-writable-p ert-remote-temporary-file-directory))))))
   ;; Return result.
   (cdr auto-revert--test-enabled-remote-checked))
 
@@ -146,7 +120,7 @@ This expects `auto-revert--messages' to be bound by
      ,docstring
      :tags '(:expensive-test :unstable)
      (let ((temporary-file-directory
-           auto-revert-test-remote-temporary-file-directory)
+           ert-remote-temporary-file-directory)
            (auto-revert-remote-files t)
           (ert-test (ert-get-test ',test))
            vc-handled-backends)
diff --git a/test/lisp/bookmark-tests.el b/test/lisp/bookmark-tests.el
index ae7331fcc2..a2d8f2d260 100644
--- a/test/lisp/bookmark-tests.el
+++ b/test/lisp/bookmark-tests.el
@@ -197,6 +197,9 @@ the lexically-bound variable `buffer'."
     (bookmark-maybe-historicize-string "foo")
     (should (equal (car bookmark-history) "foo"))))
 
+(defun bookmark-remove-last-modified (bmk)
+  (assoc-delete-all 'last-modified bmk))
+
 (ert-deftest bookmark-tests-make-record ()
   (with-bookmark-test-file
    (let* ((record `("example.txt" (filename . ,bookmark-tests-example-file)
@@ -206,9 +209,11 @@ the lexically-bound variable `buffer'."
                     (defaults "example.txt"))))
      (with-current-buffer buffer
        (goto-char 3)
-       (should (equal (bookmark-make-record) record))
+       (should (equal (bookmark-remove-last-modified (bookmark-make-record))
+                      record))
        ;; calling twice gives same record
-       (should (equal (bookmark-make-record) record))))))
+       (should (equal (bookmark-remove-last-modified (bookmark-make-record))
+                      record))))))
 
 (ert-deftest bookmark-tests-make-record-list ()
   (with-bookmark-test-file-list
@@ -219,9 +224,11 @@ the lexically-bound variable `buffer'."
                     (defaults "example.txt"))))
      (with-current-buffer buffer
        (goto-char 3)
-       (should (equal (bookmark-make-record) record))
+       (should (equal (bookmark-remove-last-modified (bookmark-make-record))
+                      record))
        ;; calling twice gives same record
-       (should (equal (bookmark-make-record) record))))))
+       (should (equal (bookmark-remove-last-modified (bookmark-make-record))
+                      record))))))
 
 (ert-deftest bookmark-tests-make-record-function ()
   (with-bookmark-test
@@ -255,15 +262,18 @@ the lexically-bound variable `buffer'."
        ;; Set first bookmark
        (goto-char (point-min))
        (bookmark-set "foo")
-       (should (equal bookmark-alist (list bmk1)))
+       (should (equal (mapcar #'bookmark-remove-last-modified bookmark-alist)
+                      (list bmk1)))
        ;; Replace that bookmark
        (goto-char (point-max))
        (bookmark-set "foo")
-       (should (equal bookmark-alist (list bmk2)))
+       (should (equal (mapcar #'bookmark-remove-last-modified bookmark-alist)
+                      (list bmk2)))
        ;; Push another bookmark with the same name
        (goto-char (point-min))
        (bookmark-set "foo" t)                   ; NO-OVERWRITE is t
-       (should (equal bookmark-alist (list bmk1 bmk2)))
+       (should (equal (mapcar #'bookmark-remove-last-modified bookmark-alist)
+                      (list bmk1 bmk2)))
 
        ;; 2. bookmark-set-no-overwrite
        ;; Don't overwrite
@@ -271,11 +281,13 @@ the lexically-bound variable `buffer'."
        ;; Set new bookmark
        (setq bookmark-alist nil)
        (bookmark-set-no-overwrite "foo")
-       (should (equal bookmark-alist (list bmk1)))
+       (should (equal (mapcar #'bookmark-remove-last-modified bookmark-alist)
+                      (list bmk1)))
        ;; Push another bookmark with the same name
        (goto-char (point-max))
        (bookmark-set-no-overwrite "foo" t)        ; PUSH-BOOKMARK is t
-       (should (equal bookmark-alist (list bmk2 bmk1)))
+       (should (equal (mapcar #'bookmark-remove-last-modified bookmark-alist)
+                      (list bmk2 bmk1)))
 
        ;; 3. bookmark-set-internal
        (should-error (bookmark-set-internal "foo" "bar" t))))))
diff --git a/test/lisp/calendar/iso8601-tests.el 
b/test/lisp/calendar/iso8601-tests.el
index 6c9e85ec92..f64c498c02 100644
--- a/test/lisp/calendar/iso8601-tests.el
+++ b/test/lisp/calendar/iso8601-tests.el
@@ -82,9 +82,9 @@
   (should (equal (iso8601-parse "2008-03-02T13:47:30Z")
                  '(30 47 13 2 3 2008 nil nil 0)))
   (should (equal (iso8601-parse "2008-03-02T13:47:30+01:00")
-                 '(30 47 13 2 3 2008 nil nil 3600)))
+                 '(30 47 13 2 3 2008 nil -1 3600)))
   (should (equal (iso8601-parse "2008-03-02T13:47:30-01")
-                 '(30 47 13 2 3 2008 nil nil -3600))))
+                 '(30 47 13 2 3 2008 nil -1 -3600))))
 
 (ert-deftest test-iso8601-duration ()
   (should (equal (iso8601-parse-duration "P3Y6M4DT12H30M5S")
@@ -221,24 +221,24 @@
 
 (ert-deftest standard-test-time-of-day-zone ()
   (should (equal (iso8601-parse-time "152746+0100")
-                 '(46 27 15 nil nil nil nil nil 3600)))
+                 '(46 27 15 nil nil nil nil -1 3600)))
   (should (equal (iso8601-parse-time "15:27:46+0100")
-                 '(46 27 15 nil nil nil nil nil 3600)))
+                 '(46 27 15 nil nil nil nil -1 3600)))
 
   (should (equal (iso8601-parse-time "152746+01")
-                 '(46 27 15 nil nil nil nil nil 3600)))
+                 '(46 27 15 nil nil nil nil -1 3600)))
   (should (equal (iso8601-parse-time "15:27:46+01")
-                 '(46 27 15 nil nil nil nil nil 3600)))
+                 '(46 27 15 nil nil nil nil -1 3600)))
 
   (should (equal (iso8601-parse-time "152746-0500")
-                 '(46 27 15 nil nil nil nil nil -18000)))
+                 '(46 27 15 nil nil nil nil -1 -18000)))
   (should (equal (iso8601-parse-time "15:27:46-0500")
-                 '(46 27 15 nil nil nil nil nil -18000)))
+                 '(46 27 15 nil nil nil nil -1 -18000)))
 
   (should (equal (iso8601-parse-time "152746-05")
-                 '(46 27 15 nil nil nil nil nil -18000)))
+                 '(46 27 15 nil nil nil nil -1 -18000)))
   (should (equal (iso8601-parse-time "15:27:46-05")
-                 '(46 27 15 nil nil nil nil nil -18000))))
+                 '(46 27 15 nil nil nil nil -1 -18000))))
 
 
 (defun test-iso8601-format-time-string-zone-round-trip (offset-minutes 
z-format)
diff --git a/test/lisp/dnd-tests.el b/test/lisp/dnd-tests.el
new file mode 100644
index 0000000000..dfd441b56d
--- /dev/null
+++ b/test/lisp/dnd-tests.el
@@ -0,0 +1,375 @@
+;;; dnd-tests.el --- Tests for window system independent DND support -*- 
lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Tests for stuff in dnd.el that doesn't require a window system.
+
+;; The drag API tests only check the behavior of the simplified drag
+;; APIs in dnd.el.  Actual drags are not performed during the
+;; automated testing process (make check), but some of the tests can
+;; also be run under X.
+
+;;; Code:
+
+(require 'dnd)
+(require 'cl-lib)
+(require 'tramp)
+(require 'select)
+(require 'ert-x)
+
+(defvar dnd-tests-selection-table nil
+  "Alist of selection names to their values.")
+
+(defvar x-treat-local-requests-remotely)
+
+;; Define some replacements for functions used by the drag-and-drop
+;; code on X when running under something else.
+(unless (eq window-system 'x)
+  ;; Substitute for x-begin-drag, which isn't present on all systems.
+  (defalias 'x-begin-drag
+    (lambda (_targets &optional action frame &rest _)
+      ;; Verify that frame is either nil or a valid frame.
+      (when (and frame (not (frame-live-p frame)))
+        (signal 'wrong-type-argument frame))
+      ;; Verify that the action is valid and pretend the drag succeeded
+      ;; (by returning the action).
+      (cl-ecase action
+        ('XdndActionCopy action)
+        ('XdndActionMove action)
+        ('XdndActionLink action)
+        ;; These two are not technically valid, but x-begin-drag accepts
+        ;; them anyway.
+        ('XdndActionPrivate action)
+        ('XdndActionAsk 'XdndActionPrivate))))
+
+  ;; This doesn't work during tests.
+  (defalias 'gui-set-selection
+    (lambda (type data)
+      (or (gui--valid-simple-selection-p data)
+          (and (vectorp data)
+              (let ((valid t))
+                (dotimes (i (length data))
+                  (or (gui--valid-simple-selection-p (aref data i))
+                      (setq valid nil)))
+                valid))
+          (signal 'error (list "invalid selection" data)))
+      (setf (alist-get type dnd-tests-selection-table) data))))
+
+(declare-function x-get-selection-internal "xselect.c")
+
+(defun dnd-tests-verify-selection-data (type)
+  "Return the data of the drag-and-drop selection converted to TYPE."
+  (if (eq window-system 'x)
+      (let ((x-treat-local-requests-remotely t))
+        (x-get-selection-internal 'XdndSelection type))
+    (let* ((basic-value (cdr (assq 'XdndSelection
+                                   dnd-tests-selection-table)))
+           (local-value (if (stringp basic-value)
+                            (or (get-text-property 0 type basic-value)
+                                basic-value)
+                          basic-value))
+           (converter-list (cdr (assq type selection-converter-alist)))
+           (converter (if (consp converter-list)
+                          (cdr converter-list)
+                        converter-list)))
+      (if (and local-value converter)
+          (funcall converter 'XdndSelection type local-value)
+        (error "No selection converter or local value: %s" type)))))
+
+(defun dnd-tests-remote-accessible-p ()
+  "Return if a test involving remote files can proceed."
+  (ignore-errors
+    (and
+     (file-remote-p ert-remote-temporary-file-directory)
+     (file-directory-p ert-remote-temporary-file-directory)
+     (file-writable-p ert-remote-temporary-file-directory))))
+
+(defun dnd-tests-make-temp-name ()
+  "Return a temporary remote file name for test.
+The temporary file is not created."
+  (expand-file-name (make-temp-name "dnd-test-remote")
+                    ert-remote-temporary-file-directory))
+
+(defun dnd-tests-parse-tt-netfile (netfile)
+  "Parse NETFILE and return its components.
+NETFILE should be a canonicalized ToolTalk file name.
+Return a list of its hostname, real path, and local path."
+  (save-match-data
+    (when (string-match (concat 
"HOST=0-\\([[:digit:]]+\\),RPATH=\\([[:digit:]]+\\)-"
+                                "\\([[:digit:]]+\\),LPATH=\\([[:digit:]]+\\)-"
+                                "\\([[:digit:]]+\\)\\(:\\)")
+                        netfile)
+      (let ((beg (match-end 6)))
+        (list (substring netfile beg
+                         (+ beg 1
+                            (string-to-number (match-string 1 netfile))))
+              (substring netfile
+                         (+ beg
+                            (string-to-number (match-string 2 netfile)))
+                         (+ beg 1
+                            (string-to-number (match-string 3 netfile))))
+              (substring netfile
+                         (+ beg
+                            (string-to-number (match-string 4 netfile)))
+                         (+ beg 1
+                            (string-to-number (match-string 5 netfile)))))))))
+
+(defun dnd-tests-extract-selection-data (selection expect-cons)
+  "Return the selection data in SELECTION.
+SELECTION can either be the value of `gui-get-selection', or the
+return value of a selection converter.
+
+If EXPECT-CONS, then expect SELECTION to be a cons (when not
+running under X).
+
+This function only tries to handle strings."
+  (when (and expect-cons (not (eq window-system 'x)))
+    (should (and (consp selection)
+                 (stringp (cdr selection)))))
+  (if (stringp selection)
+      selection
+    (cdr selection)))
+
+(ert-deftest dnd-tests-begin-text-drag ()
+  ;; When running this test under X, please make sure to drop onto a
+  ;; program with reasonably correct behavior, such as dtpad, gedit,
+  ;; or Mozilla.
+  ;;                ASCII            Latin-1       UTF-8
+  (let ((test-text "hello, everyone! sæl öllsömul! всем привет"))
+    ;; Verify that dragging works.
+    (should (eq (dnd-begin-text-drag test-text) 'copy))
+    (should (eq (dnd-begin-text-drag test-text nil 'move) 'move))
+    ;; Verify that the important data types are converted correctly.
+    (let ((string-data (dnd-tests-verify-selection-data 'STRING)))
+      ;; Check that the Latin-1 target is converted correctly.
+      (should (equal (dnd-tests-extract-selection-data string-data t)
+                     (encode-coding-string test-text
+                                           'iso-8859-1))))
+    ;; And that UTF8_STRING and the Xdnd UTF8 string are as well.
+    (let* ((string-data (dnd-tests-verify-selection-data
+                         'UTF8_STRING))
+           (string-data-1 (dnd-tests-verify-selection-data
+                           'text/plain\;charset=utf-8))
+           (extracted-1 (dnd-tests-extract-selection-data string-data-1 t))
+           (extracted (dnd-tests-extract-selection-data string-data t)))
+      (should (and (stringp extracted) (stringp extracted-1)))
+      (should (equal extracted extracted)))
+    ;; Now check text/plain.
+    (let ((string-data (dnd-tests-verify-selection-data
+                        'text/plain)))
+      (should (equal (dnd-tests-extract-selection-data string-data t)
+                     (encode-coding-string test-text 'ascii))))))
+
+(ert-deftest dnd-tests-begin-file-drag ()
+  ;; These tests also involve handling remote file names.
+  (skip-unless (and (dnd-tests-remote-accessible-p)
+                    ;; TODO: make these tests work under X.
+                    (not (eq window-system 'x))))
+  (let ((normal-temp-file (expand-file-name (make-temp-name "dnd-test")
+                                            temporary-file-directory))
+        (normal-multibyte-file (expand-file-name
+                                (make-temp-name "тест-на-перетаскивание")
+                                temporary-file-directory))
+        (remote-temp-file (dnd-tests-make-temp-name)))
+    ;; Touch those files if they don't exist.
+    (unless (file-exists-p normal-temp-file)
+      (write-region "" 0 normal-temp-file))
+    (unless (file-exists-p normal-multibyte-file)
+      (write-region "" 0 normal-multibyte-file))
+    (unless (file-exists-p remote-temp-file)
+      (write-region "" 0 remote-temp-file))
+    (unwind-protect
+        (progn
+          ;; Now test dragging a normal file.
+          (should (eq (dnd-begin-file-drag normal-temp-file) 'copy))
+          ;; Test that the selection data is correct.
+          (let ((uri-list-data (cdr (dnd-tests-verify-selection-data 
'text/uri-list)))
+                (username-data (dnd-tests-verify-selection-data 
'text/x-xdnd-username))
+                (file-name-data (cdr (dnd-tests-verify-selection-data 
'FILE_NAME)))
+                (host-name-data (cdr (dnd-tests-verify-selection-data 
'HOST_NAME)))
+                (netfile-data (cdr (dnd-tests-verify-selection-data 
'_DT_NETFILE))))
+            ;; Check if the URI list is formatted correctly.
+            (let* ((split-uri-list (split-string uri-list-data "[\0\r\n]" t))
+                   (decoded (dnd-get-local-file-name (car split-uri-list))))
+              (should (equal decoded normal-temp-file)))
+            ;; Test that the username reported is correct.
+            (should (equal username-data (user-real-login-name)))
+            ;; Test that the file name data is correct.
+            (let* ((split-file-names (split-string file-name-data "\0"))
+                   (file-name (car split-file-names)))
+              ;; Make sure there are no extra leading or trailing NULL bytes.
+              (should (and split-file-names (null (cdr split-file-names))))
+              ;; Make sure the file name is encoded correctly;
+              (should-not (multibyte-string-p file-name))
+              ;; Make sure decoding the file name results in the
+              ;; originals.
+              (should (equal (decode-coding-string file-name
+                                                   (or file-name-coding-system
+                                                       
default-file-name-coding-system))
+                             normal-temp-file))
+              ;; Also make sure the hostname is correct.
+              (should (equal host-name-data (system-name))))
+            ;; Check that the netfile hostname, rpath and lpath are correct.
+            (let ((parsed (dnd-tests-parse-tt-netfile netfile-data))
+                  (filename (encode-coding-string normal-temp-file
+                                                  (or file-name-coding-system
+                                                      
default-file-name-coding-system))))
+              (should (equal (nth 0 parsed) (system-name)))
+              (should (equal (nth 1 parsed) filename))
+              (should (equal (nth 2 parsed) filename))))
+          ;; And the remote file.
+          (should (eq (dnd-begin-file-drag remote-temp-file) 'copy))
+          ;; Test that the remote file was added to the list of files
+          ;; to remove later.
+          (should dnd-last-dragged-remote-file)
+          ;; Test that the remote file was removed.
+          (should (progn
+                    (dnd-begin-file-drag normal-temp-file)
+                    (not dnd-last-dragged-remote-file)))
+          ;; Test that links to remote files can't be created.
+          (should-error (dnd-begin-file-drag remote-temp-file nil 'link))
+          ;; Test dragging a file with a multibyte filename.
+          (should (eq (dnd-begin-file-drag normal-multibyte-file) 'copy))
+          ;; Test that the ToolTalk filename is encodes and decodes correctly.
+          (let* ((netfile-data (cdr (dnd-tests-verify-selection-data 
'_DT_NETFILE)))
+                 (parsed (dnd-tests-parse-tt-netfile netfile-data))
+                 (filename (encode-coding-string normal-multibyte-file
+                                                 (or file-name-coding-system
+                                                     
default-file-name-coding-system))))
+            (should (equal (nth 0 parsed) (system-name)))
+            (should (equal (nth 1 parsed) filename))
+            (should (equal (nth 2 parsed) filename))))
+      (delete-file normal-temp-file)
+      (delete-file normal-multibyte-file)
+      (delete-file remote-temp-file))))
+
+(ert-deftest dnd-tests-begin-drag-files ()
+  (skip-unless (and (dnd-tests-remote-accessible-p)
+                    ;; TODO: make these tests work under X.
+                    (not (eq window-system 'x))))
+  (let ((normal-temp-file (expand-file-name (make-temp-name "dnd-test")
+                                            temporary-file-directory))
+        (normal-temp-file-1 (expand-file-name (make-temp-name "dnd-test")
+                                              temporary-file-directory))
+        (remote-temp-file (dnd-tests-make-temp-name))
+        (nonexistent-local-file
+         (expand-file-name (make-temp-name "dnd-test")
+                           temporary-file-directory))
+        (nonexistent-remote-file (dnd-tests-make-temp-name))
+        (nonexistent-remote-file-1 (dnd-tests-make-temp-name)))
+    ;; Touch those files if they don't exist.
+    (unless (file-exists-p normal-temp-file)
+      (write-region "" 0 normal-temp-file))
+    (unless (file-exists-p normal-temp-file-1)
+      (write-region "" 0 normal-temp-file))
+    (unless (file-exists-p remote-temp-file)
+      (write-region "" 0 remote-temp-file))
+    (ignore-errors
+      (delete-file nonexistent-local-file)
+      (delete-file nonexistent-remote-file)
+      (delete-file nonexistent-remote-file-1))
+    (unwind-protect
+        (progn
+          ;; Now test dragging a normal file and a remote file.
+          (should (eq (dnd-begin-drag-files (list normal-temp-file
+                                                  remote-temp-file))
+                      'copy))
+          ;; Test that the remote file produced was added to the list
+          ;; of files to remove upon the next call.
+          (should dnd-last-dragged-remote-file)
+          ;; Two local files at the same time.
+          (should (eq (dnd-begin-drag-files (list normal-temp-file
+                                                  normal-temp-file-1))
+                      'copy))
+          ;; Test that the remote files were removed.
+          (should-not dnd-last-dragged-remote-file)
+          ;; Test the selection data is correct.
+          (let ((uri-list-data (cdr (dnd-tests-verify-selection-data 
'text/uri-list)))
+                (username-data (dnd-tests-verify-selection-data 
'text/x-xdnd-username))
+                (file-name-data (cdr (dnd-tests-verify-selection-data 
'FILE_NAME)))
+                (host-name-data (cdr (dnd-tests-verify-selection-data 
'HOST_NAME))))
+            ;; Check if the URI list is formatted correctly.
+            (let* ((split-uri-list (split-string uri-list-data "[\0\r\n]" t))
+                   (decoded (mapcar #'dnd-get-local-file-name split-uri-list)))
+              (should (equal (car decoded) normal-temp-file))
+              (should (equal (cadr decoded) normal-temp-file-1)))
+            ;; Test that the username reported is correct.
+            (should (equal username-data (user-real-login-name)))
+            ;; Test that the file name data is correct.
+            (let ((split-file-names (split-string file-name-data "\0")))
+              ;; Make sure there are no extra leading or trailing NULL bytes.
+              (should (equal (length split-file-names) 2))
+              ;; Make sure all file names are encoded correctly;
+              (dolist (name split-file-names)
+                (should-not (multibyte-string-p name)))
+              ;; Make sure decoding the file names result in the
+              ;; originals.
+              (should (equal (decode-coding-string (car split-file-names)
+                                                   (or file-name-coding-system
+                                                       
default-file-name-coding-system))
+                             normal-temp-file))
+              (should (equal (decode-coding-string (cadr split-file-names)
+                                                   (or file-name-coding-system
+                                                       
default-file-name-coding-system))
+                             normal-temp-file-1))
+              ;; Also make sure the hostname is correct.
+              (should (equal host-name-data (system-name)))))
+          ;; Multiple local files with some remote files that will
+          ;; fail, and some that won't.
+          (should (and (eq (dnd-begin-drag-files (list normal-temp-file
+                                                       remote-temp-file
+                                                       remote-temp-file
+                                                       nonexistent-remote-file
+                                                       normal-temp-file-1
+                                                       
nonexistent-remote-file-1))
+                           'copy)
+                       ;; Make sure exactly two valid remote files
+                       ;; were downloaded.
+                       (eq (length dnd-last-dragged-remote-file) 2)))
+          ;; Make sure links can't be created to remote files.
+          (should-error (dnd-begin-drag-files (list normal-temp-file
+                                                    remote-temp-file
+                                                    normal-temp-file-1)
+                                              nil 'link))
+          ;; And that they can to normal files.
+          (should (eq (dnd-begin-drag-files (list normal-temp-file
+                                                  normal-temp-file-1)
+                                            nil 'link)
+                      'link))
+          ;; Make sure you can't drag an empty list of files.
+          (should-error (dnd-begin-drag-files nil))
+          ;; And when all remote files are inaccessible.
+          (should-error (dnd-begin-drag-files (list nonexistent-remote-file
+                                                    
nonexistent-remote-file-1))))
+      (delete-file normal-temp-file)
+      (delete-file normal-temp-file-1)
+      (delete-file remote-temp-file))))
+
+(ert-deftest dnd-tests-get-local-file-uri ()
+  (should (equal (dnd-get-local-file-uri "file://localhost/path/to/foo")
+                 "file:///path/to/foo"))
+  (should (equal (dnd-get-local-file-uri
+                  (format "file://%s/path/to/" (system-name)))
+                 "file:///path/to/"))
+  (should-not (dnd-get-local-file-uri "file://some-remote-host/path/to/foo"))
+  (should-not (dnd-get-local-file-uri "file:///path/to/foo")))
+
+(provide 'dnd-tests)
+;;; dnd-tests.el ends here
diff --git a/test/lisp/emacs-lisp/bindat-tests.el 
b/test/lisp/emacs-lisp/bindat-tests.el
index 7722cf6c02..7d1233ded7 100644
--- a/test/lisp/emacs-lisp/bindat-tests.el
+++ b/test/lisp/emacs-lisp/bindat-tests.el
@@ -36,7 +36,7 @@
   (bindat-type
     (type u8)
     (opcode u8)
-    (length uintr 16) ;; little endian order
+    (length uint 16 'le) ;; little endian order
     (id strz 8)
     (data vec length)
     (_ align 4)))
@@ -128,18 +128,17 @@
           (r (zerop (% kind 2))))
       (dotimes (_ 100)
         (let* ((n (random (ash 1 bitlen)))
-               (i (- n (ash 1 (1- bitlen)))))
+               (i (- n (ash 1 (1- bitlen))))
+               (stype (bindat-type sint bitlen r))
+               (utype (bindat-type if r (uintr bitlen) (uint bitlen))))
           (should (equal (bindat-unpack
-                          (bindat-type sint bitlen r)
-                          (bindat-pack (bindat-type sint bitlen r) i))
+                          stype
+                          (bindat-pack stype i))
                          i))
           (when (>= i 0)
-            (should (equal (bindat-pack
-                            (bindat-type if r (uintr bitlen) (uint bitlen)) i)
-                           (bindat-pack (bindat-type sint bitlen r) i)))
-            (should (equal (bindat-unpack
-                            (bindat-type if r (uintr bitlen) (uint bitlen))
-                            (bindat-pack (bindat-type sint bitlen r) i))
+            (should (equal (bindat-pack utype i)
+                           (bindat-pack stype i)))
+            (should (equal (bindat-unpack utype (bindat-pack stype i))
                            i))))))))
 
 (defconst bindat-test--LEB128
@@ -162,4 +161,125 @@
                                         (bindat-pack bindat-test--LEB128 n))
                          n)))))))
 
+(ert-deftest bindat-test--str-strz-prealloc ()
+  (dolist (tc `(((,(bindat-type str 1) "") . "xx")
+                ((,(bindat-type str 2) "") . "xx")
+                ((,(bindat-type str 2) "a") . "ax")
+                ((,(bindat-type str 2) "ab") . "ab")
+                ((,(bindat-type str 2) "abc") . "ab")
+                ((((x str 1)) ((x . ""))) . "xx")
+                ((((x str 2)) ((x . ""))) . "xx")
+                ((((x str 2)) ((x . "a"))) . "ax")
+                ((((x str 2)) ((x . "ab"))) . "ab")
+                ((((x str 2)) ((x . "abc"))) . "ab")
+                ((,(bindat-type strz 1) "") . "xx")
+                ((,(bindat-type strz 2) "") . "xx")
+                ((,(bindat-type strz 2) "a") . "ax")
+                ((,(bindat-type strz 2) "ab") . "ab")
+                ((,(bindat-type strz 2) "abc") . "ab")
+                ((((x strz 1)) ((x . ""))) . "xx")
+                ((((x strz 2)) ((x . ""))) . "xx")
+                ((((x strz 2)) ((x . "a"))) . "ax")
+                ((((x strz 2)) ((x . "ab"))) . "ab")
+                ((((x strz 2)) ((x . "abc"))) . "ab")
+                ((,(bindat-type strz) "") . "xx")
+                ((,(bindat-type strz) "a") . "ax")))
+    (let ((prealloc (make-string 2 ?x)))
+      (apply #'bindat-pack (append (car tc) (list prealloc)))
+      (should (equal prealloc (cdr tc))))))
+
+(ert-deftest bindat-test--str-strz-multibyte ()
+  (dolist (spec (list (bindat-type str 2)
+                      (bindat-type strz 2)
+                      (bindat-type strz)))
+    (should (equal (bindat-pack spec (string-to-multibyte "x")) "x\0"))
+    (should (equal (bindat-pack spec (string-to-multibyte "\xff")) "\xff\0"))
+    (should-error (bindat-pack spec "💩"))
+    (should-error (bindat-pack spec "\N{U+ff}")))
+  (dolist (spec (list '((x str 2)) '((x strz 2))))
+    (should (equal (bindat-pack spec `((x . ,(string-to-multibyte "x"))))
+                   "x\0"))
+    (should (equal (bindat-pack spec `((x . ,(string-to-multibyte "\xff"))))
+                   "\xff\0"))
+    (should-error (bindat-pack spec '((x . "💩"))))
+    (should-error (bindat-pack spec '((x . "\N{U+ff}"))))))
+
+(let ((spec (bindat-type strz 2)))
+  (ert-deftest bindat-test--strz-fixedlen-len ()
+    (should (equal (bindat-length spec "") 2))
+    (should (equal (bindat-length spec "a") 2)))
+
+  (ert-deftest bindat-test--strz-fixedlen-len-overflow ()
+    (should (equal (bindat-length spec "ab") 2))
+    (should (equal (bindat-length spec "abc") 2)))
+
+  (ert-deftest bindat-test--strz-fixedlen-pack ()
+    (should (equal (bindat-pack spec "") "\0\0"))
+    (should (equal (bindat-pack spec "a") "a\0")))
+
+  (ert-deftest bindat-test--strz-fixedlen-pack-overflow ()
+    ;; This is not the only valid semantic, but it's the one we've
+    ;; offered historically.
+    (should (equal (bindat-pack spec "ab") "ab"))
+    (should (equal (bindat-pack spec "abc") "ab")))
+
+  (ert-deftest bindat-test--strz-fixedlen-unpack ()
+    (should (equal (bindat-unpack spec "\0\0") ""))
+    (should (equal (bindat-unpack spec "\0X") ""))
+    (should (equal (bindat-unpack spec "a\0") "a"))
+    ;; Same comment as for b-t-s-f-pack-overflow.
+    (should (equal (bindat-unpack spec "ab") "ab"))
+    ;; Missing null terminator.
+    (should-error (bindat-unpack spec ""))
+    (should-error (bindat-unpack spec "a"))))
+
+(let ((spec (bindat-type strz)))
+  (ert-deftest bindat-test--strz-varlen-len ()
+    (should (equal (bindat-length spec "") 1))
+    (should (equal (bindat-length spec "abc") 4)))
+
+  (ert-deftest bindat-test--strz-varlen-pack ()
+    (should (equal (bindat-pack spec "") "\0"))
+    (should (equal (bindat-pack spec "abc") "abc\0"))
+    ;; Null bytes in the input string break unpacking.
+    (should-error (bindat-pack spec "\0"))
+    (should-error (bindat-pack spec "\0x"))
+    (should-error (bindat-pack spec "x\0"))
+    (should-error (bindat-pack spec "x\0y")))
+
+  (ert-deftest bindat-test--strz-varlen-unpack ()
+    (should (equal (bindat-unpack spec "\0") ""))
+    (should (equal (bindat-unpack spec "abc\0") "abc"))
+    ;; Missing null terminator.
+    (should-error (bindat-unpack spec ""))
+    (should-error (bindat-unpack spec "a"))))
+
+(let ((spec '((x strz 2))))
+  (ert-deftest bindat-test--strz-legacy-fixedlen-len ()
+    (should (equal (bindat-length spec '((x . ""))) 2))
+    (should (equal (bindat-length spec '((x . "a"))) 2)))
+
+  (ert-deftest bindat-test--strz-legacy-fixedlen-len-overflow ()
+    (should (equal (bindat-length spec '((x . "ab"))) 2))
+    (should (equal (bindat-length spec '((x . "abc"))) 2)))
+
+  (ert-deftest bindat-test--strz-legacy-fixedlen-pack ()
+    (should (equal (bindat-pack spec '((x . ""))) "\0\0"))
+    (should (equal (bindat-pack spec '((x . "a"))) "a\0")))
+
+  (ert-deftest bindat-test--strz-legacy-fixedlen-pack-overflow ()
+    ;; Same comment as for b-t-s-f-pack-overflow.
+    (should (equal (bindat-pack spec '((x . "ab"))) "ab"))
+    (should (equal (bindat-pack spec '((x . "abc"))) "ab")))
+
+  (ert-deftest bindat-test--strz-legacy-fixedlen-unpack ()
+    (should (equal (bindat-unpack spec "\0\0") '((x . ""))))
+    (should (equal (bindat-unpack spec "\0X") '((x . ""))))
+    (should (equal (bindat-unpack spec "a\0") '((x . "a"))))
+    ;; Same comment as for b-t-s-f-pack-overflow.
+    (should (equal (bindat-unpack spec "ab") '((x . "ab"))))
+    ;; Missing null terminator.
+    (should-error (bindat-unpack spec ""))
+    (should-error (bindat-unpack spec "a"))))
+
 ;;; bindat-tests.el ends here
diff --git 
a/test/lisp/emacs-lisp/bytecomp-resources/warn-variable-setq-nonvariable.el 
b/test/lisp/emacs-lisp/bytecomp-resources/warn-variable-setq-nonvariable.el
new file mode 100644
index 0000000000..5a56913cd9
--- /dev/null
+++ b/test/lisp/emacs-lisp/bytecomp-resources/warn-variable-setq-nonvariable.el
@@ -0,0 +1,3 @@
+;;; -*- lexical-binding: t -*-
+(defun foo ()
+  (setq (a) nil))
diff --git a/test/lisp/emacs-lisp/bytecomp-resources/warn-variable-setq-odd.el 
b/test/lisp/emacs-lisp/bytecomp-resources/warn-variable-setq-odd.el
new file mode 100644
index 0000000000..9ce80de08c
--- /dev/null
+++ b/test/lisp/emacs-lisp/bytecomp-resources/warn-variable-setq-odd.el
@@ -0,0 +1,3 @@
+;;; -*- lexical-binding: t -*-
+(defun foo (a b)
+  (setq a 1 b))
diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el 
b/test/lisp/emacs-lisp/bytecomp-tests.el
index abd33ab8e5..9abc17a1c4 100644
--- a/test/lisp/emacs-lisp/bytecomp-tests.el
+++ b/test/lisp/emacs-lisp/bytecomp-tests.el
@@ -747,6 +747,7 @@ byte-compiled.  Run with dynamic binding."
     (ert-with-temp-file elcfile
       :suffix ".elc"
       (with-temp-buffer
+        (insert ";;; -*- lexical-binding: t -*-\n")
         (dolist (form forms)
           (print form (current-buffer)))
         (write-region (point-min) (point-max) elfile nil 'silent))
@@ -950,11 +951,17 @@ byte-compiled.  Run with dynamic binding."
                             "let-bind nonvariable")
 
 (bytecomp--define-warning-file-test "warn-variable-set-constant.el"
-                            "variable reference to constant")
+                            "attempt to set constant")
 
 (bytecomp--define-warning-file-test "warn-variable-set-nonvariable.el"
                             "variable reference to nonvariable")
 
+(bytecomp--define-warning-file-test "warn-variable-setq-nonvariable.el"
+                            "attempt to set non-variable")
+
+(bytecomp--define-warning-file-test "warn-variable-setq-odd.el"
+                            "odd number of arguments")
+
 (bytecomp--define-warning-file-test
  "warn-wide-docstring-autoload.el"
  "autoload .foox. docstring wider than .* characters")
@@ -1227,12 +1234,19 @@ literals (Bug#20852)."
    '((lexical prefixless))
    "global/dynamic var .prefixless. lacks")
 
-  (test-suppression
-   '(defun foo()
-      (let ((nil t))
-        (message-mail)))
-   '((constants nil))
-   "Warning: attempt to let-bind constant .nil.")
+  ;; FIXME: These messages cannot be suppressed reliably right now,
+  ;; but attempting mutate `nil' or `5' is a rather daft thing to do
+  ;; in the first place.  Preventing mutation of constants such as
+  ;; `most-positive-fixnum' makes more sense but the compiler doesn't
+  ;; warn about that at all right now (it's caught at runtime, and we
+  ;; allow writing the same value).
+  ;;
+  ;; (test-suppression
+  ;;  '(defun foo()
+  ;;     (let ((nil t))
+  ;;       (message-mail)))
+  ;;  '((constants nil))
+  ;;  "Warning: attempt to let-bind constant .nil.")
 
   (test-suppression
    '(progn
@@ -1251,7 +1265,7 @@ literals (Bug#20852)."
       (defun zot ()
         (wrong-params 1 2 3)))
    '((callargs wrong-params))
-   "Warning: wrong-params called with")
+   "Warning: .wrong-params. called with")
 
   (test-byte-comp-compile-and-load nil
     (defvar obsolete-variable nil)
@@ -1538,6 +1552,33 @@ EXPECTED-POINT BINDINGS (MODES \\='\\='(ruby-mode 
js-mode python-mode)) \
 (TEST-IN-COMMENTS t) (TEST-IN-STRINGS t) (TEST-IN-CODE t) \
 (FIXTURE-FN \\='#\\='electric-pair-mode))" fill-column)))
 
+(defun test-bytecomp-defgroup-choice ()
+  (should-not (byte-compile--suspicious-defcustom-choice 'integer))
+  (should-not (byte-compile--suspicious-defcustom-choice
+               '(choice (const :tag "foo" bar))))
+  (should (byte-compile--suspicious-defcustom-choice
+           '(choice (const :tag "foo" 'bar)))))
+
+(ert-deftest bytecomp-function-attributes ()
+  ;; Check that `byte-compile' keeps the declarations, interactive spec and
+  ;; doc string of the function (bug#55830).
+  (let ((fname 'bytecomp-test-fun))
+    (fset fname nil)
+    (put fname 'pure nil)
+    (put fname 'lisp-indent-function nil)
+    (eval `(defun ,fname (x)
+             "tata"
+             (declare (pure t) (indent 1))
+             (interactive "P")
+             (list 'toto x))
+          t)
+    (let ((bc (byte-compile fname)))
+      (should (byte-code-function-p bc))
+      (should (equal (funcall bc 'titi) '(toto titi)))
+      (should (equal (aref bc 5) "P"))
+      (should (equal (get fname 'pure) t))
+      (should (equal (get fname 'lisp-indent-function) 1))
+      (should (equal (aref bc 4) "tata\n\n(fn X)")))))
 
 ;; Local Variables:
 ;; no-byte-compile: t
diff --git a/test/lisp/emacs-lisp/find-func-tests.el 
b/test/lisp/emacs-lisp/find-func-tests.el
index d29d9ff656..420c61acb5 100644
--- a/test/lisp/emacs-lisp/find-func-tests.el
+++ b/test/lisp/emacs-lisp/find-func-tests.el
@@ -95,6 +95,13 @@ expected function symbol and function library, respectively."
   (advice-remove #'mark-sexp 'my-message))
 
 (ert-deftest find-func-tests--find-library-verbose ()
+  (unwind-protect
+      (progn
+        (advice-add 'dired :before #'ignore)
+        ;; bug#41104
+        (should (equal (find-function-library #'dired) '(dired . "dired"))))
+    (advice-remove 'dired #'ignore))
+
   (find-function-library #'join-line nil t)
   (with-current-buffer "*Messages*"
     (save-excursion
diff --git a/test/lisp/emacs-lisp/pp-resources/code-formats.erts 
b/test/lisp/emacs-lisp/pp-resources/code-formats.erts
index 002a5cf165..c3e3023cb1 100644
--- a/test/lisp/emacs-lisp/pp-resources/code-formats.erts
+++ b/test/lisp/emacs-lisp/pp-resources/code-formats.erts
@@ -128,3 +128,15 @@ Name: code-formats12
 =-=
 (global-set-key (kbd "s-x") #'kill-region)
 =-=-=
+
+Name: code-formats13
+
+=-=
+'("a")
+=-=-=
+
+Name: code-formats14
+
+=-=
+'("a" . "b")
+=-=-=
diff --git a/test/lisp/erc/erc-dcc-tests.el b/test/lisp/erc/erc-dcc-tests.el
new file mode 100644
index 0000000000..a1dfbab9dc
--- /dev/null
+++ b/test/lisp/erc/erc-dcc-tests.el
@@ -0,0 +1,167 @@
+;;; erc-dcc-tests.el --- Tests for erc-dcc  -*- lexical-binding:t -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation, either version 3 of the License,
+;; or (at your option) any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+(require 'ert)
+(require 'erc-dcc)
+
+(ert-deftest erc-dcc-ctcp-query-send-regexp ()
+  (let ((s "DCC SEND \"file name\" 2130706433 9899 1405135128"))
+    (should (string-match erc-dcc-ctcp-query-send-regexp s))
+    (should-not (match-string 2 s))
+    (should (string= "file name" (match-string 1 s)))
+    (should (string= "SEND" (match-string 6 s))))
+  (let ((s "DCC SEND \"file \\\" name\" 2130706433 9899 1405135128"))
+    (should (string-match erc-dcc-ctcp-query-send-regexp s))
+    (should-not (match-string 2 s))
+    (should (string= "SEND" (match-string 6 s)))
+    (should (string= "file \" name"
+                     (erc-dcc-unquote-filename (match-string 1 s)))))
+  (let ((s "DCC SEND filename 2130706433 9899 1405135128"))
+    (should (string-match erc-dcc-ctcp-query-send-regexp s))
+    (should (string= "filename" (match-string 2 s)))
+    (should (string= "2130706433" (match-string 3 s)))
+    (should (string= "9899" (match-string 4 s)))
+    (should (string= "1405135128" (match-string 5 s))))
+  (let ((s "DCC TSEND filename 2130706433 9899 1405135128"))
+    (should (string-match erc-dcc-ctcp-query-send-regexp s))
+    (should (string= "TSEND" (match-string 6 s)))))
+
+;; This also indirectly tests base functionality for
+;; `erc-dcc-do-LIST-command'
+
+(defun erc-dcc-tests--dcc-handle-ctcp-send (turbo)
+  (let (erc-send-completed-hook
+        erc-insert-modify-hook
+        erc-kill-channel-hook erc-kill-server-hook erc-kill-buffer-hook)
+    (with-current-buffer (get-buffer-create "fake-server")
+      (erc-mode)
+      (setq erc-server-process
+            (start-process "fake" (current-buffer) "sleep" "10")
+            erc-input-marker (make-marker)
+            erc-insert-marker (make-marker)
+            erc-server-current-nick "dummy")
+      (set-process-query-on-exit-flag erc-server-process nil)
+      (should-not erc-dcc-list)
+      (erc-ctcp-query-DCC erc-server-process
+                          "tester"
+                          "~tester"
+                          "fake.irc"
+                          "dummy"
+                          (concat "DCC " (if turbo "TSEND" "SEND")
+                                  " foo 2130706433 9899 1405135128"))
+      (should-not (cdr erc-dcc-list))
+      (should (equal (plist-put (car erc-dcc-list) :parent 'fake)
+                     `(:nick "tester!~tester@fake.irc"
+                             :type GET
+                             :peer nil
+                             :parent fake
+                             :ip "127.0.0.1"
+                             :port "9899"
+                             :file "foo"
+                             :size 1405135128
+                             :turbo ,(and turbo t)
+                             :secure nil)))
+      (goto-char (point-min))
+      (should (search-forward "file foo offered by tester" nil t))
+      (erc-dcc-do-LIST-command erc-server-process)
+      (should (search-forward-regexp (concat
+                                      "GET +no +1405135128 +foo"
+                                      (and turbo " +(T)") "$")
+                                     nil t))
+      (when noninteractive
+        (kill-buffer))))
+  ;; `erc-dcc-list' is global; must leave it empty
+  (should erc-dcc-list)
+  (setq erc-dcc-list nil))
+
+(ert-deftest erc-dcc-handle-ctcp-send--base ()
+  (erc-dcc-tests--dcc-handle-ctcp-send nil))
+
+(ert-deftest erc-dcc-handle-ctcp-send--turbo ()
+  (erc-dcc-tests--dcc-handle-ctcp-send t))
+
+(ert-deftest erc-dcc-do-GET-command ()
+  (with-temp-buffer
+    (let* ((proc (start-process "fake" (current-buffer) "sleep" "10"))
+           (elt (list :nick "tester!~tester@fake.irc"
+                      :type 'GET
+                      :peer nil
+                      :parent proc
+                      :ip "127.0.0.1"
+                      :port "9899"
+                      :file "foo.bin"
+                      :size 1405135128))
+           (erc-dcc-list (list elt))
+           ;;
+           erc-accidental-paste-threshold-seconds
+           erc-insert-modify-hook erc-send-completed-hook
+           erc-kill-channel-hook erc-kill-server-hook erc-kill-buffer-hook
+           calls)
+      (erc-mode)
+      (setq erc-server-process proc
+            erc-input-marker (make-marker)
+            erc-insert-marker (make-marker)
+            erc-server-current-nick "dummy")
+      (set-process-query-on-exit-flag proc nil)
+      (cl-letf (((symbol-function 'read-file-name)
+                 (lambda (&rest _) "foo.bin"))
+                ((symbol-function 'erc-dcc-get-file)
+                 (lambda (&rest r) (push r calls))))
+        (goto-char (point-max))
+        (set-marker erc-insert-marker (point-max))
+        (erc-display-prompt)
+
+        (ert-info ("No turbo")
+          (should-not (plist-member elt :turbo))
+          (goto-char erc-input-marker)
+          (insert "/dcc GET tester foo.bin")
+          (erc-send-current-line)
+          (should-not (plist-member (car erc-dcc-list) :turbo))
+          (should (equal (pop calls) (list elt "foo.bin" proc))))
+
+        (ert-info ("Arg turbo in pos 2")
+          (should-not (plist-member elt :turbo))
+          (goto-char erc-input-marker)
+          (insert "/dcc GET -t tester foo.bin")
+          (erc-send-current-line)
+          (should (eq t (plist-get (car erc-dcc-list) :turbo)))
+          (should (equal (pop calls) (list elt "foo.bin" proc))))
+
+        (ert-info ("Arg turbo in pos 4")
+          (setq elt (plist-put elt :turbo nil)
+                erc-dcc-list (list elt))
+          (goto-char erc-input-marker)
+          (insert "/dcc GET tester -t foo.bin")
+          (erc-send-current-line)
+          (should (eq t (plist-get (car erc-dcc-list) :turbo)))
+          (should (equal (pop calls) (list elt "foo.bin" proc))))
+
+        (ert-info ("Arg turbo in pos 6")
+          (setq elt (plist-put elt :turbo nil)
+                erc-dcc-list (list elt))
+          (goto-char erc-input-marker)
+          (insert "/dcc GET tester foo.bin -t")
+          (erc-send-current-line)
+          (should (eq t (plist-get (car erc-dcc-list) :turbo)))
+          (should (equal (pop calls) (list elt "foo.bin" proc))))))))
+
+;;; erc-dcc-tests.el ends here
diff --git a/test/lisp/eshell/esh-var-tests.el 
b/test/lisp/eshell/esh-var-tests.el
index 4e2a18861e..3180fe7a5f 100644
--- a/test/lisp/eshell/esh-var-tests.el
+++ b/test/lisp/eshell/esh-var-tests.el
@@ -147,7 +147,7 @@
 
 (ert-deftest esh-var-test/interp-cmd-indices ()
   "Interpolate command result with index"
-  (should (equal (eshell-test-command-result "+ ${list 1 2}[1] 3") 5)))
+  (should (equal (eshell-test-command-result "+ ${listify 1 2}[1] 3") 5)))
 
 (ert-deftest esh-var-test/interp-cmd-external ()
   "Interpolate command result from external command"
@@ -328,7 +328,8 @@ inside double-quotes"
 
 (ert-deftest esh-var-test/quoted-interp-cmd-indices ()
   "Interpolate command result with index inside double-quotes"
-  (should (equal (eshell-test-command-result "concat \"${list 1 2}[1]\" cool")
+  (should (equal (eshell-test-command-result
+                  "concat \"${listify 1 2}[1]\" cool")
                  "2cool")))
 
 (ert-deftest esh-var-test/quoted-interp-temp-cmd ()
@@ -357,11 +358,18 @@ inside double-quotes"
 
 (ert-deftest esh-var-test/interp-convert-var-split-indices ()
   "Interpolate and convert string variable with indices"
+  ;; Check that numeric forms are converted to numbers.
   (let ((eshell-test-value "000 010 020 030 040"))
     (should (equal (eshell-test-command-result "echo $eshell-test-value[0]")
                    0))
     (should (equal (eshell-test-command-result "echo $eshell-test-value[0 2]")
-                   '(0 20)))))
+                   '(0 20))))
+  ;; Check that multiline forms are preserved as-is.
+  (let ((eshell-test-value "foo\nbar:baz\n"))
+    (should (equal (eshell-test-command-result "echo $eshell-test-value[: 0]")
+                   "foo\nbar"))
+    (should (equal (eshell-test-command-result "echo $eshell-test-value[: 1]")
+                   "baz\n"))))
 
 (ert-deftest esh-var-test/interp-convert-quoted-var-number ()
   "Interpolate numeric quoted numeric variable"
@@ -469,13 +477,15 @@ inside double-quotes"
 
 ;; Built-in variables
 
-(ert-deftest esh-var-test/window-height ()
-  "$LINES should equal (window-height)"
-  (should (eshell-test-command-result "= $LINES (window-height)")))
+(ert-deftest esh-var-test/lines-var ()
+  "$LINES should equal (window-body-height nil 'remap)"
+  (should (equal (eshell-test-command-result "echo $LINES")
+                 (window-body-height nil 'remap))))
 
-(ert-deftest esh-var-test/window-width ()
-  "$COLUMNS should equal (window-width)"
-  (should (eshell-test-command-result "= $COLUMNS (window-width)")))
+(ert-deftest esh-var-test/columns-var ()
+  "$COLUMNS should equal (window-body-width nil 'remap)"
+  (should (equal (eshell-test-command-result "echo $COLUMNS")
+                 (window-body-width nil 'remap))))
 
 (ert-deftest esh-var-test/last-result-var ()
   "Test using the \"last result\" ($$) variable"
diff --git a/test/lisp/eshell/eshell-tests.el b/test/lisp/eshell/eshell-tests.el
index 7cdeb017e4..ab5d73d479 100644
--- a/test/lisp/eshell/eshell-tests.el
+++ b/test/lisp/eshell/eshell-tests.el
@@ -114,6 +114,51 @@ e.g. \"{(+ 1 2)} 3\" => 3"
    (eshell-wait-for-subprocess)
    (eshell-match-result "OLLEH\n")))
 
+(ert-deftest eshell-test/pipe-subcommand ()
+  "Check that piping with an asynchronous subcommand works"
+  (skip-unless (and (executable-find "echo")
+                    (executable-find "cat")))
+  (with-temp-eshell
+   (eshell-command-result-p "echo ${*echo hi} | *cat"
+                            "hi")))
+
+(ert-deftest eshell-test/pipe-subcommand-with-pipe ()
+  "Check that piping with an asynchronous subcommand with its own pipe works"
+  (skip-unless (and (executable-find "echo")
+                    (executable-find "cat")))
+  (with-temp-eshell
+   (eshell-command-result-p "echo ${*echo hi | *cat} | *cat"
+                            "hi")))
+
+(ert-deftest eshell-test/subcommand-reset-in-pipeline ()
+  "Check that subcommands reset `eshell-in-pipeline-p'."
+  (skip-unless (executable-find "cat"))
+  (dolist (template '("echo {%s} | *cat"
+                      "echo ${%s} | *cat"
+                      "*cat $<%s> | *cat"))
+    (should (equal (eshell-test-command-result
+                    (format template "echo $eshell-in-pipeline-p"))
+                   nil))
+    (should (equal (eshell-test-command-result
+                    (format template "echo | echo $eshell-in-pipeline-p"))
+                   "last"))
+    (should (equal (eshell-test-command-result
+                    (format template "echo $eshell-in-pipeline-p | echo"))
+                   "first"))
+    (should (equal (eshell-test-command-result
+                    (format template
+                            "echo | echo $eshell-in-pipeline-p | echo"))
+                   "t"))))
+
+(ert-deftest eshell-test/lisp-reset-in-pipeline ()
+  "Check that interpolated Lisp forms reset `eshell-in-pipeline-p'."
+  (skip-unless (executable-find "cat"))
+  (dolist (template '("echo (%s) | *cat"
+                      "echo $(%s) | *cat"))
+    (should (equal (eshell-test-command-result
+                    (format template "format \"%s\" eshell-in-pipeline-p"))
+                   "nil"))))
+
 (ert-deftest eshell-test/redirect-buffer ()
   "Check that piping to a buffer works"
   (with-temp-buffer
diff --git a/test/lisp/ffap-tests.el b/test/lisp/ffap-tests.el
index 0fdc31e8b6..4b580b5af5 100644
--- a/test/lisp/ffap-tests.el
+++ b/test/lisp/ffap-tests.el
@@ -73,7 +73,7 @@ left alone when opening a URL in an external browser."
              (urls nil)
              (ffap-url-fetcher (lambda (url) (push url urls) nil)))
     (should-not (ffap-other-window "https://www.gnu.org";))
-    (should (compare-window-configurations (current-window-configuration) old))
+    (should (window-configuration-equal-p (current-window-configuration) old))
     (should (equal urls '("https://www.gnu.org";)))))
 
 (defun ffap-test-string (space string)
diff --git a/test/lisp/filenotify-tests.el b/test/lisp/filenotify-tests.el
index 13bb2cd345..ad0138b2e7 100644
--- a/test/lisp/filenotify-tests.el
+++ b/test/lisp/filenotify-tests.el
@@ -52,34 +52,9 @@
 
 ;;; Code:
 
-(require 'ert)
+(require 'tramp)
 (require 'ert-x)
 (require 'filenotify)
-(require 'tramp)
-
-;; There is no default value on w32 systems, which could work out of the box.
-(defconst file-notify-test-remote-temporary-file-directory
-  (cond
-   ((getenv "REMOTE_TEMPORARY_FILE_DIRECTORY"))
-   ((eq system-type 'windows-nt) null-device)
-   (t (add-to-list
-       'tramp-methods
-       '("mock"
-        (tramp-login-program        "sh")
-        (tramp-login-args           (("-i")))
-        (tramp-remote-shell         "/bin/sh")
-        (tramp-remote-shell-args    ("-c"))
-        (tramp-connection-timeout   10)))
-      (add-to-list
-       'tramp-default-host-alist
-       `("\\`mock\\'" nil ,(system-name)))
-      ;; Emacs' Makefile sets $HOME to a nonexistent value.  Needed in
-      ;; batch mode only, therefore.  `temporary-file-directory' might
-      ;; be quoted, so we unquote it just in case.
-      (unless (and (null noninteractive) (file-directory-p "~/"))
-        (setenv "HOME" (file-name-unquote temporary-file-directory)))
-      (format "/mock::%s" temporary-file-directory)))
-  "Temporary directory for Tramp tests.")
 
 ;; Filter suppressed remote file-notify libraries.
 (when (stringp (getenv "REMOTE_FILE_NOTIFY_LIBRARY"))
@@ -232,12 +207,12 @@ being the result.")
     (let (desc)
       (ignore-errors
         (and
-         (file-remote-p file-notify-test-remote-temporary-file-directory)
-         (file-directory-p file-notify-test-remote-temporary-file-directory)
-         (file-writable-p file-notify-test-remote-temporary-file-directory)
+         (file-remote-p ert-remote-temporary-file-directory)
+         (file-directory-p ert-remote-temporary-file-directory)
+         (file-writable-p ert-remote-temporary-file-directory)
          (setq desc
                (file-notify-add-watch
-                file-notify-test-remote-temporary-file-directory
+                ert-remote-temporary-file-directory
                 '(change) #'ignore))))
       (setq file-notify--test-remote-enabled-checked (cons t desc))
       (when desc (file-notify-rm-watch desc))))
@@ -297,8 +272,7 @@ If UNSTABLE is non-nil, the test is tagged as `:unstable'."
   `(ert-deftest ,(intern (concat (symbol-name test) "-remote")) ()
      ,docstring
      :tags (if ,unstable '(:expensive-test :unstable) '(:expensive-test))
-     (let* ((temporary-file-directory
-            file-notify-test-remote-temporary-file-directory)
+     (let* ((temporary-file-directory ert-remote-temporary-file-directory)
            (ert-test (ert-get-test ',test))
             vc-handled-backends)
        (skip-unless (file-notify--test-remote-enabled))
diff --git a/test/lisp/files-resources/compile-utf8.el 
b/test/lisp/files-resources/compile-utf8.el
index ea67626365..1f804dcf8d 100644
--- a/test/lisp/files-resources/compile-utf8.el
+++ b/test/lisp/files-resources/compile-utf8.el
@@ -1,3 +1,4 @@
+;; -*- lexical-binding: t; -*-
 (defun zot ()
   "Yes."
   nil)
diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el
index 7d17fbde67..54ada08800 100644
--- a/test/lisp/files-tests.el
+++ b/test/lisp/files-tests.el
@@ -393,6 +393,8 @@ After evaluating BODY, the temporary file or directory is 
deleted."
   (cl-check-type name symbol)
   (cl-check-type non-special-name symbol)
   `(let* ((temporary-file-directory (file-truename temporary-file-directory))
+          (temporary-file-directory
+           (file-name-as-directory (make-temp-file "files-tests" t)))
           (,name (make-temp-file "files-tests" ,dir-flag))
           (,non-special-name (file-name-quote ,name)))
      (unwind-protect
@@ -402,7 +404,9 @@ After evaluating BODY, the temporary file or directory is 
deleted."
            (delete-file ,name)))
        (when (file-exists-p ,non-special-name)
          (if ,dir-flag (delete-directory ,non-special-name t)
-           (delete-file ,non-special-name))))))
+           (delete-file ,non-special-name)))
+       (when (file-exists-p temporary-file-directory)
+         (delete-directory temporary-file-directory t)))))
 
 (defconst files-tests--special-file-name-extension ".special"
   "Trailing string for test file name handler.")
@@ -444,14 +448,16 @@ unquoted file names."
   (cl-check-type name symbol)
   (cl-check-type non-special-name symbol)
   `(let* ((temporary-file-directory (file-truename temporary-file-directory))
+          (temporary-file-directory
+           (file-name-as-directory (make-temp-file "files-tests" t)))
           (file-name-handler-alist
            `((,files-tests--special-file-name-regexp
               . files-tests--special-file-name-handler)
              . ,file-name-handler-alist))
-           (,name (concat
+          (,name (concat
                   (make-temp-file "files-tests" ,dir-flag)
                   files-tests--special-file-name-extension))
-           (,non-special-name (file-name-quote ,name)))
+          (,non-special-name (file-name-quote ,name)))
      (unwind-protect
          (progn ,@body)
        (when (file-exists-p ,name)
@@ -459,7 +465,9 @@ unquoted file names."
            (delete-file ,name)))
        (when (file-exists-p ,non-special-name)
          (if ,dir-flag (delete-directory ,non-special-name t)
-           (delete-file ,non-special-name))))))
+           (delete-file ,non-special-name)))
+       (when (file-exists-p temporary-file-directory)
+         (delete-directory temporary-file-directory t)))))
 
 (defun files-tests--new-name (name part)
   (let (file-name-handler-alist)
@@ -931,7 +939,7 @@ unquoted file names."
   (files-tests--with-temp-non-special (tmpfile nospecial)
     (should (load nospecial nil t)))
   (files-tests--with-temp-non-special-and-file-name-handler (tmpfile nospecial)
-    (should (load nospecial nil t))))
+    (should-error (load nospecial nil t))))
 
 (ert-deftest files-tests-file-name-non-special-make-auto-save-file-name ()
   (files-tests--with-temp-non-special (tmpfile nospecial)
@@ -1691,7 +1699,7 @@ FN-TEST is the function to test: either 
`save-some-buffers' or
 specified inside ARGS-RESULTS.
 
 During the call to FN-TEST,`read-event' is overridden with a function that
-just returns `n' and `kill-emacs' is overriden to do nothing.
+just returns `n' and `kill-emacs' is overridden to do nothing.
 
 ARGS-RESULTS is a list of elements (FN-ARGS CALLERS-DIR EXPECTED), where
 FN-ARGS are the arguments for FN-TEST;
@@ -1830,7 +1838,6 @@ Prompt users for any modified buffer with 
`buffer-offer-save' non-nil."
   (should (eq major-mode 'text-mode)))
 
 (ert-deftest files-load-elc-gz-file ()
-  :expected-result :failed
   (skip-unless (executable-find "gzip"))
   (ert-with-temp-directory dir
     (let* ((pref (expand-file-name "compile-utf8" dir))
diff --git a/test/lisp/help-mode-tests.el b/test/lisp/help-mode-tests.el
index c0c1cf8b53..04241f3138 100644
--- a/test/lisp/help-mode-tests.el
+++ b/test/lisp/help-mode-tests.el
@@ -41,11 +41,6 @@
       (should (equal (buffer-name (current-buffer))
                      (help-buffer))))))
 
-(ert-deftest help-mode-tests-help-buffer-current-buffer-error ()
-  (with-temp-buffer
-    (let ((help-xref-following t))
-      (should-error (help-buffer)))))
-
 (ert-deftest help-mode-tests-make-xrefs ()
   (with-temp-buffer
     (insert "car is a built-in function in ‘C source code’.
@@ -81,7 +76,7 @@ Lisp concepts such as car, cdr, cons cell and list.")
         (insert (format fmt fn))
         (goto-char (point-min))
         (re-search-forward help-xref-symbol-regexp)
-        (help-xref-button 8 'help-function)
+        (help-xref-button 9 'help-function)
         (should-not (button-at (1- beg)))
         (should-not (button-at (+ beg (length (symbol-name fn)))))
         (should (eq (button-type (button-at beg)) 'help-function))))))
diff --git a/test/lisp/htmlfontify-tests.el b/test/lisp/htmlfontify-tests.el
index fdfe996b03..5c1f053066 100644
--- a/test/lisp/htmlfontify-tests.el
+++ b/test/lisp/htmlfontify-tests.el
@@ -21,15 +21,6 @@
 (require 'ert)
 (require 'htmlfontify)
 
-(ert-deftest htmlfontify-autoload ()
-  "Tests to see whether reftex-auc has been autoloaded"
-  (should
-   (fboundp 'htmlfontify-load-rgb-file))
-  (should
-   (autoloadp
-    (symbol-function
-     'htmlfontify-load-rgb-file))))
-
 (ert-deftest htmlfontify-bug25468 ()
   "Tests that htmlfontify can be loaded even if no shell is
 available (Bug#25468)."
diff --git a/test/lisp/ls-lisp-tests.el b/test/lisp/ls-lisp-tests.el
index 3e23fc7454..39843defc2 100644
--- a/test/lisp/ls-lisp-tests.el
+++ b/test/lisp/ls-lisp-tests.el
@@ -93,5 +93,44 @@
           (should (looking-back "[[:space:]]" (1- (point)))))
       (when (buffer-live-p buf) (kill-buffer buf)))))
 
+(ert-deftest ls-lisp-test-bug55787 ()
+  "Test proper sorting by version."
+  (let ((files1 (vector "34 klmn-300dpi.jpg"
+                        "34 klmn-300dpi.png"
+                        "054_xyz.jpg"
+                        "054_xyz.png"
+                        "91 opqrs.jpg"
+                        "91 opqrs.png"
+                        "0717-abcd.jpg"
+                        "0717-abcd.png"
+                        "1935 uv.jpg"
+                        "1935 uv.png"
+                        "FFFF_fghk.jpg"
+                        "FFFF_fghk.png"
+                        "hhhh.jpg"
+                       "hhhh.png"))
+        (files2 (vector "01.0" "10" "010" "01.2")))
+    (should (equal (sort files1
+                         (lambda (x y)
+                           (ls-lisp-version-lessp x y)))
+                   '["0717-abcd.jpg"
+                     "0717-abcd.png"
+                     "054_xyz.jpg"
+                     "054_xyz.png"
+                     "34 klmn-300dpi.jpg"
+                     "34 klmn-300dpi.png"
+                     "91 opqrs.jpg"
+                     "91 opqrs.png"
+                     "1935 uv.jpg"
+                     "1935 uv.png"
+                     "FFFF_fghk.jpg"
+                     "FFFF_fghk.png"
+                     "hhhh.jpg"
+                     "hhhh.png"]))
+    (should (equal (sort files2
+                         (lambda (x y)
+                           (ls-lisp-version-lessp x y)))
+                   '["01.0" "01.2" "010" "10"]))))
+
 (provide 'ls-lisp-tests)
 ;;; ls-lisp-tests.el ends here
diff --git a/test/lisp/mail/undigest-tests.el b/test/lisp/mail/undigest-tests.el
index b88868be7f..d52c9f9c5a 100644
--- a/test/lisp/mail/undigest-tests.el
+++ b/test/lisp/mail/undigest-tests.el
@@ -20,6 +20,7 @@
 ;;; Code:
 
 (require 'ert)
+(require 'ert-x)
 (require 'rmail)
 (require 'undigest)
 
@@ -270,66 +271,62 @@ The footer.
 ;;; Tests:
 (ert-deftest rmail-undigest-test-rfc934-digest ()
   "Test that we can undigest a RFC 934 digest."
-  (let ((file (make-temp-file "undigest-test-")))
-    (unwind-protect
-        (with-temp-buffer
-          (insert rmail-rfc934-digest)
-          (write-region nil nil file)
-          (rmail file)
-          (undigestify-rmail-message)
-          (should (= rmail-total-messages 4))
-          (should (string= (rmail-message-content 2) "Testing the 
undigester.\n\n"))
-          (should (string= (rmail-message-content 3) "This is message 
one.\n\n"))
-          (should (string= (rmail-message-content 4) "This is message 
two.\n")))
-      (delete-file file))))
+  (ert-with-temp-file file
+    :text rmail-rfc934-digest
+    ;; Rmail reads mbox files literally, so we must make sure the
+    ;; temporary mbox file has Unix-style EOLs.
+    :coding 'undecided-unix
+    (rmail file)
+    (undigestify-rmail-message)
+    (should (= rmail-total-messages 4))
+    (should (string= (rmail-message-content 2) "Testing the undigester.\n\n"))
+    (should (string= (rmail-message-content 3) "This is message one.\n\n"))
+    (should (string= (rmail-message-content 4) "This is message two.\n"))))
 
 (ert-deftest rmail-undigest-test-rfc1153-digest-strict ()
   "Test that we can undigest a strict RFC 1153 digest."
   :expected-result :failed
-  (let ((file (make-temp-file "undigest-test-")))
-    (unwind-protect
-        (with-temp-buffer
-          (insert rmail-rfc1153-digest-strict)
-          (write-region nil nil file)
-          (rmail file)
-          (should
-           (ignore-errors
-             ;; This throws an error, because the Trailer is not recognized
-             ;; as a valid RFC 822 (or later) message.
-             (undigestify-rmail-message)
-             (should (string= (rmail-message-content 2) "Testing the 
undigester.\n\n"))
-             (should (string= (rmail-message-content 3) "This is message 
one.\n\n"))
-             (should (string= (rmail-message-content 4) "This is message 
two.\n"))
-             t)))
-      (delete-file file))))
+  (ert-with-temp-file file
+    :text rmail-rfc1153-digest-strict
+    ;; Rmail reads mbox files literally, so we must make sure the
+    ;; temporary mbox file has Unix-style EOLs.
+    :coding 'undecided-unix
+    (rmail file)
+    (should
+     (ignore-errors
+       ;; This throws an error, because the Trailer is not recognized
+       ;; as a valid RFC 822 (or later) message.
+       (undigestify-rmail-message)
+       (should (string= (rmail-message-content 2) "Testing the 
undigester.\n\n"))
+       (should (string= (rmail-message-content 3) "This is message one.\n\n"))
+       (should (string= (rmail-message-content 4) "This is message two.\n"))
+       t))))
 
 (ert-deftest rmail-undigest-test-rfc1153-less-strict-digest ()
   "Test that we can undigest a RFC 1153 with a Subject header in its footer."
-  (let ((file (make-temp-file "undigest-test-")))
-    (unwind-protect
-        (with-temp-buffer
-          (insert rmail-rfc1153-digest-less-strict)
-          (write-region nil nil file)
-          (rmail file)
-          (undigestify-rmail-message)
-          (should (= rmail-total-messages 5))
-          (should (string= (rmail-message-content 3) "This is message 
one.\n\n"))
-          (should (string= (rmail-message-content 4) "This is message 
two.\n\n")))
-      (delete-file file))))
+  (ert-with-temp-file file
+    :text rmail-rfc1153-digest-less-strict
+    ;; Rmail reads mbox files literally, so we must make sure the
+    ;; temporary mbox file has Unix-style EOLs.
+    :coding 'undecided-unix
+    (rmail file)
+    (undigestify-rmail-message)
+    (should (= rmail-total-messages 5))
+    (should (string= (rmail-message-content 3) "This is message one.\n\n"))
+    (should (string= (rmail-message-content 4) "This is message two.\n\n"))))
 
 (ert-deftest rmail-undigest-test-rfc1153-sloppy-digest ()
   "Test that we can undigest a sloppy RFC 1153 digest."
-  (let ((file (make-temp-file "undigest-test-")))
-    (unwind-protect
-        (with-temp-buffer
-          (insert rmail-rfc1153-digest-sloppy)
-          (write-region nil nil file)
-          (rmail file)
-          (undigestify-rmail-message)
-          (should (= rmail-total-messages 5))
-          (should (string= (rmail-message-content 3) "This is message 
one.\n\n"))
-          (should (string= (rmail-message-content 4) "This is message 
two.\n\n")))
-      (delete-file file))))
+  (ert-with-temp-file file
+    :text rmail-rfc1153-digest-sloppy
+    ;; Rmail reads mbox files literally, so we must make sure the
+    ;; temporary mbox file has Unix-style EOLs.
+    :coding 'undecided-unix
+    (rmail file)
+    (undigestify-rmail-message)
+    (should (= rmail-total-messages 5))
+    (should (string= (rmail-message-content 3) "This is message one.\n\n"))
+    (should (string= (rmail-message-content 4) "This is message two.\n\n"))))
 
 ;; This fails because `rmail-digest-parse-mime' combines the preamble with the
 ;; first message of the digest.  And then, it doesn't get rid of the last
@@ -337,28 +334,26 @@ The footer.
 (ert-deftest rmail-undigest-test-rfc1521-mime-digest ()
   "Test that we can undigest a RFC 1521 MIME digest."
   :expected-result :failed
-  (let ((file (make-temp-file "undigest-test-")))
-    (unwind-protect
-        (with-temp-buffer
-          (insert rmail-rfc1521-mime-digest)
-          (write-region nil nil file)
-          (rmail file)
-          (undigestify-rmail-message)
-          (should (= rmail-total-messages 3))
-          (should (string= (rmail-message-content 2) "Message one.\n\n"))
-          (should (string= (rmail-message-content 3) "Message two.\n\n")))
-      (delete-file file))))
+  (ert-with-temp-file file
+    :text rmail-rfc1521-mime-digest
+    ;; Rmail reads mbox files literally, so we must make sure the
+    ;; temporary mbox file has Unix-style EOLs.
+    :coding 'undecided-unix
+    (rmail file)
+    (undigestify-rmail-message)
+    (should (= rmail-total-messages 3))
+    (should (string= (rmail-message-content 2) "Message one.\n\n"))
+    (should (string= (rmail-message-content 3) "Message two.\n\n"))))
 
 (ert-deftest rmail-undigest-test-multipart-mixed-digest ()
   "Test that we can undigest a digest inside a multipart/mixed digest."
-  (let ((file (make-temp-file "undigest-test-")))
-    (unwind-protect
-        (with-temp-buffer
-          (insert rmail-multipart-mixed-digest)
-          (write-region nil nil file)
-          (rmail file)
-          (undigestify-rmail-message)
-          (should (= rmail-total-messages 4))
-          (should (string= (rmail-message-content 2) "Message one.\n\n"))
-          (should (string= (rmail-message-content 3) "Message two.\n\n")))
-      (delete-file file))))
+  (ert-with-temp-file file
+    :text rmail-multipart-mixed-digest
+    ;; Rmail reads mbox files literally, so we must make sure the
+    ;; temporary mbox file has Unix-style EOLs.
+    :coding 'undecided-unix
+    (rmail file)
+    (undigestify-rmail-message)
+    (should (= rmail-total-messages 4))
+    (should (string= (rmail-message-content 2) "Message one.\n\n"))
+    (should (string= (rmail-message-content 3) "Message two.\n\n"))))
diff --git a/test/lisp/minibuffer-tests.el b/test/lisp/minibuffer-tests.el
index 2a29d5f167..ec93c8f42a 100644
--- a/test/lisp/minibuffer-tests.el
+++ b/test/lisp/minibuffer-tests.el
@@ -331,5 +331,141 @@
                   "custgroup" '("customize-group-other-window") nil 9)))
            15)))
 
+
+(defmacro completing-read-with-minibuffer-setup (collection &rest body)
+  (declare (indent 1) (debug (collection body)))
+  `(catch 'result
+     (minibuffer-with-setup-hook
+         (lambda ()
+           (let ((redisplay-skip-initial-frame nil)
+                 (executing-kbd-macro nil)) ; Don't skip redisplay
+             (throw 'result (progn . ,body))))
+       (let ((executing-kbd-macro t)) ; Force the real minibuffer
+         (completing-read "Prompt: " ,collection)))))
+
+(ert-deftest completion-auto-help-test ()
+  (let (messages)
+    (cl-letf* (((symbol-function 'minibuffer-message)
+                (lambda (message &rest args)
+                  (push (apply #'format-message message args) messages))))
+      (let ((completion-auto-help nil))
+        (completing-read-with-minibuffer-setup
+            '("a" "ab" "ac")
+          (execute-kbd-macro (kbd "a TAB TAB"))
+          (should (equal (car messages) "Complete, but not unique"))
+          (should-not (get-buffer-window "*Completions*" 0))))
+      (let ((completion-auto-help t))
+        (completing-read-with-minibuffer-setup
+            '("a" "ab" "ac")
+          (execute-kbd-macro (kbd "a TAB TAB"))
+          (should (get-buffer-window "*Completions*" 0)))))))
+
+(ert-deftest completion-auto-select-test ()
+  (let ((completion-auto-select t))
+    (completing-read-with-minibuffer-setup
+        '("aa" "ab" "ac")
+      (execute-kbd-macro (kbd "a TAB"))
+      (should (and (get-buffer-window "*Completions*" 0)
+                   (eq (current-buffer) (get-buffer "*Completions*"))))
+      (execute-kbd-macro (kbd "TAB TAB TAB"))
+      (should (and (get-buffer-window "*Completions*" 0)
+                   (eq (current-buffer) (get-buffer " *Minibuf-1*"))))
+      (execute-kbd-macro (kbd "S-TAB"))
+      (should (and (get-buffer-window "*Completions*" 0)
+                   (eq (current-buffer) (get-buffer "*Completions*"))))))
+  (let ((completion-auto-select 'second-tab))
+    (completing-read-with-minibuffer-setup
+        '("aa" "ab" "ac")
+      (execute-kbd-macro (kbd "a TAB"))
+      (should (and (get-buffer-window "*Completions*" 0)
+                   (not (eq (current-buffer) (get-buffer "*Completions*")))))
+      (execute-kbd-macro (kbd "TAB TAB"))
+      (should (eq (current-buffer) (get-buffer "*Completions*"))))))
+
+(ert-deftest completion-auto-wrap-test ()
+  (let ((completion-auto-wrap nil))
+    (completing-read-with-minibuffer-setup
+        '("aa" "ab" "ac")
+      (insert "a")
+      (minibuffer-completion-help)
+      (switch-to-completions)
+      (should (equal "aa" (get-text-property (point) 'completion--string)))
+      (next-completion 2)
+      (should (equal "ac" (get-text-property (point) 'completion--string)))
+      ;; Fixed in bug#54374
+      (next-completion 5)
+      (should (equal "ac" (get-text-property (point) 'completion--string)))
+      (previous-completion 5)
+      (should (equal "aa" (get-text-property (point) 'completion--string)))))
+  (let ((completion-auto-wrap t))
+    (completing-read-with-minibuffer-setup
+        '("aa" "ab" "ac")
+      (insert "a")
+      (minibuffer-completion-help)
+      (switch-to-completions)
+      (should (equal "aa" (get-text-property (point) 'completion--string)))
+      (next-completion 2)
+      (should (equal "ac" (get-text-property (point) 'completion--string)))
+      (next-completion 1)
+      (should (equal "aa" (get-text-property (point) 'completion--string)))
+      (previous-completion 1)
+      (should (equal "ac" (get-text-property (point) 'completion--string))))))
+
+(ert-deftest completions-header-format-test ()
+  (let ((completion-show-help nil)
+        (completions-header-format nil))
+    (completing-read-with-minibuffer-setup
+        '("aa" "ab" "ac")
+      (insert "a")
+      (minibuffer-completion-help)
+      (switch-to-completions)
+      ;; Fixed in bug#55430
+      (should (equal "aa" (get-text-property (point) 'completion--string)))
+      (next-completion 2)
+      (should (equal "ac" (get-text-property (point) 'completion--string)))
+      (previous-completion 2)
+      (should (equal "aa" (get-text-property (point) 'completion--string)))
+      ;; Fixed in bug#54374
+      (previous-completion 1)
+      (should (equal "ac" (get-text-property (point) 'completion--string)))
+      (next-completion 1)
+      (should (equal "aa" (get-text-property (point) 'completion--string)))
+      ;; Fixed in bug#55430
+      (execute-kbd-macro (kbd "C-u RET"))
+      (should (equal (minibuffer-contents) "aa")))
+    (completing-read-with-minibuffer-setup
+        '("aa" "ab" "ac")
+      ;; Fixed in bug#55289
+      (execute-kbd-macro (kbd "a M-<up> M-<down>"))
+      (should (equal (minibuffer-contents) "aa")))))
+
+(ert-deftest completions-affixation-navigation-test ()
+  (let ((completion-extra-properties
+         '(:affixation-function
+           (lambda (completions)
+             (mapcar (lambda (c)
+                       (list c "prefix " " suffix"))
+                     completions)))))
+    (completing-read-with-minibuffer-setup
+        '("aa" "ab" "ac")
+      (insert "a")
+      (minibuffer-completion-help)
+      (switch-to-completions)
+      (should (equal 'highlight (get-text-property (point) 'mouse-face)))
+      (should (equal "aa" (get-text-property (point) 'completion--string)))
+      (let ((completion-auto-wrap t))
+        (next-completion 3))
+      (should (equal 'highlight (get-text-property (point) 'mouse-face)))
+      (should (equal "aa" (get-text-property (point) 'completion--string)))
+      (let ((completion-auto-wrap nil))
+        (next-completion 3))
+      (should (equal 'highlight (get-text-property (point) 'mouse-face)))
+      (should (equal "ac" (get-text-property (point) 'completion--string)))
+      ;; Fixed in bug#54374
+      (goto-char (1- (point-max)))
+      (should-not (equal 'highlight (get-text-property (point) 'mouse-face)))
+      (execute-kbd-macro (kbd "C-u RET"))
+      (should (equal (minibuffer-contents) "ac")))))
+
 (provide 'minibuffer-tests)
 ;;; minibuffer-tests.el ends here
diff --git a/test/lisp/misc-tests.el b/test/lisp/misc-tests.el
index 36a8726b88..236223ef49 100644
--- a/test/lisp/misc-tests.el
+++ b/test/lisp/misc-tests.el
@@ -44,7 +44,14 @@
     (zap-up-to-char 1 ?c))
   (with-misc-test "abcde abc123" "c123"
     (goto-char (point-min))
-    (zap-up-to-char 2 ?c)))
+    (zap-up-to-char 2 ?c))
+  (let ((case-fold-search t))
+    (with-misc-test "abcdeCXYZ" "cdeCXYZ"
+      (goto-char (point-min))
+      (zap-up-to-char 1 ?C))
+    (with-misc-test "abcdeCXYZ" "CXYZ"
+      (goto-char (point-min))
+      (zap-up-to-char 1 ?C 'interactive))))
 
 (ert-deftest misc-test-upcase-char ()
   (with-misc-test "abcde" "aBCDe"
diff --git a/test/lisp/net/browse-url-tests.el 
b/test/lisp/net/browse-url-tests.el
index c94719c97a..8fcc831d53 100644
--- a/test/lisp/net/browse-url-tests.el
+++ b/test/lisp/net/browse-url-tests.el
@@ -73,7 +73,7 @@
   (should (equal (browse-url-encode-url "\"a\" \"b\"")
                  "%22a%22%20%22b%22"))
   (should (equal (browse-url-encode-url "(a) (b)") "%28a%29%20%28b%29"))
-  (should (equal (browse-url-encode-url "a$ b$") "a%24%20b%24")))
+  (should (equal (browse-url-encode-url "a$ b$") "a$%20b$")))
 
 (ert-deftest browse-url-tests-url-at-point ()
   (with-temp-buffer
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index 2d2bef732e..87c8eb0ada 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -44,12 +44,11 @@
 (require 'cl-lib)
 (require 'dired)
 (require 'dired-aux)
-(require 'ert)
+(require 'tramp)
 (require 'ert-x)
 (require 'seq) ; For `seq-random-elt', autoloaded since Emacs 28.1
 (require 'tar-mode)
 (require 'trace)
-(require 'tramp)
 (require 'vc)
 (require 'vc-bzr)
 (require 'vc-git)
@@ -65,24 +64,96 @@
 (declare-function tramp-method-out-of-band-p "tramp-sh")
 (declare-function tramp-smb-get-localname "tramp-smb")
 (defvar ange-ftp-make-backup-files)
-(defvar auto-save-file-name-transforms)
-(defvar lock-file-name-transforms)
-(defvar remote-file-name-inhibit-locks)
 (defvar tramp-connection-properties)
 (defvar tramp-copy-size-limit)
 (defvar tramp-display-escape-sequence-regexp)
+(defvar tramp-fuse-remove-hidden-files)
 (defvar tramp-fuse-unmount-on-cleanup)
 (defvar tramp-inline-compress-start-size)
 (defvar tramp-persistency-file-name)
 (defvar tramp-remote-path)
 (defvar tramp-remote-process-environment)
 
+;; Needed for Emacs 26.
+(declare-function with-connection-local-variables "files-x")
 ;; Needed for Emacs 27.
+(defvar lock-file-name-transforms)
 (defvar process-file-return-signal-string)
+(defvar remote-file-name-inhibit-locks)
 (defvar shell-command-dont-erase-buffer)
 ;; Needed for Emacs 28.
 (defvar dired-copy-dereference)
 
+;; `ert-resource-file' was introduced in Emacs 28.1.
+(unless (macrop 'ert-resource-file)
+  (eval-and-compile
+    (defvar ert-resource-directory-format "%s-resources/"
+      "Format for `ert-resource-directory'.")
+    (defvar ert-resource-directory-trim-left-regexp ""
+      "Regexp for `string-trim' (left) used by `ert-resource-directory'.")
+    (defvar ert-resource-directory-trim-right-regexp "\\(-tests?\\)?\\.el"
+      "Regexp for `string-trim' (right) used by `ert-resource-directory'.")
+
+    (defmacro ert-resource-directory ()
+      "Return absolute file name of the resource directory for this file.
+
+The path to the resource directory is the \"resources\" directory
+in the same directory as the test file.
+
+If that directory doesn't exist, use the directory named like the
+test file but formatted by `ert-resource-directory-format' and trimmed
+using `string-trim' with arguments
+`ert-resource-directory-trim-left-regexp' and
+`ert-resource-directory-trim-right-regexp'.  The default values mean
+that if called from a test file named \"foo-tests.el\", return
+the absolute file name for \"foo-resources\"."
+      `(let* ((testfile ,(or (bound-and-true-p byte-compile-current-file)
+                             (and load-in-progress load-file-name)
+                             buffer-file-name))
+              (default-directory (file-name-directory testfile)))
+        (file-truename
+         (if (file-accessible-directory-p "resources/")
+              (expand-file-name "resources/")
+            (expand-file-name
+             (format
+             ert-resource-directory-format
+              (string-trim testfile
+                          ert-resource-directory-trim-left-regexp
+                          ert-resource-directory-trim-right-regexp)))))))
+
+    (defmacro ert-resource-file (file)
+      "Return file name of resource file named FILE.
+A resource file is in the resource directory as per
+`ert-resource-directory'."
+      `(expand-file-name ,file (ert-resource-directory)))))
+
+;; `ert-remote-temporary-file-directory' was introduced in Emacs 29.1.
+(unless (boundp 'ert-remote-temporary-file-directory)
+  (eval-and-compile
+    ;; There is no default value on w32 systems, which could work out
+    ;; of the box.
+    (defconst ert-remote-temporary-file-directory
+      (cond
+       ((getenv "REMOTE_TEMPORARY_FILE_DIRECTORY"))
+       ((eq system-type 'windows-nt) null-device)
+       (t (add-to-list
+           'tramp-methods
+           '("mock"
+            (tramp-login-program       "sh")
+            (tramp-login-args          (("-i")))
+            (tramp-remote-shell        "/bin/sh")
+            (tramp-remote-shell-args   ("-c"))
+            (tramp-connection-timeout  10)))
+          (add-to-list
+           'tramp-default-host-alist
+           `("\\`mock\\'" nil ,(system-name)))
+          ;; Emacs's Makefile sets $HOME to a nonexistent value.
+          ;; Needed in batch mode only, therefore.
+          (unless (and (null noninteractive) (file-directory-p "~/"))
+            (setenv "HOME" temporary-file-directory))
+          (format "/mock::%s" temporary-file-directory)))
+      "Temporary directory for remote file tests.")))
+
 ;; Beautify batch mode.
 (when noninteractive
   ;; Suppress nasty messages.
@@ -92,32 +163,9 @@
     '(fset 'tramp-gvfs-handler-askquestion
           (lambda (_message _choices) '(t nil 0)))))
 
-;; There is no default value on w32 systems, which could work out of the box.
-(defconst tramp-test-temporary-file-directory
-  (cond
-   ((getenv "REMOTE_TEMPORARY_FILE_DIRECTORY"))
-   ((eq system-type 'windows-nt) null-device)
-   (t (add-to-list
-       'tramp-methods
-       '("mock"
-        (tramp-login-program        "sh")
-        (tramp-login-args           (("-i")))
-        (tramp-remote-shell         "/bin/sh")
-        (tramp-remote-shell-args    ("-c"))
-        (tramp-connection-timeout   10)))
-      (add-to-list
-       'tramp-default-host-alist
-       `("\\`mock\\'" nil ,(system-name)))
-      ;; Emacs's Makefile sets $HOME to a nonexistent value.  Needed
-      ;; in batch mode only, therefore.
-      (unless (and (null noninteractive) (file-directory-p "~/"))
-        (setenv "HOME" temporary-file-directory))
-      (format "/mock::%s" temporary-file-directory)))
-  "Temporary directory for Tramp tests.")
-
 (defconst tramp-test-vec
-  (and (file-remote-p tramp-test-temporary-file-directory)
-       (tramp-dissect-file-name tramp-test-temporary-file-directory))
+  (and (file-remote-p ert-remote-temporary-file-directory)
+       (tramp-dissect-file-name ert-remote-temporary-file-directory))
   "The used `tramp-file-name' structure.")
 
 (setq auth-source-save-behavior nil
@@ -147,9 +195,9 @@ being the result.")
      (cons
       t (ignore-errors
          (and
-          (file-remote-p tramp-test-temporary-file-directory)
-          (file-directory-p tramp-test-temporary-file-directory)
-          (file-writable-p tramp-test-temporary-file-directory))))))
+          (file-remote-p ert-remote-temporary-file-directory)
+          (file-directory-p ert-remote-temporary-file-directory)
+          (file-writable-p ert-remote-temporary-file-directory))))))
 
   (when (cdr tramp--test-enabled-checked)
     ;; Cleanup connection.
@@ -168,7 +216,7 @@ The temporary file is not created."
    (if quoted #'tramp-compat-file-name-quote #'identity)
    (expand-file-name
     (make-temp-name "tramp-test")
-    (if local temporary-file-directory tramp-test-temporary-file-directory))))
+    (if local temporary-file-directory ert-remote-temporary-file-directory))))
 
 ;; Method "smb" supports `make-symbolic-link' only if the remote host
 ;; has CIFS capabilities.  tramp-adb.el, tramp-gvfs.el, tramp-rclone.el
@@ -250,12 +298,12 @@ Also see `ignore'."
   "Test availability of Tramp functions."
   :expected-result (if (tramp--test-enabled) :passed :failed)
   (tramp--test-message
-   "Remote directory: `%s'" tramp-test-temporary-file-directory)
+   "Remote directory: `%s'" ert-remote-temporary-file-directory)
   (should (ignore-errors
            (and
-            (file-remote-p tramp-test-temporary-file-directory)
-            (file-directory-p tramp-test-temporary-file-directory)
-            (file-writable-p tramp-test-temporary-file-directory)))))
+            (file-remote-p ert-remote-temporary-file-directory)
+            (file-directory-p ert-remote-temporary-file-directory)
+            (file-writable-p ert-remote-temporary-file-directory)))))
 
 (ert-deftest tramp-test01-file-name-syntax ()
   "Check remote file name syntax."
@@ -1952,7 +2000,7 @@ Also see `ignore'."
        (find-file
        (format
         "%s|%s:foo:"
-        (substring (file-remote-p tramp-test-temporary-file-directory) 0 -1)
+        (substring (file-remote-p ert-remote-temporary-file-directory) 0 -1)
         m))
        :type 'user-error))))
 
@@ -1977,7 +2025,7 @@ Also see `ignore'."
       (should-error
        (tramp-smb-get-localname
        (tramp-dissect-file-name
-        (expand-file-name file tramp-test-temporary-file-directory)))
+        (expand-file-name file ert-remote-temporary-file-directory)))
        :type 'file-error))))
 
 (ert-deftest tramp-test04-substitute-in-file-name ()
@@ -2133,16 +2181,16 @@ Also see `ignore'."
    (string-equal
     (let ((default-directory
            (concat
-            (file-remote-p tramp-test-temporary-file-directory) "/path")))
+            (file-remote-p ert-remote-temporary-file-directory) "/path")))
       (expand-file-name ".." "./"))
-    (concat (file-remote-p tramp-test-temporary-file-directory) "/"))))
+    (concat (file-remote-p ert-remote-temporary-file-directory) "/"))))
 
 (ert-deftest tramp-test05-expand-file-name-top ()
   "Check `expand-file-name'."
   (skip-unless (tramp--test-enabled))
   (skip-unless (not (tramp--test-ange-ftp-p)))
 
-  (let ((dir (concat (file-remote-p tramp-test-temporary-file-directory) "/")))
+  (let ((dir (concat (file-remote-p ert-remote-temporary-file-directory) "/")))
     (dolist (local '("." ".."))
       (should (string-equal (expand-file-name local dir) dir))
       (should (string-equal (expand-file-name (concat dir local)) dir)))))
@@ -2205,8 +2253,8 @@ This checks also `file-name-as-directory', 
`file-name-directory',
       ;; We must clear `tramp-default-method'.  On hydra, it is "ftp",
       ;; which ruins the tests.
       (let ((tramp-default-method
-            (file-remote-p tramp-test-temporary-file-directory 'method))
-           (host (file-remote-p tramp-test-temporary-file-directory 'host)))
+            (file-remote-p ert-remote-temporary-file-directory 'method))
+           (host (file-remote-p ert-remote-temporary-file-directory 'host)))
        (dolist
            (file
             `(,(format "/%s::" tramp-default-method)
@@ -2233,8 +2281,8 @@ This checks also `file-name-as-directory', 
`file-name-directory',
   (skip-unless (tramp--test-emacs29-p))
 
   ;; We must refill the cache.  `file-truename' does it.
-  (file-truename tramp-test-temporary-file-directory)
-  (let* ((remote-host (file-remote-p tramp-test-temporary-file-directory))
+  (file-truename ert-remote-temporary-file-directory)
+  (let* ((remote-host (file-remote-p ert-remote-temporary-file-directory))
         (remote-host-nohop
          (tramp-make-tramp-file-name (tramp-dissect-file-name remote-host)))
         ;; Not all methods can expand "~".
@@ -2323,7 +2371,7 @@ This checks also `file-name-as-directory', 
`file-name-directory',
              (insert-file-contents tmp-name2)
              (should (string-equal (buffer-string) "foo")))
            ;; Check also that a file transfer with compression works.
-           (let ((default-directory tramp-test-temporary-file-directory)
+           (let ((default-directory ert-remote-temporary-file-directory)
                  (tramp-copy-size-limit 4)
                  (tramp-inline-compress-start-size 2))
              (delete-file tmp-name2)
@@ -2505,7 +2553,9 @@ This checks also `file-name-as-directory', 
`file-name-directory',
           (setq-local file-precious-flag t)
           (setq-local backup-inhibited t)
           (insert "bar")
+         (should (buffer-modified-p))
           (should (null (save-buffer)))
+         (should (not (buffer-modified-p)))
           (should-not (cl-member tmp-name written-files :test #'string=)))
 
       ;; Cleanup.
@@ -2518,8 +2568,10 @@ This checks also `file-name-as-directory', 
`file-name-directory',
   (skip-unless (tramp--test-enabled))
   (skip-unless (not (tramp--test-ange-ftp-p)))
   (skip-unless (executable-find "gzip"))
+  ;; The function was introduced in Emacs 28.1.
+  (skip-unless (boundp 'tar-goto-file))
 
-  (let* ((default-directory tramp-test-temporary-file-directory)
+  (let* ((default-directory ert-remote-temporary-file-directory)
         (archive (ert-resource-file "foo.tar.gz"))
         (tmp-file (expand-file-name (file-name-nondirectory archive)))
         (require-final-newline t)
@@ -2531,20 +2583,26 @@ This checks also `file-name-as-directory', 
`file-name-directory',
          (copy-file archive tmp-file 'ok)
          ;; Read archive.  Check contents of foo.txt, and modify it.  Save.
          (with-current-buffer (setq buffer1 (find-file-noselect tmp-file))
-           (should (tar-goto-file "foo.txt"))
+           ;; The function was introduced in Emacs 28.1.
+           (with-no-warnings (should (tar-goto-file "foo.txt")))
            (save-current-buffer
              (setq buffer2 (tar-extract))
              (should (string-equal (buffer-string) "foo\n"))
              (goto-char (point-max))
              (insert "bar")
-              (should (null (save-buffer))))
-            (should (null (save-buffer))))
+             (should (buffer-modified-p))
+              (should (null (save-buffer)))
+             (should-not (buffer-modified-p)))
+           (should (buffer-modified-p))
+            (should (null (save-buffer)))
+           (should-not (buffer-modified-p)))
 
          (kill-buffer buffer1)
          (kill-buffer buffer2)
          ;; Read archive.  Check contents of modified foo.txt.
          (with-current-buffer (setq buffer1 (find-file-noselect tmp-file))
-           (should (tar-goto-file "foo.txt"))
+           ;; The function was introduced in Emacs 28.1.
+           (with-no-warnings (should (tar-goto-file "foo.txt")))
            (save-current-buffer
              (setq buffer2 (tar-extract))
              (should (string-equal (buffer-string) "foo\nbar\n")))))
@@ -3014,7 +3072,8 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
   (skip-unless (tramp--test-enabled))
 
   (dolist (quoted (if (tramp--test-expensive-test-p) '(nil t) '(nil)))
-    (let* ((tmp-name1 (tramp--test-make-temp-name nil quoted))
+    (let* ((tramp-fuse-remove-hidden-files t)
+          (tmp-name1 (tramp--test-make-temp-name nil quoted))
           (tmp-name2 (expand-file-name "bla" tmp-name1))
           (tmp-name3 (expand-file-name "foo" tmp-name1)))
       (unwind-protect
@@ -3058,7 +3117,8 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
   (skip-unless (tramp--test-enabled))
 
   (dolist (quoted (if (tramp--test-expensive-test-p) '(nil t) '(nil)))
-    (let* ((tmp-name1 (tramp--test-make-temp-name nil quoted))
+    (let* ((tramp-fuse-remove-hidden-files t)
+          (tmp-name1 (tramp--test-make-temp-name nil quoted))
           (tmp-name2 (expand-file-name "foo" tmp-name1))
           (tmp-name3 (expand-file-name "bar" tmp-name1))
           (tmp-name4 (expand-file-name "baz" tmp-name1))
@@ -3201,7 +3261,7 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
 (ert-deftest tramp-test17-dired-with-wildcards ()
   "Check `dired' with wildcards."
   ;; `separate' syntax and IPv6 host name syntax do not work.
-  (skip-unless (not (string-match-p "\\[" 
tramp-test-temporary-file-directory)))
+  (skip-unless (not (string-match-p "\\[" 
ert-remote-temporary-file-directory)))
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
   (skip-unless (not (tramp--test-rsync-p)))
@@ -3215,10 +3275,10 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
             (expand-file-name (tramp--test-make-temp-name nil quoted)))
           (tmp-name3 (expand-file-name "foo" tmp-name1))
           (tmp-name4 (expand-file-name "bar" tmp-name2))
-          (tramp-test-temporary-file-directory
+          (ert-remote-temporary-file-directory
            (funcall
             (if quoted #'tramp-compat-file-name-quote #'identity)
-            tramp-test-temporary-file-directory))
+            ert-remote-temporary-file-directory))
           buffer)
       (unwind-protect
          (progn
@@ -3236,19 +3296,19 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
                (setq buffer
                      (dired-noselect
                       (expand-file-name
-                       "tramp-test*" tramp-test-temporary-file-directory)))
+                       "tramp-test*" ert-remote-temporary-file-directory)))
              (goto-char (point-min))
              (should
               (re-search-forward
                (regexp-quote
                 (file-relative-name
-                 tmp-name1 tramp-test-temporary-file-directory))))
+                 tmp-name1 ert-remote-temporary-file-directory))))
              (goto-char (point-min))
              (should
               (re-search-forward
                (regexp-quote
                 (file-relative-name
-                 tmp-name2 tramp-test-temporary-file-directory)))))
+                 tmp-name2 ert-remote-temporary-file-directory)))))
            (kill-buffer buffer)
 
            ;; Check for expanded directory and file names.
@@ -3256,20 +3316,20 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
                (setq buffer
                      (dired-noselect
                       (expand-file-name
-                       "tramp-test*/*" tramp-test-temporary-file-directory)))
+                       "tramp-test*/*" ert-remote-temporary-file-directory)))
              (goto-char (point-min))
              (should
               (re-search-forward
                (regexp-quote
                 (file-relative-name
-                 tmp-name3 tramp-test-temporary-file-directory))))
+                 tmp-name3 ert-remote-temporary-file-directory))))
              (goto-char (point-min))
              (should
               (re-search-forward
                (regexp-quote
                 (file-relative-name
                  tmp-name4
-                 tramp-test-temporary-file-directory)))))
+                 ert-remote-temporary-file-directory)))))
            (kill-buffer buffer)
 
            ;; Check for special characters.
@@ -3284,20 +3344,20 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
                (setq buffer
                      (dired-noselect
                       (expand-file-name
-                       "tramp-test*/*" tramp-test-temporary-file-directory)))
+                       "tramp-test*/*" ert-remote-temporary-file-directory)))
              (goto-char (point-min))
              (should
               (re-search-forward
                (regexp-quote
                 (file-relative-name
-                 tmp-name3 tramp-test-temporary-file-directory))))
+                 tmp-name3 ert-remote-temporary-file-directory))))
              (goto-char (point-min))
              (should
               (re-search-forward
                (regexp-quote
                 (file-relative-name
                  tmp-name4
-                 tramp-test-temporary-file-directory)))))
+                 ert-remote-temporary-file-directory)))))
            (kill-buffer buffer))
 
        ;; Cleanup.
@@ -3370,8 +3430,8 @@ This tests also `access-file', `file-readable-p',
     ;; We must use `file-truename' for the temporary directory,
     ;; because it could be located on a symlinked directory.  This
     ;; would let the test fail.
-    (let* ((tramp-test-temporary-file-directory
-           (file-truename tramp-test-temporary-file-directory))
+    (let* ((ert-remote-temporary-file-directory
+           (file-truename ert-remote-temporary-file-directory))
           (tmp-name1 (tramp--test-make-temp-name nil quoted))
           (tmp-name2 (tramp--test-make-temp-name nil quoted))
           ;; File name with "//".
@@ -3391,7 +3451,7 @@ This tests also `access-file', `file-readable-p',
                (and test-file-ownership-preserved-p
                     (zerop (logand
                             #o1000
-                            (file-modes tramp-test-temporary-file-directory))))
+                            (file-modes ert-remote-temporary-file-directory))))
              (write-region "foo" nil tmp-name1)
              (setq test-file-ownership-preserved-p
                    (= (file-attribute-group-id (file-attributes tmp-name1))
@@ -3470,7 +3530,7 @@ This tests also `access-file', `file-readable-p',
 
            ;; Check, that "//" in symlinks are handled properly.
            (with-temp-buffer
-             (let ((default-directory tramp-test-temporary-file-directory))
+             (let ((default-directory ert-remote-temporary-file-directory))
                (shell-command
                 (format
                  "ln -s %s %s"
@@ -3728,8 +3788,8 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
     ;; We must use `file-truename' for the temporary directory,
     ;; because it could be located on a symlinked directory.  This
     ;; would let the test fail.
-    (let* ((tramp-test-temporary-file-directory
-           (file-truename tramp-test-temporary-file-directory))
+    (let* ((ert-remote-temporary-file-directory
+           (file-truename ert-remote-temporary-file-directory))
           (tmp-name1 (tramp--test-make-temp-name nil quoted))
           (tmp-name2 (tramp--test-make-temp-name nil quoted))
           (tmp-name3 (tramp--test-make-temp-name 'local quoted))
@@ -3876,7 +3936,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
            (should (file-equal-p tmp-name1 tmp-name2))
            ;; Check relative symlink file name.
            (delete-file tmp-name2)
-           (let ((default-directory tramp-test-temporary-file-directory))
+           (let ((default-directory ert-remote-temporary-file-directory))
              (make-symbolic-link (file-name-nondirectory tmp-name1) tmp-name2))
            (should (file-symlink-p tmp-name2))
            (should-not (string-equal tmp-name2 (file-truename tmp-name2)))
@@ -3923,7 +3983,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
          (tramp--test-ignore-make-symbolic-link-error
            (make-directory tmp-name1)
            (should (file-directory-p tmp-name1))
-           (let* ((tramp-test-temporary-file-directory
+           (let* ((ert-remote-temporary-file-directory
                    (file-truename tmp-name1))
                   (tmp-name2 (tramp--test-make-temp-name nil quoted))
                   (tmp-name3 tmp-name2)
@@ -3984,7 +4044,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
              (directory-file-name
               (funcall
                (if quoted #'tramp-compat-file-name-quote #'identity)
-               tramp-test-temporary-file-directory)))
+               ert-remote-temporary-file-directory)))
             (dir2 (file-name-as-directory dir1)))
        (should (string-equal (file-truename dir1) (expand-file-name dir1)))
        (should (string-equal (file-truename dir2) (expand-file-name dir2)))))))
@@ -4074,7 +4134,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
   "Check that `file-acl' and `set-file-acl' work proper."
   (skip-unless (tramp--test-enabled))
   ;; The following test checks also whether `set-file-modes' will work.
-  (skip-unless (file-acl tramp-test-temporary-file-directory))
+  (skip-unless (file-acl ert-remote-temporary-file-directory))
   (skip-unless (not (tramp--test-crypt-p)))
 
   ;; `filename-non-special' has been fixed in Emacs 27.1, see Bug#29579.
@@ -4153,7 +4213,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
   "Check `file-selinux-context' and `set-file-selinux-context'."
   (skip-unless (tramp--test-enabled))
   (skip-unless
-   (not (equal (file-selinux-context tramp-test-temporary-file-directory)
+   (not (equal (file-selinux-context ert-remote-temporary-file-directory)
               '(nil nil nil nil))))
   (skip-unless (not (tramp--test-crypt-p)))
 
@@ -4214,7 +4274,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
                      (let ((default-directory temporary-file-directory))
                        (shell-command-to-string "id -Z"))
                      (let ((default-directory
-                             tramp-test-temporary-file-directory))
+                             ert-remote-temporary-file-directory))
                        (shell-command-to-string "id -Z"))))
 
            ;; Two files with same SELinux context.
@@ -4298,8 +4358,9 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
   ;; Method and host name in completion mode.  This kind of completion
   ;; does not work on MS Windows.
   (unless (memq system-type '(cygwin windows-nt))
-    (let ((method (file-remote-p tramp-test-temporary-file-directory 'method))
-         (host (file-remote-p tramp-test-temporary-file-directory 'host))
+    (let ((tramp-fuse-remove-hidden-files t)
+         (method (file-remote-p ert-remote-temporary-file-directory 'method))
+         (host (file-remote-p ert-remote-temporary-file-directory 'host))
           (orig-syntax tramp-syntax))
       (when (and (stringp host) (string-match tramp-host-with-port-regexp 
host))
        (setq host (match-string 1 host)))
@@ -4350,7 +4411,8 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
 
   (dolist (non-essential '(nil t))
     (dolist (quoted (if (tramp--test-expensive-test-p) '(nil t) '(nil)))
-      (let ((tmp-name (tramp--test-make-temp-name nil quoted)))
+      (let ((tramp-fuse-remove-hidden-files t)
+           (tmp-name (tramp--test-make-temp-name nil quoted)))
 
        (unwind-protect
            (progn
@@ -4420,7 +4482,9 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
     (let ((tmp-name (tramp--test-make-temp-name nil quoted)))
       (unwind-protect
          (progn
-           (load tmp-name 'noerror 'nomessage)
+           ;; Ange-FTP does not tolerate a missing file, even with `noerror'.
+           (unless (tramp--test-ange-ftp-p)
+             (load tmp-name 'noerror 'nomessage))
            (should-not (featurep 'tramp-test-load))
            (write-region "(provide 'tramp-test-load)" nil tmp-name)
            ;; `load' in lread.c does not pass `must-suffix'.  Why?
@@ -4448,7 +4512,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
   (dolist (quoted (if (tramp--test-expensive-test-p) '(nil t) '(nil)))
     (let* ((tmp-name (tramp--test-make-temp-name nil quoted))
           (fnnd (file-name-nondirectory tmp-name))
-          (default-directory tramp-test-temporary-file-directory)
+          (default-directory ert-remote-temporary-file-directory)
           (buffer (get-buffer-create "*tramp-tests*"))
           kill-buffer-query-functions)
       (unwind-protect
@@ -4582,7 +4646,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
   (skip-unless (tramp--test-supports-processes-p))
 
   (dolist (quoted (if (tramp--test-expensive-test-p) '(nil t) '(nil)))
-    (let ((default-directory tramp-test-temporary-file-directory)
+    (let ((default-directory ert-remote-temporary-file-directory)
          (tmp-name (tramp--test-make-temp-name nil quoted))
          kill-buffer-query-functions command proc)
 
@@ -4748,7 +4812,7 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
        :tags (append '(:expensive-test :tramp-asynchronous-processes)
                     (and ,unstable '(:unstable)))
        (skip-unless (tramp--test-enabled))
-       (let ((default-directory tramp-test-temporary-file-directory)
+       (let ((default-directory ert-remote-temporary-file-directory)
             (ert-test (ert-get-test ',test))
             (tramp-connection-properties
              (cons '(nil "direct-async-process" t)
@@ -4761,7 +4825,7 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
         (cl-letf (((symbol-function #'tramp--test-enabled) 
#'tramp--test-always)
                   ((symbol-function #'internal-default-process-sentinel)
                    #'ignore))
-          (file-truename tramp-test-temporary-file-directory)
+          (file-truename ert-remote-temporary-file-directory)
           (funcall (ert-test-body ert-test)))))))
 
 (tramp--test--deftest-direct-async-process tramp-test29-start-file-process
@@ -4778,7 +4842,7 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
   (skip-unless (tramp--test-emacs27-p))
 
   (dolist (quoted (if (tramp--test-expensive-test-p) '(nil t) '(nil)))
-    (let ((default-directory tramp-test-temporary-file-directory)
+    (let ((default-directory ert-remote-temporary-file-directory)
          (tmp-name (tramp--test-make-temp-name nil quoted))
          kill-buffer-query-functions command proc)
       (with-no-warnings (should-not (make-process)))
@@ -5031,12 +5095,15 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
   :tags '(:expensive-test :tramp-asynchronous-processes :unstable)
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
+  (skip-unless (not (tramp--test-windows-nt-p)))
   (skip-unless (not (tramp--test-crypt-p)))
+  ;; Since Emacs 27.1.
+  (skip-unless (macrop 'with-connection-local-variables))
 
   ;; We must use `file-truename' for the temporary directory, in
   ;; order to establish the connection prior running an asynchronous
   ;; process.
-  (let ((default-directory (file-truename tramp-test-temporary-file-directory))
+  (let ((default-directory (file-truename ert-remote-temporary-file-directory))
        (delete-exited-processes t)
        kill-buffer-query-functions command proc)
     (unwind-protect
@@ -5071,14 +5138,17 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
   :tags '(:expensive-test :tramp-asynchronous-processes :unstable)
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
+  (skip-unless (not (tramp--test-windows-nt-p)))
   (skip-unless (not (tramp--test-crypt-p)))
+  ;; Since Emacs 27.1.
+  (skip-unless (macrop 'with-connection-local-variables))
   ;; Since Emacs 29.1.
   (skip-unless (boundp 'signal-process-functions))
 
   ;; We must use `file-truename' for the temporary directory, in
   ;; order to establish the connection prior running an asynchronous
   ;; process.
-  (let ((default-directory (file-truename tramp-test-temporary-file-directory))
+  (let ((default-directory (file-truename ert-remote-temporary-file-directory))
        (delete-exited-processes t)
        kill-buffer-query-functions command proc)
 
@@ -5117,10 +5187,12 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
            (should (equal (process-get proc 'remote-command)
                           (with-connection-local-variables
                            `(,shell-file-name ,shell-command-switch 
,command))))
-           (should
-             (zerop
-              (signal-process
-               (process-get proc 'remote-pid) sigcode default-directory)))
+           ;; `signal-process' has argument REMOTE since Emacs 29.
+           (with-no-warnings
+             (should
+               (zerop
+               (signal-process
+                (process-get proc 'remote-pid) sigcode default-directory))))
            ;; Let the process accept the signal.
            (with-timeout (10 (tramp--test-timeout-handler))
              (while (accept-process-output proc 0 nil t)))
@@ -5138,7 +5210,7 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
   ;; `list-system-processes' is supported since Emacs 29.1.
   (skip-unless (tramp--test-emacs29-p))
 
-  (let ((default-directory tramp-test-temporary-file-directory))
+  (let ((default-directory ert-remote-temporary-file-directory))
     (skip-unless (consp (list-system-processes)))
     (should (not (equal (list-system-processes)
                        (let ((default-directory temporary-file-directory))
@@ -5155,7 +5227,7 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
   ;; We must use `file-truename' for the temporary directory, in
   ;; order to establish the connection prior running an asynchronous
   ;; process.
-  (let ((default-directory (file-truename tramp-test-temporary-file-directory))
+  (let ((default-directory (file-truename ert-remote-temporary-file-directory))
        (delete-exited-processes t)
        kill-buffer-query-functions command proc)
     (skip-unless (consp (list-system-processes)))
@@ -5181,9 +5253,11 @@ If UNSTABLE is non-nil, the test is tagged as 
`:unstable'."
 INPUT, if non-nil, is a string sent to the process."
   (let ((proc (async-shell-command command output-buffer error-buffer))
        (delete-exited-processes t))
-    (should (equal (process-get proc 'remote-command)
-                  (with-connection-local-variables
-                   `(,shell-file-name ,shell-command-switch ,command))))
+    ;; Since Emacs 27.1.
+    (when (macrop 'with-connection-local-variables)
+      (should (equal (process-get proc 'remote-command)
+                    (with-connection-local-variables
+                     `(,shell-file-name ,shell-command-switch ,command)))))
     (cl-letf (((symbol-function #'shell-command-sentinel) #'ignore))
       (when (stringp input)
        (process-send-string proc input))
@@ -5211,7 +5285,7 @@ INPUT, if non-nil, is a string sent to the process."
 
   (dolist (quoted (if (tramp--test-expensive-test-p) '(nil t) '(nil)))
     (let ((tmp-name (tramp--test-make-temp-name nil quoted))
-         (default-directory tramp-test-temporary-file-directory)
+         (default-directory ert-remote-temporary-file-directory)
          ;; Suppress nasty messages.
          (inhibit-message t)
          kill-buffer-query-functions)
@@ -5292,7 +5366,7 @@ INPUT, if non-nil, is a string sent to the process."
   (when (and (tramp--test-asynchronous-processes-p)
             (tramp--test-sh-p) (tramp--test-emacs27-p))
     (let* ((async-shell-command-width 1024)
-          (default-directory tramp-test-temporary-file-directory)
+          (default-directory ert-remote-temporary-file-directory)
           (cols (ignore-errors
                   (read (tramp--test-shell-command-to-string-asynchronously
                          "tput cols")))))
@@ -5344,7 +5418,7 @@ INPUT, if non-nil, is a string sent to the process."
     ;; We check both the local and remote case, in order to guarantee
     ;; that they behave similar.
     (dolist (default-directory
-             `(,temporary-file-directory ,tramp-test-temporary-file-directory))
+             `(,temporary-file-directory ,ert-remote-temporary-file-directory))
       ;; These are the possible values of `shell-command-dont-erase-buffer'.
       ;; `random' is taken as non-nil value without special meaning.
       (dolist (shell-command-dont-erase-buffer
@@ -5444,7 +5518,7 @@ INPUT, if non-nil, is a string sent to the process."
            (and (tramp--test-asynchronous-processes-p)
                 '(tramp--test-shell-command-to-string-asynchronously))))
 
-    (let ((default-directory tramp-test-temporary-file-directory)
+    (let ((default-directory ert-remote-temporary-file-directory)
          (shell-file-name "/bin/sh")
          (envvar (concat "VAR_" (upcase (md5 (current-time-string)))))
          kill-buffer-query-functions)
@@ -5535,7 +5609,7 @@ Use direct async.")
   (skip-unless (not (tramp--test-crypt-p)))
 
   ;; We force a reconnect, in order to have a clean environment.
-  (dolist (dir `(,tramp-test-temporary-file-directory
+  (dolist (dir `(,ert-remote-temporary-file-directory
                 "/mock:localhost#11111:" "/mock:localhost#22222:"))
     (tramp-cleanup-connection
      (tramp-dissect-file-name dir) 'keep-debug 'keep-password))
@@ -5567,9 +5641,9 @@ Use direct async.")
   :tags '(:expensive-test)
   (skip-unless (tramp--test-enabled))
   ;; Since Emacs 27.1.
-  (skip-unless (fboundp 'with-connection-local-variables))
+  (skip-unless (macrop 'with-connection-local-variables))
 
-  (let* ((default-directory tramp-test-temporary-file-directory)
+  (let* ((default-directory ert-remote-temporary-file-directory)
         (tmp-name1 (tramp--test-make-temp-name))
         (tmp-name2 (expand-file-name "foo" tmp-name1))
         (enable-local-variables :all)
@@ -5583,6 +5657,8 @@ Use direct async.")
           (should (file-directory-p tmp-name1))
 
          ;; `local-variable' is buffer-local due to explicit setting.
+         ;; We need `with-no-warnings', because `defvar-local' is not
+         ;; called at toplevel.
          (with-no-warnings
           (defvar-local local-variable 'buffer))
          (with-temp-buffer
@@ -5634,7 +5710,7 @@ Use direct async.")
   (when (tramp--test-adb-p)
     (skip-unless (tramp--test-emacs27-p)))
 
-  (let ((default-directory tramp-test-temporary-file-directory)
+  (let ((default-directory ert-remote-temporary-file-directory)
        explicit-shell-file-name kill-buffer-query-functions
        connection-local-profile-alist connection-local-criteria-alist)
     (unwind-protect
@@ -5684,7 +5760,7 @@ Use direct async.")
   (skip-unless (fboundp 'exec-path))
 
   (let ((tmp-name (tramp--test-make-temp-name))
-       (default-directory tramp-test-temporary-file-directory))
+       (default-directory ert-remote-temporary-file-directory))
     (unwind-protect
        (progn
          (should (consp (with-no-warnings (exec-path))))
@@ -5729,7 +5805,7 @@ Use direct async.")
   (skip-unless (fboundp 'exec-path))
 
   (let* ((tmp-name (tramp--test-make-temp-name))
-        (default-directory tramp-test-temporary-file-directory)
+        (default-directory ert-remote-temporary-file-directory)
          (orig-exec-path (with-no-warnings (exec-path)))
          (tramp-remote-path tramp-remote-path)
         (orig-tramp-remote-path tramp-remote-path)
@@ -5796,7 +5872,7 @@ Use direct async.")
     ;; order to establish the connection prior running an asynchronous
     ;; process.
     (let* ((default-directory
-            (file-truename tramp-test-temporary-file-directory))
+            (file-truename ert-remote-temporary-file-directory))
           (tmp-name1 (tramp--test-make-temp-name nil quoted))
           (tmp-name2 (expand-file-name "foo" tmp-name1))
           (tramp-remote-process-environment tramp-remote-process-environment)
@@ -5900,7 +5976,7 @@ Use direct async.")
                   (if quoted #'tramp-compat-file-name-quote #'identity)
                   (expand-file-name
                    (format "#%s#" (file-name-nondirectory tmp-name1))
-                   tramp-test-temporary-file-directory))))))
+                   ert-remote-temporary-file-directory))))))
 
            ;; Use default `tramp-auto-save-directory' mechanism.
            ;; Ange-FTP doesn't care.
@@ -6005,7 +6081,7 @@ Use direct async.")
                (if quoted #'tramp-compat-file-name-quote #'identity)
                (expand-file-name
                 (format "%s~" (file-name-nondirectory tmp-name1))
-                tramp-test-temporary-file-directory)))))))
+                ert-remote-temporary-file-directory)))))))
 
       (unwind-protect
          ;; Map `backup-directory-alist'.
@@ -6163,7 +6239,9 @@ Use direct async.")
             (with-temp-buffer
               (set-visited-file-name tmp-name1)
               (insert "foo")
-              (save-buffer))
+             (should (buffer-modified-p))
+              (save-buffer)
+             (should-not (buffer-modified-p)))
             (should-not (with-no-warnings (file-locked-p tmp-name1)))
            (with-no-warnings (lock-file tmp-name1))
            (should (eq (with-no-warnings (file-locked-p tmp-name1)) t))
@@ -6285,7 +6363,9 @@ Use direct async.")
                ;; buffer results in a prompt.
                (cl-letf (((symbol-function 'yes-or-no-p)
                           (lambda (_) (ert-fail "Test failed unexpectedly"))))
-                 (save-buffer))
+                 (should (buffer-modified-p))
+                 (save-buffer)
+                 (should-not (buffer-modified-p)))
                (should-not (file-locked-p tmp-name))
 
                ;; For local files, just changing the file
@@ -6317,7 +6397,9 @@ Use direct async.")
                  (cl-letf (((symbol-function 'yes-or-no-p) 
#'tramp--test-always)
                            ((symbol-function 'read-char-choice)
                             (lambda (&rest _) ?y)))
-                   (save-buffer))
+                   (should (buffer-modified-p))
+                   (save-buffer)
+                   (should-not (buffer-modified-p)))
                  (should-not (file-locked-p tmp-name))))
 
            ;; Cleanup.
@@ -6332,7 +6414,7 @@ Use direct async.")
   (skip-unless (tramp--test-enabled))
   (skip-unless (not (tramp--test-ange-ftp-p)))
 
-  (let ((default-directory tramp-test-temporary-file-directory)
+  (let ((default-directory ert-remote-temporary-file-directory)
        tmp-file)
     ;; The remote host shall know a temporary file directory.
     (should (stringp (temporary-file-directory)))
@@ -6379,7 +6461,7 @@ variables, so we check the Emacs version directly."
 (defun tramp--test-adb-p ()
   "Check, whether the remote host runs Android.
 This requires restrictions of file name syntax."
-  (tramp-adb-file-name-p tramp-test-temporary-file-directory))
+  (tramp-adb-file-name-p ert-remote-temporary-file-directory))
 
 (defun tramp--test-ange-ftp-p ()
   "Check, whether Ange-FTP is used."
@@ -6389,7 +6471,7 @@ This requires restrictions of file name syntax."
 
 (defun tramp--test-asynchronous-processes-p ()
   "Whether asynchronous processes tests are run.
-This is used in tests which we dont't want to tag
+This is used in tests which we don't want to tag
 `:tramp-asynchronous-processes' completely."
   (and
    (ert-select-tests
@@ -6402,17 +6484,17 @@ This is used in tests which we dont't want to tag
 
 (defun tramp--test-crypt-p ()
   "Check, whether the remote directory is crypted."
-  (tramp-crypt-file-name-p tramp-test-temporary-file-directory))
+  (tramp-crypt-file-name-p ert-remote-temporary-file-directory))
 
 (defun tramp--test-docker-p ()
   "Check, whether the docker method is used.
 This does not support some special file names."
   (string-equal
-   "docker" (file-remote-p tramp-test-temporary-file-directory 'method)))
+   "docker" (file-remote-p ert-remote-temporary-file-directory 'method)))
 
 (defun tramp--test-expensive-test-p ()
   "Whether expensive tests are run.
-This is used in tests which we dont't want to tag `:expensive'
+This is used in tests which we don't want to tag `:expensive'
 completely."
   (ert-select-tests
    (ert--stats-selector ert--current-run-stats)
@@ -6424,7 +6506,7 @@ completely."
 This does not support globbing characters in file names (yet)."
   ;; Globbing characters are ??, ?* and ?\[.
   (string-match-p
-   "ftp$" (file-remote-p tramp-test-temporary-file-directory 'method)))
+   "ftp$" (file-remote-p ert-remote-temporary-file-directory 'method)))
 
 (defun tramp--test-fuse-p ()
   "Check, whether an FUSE file system isused."
@@ -6433,20 +6515,20 @@ This does not support globbing characters in file names 
(yet)."
 (defun tramp--test-gdrive-p ()
   "Check, whether the gdrive method is used."
   (string-equal
-   "gdrive" (file-remote-p tramp-test-temporary-file-directory 'method)))
+   "gdrive" (file-remote-p ert-remote-temporary-file-directory 'method)))
 
 (defun tramp--test-gvfs-p (&optional method)
   "Check, whether the remote host runs a GVFS based method.
 This requires restrictions of file name syntax.
 If optional METHOD is given, it is checked first."
   (or (member method tramp-gvfs-methods)
-      (tramp-gvfs-file-name-p tramp-test-temporary-file-directory)))
+      (tramp-gvfs-file-name-p ert-remote-temporary-file-directory)))
 
 (defun tramp--test-hpux-p ()
   "Check, whether the remote host runs HP-UX.
 Several special characters do not work properly there."
   ;; We must refill the cache.  `file-truename' does it.
-  (file-truename tramp-test-temporary-file-directory)
+  (file-truename ert-remote-temporary-file-directory)
   (ignore-errors (tramp-check-remote-uname tramp-test-vec "^HP-UX")))
 
 (defun tramp--test-ksh-p ()
@@ -6454,21 +6536,21 @@ Several special characters do not work properly there."
 ksh93 makes some strange conversions of non-latin characters into
 a $'' syntax."
   ;; We must refill the cache.  `file-truename' does it.
-  (file-truename tramp-test-temporary-file-directory)
+  (file-truename ert-remote-temporary-file-directory)
   (string-match-p
    "ksh$" (tramp-get-connection-property tramp-test-vec "remote-shell" "")))
 
 (defun tramp--test-macos-p ()
   "Check, whether the remote host runs macOS."
   ;; We must refill the cache.  `file-truename' does it.
-  (file-truename tramp-test-temporary-file-directory)
+  (file-truename ert-remote-temporary-file-directory)
   (ignore-errors (tramp-check-remote-uname tramp-test-vec "Darwin")))
 
 (defun tramp--test-mock-p ()
   "Check, whether the mock method is used.
 This does not support external Emacs calls."
   (string-equal
-   "mock" (file-remote-p tramp-test-temporary-file-directory 'method)))
+   "mock" (file-remote-p ert-remote-temporary-file-directory 'method)))
 
 (defun tramp--test-out-of-band-p ()
   "Check, whether an out-of-band method is used."
@@ -6477,13 +6559,13 @@ This does not support external Emacs calls."
 (defun tramp--test-rclone-p ()
   "Check, whether the remote host is offered by rclone.
 This requires restrictions of file name syntax."
-  (tramp-rclone-file-name-p tramp-test-temporary-file-directory))
+  (tramp-rclone-file-name-p ert-remote-temporary-file-directory))
 
 (defun tramp--test-rsync-p ()
   "Check, whether the rsync method is used.
 This does not support special file names."
   (string-equal
-   "rsync" (file-remote-p tramp-test-temporary-file-directory 'method)))
+   "rsync" (file-remote-p ert-remote-temporary-file-directory 'method)))
 
 (defun tramp--test-sh-p ()
   "Check, whether the remote host runs a based method from tramp-sh.el."
@@ -6497,7 +6579,7 @@ Additionally, ls does not support \"--dired\"."
         ;; We must refill the cache.  `insert-directory' does it.
         ;; This fails for tramp-crypt.el, so we ignore that.
         (ignore-errors
-          (insert-directory tramp-test-temporary-file-directory "-al"))
+          (insert-directory ert-remote-temporary-file-directory "-al"))
         (not (tramp-get-connection-property tramp-test-vec "ls--dired" nil)))))
 
 (defun tramp--test-share-p ()
@@ -6505,22 +6587,22 @@ Additionally, ls does not support \"--dired\"."
   (and (tramp--test-gvfs-p)
        (string-match-p
        "^\\(afp\\|davs?\\|smb\\)$"
-       (file-remote-p tramp-test-temporary-file-directory 'method))))
+       (file-remote-p ert-remote-temporary-file-directory 'method))))
 
 (defun tramp--test-sshfs-p ()
   "Check, whether the remote host is offered by sshfs.
 This requires restrictions of file name syntax."
-  (tramp-sshfs-file-name-p tramp-test-temporary-file-directory))
+  (tramp-sshfs-file-name-p ert-remote-temporary-file-directory))
 
 (defun tramp--test-sudoedit-p ()
   "Check, whether the sudoedit method is used."
-  (tramp-sudoedit-file-name-p tramp-test-temporary-file-directory))
+  (tramp-sudoedit-file-name-p ert-remote-temporary-file-directory))
 
 (defun tramp--test-telnet-p ()
   "Check, whether the telnet method is used.
 This does not support special file names."
   (string-equal
-   "telnet" (file-remote-p tramp-test-temporary-file-directory 'method)))
+   "telnet" (file-remote-p ert-remote-temporary-file-directory 'method)))
 
 (defun tramp--test-windows-nt-p ()
   "Check, whether the locale host runs MS Windows."
@@ -6541,7 +6623,7 @@ This requires restrictions of file name syntax."
 (defun tramp--test-smb-p ()
   "Check, whether the locale or remote host runs MS Windows.
 This requires restrictions of file name syntax."
-  (tramp-smb-file-name-p tramp-test-temporary-file-directory))
+  (tramp-smb-file-name-p ert-remote-temporary-file-directory))
 
 (defun tramp--test-supports-processes-p ()
   "Return whether the method under test supports external processes."
@@ -6557,7 +6639,7 @@ This requires restrictions of file name syntax."
       (and
        (tramp--test-gvfs-p)
        (string-match-p
-       "ftp" (file-remote-p tramp-test-temporary-file-directory 'method)))))
+       "ftp" (file-remote-p ert-remote-temporary-file-directory 'method)))))
 
 (defun tramp--test-check-files (&rest files)
   "Run a simple but comprehensive test over every file in FILES."
@@ -6568,8 +6650,9 @@ This requires restrictions of file name syntax."
     ;; We must use `file-truename' for the temporary directory,
     ;; because it could be located on a symlinked directory.  This
     ;; would let the test fail.
-    (let* ((tramp-test-temporary-file-directory
-           (file-truename tramp-test-temporary-file-directory))
+    (let* ((ert-remote-temporary-file-directory
+           (file-truename ert-remote-temporary-file-directory))
+          (tramp-fuse-remove-hidden-files t)
           (tmp-name1 (tramp--test-make-temp-name nil quoted))
           (tmp-name2 (tramp--test-make-temp-name 'local quoted))
           (files
@@ -6743,7 +6826,7 @@ This requires restrictions of file name syntax."
 
                (delete-file file2)
                (should-not (file-exists-p file2))
-               (delete-directory file1)
+               (delete-directory file1 'recursive)
                (should-not (file-exists-p file1))))
 
            ;; Check, that environment variables are set correctly.
@@ -6755,7 +6838,7 @@ This requires restrictions of file name syntax."
              (dolist (elt files)
                (let ((envvar (concat "VAR_" (upcase (md5 elt))))
                      (elt (encode-coding-string elt coding-system-for-read))
-                     (default-directory tramp-test-temporary-file-directory)
+                     (default-directory ert-remote-temporary-file-directory)
                      (process-environment process-environment))
                  (setenv envvar elt)
                  ;; The value of PS1 could confuse Tramp's detection
@@ -6853,12 +6936,12 @@ Use the \"stat\" command."
   (skip-unless (tramp--test-sh-p))
   (skip-unless (not (tramp--test-rsync-p)))
   ;; We cannot use `tramp-test-vec', because this fails during compilation.
-  (with-parsed-tramp-file-name tramp-test-temporary-file-directory nil
+  (with-parsed-tramp-file-name ert-remote-temporary-file-directory nil
     (skip-unless (tramp-get-remote-stat v)))
 
   (let ((tramp-connection-properties
         (append
-         `((,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+         `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "perl" nil))
          tramp-connection-properties)))
     (tramp--test-special-characters)))
@@ -6872,15 +6955,15 @@ Use the \"perl\" command."
   (skip-unless (tramp--test-sh-p))
   (skip-unless (not (tramp--test-rsync-p)))
   ;; We cannot use `tramp-test-vec', because this fails during compilation.
-  (with-parsed-tramp-file-name tramp-test-temporary-file-directory nil
+  (with-parsed-tramp-file-name ert-remote-temporary-file-directory nil
     (skip-unless (tramp-get-remote-perl v)))
 
   (let ((tramp-connection-properties
         (append
-         `((,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+         `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "stat" nil)
            ;; See `tramp-sh-handle-file-truename'.
-           (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+           (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "readlink" nil))
          tramp-connection-properties)))
     (tramp--test-special-characters)))
@@ -6896,12 +6979,12 @@ Use the \"ls\" command."
 
   (let ((tramp-connection-properties
         (append
-         `((,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+         `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "perl" nil)
-           (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+           (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "stat" nil)
            ;; See `tramp-sh-handle-file-truename'.
-           (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+           (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "readlink" nil))
          tramp-connection-properties)))
     (tramp--test-special-characters)))
@@ -6980,12 +7063,12 @@ Use the \"stat\" command."
   (skip-unless (not (tramp--test-ksh-p)))
   (skip-unless (not (tramp--test-crypt-p)))
   ;; We cannot use `tramp-test-vec', because this fails during compilation.
-  (with-parsed-tramp-file-name tramp-test-temporary-file-directory nil
+  (with-parsed-tramp-file-name ert-remote-temporary-file-directory nil
     (skip-unless (tramp-get-remote-stat v)))
 
   (let ((tramp-connection-properties
         (append
-         `((,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+         `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "perl" nil))
          tramp-connection-properties)))
     (tramp--test-utf8)))
@@ -7003,15 +7086,15 @@ Use the \"perl\" command."
   (skip-unless (not (tramp--test-ksh-p)))
   (skip-unless (not (tramp--test-crypt-p)))
   ;; We cannot use `tramp-test-vec', because this fails during compilation.
-  (with-parsed-tramp-file-name tramp-test-temporary-file-directory nil
+  (with-parsed-tramp-file-name ert-remote-temporary-file-directory nil
     (skip-unless (tramp-get-remote-perl v)))
 
   (let ((tramp-connection-properties
         (append
-         `((,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+         `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "stat" nil)
            ;; See `tramp-sh-handle-file-truename'.
-           (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+           (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "readlink" nil))
          tramp-connection-properties)))
     (tramp--test-utf8)))
@@ -7031,12 +7114,12 @@ Use the \"ls\" command."
 
   (let ((tramp-connection-properties
         (append
-         `((,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+         `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "perl" nil)
-           (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+           (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "stat" nil)
            ;; See `tramp-sh-handle-file-truename'.
-           (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+           (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
             "readlink" nil))
          tramp-connection-properties)))
     (tramp--test-utf8)))
@@ -7049,14 +7132,12 @@ Use the \"ls\" command."
 
   ;; `file-system-info' exists since Emacs 27.1.  We don't want to see
   ;; compiler warnings for older Emacsen.
-  (let ((fsi (with-no-warnings
-              (file-system-info tramp-test-temporary-file-directory))))
-    (skip-unless fsi)
-    (should (and (consp fsi)
-                (= (length fsi) 3)
-                (numberp (nth 0 fsi))
-                (numberp (nth 1 fsi))
-                (numberp (nth 2 fsi))))))
+  (when-let ((fsi (with-no-warnings
+                   (file-system-info ert-remote-temporary-file-directory))))
+    (should (consp fsi))
+    (should (= (length fsi) 3))
+    (dotimes (i (length fsi))
+      (should (natnump (or (nth i fsi) 0))))))
 
 ;; `tramp-test44-asynchronous-requests' could be blocked.  So we set a
 ;; timeout of 300 seconds, and we send a SIGUSR1 signal after 300
@@ -7307,7 +7388,7 @@ process sentinels.  They shall not disturb each other."
   ;; default handler.
   (skip-unless (not (tramp--test-emacs29-p)))
 
-  (let ((default-directory tramp-test-temporary-file-directory)
+  (let ((default-directory ert-remote-temporary-file-directory)
         (tmp-name (tramp--test-make-temp-name)))
     (write-region "foo" nil tmp-name)
     (dired default-directory)
@@ -7328,7 +7409,7 @@ process sentinels.  They shall not disturb each other."
   ;; default handler.
   (skip-unless (not (tramp--test-emacs29-p)))
 
-  (let ((default-directory tramp-test-temporary-file-directory)
+  (let ((default-directory ert-remote-temporary-file-directory)
         (tmp-name (tramp--test-make-temp-name)))
     (make-directory tmp-name)
     (dired default-directory)
@@ -7373,17 +7454,17 @@ process sentinels.  They shall not disturb each other."
       (tramp-cleanup-connection tramp-test-vec 'keep-debug)
       ;; We don't want to invalidate the password.
       (setq mocked-input `(,(copy-sequence pass)))
-      (should (file-exists-p tramp-test-temporary-file-directory))
+      (should (file-exists-p ert-remote-temporary-file-directory))
 
       ;; Don't entering a password returns in error.
       (tramp-cleanup-connection tramp-test-vec 'keep-debug)
       (setq mocked-input nil)
-      (should-error (file-exists-p tramp-test-temporary-file-directory))
+      (should-error (file-exists-p ert-remote-temporary-file-directory))
 
       ;; A wrong password doesn't work either.
       (tramp-cleanup-connection tramp-test-vec 'keep-debug)
       (setq mocked-input `(,(concat pass pass)))
-      (should-error (file-exists-p tramp-test-temporary-file-directory))
+      (should-error (file-exists-p ert-remote-temporary-file-directory))
 
       ;; Reading password from auth-source works.  We use the netrc
       ;; backend; the other backends shall behave similar.
@@ -7396,9 +7477,9 @@ process sentinels.  They shall not disturb each other."
          :prefix "tramp-test" :suffix ""
          :text (format
                 "machine %s port mock password %s"
-                (file-remote-p tramp-test-temporary-file-directory 'host) pass)
+                (file-remote-p ert-remote-temporary-file-directory 'host) pass)
          (let ((auth-sources `(,netrc-file)))
-           (should (file-exists-p tramp-test-temporary-file-directory)))))))))
+           (should (file-exists-p ert-remote-temporary-file-directory)))))))))
 
 ;; This test is inspired by Bug#29163.
 (ert-deftest tramp-test47-auto-load ()
@@ -7414,7 +7495,7 @@ process sentinels.  They shall not disturb each other."
          ;; Suppress method name check.
          "(let ((non-essential t)) \
              (message \"Tramp loaded: %%s\" (and (file-remote-p %S) t)))"
-         tramp-test-temporary-file-directory)))
+         ert-remote-temporary-file-directory)))
     (should
      (string-match-p
       "Tramp loaded: t[\n\r]+"
@@ -7463,10 +7544,10 @@ process sentinels.  They shall not disturb each other."
     (dolist (code
             (list
              (format
-              "(expand-file-name %S)" tramp-test-temporary-file-directory)
+              "(expand-file-name %S)" ert-remote-temporary-file-directory)
              (format
               "(let ((default-directory %S)) (expand-file-name %S))"
-              tramp-test-temporary-file-directory
+              ert-remote-temporary-file-directory
               temporary-file-directory)))
       (should-not
        (string-match-p
diff --git a/test/lisp/progmodes/python-tests.el 
b/test/lisp/progmodes/python-tests.el
index 01b233cc42..8db0a07170 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -95,6 +95,19 @@ STRING, it is skipped so the next STRING occurrence is 
selected."
         found-point
       (and restore-point (goto-char starting-point)))))
 
+(defun python-tests-assert-faces (content faces)
+  "Assert that font faces for CONTENT are equal to FACES."
+  (python-tests-with-temp-buffer content
+    (font-lock-ensure nil nil)
+    (should (equal faces (python-tests-get-buffer-faces)))))
+
+(defun python-tests-get-buffer-faces ()
+  "Return a list of (position . face) for each face change positions."
+  (cl-loop for pos = (point-min)
+           then (next-single-property-change pos 'face)
+           while pos
+           collect (cons pos (get-text-property pos 'face))))
+
 (defun python-tests-self-insert (char-or-str)
   "Call `self-insert-command' for chars in CHAR-OR-STR."
   (let ((chars
@@ -201,6 +214,172 @@ aliqua."
     (should (string= (buffer-string) "\"\""))
     (should (null (nth 3 (syntax-ppss))))))
 
+(ert-deftest python-font-lock-keywords-level-1-1 ()
+  (python-tests-assert-faces
+   "def func():"
+   '((1 . font-lock-keyword-face) (4)
+     (5 . font-lock-function-name-face) (9))))
+
+(ert-deftest python-font-lock-keywords-level-1-2 ()
+  "Invalid function name should not be font-locked."
+  (python-tests-assert-faces
+   "def 1func():"
+   '((1 . font-lock-keyword-face) (4))))
+
+(ert-deftest python-font-lock-assignment-statement-1 ()
+  (python-tests-assert-faces
+   "a, b, c = 1, 2, 3"
+   '((1 . font-lock-variable-name-face) (2)
+     (4 . font-lock-variable-name-face) (5)
+     (7 . font-lock-variable-name-face) (8))))
+
+(ert-deftest python-font-lock-assignment-statement-2 ()
+  (python-tests-assert-faces
+   "a, *b, c = 1, 2, 3, 4, 5"
+   '((1 . font-lock-variable-name-face) (2)
+     (5 . font-lock-variable-name-face) (6)
+     (8 . font-lock-variable-name-face) (9))))
+
+(ert-deftest python-font-lock-assignment-statement-3 ()
+  (python-tests-assert-faces
+   "[a, b] = (1, 2)"
+   '((1)
+     (2 . font-lock-variable-name-face) (3)
+     (5 . font-lock-variable-name-face) (6))))
+
+(ert-deftest python-font-lock-assignment-statement-4 ()
+  (python-tests-assert-faces
+   "(l[1], l[2]) = (10, 11)"
+   '((1)
+     (2 . font-lock-variable-name-face) (3)
+     (8 . font-lock-variable-name-face) (9))))
+
+(ert-deftest python-font-lock-assignment-statement-5 ()
+  (python-tests-assert-faces
+   "(a, b, c, *d) = *x, y = 5, 6, 7, 8, 9"
+   '((1)
+     (2 . font-lock-variable-name-face) (3)
+     (5 . font-lock-variable-name-face) (6)
+     (8 . font-lock-variable-name-face) (9)
+     (12 . font-lock-variable-name-face) (13)
+     (18 . font-lock-variable-name-face) (19)
+     (21 . font-lock-variable-name-face) (22))))
+
+(ert-deftest python-font-lock-assignment-statement-6 ()
+  (python-tests-assert-faces
+   "(a,) = 'foo',"
+   '((1)
+     (2 . font-lock-variable-name-face) (3)
+     (8 . font-lock-string-face) (13))))
+
+(ert-deftest python-font-lock-assignment-statement-7 ()
+  (python-tests-assert-faces
+   "(*a,) = ['foo', 'bar', 'baz']"
+   '((1)
+     (3 . font-lock-variable-name-face) (4)
+     (10 . font-lock-string-face) (15)
+     (17 . font-lock-string-face) (22)
+     (24 . font-lock-string-face) (29))))
+
+(ert-deftest python-font-lock-assignment-statement-8 ()
+  (python-tests-assert-faces
+   "d = D('a', ['b'], 'c')"
+   '((1 . font-lock-variable-name-face) (2)
+     (7 . font-lock-string-face) (10)
+     (13 . font-lock-string-face) (16)
+     (19 . font-lock-string-face) (22))))
+
+(ert-deftest python-font-lock-assignment-statement-9 ()
+  (python-tests-assert-faces
+   "d.x, d.y[0], *d.z = 'a', 'b', 'c', 'd', 'e'"
+   '((1)
+     (3 . font-lock-variable-name-face) (4)
+     (8 . font-lock-variable-name-face) (9)
+     (17 . font-lock-variable-name-face) (18)
+     (21 . font-lock-string-face) (24)
+     (26 . font-lock-string-face) (29)
+     (31 . font-lock-string-face) (34)
+     (36 . font-lock-string-face) (39)
+     (41 . font-lock-string-face))))
+
+(ert-deftest python-font-lock-assignment-statement-10 ()
+  (python-tests-assert-faces
+   "a: int = 5"
+   '((1 . font-lock-variable-name-face) (2)
+     (4 . font-lock-builtin-face) (7))))
+
+(ert-deftest python-font-lock-assignment-statement-11 ()
+  (python-tests-assert-faces
+   "b: Tuple[Optional[int], Union[Sequence[str], str]] = (None, 'foo')"
+   '((1 . font-lock-variable-name-face) (2)
+     (19 . font-lock-builtin-face) (22)
+     (40 . font-lock-builtin-face) (43)
+     (46 . font-lock-builtin-face) (49)
+     (55 . font-lock-constant-face) (59)
+     (61 . font-lock-string-face) (66))))
+
+(ert-deftest python-font-lock-assignment-statement-12 ()
+  (python-tests-assert-faces
+   "c: Collection = {1, 2, 3}"
+   '((1 . font-lock-variable-name-face) (2))))
+
+(ert-deftest python-font-lock-assignment-statement-13 ()
+  (python-tests-assert-faces
+   "d: Mapping[int, str] = {1: 'bar', 2: 'baz'}"
+   '((1 . font-lock-variable-name-face) (2)
+     (12 . font-lock-builtin-face) (15)
+     (17 . font-lock-builtin-face) (20)
+     (28 . font-lock-string-face) (33)
+     (38 . font-lock-string-face) (43))))
+
+(ert-deftest python-font-lock-assignment-statement-14 ()
+  (python-tests-assert-faces
+   "(a) = 5; (b) = 6"
+   '((1)
+     (2 . font-lock-variable-name-face) (3)
+     (11 . font-lock-variable-name-face) (12))))
+
+(ert-deftest python-font-lock-assignment-statement-15 ()
+  (python-tests-assert-faces
+   "[a] = 5,; [b] = 6,"
+   '((1)
+     (2 . font-lock-variable-name-face) (3)
+     (12 . font-lock-variable-name-face) (13))))
+
+(ert-deftest python-font-lock-assignment-statement-16 ()
+  (python-tests-assert-faces
+   "[*a] = 5, 6; [*b] = 7, 8"
+   '((1)
+     (3 . font-lock-variable-name-face) (4)
+     (16 . font-lock-variable-name-face) (17))))
+
+(ert-deftest python-font-lock-assignment-statement-17 ()
+  (python-tests-assert-faces
+   "(a) = (b) = 1"
+   `((1)
+     (2 . font-lock-variable-name-face) (3)
+     (8 . font-lock-variable-name-face) (9))))
+
+(ert-deftest python-font-lock-assignment-statement-18 ()
+  (python-tests-assert-faces
+   "CustomInt = int
+
+def f(x: CustomInt) -> CustomInt:
+    y = x + 1
+    ys: Sequence[CustomInt] = [y, y + 1]
+    res: CustomInt = sum(ys) + 1
+    return res
+"
+   '((1 . font-lock-variable-name-face) (10)
+     (13 . font-lock-builtin-face) (16)
+     (18 . font-lock-keyword-face) (21)
+     (22 . font-lock-function-name-face) (23)
+     (56 . font-lock-variable-name-face) (57)
+     (70 . font-lock-variable-name-face) (72)
+     (111 . font-lock-variable-name-face) (114)
+     (128 . font-lock-builtin-face) (131)
+     (144 . font-lock-keyword-face) (150))))
+
 
 ;;; Indentation
 
@@ -1349,6 +1528,31 @@ this is an arbitrarily
      (should (string= (buffer-substring-no-properties (point-min) (point-max))
                       expected)))))
 
+(ert-deftest python-indent-after-match-block ()
+  "Test PEP634 match."
+  (python-tests-with-temp-buffer
+   "
+match foo:
+"
+   (should (eq (car (python-indent-context)) :no-indent))
+   (should (= (python-indent-calculate-indentation) 0))
+   (goto-char (point-max))
+   (should (eq (car (python-indent-context)) :after-block-start))
+   (should (= (python-indent-calculate-indentation) 4))))
+
+(ert-deftest python-indent-after-case-block ()
+  "Test PEP634 case."
+  (python-tests-with-temp-buffer
+   "
+match foo:
+    case 1:
+"
+   (should (eq (car (python-indent-context)) :no-indent))
+   (should (= (python-indent-calculate-indentation) 0))
+   (goto-char (point-max))
+   (should (eq (car (python-indent-context)) :after-block-start))
+   (should (= (python-indent-calculate-indentation) 8))))
+
 
 ;;; Filling
 
@@ -1657,6 +1861,22 @@ class C(object):
                 (beginning-of-line)
                 (point))))))
 
+(ert-deftest python-nav-beginning-of-defun-4 ()
+  (python-tests-with-temp-buffer
+   "
+def \\
+        a():
+    return 0
+"
+   (python-tests-look-at "return 0")
+   (should (= (save-excursion
+                (python-nav-beginning-of-defun)
+                (point))
+              (save-excursion
+                (python-tests-look-at "def \\" -1)
+                (beginning-of-line)
+                (point))))))
+
 (ert-deftest python-nav-end-of-defun-1 ()
   (python-tests-with-temp-buffer
    "
@@ -1760,6 +1980,20 @@ def decoratorFunctionWithArguments(arg1, arg2, arg3):
                 (python-tests-look-at "return wrapped_f")
                 (line-beginning-position))))))
 
+(ert-deftest python-nav-end-of-defun-3 ()
+  (python-tests-with-temp-buffer
+   "
+def \\
+        a():
+    return 0
+"
+   (should (= (save-excursion
+                (python-tests-look-at "def \\")
+                (python-nav-end-of-defun)
+                (point))
+              (save-excursion
+                (point-max))))))
+
 (ert-deftest python-nav-backward-defun-1 ()
   (python-tests-with-temp-buffer
    "
@@ -1858,6 +2092,18 @@ class A(object):
      (should (not (python-nav-backward-defun)))
      (should (= point (point))))))
 
+(ert-deftest python-nav-backward-defun-4 ()
+  (python-tests-with-temp-buffer
+   "
+def \\
+        a():
+    return 0
+"
+   (goto-char (point-max))
+   (should (= (save-excursion (python-nav-backward-defun))
+              (python-tests-look-at "def \\" -1)))
+   (should (not (python-nav-backward-defun)))))
+
 (ert-deftest python-nav-forward-defun-1 ()
   (python-tests-with-temp-buffer
    "
@@ -1956,6 +2202,18 @@ class A(object):
      (should (not (python-nav-forward-defun)))
      (should (= point (point))))))
 
+(ert-deftest python-nav-forward-defun-4 ()
+  (python-tests-with-temp-buffer
+   "
+def \\
+        a():
+    return 0
+"
+   (goto-char (point-min))
+   (should (= (save-excursion (python-nav-forward-defun))
+              (python-tests-look-at "():")))
+   (should (not (python-nav-forward-defun)))))
+
 (ert-deftest python-nav-beginning-of-statement-1 ()
   (python-tests-with-temp-buffer
    "
diff --git a/test/lisp/shadowfile-tests.el b/test/lisp/shadowfile-tests.el
index 46ab34535d..e822bc9eb6 100644
--- a/test/lisp/shadowfile-tests.el
+++ b/test/lisp/shadowfile-tests.el
@@ -37,37 +37,9 @@
 
 ;;; Code:
 
-(require 'ert)
-(require 'shadowfile)
 (require 'tramp)
-
-;; There is no default value on w32 systems, which could work out of the box.
-(defconst shadow-test-remote-temporary-file-directory
-  (cond
-   ((getenv "REMOTE_TEMPORARY_FILE_DIRECTORY"))
-   ((eq system-type 'windows-nt) null-device)
-   (t (add-to-list
-       'tramp-methods
-       '("mock"
-        (tramp-login-program        "sh")
-        (tramp-login-args           (("-i")))
-        (tramp-remote-shell         "/bin/sh")
-        (tramp-remote-shell-args    ("-c"))
-        (tramp-connection-timeout   10)))
-      (add-to-list
-       'tramp-default-host-alist
-       `("\\`mock\\'" nil ,(system-name)))
-      ;; Emacs' Makefile sets $HOME to a nonexistent value.  Needed in
-      ;; batch mode only, therefore.  `shadow-homedir' cannot be
-      ;; `temporary-directory', because the tests with "~" would fail.
-      (unless (and (null noninteractive) (file-directory-p "~/"))
-        (setenv "HOME" (file-name-unquote temporary-file-directory))
-        (setq shadow-homedir invocation-directory)
-        (add-to-list
-         'tramp-connection-properties
-         `(,(file-remote-p "/mock::") "~" ,invocation-directory)))
-      (format "/mock::%s" temporary-file-directory)))
-  "Temporary directory for Tramp tests.")
+(require 'ert-x)
+(require 'shadowfile)
 
 (setq auth-source-save-behavior nil
       password-cache-expiry nil
@@ -80,9 +52,8 @@
       tramp-verbose 0
       ;; On macOS, `temporary-file-directory' is a symlinked directory.
       temporary-file-directory (file-truename temporary-file-directory)
-      shadow-test-remote-temporary-file-directory
-      (ignore-errors
-        (file-truename shadow-test-remote-temporary-file-directory)))
+      ert-remote-temporary-file-directory
+      (ignore-errors (file-truename ert-remote-temporary-file-directory)))
 
 ;; This should happen on hydra only.
 (when (getenv "EMACS_HYDRA_CI")
@@ -100,7 +71,7 @@
   "Reset all `shadowfile' internals."
   ;; Cleanup Tramp.
   (tramp-cleanup-connection
-   (tramp-dissect-file-name shadow-test-remote-temporary-file-directory) t t)
+   (tramp-dissect-file-name ert-remote-temporary-file-directory) t t)
   ;; Delete auto-saved files.
   (with-current-buffer (find-file-noselect shadow-info-file 'nowarn)
     (ignore-errors (delete-file (make-auto-save-file-name)))
@@ -135,7 +106,7 @@ a cluster (or site).  This is not tested here; it must be
 guaranteed by the originator of a cluster definition."
   :tags '(:expensive-test)
   (skip-unless (not (memq system-type '(windows-nt ms-dos))))
-  (skip-unless (file-remote-p shadow-test-remote-temporary-file-directory))
+  (skip-unless (file-remote-p ert-remote-temporary-file-directory))
 
   (let ((text-quoting-style 'grave) ;; We inspect the *Messages* buffer!
         (inhibit-message t)
@@ -222,8 +193,7 @@ guaranteed by the originator of a cluster definition."
            (shadow-cluster-regexp (shadow-get-cluster cluster)) regexp))
 
          ;; Redefine the cluster.
-         (setq primary
-               (file-remote-p shadow-test-remote-temporary-file-directory)
+         (setq primary (file-remote-p ert-remote-temporary-file-directory)
                regexp (shadow-regexp-superquote primary)
                mocked-input `(,cluster ,primary ,regexp))
          (call-interactively #'shadow-define-cluster)
@@ -254,7 +224,7 @@ Per definition, all files are identical on the different 
hosts of
 a cluster (or site).  This is not tested here; it must be
 guaranteed by the originator of a cluster definition."
   (skip-unless (not (memq system-type '(windows-nt ms-dos))))
-  (skip-unless (file-remote-p shadow-test-remote-temporary-file-directory))
+  (skip-unless (file-remote-p ert-remote-temporary-file-directory))
 
   (let ((shadow-info-file shadow-test-info-file)
        (shadow-todo-file shadow-test-todo-file)
@@ -286,14 +256,14 @@ guaranteed by the originator of a cluster definition."
           (should (string-equal (system-name) (shadow-site-name primary1)))
           (should
            (string-equal
-            (file-remote-p shadow-test-remote-temporary-file-directory)
+            (file-remote-p ert-remote-temporary-file-directory)
             (shadow-name-site
-             (file-remote-p shadow-test-remote-temporary-file-directory))))
+             (file-remote-p ert-remote-temporary-file-directory))))
           (should
            (string-equal
-            (file-remote-p shadow-test-remote-temporary-file-directory)
+            (file-remote-p ert-remote-temporary-file-directory)
             (shadow-site-name
-             (file-remote-p shadow-test-remote-temporary-file-directory))))
+             (file-remote-p ert-remote-temporary-file-directory))))
 
           (should (equal (shadow-site-cluster cluster1)
                         (shadow-get-cluster cluster1)))
@@ -324,8 +294,7 @@ guaranteed by the originator of a cluster definition."
 
          ;; Define a second cluster.
           (setq cluster2 "cluster2"
-               primary2
-               (file-remote-p shadow-test-remote-temporary-file-directory)
+               primary2 (file-remote-p ert-remote-temporary-file-directory)
                regexp2 (format "^\\(%s\\|%s\\)$" shadow-system-name primary2))
          (shadow-set-cluster cluster2 primary2 regexp2)
 
@@ -356,7 +325,7 @@ guaranteed by the originator of a cluster definition."
 (ert-deftest shadow-test02-files ()
   "Check file manipulation functions."
   (skip-unless (not (memq system-type '(windows-nt ms-dos))))
-  (skip-unless (file-remote-p shadow-test-remote-temporary-file-directory))
+  (skip-unless (file-remote-p ert-remote-temporary-file-directory))
 
   (let ((shadow-info-file shadow-test-info-file)
        (shadow-todo-file shadow-test-todo-file)
@@ -398,8 +367,7 @@ guaranteed by the originator of a cluster definition."
            (string-equal (shadow-local-file (concat primary file)) file))
 
          ;; Redefine the cluster.
-         (setq primary
-               (file-remote-p shadow-test-remote-temporary-file-directory)
+         (setq primary (file-remote-p ert-remote-temporary-file-directory)
                regexp (shadow-regexp-superquote primary))
          (shadow-set-cluster cluster primary regexp)
 
@@ -428,7 +396,7 @@ guaranteed by the originator of a cluster definition."
 (ert-deftest shadow-test03-expand-cluster-in-file-name ()
   "Check canonical file name of a cluster or site."
   (skip-unless (not (memq system-type '(windows-nt ms-dos))))
-  (skip-unless (file-remote-p shadow-test-remote-temporary-file-directory))
+  (skip-unless (file-remote-p ert-remote-temporary-file-directory))
 
   (let ((shadow-info-file shadow-test-info-file)
        (shadow-todo-file shadow-test-todo-file)
@@ -453,8 +421,7 @@ guaranteed by the originator of a cluster definition."
                file2
                (make-temp-name
                 (expand-file-name
-                 "shadowfile-tests"
-                 shadow-test-remote-temporary-file-directory)))
+                  "shadowfile-tests" ert-remote-temporary-file-directory)))
 
           ;; A local file name is kept.
           (should
@@ -473,8 +440,7 @@ guaranteed by the originator of a cluster definition."
             (shadow-expand-cluster-in-file-name (concat primary file1)) file1))
 
          ;; Redefine the cluster.
-         (setq primary
-               (file-remote-p shadow-test-remote-temporary-file-directory)
+         (setq primary (file-remote-p ert-remote-temporary-file-directory)
                regexp (shadow-regexp-superquote primary))
          (shadow-set-cluster cluster primary regexp)
 
@@ -495,7 +461,7 @@ guaranteed by the originator of a cluster definition."
 (ert-deftest shadow-test04-contract-file-name ()
   "Check canonical file name of a cluster or site."
   (skip-unless (not (memq system-type '(windows-nt ms-dos))))
-  (skip-unless (file-remote-p shadow-test-remote-temporary-file-directory))
+  (skip-unless (file-remote-p ert-remote-temporary-file-directory))
 
   (let ((shadow-info-file shadow-test-info-file)
        (shadow-todo-file shadow-test-todo-file)
@@ -533,8 +499,7 @@ guaranteed by the originator of a cluster definition."
             (concat "/cluster:" file)))
 
          ;; Redefine the cluster.
-         (setq primary
-               (file-remote-p shadow-test-remote-temporary-file-directory)
+         (setq primary (file-remote-p ert-remote-temporary-file-directory)
                regexp (shadow-regexp-superquote primary))
          (shadow-set-cluster cluster primary regexp)
 
@@ -542,8 +507,7 @@ guaranteed by the originator of a cluster definition."
           (should
            (string-equal
             (shadow-contract-file-name
-             (concat
-              (file-remote-p shadow-test-remote-temporary-file-directory) 
file))
+             (concat (file-remote-p ert-remote-temporary-file-directory) file))
             (concat "/cluster:" file))))
 
       ;; Cleanup.
@@ -552,7 +516,7 @@ guaranteed by the originator of a cluster definition."
 (ert-deftest shadow-test05-file-match ()
   "Check `shadow-same-site' and `shadow-file-match'."
   (skip-unless (not (memq system-type '(windows-nt ms-dos))))
-  (skip-unless (file-remote-p shadow-test-remote-temporary-file-directory))
+  (skip-unless (file-remote-p ert-remote-temporary-file-directory))
 
   (let ((shadow-info-file shadow-test-info-file)
        (shadow-todo-file shadow-test-todo-file)
@@ -588,17 +552,14 @@ guaranteed by the originator of a cluster definition."
           (should (shadow-file-match (shadow-parse-name file) file))
 
          ;; Redefine the cluster.
-         (setq primary
-               (file-remote-p shadow-test-remote-temporary-file-directory)
+         (setq primary (file-remote-p ert-remote-temporary-file-directory)
                regexp (shadow-regexp-superquote primary))
          (shadow-set-cluster cluster primary regexp)
 
           (should
           (shadow-file-match
            (shadow-parse-name
-            (concat
-             (file-remote-p shadow-test-remote-temporary-file-directory)
-             file))
+            (concat (file-remote-p ert-remote-temporary-file-directory) file))
            file)))
 
       ;; Cleanup.
@@ -607,7 +568,7 @@ guaranteed by the originator of a cluster definition."
 (ert-deftest shadow-test06-literal-groups ()
   "Check literal group definitions."
   (skip-unless (not (memq system-type '(windows-nt ms-dos))))
-  (skip-unless (file-remote-p shadow-test-remote-temporary-file-directory))
+  (skip-unless (file-remote-p ert-remote-temporary-file-directory))
 
   (let ((shadow-info-file shadow-test-info-file)
        (shadow-todo-file shadow-test-todo-file)
@@ -632,8 +593,7 @@ guaranteed by the originator of a cluster definition."
          (shadow-set-cluster cluster1 primary regexp)
 
          (setq cluster2 "cluster2"
-               primary
-               (file-remote-p shadow-test-remote-temporary-file-directory)
+               primary (file-remote-p ert-remote-temporary-file-directory)
                regexp (format "^\\(%s\\|%s\\)$" shadow-system-name primary))
          (shadow-set-cluster cluster2 primary regexp)
 
@@ -644,8 +604,7 @@ guaranteed by the originator of a cluster definition."
                file2
                (make-temp-name
                 (expand-file-name
-                 "shadowfile-tests"
-                 shadow-test-remote-temporary-file-directory))
+                 "shadowfile-tests" ert-remote-temporary-file-directory))
                mocked-input
                 `(,cluster1 ,file1 ,cluster2 ,file2
                   ,primary ,file1 ,(kbd "RET")))
@@ -694,7 +653,7 @@ guaranteed by the originator of a cluster definition."
 (ert-deftest shadow-test07-regexp-groups ()
   "Check regexp group definitions."
   (skip-unless (not (memq system-type '(windows-nt ms-dos))))
-  (skip-unless (file-remote-p shadow-test-remote-temporary-file-directory))
+  (skip-unless (file-remote-p ert-remote-temporary-file-directory))
 
   (let ((shadow-info-file shadow-test-info-file)
        (shadow-todo-file shadow-test-todo-file)
@@ -719,8 +678,7 @@ guaranteed by the originator of a cluster definition."
          (shadow-set-cluster cluster1 primary regexp)
 
          (setq cluster2 "cluster2"
-               primary
-               (file-remote-p shadow-test-remote-temporary-file-directory)
+               primary (file-remote-p ert-remote-temporary-file-directory)
                regexp (format "^\\(%s\\|%s\\)$" shadow-system-name primary))
          (shadow-set-cluster cluster2 primary regexp)
 
@@ -757,8 +715,8 @@ guaranteed by the originator of a cluster definition."
 (ert-deftest shadow-test08-shadow-todo ()
   "Check that needed shadows are added to todo."
   (skip-unless (not (memq system-type '(windows-nt ms-dos))))
-  (skip-unless (file-remote-p shadow-test-remote-temporary-file-directory))
-  (skip-unless (file-writable-p shadow-test-remote-temporary-file-directory))
+  (skip-unless (file-remote-p ert-remote-temporary-file-directory))
+  (skip-unless (file-writable-p ert-remote-temporary-file-directory))
 
   (let ((backup-inhibited t)
         create-lockfiles
@@ -778,7 +736,7 @@ guaranteed by the originator of a cluster definition."
             (message
              "%s %s %s %s %s"
              temporary-file-directory
-             shadow-test-remote-temporary-file-directory
+             ert-remote-temporary-file-directory
              shadow-homedir shadow-info-file shadow-todo-file))
 
           ;; Define clusters.
@@ -792,8 +750,7 @@ guaranteed by the originator of a cluster definition."
              cluster1 primary regexp shadow-clusters))
 
          (setq cluster2 "cluster2"
-               primary
-               (file-remote-p shadow-test-remote-temporary-file-directory)
+               primary (file-remote-p ert-remote-temporary-file-directory)
                regexp (shadow-regexp-superquote primary))
          (shadow-set-cluster cluster2 primary regexp)
           (when shadow-debug
@@ -903,8 +860,8 @@ guaranteed by the originator of a cluster definition."
   "Check that needed shadow files are copied."
   :tags '(:expensive-test)
   (skip-unless (not (memq system-type '(windows-nt ms-dos))))
-  (skip-unless (file-remote-p shadow-test-remote-temporary-file-directory))
-  (skip-unless (file-writable-p shadow-test-remote-temporary-file-directory))
+  (skip-unless (file-remote-p ert-remote-temporary-file-directory))
+  (skip-unless (file-writable-p ert-remote-temporary-file-directory))
 
   (let ((backup-inhibited t)
         create-lockfiles
@@ -928,8 +885,7 @@ guaranteed by the originator of a cluster definition."
          (shadow-set-cluster cluster1 primary regexp)
 
          (setq cluster2 "cluster2"
-               primary
-               (file-remote-p shadow-test-remote-temporary-file-directory)
+               primary (file-remote-p ert-remote-temporary-file-directory)
                regexp (shadow-regexp-superquote primary))
          (shadow-set-cluster cluster2 primary regexp)
 
diff --git a/test/lisp/simple-tests.el b/test/lisp/simple-tests.el
index dcab811bb5..b4576889dc 100644
--- a/test/lisp/simple-tests.el
+++ b/test/lisp/simple-tests.el
@@ -971,5 +971,60 @@ See Bug#21722."
     ;;(should (= (length (delq nil (undo-make-selective-list 5 9))) 0))
     (should (= (length (delq nil (undo-make-selective-list 6 9))) 0))))
 
+(ert-deftest test-yank-in-context ()
+  (should
+   (equal
+    (with-temp-buffer
+      (sh-mode)
+      (insert "echo \"foo\"")
+      (kill-new "\"bar\"")
+      (goto-char 8)
+      (yank-in-context)
+      (buffer-string))
+    "echo \"f\\\"bar\\\"oo\""))
+
+  (should
+   (equal
+    (with-temp-buffer
+      (sh-mode)
+      (insert "echo \"foo\"")
+      (kill-new "'bar'")
+      (goto-char 8)
+      (yank-in-context)
+      (buffer-string))
+    "echo \"f'bar'oo\""))
+
+  (should
+   (equal
+    (with-temp-buffer
+      (sh-mode)
+      (insert "echo 'foo'")
+      (kill-new "'bar'")
+      (goto-char 8)
+      (yank-in-context)
+      (buffer-string))
+    "echo 'f'\\''bar'\\''oo'")))
+
+;;; Tests for `zap-to-char'
+
+(defmacro with-zap-to-char-test (original result &rest body)
+  (declare (indent 2) (debug (stringp stringp body)))
+  `(with-temp-buffer
+     (insert ,original)
+     (goto-char (point-min))
+     ,@body
+     (should (equal (buffer-string) ,result))))
+
+(ert-deftest simple-tests-zap-to-char ()
+  (with-zap-to-char-test "abcde" "de"
+    (zap-to-char 1 ?c))
+  (with-zap-to-char-test "abcde abc123" "123"
+    (zap-to-char 2 ?c))
+  (let ((case-fold-search t))
+    (with-zap-to-char-test "abcdeCXYZ" "deCXYZ"
+      (zap-to-char 1 ?C))
+    (with-zap-to-char-test "abcdeCXYZ" "XYZ"
+      (zap-to-char 1 ?C 'interactive))))
+
 (provide 'simple-test)
 ;;; simple-tests.el ends here
diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el
index 8f3ee66e00..a25eb363b0 100644
--- a/test/lisp/subr-tests.el
+++ b/test/lisp/subr-tests.el
@@ -1058,20 +1058,28 @@ final or penultimate step during initialization."))
   (should (equal (kbd "C-x ( C-d C-x )") ""))
   (should (equal (kbd "C-x ( C-x )") "")))
 
+(defvar subr-test--global)
 (ert-deftest test-local-set-state ()
-  (setq global 1)
+  (setq subr-test--global 1)
   (with-temp-buffer
-    (setq-local local 2)
-    (let ((state (buffer-local-set-state global 10
-                                         local 20
-                                         unexist 30)))
-      (should (= global 10))
-      (should (= local 20))
-      (should (= unexist 30))
+    (setq-local subr-test--local 2)
+    (let ((state (buffer-local-set-state subr-test--global 10
+                                         subr-test--local 20
+                                         subr-test--unexist 30)))
+      (should (= subr-test--global 10))
+      (should (= subr-test--local 20))
+      (should (= subr-test--unexist 30))
       (buffer-local-restore-state state)
-      (should (= global 1))
-      (should (= local 2))
-      (should-not (boundp 'unexist)))))
+      (should (= subr-test--global 1))
+      (should (= subr-test--local 2))
+      (should-not (boundp 'subr-test--unexist)))))
+
+(ert-deftest test-char-uppercase-p ()
+  "Tests for `char-uppercase-p'."
+  (dolist (c (list ?R ?S ?Ω ?Ψ))
+    (should (char-uppercase-p c)))
+  (dolist (c (list ?a ?b ?α ?β))
+    (should-not (char-uppercase-p c))))
 
 (provide 'subr-tests)
 ;;; subr-tests.el ends here
diff --git a/test/lisp/textmodes/css-mode-resources/css-selectors.txt 
b/test/lisp/textmodes/css-mode-resources/css-selectors.txt
new file mode 100644
index 0000000000..5b3d990f27
--- /dev/null
+++ b/test/lisp/textmodes/css-mode-resources/css-selectors.txt
@@ -0,0 +1,56 @@
+#firstname
+*
+p
+p.intro
+div, p
+div p
+div > p
+div + p
+p ~ ul
+[target]
+[target=_blank]
+[title~=flower]
+[lang|=en]
+a[href^="https"]
+a[href$=".pdf"]
+a[href*="w3schools"]
+a:active
+p::after
+p::before
+input:checked
+input:default
+input:disabled
+p:empty
+input:enabled
+p:first-child
+p::first-letter
+p::first-line
+p:first-of-type
+input:focus
+:fullscreen
+a:hover
+input:in-range
+input:indeterminate
+input:invalid
+p:lang(it)
+p:last-child
+p:last-of-type
+a:link
+::marker
+:not(p)
+p:nth-child(2)
+p:nth-last-child(2)
+p:nth-last-of-type(2)
+p:nth-of-type(2)
+p:only-of-type
+p:only-child
+input:optional
+input:out-of-range
+input:read-only
+input:read-write
+input:required
+:root
+::selection
+#news:target
+input:valid
+a:visited
diff --git a/test/lisp/textmodes/css-mode-resources/scss-selectors.txt 
b/test/lisp/textmodes/css-mode-resources/scss-selectors.txt
new file mode 100644
index 0000000000..3e05191a91
--- /dev/null
+++ b/test/lisp/textmodes/css-mode-resources/scss-selectors.txt
@@ -0,0 +1,10 @@
+p.#{$name} var
+p.#{$name}:active var
+p.#{$name}::after var
+f.#{$bar}::after p::after
+p.#{$name} f.#{$bar} k.var #{$bar}  #{$bar}
+p.#{$name}
+&:hover
+> li
++ li
+~ li
diff --git a/test/lisp/textmodes/css-mode-tests.el 
b/test/lisp/textmodes/css-mode-tests.el
index 0ae1593508..a746edf894 100644
--- a/test/lisp/textmodes/css-mode-tests.el
+++ b/test/lisp/textmodes/css-mode-tests.el
@@ -419,5 +419,74 @@
       (indent-region (point-min) (point-max))
       (should (equal (buffer-string) orig)))))
 
+(ert-deftest css-mode-test-selectors ()
+  (let ((selectors
+         (with-temp-buffer
+           (insert-file-contents (ert-resource-file "css-selectors.txt"))
+           (string-lines (buffer-string)))))
+    (with-suppressed-warnings ((interactive-only font-lock-debug-fontify))
+      (dolist (selector selectors)
+        (with-temp-buffer
+          (css-mode)
+          (insert selector " {\n}\n")
+          (font-lock-debug-fontify)
+          (goto-char (point-min))
+          (unless (eq (get-text-property (point) 'face)
+                      'css-selector)
+            (should-not (format "Didn't recognize %s as a selector"
+                                (buffer-substring-no-properties
+                                 (point) (line-end-position)))))))
+      ;; Test many selectors.
+      (dolist (selector selectors)
+        (with-temp-buffer
+          (css-mode)
+          (insert selector " ")
+          (dotimes (_ (random 5))
+            (insert (seq-random-elt '(" , " " > " " + "))
+                    (seq-random-elt selectors)))
+          (insert "{\n}\n")
+          (font-lock-debug-fontify)
+          (goto-char (point-min))
+          (unless (eq (get-text-property (point) 'face)
+                      'css-selector)
+            (should-not (format "Didn't recognize %s as a selector"
+                                (buffer-substring-no-properties
+                                 (point) (line-end-position)))))))
+      ;; Test wrong separators.
+      (dolist (selector selectors)
+        (with-temp-buffer
+          (css-mode)
+          (insert selector " ")
+          (dotimes (_ (1+ (random 5)))
+            (insert (seq-random-elt '("=" " @ "))
+                    (seq-random-elt selectors)))
+          (insert "{\n}\n")
+          (font-lock-debug-fontify)
+          (goto-char (point-min))
+          (when (eq (get-text-property (point) 'face)
+                    'css-selector)
+            (should-not (format "Recognized %s as a selector"
+                                (buffer-substring-no-properties
+                                 (point) (line-end-position))))))))))
+
+(ert-deftest scss-mode-test-selectors ()
+  (let ((selectors
+         (with-temp-buffer
+           (insert-file-contents (ert-resource-file "scss-selectors.txt"))
+           (string-lines (buffer-string)))))
+    (with-suppressed-warnings ((interactive-only font-lock-debug-fontify))
+      (dolist (selector selectors)
+        (with-temp-buffer
+          (scss-mode)
+          (insert selector " {\n}\n")
+          (font-lock-debug-fontify)
+          (goto-char (point-min))
+          (unless (eq (get-text-property (point) 'face)
+                      'css-selector)
+            (should-not (format "Didn't recognize %s as a selector"
+                                (buffer-substring-no-properties
+                                 (point) (line-end-position))))))))))
+
+
 (provide 'css-mode-tests)
 ;;; css-mode-tests.el ends here
diff --git a/test/lisp/vc/vc-bzr-tests.el b/test/lisp/vc/vc-bzr-tests.el
index 12f1e9034c..52f06df5bc 100644
--- a/test/lisp/vc/vc-bzr-tests.el
+++ b/test/lisp/vc/vc-bzr-tests.el
@@ -140,7 +140,7 @@
       ;; causes bzr status to fail.  This simulates a broken bzr
       ;; installation.
       (delete-file ".bzr/checkout/dirstate")
-      (should (progn (make-directory-autoloads
+      (should (progn (loaddefs-generate
                       default-directory
                       (expand-file-name "loaddefs.el" bzrdir))
                      t)))))
diff --git a/test/lisp/x-dnd-tests.el b/test/lisp/x-dnd-tests.el
new file mode 100644
index 0000000000..35cda3b10a
--- /dev/null
+++ b/test/lisp/x-dnd-tests.el
@@ -0,0 +1,82 @@
+;;; dnd-tests.el --- Tests for X DND support -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Tests for stuff in x-dnd.el that doesn't require a window system.
+
+;;; Code:
+
+(require 'x-dnd)
+
+(when (display-graphic-p)
+  (error "This test cannot be run under X"))
+
+;; Dummy replacements.
+
+(defconst x-dnd-tests-drag-window-xid 3948573
+  "XID of the drag window returned during the test.")
+
+(defconst x-dnd-tests-targets-table
+  (base64-decode-string
+   
"bAArAKIBAAAGAB8AAABqAQAANgIAAJMCAAAFAwAABgMAAAEAkMJbAAEAINNbAAUAHwAAAGoBAAA2
+AgAAkwIAANkfAAALAB8AAABqAQAANgIAAJMCAADyAgAA2R8AANwfAADgHwAA4R8AAOIfAADjHwAA
+AQDQMAgCAQBQTggCAQCwe5IAAQDQmZIABgDyAgAA9wIAABcRAADgHwAAvSEAAI3AAAABAHC52AAB
+AGDY2AABAABq3QABAGBw3QAIAB8AAAA2AgAA8gIAANwfAADgHwAA4R8AAOIfAADjHwAAAQBwBOEA
+AQCACuEAAQAwLwUCAQDwPgUCAQBQxoQBAQCQ3YQBAQCQBYoBAQDACYoBAQCgMooBAQCgOIoBAQAf
+AAAAAQDATrcDAQAQ1LcDAQCw/sADAQAgBcEDAQBQt7oDAQAAUsIDAQCAc7wDAQAwerwDAQBAIKUE
+AQAALKUEAQDwfKUEAQDgg6UEAQCgjesEAQAAmusEAQCA7+sEAQCw9usECAAfAAAAagEAADYCAACT
+AgAABQMAAAYDAAATGwAAGhsAAA==")
+  "Predefined Motif targets table used to test the targets table parser.")
+
+(defconst x-dnd-tests-lispy-targets-table [[31 362 566 659 773 774] [6013584] 
[6017824]
+                                           [31 362 566 659 8153]
+                                           [31 362 566 659 754 8153 8156 8160 
8161 8162 8163]
+                                           [34091216] [34098768] [9599920]
+                                           [9607632] [754 759 4375 8160 8637 
49293]
+                                           [14203248] [14211168] [14510592]
+                                           [14512224] [31 566 754 8156 8160 
8161 8162 8163]
+                                           [14746736] [14748288] [33894192] 
[33898224]
+                                           [25478736] [25484688] [25822608] 
[25823680]
+                                           [25834144] [25835680] [31] 
[62344896] [62379024]
+                                           [62979760] [62981408] [62568272] 
[63066624]
+                                           [62681984] [62683696] [77930560] 
[77933568]
+                                           [77954288] [77956064] [82546080] 
[82549248]
+                                           [82571136] [82572976] [31 362 566 
659 773 774 6931 6938]]
+  "The expected result of parsing that targets table.")
+
+(defalias 'x-window-property
+  (lambda (prop &optional _frame type window-id _delete-p _vector-ret-p)
+    (cond
+     ((and (equal prop "_MOTIF_DRAG_WINDOW")
+           (zerop window-id) (equal type "WINDOW"))
+      x-dnd-tests-drag-window-xid)
+     ((and (equal prop "_MOTIF_DRAG_TARGETS")
+           (equal type "_MOTIF_DRAG_TARGETS")
+           (equal window-id x-dnd-tests-drag-window-xid))
+      x-dnd-tests-targets-table))))
+
+;; This test also serves to exercise most of the Motif value
+;; extraction code.
+(ert-deftest x-dnd-tests-read-xm-targets-table ()
+  (should (equal (x-dnd-xm-read-targets-table nil)
+                 x-dnd-tests-lispy-targets-table)))
+
+(provide 'x-dnd-tests)
+;;; x-dnd-tests.el ends here
diff --git a/test/manual/etags/ETAGS.good_1 b/test/manual/etags/ETAGS.good_1
index 1b4f80ceaa..c3d1477d44 100644
--- a/test/manual/etags/ETAGS.good_1
+++ b/test/manual/etags/ETAGS.good_1
@@ -915,277 +915,277 @@ record_auto_save 742,23849
 force_auto_save_soon 751,24017
 DEFUN ("recursive-edit", Frecursive_edit,759,24138
 DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24138
-recursive_edit_unwind 804,25748
-any_kboard_state 817,26014
-single_kboard_state 838,26666
-not_single_kboard_state 848,26804
-struct kboard_stack858,27066
-static struct kboard_stack *kboard_stack;kboard_stack864,27139
-push_kboard 867,27187
-pop_kboard 879,27376
-temporarily_switch_to_single_kboard 914,28264
-record_single_kboard_state 943,29438
-restore_kboard_configuration 952,29622
-cmd_error 970,30078
-cmd_error_internal 1024,31511
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32031
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32031
-command_loop 1094,33917
-command_loop_2 1134,35136
-top_level_2 1146,35340
-top_level_1 1152,35418
-DEFUN ("top-level", Ftop_level,1164,35788
-DEFUN ("top-level", Ftop_level,top-level1164,35788
-user_error 1183,36289
-DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36430
-DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36430
-DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36820
-DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36820
-tracking_off 1216,37282
-DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37817
-DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37817
-bool ignore_mouse_drag_p;1256,38393
-some_mouse_moved 1259,38442
-Lisp_Object last_undo_boundary;1287,39033
-command_loop_1 1294,39274
-read_menu_command 1649,50890
-adjust_point_for_property 1678,51618
-safe_run_hooks_1 1831,57340
-safe_run_hooks_error 1841,57570
-safe_run_hook_funcall 1878,58577
-safe_run_hooks 1893,59059
-int poll_suppress_count;1908,59398
-static struct atimer *poll_timer;poll_timer1915,59488
-poll_for_input_1 1919,59590
-poll_for_input 1930,59790
-start_polling 1942,60054
-input_polling_used 1979,61092
-stop_polling 1994,61391
-set_poll_suppress_count 2009,61760
-bind_polling_period 2029,62142
-make_ctrl_char 2048,62493
-show_help_echo 2113,64456
-static Lisp_Object help_form_saved_window_configs;2156,65639
-read_char_help_form_unwind 2158,65702
-#define STOP_POLLING   2166,65960
-#define RESUME_POLLING 2170,66085
-read_event_from_main_queue 2175,66230
-read_decoded_event_from_main_queue 2249,68418
-#define MAX_ENCODED_BYTES 2254,68665
-echo_keystrokes_p 2342,71557
-read_char 2376,72849
-record_menu_key 3225,98950
-help_char_p 3258,99675
-record_char 3273,99954
-save_getcjmp 3412,104236
-restore_getcjmp 3418,104327
-readable_events 3430,104698
-int stop_character EXTERNALLY_VISIBLE;3497,106438
-event_to_kboard 3500,106494
-kbd_buffer_nr_stored 3522,107143
-kbd_buffer_store_event 3534,107484
-kbd_buffer_store_event_hold 3550,108026
-kbd_buffer_unget_event 3684,111618
-#define INPUT_EVENT_POS_MAX 3698,112019
-#define INPUT_EVENT_POS_MIN 3701,112148
-position_to_Time 3706,112288
-Time_to_position 3716,112515
-gen_help_event 3738,113172
-kbd_buffer_store_help_event 3756,113612
-discard_mouse_events 3773,113977
-kbd_buffer_events_waiting 3803,114712
-clear_event 3823,115069
-kbd_buffer_get_event 3836,115409
-process_special_events 4258,127882
-swallow_events 4322,129706
-timer_start_idle 4339,130099
-timer_stop_idle 4355,130577
-timer_resume_idle 4363,130721
-struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130913
-Lisp_Object pending_funcalls;4377,131173
-decode_timer 4381,131294
-timer_check_2 4414,132247
-timer_check 4572,136818
-DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137663
-DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137663
-static Lisp_Object accent_key_syms;4625,138240
-static Lisp_Object func_key_syms;4626,138276
-static Lisp_Object mouse_syms;4627,138310
-static Lisp_Object wheel_syms;4628,138341
-static Lisp_Object drag_n_drop_syms;4629,138372
-static const int lispy_accent_codes[lispy_accent_codes4634,138517
-static const char *const lispy_accent_keys[lispy_accent_keys4741,139879
-#define FUNCTION_KEY_OFFSET 4766,140315
-const char *const lispy_function_keys[lispy_function_keys4768,140348
-static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148902
-static const char *const lispy_kana_keys[lispy_kana_keys5026,150136
-#define FUNCTION_KEY_OFFSET 5061,151752
-static const char *const lispy_function_keys[lispy_function_keys5065,151895
-#define ISO_FUNCTION_KEY_OFFSET 5149,154430
-static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154470
-static Lisp_Object Vlispy_mouse_stem;5172,155329
-static const char *const lispy_wheel_names[lispy_wheel_names5174,155368
-static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155620
-static short const scroll_bar_parts[scroll_bar_parts5189,155886
-static Lisp_Object button_down_location;5210,156911
-static int last_mouse_button;5215,157066
-static int last_mouse_x;5216,157096
-static int last_mouse_y;5217,157121
-static Time button_down_time;5218,157146
-static int double_click_count;5222,157230
-make_lispy_position 5228,157391
-toolkit_menubar_in_use 5456,163954
-make_scroll_bar_position 5469,164322
-make_lispy_event 5485,164968
-make_lispy_movement 6104,183531
-make_lispy_switch_frame 6131,184262
-make_lispy_focus_in 6137,184369
-make_lispy_focus_out 6145,184495
-parse_modifiers_uncached 6163,184945
-#define SINGLE_LETTER_MOD(6185,185465
-#undef SINGLE_LETTER_MOD6212,185906
-#define MULTI_LETTER_MOD(6214,185932
-#undef MULTI_LETTER_MOD6231,186400
-apply_modifiers_uncached 6273,187574
-static const char *const modifier_names[modifier_names6319,189193
-#define NUM_MOD_NAMES 6325,189399
-static Lisp_Object modifier_symbols;6327,189449
-lispy_modifier_list 6331,189586
-#define KEY_TO_CHAR(6353,190252
-parse_modifiers 6356,190328
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
-apply_modifiers 6422,192391
-reorder_modifiers 6491,194720
-modify_event_symbol 6536,196528
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
-parse_solitary_modifier 6695,201135
-#define SINGLE_LETTER_MOD(6701,201258
-#define MULTI_LETTER_MOD(6705,201343
-#undef SINGLE_LETTER_MOD6763,202641
-#undef MULTI_LETTER_MOD6764,202666
-lucid_event_type_list_p 6775,202889
-get_input_pending 6814,203960
-record_asynch_buffer_change 6834,204579
-gobble_input 6872,205702
-tty_read_avail_input 6967,208310
-handle_async_input 7149,214039
-process_pending_signals 7165,214359
-unblock_input_to 7177,214645
-unblock_input 7200,215277
-totally_unblock_input 7209,215445
-handle_input_available_signal 7217,215529
-deliver_input_available_signal 7226,215700
-struct user_signal_info7235,215865
-static struct user_signal_info *user_signals user_signals7250,216090
-add_user_signal 7253,216149
-handle_user_signal 7275,216598
-deliver_user_signal 7316,217558
-find_user_signal_name 7322,217659
-store_user_signal_events 7334,217841
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
-static Lisp_Object menu_bar_items_vector;7368,218630
-static int menu_bar_items_index;7369,218672
-static const char *separator_names[separator_names7372,218707
-menu_separator_name_p 7393,219148
-menu_bar_items 7426,219852
-Lisp_Object item_properties;7568,224603
-menu_bar_item 7571,224645
-menu_item_eval_property_1 7647,227175
-eval_dyn 7658,227465
-menu_item_eval_property 7666,227675
-parse_menu_item 7686,228341
-static Lisp_Object tool_bar_items_vector;7965,236336
-static Lisp_Object tool_bar_item_properties;7970,236510
-static int ntool_bar_items;7974,236606
-tool_bar_items 7990,237083
-process_tool_bar_item 8075,239892
-#define PROP(8112,240969
-set_prop 8114,241038
-parse_tool_bar_item 8167,242453
-#undef PROP8379,248844
-init_tool_bar_items 8387,248969
-append_tool_bar_item 8401,249261
-read_char_x_menu_prompt 8443,250771
-read_char_minibuf_menu_prompt 8503,252445
-#define PUSH_C_STR(8527,253014
-follow_key 8726,258553
-active_maps 8733,258695
-typedef struct keyremap8742,259021
-} keyremap;8754,259464
-access_keymap_keyremap 8764,259808
-keyremap_step 8811,261450
-test_undefined 8867,262934
-read_key_sequence 8916,264861
-read_key_sequence_vs 9826,295821
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
-detect_input_pending 9950,300488
-detect_input_pending_ignore_squeezables 9959,300654
-detect_input_pending_run_timers 9967,300870
-clear_input_pending 9985,301362
-requeued_events_pending_p 9997,301732
-DEFUN ("input-pending-p", Finput_pending_p,10002,301813
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
-DEFUN ("recent-keys", Frecent_keys,10024,302596
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
-DEFUN ("recursion-depth", Frecursion_depth,10158,307069
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
-DEFUN ("discard-input", Fdiscard_input,10203,308447
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
-stuff_buffered_input 10285,311045
-set_waiting_for_input 10323,312016
-clear_waiting_for_input 10337,312390
-handle_interrupt_signal 10351,312754
-deliver_interrupt_signal 10378,313642
-static int volatile force_quit_count;10387,313932
-handle_interrupt 10401,314414
-quit_throw_to_read_char 10541,318711
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
-DEFUN ("set-quit-char", Fset_quit_char,10694,322706
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
-DEFUN ("set-input-mode", Fset_input_mode,10729,323570
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
-DEFUN ("posn-at-point", Fposn_at_point,10824,327060
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
-init_kboard 10861,328214
-allocate_kboard 10893,329284
-wipe_kboard 10909,329637
-delete_kboard 10917,329751
-init_keyboard 10942,330281
-struct event_head11021,332696
-static const struct event_head head_table[head_table11027,332747
-syms_of_keyboard 11045,333577
-keys_of_keyboard 11841,367115
-mark_kboards 11916,370434
+recursive_edit_unwind 804,25751
+any_kboard_state 817,26017
+single_kboard_state 838,26669
+not_single_kboard_state 848,26807
+struct kboard_stack858,27069
+static struct kboard_stack *kboard_stack;kboard_stack864,27142
+push_kboard 867,27190
+pop_kboard 879,27379
+temporarily_switch_to_single_kboard 914,28267
+record_single_kboard_state 943,29441
+restore_kboard_configuration 952,29625
+cmd_error 970,30081
+cmd_error_internal 1024,31514
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32034
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32034
+command_loop 1094,33920
+command_loop_2 1134,35139
+top_level_2 1146,35343
+top_level_1 1152,35421
+DEFUN ("top-level", Ftop_level,1164,35791
+DEFUN ("top-level", Ftop_level,top-level1164,35791
+user_error 1183,36292
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36433
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36433
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36823
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36823
+tracking_off 1216,37285
+DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37820
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37820
+bool ignore_mouse_drag_p;1256,38396
+some_mouse_moved 1259,38445
+Lisp_Object last_undo_boundary;1287,39036
+command_loop_1 1294,39277
+read_menu_command 1649,50893
+adjust_point_for_property 1678,51621
+safe_run_hooks_1 1831,57343
+safe_run_hooks_error 1841,57573
+safe_run_hook_funcall 1878,58580
+safe_run_hooks 1893,59062
+int poll_suppress_count;1908,59401
+static struct atimer *poll_timer;poll_timer1915,59491
+poll_for_input_1 1919,59593
+poll_for_input 1930,59793
+start_polling 1942,60057
+input_polling_used 1979,61095
+stop_polling 1994,61394
+set_poll_suppress_count 2009,61763
+bind_polling_period 2029,62145
+make_ctrl_char 2048,62496
+show_help_echo 2113,64459
+static Lisp_Object help_form_saved_window_configs;2156,65642
+read_char_help_form_unwind 2158,65705
+#define STOP_POLLING   2166,65963
+#define RESUME_POLLING 2170,66088
+read_event_from_main_queue 2175,66233
+read_decoded_event_from_main_queue 2249,68421
+#define MAX_ENCODED_BYTES 2254,68668
+echo_keystrokes_p 2342,71560
+read_char 2376,72852
+record_menu_key 3225,98953
+help_char_p 3258,99678
+record_char 3273,99957
+save_getcjmp 3412,104239
+restore_getcjmp 3418,104330
+readable_events 3430,104701
+int stop_character EXTERNALLY_VISIBLE;3497,106441
+event_to_kboard 3500,106497
+kbd_buffer_nr_stored 3522,107146
+kbd_buffer_store_event 3534,107487
+kbd_buffer_store_event_hold 3550,108029
+kbd_buffer_unget_event 3684,111621
+#define INPUT_EVENT_POS_MAX 3698,112022
+#define INPUT_EVENT_POS_MIN 3701,112151
+position_to_Time 3706,112291
+Time_to_position 3716,112518
+gen_help_event 3738,113175
+kbd_buffer_store_help_event 3756,113615
+discard_mouse_events 3773,113980
+kbd_buffer_events_waiting 3803,114715
+clear_event 3823,115072
+kbd_buffer_get_event 3836,115412
+process_special_events 4258,127885
+swallow_events 4322,129709
+timer_start_idle 4339,130102
+timer_stop_idle 4355,130580
+timer_resume_idle 4363,130724
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130916
+Lisp_Object pending_funcalls;4377,131176
+decode_timer 4381,131297
+timer_check_2 4414,132250
+timer_check 4572,136821
+DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137666
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137666
+static Lisp_Object accent_key_syms;4625,138243
+static Lisp_Object func_key_syms;4626,138279
+static Lisp_Object mouse_syms;4627,138313
+static Lisp_Object wheel_syms;4628,138344
+static Lisp_Object drag_n_drop_syms;4629,138375
+static const int lispy_accent_codes[lispy_accent_codes4634,138520
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139882
+#define FUNCTION_KEY_OFFSET 4766,140318
+const char *const lispy_function_keys[lispy_function_keys4768,140351
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148905
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150139
+#define FUNCTION_KEY_OFFSET 5061,151755
+static const char *const lispy_function_keys[lispy_function_keys5065,151898
+#define ISO_FUNCTION_KEY_OFFSET 5149,154433
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154473
+static Lisp_Object Vlispy_mouse_stem;5172,155332
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155371
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155623
+static short const scroll_bar_parts[scroll_bar_parts5189,155889
+static Lisp_Object button_down_location;5210,156914
+static int last_mouse_button;5215,157069
+static int last_mouse_x;5216,157099
+static int last_mouse_y;5217,157124
+static Time button_down_time;5218,157149
+static int double_click_count;5222,157233
+make_lispy_position 5228,157394
+toolkit_menubar_in_use 5456,163957
+make_scroll_bar_position 5469,164325
+make_lispy_event 5485,164971
+make_lispy_movement 6104,183534
+make_lispy_switch_frame 6131,184265
+make_lispy_focus_in 6137,184372
+make_lispy_focus_out 6145,184498
+parse_modifiers_uncached 6163,184948
+#define SINGLE_LETTER_MOD(6185,185468
+#undef SINGLE_LETTER_MOD6212,185909
+#define MULTI_LETTER_MOD(6214,185935
+#undef MULTI_LETTER_MOD6231,186403
+apply_modifiers_uncached 6273,187577
+static const char *const modifier_names[modifier_names6319,189196
+#define NUM_MOD_NAMES 6325,189402
+static Lisp_Object modifier_symbols;6327,189452
+lispy_modifier_list 6331,189589
+#define KEY_TO_CHAR(6353,190255
+parse_modifiers 6356,190331
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191520
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191520
+apply_modifiers 6422,192394
+reorder_modifiers 6491,194723
+modify_event_symbol 6536,196531
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199247
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199247
+parse_solitary_modifier 6695,201138
+#define SINGLE_LETTER_MOD(6701,201261
+#define MULTI_LETTER_MOD(6705,201346
+#undef SINGLE_LETTER_MOD6763,202644
+#undef MULTI_LETTER_MOD6764,202669
+lucid_event_type_list_p 6775,202892
+get_input_pending 6814,203963
+record_asynch_buffer_change 6834,204582
+gobble_input 6872,205705
+tty_read_avail_input 6967,208313
+handle_async_input 7149,214042
+process_pending_signals 7165,214362
+unblock_input_to 7177,214648
+unblock_input 7200,215280
+totally_unblock_input 7209,215448
+handle_input_available_signal 7217,215532
+deliver_input_available_signal 7226,215703
+struct user_signal_info7235,215868
+static struct user_signal_info *user_signals user_signals7250,216093
+add_user_signal 7253,216152
+handle_user_signal 7275,216601
+deliver_user_signal 7316,217561
+find_user_signal_name 7322,217662
+store_user_signal_events 7334,217844
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218419
+static Lisp_Object menu_bar_items_vector;7368,218633
+static int menu_bar_items_index;7369,218675
+static const char *separator_names[separator_names7372,218710
+menu_separator_name_p 7393,219151
+menu_bar_items 7426,219855
+Lisp_Object item_properties;7568,224606
+menu_bar_item 7571,224648
+menu_item_eval_property_1 7647,227178
+eval_dyn 7658,227468
+menu_item_eval_property 7666,227678
+parse_menu_item 7686,228344
+static Lisp_Object tool_bar_items_vector;7965,236339
+static Lisp_Object tool_bar_item_properties;7970,236513
+static int ntool_bar_items;7974,236609
+tool_bar_items 7990,237086
+process_tool_bar_item 8075,239895
+#define PROP(8112,240972
+set_prop 8114,241041
+parse_tool_bar_item 8167,242456
+#undef PROP8379,248847
+init_tool_bar_items 8387,248972
+append_tool_bar_item 8401,249264
+read_char_x_menu_prompt 8443,250774
+read_char_minibuf_menu_prompt 8503,252448
+#define PUSH_C_STR(8527,253017
+follow_key 8726,258556
+active_maps 8733,258698
+typedef struct keyremap8742,259024
+} keyremap;8754,259467
+access_keymap_keyremap 8764,259811
+keyremap_step 8811,261453
+test_undefined 8867,262937
+read_key_sequence 8916,264864
+read_key_sequence_vs 9826,295824
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297297
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297297
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299985
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299985
+detect_input_pending 9950,300491
+detect_input_pending_ignore_squeezables 9959,300657
+detect_input_pending_run_timers 9967,300873
+clear_input_pending 9985,301365
+requeued_events_pending_p 9997,301735
+DEFUN ("input-pending-p", Finput_pending_p,10002,301816
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301816
+DEFUN ("recent-keys", Frecent_keys,10024,302599
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302599
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303520
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303520
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303961
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303961
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304383
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304383
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304958
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304958
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305498
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305498
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306513
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306513
+DEFUN ("recursion-depth", Frecursion_depth,10158,307072
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307072
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307409
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307409
+DEFUN ("discard-input", Fdiscard_input,10203,308450
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308450
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308952
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308952
+stuff_buffered_input 10285,311048
+set_waiting_for_input 10323,312019
+clear_waiting_for_input 10337,312393
+handle_interrupt_signal 10351,312757
+deliver_interrupt_signal 10378,313645
+static int volatile force_quit_count;10387,313935
+handle_interrupt 10401,314417
+quit_throw_to_read_char 10541,318714
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319291
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319291
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320519
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320519
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321435
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321435
+DEFUN ("set-quit-char", Fset_quit_char,10694,322709
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322709
+DEFUN ("set-input-mode", Fset_input_mode,10729,323573
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323573
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324462
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324462
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325840
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325840
+DEFUN ("posn-at-point", Fposn_at_point,10824,327063
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327063
+init_kboard 10861,328217
+allocate_kboard 10893,329287
+wipe_kboard 10909,329640
+delete_kboard 10917,329754
+init_keyboard 10942,330284
+struct event_head11021,332699
+static const struct event_head head_table[head_table11027,332750
+syms_of_keyboard 11045,333580
+keys_of_keyboard 11841,367118
+mark_kboards 11916,370437
 
 c-src/emacs/src/lisp.h,20276
 #define EMACS_LISP_H22,801
@@ -2166,109 +2166,109 @@ el-src/emacs/lisp/progmodes/etags.el,5069
 (defcustom tags-tag-face 148,5700
 (defcustom tags-apropos-verbose 154,5835
 (defcustom tags-apropos-additional-actions 160,5999
-(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6918
-(defvar default-tags-table-function 189,7098
-(defvar tags-location-ring 194,7324
-(defvar tags-table-files 201,7600
-(defvar tags-completion-table 206,7767
-(defvar tags-included-tables 209,7859
-(defvar next-file-list 212,7954
-(defvar tags-table-format-functions 217,8060
-(defvar file-of-tag-function 224,8441
-(defvar tags-table-files-function 228,8635
-(defvar tags-completion-table-function 230,8746
-(defvar snarf-tag-function 232,8841
-(defvar goto-tag-location-function 236,9050
-(defvar find-tag-regexp-search-function 239,9223
-(defvar find-tag-regexp-tag-order 241,9344
-(defvar find-tag-regexp-next-line-after-failure-p 243,9453
-(defvar find-tag-search-function 245,9573
-(defvar find-tag-tag-order 247,9680
-(defvar find-tag-next-line-after-failure-p 249,9775
-(defvar list-tags-function 251,9881
-(defvar tags-apropos-function 253,9969
-(defvar tags-included-tables-function 255,10063
-(defvar verify-tags-table-function 257,10182
-(defun initialize-new-tags-table 260,10293
-(defun tags-table-mode 276,10981
-(defun visit-tags-table 285,11246
-(defun tags-table-check-computed-list 321,12784
-(defun tags-table-extend-computed-list 360,14655
-(defun tags-expand-table-name 400,16368
-(defun tags-table-list-member 409,16711
-(defun tags-verify-table 421,17183
-(defun tags-table-including 470,19303
-(defun tags-next-table 522,21347
-(defun visit-tags-table-buffer 543,22204
-(defun tags-reset-tags-tables 712,28514
-(defun file-of-tag 731,29171
-(defun tags-table-files 740,29521
-(defun tags-included-tables 749,29871
-(defun tags-completion-table 755,30117
-(defun tags-lazy-completion-table 783,31311
-(defun tags-completion-at-point-function 799,31946
-(defun find-tag-tag 818,32696
-(defvar last-tag 837,33369
-(defun find-tag-interactive 840,33428
-(defvar find-tag-history 852,33843
-(defun find-tag-noselect 860,34013
-(defun find-tag 932,37127
-(defun find-tag-other-window 959,38343
-(defun find-tag-other-frame 1000,40271
-(defun find-tag-regexp 1025,41445
-(defalias 'pop-tag-mark pop-tag-mark1049,42607
-(defvar tag-lines-already-matched 1052,42658
-(defun find-tag-in-order 1055,42765
-(defun tag-find-file-of-tag-noselect 1167,47111
-(defun tag-find-file-of-tag 1200,48957
-(defun etags-recognize-tags-table 1208,49183
-(defun etags-verify-tags-table 1241,50814
-(defun etags-file-of-tag 1246,51012
-(defun etags-tags-completion-table 1256,51347
-(defun etags-snarf-tag 1286,52553
-(defun etags-goto-tag-location 1324,54122
-(defun etags-list-tags 1388,56565
-(defmacro tags-with-face 1423,57840
-(defun etags-tags-apropos-additional 1431,58173
-(defun etags-tags-apropos 1465,59410
-(defun etags-tags-table-files 1527,61619
-(defun etags-tags-included-tables 1542,62055
-(defun tags-recognize-empty-tags-table 1559,62595
-(defun tag-exact-file-name-match-p 1587,63741
-(defun tag-file-name-match-p 1596,64134
-(defun tag-exact-match-p 1609,64690
-(defun tag-implicit-name-match-p 1620,65258
-(defun tag-symbol-match-p 1633,65858
-(defun tag-word-match-p 1643,66294
-(defun tag-partial-file-name-match-p 1652,66692
-(defun tag-any-match-p 1662,67136
-(defun tag-re-match-p 1667,67320
-(defcustom tags-loop-revert-buffers 1675,67569
-(defun next-file 1685,67978
-(defvar tags-loop-operate 1760,70892
-(defvar tags-loop-scan1763,70986
-(defun tags-loop-eval 1771,71315
-(defun tags-loop-continue 1782,71644
-(defun tags-search 1850,73950
-(defun tags-query-replace 1871,74776
-(defun tags-complete-tags-table-file 1896,76000
-(defun list-tags 1906,76379
-(defun tags-apropos 1934,77332
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78158
-(defun select-tags-table 1964,78397
-(defvar select-tags-table-mode-map 2019,80524
-(define-derived-mode select-tags-table-mode 2030,80907
-(defun select-tags-table-select 2034,81091
-(defun select-tags-table-quit 2043,81457
-(defun complete-tag 2049,81612
-(defconst etags--xref-limit 2074,82553
-(defvar etags-xref-find-definitions-tag-order 2076,82588
-(defun etags-xref-find 2082,82878
-(defun etags--xref-find-definitions 2096,83407
-(defclass xref-etags-location 2129,85121
-(defun xref-make-etags-location 2135,85344
-(cl-defmethod xref-location-marker 2139,85499
-(cl-defmethod xref-location-line 2146,85743
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6921
+(defvar default-tags-table-function 189,7101
+(defvar tags-location-ring 194,7327
+(defvar tags-table-files 201,7603
+(defvar tags-completion-table 206,7770
+(defvar tags-included-tables 209,7862
+(defvar next-file-list 212,7957
+(defvar tags-table-format-functions 217,8063
+(defvar file-of-tag-function 224,8444
+(defvar tags-table-files-function 228,8638
+(defvar tags-completion-table-function 230,8749
+(defvar snarf-tag-function 232,8844
+(defvar goto-tag-location-function 236,9053
+(defvar find-tag-regexp-search-function 239,9226
+(defvar find-tag-regexp-tag-order 241,9347
+(defvar find-tag-regexp-next-line-after-failure-p 243,9456
+(defvar find-tag-search-function 245,9576
+(defvar find-tag-tag-order 247,9683
+(defvar find-tag-next-line-after-failure-p 249,9778
+(defvar list-tags-function 251,9884
+(defvar tags-apropos-function 253,9972
+(defvar tags-included-tables-function 255,10066
+(defvar verify-tags-table-function 257,10185
+(defun initialize-new-tags-table 260,10296
+(defun tags-table-mode 276,10984
+(defun visit-tags-table 285,11249
+(defun tags-table-check-computed-list 321,12787
+(defun tags-table-extend-computed-list 360,14658
+(defun tags-expand-table-name 400,16371
+(defun tags-table-list-member 409,16714
+(defun tags-verify-table 421,17186
+(defun tags-table-including 470,19306
+(defun tags-next-table 522,21350
+(defun visit-tags-table-buffer 543,22207
+(defun tags-reset-tags-tables 712,28517
+(defun file-of-tag 731,29174
+(defun tags-table-files 740,29524
+(defun tags-included-tables 749,29874
+(defun tags-completion-table 755,30120
+(defun tags-lazy-completion-table 783,31314
+(defun tags-completion-at-point-function 799,31949
+(defun find-tag-tag 818,32699
+(defvar last-tag 837,33372
+(defun find-tag-interactive 840,33431
+(defvar find-tag-history 852,33846
+(defun find-tag-noselect 860,34016
+(defun find-tag 932,37130
+(defun find-tag-other-window 959,38346
+(defun find-tag-other-frame 1000,40274
+(defun find-tag-regexp 1025,41448
+(defalias 'pop-tag-mark pop-tag-mark1049,42610
+(defvar tag-lines-already-matched 1052,42661
+(defun find-tag-in-order 1055,42768
+(defun tag-find-file-of-tag-noselect 1167,47114
+(defun tag-find-file-of-tag 1200,48960
+(defun etags-recognize-tags-table 1208,49186
+(defun etags-verify-tags-table 1241,50817
+(defun etags-file-of-tag 1246,51015
+(defun etags-tags-completion-table 1256,51350
+(defun etags-snarf-tag 1286,52556
+(defun etags-goto-tag-location 1324,54125
+(defun etags-list-tags 1388,56568
+(defmacro tags-with-face 1423,57843
+(defun etags-tags-apropos-additional 1431,58176
+(defun etags-tags-apropos 1465,59413
+(defun etags-tags-table-files 1527,61622
+(defun etags-tags-included-tables 1542,62058
+(defun tags-recognize-empty-tags-table 1559,62598
+(defun tag-exact-file-name-match-p 1587,63744
+(defun tag-file-name-match-p 1596,64137
+(defun tag-exact-match-p 1609,64693
+(defun tag-implicit-name-match-p 1620,65261
+(defun tag-symbol-match-p 1633,65861
+(defun tag-word-match-p 1643,66297
+(defun tag-partial-file-name-match-p 1652,66695
+(defun tag-any-match-p 1662,67139
+(defun tag-re-match-p 1667,67323
+(defcustom tags-loop-revert-buffers 1675,67572
+(defun next-file 1685,67981
+(defvar tags-loop-operate 1760,70895
+(defvar tags-loop-scan1763,70989
+(defun tags-loop-eval 1771,71318
+(defun tags-loop-continue 1782,71647
+(defun tags-search 1850,73953
+(defun tags-query-replace 1871,74779
+(defun tags-complete-tags-table-file 1896,76003
+(defun list-tags 1906,76382
+(defun tags-apropos 1934,77335
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78161
+(defun select-tags-table 1964,78400
+(defvar select-tags-table-mode-map 2019,80527
+(define-derived-mode select-tags-table-mode 2030,80910
+(defun select-tags-table-select 2034,81094
+(defun select-tags-table-quit 2043,81460
+(defun complete-tag 2049,81615
+(defconst etags--xref-limit 2074,82556
+(defvar etags-xref-find-definitions-tag-order 2076,82591
+(defun etags-xref-find 2082,82881
+(defun etags--xref-find-definitions 2096,83410
+(defclass xref-etags-location 2129,85124
+(defun xref-make-etags-location 2135,85347
+(cl-defmethod xref-location-marker 2139,85502
+(cl-defmethod xref-location-line 2146,85746
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
diff --git a/test/manual/etags/ETAGS.good_2 b/test/manual/etags/ETAGS.good_2
index 124aa7fc1c..3c611dc8ef 100644
--- a/test/manual/etags/ETAGS.good_2
+++ b/test/manual/etags/ETAGS.good_2
@@ -1098,288 +1098,288 @@ record_auto_save 742,23849
 force_auto_save_soon 751,24017
 DEFUN ("recursive-edit", Frecursive_edit,759,24138
 DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24138
-recursive_edit_unwind 804,25748
-any_kboard_state 817,26014
-single_kboard_state 838,26666
-not_single_kboard_state 848,26804
-struct kboard_stack858,27066
-static struct kboard_stack *kboard_stack;kboard_stack864,27139
-push_kboard 867,27187
-pop_kboard 879,27376
-temporarily_switch_to_single_kboard 914,28264
-record_single_kboard_state 943,29438
-restore_kboard_configuration 952,29622
-cmd_error 970,30078
-cmd_error_internal 1024,31511
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32031
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32031
-static Lisp_Object command_loop_2 1086,33638
-static Lisp_Object top_level_1 1087,33687
-command_loop 1094,33917
-command_loop_2 1134,35136
-top_level_2 1146,35340
-top_level_1 1152,35418
-DEFUN ("top-level", Ftop_level,1164,35788
-DEFUN ("top-level", Ftop_level,top-level1164,35788
-user_error 1183,36289
-DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36430
-DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36430
-DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36820
-DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36820
-tracking_off 1216,37282
-DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37817
-DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37817
-bool ignore_mouse_drag_p;1256,38393
-some_mouse_moved 1259,38442
-static int read_key_sequence 1282,38800
-static void adjust_point_for_property 1284,38918
-Lisp_Object last_undo_boundary;1287,39033
-command_loop_1 1294,39274
-read_menu_command 1649,50890
-adjust_point_for_property 1678,51618
-safe_run_hooks_1 1831,57340
-safe_run_hooks_error 1841,57570
-safe_run_hook_funcall 1878,58577
-safe_run_hooks 1893,59059
-int poll_suppress_count;1908,59398
-static struct atimer *poll_timer;poll_timer1915,59488
-poll_for_input_1 1919,59590
-poll_for_input 1930,59790
-start_polling 1942,60054
-input_polling_used 1979,61092
-stop_polling 1994,61391
-set_poll_suppress_count 2009,61760
-bind_polling_period 2029,62142
-make_ctrl_char 2048,62493
-show_help_echo 2113,64456
-static Lisp_Object kbd_buffer_get_event 2152,65485
-static void record_char 2154,65597
-static Lisp_Object help_form_saved_window_configs;2156,65639
-read_char_help_form_unwind 2158,65702
-#define STOP_POLLING   2166,65960
-#define RESUME_POLLING 2170,66085
-read_event_from_main_queue 2175,66230
-read_decoded_event_from_main_queue 2249,68418
-#define MAX_ENCODED_BYTES 2254,68665
-echo_keystrokes_p 2342,71557
-read_char 2376,72849
-record_menu_key 3225,98950
-help_char_p 3258,99675
-record_char 3273,99954
-save_getcjmp 3412,104236
-restore_getcjmp 3418,104327
-readable_events 3430,104698
-int stop_character EXTERNALLY_VISIBLE;3497,106438
-event_to_kboard 3500,106494
-kbd_buffer_nr_stored 3522,107143
-kbd_buffer_store_event 3534,107484
-kbd_buffer_store_event_hold 3550,108026
-kbd_buffer_unget_event 3684,111618
-#define INPUT_EVENT_POS_MAX 3698,112019
-#define INPUT_EVENT_POS_MIN 3701,112148
-position_to_Time 3706,112288
-Time_to_position 3716,112515
-gen_help_event 3738,113172
-kbd_buffer_store_help_event 3756,113612
-discard_mouse_events 3773,113977
-kbd_buffer_events_waiting 3803,114712
-clear_event 3823,115069
-kbd_buffer_get_event 3836,115409
-process_special_events 4258,127882
-swallow_events 4322,129706
-timer_start_idle 4339,130099
-timer_stop_idle 4355,130577
-timer_resume_idle 4363,130721
-struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130913
-Lisp_Object pending_funcalls;4377,131173
-decode_timer 4381,131294
-timer_check_2 4414,132247
-timer_check 4572,136818
-DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137663
-DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137663
-static Lisp_Object accent_key_syms;4625,138240
-static Lisp_Object func_key_syms;4626,138276
-static Lisp_Object mouse_syms;4627,138310
-static Lisp_Object wheel_syms;4628,138341
-static Lisp_Object drag_n_drop_syms;4629,138372
-static const int lispy_accent_codes[lispy_accent_codes4634,138517
-static const char *const lispy_accent_keys[lispy_accent_keys4741,139879
-#define FUNCTION_KEY_OFFSET 4766,140315
-const char *const lispy_function_keys[lispy_function_keys4768,140348
-static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148902
-static const char *const lispy_kana_keys[lispy_kana_keys5026,150136
-#define FUNCTION_KEY_OFFSET 5061,151752
-static const char *const lispy_function_keys[lispy_function_keys5065,151895
-#define ISO_FUNCTION_KEY_OFFSET 5149,154430
-static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154470
-static Lisp_Object Vlispy_mouse_stem;5172,155329
-static const char *const lispy_wheel_names[lispy_wheel_names5174,155368
-static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155620
-static short const scroll_bar_parts[scroll_bar_parts5189,155886
-static Lisp_Object button_down_location;5210,156911
-static int last_mouse_button;5215,157066
-static int last_mouse_x;5216,157096
-static int last_mouse_y;5217,157121
-static Time button_down_time;5218,157146
-static int double_click_count;5222,157230
-make_lispy_position 5228,157391
-toolkit_menubar_in_use 5456,163954
-make_scroll_bar_position 5469,164322
-make_lispy_event 5485,164968
-make_lispy_movement 6104,183531
-make_lispy_switch_frame 6131,184262
-make_lispy_focus_in 6137,184369
-make_lispy_focus_out 6145,184495
-parse_modifiers_uncached 6163,184945
-#define SINGLE_LETTER_MOD(6185,185465
-#undef SINGLE_LETTER_MOD6212,185906
-#define MULTI_LETTER_MOD(6214,185932
-#undef MULTI_LETTER_MOD6231,186400
-apply_modifiers_uncached 6273,187574
-static const char *const modifier_names[modifier_names6319,189193
-#define NUM_MOD_NAMES 6325,189399
-static Lisp_Object modifier_symbols;6327,189449
-lispy_modifier_list 6331,189586
-#define KEY_TO_CHAR(6353,190252
-parse_modifiers 6356,190328
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
-apply_modifiers 6422,192391
-reorder_modifiers 6491,194720
-modify_event_symbol 6536,196528
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
-parse_solitary_modifier 6695,201135
-#define SINGLE_LETTER_MOD(6701,201258
-#define MULTI_LETTER_MOD(6705,201343
-#undef SINGLE_LETTER_MOD6763,202641
-#undef MULTI_LETTER_MOD6764,202666
-lucid_event_type_list_p 6775,202889
-get_input_pending 6814,203960
-record_asynch_buffer_change 6834,204579
-gobble_input 6872,205702
-tty_read_avail_input 6967,208310
-handle_async_input 7149,214039
-process_pending_signals 7165,214359
-unblock_input_to 7177,214645
-unblock_input 7200,215277
-totally_unblock_input 7209,215445
-handle_input_available_signal 7217,215529
-deliver_input_available_signal 7226,215700
-struct user_signal_info7235,215865
-static struct user_signal_info *user_signals user_signals7250,216090
-add_user_signal 7253,216149
-handle_user_signal 7275,216598
-deliver_user_signal 7316,217558
-find_user_signal_name 7322,217659
-store_user_signal_events 7334,217841
-static void menu_bar_item 7362,218341
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
-static Lisp_Object menu_bar_items_vector;7368,218630
-static int menu_bar_items_index;7369,218672
-static const char *separator_names[separator_names7372,218707
-menu_separator_name_p 7393,219148
-menu_bar_items 7426,219852
-Lisp_Object item_properties;7568,224603
-menu_bar_item 7571,224645
-menu_item_eval_property_1 7647,227175
-eval_dyn 7658,227465
-menu_item_eval_property 7666,227675
-parse_menu_item 7686,228341
-static Lisp_Object tool_bar_items_vector;7965,236336
-static Lisp_Object tool_bar_item_properties;7970,236510
-static int ntool_bar_items;7974,236606
-static void init_tool_bar_items 7978,236664
-static void process_tool_bar_item 7979,236711
-static bool parse_tool_bar_item 7981,236801
-static void append_tool_bar_item 7982,236861
-tool_bar_items 7990,237083
-process_tool_bar_item 8075,239892
-#define PROP(8112,240969
-set_prop 8114,241038
-parse_tool_bar_item 8167,242453
-#undef PROP8379,248844
-init_tool_bar_items 8387,248969
-append_tool_bar_item 8401,249261
-read_char_x_menu_prompt 8443,250771
-read_char_minibuf_menu_prompt 8503,252445
-#define PUSH_C_STR(8527,253014
-follow_key 8726,258553
-active_maps 8733,258695
-typedef struct keyremap8742,259021
-} keyremap;8754,259464
-access_keymap_keyremap 8764,259808
-keyremap_step 8811,261450
-test_undefined 8867,262934
-read_key_sequence 8916,264861
-read_key_sequence_vs 9826,295821
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
-detect_input_pending 9950,300488
-detect_input_pending_ignore_squeezables 9959,300654
-detect_input_pending_run_timers 9967,300870
-clear_input_pending 9985,301362
-requeued_events_pending_p 9997,301732
-DEFUN ("input-pending-p", Finput_pending_p,10002,301813
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
-DEFUN ("recent-keys", Frecent_keys,10024,302596
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
-DEFUN ("recursion-depth", Frecursion_depth,10158,307069
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
-DEFUN ("discard-input", Fdiscard_input,10203,308447
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
-stuff_buffered_input 10285,311045
-set_waiting_for_input 10323,312016
-clear_waiting_for_input 10337,312390
-handle_interrupt_signal 10351,312754
-deliver_interrupt_signal 10378,313642
-static int volatile force_quit_count;10387,313932
-handle_interrupt 10401,314414
-quit_throw_to_read_char 10541,318711
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
-DEFUN ("set-quit-char", Fset_quit_char,10694,322706
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
-DEFUN ("set-input-mode", Fset_input_mode,10729,323570
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
-DEFUN ("posn-at-point", Fposn_at_point,10824,327060
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
-init_kboard 10861,328214
-allocate_kboard 10893,329284
-wipe_kboard 10909,329637
-delete_kboard 10917,329751
-init_keyboard 10942,330281
-struct event_head11021,332696
-static const struct event_head head_table[head_table11027,332747
-syms_of_keyboard 11045,333577
-keys_of_keyboard 11841,367115
-mark_kboards 11916,370434
+recursive_edit_unwind 804,25751
+any_kboard_state 817,26017
+single_kboard_state 838,26669
+not_single_kboard_state 848,26807
+struct kboard_stack858,27069
+static struct kboard_stack *kboard_stack;kboard_stack864,27142
+push_kboard 867,27190
+pop_kboard 879,27379
+temporarily_switch_to_single_kboard 914,28267
+record_single_kboard_state 943,29441
+restore_kboard_configuration 952,29625
+cmd_error 970,30081
+cmd_error_internal 1024,31514
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32034
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32034
+static Lisp_Object command_loop_2 1086,33641
+static Lisp_Object top_level_1 1087,33690
+command_loop 1094,33920
+command_loop_2 1134,35139
+top_level_2 1146,35343
+top_level_1 1152,35421
+DEFUN ("top-level", Ftop_level,1164,35791
+DEFUN ("top-level", Ftop_level,top-level1164,35791
+user_error 1183,36292
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36433
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36433
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36823
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36823
+tracking_off 1216,37285
+DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37820
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37820
+bool ignore_mouse_drag_p;1256,38396
+some_mouse_moved 1259,38445
+static int read_key_sequence 1282,38803
+static void adjust_point_for_property 1284,38921
+Lisp_Object last_undo_boundary;1287,39036
+command_loop_1 1294,39277
+read_menu_command 1649,50893
+adjust_point_for_property 1678,51621
+safe_run_hooks_1 1831,57343
+safe_run_hooks_error 1841,57573
+safe_run_hook_funcall 1878,58580
+safe_run_hooks 1893,59062
+int poll_suppress_count;1908,59401
+static struct atimer *poll_timer;poll_timer1915,59491
+poll_for_input_1 1919,59593
+poll_for_input 1930,59793
+start_polling 1942,60057
+input_polling_used 1979,61095
+stop_polling 1994,61394
+set_poll_suppress_count 2009,61763
+bind_polling_period 2029,62145
+make_ctrl_char 2048,62496
+show_help_echo 2113,64459
+static Lisp_Object kbd_buffer_get_event 2152,65488
+static void record_char 2154,65600
+static Lisp_Object help_form_saved_window_configs;2156,65642
+read_char_help_form_unwind 2158,65705
+#define STOP_POLLING   2166,65963
+#define RESUME_POLLING 2170,66088
+read_event_from_main_queue 2175,66233
+read_decoded_event_from_main_queue 2249,68421
+#define MAX_ENCODED_BYTES 2254,68668
+echo_keystrokes_p 2342,71560
+read_char 2376,72852
+record_menu_key 3225,98953
+help_char_p 3258,99678
+record_char 3273,99957
+save_getcjmp 3412,104239
+restore_getcjmp 3418,104330
+readable_events 3430,104701
+int stop_character EXTERNALLY_VISIBLE;3497,106441
+event_to_kboard 3500,106497
+kbd_buffer_nr_stored 3522,107146
+kbd_buffer_store_event 3534,107487
+kbd_buffer_store_event_hold 3550,108029
+kbd_buffer_unget_event 3684,111621
+#define INPUT_EVENT_POS_MAX 3698,112022
+#define INPUT_EVENT_POS_MIN 3701,112151
+position_to_Time 3706,112291
+Time_to_position 3716,112518
+gen_help_event 3738,113175
+kbd_buffer_store_help_event 3756,113615
+discard_mouse_events 3773,113980
+kbd_buffer_events_waiting 3803,114715
+clear_event 3823,115072
+kbd_buffer_get_event 3836,115412
+process_special_events 4258,127885
+swallow_events 4322,129709
+timer_start_idle 4339,130102
+timer_stop_idle 4355,130580
+timer_resume_idle 4363,130724
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130916
+Lisp_Object pending_funcalls;4377,131176
+decode_timer 4381,131297
+timer_check_2 4414,132250
+timer_check 4572,136821
+DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137666
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137666
+static Lisp_Object accent_key_syms;4625,138243
+static Lisp_Object func_key_syms;4626,138279
+static Lisp_Object mouse_syms;4627,138313
+static Lisp_Object wheel_syms;4628,138344
+static Lisp_Object drag_n_drop_syms;4629,138375
+static const int lispy_accent_codes[lispy_accent_codes4634,138520
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139882
+#define FUNCTION_KEY_OFFSET 4766,140318
+const char *const lispy_function_keys[lispy_function_keys4768,140351
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148905
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150139
+#define FUNCTION_KEY_OFFSET 5061,151755
+static const char *const lispy_function_keys[lispy_function_keys5065,151898
+#define ISO_FUNCTION_KEY_OFFSET 5149,154433
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154473
+static Lisp_Object Vlispy_mouse_stem;5172,155332
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155371
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155623
+static short const scroll_bar_parts[scroll_bar_parts5189,155889
+static Lisp_Object button_down_location;5210,156914
+static int last_mouse_button;5215,157069
+static int last_mouse_x;5216,157099
+static int last_mouse_y;5217,157124
+static Time button_down_time;5218,157149
+static int double_click_count;5222,157233
+make_lispy_position 5228,157394
+toolkit_menubar_in_use 5456,163957
+make_scroll_bar_position 5469,164325
+make_lispy_event 5485,164971
+make_lispy_movement 6104,183534
+make_lispy_switch_frame 6131,184265
+make_lispy_focus_in 6137,184372
+make_lispy_focus_out 6145,184498
+parse_modifiers_uncached 6163,184948
+#define SINGLE_LETTER_MOD(6185,185468
+#undef SINGLE_LETTER_MOD6212,185909
+#define MULTI_LETTER_MOD(6214,185935
+#undef MULTI_LETTER_MOD6231,186403
+apply_modifiers_uncached 6273,187577
+static const char *const modifier_names[modifier_names6319,189196
+#define NUM_MOD_NAMES 6325,189402
+static Lisp_Object modifier_symbols;6327,189452
+lispy_modifier_list 6331,189589
+#define KEY_TO_CHAR(6353,190255
+parse_modifiers 6356,190331
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191520
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191520
+apply_modifiers 6422,192394
+reorder_modifiers 6491,194723
+modify_event_symbol 6536,196531
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199247
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199247
+parse_solitary_modifier 6695,201138
+#define SINGLE_LETTER_MOD(6701,201261
+#define MULTI_LETTER_MOD(6705,201346
+#undef SINGLE_LETTER_MOD6763,202644
+#undef MULTI_LETTER_MOD6764,202669
+lucid_event_type_list_p 6775,202892
+get_input_pending 6814,203963
+record_asynch_buffer_change 6834,204582
+gobble_input 6872,205705
+tty_read_avail_input 6967,208313
+handle_async_input 7149,214042
+process_pending_signals 7165,214362
+unblock_input_to 7177,214648
+unblock_input 7200,215280
+totally_unblock_input 7209,215448
+handle_input_available_signal 7217,215532
+deliver_input_available_signal 7226,215703
+struct user_signal_info7235,215868
+static struct user_signal_info *user_signals user_signals7250,216093
+add_user_signal 7253,216152
+handle_user_signal 7275,216601
+deliver_user_signal 7316,217561
+find_user_signal_name 7322,217662
+store_user_signal_events 7334,217844
+static void menu_bar_item 7362,218344
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218419
+static Lisp_Object menu_bar_items_vector;7368,218633
+static int menu_bar_items_index;7369,218675
+static const char *separator_names[separator_names7372,218710
+menu_separator_name_p 7393,219151
+menu_bar_items 7426,219855
+Lisp_Object item_properties;7568,224606
+menu_bar_item 7571,224648
+menu_item_eval_property_1 7647,227178
+eval_dyn 7658,227468
+menu_item_eval_property 7666,227678
+parse_menu_item 7686,228344
+static Lisp_Object tool_bar_items_vector;7965,236339
+static Lisp_Object tool_bar_item_properties;7970,236513
+static int ntool_bar_items;7974,236609
+static void init_tool_bar_items 7978,236667
+static void process_tool_bar_item 7979,236714
+static bool parse_tool_bar_item 7981,236804
+static void append_tool_bar_item 7982,236864
+tool_bar_items 7990,237086
+process_tool_bar_item 8075,239895
+#define PROP(8112,240972
+set_prop 8114,241041
+parse_tool_bar_item 8167,242456
+#undef PROP8379,248847
+init_tool_bar_items 8387,248972
+append_tool_bar_item 8401,249264
+read_char_x_menu_prompt 8443,250774
+read_char_minibuf_menu_prompt 8503,252448
+#define PUSH_C_STR(8527,253017
+follow_key 8726,258556
+active_maps 8733,258698
+typedef struct keyremap8742,259024
+} keyremap;8754,259467
+access_keymap_keyremap 8764,259811
+keyremap_step 8811,261453
+test_undefined 8867,262937
+read_key_sequence 8916,264864
+read_key_sequence_vs 9826,295824
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297297
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297297
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299985
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299985
+detect_input_pending 9950,300491
+detect_input_pending_ignore_squeezables 9959,300657
+detect_input_pending_run_timers 9967,300873
+clear_input_pending 9985,301365
+requeued_events_pending_p 9997,301735
+DEFUN ("input-pending-p", Finput_pending_p,10002,301816
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301816
+DEFUN ("recent-keys", Frecent_keys,10024,302599
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302599
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303520
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303520
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303961
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303961
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304383
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304383
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304958
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304958
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305498
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305498
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306513
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306513
+DEFUN ("recursion-depth", Frecursion_depth,10158,307072
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307072
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307409
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307409
+DEFUN ("discard-input", Fdiscard_input,10203,308450
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308450
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308952
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308952
+stuff_buffered_input 10285,311048
+set_waiting_for_input 10323,312019
+clear_waiting_for_input 10337,312393
+handle_interrupt_signal 10351,312757
+deliver_interrupt_signal 10378,313645
+static int volatile force_quit_count;10387,313935
+handle_interrupt 10401,314417
+quit_throw_to_read_char 10541,318714
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319291
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319291
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320519
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320519
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321435
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321435
+DEFUN ("set-quit-char", Fset_quit_char,10694,322709
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322709
+DEFUN ("set-input-mode", Fset_input_mode,10729,323573
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323573
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324462
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324462
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325840
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325840
+DEFUN ("posn-at-point", Fposn_at_point,10824,327063
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327063
+init_kboard 10861,328217
+allocate_kboard 10893,329287
+wipe_kboard 10909,329640
+delete_kboard 10917,329754
+init_keyboard 10942,330284
+struct event_head11021,332699
+static const struct event_head head_table[head_table11027,332750
+syms_of_keyboard 11045,333580
+keys_of_keyboard 11841,367118
+mark_kboards 11916,370437
 
 c-src/emacs/src/lisp.h,33840
 #define EMACS_LISP_H22,801
@@ -2735,112 +2735,112 @@ el-src/emacs/lisp/progmodes/etags.el,5188
 (defcustom tags-tag-face 148,5700
 (defcustom tags-apropos-verbose 154,5835
 (defcustom tags-apropos-additional-actions 160,5999
-(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6918
-(defvar default-tags-table-function 189,7098
-(defvar tags-location-ring 194,7324
-(defvar tags-table-files 201,7600
-(defvar tags-completion-table 206,7767
-(defvar tags-included-tables 209,7859
-(defvar next-file-list 212,7954
-(defvar tags-table-format-functions 217,8060
-(defvar file-of-tag-function 224,8441
-(defvar tags-table-files-function 228,8635
-(defvar tags-completion-table-function 230,8746
-(defvar snarf-tag-function 232,8841
-(defvar goto-tag-location-function 236,9050
-(defvar find-tag-regexp-search-function 239,9223
-(defvar find-tag-regexp-tag-order 241,9344
-(defvar find-tag-regexp-next-line-after-failure-p 243,9453
-(defvar find-tag-search-function 245,9573
-(defvar find-tag-tag-order 247,9680
-(defvar find-tag-next-line-after-failure-p 249,9775
-(defvar list-tags-function 251,9881
-(defvar tags-apropos-function 253,9969
-(defvar tags-included-tables-function 255,10063
-(defvar verify-tags-table-function 257,10182
-(defun initialize-new-tags-table 260,10293
-(defun tags-table-mode 276,10981
-(defun visit-tags-table 285,11246
-(defun tags-table-check-computed-list 321,12784
-(defun tags-table-extend-computed-list 360,14655
-(defun tags-expand-table-name 400,16368
-(defun tags-table-list-member 409,16711
-(defun tags-verify-table 421,17183
-(defun tags-table-including 470,19303
-(defun tags-next-table 522,21347
-(defun visit-tags-table-buffer 543,22204
-(defun tags-reset-tags-tables 712,28514
-(defun file-of-tag 731,29171
-(defun tags-table-files 740,29521
-(defun tags-included-tables 749,29871
-(defun tags-completion-table 755,30117
-(defun tags-lazy-completion-table 783,31311
-(defun tags-completion-at-point-function 799,31946
-(defun find-tag-tag 818,32696
-(defvar last-tag 837,33369
-(defun find-tag-interactive 840,33428
-(defvar find-tag-history 852,33843
-(defvar etags-case-fold-search)855,33908
-(defvar etags-syntax-table)856,33940
-(defvar local-find-tag-hook)857,33968
-(defun find-tag-noselect 860,34013
-(defun find-tag 932,37127
-(defun find-tag-other-window 959,38343
-(defun find-tag-other-frame 1000,40271
-(defun find-tag-regexp 1025,41445
-(defalias 'pop-tag-mark pop-tag-mark1049,42607
-(defvar tag-lines-already-matched 1052,42658
-(defun find-tag-in-order 1055,42765
-(defun tag-find-file-of-tag-noselect 1167,47111
-(defun tag-find-file-of-tag 1200,48957
-(defun etags-recognize-tags-table 1208,49183
-(defun etags-verify-tags-table 1241,50814
-(defun etags-file-of-tag 1246,51012
-(defun etags-tags-completion-table 1256,51347
-(defun etags-snarf-tag 1286,52553
-(defun etags-goto-tag-location 1324,54122
-(defun etags-list-tags 1388,56565
-(defmacro tags-with-face 1423,57840
-(defun etags-tags-apropos-additional 1431,58173
-(defun etags-tags-apropos 1465,59410
-(defun etags-tags-table-files 1527,61619
-(defun etags-tags-included-tables 1542,62055
-(defun tags-recognize-empty-tags-table 1559,62595
-(defun tag-exact-file-name-match-p 1587,63741
-(defun tag-file-name-match-p 1596,64134
-(defun tag-exact-match-p 1609,64690
-(defun tag-implicit-name-match-p 1620,65258
-(defun tag-symbol-match-p 1633,65858
-(defun tag-word-match-p 1643,66294
-(defun tag-partial-file-name-match-p 1652,66692
-(defun tag-any-match-p 1662,67136
-(defun tag-re-match-p 1667,67320
-(defcustom tags-loop-revert-buffers 1675,67569
-(defun next-file 1685,67978
-(defvar tags-loop-operate 1760,70892
-(defvar tags-loop-scan1763,70986
-(defun tags-loop-eval 1771,71315
-(defun tags-loop-continue 1782,71644
-(defun tags-search 1850,73950
-(defun tags-query-replace 1871,74776
-(defun tags-complete-tags-table-file 1896,76000
-(defun list-tags 1906,76379
-(defun tags-apropos 1934,77332
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78158
-(defun select-tags-table 1964,78397
-(defvar select-tags-table-mode-map 2019,80524
-(define-derived-mode select-tags-table-mode 2030,80907
-(defun select-tags-table-select 2034,81091
-(defun select-tags-table-quit 2043,81457
-(defun complete-tag 2049,81612
-(defconst etags--xref-limit 2074,82553
-(defvar etags-xref-find-definitions-tag-order 2076,82588
-(defun etags-xref-find 2082,82878
-(defun etags--xref-find-definitions 2096,83407
-(defclass xref-etags-location 2129,85121
-(defun xref-make-etags-location 2135,85344
-(cl-defmethod xref-location-marker 2139,85499
-(cl-defmethod xref-location-line 2146,85743
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6921
+(defvar default-tags-table-function 189,7101
+(defvar tags-location-ring 194,7327
+(defvar tags-table-files 201,7603
+(defvar tags-completion-table 206,7770
+(defvar tags-included-tables 209,7862
+(defvar next-file-list 212,7957
+(defvar tags-table-format-functions 217,8063
+(defvar file-of-tag-function 224,8444
+(defvar tags-table-files-function 228,8638
+(defvar tags-completion-table-function 230,8749
+(defvar snarf-tag-function 232,8844
+(defvar goto-tag-location-function 236,9053
+(defvar find-tag-regexp-search-function 239,9226
+(defvar find-tag-regexp-tag-order 241,9347
+(defvar find-tag-regexp-next-line-after-failure-p 243,9456
+(defvar find-tag-search-function 245,9576
+(defvar find-tag-tag-order 247,9683
+(defvar find-tag-next-line-after-failure-p 249,9778
+(defvar list-tags-function 251,9884
+(defvar tags-apropos-function 253,9972
+(defvar tags-included-tables-function 255,10066
+(defvar verify-tags-table-function 257,10185
+(defun initialize-new-tags-table 260,10296
+(defun tags-table-mode 276,10984
+(defun visit-tags-table 285,11249
+(defun tags-table-check-computed-list 321,12787
+(defun tags-table-extend-computed-list 360,14658
+(defun tags-expand-table-name 400,16371
+(defun tags-table-list-member 409,16714
+(defun tags-verify-table 421,17186
+(defun tags-table-including 470,19306
+(defun tags-next-table 522,21350
+(defun visit-tags-table-buffer 543,22207
+(defun tags-reset-tags-tables 712,28517
+(defun file-of-tag 731,29174
+(defun tags-table-files 740,29524
+(defun tags-included-tables 749,29874
+(defun tags-completion-table 755,30120
+(defun tags-lazy-completion-table 783,31314
+(defun tags-completion-at-point-function 799,31949
+(defun find-tag-tag 818,32699
+(defvar last-tag 837,33372
+(defun find-tag-interactive 840,33431
+(defvar find-tag-history 852,33846
+(defvar etags-case-fold-search)855,33911
+(defvar etags-syntax-table)856,33943
+(defvar local-find-tag-hook)857,33971
+(defun find-tag-noselect 860,34016
+(defun find-tag 932,37130
+(defun find-tag-other-window 959,38346
+(defun find-tag-other-frame 1000,40274
+(defun find-tag-regexp 1025,41448
+(defalias 'pop-tag-mark pop-tag-mark1049,42610
+(defvar tag-lines-already-matched 1052,42661
+(defun find-tag-in-order 1055,42768
+(defun tag-find-file-of-tag-noselect 1167,47114
+(defun tag-find-file-of-tag 1200,48960
+(defun etags-recognize-tags-table 1208,49186
+(defun etags-verify-tags-table 1241,50817
+(defun etags-file-of-tag 1246,51015
+(defun etags-tags-completion-table 1256,51350
+(defun etags-snarf-tag 1286,52556
+(defun etags-goto-tag-location 1324,54125
+(defun etags-list-tags 1388,56568
+(defmacro tags-with-face 1423,57843
+(defun etags-tags-apropos-additional 1431,58176
+(defun etags-tags-apropos 1465,59413
+(defun etags-tags-table-files 1527,61622
+(defun etags-tags-included-tables 1542,62058
+(defun tags-recognize-empty-tags-table 1559,62598
+(defun tag-exact-file-name-match-p 1587,63744
+(defun tag-file-name-match-p 1596,64137
+(defun tag-exact-match-p 1609,64693
+(defun tag-implicit-name-match-p 1620,65261
+(defun tag-symbol-match-p 1633,65861
+(defun tag-word-match-p 1643,66297
+(defun tag-partial-file-name-match-p 1652,66695
+(defun tag-any-match-p 1662,67139
+(defun tag-re-match-p 1667,67323
+(defcustom tags-loop-revert-buffers 1675,67572
+(defun next-file 1685,67981
+(defvar tags-loop-operate 1760,70895
+(defvar tags-loop-scan1763,70989
+(defun tags-loop-eval 1771,71318
+(defun tags-loop-continue 1782,71647
+(defun tags-search 1850,73953
+(defun tags-query-replace 1871,74779
+(defun tags-complete-tags-table-file 1896,76003
+(defun list-tags 1906,76382
+(defun tags-apropos 1934,77335
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78161
+(defun select-tags-table 1964,78400
+(defvar select-tags-table-mode-map 2019,80527
+(define-derived-mode select-tags-table-mode 2030,80910
+(defun select-tags-table-select 2034,81094
+(defun select-tags-table-quit 2043,81460
+(defun complete-tag 2049,81615
+(defconst etags--xref-limit 2074,82556
+(defvar etags-xref-find-definitions-tag-order 2076,82591
+(defun etags-xref-find 2082,82881
+(defun etags--xref-find-definitions 2096,83410
+(defclass xref-etags-location 2129,85124
+(defun xref-make-etags-location 2135,85347
+(cl-defmethod xref-location-marker 2139,85502
+(cl-defmethod xref-location-line 2146,85746
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
diff --git a/test/manual/etags/ETAGS.good_3 b/test/manual/etags/ETAGS.good_3
index 9dca0084de..45507706b3 100644
--- a/test/manual/etags/ETAGS.good_3
+++ b/test/manual/etags/ETAGS.good_3
@@ -1029,289 +1029,289 @@ record_auto_save 742,23849
 force_auto_save_soon 751,24017
 DEFUN ("recursive-edit", Frecursive_edit,759,24138
 DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24138
-recursive_edit_unwind 804,25748
-any_kboard_state 817,26014
-single_kboard_state 838,26666
-not_single_kboard_state 848,26804
-struct kboard_stack858,27066
-  KBOARD *kboard;kboard860,27088
-  struct kboard_stack *next;next861,27106
-static struct kboard_stack *kboard_stack;kboard_stack864,27139
-push_kboard 867,27187
-pop_kboard 879,27376
-temporarily_switch_to_single_kboard 914,28264
-record_single_kboard_state 943,29438
-restore_kboard_configuration 952,29622
-cmd_error 970,30078
-cmd_error_internal 1024,31511
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32031
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32031
-command_loop 1094,33917
-command_loop_2 1134,35136
-top_level_2 1146,35340
-top_level_1 1152,35418
-DEFUN ("top-level", Ftop_level,1164,35788
-DEFUN ("top-level", Ftop_level,top-level1164,35788
-user_error 1183,36289
-DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36430
-DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36430
-DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36820
-DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36820
-tracking_off 1216,37282
-DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37817
-DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37817
-bool ignore_mouse_drag_p;1256,38393
-some_mouse_moved 1259,38442
-Lisp_Object last_undo_boundary;1287,39033
-command_loop_1 1294,39274
-read_menu_command 1649,50890
-adjust_point_for_property 1678,51618
-safe_run_hooks_1 1831,57340
-safe_run_hooks_error 1841,57570
-safe_run_hook_funcall 1878,58577
-safe_run_hooks 1893,59059
-int poll_suppress_count;1908,59398
-static struct atimer *poll_timer;poll_timer1915,59488
-poll_for_input_1 1919,59590
-poll_for_input 1930,59790
-start_polling 1942,60054
-input_polling_used 1979,61092
-stop_polling 1994,61391
-set_poll_suppress_count 2009,61760
-bind_polling_period 2029,62142
-make_ctrl_char 2048,62493
-show_help_echo 2113,64456
-static Lisp_Object help_form_saved_window_configs;2156,65639
-read_char_help_form_unwind 2158,65702
-#define STOP_POLLING   2166,65960
-#define RESUME_POLLING 2170,66085
-read_event_from_main_queue 2175,66230
-read_decoded_event_from_main_queue 2249,68418
-#define MAX_ENCODED_BYTES 2254,68665
-echo_keystrokes_p 2342,71557
-read_char 2376,72849
-record_menu_key 3225,98950
-help_char_p 3258,99675
-record_char 3273,99954
-save_getcjmp 3412,104236
-restore_getcjmp 3418,104327
-readable_events 3430,104698
-int stop_character EXTERNALLY_VISIBLE;3497,106438
-event_to_kboard 3500,106494
-kbd_buffer_nr_stored 3522,107143
-kbd_buffer_store_event 3534,107484
-kbd_buffer_store_event_hold 3550,108026
-kbd_buffer_unget_event 3684,111618
-#define INPUT_EVENT_POS_MAX 3698,112019
-#define INPUT_EVENT_POS_MIN 3701,112148
-position_to_Time 3706,112288
-Time_to_position 3716,112515
-gen_help_event 3738,113172
-kbd_buffer_store_help_event 3756,113612
-discard_mouse_events 3773,113977
-kbd_buffer_events_waiting 3803,114712
-clear_event 3823,115069
-kbd_buffer_get_event 3836,115409
-process_special_events 4258,127882
-swallow_events 4322,129706
-timer_start_idle 4339,130099
-timer_stop_idle 4355,130577
-timer_resume_idle 4363,130721
-struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130913
-Lisp_Object pending_funcalls;4377,131173
-decode_timer 4381,131294
-timer_check_2 4414,132247
-timer_check 4572,136818
-DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137663
-DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137663
-static Lisp_Object accent_key_syms;4625,138240
-static Lisp_Object func_key_syms;4626,138276
-static Lisp_Object mouse_syms;4627,138310
-static Lisp_Object wheel_syms;4628,138341
-static Lisp_Object drag_n_drop_syms;4629,138372
-static const int lispy_accent_codes[lispy_accent_codes4634,138517
-static const char *const lispy_accent_keys[lispy_accent_keys4741,139879
-#define FUNCTION_KEY_OFFSET 4766,140315
-const char *const lispy_function_keys[lispy_function_keys4768,140348
-static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148902
-static const char *const lispy_kana_keys[lispy_kana_keys5026,150136
-#define FUNCTION_KEY_OFFSET 5061,151752
-static const char *const lispy_function_keys[lispy_function_keys5065,151895
-#define ISO_FUNCTION_KEY_OFFSET 5149,154430
-static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154470
-static Lisp_Object Vlispy_mouse_stem;5172,155329
-static const char *const lispy_wheel_names[lispy_wheel_names5174,155368
-static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155620
-static short const scroll_bar_parts[scroll_bar_parts5189,155886
-static Lisp_Object button_down_location;5210,156911
-static int last_mouse_button;5215,157066
-static int last_mouse_x;5216,157096
-static int last_mouse_y;5217,157121
-static Time button_down_time;5218,157146
-static int double_click_count;5222,157230
-make_lispy_position 5228,157391
-toolkit_menubar_in_use 5456,163954
-make_scroll_bar_position 5469,164322
-make_lispy_event 5485,164968
-make_lispy_movement 6104,183531
-make_lispy_switch_frame 6131,184262
-make_lispy_focus_in 6137,184369
-make_lispy_focus_out 6145,184495
-parse_modifiers_uncached 6163,184945
-#define SINGLE_LETTER_MOD(6185,185465
-#undef SINGLE_LETTER_MOD6212,185906
-#define MULTI_LETTER_MOD(6214,185932
-#undef MULTI_LETTER_MOD6231,186400
-apply_modifiers_uncached 6273,187574
-static const char *const modifier_names[modifier_names6319,189193
-#define NUM_MOD_NAMES 6325,189399
-static Lisp_Object modifier_symbols;6327,189449
-lispy_modifier_list 6331,189586
-#define KEY_TO_CHAR(6353,190252
-parse_modifiers 6356,190328
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
-apply_modifiers 6422,192391
-reorder_modifiers 6491,194720
-modify_event_symbol 6536,196528
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
-parse_solitary_modifier 6695,201135
-#define SINGLE_LETTER_MOD(6701,201258
-#define MULTI_LETTER_MOD(6705,201343
-#undef SINGLE_LETTER_MOD6763,202641
-#undef MULTI_LETTER_MOD6764,202666
-lucid_event_type_list_p 6775,202889
-get_input_pending 6814,203960
-record_asynch_buffer_change 6834,204579
-gobble_input 6872,205702
-tty_read_avail_input 6967,208310
-handle_async_input 7149,214039
-process_pending_signals 7165,214359
-unblock_input_to 7177,214645
-unblock_input 7200,215277
-totally_unblock_input 7209,215445
-handle_input_available_signal 7217,215529
-deliver_input_available_signal 7226,215700
-struct user_signal_info7235,215865
-  int sig;7238,215915
-  char *name;name7241,215956
-  int npending;7244,216007
-  struct user_signal_info *next;next7246,216024
-static struct user_signal_info *user_signals user_signals7250,216090
-add_user_signal 7253,216149
-handle_user_signal 7275,216598
-deliver_user_signal 7316,217558
-find_user_signal_name 7322,217659
-store_user_signal_events 7334,217841
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
-static Lisp_Object menu_bar_items_vector;7368,218630
-static int menu_bar_items_index;7369,218672
-static const char *separator_names[separator_names7372,218707
-menu_separator_name_p 7393,219148
-menu_bar_items 7426,219852
-Lisp_Object item_properties;7568,224603
-menu_bar_item 7571,224645
-menu_item_eval_property_1 7647,227175
-eval_dyn 7658,227465
-menu_item_eval_property 7666,227675
-parse_menu_item 7686,228341
-static Lisp_Object tool_bar_items_vector;7965,236336
-static Lisp_Object tool_bar_item_properties;7970,236510
-static int ntool_bar_items;7974,236606
-tool_bar_items 7990,237083
-process_tool_bar_item 8075,239892
-#define PROP(8112,240969
-set_prop 8114,241038
-parse_tool_bar_item 8167,242453
-#undef PROP8379,248844
-init_tool_bar_items 8387,248969
-append_tool_bar_item 8401,249261
-read_char_x_menu_prompt 8443,250771
-read_char_minibuf_menu_prompt 8503,252445
-#define PUSH_C_STR(8527,253014
-follow_key 8726,258553
-active_maps 8733,258695
-typedef struct keyremap8742,259021
-  Lisp_Object parent;8745,259107
-  Lisp_Object map;8748,259224
-  int start,8753,259446
-  int start, end;8753,259446
-} keyremap;8754,259464
-access_keymap_keyremap 8764,259808
-keyremap_step 8811,261450
-test_undefined 8867,262934
-read_key_sequence 8916,264861
-read_key_sequence_vs 9826,295821
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
-detect_input_pending 9950,300488
-detect_input_pending_ignore_squeezables 9959,300654
-detect_input_pending_run_timers 9967,300870
-clear_input_pending 9985,301362
-requeued_events_pending_p 9997,301732
-DEFUN ("input-pending-p", Finput_pending_p,10002,301813
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
-DEFUN ("recent-keys", Frecent_keys,10024,302596
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
-DEFUN ("recursion-depth", Frecursion_depth,10158,307069
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
-DEFUN ("discard-input", Fdiscard_input,10203,308447
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
-stuff_buffered_input 10285,311045
-set_waiting_for_input 10323,312016
-clear_waiting_for_input 10337,312390
-handle_interrupt_signal 10351,312754
-deliver_interrupt_signal 10378,313642
-static int volatile force_quit_count;10387,313932
-handle_interrupt 10401,314414
-quit_throw_to_read_char 10541,318711
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
-DEFUN ("set-quit-char", Fset_quit_char,10694,322706
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
-DEFUN ("set-input-mode", Fset_input_mode,10729,323570
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
-DEFUN ("posn-at-point", Fposn_at_point,10824,327060
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
-init_kboard 10861,328214
-allocate_kboard 10893,329284
-wipe_kboard 10909,329637
-delete_kboard 10917,329751
-init_keyboard 10942,330281
-struct event_head11021,332696
-  short var;11023,332716
-  short kind;11024,332729
-static const struct event_head head_table[head_table11027,332747
-syms_of_keyboard 11045,333577
-keys_of_keyboard 11841,367115
-mark_kboards 11916,370434
+recursive_edit_unwind 804,25751
+any_kboard_state 817,26017
+single_kboard_state 838,26669
+not_single_kboard_state 848,26807
+struct kboard_stack858,27069
+  KBOARD *kboard;kboard860,27091
+  struct kboard_stack *next;next861,27109
+static struct kboard_stack *kboard_stack;kboard_stack864,27142
+push_kboard 867,27190
+pop_kboard 879,27379
+temporarily_switch_to_single_kboard 914,28267
+record_single_kboard_state 943,29441
+restore_kboard_configuration 952,29625
+cmd_error 970,30081
+cmd_error_internal 1024,31514
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32034
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32034
+command_loop 1094,33920
+command_loop_2 1134,35139
+top_level_2 1146,35343
+top_level_1 1152,35421
+DEFUN ("top-level", Ftop_level,1164,35791
+DEFUN ("top-level", Ftop_level,top-level1164,35791
+user_error 1183,36292
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36433
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36433
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36823
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36823
+tracking_off 1216,37285
+DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37820
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37820
+bool ignore_mouse_drag_p;1256,38396
+some_mouse_moved 1259,38445
+Lisp_Object last_undo_boundary;1287,39036
+command_loop_1 1294,39277
+read_menu_command 1649,50893
+adjust_point_for_property 1678,51621
+safe_run_hooks_1 1831,57343
+safe_run_hooks_error 1841,57573
+safe_run_hook_funcall 1878,58580
+safe_run_hooks 1893,59062
+int poll_suppress_count;1908,59401
+static struct atimer *poll_timer;poll_timer1915,59491
+poll_for_input_1 1919,59593
+poll_for_input 1930,59793
+start_polling 1942,60057
+input_polling_used 1979,61095
+stop_polling 1994,61394
+set_poll_suppress_count 2009,61763
+bind_polling_period 2029,62145
+make_ctrl_char 2048,62496
+show_help_echo 2113,64459
+static Lisp_Object help_form_saved_window_configs;2156,65642
+read_char_help_form_unwind 2158,65705
+#define STOP_POLLING   2166,65963
+#define RESUME_POLLING 2170,66088
+read_event_from_main_queue 2175,66233
+read_decoded_event_from_main_queue 2249,68421
+#define MAX_ENCODED_BYTES 2254,68668
+echo_keystrokes_p 2342,71560
+read_char 2376,72852
+record_menu_key 3225,98953
+help_char_p 3258,99678
+record_char 3273,99957
+save_getcjmp 3412,104239
+restore_getcjmp 3418,104330
+readable_events 3430,104701
+int stop_character EXTERNALLY_VISIBLE;3497,106441
+event_to_kboard 3500,106497
+kbd_buffer_nr_stored 3522,107146
+kbd_buffer_store_event 3534,107487
+kbd_buffer_store_event_hold 3550,108029
+kbd_buffer_unget_event 3684,111621
+#define INPUT_EVENT_POS_MAX 3698,112022
+#define INPUT_EVENT_POS_MIN 3701,112151
+position_to_Time 3706,112291
+Time_to_position 3716,112518
+gen_help_event 3738,113175
+kbd_buffer_store_help_event 3756,113615
+discard_mouse_events 3773,113980
+kbd_buffer_events_waiting 3803,114715
+clear_event 3823,115072
+kbd_buffer_get_event 3836,115412
+process_special_events 4258,127885
+swallow_events 4322,129709
+timer_start_idle 4339,130102
+timer_stop_idle 4355,130580
+timer_resume_idle 4363,130724
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130916
+Lisp_Object pending_funcalls;4377,131176
+decode_timer 4381,131297
+timer_check_2 4414,132250
+timer_check 4572,136821
+DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137666
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137666
+static Lisp_Object accent_key_syms;4625,138243
+static Lisp_Object func_key_syms;4626,138279
+static Lisp_Object mouse_syms;4627,138313
+static Lisp_Object wheel_syms;4628,138344
+static Lisp_Object drag_n_drop_syms;4629,138375
+static const int lispy_accent_codes[lispy_accent_codes4634,138520
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139882
+#define FUNCTION_KEY_OFFSET 4766,140318
+const char *const lispy_function_keys[lispy_function_keys4768,140351
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148905
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150139
+#define FUNCTION_KEY_OFFSET 5061,151755
+static const char *const lispy_function_keys[lispy_function_keys5065,151898
+#define ISO_FUNCTION_KEY_OFFSET 5149,154433
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154473
+static Lisp_Object Vlispy_mouse_stem;5172,155332
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155371
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155623
+static short const scroll_bar_parts[scroll_bar_parts5189,155889
+static Lisp_Object button_down_location;5210,156914
+static int last_mouse_button;5215,157069
+static int last_mouse_x;5216,157099
+static int last_mouse_y;5217,157124
+static Time button_down_time;5218,157149
+static int double_click_count;5222,157233
+make_lispy_position 5228,157394
+toolkit_menubar_in_use 5456,163957
+make_scroll_bar_position 5469,164325
+make_lispy_event 5485,164971
+make_lispy_movement 6104,183534
+make_lispy_switch_frame 6131,184265
+make_lispy_focus_in 6137,184372
+make_lispy_focus_out 6145,184498
+parse_modifiers_uncached 6163,184948
+#define SINGLE_LETTER_MOD(6185,185468
+#undef SINGLE_LETTER_MOD6212,185909
+#define MULTI_LETTER_MOD(6214,185935
+#undef MULTI_LETTER_MOD6231,186403
+apply_modifiers_uncached 6273,187577
+static const char *const modifier_names[modifier_names6319,189196
+#define NUM_MOD_NAMES 6325,189402
+static Lisp_Object modifier_symbols;6327,189452
+lispy_modifier_list 6331,189589
+#define KEY_TO_CHAR(6353,190255
+parse_modifiers 6356,190331
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191520
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191520
+apply_modifiers 6422,192394
+reorder_modifiers 6491,194723
+modify_event_symbol 6536,196531
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199247
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199247
+parse_solitary_modifier 6695,201138
+#define SINGLE_LETTER_MOD(6701,201261
+#define MULTI_LETTER_MOD(6705,201346
+#undef SINGLE_LETTER_MOD6763,202644
+#undef MULTI_LETTER_MOD6764,202669
+lucid_event_type_list_p 6775,202892
+get_input_pending 6814,203963
+record_asynch_buffer_change 6834,204582
+gobble_input 6872,205705
+tty_read_avail_input 6967,208313
+handle_async_input 7149,214042
+process_pending_signals 7165,214362
+unblock_input_to 7177,214648
+unblock_input 7200,215280
+totally_unblock_input 7209,215448
+handle_input_available_signal 7217,215532
+deliver_input_available_signal 7226,215703
+struct user_signal_info7235,215868
+  int sig;7238,215918
+  char *name;name7241,215959
+  int npending;7244,216010
+  struct user_signal_info *next;next7246,216027
+static struct user_signal_info *user_signals user_signals7250,216093
+add_user_signal 7253,216152
+handle_user_signal 7275,216601
+deliver_user_signal 7316,217561
+find_user_signal_name 7322,217662
+store_user_signal_events 7334,217844
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218419
+static Lisp_Object menu_bar_items_vector;7368,218633
+static int menu_bar_items_index;7369,218675
+static const char *separator_names[separator_names7372,218710
+menu_separator_name_p 7393,219151
+menu_bar_items 7426,219855
+Lisp_Object item_properties;7568,224606
+menu_bar_item 7571,224648
+menu_item_eval_property_1 7647,227178
+eval_dyn 7658,227468
+menu_item_eval_property 7666,227678
+parse_menu_item 7686,228344
+static Lisp_Object tool_bar_items_vector;7965,236339
+static Lisp_Object tool_bar_item_properties;7970,236513
+static int ntool_bar_items;7974,236609
+tool_bar_items 7990,237086
+process_tool_bar_item 8075,239895
+#define PROP(8112,240972
+set_prop 8114,241041
+parse_tool_bar_item 8167,242456
+#undef PROP8379,248847
+init_tool_bar_items 8387,248972
+append_tool_bar_item 8401,249264
+read_char_x_menu_prompt 8443,250774
+read_char_minibuf_menu_prompt 8503,252448
+#define PUSH_C_STR(8527,253017
+follow_key 8726,258556
+active_maps 8733,258698
+typedef struct keyremap8742,259024
+  Lisp_Object parent;8745,259110
+  Lisp_Object map;8748,259227
+  int start,8753,259449
+  int start, end;8753,259449
+} keyremap;8754,259467
+access_keymap_keyremap 8764,259811
+keyremap_step 8811,261453
+test_undefined 8867,262937
+read_key_sequence 8916,264864
+read_key_sequence_vs 9826,295824
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297297
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297297
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299985
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299985
+detect_input_pending 9950,300491
+detect_input_pending_ignore_squeezables 9959,300657
+detect_input_pending_run_timers 9967,300873
+clear_input_pending 9985,301365
+requeued_events_pending_p 9997,301735
+DEFUN ("input-pending-p", Finput_pending_p,10002,301816
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301816
+DEFUN ("recent-keys", Frecent_keys,10024,302599
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302599
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303520
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303520
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303961
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303961
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304383
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304383
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304958
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304958
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305498
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305498
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306513
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306513
+DEFUN ("recursion-depth", Frecursion_depth,10158,307072
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307072
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307409
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307409
+DEFUN ("discard-input", Fdiscard_input,10203,308450
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308450
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308952
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308952
+stuff_buffered_input 10285,311048
+set_waiting_for_input 10323,312019
+clear_waiting_for_input 10337,312393
+handle_interrupt_signal 10351,312757
+deliver_interrupt_signal 10378,313645
+static int volatile force_quit_count;10387,313935
+handle_interrupt 10401,314417
+quit_throw_to_read_char 10541,318714
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319291
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319291
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320519
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320519
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321435
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321435
+DEFUN ("set-quit-char", Fset_quit_char,10694,322709
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322709
+DEFUN ("set-input-mode", Fset_input_mode,10729,323573
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323573
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324462
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324462
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325840
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325840
+DEFUN ("posn-at-point", Fposn_at_point,10824,327063
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327063
+init_kboard 10861,328217
+allocate_kboard 10893,329287
+wipe_kboard 10909,329640
+delete_kboard 10917,329754
+init_keyboard 10942,330284
+struct event_head11021,332699
+  short var;11023,332719
+  short kind;11024,332732
+static const struct event_head head_table[head_table11027,332750
+syms_of_keyboard 11045,333580
+keys_of_keyboard 11841,367118
+mark_kboards 11916,370437
 
 c-src/emacs/src/lisp.h,27827
 #define EMACS_LISP_H22,801
@@ -2543,109 +2543,109 @@ el-src/emacs/lisp/progmodes/etags.el,5069
 (defcustom tags-tag-face 148,5700
 (defcustom tags-apropos-verbose 154,5835
 (defcustom tags-apropos-additional-actions 160,5999
-(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6918
-(defvar default-tags-table-function 189,7098
-(defvar tags-location-ring 194,7324
-(defvar tags-table-files 201,7600
-(defvar tags-completion-table 206,7767
-(defvar tags-included-tables 209,7859
-(defvar next-file-list 212,7954
-(defvar tags-table-format-functions 217,8060
-(defvar file-of-tag-function 224,8441
-(defvar tags-table-files-function 228,8635
-(defvar tags-completion-table-function 230,8746
-(defvar snarf-tag-function 232,8841
-(defvar goto-tag-location-function 236,9050
-(defvar find-tag-regexp-search-function 239,9223
-(defvar find-tag-regexp-tag-order 241,9344
-(defvar find-tag-regexp-next-line-after-failure-p 243,9453
-(defvar find-tag-search-function 245,9573
-(defvar find-tag-tag-order 247,9680
-(defvar find-tag-next-line-after-failure-p 249,9775
-(defvar list-tags-function 251,9881
-(defvar tags-apropos-function 253,9969
-(defvar tags-included-tables-function 255,10063
-(defvar verify-tags-table-function 257,10182
-(defun initialize-new-tags-table 260,10293
-(defun tags-table-mode 276,10981
-(defun visit-tags-table 285,11246
-(defun tags-table-check-computed-list 321,12784
-(defun tags-table-extend-computed-list 360,14655
-(defun tags-expand-table-name 400,16368
-(defun tags-table-list-member 409,16711
-(defun tags-verify-table 421,17183
-(defun tags-table-including 470,19303
-(defun tags-next-table 522,21347
-(defun visit-tags-table-buffer 543,22204
-(defun tags-reset-tags-tables 712,28514
-(defun file-of-tag 731,29171
-(defun tags-table-files 740,29521
-(defun tags-included-tables 749,29871
-(defun tags-completion-table 755,30117
-(defun tags-lazy-completion-table 783,31311
-(defun tags-completion-at-point-function 799,31946
-(defun find-tag-tag 818,32696
-(defvar last-tag 837,33369
-(defun find-tag-interactive 840,33428
-(defvar find-tag-history 852,33843
-(defun find-tag-noselect 860,34013
-(defun find-tag 932,37127
-(defun find-tag-other-window 959,38343
-(defun find-tag-other-frame 1000,40271
-(defun find-tag-regexp 1025,41445
-(defalias 'pop-tag-mark pop-tag-mark1049,42607
-(defvar tag-lines-already-matched 1052,42658
-(defun find-tag-in-order 1055,42765
-(defun tag-find-file-of-tag-noselect 1167,47111
-(defun tag-find-file-of-tag 1200,48957
-(defun etags-recognize-tags-table 1208,49183
-(defun etags-verify-tags-table 1241,50814
-(defun etags-file-of-tag 1246,51012
-(defun etags-tags-completion-table 1256,51347
-(defun etags-snarf-tag 1286,52553
-(defun etags-goto-tag-location 1324,54122
-(defun etags-list-tags 1388,56565
-(defmacro tags-with-face 1423,57840
-(defun etags-tags-apropos-additional 1431,58173
-(defun etags-tags-apropos 1465,59410
-(defun etags-tags-table-files 1527,61619
-(defun etags-tags-included-tables 1542,62055
-(defun tags-recognize-empty-tags-table 1559,62595
-(defun tag-exact-file-name-match-p 1587,63741
-(defun tag-file-name-match-p 1596,64134
-(defun tag-exact-match-p 1609,64690
-(defun tag-implicit-name-match-p 1620,65258
-(defun tag-symbol-match-p 1633,65858
-(defun tag-word-match-p 1643,66294
-(defun tag-partial-file-name-match-p 1652,66692
-(defun tag-any-match-p 1662,67136
-(defun tag-re-match-p 1667,67320
-(defcustom tags-loop-revert-buffers 1675,67569
-(defun next-file 1685,67978
-(defvar tags-loop-operate 1760,70892
-(defvar tags-loop-scan1763,70986
-(defun tags-loop-eval 1771,71315
-(defun tags-loop-continue 1782,71644
-(defun tags-search 1850,73950
-(defun tags-query-replace 1871,74776
-(defun tags-complete-tags-table-file 1896,76000
-(defun list-tags 1906,76379
-(defun tags-apropos 1934,77332
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78158
-(defun select-tags-table 1964,78397
-(defvar select-tags-table-mode-map 2019,80524
-(define-derived-mode select-tags-table-mode 2030,80907
-(defun select-tags-table-select 2034,81091
-(defun select-tags-table-quit 2043,81457
-(defun complete-tag 2049,81612
-(defconst etags--xref-limit 2074,82553
-(defvar etags-xref-find-definitions-tag-order 2076,82588
-(defun etags-xref-find 2082,82878
-(defun etags--xref-find-definitions 2096,83407
-(defclass xref-etags-location 2129,85121
-(defun xref-make-etags-location 2135,85344
-(cl-defmethod xref-location-marker 2139,85499
-(cl-defmethod xref-location-line 2146,85743
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6921
+(defvar default-tags-table-function 189,7101
+(defvar tags-location-ring 194,7327
+(defvar tags-table-files 201,7603
+(defvar tags-completion-table 206,7770
+(defvar tags-included-tables 209,7862
+(defvar next-file-list 212,7957
+(defvar tags-table-format-functions 217,8063
+(defvar file-of-tag-function 224,8444
+(defvar tags-table-files-function 228,8638
+(defvar tags-completion-table-function 230,8749
+(defvar snarf-tag-function 232,8844
+(defvar goto-tag-location-function 236,9053
+(defvar find-tag-regexp-search-function 239,9226
+(defvar find-tag-regexp-tag-order 241,9347
+(defvar find-tag-regexp-next-line-after-failure-p 243,9456
+(defvar find-tag-search-function 245,9576
+(defvar find-tag-tag-order 247,9683
+(defvar find-tag-next-line-after-failure-p 249,9778
+(defvar list-tags-function 251,9884
+(defvar tags-apropos-function 253,9972
+(defvar tags-included-tables-function 255,10066
+(defvar verify-tags-table-function 257,10185
+(defun initialize-new-tags-table 260,10296
+(defun tags-table-mode 276,10984
+(defun visit-tags-table 285,11249
+(defun tags-table-check-computed-list 321,12787
+(defun tags-table-extend-computed-list 360,14658
+(defun tags-expand-table-name 400,16371
+(defun tags-table-list-member 409,16714
+(defun tags-verify-table 421,17186
+(defun tags-table-including 470,19306
+(defun tags-next-table 522,21350
+(defun visit-tags-table-buffer 543,22207
+(defun tags-reset-tags-tables 712,28517
+(defun file-of-tag 731,29174
+(defun tags-table-files 740,29524
+(defun tags-included-tables 749,29874
+(defun tags-completion-table 755,30120
+(defun tags-lazy-completion-table 783,31314
+(defun tags-completion-at-point-function 799,31949
+(defun find-tag-tag 818,32699
+(defvar last-tag 837,33372
+(defun find-tag-interactive 840,33431
+(defvar find-tag-history 852,33846
+(defun find-tag-noselect 860,34016
+(defun find-tag 932,37130
+(defun find-tag-other-window 959,38346
+(defun find-tag-other-frame 1000,40274
+(defun find-tag-regexp 1025,41448
+(defalias 'pop-tag-mark pop-tag-mark1049,42610
+(defvar tag-lines-already-matched 1052,42661
+(defun find-tag-in-order 1055,42768
+(defun tag-find-file-of-tag-noselect 1167,47114
+(defun tag-find-file-of-tag 1200,48960
+(defun etags-recognize-tags-table 1208,49186
+(defun etags-verify-tags-table 1241,50817
+(defun etags-file-of-tag 1246,51015
+(defun etags-tags-completion-table 1256,51350
+(defun etags-snarf-tag 1286,52556
+(defun etags-goto-tag-location 1324,54125
+(defun etags-list-tags 1388,56568
+(defmacro tags-with-face 1423,57843
+(defun etags-tags-apropos-additional 1431,58176
+(defun etags-tags-apropos 1465,59413
+(defun etags-tags-table-files 1527,61622
+(defun etags-tags-included-tables 1542,62058
+(defun tags-recognize-empty-tags-table 1559,62598
+(defun tag-exact-file-name-match-p 1587,63744
+(defun tag-file-name-match-p 1596,64137
+(defun tag-exact-match-p 1609,64693
+(defun tag-implicit-name-match-p 1620,65261
+(defun tag-symbol-match-p 1633,65861
+(defun tag-word-match-p 1643,66297
+(defun tag-partial-file-name-match-p 1652,66695
+(defun tag-any-match-p 1662,67139
+(defun tag-re-match-p 1667,67323
+(defcustom tags-loop-revert-buffers 1675,67572
+(defun next-file 1685,67981
+(defvar tags-loop-operate 1760,70895
+(defvar tags-loop-scan1763,70989
+(defun tags-loop-eval 1771,71318
+(defun tags-loop-continue 1782,71647
+(defun tags-search 1850,73953
+(defun tags-query-replace 1871,74779
+(defun tags-complete-tags-table-file 1896,76003
+(defun list-tags 1906,76382
+(defun tags-apropos 1934,77335
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78161
+(defun select-tags-table 1964,78400
+(defvar select-tags-table-mode-map 2019,80527
+(define-derived-mode select-tags-table-mode 2030,80910
+(defun select-tags-table-select 2034,81094
+(defun select-tags-table-quit 2043,81460
+(defun complete-tag 2049,81615
+(defconst etags--xref-limit 2074,82556
+(defvar etags-xref-find-definitions-tag-order 2076,82591
+(defun etags-xref-find 2082,82881
+(defun etags--xref-find-definitions 2096,83410
+(defclass xref-etags-location 2129,85124
+(defun xref-make-etags-location 2135,85347
+(cl-defmethod xref-location-marker 2139,85502
+(cl-defmethod xref-location-line 2146,85746
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
diff --git a/test/manual/etags/ETAGS.good_4 b/test/manual/etags/ETAGS.good_4
index 8527ed726e..dee534ae75 100644
--- a/test/manual/etags/ETAGS.good_4
+++ b/test/manual/etags/ETAGS.good_4
@@ -937,417 +937,417 @@ record_auto_save 742,23849
 force_auto_save_soon 751,24017
 DEFUN ("recursive-edit", Frecursive_edit,759,24138
 DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24138
-recursive_edit_unwind 804,25748
-any_kboard_state 817,26014
-single_kboard_state 838,26666
-not_single_kboard_state 848,26804
-struct kboard_stack858,27066
-static struct kboard_stack *kboard_stack;kboard_stack864,27139
-push_kboard 867,27187
-pop_kboard 879,27376
-temporarily_switch_to_single_kboard 914,28264
-record_single_kboard_state 943,29438
-restore_kboard_configuration 952,29622
-cmd_error 970,30078
-cmd_error_internal 1024,31511
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32031
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32031
-command_loop 1094,33917
-command_loop_2 1134,35136
-top_level_2 1146,35340
-top_level_1 1152,35418
-DEFUN ("top-level", Ftop_level,1164,35788
-DEFUN ("top-level", Ftop_level,top-level1164,35788
-user_error 1183,36289
-DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36430
-DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36430
-DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36820
-DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36820
-tracking_off 1216,37282
-DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37817
-DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37817
-bool ignore_mouse_drag_p;1256,38393
-some_mouse_moved 1259,38442
-Lisp_Object last_undo_boundary;1287,39033
-command_loop_1 1294,39274
-read_menu_command 1649,50890
-adjust_point_for_property 1678,51618
-safe_run_hooks_1 1831,57340
-safe_run_hooks_error 1841,57570
-safe_run_hook_funcall 1878,58577
-safe_run_hooks 1893,59059
-int poll_suppress_count;1908,59398
-static struct atimer *poll_timer;poll_timer1915,59488
-poll_for_input_1 1919,59590
-poll_for_input 1930,59790
-start_polling 1942,60054
-input_polling_used 1979,61092
-stop_polling 1994,61391
-set_poll_suppress_count 2009,61760
-bind_polling_period 2029,62142
-make_ctrl_char 2048,62493
-show_help_echo 2113,64456
-static Lisp_Object help_form_saved_window_configs;2156,65639
-read_char_help_form_unwind 2158,65702
-#define STOP_POLLING   2166,65960
-#define RESUME_POLLING 2170,66085
-read_event_from_main_queue 2175,66230
-read_decoded_event_from_main_queue 2249,68418
-#define MAX_ENCODED_BYTES 2254,68665
-echo_keystrokes_p 2342,71557
-read_char 2376,72849
-record_menu_key 3225,98950
-help_char_p 3258,99675
-record_char 3273,99954
-save_getcjmp 3412,104236
-restore_getcjmp 3418,104327
-readable_events 3430,104698
-int stop_character EXTERNALLY_VISIBLE;3497,106438
-event_to_kboard 3500,106494
-kbd_buffer_nr_stored 3522,107143
-kbd_buffer_store_event 3534,107484
-kbd_buffer_store_event_hold 3550,108026
-kbd_buffer_unget_event 3684,111618
-#define INPUT_EVENT_POS_MAX 3698,112019
-#define INPUT_EVENT_POS_MIN 3701,112148
-position_to_Time 3706,112288
-Time_to_position 3716,112515
-gen_help_event 3738,113172
-kbd_buffer_store_help_event 3756,113612
-discard_mouse_events 3773,113977
-kbd_buffer_events_waiting 3803,114712
-clear_event 3823,115069
-kbd_buffer_get_event 3836,115409
-process_special_events 4258,127882
-swallow_events 4322,129706
-timer_start_idle 4339,130099
-timer_stop_idle 4355,130577
-timer_resume_idle 4363,130721
-struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130913
-Lisp_Object pending_funcalls;4377,131173
-decode_timer 4381,131294
-timer_check_2 4414,132247
-timer_check 4572,136818
-DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137663
-DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137663
-static Lisp_Object accent_key_syms;4625,138240
-static Lisp_Object func_key_syms;4626,138276
-static Lisp_Object mouse_syms;4627,138310
-static Lisp_Object wheel_syms;4628,138341
-static Lisp_Object drag_n_drop_syms;4629,138372
-static const int lispy_accent_codes[lispy_accent_codes4634,138517
-static const char *const lispy_accent_keys[lispy_accent_keys4741,139879
-#define FUNCTION_KEY_OFFSET 4766,140315
-const char *const lispy_function_keys[lispy_function_keys4768,140348
-static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148902
-static const char *const lispy_kana_keys[lispy_kana_keys5026,150136
-#define FUNCTION_KEY_OFFSET 5061,151752
-static const char *const lispy_function_keys[lispy_function_keys5065,151895
-#define ISO_FUNCTION_KEY_OFFSET 5149,154430
-static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154470
-static Lisp_Object Vlispy_mouse_stem;5172,155329
-static const char *const lispy_wheel_names[lispy_wheel_names5174,155368
-static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155620
-static short const scroll_bar_parts[scroll_bar_parts5189,155886
-static Lisp_Object button_down_location;5210,156911
-static int last_mouse_button;5215,157066
-static int last_mouse_x;5216,157096
-static int last_mouse_y;5217,157121
-static Time button_down_time;5218,157146
-static int double_click_count;5222,157230
-make_lispy_position 5228,157391
-toolkit_menubar_in_use 5456,163954
-make_scroll_bar_position 5469,164322
-make_lispy_event 5485,164968
-make_lispy_movement 6104,183531
-make_lispy_switch_frame 6131,184262
-make_lispy_focus_in 6137,184369
-make_lispy_focus_out 6145,184495
-parse_modifiers_uncached 6163,184945
-#define SINGLE_LETTER_MOD(6185,185465
-#undef SINGLE_LETTER_MOD6212,185906
-#define MULTI_LETTER_MOD(6214,185932
-#undef MULTI_LETTER_MOD6231,186400
-apply_modifiers_uncached 6273,187574
-static const char *const modifier_names[modifier_names6319,189193
-#define NUM_MOD_NAMES 6325,189399
-static Lisp_Object modifier_symbols;6327,189449
-lispy_modifier_list 6331,189586
-#define KEY_TO_CHAR(6353,190252
-parse_modifiers 6356,190328
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
-apply_modifiers 6422,192391
-reorder_modifiers 6491,194720
-modify_event_symbol 6536,196528
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
-parse_solitary_modifier 6695,201135
-#define SINGLE_LETTER_MOD(6701,201258
-#define MULTI_LETTER_MOD(6705,201343
-#undef SINGLE_LETTER_MOD6763,202641
-#undef MULTI_LETTER_MOD6764,202666
-lucid_event_type_list_p 6775,202889
-get_input_pending 6814,203960
-record_asynch_buffer_change 6834,204579
-gobble_input 6872,205702
-tty_read_avail_input 6967,208310
-handle_async_input 7149,214039
-process_pending_signals 7165,214359
-unblock_input_to 7177,214645
-unblock_input 7200,215277
-totally_unblock_input 7209,215445
-handle_input_available_signal 7217,215529
-deliver_input_available_signal 7226,215700
-struct user_signal_info7235,215865
-static struct user_signal_info *user_signals user_signals7250,216090
-add_user_signal 7253,216149
-handle_user_signal 7275,216598
-deliver_user_signal 7316,217558
-find_user_signal_name 7322,217659
-store_user_signal_events 7334,217841
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
-static Lisp_Object menu_bar_items_vector;7368,218630
-static int menu_bar_items_index;7369,218672
-static const char *separator_names[separator_names7372,218707
-menu_separator_name_p 7393,219148
-menu_bar_items 7426,219852
-Lisp_Object item_properties;7568,224603
-menu_bar_item 7571,224645
-menu_item_eval_property_1 7647,227175
-eval_dyn 7658,227465
-menu_item_eval_property 7666,227675
-parse_menu_item 7686,228341
-static Lisp_Object tool_bar_items_vector;7965,236336
-static Lisp_Object tool_bar_item_properties;7970,236510
-static int ntool_bar_items;7974,236606
-tool_bar_items 7990,237083
-process_tool_bar_item 8075,239892
-#define PROP(8112,240969
-set_prop 8114,241038
-parse_tool_bar_item 8167,242453
-#undef PROP8379,248844
-init_tool_bar_items 8387,248969
-append_tool_bar_item 8401,249261
-read_char_x_menu_prompt 8443,250771
-read_char_minibuf_menu_prompt 8503,252445
-#define PUSH_C_STR(8527,253014
-follow_key 8726,258553
-active_maps 8733,258695
-typedef struct keyremap8742,259021
-} keyremap;8754,259464
-access_keymap_keyremap 8764,259808
-keyremap_step 8811,261450
-test_undefined 8867,262934
-read_key_sequence 8916,264861
-read_key_sequence_vs 9826,295821
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
-detect_input_pending 9950,300488
-detect_input_pending_ignore_squeezables 9959,300654
-detect_input_pending_run_timers 9967,300870
-clear_input_pending 9985,301362
-requeued_events_pending_p 9997,301732
-DEFUN ("input-pending-p", Finput_pending_p,10002,301813
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
-DEFUN ("recent-keys", Frecent_keys,10024,302596
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
-DEFUN ("recursion-depth", Frecursion_depth,10158,307069
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
-DEFUN ("discard-input", Fdiscard_input,10203,308447
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
-stuff_buffered_input 10285,311045
-set_waiting_for_input 10323,312016
-clear_waiting_for_input 10337,312390
-handle_interrupt_signal 10351,312754
-deliver_interrupt_signal 10378,313642
-static int volatile force_quit_count;10387,313932
-handle_interrupt 10401,314414
-quit_throw_to_read_char 10541,318711
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
-DEFUN ("set-quit-char", Fset_quit_char,10694,322706
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
-DEFUN ("set-input-mode", Fset_input_mode,10729,323570
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
-DEFUN ("posn-at-point", Fposn_at_point,10824,327060
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
-init_kboard 10861,328214
-allocate_kboard 10893,329284
-wipe_kboard 10909,329637
-delete_kboard 10917,329751
-init_keyboard 10942,330281
-struct event_head11021,332696
-static const struct event_head head_table[head_table11027,332747
-syms_of_keyboard 11045,333577
-  DEFVAR_LISP ("internal--top-level-message"11058,333972
-  DEFVAR_LISP ("last-command-event"11312,342173
-  DEFVAR_LISP ("last-nonmenu-event"11315,342297
-  DEFVAR_LISP ("last-input-event"11321,342636
-  DEFVAR_LISP ("unread-command-events"11324,342730
-  DEFVAR_LISP ("unread-post-input-method-events"11332,343190
-  DEFVAR_LISP ("unread-input-method-events"11338,343529
-  DEFVAR_LISP ("meta-prefix-char"11346,343898
-  DEFVAR_KBOARD ("last-command"11351,344106
-  DEFVAR_KBOARD ("real-last-command"11368,344787
-  DEFVAR_KBOARD ("last-repeatable-command"11372,344973
-  DEFVAR_LISP ("this-command"11378,345261
-  DEFVAR_LISP ("real-this-command"11384,345498
-  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345680
-  DEFVAR_LISP ("this-original-command"11396,346123
-  DEFVAR_INT ("auto-save-interval"11403,346520
-  DEFVAR_LISP ("auto-save-timeout"11408,346734
-  DEFVAR_LISP ("echo-keystrokes"11415,347079
-  DEFVAR_INT ("polling-period"11421,347350
-  DEFVAR_LISP ("double-click-time"11428,347693
-  DEFVAR_INT ("double-click-fuzz"11435,348029
-  DEFVAR_INT ("num-input-keys"11446,348519
-  DEFVAR_INT ("num-nonmacro-input-events"11452,348794
-  DEFVAR_LISP ("last-event-frame"11457,349032
-  DEFVAR_LISP ("tty-erase-char"11463,349311
-  DEFVAR_LISP ("help-char"11466,349434
-  DEFVAR_LISP ("help-event-list"11472,349717
-  DEFVAR_LISP ("help-form"11477,349928
-  DEFVAR_LISP ("prefix-help-command"11483,350176
-  DEFVAR_LISP ("top-level"11489,350454
-  DEFVAR_KBOARD ("keyboard-translate-table"11495,350675
-  DEFVAR_BOOL ("cannot-suspend"11511,351488
-  DEFVAR_BOOL ("menu-prompting"11516,351715
-  DEFVAR_LISP ("menu-prompt-more-char"11526,352145
-  DEFVAR_INT ("extra-keyboard-modifiers"11531,352391
-  DEFVAR_LISP ("deactivate-mark"11545,353117
-  DEFVAR_LISP ("pre-command-hook"11553,353486
-  DEFVAR_LISP ("post-command-hook"11560,353841
-  DEFVAR_LISP ("echo-area-clear-hook"11568,354204
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354419
-  DEFVAR_LISP ("menu-bar-final-items"11578,354622
-  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354872
-  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355230
-  DEFVAR_LISP ("overriding-local-map"11598,355652
-  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356103
-  DEFVAR_LISP ("special-event-map"11613,356442
-  DEFVAR_LISP ("track-mouse"11617,356630
-  DEFVAR_KBOARD ("system-key-alist"11620,356757
-  DEFVAR_KBOARD ("local-function-key-map"11629,357138
-  DEFVAR_KBOARD ("input-decode-map"11658,358597
-  DEFVAR_LISP ("function-key-map"11675,359385
-  DEFVAR_LISP ("key-translation-map"11683,359801
-  DEFVAR_LISP ("deferred-action-list"11689,360145
-  DEFVAR_LISP ("deferred-action-function"11694,360393
-  DEFVAR_LISP ("delayed-warnings-list"11700,360692
-  DEFVAR_LISP ("timer-list"11708,361100
-  DEFVAR_LISP ("timer-idle-list"11712,361252
-  DEFVAR_LISP ("input-method-function"11716,361415
-  DEFVAR_LISP ("input-method-previous-message"11737,362384
-  DEFVAR_LISP ("show-help-function"11744,362745
-  DEFVAR_LISP ("disable-point-adjustment"11749,362977
-  DEFVAR_LISP ("global-disable-point-adjustment"11761,363527
-  DEFVAR_LISP ("minibuffer-message-timeout"11770,363893
-  DEFVAR_LISP ("throw-on-input"11775,364171
-  DEFVAR_LISP ("command-error-function"11781,364422
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364909
-  DEFVAR_LISP ("select-active-regions"11798,365236
-  DEFVAR_LISP ("saved-region-selection"11807,365628
-  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366013
-  DEFVAR_LISP ("debug-on-event"11825,366554
-keys_of_keyboard 11841,367115
-mark_kboards 11916,370434
-  DEFVAR_LISP ("internal--top-level-message",\111058,333972
-  DEFVAR_LISP ("last-command-event",\111312,342173
-  DEFVAR_LISP ("last-nonmenu-event",\111315,342297
-  DEFVAR_LISP ("last-input-event",\111321,342636
-  DEFVAR_LISP ("unread-command-events",\111324,342730
-  DEFVAR_LISP ("unread-post-input-method-events",\111332,343190
-  DEFVAR_LISP ("unread-input-method-events",\111338,343529
-  DEFVAR_LISP ("meta-prefix-char",\111346,343898
-  DEFVAR_KBOARD ("last-command",\111351,344106
-  DEFVAR_KBOARD ("real-last-command",\111368,344787
-  DEFVAR_KBOARD ("last-repeatable-command",\111372,344973
-  DEFVAR_LISP ("this-command",\111378,345261
-  DEFVAR_LISP ("real-this-command",\111384,345498
-  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345680
-  DEFVAR_LISP ("this-original-command",\111396,346123
-  DEFVAR_INT ("auto-save-interval",\111403,346520
-  DEFVAR_LISP ("auto-save-timeout",\111408,346734
-  DEFVAR_LISP ("echo-keystrokes",\111415,347079
-  DEFVAR_INT ("polling-period",\111421,347350
-  DEFVAR_LISP ("double-click-time",\111428,347693
-  DEFVAR_INT ("double-click-fuzz",\111435,348029
-  DEFVAR_INT ("num-input-keys",\111446,348519
-  DEFVAR_INT ("num-nonmacro-input-events",\111452,348794
-  DEFVAR_LISP ("last-event-frame",\111457,349032
-  DEFVAR_LISP ("tty-erase-char",\111463,349311
-  DEFVAR_LISP ("help-char",\111466,349434
-  DEFVAR_LISP ("help-event-list",\111472,349717
-  DEFVAR_LISP ("help-form",\111477,349928
-  DEFVAR_LISP ("prefix-help-command",\111483,350176
-  DEFVAR_LISP ("top-level",\111489,350454
-  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350675
-  DEFVAR_BOOL ("cannot-suspend",\111511,351488
-  DEFVAR_BOOL ("menu-prompting",\111516,351715
-  DEFVAR_LISP ("menu-prompt-more-char",\111526,352145
-  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352391
-  DEFVAR_LISP ("deactivate-mark",\111545,353117
-  DEFVAR_LISP ("pre-command-hook",\111553,353486
-  DEFVAR_LISP ("post-command-hook",\111560,353841
-  DEFVAR_LISP ("echo-area-clear-hook",\111568,354204
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354419
-  DEFVAR_LISP ("menu-bar-final-items",\111578,354622
-  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354872
-  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355230
-  DEFVAR_LISP ("overriding-local-map",\111598,355652
-  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356103
-  DEFVAR_LISP ("special-event-map",\111613,356442
-  DEFVAR_LISP ("track-mouse",\111617,356630
-  DEFVAR_KBOARD ("system-key-alist",\111620,356757
-  DEFVAR_KBOARD ("local-function-key-map",\111629,357138
-  DEFVAR_KBOARD ("input-decode-map",\111658,358597
-  DEFVAR_LISP ("function-key-map",\111675,359385
-  DEFVAR_LISP ("key-translation-map",\111683,359801
-  DEFVAR_LISP ("deferred-action-list",\111689,360145
-  DEFVAR_LISP ("deferred-action-function",\111694,360393
-  DEFVAR_LISP ("delayed-warnings-list",\111700,360692
-  DEFVAR_LISP ("timer-list",\111708,361100
-  DEFVAR_LISP ("timer-idle-list",\111712,361252
-  DEFVAR_LISP ("input-method-function",\111716,361415
-  DEFVAR_LISP ("input-method-previous-message",\111737,362384
-  DEFVAR_LISP ("show-help-function",\111744,362745
-  DEFVAR_LISP ("disable-point-adjustment",\111749,362977
-  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363527
-  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363893
-  DEFVAR_LISP ("throw-on-input",\111775,364171
-  DEFVAR_LISP ("command-error-function",\111781,364422
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364909
-  DEFVAR_LISP ("select-active-regions",\111798,365236
-  DEFVAR_LISP ("saved-region-selection",\111807,365628
-  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366013
-  DEFVAR_LISP ("debug-on-event",\111825,366554
+recursive_edit_unwind 804,25751
+any_kboard_state 817,26017
+single_kboard_state 838,26669
+not_single_kboard_state 848,26807
+struct kboard_stack858,27069
+static struct kboard_stack *kboard_stack;kboard_stack864,27142
+push_kboard 867,27190
+pop_kboard 879,27379
+temporarily_switch_to_single_kboard 914,28267
+record_single_kboard_state 943,29441
+restore_kboard_configuration 952,29625
+cmd_error 970,30081
+cmd_error_internal 1024,31514
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32034
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32034
+command_loop 1094,33920
+command_loop_2 1134,35139
+top_level_2 1146,35343
+top_level_1 1152,35421
+DEFUN ("top-level", Ftop_level,1164,35791
+DEFUN ("top-level", Ftop_level,top-level1164,35791
+user_error 1183,36292
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36433
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36433
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36823
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36823
+tracking_off 1216,37285
+DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37820
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37820
+bool ignore_mouse_drag_p;1256,38396
+some_mouse_moved 1259,38445
+Lisp_Object last_undo_boundary;1287,39036
+command_loop_1 1294,39277
+read_menu_command 1649,50893
+adjust_point_for_property 1678,51621
+safe_run_hooks_1 1831,57343
+safe_run_hooks_error 1841,57573
+safe_run_hook_funcall 1878,58580
+safe_run_hooks 1893,59062
+int poll_suppress_count;1908,59401
+static struct atimer *poll_timer;poll_timer1915,59491
+poll_for_input_1 1919,59593
+poll_for_input 1930,59793
+start_polling 1942,60057
+input_polling_used 1979,61095
+stop_polling 1994,61394
+set_poll_suppress_count 2009,61763
+bind_polling_period 2029,62145
+make_ctrl_char 2048,62496
+show_help_echo 2113,64459
+static Lisp_Object help_form_saved_window_configs;2156,65642
+read_char_help_form_unwind 2158,65705
+#define STOP_POLLING   2166,65963
+#define RESUME_POLLING 2170,66088
+read_event_from_main_queue 2175,66233
+read_decoded_event_from_main_queue 2249,68421
+#define MAX_ENCODED_BYTES 2254,68668
+echo_keystrokes_p 2342,71560
+read_char 2376,72852
+record_menu_key 3225,98953
+help_char_p 3258,99678
+record_char 3273,99957
+save_getcjmp 3412,104239
+restore_getcjmp 3418,104330
+readable_events 3430,104701
+int stop_character EXTERNALLY_VISIBLE;3497,106441
+event_to_kboard 3500,106497
+kbd_buffer_nr_stored 3522,107146
+kbd_buffer_store_event 3534,107487
+kbd_buffer_store_event_hold 3550,108029
+kbd_buffer_unget_event 3684,111621
+#define INPUT_EVENT_POS_MAX 3698,112022
+#define INPUT_EVENT_POS_MIN 3701,112151
+position_to_Time 3706,112291
+Time_to_position 3716,112518
+gen_help_event 3738,113175
+kbd_buffer_store_help_event 3756,113615
+discard_mouse_events 3773,113980
+kbd_buffer_events_waiting 3803,114715
+clear_event 3823,115072
+kbd_buffer_get_event 3836,115412
+process_special_events 4258,127885
+swallow_events 4322,129709
+timer_start_idle 4339,130102
+timer_stop_idle 4355,130580
+timer_resume_idle 4363,130724
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130916
+Lisp_Object pending_funcalls;4377,131176
+decode_timer 4381,131297
+timer_check_2 4414,132250
+timer_check 4572,136821
+DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137666
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137666
+static Lisp_Object accent_key_syms;4625,138243
+static Lisp_Object func_key_syms;4626,138279
+static Lisp_Object mouse_syms;4627,138313
+static Lisp_Object wheel_syms;4628,138344
+static Lisp_Object drag_n_drop_syms;4629,138375
+static const int lispy_accent_codes[lispy_accent_codes4634,138520
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139882
+#define FUNCTION_KEY_OFFSET 4766,140318
+const char *const lispy_function_keys[lispy_function_keys4768,140351
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148905
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150139
+#define FUNCTION_KEY_OFFSET 5061,151755
+static const char *const lispy_function_keys[lispy_function_keys5065,151898
+#define ISO_FUNCTION_KEY_OFFSET 5149,154433
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154473
+static Lisp_Object Vlispy_mouse_stem;5172,155332
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155371
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155623
+static short const scroll_bar_parts[scroll_bar_parts5189,155889
+static Lisp_Object button_down_location;5210,156914
+static int last_mouse_button;5215,157069
+static int last_mouse_x;5216,157099
+static int last_mouse_y;5217,157124
+static Time button_down_time;5218,157149
+static int double_click_count;5222,157233
+make_lispy_position 5228,157394
+toolkit_menubar_in_use 5456,163957
+make_scroll_bar_position 5469,164325
+make_lispy_event 5485,164971
+make_lispy_movement 6104,183534
+make_lispy_switch_frame 6131,184265
+make_lispy_focus_in 6137,184372
+make_lispy_focus_out 6145,184498
+parse_modifiers_uncached 6163,184948
+#define SINGLE_LETTER_MOD(6185,185468
+#undef SINGLE_LETTER_MOD6212,185909
+#define MULTI_LETTER_MOD(6214,185935
+#undef MULTI_LETTER_MOD6231,186403
+apply_modifiers_uncached 6273,187577
+static const char *const modifier_names[modifier_names6319,189196
+#define NUM_MOD_NAMES 6325,189402
+static Lisp_Object modifier_symbols;6327,189452
+lispy_modifier_list 6331,189589
+#define KEY_TO_CHAR(6353,190255
+parse_modifiers 6356,190331
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191520
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191520
+apply_modifiers 6422,192394
+reorder_modifiers 6491,194723
+modify_event_symbol 6536,196531
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199247
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199247
+parse_solitary_modifier 6695,201138
+#define SINGLE_LETTER_MOD(6701,201261
+#define MULTI_LETTER_MOD(6705,201346
+#undef SINGLE_LETTER_MOD6763,202644
+#undef MULTI_LETTER_MOD6764,202669
+lucid_event_type_list_p 6775,202892
+get_input_pending 6814,203963
+record_asynch_buffer_change 6834,204582
+gobble_input 6872,205705
+tty_read_avail_input 6967,208313
+handle_async_input 7149,214042
+process_pending_signals 7165,214362
+unblock_input_to 7177,214648
+unblock_input 7200,215280
+totally_unblock_input 7209,215448
+handle_input_available_signal 7217,215532
+deliver_input_available_signal 7226,215703
+struct user_signal_info7235,215868
+static struct user_signal_info *user_signals user_signals7250,216093
+add_user_signal 7253,216152
+handle_user_signal 7275,216601
+deliver_user_signal 7316,217561
+find_user_signal_name 7322,217662
+store_user_signal_events 7334,217844
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218419
+static Lisp_Object menu_bar_items_vector;7368,218633
+static int menu_bar_items_index;7369,218675
+static const char *separator_names[separator_names7372,218710
+menu_separator_name_p 7393,219151
+menu_bar_items 7426,219855
+Lisp_Object item_properties;7568,224606
+menu_bar_item 7571,224648
+menu_item_eval_property_1 7647,227178
+eval_dyn 7658,227468
+menu_item_eval_property 7666,227678
+parse_menu_item 7686,228344
+static Lisp_Object tool_bar_items_vector;7965,236339
+static Lisp_Object tool_bar_item_properties;7970,236513
+static int ntool_bar_items;7974,236609
+tool_bar_items 7990,237086
+process_tool_bar_item 8075,239895
+#define PROP(8112,240972
+set_prop 8114,241041
+parse_tool_bar_item 8167,242456
+#undef PROP8379,248847
+init_tool_bar_items 8387,248972
+append_tool_bar_item 8401,249264
+read_char_x_menu_prompt 8443,250774
+read_char_minibuf_menu_prompt 8503,252448
+#define PUSH_C_STR(8527,253017
+follow_key 8726,258556
+active_maps 8733,258698
+typedef struct keyremap8742,259024
+} keyremap;8754,259467
+access_keymap_keyremap 8764,259811
+keyremap_step 8811,261453
+test_undefined 8867,262937
+read_key_sequence 8916,264864
+read_key_sequence_vs 9826,295824
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297297
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297297
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299985
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299985
+detect_input_pending 9950,300491
+detect_input_pending_ignore_squeezables 9959,300657
+detect_input_pending_run_timers 9967,300873
+clear_input_pending 9985,301365
+requeued_events_pending_p 9997,301735
+DEFUN ("input-pending-p", Finput_pending_p,10002,301816
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301816
+DEFUN ("recent-keys", Frecent_keys,10024,302599
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302599
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303520
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303520
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303961
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303961
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304383
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304383
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304958
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304958
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305498
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305498
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306513
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306513
+DEFUN ("recursion-depth", Frecursion_depth,10158,307072
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307072
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307409
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307409
+DEFUN ("discard-input", Fdiscard_input,10203,308450
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308450
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308952
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308952
+stuff_buffered_input 10285,311048
+set_waiting_for_input 10323,312019
+clear_waiting_for_input 10337,312393
+handle_interrupt_signal 10351,312757
+deliver_interrupt_signal 10378,313645
+static int volatile force_quit_count;10387,313935
+handle_interrupt 10401,314417
+quit_throw_to_read_char 10541,318714
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319291
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319291
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320519
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320519
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321435
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321435
+DEFUN ("set-quit-char", Fset_quit_char,10694,322709
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322709
+DEFUN ("set-input-mode", Fset_input_mode,10729,323573
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323573
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324462
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324462
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325840
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325840
+DEFUN ("posn-at-point", Fposn_at_point,10824,327063
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327063
+init_kboard 10861,328217
+allocate_kboard 10893,329287
+wipe_kboard 10909,329640
+delete_kboard 10917,329754
+init_keyboard 10942,330284
+struct event_head11021,332699
+static const struct event_head head_table[head_table11027,332750
+syms_of_keyboard 11045,333580
+  DEFVAR_LISP ("internal--top-level-message"11058,333975
+  DEFVAR_LISP ("last-command-event"11312,342176
+  DEFVAR_LISP ("last-nonmenu-event"11315,342300
+  DEFVAR_LISP ("last-input-event"11321,342639
+  DEFVAR_LISP ("unread-command-events"11324,342733
+  DEFVAR_LISP ("unread-post-input-method-events"11332,343193
+  DEFVAR_LISP ("unread-input-method-events"11338,343532
+  DEFVAR_LISP ("meta-prefix-char"11346,343901
+  DEFVAR_KBOARD ("last-command"11351,344109
+  DEFVAR_KBOARD ("real-last-command"11368,344790
+  DEFVAR_KBOARD ("last-repeatable-command"11372,344976
+  DEFVAR_LISP ("this-command"11378,345264
+  DEFVAR_LISP ("real-this-command"11384,345501
+  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345683
+  DEFVAR_LISP ("this-original-command"11396,346126
+  DEFVAR_INT ("auto-save-interval"11403,346523
+  DEFVAR_LISP ("auto-save-timeout"11408,346737
+  DEFVAR_LISP ("echo-keystrokes"11415,347082
+  DEFVAR_INT ("polling-period"11421,347353
+  DEFVAR_LISP ("double-click-time"11428,347696
+  DEFVAR_INT ("double-click-fuzz"11435,348032
+  DEFVAR_INT ("num-input-keys"11446,348522
+  DEFVAR_INT ("num-nonmacro-input-events"11452,348797
+  DEFVAR_LISP ("last-event-frame"11457,349035
+  DEFVAR_LISP ("tty-erase-char"11463,349314
+  DEFVAR_LISP ("help-char"11466,349437
+  DEFVAR_LISP ("help-event-list"11472,349720
+  DEFVAR_LISP ("help-form"11477,349931
+  DEFVAR_LISP ("prefix-help-command"11483,350179
+  DEFVAR_LISP ("top-level"11489,350457
+  DEFVAR_KBOARD ("keyboard-translate-table"11495,350678
+  DEFVAR_BOOL ("cannot-suspend"11511,351491
+  DEFVAR_BOOL ("menu-prompting"11516,351718
+  DEFVAR_LISP ("menu-prompt-more-char"11526,352148
+  DEFVAR_INT ("extra-keyboard-modifiers"11531,352394
+  DEFVAR_LISP ("deactivate-mark"11545,353120
+  DEFVAR_LISP ("pre-command-hook"11553,353489
+  DEFVAR_LISP ("post-command-hook"11560,353844
+  DEFVAR_LISP ("echo-area-clear-hook"11568,354207
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354422
+  DEFVAR_LISP ("menu-bar-final-items"11578,354625
+  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354875
+  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355233
+  DEFVAR_LISP ("overriding-local-map"11598,355655
+  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356106
+  DEFVAR_LISP ("special-event-map"11613,356445
+  DEFVAR_LISP ("track-mouse"11617,356633
+  DEFVAR_KBOARD ("system-key-alist"11620,356760
+  DEFVAR_KBOARD ("local-function-key-map"11629,357141
+  DEFVAR_KBOARD ("input-decode-map"11658,358600
+  DEFVAR_LISP ("function-key-map"11675,359388
+  DEFVAR_LISP ("key-translation-map"11683,359804
+  DEFVAR_LISP ("deferred-action-list"11689,360148
+  DEFVAR_LISP ("deferred-action-function"11694,360396
+  DEFVAR_LISP ("delayed-warnings-list"11700,360695
+  DEFVAR_LISP ("timer-list"11708,361103
+  DEFVAR_LISP ("timer-idle-list"11712,361255
+  DEFVAR_LISP ("input-method-function"11716,361418
+  DEFVAR_LISP ("input-method-previous-message"11737,362387
+  DEFVAR_LISP ("show-help-function"11744,362748
+  DEFVAR_LISP ("disable-point-adjustment"11749,362980
+  DEFVAR_LISP ("global-disable-point-adjustment"11761,363530
+  DEFVAR_LISP ("minibuffer-message-timeout"11770,363896
+  DEFVAR_LISP ("throw-on-input"11775,364174
+  DEFVAR_LISP ("command-error-function"11781,364425
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364912
+  DEFVAR_LISP ("select-active-regions"11798,365239
+  DEFVAR_LISP ("saved-region-selection"11807,365631
+  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366016
+  DEFVAR_LISP ("debug-on-event"11825,366557
+keys_of_keyboard 11841,367118
+mark_kboards 11916,370437
+  DEFVAR_LISP ("internal--top-level-message",\111058,333975
+  DEFVAR_LISP ("last-command-event",\111312,342176
+  DEFVAR_LISP ("last-nonmenu-event",\111315,342300
+  DEFVAR_LISP ("last-input-event",\111321,342639
+  DEFVAR_LISP ("unread-command-events",\111324,342733
+  DEFVAR_LISP ("unread-post-input-method-events",\111332,343193
+  DEFVAR_LISP ("unread-input-method-events",\111338,343532
+  DEFVAR_LISP ("meta-prefix-char",\111346,343901
+  DEFVAR_KBOARD ("last-command",\111351,344109
+  DEFVAR_KBOARD ("real-last-command",\111368,344790
+  DEFVAR_KBOARD ("last-repeatable-command",\111372,344976
+  DEFVAR_LISP ("this-command",\111378,345264
+  DEFVAR_LISP ("real-this-command",\111384,345501
+  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345683
+  DEFVAR_LISP ("this-original-command",\111396,346126
+  DEFVAR_INT ("auto-save-interval",\111403,346523
+  DEFVAR_LISP ("auto-save-timeout",\111408,346737
+  DEFVAR_LISP ("echo-keystrokes",\111415,347082
+  DEFVAR_INT ("polling-period",\111421,347353
+  DEFVAR_LISP ("double-click-time",\111428,347696
+  DEFVAR_INT ("double-click-fuzz",\111435,348032
+  DEFVAR_INT ("num-input-keys",\111446,348522
+  DEFVAR_INT ("num-nonmacro-input-events",\111452,348797
+  DEFVAR_LISP ("last-event-frame",\111457,349035
+  DEFVAR_LISP ("tty-erase-char",\111463,349314
+  DEFVAR_LISP ("help-char",\111466,349437
+  DEFVAR_LISP ("help-event-list",\111472,349720
+  DEFVAR_LISP ("help-form",\111477,349931
+  DEFVAR_LISP ("prefix-help-command",\111483,350179
+  DEFVAR_LISP ("top-level",\111489,350457
+  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350678
+  DEFVAR_BOOL ("cannot-suspend",\111511,351491
+  DEFVAR_BOOL ("menu-prompting",\111516,351718
+  DEFVAR_LISP ("menu-prompt-more-char",\111526,352148
+  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352394
+  DEFVAR_LISP ("deactivate-mark",\111545,353120
+  DEFVAR_LISP ("pre-command-hook",\111553,353489
+  DEFVAR_LISP ("post-command-hook",\111560,353844
+  DEFVAR_LISP ("echo-area-clear-hook",\111568,354207
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354422
+  DEFVAR_LISP ("menu-bar-final-items",\111578,354625
+  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354875
+  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355233
+  DEFVAR_LISP ("overriding-local-map",\111598,355655
+  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356106
+  DEFVAR_LISP ("special-event-map",\111613,356445
+  DEFVAR_LISP ("track-mouse",\111617,356633
+  DEFVAR_KBOARD ("system-key-alist",\111620,356760
+  DEFVAR_KBOARD ("local-function-key-map",\111629,357141
+  DEFVAR_KBOARD ("input-decode-map",\111658,358600
+  DEFVAR_LISP ("function-key-map",\111675,359388
+  DEFVAR_LISP ("key-translation-map",\111683,359804
+  DEFVAR_LISP ("deferred-action-list",\111689,360148
+  DEFVAR_LISP ("deferred-action-function",\111694,360396
+  DEFVAR_LISP ("delayed-warnings-list",\111700,360695
+  DEFVAR_LISP ("timer-list",\111708,361103
+  DEFVAR_LISP ("timer-idle-list",\111712,361255
+  DEFVAR_LISP ("input-method-function",\111716,361418
+  DEFVAR_LISP ("input-method-previous-message",\111737,362387
+  DEFVAR_LISP ("show-help-function",\111744,362748
+  DEFVAR_LISP ("disable-point-adjustment",\111749,362980
+  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363530
+  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363896
+  DEFVAR_LISP ("throw-on-input",\111775,364174
+  DEFVAR_LISP ("command-error-function",\111781,364425
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364912
+  DEFVAR_LISP ("select-active-regions",\111798,365239
+  DEFVAR_LISP ("saved-region-selection",\111807,365631
+  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366016
+  DEFVAR_LISP ("debug-on-event",\111825,366557
 
 c-src/emacs/src/lisp.h,20276
 #define EMACS_LISP_H22,801
@@ -2328,109 +2328,109 @@ el-src/emacs/lisp/progmodes/etags.el,5069
 (defcustom tags-tag-face 148,5700
 (defcustom tags-apropos-verbose 154,5835
 (defcustom tags-apropos-additional-actions 160,5999
-(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6918
-(defvar default-tags-table-function 189,7098
-(defvar tags-location-ring 194,7324
-(defvar tags-table-files 201,7600
-(defvar tags-completion-table 206,7767
-(defvar tags-included-tables 209,7859
-(defvar next-file-list 212,7954
-(defvar tags-table-format-functions 217,8060
-(defvar file-of-tag-function 224,8441
-(defvar tags-table-files-function 228,8635
-(defvar tags-completion-table-function 230,8746
-(defvar snarf-tag-function 232,8841
-(defvar goto-tag-location-function 236,9050
-(defvar find-tag-regexp-search-function 239,9223
-(defvar find-tag-regexp-tag-order 241,9344
-(defvar find-tag-regexp-next-line-after-failure-p 243,9453
-(defvar find-tag-search-function 245,9573
-(defvar find-tag-tag-order 247,9680
-(defvar find-tag-next-line-after-failure-p 249,9775
-(defvar list-tags-function 251,9881
-(defvar tags-apropos-function 253,9969
-(defvar tags-included-tables-function 255,10063
-(defvar verify-tags-table-function 257,10182
-(defun initialize-new-tags-table 260,10293
-(defun tags-table-mode 276,10981
-(defun visit-tags-table 285,11246
-(defun tags-table-check-computed-list 321,12784
-(defun tags-table-extend-computed-list 360,14655
-(defun tags-expand-table-name 400,16368
-(defun tags-table-list-member 409,16711
-(defun tags-verify-table 421,17183
-(defun tags-table-including 470,19303
-(defun tags-next-table 522,21347
-(defun visit-tags-table-buffer 543,22204
-(defun tags-reset-tags-tables 712,28514
-(defun file-of-tag 731,29171
-(defun tags-table-files 740,29521
-(defun tags-included-tables 749,29871
-(defun tags-completion-table 755,30117
-(defun tags-lazy-completion-table 783,31311
-(defun tags-completion-at-point-function 799,31946
-(defun find-tag-tag 818,32696
-(defvar last-tag 837,33369
-(defun find-tag-interactive 840,33428
-(defvar find-tag-history 852,33843
-(defun find-tag-noselect 860,34013
-(defun find-tag 932,37127
-(defun find-tag-other-window 959,38343
-(defun find-tag-other-frame 1000,40271
-(defun find-tag-regexp 1025,41445
-(defalias 'pop-tag-mark pop-tag-mark1049,42607
-(defvar tag-lines-already-matched 1052,42658
-(defun find-tag-in-order 1055,42765
-(defun tag-find-file-of-tag-noselect 1167,47111
-(defun tag-find-file-of-tag 1200,48957
-(defun etags-recognize-tags-table 1208,49183
-(defun etags-verify-tags-table 1241,50814
-(defun etags-file-of-tag 1246,51012
-(defun etags-tags-completion-table 1256,51347
-(defun etags-snarf-tag 1286,52553
-(defun etags-goto-tag-location 1324,54122
-(defun etags-list-tags 1388,56565
-(defmacro tags-with-face 1423,57840
-(defun etags-tags-apropos-additional 1431,58173
-(defun etags-tags-apropos 1465,59410
-(defun etags-tags-table-files 1527,61619
-(defun etags-tags-included-tables 1542,62055
-(defun tags-recognize-empty-tags-table 1559,62595
-(defun tag-exact-file-name-match-p 1587,63741
-(defun tag-file-name-match-p 1596,64134
-(defun tag-exact-match-p 1609,64690
-(defun tag-implicit-name-match-p 1620,65258
-(defun tag-symbol-match-p 1633,65858
-(defun tag-word-match-p 1643,66294
-(defun tag-partial-file-name-match-p 1652,66692
-(defun tag-any-match-p 1662,67136
-(defun tag-re-match-p 1667,67320
-(defcustom tags-loop-revert-buffers 1675,67569
-(defun next-file 1685,67978
-(defvar tags-loop-operate 1760,70892
-(defvar tags-loop-scan1763,70986
-(defun tags-loop-eval 1771,71315
-(defun tags-loop-continue 1782,71644
-(defun tags-search 1850,73950
-(defun tags-query-replace 1871,74776
-(defun tags-complete-tags-table-file 1896,76000
-(defun list-tags 1906,76379
-(defun tags-apropos 1934,77332
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78158
-(defun select-tags-table 1964,78397
-(defvar select-tags-table-mode-map 2019,80524
-(define-derived-mode select-tags-table-mode 2030,80907
-(defun select-tags-table-select 2034,81091
-(defun select-tags-table-quit 2043,81457
-(defun complete-tag 2049,81612
-(defconst etags--xref-limit 2074,82553
-(defvar etags-xref-find-definitions-tag-order 2076,82588
-(defun etags-xref-find 2082,82878
-(defun etags--xref-find-definitions 2096,83407
-(defclass xref-etags-location 2129,85121
-(defun xref-make-etags-location 2135,85344
-(cl-defmethod xref-location-marker 2139,85499
-(cl-defmethod xref-location-line 2146,85743
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6921
+(defvar default-tags-table-function 189,7101
+(defvar tags-location-ring 194,7327
+(defvar tags-table-files 201,7603
+(defvar tags-completion-table 206,7770
+(defvar tags-included-tables 209,7862
+(defvar next-file-list 212,7957
+(defvar tags-table-format-functions 217,8063
+(defvar file-of-tag-function 224,8444
+(defvar tags-table-files-function 228,8638
+(defvar tags-completion-table-function 230,8749
+(defvar snarf-tag-function 232,8844
+(defvar goto-tag-location-function 236,9053
+(defvar find-tag-regexp-search-function 239,9226
+(defvar find-tag-regexp-tag-order 241,9347
+(defvar find-tag-regexp-next-line-after-failure-p 243,9456
+(defvar find-tag-search-function 245,9576
+(defvar find-tag-tag-order 247,9683
+(defvar find-tag-next-line-after-failure-p 249,9778
+(defvar list-tags-function 251,9884
+(defvar tags-apropos-function 253,9972
+(defvar tags-included-tables-function 255,10066
+(defvar verify-tags-table-function 257,10185
+(defun initialize-new-tags-table 260,10296
+(defun tags-table-mode 276,10984
+(defun visit-tags-table 285,11249
+(defun tags-table-check-computed-list 321,12787
+(defun tags-table-extend-computed-list 360,14658
+(defun tags-expand-table-name 400,16371
+(defun tags-table-list-member 409,16714
+(defun tags-verify-table 421,17186
+(defun tags-table-including 470,19306
+(defun tags-next-table 522,21350
+(defun visit-tags-table-buffer 543,22207
+(defun tags-reset-tags-tables 712,28517
+(defun file-of-tag 731,29174
+(defun tags-table-files 740,29524
+(defun tags-included-tables 749,29874
+(defun tags-completion-table 755,30120
+(defun tags-lazy-completion-table 783,31314
+(defun tags-completion-at-point-function 799,31949
+(defun find-tag-tag 818,32699
+(defvar last-tag 837,33372
+(defun find-tag-interactive 840,33431
+(defvar find-tag-history 852,33846
+(defun find-tag-noselect 860,34016
+(defun find-tag 932,37130
+(defun find-tag-other-window 959,38346
+(defun find-tag-other-frame 1000,40274
+(defun find-tag-regexp 1025,41448
+(defalias 'pop-tag-mark pop-tag-mark1049,42610
+(defvar tag-lines-already-matched 1052,42661
+(defun find-tag-in-order 1055,42768
+(defun tag-find-file-of-tag-noselect 1167,47114
+(defun tag-find-file-of-tag 1200,48960
+(defun etags-recognize-tags-table 1208,49186
+(defun etags-verify-tags-table 1241,50817
+(defun etags-file-of-tag 1246,51015
+(defun etags-tags-completion-table 1256,51350
+(defun etags-snarf-tag 1286,52556
+(defun etags-goto-tag-location 1324,54125
+(defun etags-list-tags 1388,56568
+(defmacro tags-with-face 1423,57843
+(defun etags-tags-apropos-additional 1431,58176
+(defun etags-tags-apropos 1465,59413
+(defun etags-tags-table-files 1527,61622
+(defun etags-tags-included-tables 1542,62058
+(defun tags-recognize-empty-tags-table 1559,62598
+(defun tag-exact-file-name-match-p 1587,63744
+(defun tag-file-name-match-p 1596,64137
+(defun tag-exact-match-p 1609,64693
+(defun tag-implicit-name-match-p 1620,65261
+(defun tag-symbol-match-p 1633,65861
+(defun tag-word-match-p 1643,66297
+(defun tag-partial-file-name-match-p 1652,66695
+(defun tag-any-match-p 1662,67139
+(defun tag-re-match-p 1667,67323
+(defcustom tags-loop-revert-buffers 1675,67572
+(defun next-file 1685,67981
+(defvar tags-loop-operate 1760,70895
+(defvar tags-loop-scan1763,70989
+(defun tags-loop-eval 1771,71318
+(defun tags-loop-continue 1782,71647
+(defun tags-search 1850,73953
+(defun tags-query-replace 1871,74779
+(defun tags-complete-tags-table-file 1896,76003
+(defun list-tags 1906,76382
+(defun tags-apropos 1934,77335
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78161
+(defun select-tags-table 1964,78400
+(defvar select-tags-table-mode-map 2019,80527
+(define-derived-mode select-tags-table-mode 2030,80910
+(defun select-tags-table-select 2034,81094
+(defun select-tags-table-quit 2043,81460
+(defun complete-tag 2049,81615
+(defconst etags--xref-limit 2074,82556
+(defvar etags-xref-find-definitions-tag-order 2076,82591
+(defun etags-xref-find 2082,82881
+(defun etags--xref-find-definitions 2096,83410
+(defclass xref-etags-location 2129,85124
+(defun xref-make-etags-location 2135,85347
+(cl-defmethod xref-location-marker 2139,85502
+(cl-defmethod xref-location-line 2146,85746
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
diff --git a/test/manual/etags/ETAGS.good_5 b/test/manual/etags/ETAGS.good_5
index 6d2e44fbfe..6410685cb3 100644
--- a/test/manual/etags/ETAGS.good_5
+++ b/test/manual/etags/ETAGS.good_5
@@ -1234,440 +1234,440 @@ record_auto_save 742,23849
 force_auto_save_soon 751,24017
 DEFUN ("recursive-edit", Frecursive_edit,759,24138
 DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24138
-recursive_edit_unwind 804,25748
-any_kboard_state 817,26014
-single_kboard_state 838,26666
-not_single_kboard_state 848,26804
-struct kboard_stack858,27066
-  KBOARD *kboard;kboard860,27088
-  struct kboard_stack *next;next861,27106
-static struct kboard_stack *kboard_stack;kboard_stack864,27139
-push_kboard 867,27187
-pop_kboard 879,27376
-temporarily_switch_to_single_kboard 914,28264
-record_single_kboard_state 943,29438
-restore_kboard_configuration 952,29622
-cmd_error 970,30078
-cmd_error_internal 1024,31511
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32031
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32031
-static Lisp_Object command_loop_2 1086,33638
-static Lisp_Object top_level_1 1087,33687
-command_loop 1094,33917
-command_loop_2 1134,35136
-top_level_2 1146,35340
-top_level_1 1152,35418
-DEFUN ("top-level", Ftop_level,1164,35788
-DEFUN ("top-level", Ftop_level,top-level1164,35788
-user_error 1183,36289
-DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36430
-DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36430
-DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36820
-DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36820
-tracking_off 1216,37282
-DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37817
-DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37817
-bool ignore_mouse_drag_p;1256,38393
-some_mouse_moved 1259,38442
-static int read_key_sequence 1282,38800
-static void adjust_point_for_property 1284,38918
-Lisp_Object last_undo_boundary;1287,39033
-command_loop_1 1294,39274
-read_menu_command 1649,50890
-adjust_point_for_property 1678,51618
-safe_run_hooks_1 1831,57340
-safe_run_hooks_error 1841,57570
-safe_run_hook_funcall 1878,58577
-safe_run_hooks 1893,59059
-int poll_suppress_count;1908,59398
-static struct atimer *poll_timer;poll_timer1915,59488
-poll_for_input_1 1919,59590
-poll_for_input 1930,59790
-start_polling 1942,60054
-input_polling_used 1979,61092
-stop_polling 1994,61391
-set_poll_suppress_count 2009,61760
-bind_polling_period 2029,62142
-make_ctrl_char 2048,62493
-show_help_echo 2113,64456
-static Lisp_Object kbd_buffer_get_event 2152,65485
-static void record_char 2154,65597
-static Lisp_Object help_form_saved_window_configs;2156,65639
-read_char_help_form_unwind 2158,65702
-#define STOP_POLLING   2166,65960
-#define RESUME_POLLING 2170,66085
-read_event_from_main_queue 2175,66230
-read_decoded_event_from_main_queue 2249,68418
-#define MAX_ENCODED_BYTES 2254,68665
-echo_keystrokes_p 2342,71557
-read_char 2376,72849
-record_menu_key 3225,98950
-help_char_p 3258,99675
-record_char 3273,99954
-save_getcjmp 3412,104236
-restore_getcjmp 3418,104327
-readable_events 3430,104698
-int stop_character EXTERNALLY_VISIBLE;3497,106438
-event_to_kboard 3500,106494
-kbd_buffer_nr_stored 3522,107143
-kbd_buffer_store_event 3534,107484
-kbd_buffer_store_event_hold 3550,108026
-kbd_buffer_unget_event 3684,111618
-#define INPUT_EVENT_POS_MAX 3698,112019
-#define INPUT_EVENT_POS_MIN 3701,112148
-position_to_Time 3706,112288
-Time_to_position 3716,112515
-gen_help_event 3738,113172
-kbd_buffer_store_help_event 3756,113612
-discard_mouse_events 3773,113977
-kbd_buffer_events_waiting 3803,114712
-clear_event 3823,115069
-kbd_buffer_get_event 3836,115409
-process_special_events 4258,127882
-swallow_events 4322,129706
-timer_start_idle 4339,130099
-timer_stop_idle 4355,130577
-timer_resume_idle 4363,130721
-struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130913
-Lisp_Object pending_funcalls;4377,131173
-decode_timer 4381,131294
-timer_check_2 4414,132247
-timer_check 4572,136818
-DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137663
-DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137663
-static Lisp_Object accent_key_syms;4625,138240
-static Lisp_Object func_key_syms;4626,138276
-static Lisp_Object mouse_syms;4627,138310
-static Lisp_Object wheel_syms;4628,138341
-static Lisp_Object drag_n_drop_syms;4629,138372
-static const int lispy_accent_codes[lispy_accent_codes4634,138517
-static const char *const lispy_accent_keys[lispy_accent_keys4741,139879
-#define FUNCTION_KEY_OFFSET 4766,140315
-const char *const lispy_function_keys[lispy_function_keys4768,140348
-static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148902
-static const char *const lispy_kana_keys[lispy_kana_keys5026,150136
-#define FUNCTION_KEY_OFFSET 5061,151752
-static const char *const lispy_function_keys[lispy_function_keys5065,151895
-#define ISO_FUNCTION_KEY_OFFSET 5149,154430
-static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154470
-static Lisp_Object Vlispy_mouse_stem;5172,155329
-static const char *const lispy_wheel_names[lispy_wheel_names5174,155368
-static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155620
-static short const scroll_bar_parts[scroll_bar_parts5189,155886
-static Lisp_Object button_down_location;5210,156911
-static int last_mouse_button;5215,157066
-static int last_mouse_x;5216,157096
-static int last_mouse_y;5217,157121
-static Time button_down_time;5218,157146
-static int double_click_count;5222,157230
-make_lispy_position 5228,157391
-toolkit_menubar_in_use 5456,163954
-make_scroll_bar_position 5469,164322
-make_lispy_event 5485,164968
-make_lispy_movement 6104,183531
-make_lispy_switch_frame 6131,184262
-make_lispy_focus_in 6137,184369
-make_lispy_focus_out 6145,184495
-parse_modifiers_uncached 6163,184945
-#define SINGLE_LETTER_MOD(6185,185465
-#undef SINGLE_LETTER_MOD6212,185906
-#define MULTI_LETTER_MOD(6214,185932
-#undef MULTI_LETTER_MOD6231,186400
-apply_modifiers_uncached 6273,187574
-static const char *const modifier_names[modifier_names6319,189193
-#define NUM_MOD_NAMES 6325,189399
-static Lisp_Object modifier_symbols;6327,189449
-lispy_modifier_list 6331,189586
-#define KEY_TO_CHAR(6353,190252
-parse_modifiers 6356,190328
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
-apply_modifiers 6422,192391
-reorder_modifiers 6491,194720
-modify_event_symbol 6536,196528
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
-parse_solitary_modifier 6695,201135
-#define SINGLE_LETTER_MOD(6701,201258
-#define MULTI_LETTER_MOD(6705,201343
-#undef SINGLE_LETTER_MOD6763,202641
-#undef MULTI_LETTER_MOD6764,202666
-lucid_event_type_list_p 6775,202889
-get_input_pending 6814,203960
-record_asynch_buffer_change 6834,204579
-gobble_input 6872,205702
-tty_read_avail_input 6967,208310
-handle_async_input 7149,214039
-process_pending_signals 7165,214359
-unblock_input_to 7177,214645
-unblock_input 7200,215277
-totally_unblock_input 7209,215445
-handle_input_available_signal 7217,215529
-deliver_input_available_signal 7226,215700
-struct user_signal_info7235,215865
-  int sig;7238,215915
-  char *name;name7241,215956
-  int npending;7244,216007
-  struct user_signal_info *next;next7246,216024
-static struct user_signal_info *user_signals user_signals7250,216090
-add_user_signal 7253,216149
-handle_user_signal 7275,216598
-deliver_user_signal 7316,217558
-find_user_signal_name 7322,217659
-store_user_signal_events 7334,217841
-static void menu_bar_item 7362,218341
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
-static Lisp_Object menu_bar_items_vector;7368,218630
-static int menu_bar_items_index;7369,218672
-static const char *separator_names[separator_names7372,218707
-menu_separator_name_p 7393,219148
-menu_bar_items 7426,219852
-Lisp_Object item_properties;7568,224603
-menu_bar_item 7571,224645
-menu_item_eval_property_1 7647,227175
-eval_dyn 7658,227465
-menu_item_eval_property 7666,227675
-parse_menu_item 7686,228341
-static Lisp_Object tool_bar_items_vector;7965,236336
-static Lisp_Object tool_bar_item_properties;7970,236510
-static int ntool_bar_items;7974,236606
-static void init_tool_bar_items 7978,236664
-static void process_tool_bar_item 7979,236711
-static bool parse_tool_bar_item 7981,236801
-static void append_tool_bar_item 7982,236861
-tool_bar_items 7990,237083
-process_tool_bar_item 8075,239892
-#define PROP(8112,240969
-set_prop 8114,241038
-parse_tool_bar_item 8167,242453
-#undef PROP8379,248844
-init_tool_bar_items 8387,248969
-append_tool_bar_item 8401,249261
-read_char_x_menu_prompt 8443,250771
-read_char_minibuf_menu_prompt 8503,252445
-#define PUSH_C_STR(8527,253014
-follow_key 8726,258553
-active_maps 8733,258695
-typedef struct keyremap8742,259021
-  Lisp_Object parent;8745,259107
-  Lisp_Object map;8748,259224
-  int start,8753,259446
-  int start, end;8753,259446
-} keyremap;8754,259464
-access_keymap_keyremap 8764,259808
-keyremap_step 8811,261450
-test_undefined 8867,262934
-read_key_sequence 8916,264861
-read_key_sequence_vs 9826,295821
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
-detect_input_pending 9950,300488
-detect_input_pending_ignore_squeezables 9959,300654
-detect_input_pending_run_timers 9967,300870
-clear_input_pending 9985,301362
-requeued_events_pending_p 9997,301732
-DEFUN ("input-pending-p", Finput_pending_p,10002,301813
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
-DEFUN ("recent-keys", Frecent_keys,10024,302596
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
-DEFUN ("recursion-depth", Frecursion_depth,10158,307069
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
-DEFUN ("discard-input", Fdiscard_input,10203,308447
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
-stuff_buffered_input 10285,311045
-set_waiting_for_input 10323,312016
-clear_waiting_for_input 10337,312390
-handle_interrupt_signal 10351,312754
-deliver_interrupt_signal 10378,313642
-static int volatile force_quit_count;10387,313932
-handle_interrupt 10401,314414
-quit_throw_to_read_char 10541,318711
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
-DEFUN ("set-quit-char", Fset_quit_char,10694,322706
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
-DEFUN ("set-input-mode", Fset_input_mode,10729,323570
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
-DEFUN ("posn-at-point", Fposn_at_point,10824,327060
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
-init_kboard 10861,328214
-allocate_kboard 10893,329284
-wipe_kboard 10909,329637
-delete_kboard 10917,329751
-init_keyboard 10942,330281
-struct event_head11021,332696
-  short var;11023,332716
-  short kind;11024,332729
-static const struct event_head head_table[head_table11027,332747
-syms_of_keyboard 11045,333577
-  DEFVAR_LISP ("internal--top-level-message"11058,333972
-  DEFVAR_LISP ("last-command-event"11312,342173
-  DEFVAR_LISP ("last-nonmenu-event"11315,342297
-  DEFVAR_LISP ("last-input-event"11321,342636
-  DEFVAR_LISP ("unread-command-events"11324,342730
-  DEFVAR_LISP ("unread-post-input-method-events"11332,343190
-  DEFVAR_LISP ("unread-input-method-events"11338,343529
-  DEFVAR_LISP ("meta-prefix-char"11346,343898
-  DEFVAR_KBOARD ("last-command"11351,344106
-  DEFVAR_KBOARD ("real-last-command"11368,344787
-  DEFVAR_KBOARD ("last-repeatable-command"11372,344973
-  DEFVAR_LISP ("this-command"11378,345261
-  DEFVAR_LISP ("real-this-command"11384,345498
-  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345680
-  DEFVAR_LISP ("this-original-command"11396,346123
-  DEFVAR_INT ("auto-save-interval"11403,346520
-  DEFVAR_LISP ("auto-save-timeout"11408,346734
-  DEFVAR_LISP ("echo-keystrokes"11415,347079
-  DEFVAR_INT ("polling-period"11421,347350
-  DEFVAR_LISP ("double-click-time"11428,347693
-  DEFVAR_INT ("double-click-fuzz"11435,348029
-  DEFVAR_INT ("num-input-keys"11446,348519
-  DEFVAR_INT ("num-nonmacro-input-events"11452,348794
-  DEFVAR_LISP ("last-event-frame"11457,349032
-  DEFVAR_LISP ("tty-erase-char"11463,349311
-  DEFVAR_LISP ("help-char"11466,349434
-  DEFVAR_LISP ("help-event-list"11472,349717
-  DEFVAR_LISP ("help-form"11477,349928
-  DEFVAR_LISP ("prefix-help-command"11483,350176
-  DEFVAR_LISP ("top-level"11489,350454
-  DEFVAR_KBOARD ("keyboard-translate-table"11495,350675
-  DEFVAR_BOOL ("cannot-suspend"11511,351488
-  DEFVAR_BOOL ("menu-prompting"11516,351715
-  DEFVAR_LISP ("menu-prompt-more-char"11526,352145
-  DEFVAR_INT ("extra-keyboard-modifiers"11531,352391
-  DEFVAR_LISP ("deactivate-mark"11545,353117
-  DEFVAR_LISP ("pre-command-hook"11553,353486
-  DEFVAR_LISP ("post-command-hook"11560,353841
-  DEFVAR_LISP ("echo-area-clear-hook"11568,354204
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354419
-  DEFVAR_LISP ("menu-bar-final-items"11578,354622
-  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354872
-  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355230
-  DEFVAR_LISP ("overriding-local-map"11598,355652
-  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356103
-  DEFVAR_LISP ("special-event-map"11613,356442
-  DEFVAR_LISP ("track-mouse"11617,356630
-  DEFVAR_KBOARD ("system-key-alist"11620,356757
-  DEFVAR_KBOARD ("local-function-key-map"11629,357138
-  DEFVAR_KBOARD ("input-decode-map"11658,358597
-  DEFVAR_LISP ("function-key-map"11675,359385
-  DEFVAR_LISP ("key-translation-map"11683,359801
-  DEFVAR_LISP ("deferred-action-list"11689,360145
-  DEFVAR_LISP ("deferred-action-function"11694,360393
-  DEFVAR_LISP ("delayed-warnings-list"11700,360692
-  DEFVAR_LISP ("timer-list"11708,361100
-  DEFVAR_LISP ("timer-idle-list"11712,361252
-  DEFVAR_LISP ("input-method-function"11716,361415
-  DEFVAR_LISP ("input-method-previous-message"11737,362384
-  DEFVAR_LISP ("show-help-function"11744,362745
-  DEFVAR_LISP ("disable-point-adjustment"11749,362977
-  DEFVAR_LISP ("global-disable-point-adjustment"11761,363527
-  DEFVAR_LISP ("minibuffer-message-timeout"11770,363893
-  DEFVAR_LISP ("throw-on-input"11775,364171
-  DEFVAR_LISP ("command-error-function"11781,364422
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364909
-  DEFVAR_LISP ("select-active-regions"11798,365236
-  DEFVAR_LISP ("saved-region-selection"11807,365628
-  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366013
-  DEFVAR_LISP ("debug-on-event"11825,366554
-keys_of_keyboard 11841,367115
-mark_kboards 11916,370434
-  DEFVAR_LISP ("internal--top-level-message",\111058,333972
-  DEFVAR_LISP ("last-command-event",\111312,342173
-  DEFVAR_LISP ("last-nonmenu-event",\111315,342297
-  DEFVAR_LISP ("last-input-event",\111321,342636
-  DEFVAR_LISP ("unread-command-events",\111324,342730
-  DEFVAR_LISP ("unread-post-input-method-events",\111332,343190
-  DEFVAR_LISP ("unread-input-method-events",\111338,343529
-  DEFVAR_LISP ("meta-prefix-char",\111346,343898
-  DEFVAR_KBOARD ("last-command",\111351,344106
-  DEFVAR_KBOARD ("real-last-command",\111368,344787
-  DEFVAR_KBOARD ("last-repeatable-command",\111372,344973
-  DEFVAR_LISP ("this-command",\111378,345261
-  DEFVAR_LISP ("real-this-command",\111384,345498
-  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345680
-  DEFVAR_LISP ("this-original-command",\111396,346123
-  DEFVAR_INT ("auto-save-interval",\111403,346520
-  DEFVAR_LISP ("auto-save-timeout",\111408,346734
-  DEFVAR_LISP ("echo-keystrokes",\111415,347079
-  DEFVAR_INT ("polling-period",\111421,347350
-  DEFVAR_LISP ("double-click-time",\111428,347693
-  DEFVAR_INT ("double-click-fuzz",\111435,348029
-  DEFVAR_INT ("num-input-keys",\111446,348519
-  DEFVAR_INT ("num-nonmacro-input-events",\111452,348794
-  DEFVAR_LISP ("last-event-frame",\111457,349032
-  DEFVAR_LISP ("tty-erase-char",\111463,349311
-  DEFVAR_LISP ("help-char",\111466,349434
-  DEFVAR_LISP ("help-event-list",\111472,349717
-  DEFVAR_LISP ("help-form",\111477,349928
-  DEFVAR_LISP ("prefix-help-command",\111483,350176
-  DEFVAR_LISP ("top-level",\111489,350454
-  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350675
-  DEFVAR_BOOL ("cannot-suspend",\111511,351488
-  DEFVAR_BOOL ("menu-prompting",\111516,351715
-  DEFVAR_LISP ("menu-prompt-more-char",\111526,352145
-  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352391
-  DEFVAR_LISP ("deactivate-mark",\111545,353117
-  DEFVAR_LISP ("pre-command-hook",\111553,353486
-  DEFVAR_LISP ("post-command-hook",\111560,353841
-  DEFVAR_LISP ("echo-area-clear-hook",\111568,354204
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354419
-  DEFVAR_LISP ("menu-bar-final-items",\111578,354622
-  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354872
-  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355230
-  DEFVAR_LISP ("overriding-local-map",\111598,355652
-  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356103
-  DEFVAR_LISP ("special-event-map",\111613,356442
-  DEFVAR_LISP ("track-mouse",\111617,356630
-  DEFVAR_KBOARD ("system-key-alist",\111620,356757
-  DEFVAR_KBOARD ("local-function-key-map",\111629,357138
-  DEFVAR_KBOARD ("input-decode-map",\111658,358597
-  DEFVAR_LISP ("function-key-map",\111675,359385
-  DEFVAR_LISP ("key-translation-map",\111683,359801
-  DEFVAR_LISP ("deferred-action-list",\111689,360145
-  DEFVAR_LISP ("deferred-action-function",\111694,360393
-  DEFVAR_LISP ("delayed-warnings-list",\111700,360692
-  DEFVAR_LISP ("timer-list",\111708,361100
-  DEFVAR_LISP ("timer-idle-list",\111712,361252
-  DEFVAR_LISP ("input-method-function",\111716,361415
-  DEFVAR_LISP ("input-method-previous-message",\111737,362384
-  DEFVAR_LISP ("show-help-function",\111744,362745
-  DEFVAR_LISP ("disable-point-adjustment",\111749,362977
-  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363527
-  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363893
-  DEFVAR_LISP ("throw-on-input",\111775,364171
-  DEFVAR_LISP ("command-error-function",\111781,364422
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364909
-  DEFVAR_LISP ("select-active-regions",\111798,365236
-  DEFVAR_LISP ("saved-region-selection",\111807,365628
-  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366013
-  DEFVAR_LISP ("debug-on-event",\111825,366554
+recursive_edit_unwind 804,25751
+any_kboard_state 817,26017
+single_kboard_state 838,26669
+not_single_kboard_state 848,26807
+struct kboard_stack858,27069
+  KBOARD *kboard;kboard860,27091
+  struct kboard_stack *next;next861,27109
+static struct kboard_stack *kboard_stack;kboard_stack864,27142
+push_kboard 867,27190
+pop_kboard 879,27379
+temporarily_switch_to_single_kboard 914,28267
+record_single_kboard_state 943,29441
+restore_kboard_configuration 952,29625
+cmd_error 970,30081
+cmd_error_internal 1024,31514
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32034
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32034
+static Lisp_Object command_loop_2 1086,33641
+static Lisp_Object top_level_1 1087,33690
+command_loop 1094,33920
+command_loop_2 1134,35139
+top_level_2 1146,35343
+top_level_1 1152,35421
+DEFUN ("top-level", Ftop_level,1164,35791
+DEFUN ("top-level", Ftop_level,top-level1164,35791
+user_error 1183,36292
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36433
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36433
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36823
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36823
+tracking_off 1216,37285
+DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37820
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37820
+bool ignore_mouse_drag_p;1256,38396
+some_mouse_moved 1259,38445
+static int read_key_sequence 1282,38803
+static void adjust_point_for_property 1284,38921
+Lisp_Object last_undo_boundary;1287,39036
+command_loop_1 1294,39277
+read_menu_command 1649,50893
+adjust_point_for_property 1678,51621
+safe_run_hooks_1 1831,57343
+safe_run_hooks_error 1841,57573
+safe_run_hook_funcall 1878,58580
+safe_run_hooks 1893,59062
+int poll_suppress_count;1908,59401
+static struct atimer *poll_timer;poll_timer1915,59491
+poll_for_input_1 1919,59593
+poll_for_input 1930,59793
+start_polling 1942,60057
+input_polling_used 1979,61095
+stop_polling 1994,61394
+set_poll_suppress_count 2009,61763
+bind_polling_period 2029,62145
+make_ctrl_char 2048,62496
+show_help_echo 2113,64459
+static Lisp_Object kbd_buffer_get_event 2152,65488
+static void record_char 2154,65600
+static Lisp_Object help_form_saved_window_configs;2156,65642
+read_char_help_form_unwind 2158,65705
+#define STOP_POLLING   2166,65963
+#define RESUME_POLLING 2170,66088
+read_event_from_main_queue 2175,66233
+read_decoded_event_from_main_queue 2249,68421
+#define MAX_ENCODED_BYTES 2254,68668
+echo_keystrokes_p 2342,71560
+read_char 2376,72852
+record_menu_key 3225,98953
+help_char_p 3258,99678
+record_char 3273,99957
+save_getcjmp 3412,104239
+restore_getcjmp 3418,104330
+readable_events 3430,104701
+int stop_character EXTERNALLY_VISIBLE;3497,106441
+event_to_kboard 3500,106497
+kbd_buffer_nr_stored 3522,107146
+kbd_buffer_store_event 3534,107487
+kbd_buffer_store_event_hold 3550,108029
+kbd_buffer_unget_event 3684,111621
+#define INPUT_EVENT_POS_MAX 3698,112022
+#define INPUT_EVENT_POS_MIN 3701,112151
+position_to_Time 3706,112291
+Time_to_position 3716,112518
+gen_help_event 3738,113175
+kbd_buffer_store_help_event 3756,113615
+discard_mouse_events 3773,113980
+kbd_buffer_events_waiting 3803,114715
+clear_event 3823,115072
+kbd_buffer_get_event 3836,115412
+process_special_events 4258,127885
+swallow_events 4322,129709
+timer_start_idle 4339,130102
+timer_stop_idle 4355,130580
+timer_resume_idle 4363,130724
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130916
+Lisp_Object pending_funcalls;4377,131176
+decode_timer 4381,131297
+timer_check_2 4414,132250
+timer_check 4572,136821
+DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137666
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137666
+static Lisp_Object accent_key_syms;4625,138243
+static Lisp_Object func_key_syms;4626,138279
+static Lisp_Object mouse_syms;4627,138313
+static Lisp_Object wheel_syms;4628,138344
+static Lisp_Object drag_n_drop_syms;4629,138375
+static const int lispy_accent_codes[lispy_accent_codes4634,138520
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139882
+#define FUNCTION_KEY_OFFSET 4766,140318
+const char *const lispy_function_keys[lispy_function_keys4768,140351
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148905
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150139
+#define FUNCTION_KEY_OFFSET 5061,151755
+static const char *const lispy_function_keys[lispy_function_keys5065,151898
+#define ISO_FUNCTION_KEY_OFFSET 5149,154433
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154473
+static Lisp_Object Vlispy_mouse_stem;5172,155332
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155371
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155623
+static short const scroll_bar_parts[scroll_bar_parts5189,155889
+static Lisp_Object button_down_location;5210,156914
+static int last_mouse_button;5215,157069
+static int last_mouse_x;5216,157099
+static int last_mouse_y;5217,157124
+static Time button_down_time;5218,157149
+static int double_click_count;5222,157233
+make_lispy_position 5228,157394
+toolkit_menubar_in_use 5456,163957
+make_scroll_bar_position 5469,164325
+make_lispy_event 5485,164971
+make_lispy_movement 6104,183534
+make_lispy_switch_frame 6131,184265
+make_lispy_focus_in 6137,184372
+make_lispy_focus_out 6145,184498
+parse_modifiers_uncached 6163,184948
+#define SINGLE_LETTER_MOD(6185,185468
+#undef SINGLE_LETTER_MOD6212,185909
+#define MULTI_LETTER_MOD(6214,185935
+#undef MULTI_LETTER_MOD6231,186403
+apply_modifiers_uncached 6273,187577
+static const char *const modifier_names[modifier_names6319,189196
+#define NUM_MOD_NAMES 6325,189402
+static Lisp_Object modifier_symbols;6327,189452
+lispy_modifier_list 6331,189589
+#define KEY_TO_CHAR(6353,190255
+parse_modifiers 6356,190331
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191520
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191520
+apply_modifiers 6422,192394
+reorder_modifiers 6491,194723
+modify_event_symbol 6536,196531
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199247
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199247
+parse_solitary_modifier 6695,201138
+#define SINGLE_LETTER_MOD(6701,201261
+#define MULTI_LETTER_MOD(6705,201346
+#undef SINGLE_LETTER_MOD6763,202644
+#undef MULTI_LETTER_MOD6764,202669
+lucid_event_type_list_p 6775,202892
+get_input_pending 6814,203963
+record_asynch_buffer_change 6834,204582
+gobble_input 6872,205705
+tty_read_avail_input 6967,208313
+handle_async_input 7149,214042
+process_pending_signals 7165,214362
+unblock_input_to 7177,214648
+unblock_input 7200,215280
+totally_unblock_input 7209,215448
+handle_input_available_signal 7217,215532
+deliver_input_available_signal 7226,215703
+struct user_signal_info7235,215868
+  int sig;7238,215918
+  char *name;name7241,215959
+  int npending;7244,216010
+  struct user_signal_info *next;next7246,216027
+static struct user_signal_info *user_signals user_signals7250,216093
+add_user_signal 7253,216152
+handle_user_signal 7275,216601
+deliver_user_signal 7316,217561
+find_user_signal_name 7322,217662
+store_user_signal_events 7334,217844
+static void menu_bar_item 7362,218344
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218419
+static Lisp_Object menu_bar_items_vector;7368,218633
+static int menu_bar_items_index;7369,218675
+static const char *separator_names[separator_names7372,218710
+menu_separator_name_p 7393,219151
+menu_bar_items 7426,219855
+Lisp_Object item_properties;7568,224606
+menu_bar_item 7571,224648
+menu_item_eval_property_1 7647,227178
+eval_dyn 7658,227468
+menu_item_eval_property 7666,227678
+parse_menu_item 7686,228344
+static Lisp_Object tool_bar_items_vector;7965,236339
+static Lisp_Object tool_bar_item_properties;7970,236513
+static int ntool_bar_items;7974,236609
+static void init_tool_bar_items 7978,236667
+static void process_tool_bar_item 7979,236714
+static bool parse_tool_bar_item 7981,236804
+static void append_tool_bar_item 7982,236864
+tool_bar_items 7990,237086
+process_tool_bar_item 8075,239895
+#define PROP(8112,240972
+set_prop 8114,241041
+parse_tool_bar_item 8167,242456
+#undef PROP8379,248847
+init_tool_bar_items 8387,248972
+append_tool_bar_item 8401,249264
+read_char_x_menu_prompt 8443,250774
+read_char_minibuf_menu_prompt 8503,252448
+#define PUSH_C_STR(8527,253017
+follow_key 8726,258556
+active_maps 8733,258698
+typedef struct keyremap8742,259024
+  Lisp_Object parent;8745,259110
+  Lisp_Object map;8748,259227
+  int start,8753,259449
+  int start, end;8753,259449
+} keyremap;8754,259467
+access_keymap_keyremap 8764,259811
+keyremap_step 8811,261453
+test_undefined 8867,262937
+read_key_sequence 8916,264864
+read_key_sequence_vs 9826,295824
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297297
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297297
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299985
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299985
+detect_input_pending 9950,300491
+detect_input_pending_ignore_squeezables 9959,300657
+detect_input_pending_run_timers 9967,300873
+clear_input_pending 9985,301365
+requeued_events_pending_p 9997,301735
+DEFUN ("input-pending-p", Finput_pending_p,10002,301816
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301816
+DEFUN ("recent-keys", Frecent_keys,10024,302599
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302599
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303520
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303520
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303961
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303961
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304383
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304383
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304958
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304958
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305498
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305498
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306513
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306513
+DEFUN ("recursion-depth", Frecursion_depth,10158,307072
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307072
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307409
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307409
+DEFUN ("discard-input", Fdiscard_input,10203,308450
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308450
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308952
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308952
+stuff_buffered_input 10285,311048
+set_waiting_for_input 10323,312019
+clear_waiting_for_input 10337,312393
+handle_interrupt_signal 10351,312757
+deliver_interrupt_signal 10378,313645
+static int volatile force_quit_count;10387,313935
+handle_interrupt 10401,314417
+quit_throw_to_read_char 10541,318714
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319291
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319291
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320519
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320519
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321435
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321435
+DEFUN ("set-quit-char", Fset_quit_char,10694,322709
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322709
+DEFUN ("set-input-mode", Fset_input_mode,10729,323573
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323573
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324462
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324462
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325840
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325840
+DEFUN ("posn-at-point", Fposn_at_point,10824,327063
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327063
+init_kboard 10861,328217
+allocate_kboard 10893,329287
+wipe_kboard 10909,329640
+delete_kboard 10917,329754
+init_keyboard 10942,330284
+struct event_head11021,332699
+  short var;11023,332719
+  short kind;11024,332732
+static const struct event_head head_table[head_table11027,332750
+syms_of_keyboard 11045,333580
+  DEFVAR_LISP ("internal--top-level-message"11058,333975
+  DEFVAR_LISP ("last-command-event"11312,342176
+  DEFVAR_LISP ("last-nonmenu-event"11315,342300
+  DEFVAR_LISP ("last-input-event"11321,342639
+  DEFVAR_LISP ("unread-command-events"11324,342733
+  DEFVAR_LISP ("unread-post-input-method-events"11332,343193
+  DEFVAR_LISP ("unread-input-method-events"11338,343532
+  DEFVAR_LISP ("meta-prefix-char"11346,343901
+  DEFVAR_KBOARD ("last-command"11351,344109
+  DEFVAR_KBOARD ("real-last-command"11368,344790
+  DEFVAR_KBOARD ("last-repeatable-command"11372,344976
+  DEFVAR_LISP ("this-command"11378,345264
+  DEFVAR_LISP ("real-this-command"11384,345501
+  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345683
+  DEFVAR_LISP ("this-original-command"11396,346126
+  DEFVAR_INT ("auto-save-interval"11403,346523
+  DEFVAR_LISP ("auto-save-timeout"11408,346737
+  DEFVAR_LISP ("echo-keystrokes"11415,347082
+  DEFVAR_INT ("polling-period"11421,347353
+  DEFVAR_LISP ("double-click-time"11428,347696
+  DEFVAR_INT ("double-click-fuzz"11435,348032
+  DEFVAR_INT ("num-input-keys"11446,348522
+  DEFVAR_INT ("num-nonmacro-input-events"11452,348797
+  DEFVAR_LISP ("last-event-frame"11457,349035
+  DEFVAR_LISP ("tty-erase-char"11463,349314
+  DEFVAR_LISP ("help-char"11466,349437
+  DEFVAR_LISP ("help-event-list"11472,349720
+  DEFVAR_LISP ("help-form"11477,349931
+  DEFVAR_LISP ("prefix-help-command"11483,350179
+  DEFVAR_LISP ("top-level"11489,350457
+  DEFVAR_KBOARD ("keyboard-translate-table"11495,350678
+  DEFVAR_BOOL ("cannot-suspend"11511,351491
+  DEFVAR_BOOL ("menu-prompting"11516,351718
+  DEFVAR_LISP ("menu-prompt-more-char"11526,352148
+  DEFVAR_INT ("extra-keyboard-modifiers"11531,352394
+  DEFVAR_LISP ("deactivate-mark"11545,353120
+  DEFVAR_LISP ("pre-command-hook"11553,353489
+  DEFVAR_LISP ("post-command-hook"11560,353844
+  DEFVAR_LISP ("echo-area-clear-hook"11568,354207
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354422
+  DEFVAR_LISP ("menu-bar-final-items"11578,354625
+  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354875
+  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355233
+  DEFVAR_LISP ("overriding-local-map"11598,355655
+  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356106
+  DEFVAR_LISP ("special-event-map"11613,356445
+  DEFVAR_LISP ("track-mouse"11617,356633
+  DEFVAR_KBOARD ("system-key-alist"11620,356760
+  DEFVAR_KBOARD ("local-function-key-map"11629,357141
+  DEFVAR_KBOARD ("input-decode-map"11658,358600
+  DEFVAR_LISP ("function-key-map"11675,359388
+  DEFVAR_LISP ("key-translation-map"11683,359804
+  DEFVAR_LISP ("deferred-action-list"11689,360148
+  DEFVAR_LISP ("deferred-action-function"11694,360396
+  DEFVAR_LISP ("delayed-warnings-list"11700,360695
+  DEFVAR_LISP ("timer-list"11708,361103
+  DEFVAR_LISP ("timer-idle-list"11712,361255
+  DEFVAR_LISP ("input-method-function"11716,361418
+  DEFVAR_LISP ("input-method-previous-message"11737,362387
+  DEFVAR_LISP ("show-help-function"11744,362748
+  DEFVAR_LISP ("disable-point-adjustment"11749,362980
+  DEFVAR_LISP ("global-disable-point-adjustment"11761,363530
+  DEFVAR_LISP ("minibuffer-message-timeout"11770,363896
+  DEFVAR_LISP ("throw-on-input"11775,364174
+  DEFVAR_LISP ("command-error-function"11781,364425
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364912
+  DEFVAR_LISP ("select-active-regions"11798,365239
+  DEFVAR_LISP ("saved-region-selection"11807,365631
+  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366016
+  DEFVAR_LISP ("debug-on-event"11825,366557
+keys_of_keyboard 11841,367118
+mark_kboards 11916,370437
+  DEFVAR_LISP ("internal--top-level-message",\111058,333975
+  DEFVAR_LISP ("last-command-event",\111312,342176
+  DEFVAR_LISP ("last-nonmenu-event",\111315,342300
+  DEFVAR_LISP ("last-input-event",\111321,342639
+  DEFVAR_LISP ("unread-command-events",\111324,342733
+  DEFVAR_LISP ("unread-post-input-method-events",\111332,343193
+  DEFVAR_LISP ("unread-input-method-events",\111338,343532
+  DEFVAR_LISP ("meta-prefix-char",\111346,343901
+  DEFVAR_KBOARD ("last-command",\111351,344109
+  DEFVAR_KBOARD ("real-last-command",\111368,344790
+  DEFVAR_KBOARD ("last-repeatable-command",\111372,344976
+  DEFVAR_LISP ("this-command",\111378,345264
+  DEFVAR_LISP ("real-this-command",\111384,345501
+  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345683
+  DEFVAR_LISP ("this-original-command",\111396,346126
+  DEFVAR_INT ("auto-save-interval",\111403,346523
+  DEFVAR_LISP ("auto-save-timeout",\111408,346737
+  DEFVAR_LISP ("echo-keystrokes",\111415,347082
+  DEFVAR_INT ("polling-period",\111421,347353
+  DEFVAR_LISP ("double-click-time",\111428,347696
+  DEFVAR_INT ("double-click-fuzz",\111435,348032
+  DEFVAR_INT ("num-input-keys",\111446,348522
+  DEFVAR_INT ("num-nonmacro-input-events",\111452,348797
+  DEFVAR_LISP ("last-event-frame",\111457,349035
+  DEFVAR_LISP ("tty-erase-char",\111463,349314
+  DEFVAR_LISP ("help-char",\111466,349437
+  DEFVAR_LISP ("help-event-list",\111472,349720
+  DEFVAR_LISP ("help-form",\111477,349931
+  DEFVAR_LISP ("prefix-help-command",\111483,350179
+  DEFVAR_LISP ("top-level",\111489,350457
+  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350678
+  DEFVAR_BOOL ("cannot-suspend",\111511,351491
+  DEFVAR_BOOL ("menu-prompting",\111516,351718
+  DEFVAR_LISP ("menu-prompt-more-char",\111526,352148
+  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352394
+  DEFVAR_LISP ("deactivate-mark",\111545,353120
+  DEFVAR_LISP ("pre-command-hook",\111553,353489
+  DEFVAR_LISP ("post-command-hook",\111560,353844
+  DEFVAR_LISP ("echo-area-clear-hook",\111568,354207
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354422
+  DEFVAR_LISP ("menu-bar-final-items",\111578,354625
+  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354875
+  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355233
+  DEFVAR_LISP ("overriding-local-map",\111598,355655
+  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356106
+  DEFVAR_LISP ("special-event-map",\111613,356445
+  DEFVAR_LISP ("track-mouse",\111617,356633
+  DEFVAR_KBOARD ("system-key-alist",\111620,356760
+  DEFVAR_KBOARD ("local-function-key-map",\111629,357141
+  DEFVAR_KBOARD ("input-decode-map",\111658,358600
+  DEFVAR_LISP ("function-key-map",\111675,359388
+  DEFVAR_LISP ("key-translation-map",\111683,359804
+  DEFVAR_LISP ("deferred-action-list",\111689,360148
+  DEFVAR_LISP ("deferred-action-function",\111694,360396
+  DEFVAR_LISP ("delayed-warnings-list",\111700,360695
+  DEFVAR_LISP ("timer-list",\111708,361103
+  DEFVAR_LISP ("timer-idle-list",\111712,361255
+  DEFVAR_LISP ("input-method-function",\111716,361418
+  DEFVAR_LISP ("input-method-previous-message",\111737,362387
+  DEFVAR_LISP ("show-help-function",\111744,362748
+  DEFVAR_LISP ("disable-point-adjustment",\111749,362980
+  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363530
+  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363896
+  DEFVAR_LISP ("throw-on-input",\111775,364174
+  DEFVAR_LISP ("command-error-function",\111781,364425
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364912
+  DEFVAR_LISP ("select-active-regions",\111798,365239
+  DEFVAR_LISP ("saved-region-selection",\111807,365631
+  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366016
+  DEFVAR_LISP ("debug-on-event",\111825,366557
 
 c-src/emacs/src/lisp.h,41391
 #define EMACS_LISP_H22,801
@@ -3274,112 +3274,112 @@ el-src/emacs/lisp/progmodes/etags.el,5188
 (defcustom tags-tag-face 148,5700
 (defcustom tags-apropos-verbose 154,5835
 (defcustom tags-apropos-additional-actions 160,5999
-(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6918
-(defvar default-tags-table-function 189,7098
-(defvar tags-location-ring 194,7324
-(defvar tags-table-files 201,7600
-(defvar tags-completion-table 206,7767
-(defvar tags-included-tables 209,7859
-(defvar next-file-list 212,7954
-(defvar tags-table-format-functions 217,8060
-(defvar file-of-tag-function 224,8441
-(defvar tags-table-files-function 228,8635
-(defvar tags-completion-table-function 230,8746
-(defvar snarf-tag-function 232,8841
-(defvar goto-tag-location-function 236,9050
-(defvar find-tag-regexp-search-function 239,9223
-(defvar find-tag-regexp-tag-order 241,9344
-(defvar find-tag-regexp-next-line-after-failure-p 243,9453
-(defvar find-tag-search-function 245,9573
-(defvar find-tag-tag-order 247,9680
-(defvar find-tag-next-line-after-failure-p 249,9775
-(defvar list-tags-function 251,9881
-(defvar tags-apropos-function 253,9969
-(defvar tags-included-tables-function 255,10063
-(defvar verify-tags-table-function 257,10182
-(defun initialize-new-tags-table 260,10293
-(defun tags-table-mode 276,10981
-(defun visit-tags-table 285,11246
-(defun tags-table-check-computed-list 321,12784
-(defun tags-table-extend-computed-list 360,14655
-(defun tags-expand-table-name 400,16368
-(defun tags-table-list-member 409,16711
-(defun tags-verify-table 421,17183
-(defun tags-table-including 470,19303
-(defun tags-next-table 522,21347
-(defun visit-tags-table-buffer 543,22204
-(defun tags-reset-tags-tables 712,28514
-(defun file-of-tag 731,29171
-(defun tags-table-files 740,29521
-(defun tags-included-tables 749,29871
-(defun tags-completion-table 755,30117
-(defun tags-lazy-completion-table 783,31311
-(defun tags-completion-at-point-function 799,31946
-(defun find-tag-tag 818,32696
-(defvar last-tag 837,33369
-(defun find-tag-interactive 840,33428
-(defvar find-tag-history 852,33843
-(defvar etags-case-fold-search)855,33908
-(defvar etags-syntax-table)856,33940
-(defvar local-find-tag-hook)857,33968
-(defun find-tag-noselect 860,34013
-(defun find-tag 932,37127
-(defun find-tag-other-window 959,38343
-(defun find-tag-other-frame 1000,40271
-(defun find-tag-regexp 1025,41445
-(defalias 'pop-tag-mark pop-tag-mark1049,42607
-(defvar tag-lines-already-matched 1052,42658
-(defun find-tag-in-order 1055,42765
-(defun tag-find-file-of-tag-noselect 1167,47111
-(defun tag-find-file-of-tag 1200,48957
-(defun etags-recognize-tags-table 1208,49183
-(defun etags-verify-tags-table 1241,50814
-(defun etags-file-of-tag 1246,51012
-(defun etags-tags-completion-table 1256,51347
-(defun etags-snarf-tag 1286,52553
-(defun etags-goto-tag-location 1324,54122
-(defun etags-list-tags 1388,56565
-(defmacro tags-with-face 1423,57840
-(defun etags-tags-apropos-additional 1431,58173
-(defun etags-tags-apropos 1465,59410
-(defun etags-tags-table-files 1527,61619
-(defun etags-tags-included-tables 1542,62055
-(defun tags-recognize-empty-tags-table 1559,62595
-(defun tag-exact-file-name-match-p 1587,63741
-(defun tag-file-name-match-p 1596,64134
-(defun tag-exact-match-p 1609,64690
-(defun tag-implicit-name-match-p 1620,65258
-(defun tag-symbol-match-p 1633,65858
-(defun tag-word-match-p 1643,66294
-(defun tag-partial-file-name-match-p 1652,66692
-(defun tag-any-match-p 1662,67136
-(defun tag-re-match-p 1667,67320
-(defcustom tags-loop-revert-buffers 1675,67569
-(defun next-file 1685,67978
-(defvar tags-loop-operate 1760,70892
-(defvar tags-loop-scan1763,70986
-(defun tags-loop-eval 1771,71315
-(defun tags-loop-continue 1782,71644
-(defun tags-search 1850,73950
-(defun tags-query-replace 1871,74776
-(defun tags-complete-tags-table-file 1896,76000
-(defun list-tags 1906,76379
-(defun tags-apropos 1934,77332
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78158
-(defun select-tags-table 1964,78397
-(defvar select-tags-table-mode-map 2019,80524
-(define-derived-mode select-tags-table-mode 2030,80907
-(defun select-tags-table-select 2034,81091
-(defun select-tags-table-quit 2043,81457
-(defun complete-tag 2049,81612
-(defconst etags--xref-limit 2074,82553
-(defvar etags-xref-find-definitions-tag-order 2076,82588
-(defun etags-xref-find 2082,82878
-(defun etags--xref-find-definitions 2096,83407
-(defclass xref-etags-location 2129,85121
-(defun xref-make-etags-location 2135,85344
-(cl-defmethod xref-location-marker 2139,85499
-(cl-defmethod xref-location-line 2146,85743
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6921
+(defvar default-tags-table-function 189,7101
+(defvar tags-location-ring 194,7327
+(defvar tags-table-files 201,7603
+(defvar tags-completion-table 206,7770
+(defvar tags-included-tables 209,7862
+(defvar next-file-list 212,7957
+(defvar tags-table-format-functions 217,8063
+(defvar file-of-tag-function 224,8444
+(defvar tags-table-files-function 228,8638
+(defvar tags-completion-table-function 230,8749
+(defvar snarf-tag-function 232,8844
+(defvar goto-tag-location-function 236,9053
+(defvar find-tag-regexp-search-function 239,9226
+(defvar find-tag-regexp-tag-order 241,9347
+(defvar find-tag-regexp-next-line-after-failure-p 243,9456
+(defvar find-tag-search-function 245,9576
+(defvar find-tag-tag-order 247,9683
+(defvar find-tag-next-line-after-failure-p 249,9778
+(defvar list-tags-function 251,9884
+(defvar tags-apropos-function 253,9972
+(defvar tags-included-tables-function 255,10066
+(defvar verify-tags-table-function 257,10185
+(defun initialize-new-tags-table 260,10296
+(defun tags-table-mode 276,10984
+(defun visit-tags-table 285,11249
+(defun tags-table-check-computed-list 321,12787
+(defun tags-table-extend-computed-list 360,14658
+(defun tags-expand-table-name 400,16371
+(defun tags-table-list-member 409,16714
+(defun tags-verify-table 421,17186
+(defun tags-table-including 470,19306
+(defun tags-next-table 522,21350
+(defun visit-tags-table-buffer 543,22207
+(defun tags-reset-tags-tables 712,28517
+(defun file-of-tag 731,29174
+(defun tags-table-files 740,29524
+(defun tags-included-tables 749,29874
+(defun tags-completion-table 755,30120
+(defun tags-lazy-completion-table 783,31314
+(defun tags-completion-at-point-function 799,31949
+(defun find-tag-tag 818,32699
+(defvar last-tag 837,33372
+(defun find-tag-interactive 840,33431
+(defvar find-tag-history 852,33846
+(defvar etags-case-fold-search)855,33911
+(defvar etags-syntax-table)856,33943
+(defvar local-find-tag-hook)857,33971
+(defun find-tag-noselect 860,34016
+(defun find-tag 932,37130
+(defun find-tag-other-window 959,38346
+(defun find-tag-other-frame 1000,40274
+(defun find-tag-regexp 1025,41448
+(defalias 'pop-tag-mark pop-tag-mark1049,42610
+(defvar tag-lines-already-matched 1052,42661
+(defun find-tag-in-order 1055,42768
+(defun tag-find-file-of-tag-noselect 1167,47114
+(defun tag-find-file-of-tag 1200,48960
+(defun etags-recognize-tags-table 1208,49186
+(defun etags-verify-tags-table 1241,50817
+(defun etags-file-of-tag 1246,51015
+(defun etags-tags-completion-table 1256,51350
+(defun etags-snarf-tag 1286,52556
+(defun etags-goto-tag-location 1324,54125
+(defun etags-list-tags 1388,56568
+(defmacro tags-with-face 1423,57843
+(defun etags-tags-apropos-additional 1431,58176
+(defun etags-tags-apropos 1465,59413
+(defun etags-tags-table-files 1527,61622
+(defun etags-tags-included-tables 1542,62058
+(defun tags-recognize-empty-tags-table 1559,62598
+(defun tag-exact-file-name-match-p 1587,63744
+(defun tag-file-name-match-p 1596,64137
+(defun tag-exact-match-p 1609,64693
+(defun tag-implicit-name-match-p 1620,65261
+(defun tag-symbol-match-p 1633,65861
+(defun tag-word-match-p 1643,66297
+(defun tag-partial-file-name-match-p 1652,66695
+(defun tag-any-match-p 1662,67139
+(defun tag-re-match-p 1667,67323
+(defcustom tags-loop-revert-buffers 1675,67572
+(defun next-file 1685,67981
+(defvar tags-loop-operate 1760,70895
+(defvar tags-loop-scan1763,70989
+(defun tags-loop-eval 1771,71318
+(defun tags-loop-continue 1782,71647
+(defun tags-search 1850,73953
+(defun tags-query-replace 1871,74779
+(defun tags-complete-tags-table-file 1896,76003
+(defun list-tags 1906,76382
+(defun tags-apropos 1934,77335
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78161
+(defun select-tags-table 1964,78400
+(defvar select-tags-table-mode-map 2019,80527
+(define-derived-mode select-tags-table-mode 2030,80910
+(defun select-tags-table-select 2034,81094
+(defun select-tags-table-quit 2043,81460
+(defun complete-tag 2049,81615
+(defconst etags--xref-limit 2074,82556
+(defvar etags-xref-find-definitions-tag-order 2076,82591
+(defun etags-xref-find 2082,82881
+(defun etags--xref-find-definitions 2096,83410
+(defclass xref-etags-location 2129,85124
+(defun xref-make-etags-location 2135,85347
+(cl-defmethod xref-location-marker 2139,85502
+(cl-defmethod xref-location-line 2146,85746
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
diff --git a/test/manual/etags/ETAGS.good_6 b/test/manual/etags/ETAGS.good_6
index 9a38e20dce..6f440a7fc9 100644
--- a/test/manual/etags/ETAGS.good_6
+++ b/test/manual/etags/ETAGS.good_6
@@ -1234,440 +1234,440 @@ record_auto_save 742,23849
 force_auto_save_soon 751,24017
 DEFUN ("recursive-edit", Frecursive_edit,759,24138
 DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24138
-recursive_edit_unwind 804,25748
-any_kboard_state 817,26014
-single_kboard_state 838,26666
-not_single_kboard_state 848,26804
-struct kboard_stack858,27066
-  KBOARD *kboard;kboard860,27088
-  struct kboard_stack *next;next861,27106
-static struct kboard_stack *kboard_stack;kboard_stack864,27139
-push_kboard 867,27187
-pop_kboard 879,27376
-temporarily_switch_to_single_kboard 914,28264
-record_single_kboard_state 943,29438
-restore_kboard_configuration 952,29622
-cmd_error 970,30078
-cmd_error_internal 1024,31511
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32031
-DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32031
-static Lisp_Object command_loop_2 1086,33638
-static Lisp_Object top_level_1 1087,33687
-command_loop 1094,33917
-command_loop_2 1134,35136
-top_level_2 1146,35340
-top_level_1 1152,35418
-DEFUN ("top-level", Ftop_level,1164,35788
-DEFUN ("top-level", Ftop_level,top-level1164,35788
-user_error 1183,36289
-DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36430
-DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36430
-DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36820
-DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36820
-tracking_off 1216,37282
-DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37817
-DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37817
-bool ignore_mouse_drag_p;1256,38393
-some_mouse_moved 1259,38442
-static int read_key_sequence 1282,38800
-static void adjust_point_for_property 1284,38918
-Lisp_Object last_undo_boundary;1287,39033
-command_loop_1 1294,39274
-read_menu_command 1649,50890
-adjust_point_for_property 1678,51618
-safe_run_hooks_1 1831,57340
-safe_run_hooks_error 1841,57570
-safe_run_hook_funcall 1878,58577
-safe_run_hooks 1893,59059
-int poll_suppress_count;1908,59398
-static struct atimer *poll_timer;poll_timer1915,59488
-poll_for_input_1 1919,59590
-poll_for_input 1930,59790
-start_polling 1942,60054
-input_polling_used 1979,61092
-stop_polling 1994,61391
-set_poll_suppress_count 2009,61760
-bind_polling_period 2029,62142
-make_ctrl_char 2048,62493
-show_help_echo 2113,64456
-static Lisp_Object kbd_buffer_get_event 2152,65485
-static void record_char 2154,65597
-static Lisp_Object help_form_saved_window_configs;2156,65639
-read_char_help_form_unwind 2158,65702
-#define STOP_POLLING   2166,65960
-#define RESUME_POLLING 2170,66085
-read_event_from_main_queue 2175,66230
-read_decoded_event_from_main_queue 2249,68418
-#define MAX_ENCODED_BYTES 2254,68665
-echo_keystrokes_p 2342,71557
-read_char 2376,72849
-record_menu_key 3225,98950
-help_char_p 3258,99675
-record_char 3273,99954
-save_getcjmp 3412,104236
-restore_getcjmp 3418,104327
-readable_events 3430,104698
-int stop_character EXTERNALLY_VISIBLE;3497,106438
-event_to_kboard 3500,106494
-kbd_buffer_nr_stored 3522,107143
-kbd_buffer_store_event 3534,107484
-kbd_buffer_store_event_hold 3550,108026
-kbd_buffer_unget_event 3684,111618
-#define INPUT_EVENT_POS_MAX 3698,112019
-#define INPUT_EVENT_POS_MIN 3701,112148
-position_to_Time 3706,112288
-Time_to_position 3716,112515
-gen_help_event 3738,113172
-kbd_buffer_store_help_event 3756,113612
-discard_mouse_events 3773,113977
-kbd_buffer_events_waiting 3803,114712
-clear_event 3823,115069
-kbd_buffer_get_event 3836,115409
-process_special_events 4258,127882
-swallow_events 4322,129706
-timer_start_idle 4339,130099
-timer_stop_idle 4355,130577
-timer_resume_idle 4363,130721
-struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130913
-Lisp_Object pending_funcalls;4377,131173
-decode_timer 4381,131294
-timer_check_2 4414,132247
-timer_check 4572,136818
-DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137663
-DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137663
-static Lisp_Object accent_key_syms;4625,138240
-static Lisp_Object func_key_syms;4626,138276
-static Lisp_Object mouse_syms;4627,138310
-static Lisp_Object wheel_syms;4628,138341
-static Lisp_Object drag_n_drop_syms;4629,138372
-static const int lispy_accent_codes[lispy_accent_codes4634,138517
-static const char *const lispy_accent_keys[lispy_accent_keys4741,139879
-#define FUNCTION_KEY_OFFSET 4766,140315
-const char *const lispy_function_keys[lispy_function_keys4768,140348
-static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148902
-static const char *const lispy_kana_keys[lispy_kana_keys5026,150136
-#define FUNCTION_KEY_OFFSET 5061,151752
-static const char *const lispy_function_keys[lispy_function_keys5065,151895
-#define ISO_FUNCTION_KEY_OFFSET 5149,154430
-static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154470
-static Lisp_Object Vlispy_mouse_stem;5172,155329
-static const char *const lispy_wheel_names[lispy_wheel_names5174,155368
-static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155620
-static short const scroll_bar_parts[scroll_bar_parts5189,155886
-static Lisp_Object button_down_location;5210,156911
-static int last_mouse_button;5215,157066
-static int last_mouse_x;5216,157096
-static int last_mouse_y;5217,157121
-static Time button_down_time;5218,157146
-static int double_click_count;5222,157230
-make_lispy_position 5228,157391
-toolkit_menubar_in_use 5456,163954
-make_scroll_bar_position 5469,164322
-make_lispy_event 5485,164968
-make_lispy_movement 6104,183531
-make_lispy_switch_frame 6131,184262
-make_lispy_focus_in 6137,184369
-make_lispy_focus_out 6145,184495
-parse_modifiers_uncached 6163,184945
-#define SINGLE_LETTER_MOD(6185,185465
-#undef SINGLE_LETTER_MOD6212,185906
-#define MULTI_LETTER_MOD(6214,185932
-#undef MULTI_LETTER_MOD6231,186400
-apply_modifiers_uncached 6273,187574
-static const char *const modifier_names[modifier_names6319,189193
-#define NUM_MOD_NAMES 6325,189399
-static Lisp_Object modifier_symbols;6327,189449
-lispy_modifier_list 6331,189586
-#define KEY_TO_CHAR(6353,190252
-parse_modifiers 6356,190328
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191517
-DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
-apply_modifiers 6422,192391
-reorder_modifiers 6491,194720
-modify_event_symbol 6536,196528
-DEFUN ("event-convert-list", Fevent_convert_list,6628,199244
-DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
-parse_solitary_modifier 6695,201135
-#define SINGLE_LETTER_MOD(6701,201258
-#define MULTI_LETTER_MOD(6705,201343
-#undef SINGLE_LETTER_MOD6763,202641
-#undef MULTI_LETTER_MOD6764,202666
-lucid_event_type_list_p 6775,202889
-get_input_pending 6814,203960
-record_asynch_buffer_change 6834,204579
-gobble_input 6872,205702
-tty_read_avail_input 6967,208310
-handle_async_input 7149,214039
-process_pending_signals 7165,214359
-unblock_input_to 7177,214645
-unblock_input 7200,215277
-totally_unblock_input 7209,215445
-handle_input_available_signal 7217,215529
-deliver_input_available_signal 7226,215700
-struct user_signal_info7235,215865
-  int sig;7238,215915
-  char *name;name7241,215956
-  int npending;7244,216007
-  struct user_signal_info *next;next7246,216024
-static struct user_signal_info *user_signals user_signals7250,216090
-add_user_signal 7253,216149
-handle_user_signal 7275,216598
-deliver_user_signal 7316,217558
-find_user_signal_name 7322,217659
-store_user_signal_events 7334,217841
-static void menu_bar_item 7362,218341
-static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
-static Lisp_Object menu_bar_items_vector;7368,218630
-static int menu_bar_items_index;7369,218672
-static const char *separator_names[separator_names7372,218707
-menu_separator_name_p 7393,219148
-menu_bar_items 7426,219852
-Lisp_Object item_properties;7568,224603
-menu_bar_item 7571,224645
-menu_item_eval_property_1 7647,227175
-eval_dyn 7658,227465
-menu_item_eval_property 7666,227675
-parse_menu_item 7686,228341
-static Lisp_Object tool_bar_items_vector;7965,236336
-static Lisp_Object tool_bar_item_properties;7970,236510
-static int ntool_bar_items;7974,236606
-static void init_tool_bar_items 7978,236664
-static void process_tool_bar_item 7979,236711
-static bool parse_tool_bar_item 7981,236801
-static void append_tool_bar_item 7982,236861
-tool_bar_items 7990,237083
-process_tool_bar_item 8075,239892
-#define PROP(8112,240969
-set_prop 8114,241038
-parse_tool_bar_item 8167,242453
-#undef PROP8379,248844
-init_tool_bar_items 8387,248969
-append_tool_bar_item 8401,249261
-read_char_x_menu_prompt 8443,250771
-read_char_minibuf_menu_prompt 8503,252445
-#define PUSH_C_STR(8527,253014
-follow_key 8726,258553
-active_maps 8733,258695
-typedef struct keyremap8742,259021
-  Lisp_Object parent;8745,259107
-  Lisp_Object map;8748,259224
-  int start,8753,259446
-  int start, end;8753,259446
-} keyremap;8754,259464
-access_keymap_keyremap 8764,259808
-keyremap_step 8811,261450
-test_undefined 8867,262934
-read_key_sequence 8916,264861
-read_key_sequence_vs 9826,295821
-DEFUN ("read-key-sequence", Fread_key_sequence,9885,297294
-DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
-DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299982
-DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
-detect_input_pending 9950,300488
-detect_input_pending_ignore_squeezables 9959,300654
-detect_input_pending_run_timers 9967,300870
-clear_input_pending 9985,301362
-requeued_events_pending_p 9997,301732
-DEFUN ("input-pending-p", Finput_pending_p,10002,301813
-DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
-DEFUN ("recent-keys", Frecent_keys,10024,302596
-DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
-DEFUN ("this-command-keys", Fthis_command_keys,10055,303517
-DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
-DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303958
-DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
-DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304380
-DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304955
-DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
-DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305495
-DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
-DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306510
-DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
-DEFUN ("recursion-depth", Frecursion_depth,10158,307069
-DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
-DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307406
-DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
-DEFUN ("discard-input", Fdiscard_input,10203,308447
-DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
-DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308949
-DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
-stuff_buffered_input 10285,311045
-set_waiting_for_input 10323,312016
-clear_waiting_for_input 10337,312390
-handle_interrupt_signal 10351,312754
-deliver_interrupt_signal 10378,313642
-static int volatile force_quit_count;10387,313932
-handle_interrupt 10401,314414
-quit_throw_to_read_char 10541,318711
-DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319288
-DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
-DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320516
-DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
-DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321432
-DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
-DEFUN ("set-quit-char", Fset_quit_char,10694,322706
-DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
-DEFUN ("set-input-mode", Fset_input_mode,10729,323570
-DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
-DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324459
-DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
-DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325837
-DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
-DEFUN ("posn-at-point", Fposn_at_point,10824,327060
-DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
-init_kboard 10861,328214
-allocate_kboard 10893,329284
-wipe_kboard 10909,329637
-delete_kboard 10917,329751
-init_keyboard 10942,330281
-struct event_head11021,332696
-  short var;11023,332716
-  short kind;11024,332729
-static const struct event_head head_table[head_table11027,332747
-syms_of_keyboard 11045,333577
-  DEFVAR_LISP ("internal--top-level-message"11058,333972
-  DEFVAR_LISP ("last-command-event"11312,342173
-  DEFVAR_LISP ("last-nonmenu-event"11315,342297
-  DEFVAR_LISP ("last-input-event"11321,342636
-  DEFVAR_LISP ("unread-command-events"11324,342730
-  DEFVAR_LISP ("unread-post-input-method-events"11332,343190
-  DEFVAR_LISP ("unread-input-method-events"11338,343529
-  DEFVAR_LISP ("meta-prefix-char"11346,343898
-  DEFVAR_KBOARD ("last-command"11351,344106
-  DEFVAR_KBOARD ("real-last-command"11368,344787
-  DEFVAR_KBOARD ("last-repeatable-command"11372,344973
-  DEFVAR_LISP ("this-command"11378,345261
-  DEFVAR_LISP ("real-this-command"11384,345498
-  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345680
-  DEFVAR_LISP ("this-original-command"11396,346123
-  DEFVAR_INT ("auto-save-interval"11403,346520
-  DEFVAR_LISP ("auto-save-timeout"11408,346734
-  DEFVAR_LISP ("echo-keystrokes"11415,347079
-  DEFVAR_INT ("polling-period"11421,347350
-  DEFVAR_LISP ("double-click-time"11428,347693
-  DEFVAR_INT ("double-click-fuzz"11435,348029
-  DEFVAR_INT ("num-input-keys"11446,348519
-  DEFVAR_INT ("num-nonmacro-input-events"11452,348794
-  DEFVAR_LISP ("last-event-frame"11457,349032
-  DEFVAR_LISP ("tty-erase-char"11463,349311
-  DEFVAR_LISP ("help-char"11466,349434
-  DEFVAR_LISP ("help-event-list"11472,349717
-  DEFVAR_LISP ("help-form"11477,349928
-  DEFVAR_LISP ("prefix-help-command"11483,350176
-  DEFVAR_LISP ("top-level"11489,350454
-  DEFVAR_KBOARD ("keyboard-translate-table"11495,350675
-  DEFVAR_BOOL ("cannot-suspend"11511,351488
-  DEFVAR_BOOL ("menu-prompting"11516,351715
-  DEFVAR_LISP ("menu-prompt-more-char"11526,352145
-  DEFVAR_INT ("extra-keyboard-modifiers"11531,352391
-  DEFVAR_LISP ("deactivate-mark"11545,353117
-  DEFVAR_LISP ("pre-command-hook"11553,353486
-  DEFVAR_LISP ("post-command-hook"11560,353841
-  DEFVAR_LISP ("echo-area-clear-hook"11568,354204
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354419
-  DEFVAR_LISP ("menu-bar-final-items"11578,354622
-  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354872
-  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355230
-  DEFVAR_LISP ("overriding-local-map"11598,355652
-  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356103
-  DEFVAR_LISP ("special-event-map"11613,356442
-  DEFVAR_LISP ("track-mouse"11617,356630
-  DEFVAR_KBOARD ("system-key-alist"11620,356757
-  DEFVAR_KBOARD ("local-function-key-map"11629,357138
-  DEFVAR_KBOARD ("input-decode-map"11658,358597
-  DEFVAR_LISP ("function-key-map"11675,359385
-  DEFVAR_LISP ("key-translation-map"11683,359801
-  DEFVAR_LISP ("deferred-action-list"11689,360145
-  DEFVAR_LISP ("deferred-action-function"11694,360393
-  DEFVAR_LISP ("delayed-warnings-list"11700,360692
-  DEFVAR_LISP ("timer-list"11708,361100
-  DEFVAR_LISP ("timer-idle-list"11712,361252
-  DEFVAR_LISP ("input-method-function"11716,361415
-  DEFVAR_LISP ("input-method-previous-message"11737,362384
-  DEFVAR_LISP ("show-help-function"11744,362745
-  DEFVAR_LISP ("disable-point-adjustment"11749,362977
-  DEFVAR_LISP ("global-disable-point-adjustment"11761,363527
-  DEFVAR_LISP ("minibuffer-message-timeout"11770,363893
-  DEFVAR_LISP ("throw-on-input"11775,364171
-  DEFVAR_LISP ("command-error-function"11781,364422
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364909
-  DEFVAR_LISP ("select-active-regions"11798,365236
-  DEFVAR_LISP ("saved-region-selection"11807,365628
-  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366013
-  DEFVAR_LISP ("debug-on-event"11825,366554
-keys_of_keyboard 11841,367115
-mark_kboards 11916,370434
-  DEFVAR_LISP ("internal--top-level-message",\111058,333972
-  DEFVAR_LISP ("last-command-event",\111312,342173
-  DEFVAR_LISP ("last-nonmenu-event",\111315,342297
-  DEFVAR_LISP ("last-input-event",\111321,342636
-  DEFVAR_LISP ("unread-command-events",\111324,342730
-  DEFVAR_LISP ("unread-post-input-method-events",\111332,343190
-  DEFVAR_LISP ("unread-input-method-events",\111338,343529
-  DEFVAR_LISP ("meta-prefix-char",\111346,343898
-  DEFVAR_KBOARD ("last-command",\111351,344106
-  DEFVAR_KBOARD ("real-last-command",\111368,344787
-  DEFVAR_KBOARD ("last-repeatable-command",\111372,344973
-  DEFVAR_LISP ("this-command",\111378,345261
-  DEFVAR_LISP ("real-this-command",\111384,345498
-  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345680
-  DEFVAR_LISP ("this-original-command",\111396,346123
-  DEFVAR_INT ("auto-save-interval",\111403,346520
-  DEFVAR_LISP ("auto-save-timeout",\111408,346734
-  DEFVAR_LISP ("echo-keystrokes",\111415,347079
-  DEFVAR_INT ("polling-period",\111421,347350
-  DEFVAR_LISP ("double-click-time",\111428,347693
-  DEFVAR_INT ("double-click-fuzz",\111435,348029
-  DEFVAR_INT ("num-input-keys",\111446,348519
-  DEFVAR_INT ("num-nonmacro-input-events",\111452,348794
-  DEFVAR_LISP ("last-event-frame",\111457,349032
-  DEFVAR_LISP ("tty-erase-char",\111463,349311
-  DEFVAR_LISP ("help-char",\111466,349434
-  DEFVAR_LISP ("help-event-list",\111472,349717
-  DEFVAR_LISP ("help-form",\111477,349928
-  DEFVAR_LISP ("prefix-help-command",\111483,350176
-  DEFVAR_LISP ("top-level",\111489,350454
-  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350675
-  DEFVAR_BOOL ("cannot-suspend",\111511,351488
-  DEFVAR_BOOL ("menu-prompting",\111516,351715
-  DEFVAR_LISP ("menu-prompt-more-char",\111526,352145
-  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352391
-  DEFVAR_LISP ("deactivate-mark",\111545,353117
-  DEFVAR_LISP ("pre-command-hook",\111553,353486
-  DEFVAR_LISP ("post-command-hook",\111560,353841
-  DEFVAR_LISP ("echo-area-clear-hook",\111568,354204
-  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354419
-  DEFVAR_LISP ("menu-bar-final-items",\111578,354622
-  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354872
-  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355230
-  DEFVAR_LISP ("overriding-local-map",\111598,355652
-  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356103
-  DEFVAR_LISP ("special-event-map",\111613,356442
-  DEFVAR_LISP ("track-mouse",\111617,356630
-  DEFVAR_KBOARD ("system-key-alist",\111620,356757
-  DEFVAR_KBOARD ("local-function-key-map",\111629,357138
-  DEFVAR_KBOARD ("input-decode-map",\111658,358597
-  DEFVAR_LISP ("function-key-map",\111675,359385
-  DEFVAR_LISP ("key-translation-map",\111683,359801
-  DEFVAR_LISP ("deferred-action-list",\111689,360145
-  DEFVAR_LISP ("deferred-action-function",\111694,360393
-  DEFVAR_LISP ("delayed-warnings-list",\111700,360692
-  DEFVAR_LISP ("timer-list",\111708,361100
-  DEFVAR_LISP ("timer-idle-list",\111712,361252
-  DEFVAR_LISP ("input-method-function",\111716,361415
-  DEFVAR_LISP ("input-method-previous-message",\111737,362384
-  DEFVAR_LISP ("show-help-function",\111744,362745
-  DEFVAR_LISP ("disable-point-adjustment",\111749,362977
-  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363527
-  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363893
-  DEFVAR_LISP ("throw-on-input",\111775,364171
-  DEFVAR_LISP ("command-error-function",\111781,364422
-  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364909
-  DEFVAR_LISP ("select-active-regions",\111798,365236
-  DEFVAR_LISP ("saved-region-selection",\111807,365628
-  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366013
-  DEFVAR_LISP ("debug-on-event",\111825,366554
+recursive_edit_unwind 804,25751
+any_kboard_state 817,26017
+single_kboard_state 838,26669
+not_single_kboard_state 848,26807
+struct kboard_stack858,27069
+  KBOARD *kboard;kboard860,27091
+  struct kboard_stack *next;next861,27109
+static struct kboard_stack *kboard_stack;kboard_stack864,27142
+push_kboard 867,27190
+pop_kboard 879,27379
+temporarily_switch_to_single_kboard 914,28267
+record_single_kboard_state 943,29441
+restore_kboard_configuration 952,29625
+cmd_error 970,30081
+cmd_error_internal 1024,31514
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,1043,32034
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32034
+static Lisp_Object command_loop_2 1086,33641
+static Lisp_Object top_level_1 1087,33690
+command_loop 1094,33920
+command_loop_2 1134,35139
+top_level_2 1146,35343
+top_level_1 1152,35421
+DEFUN ("top-level", Ftop_level,1164,35791
+DEFUN ("top-level", Ftop_level,top-level1164,35791
+user_error 1183,36292
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,1189,36433
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36433
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,1201,36823
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36823
+tracking_off 1216,37285
+DEFUN ("internal--track-mouse", Ftrack_mouse,1234,37820
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37820
+bool ignore_mouse_drag_p;1256,38396
+some_mouse_moved 1259,38445
+static int read_key_sequence 1282,38803
+static void adjust_point_for_property 1284,38921
+Lisp_Object last_undo_boundary;1287,39036
+command_loop_1 1294,39277
+read_menu_command 1649,50893
+adjust_point_for_property 1678,51621
+safe_run_hooks_1 1831,57343
+safe_run_hooks_error 1841,57573
+safe_run_hook_funcall 1878,58580
+safe_run_hooks 1893,59062
+int poll_suppress_count;1908,59401
+static struct atimer *poll_timer;poll_timer1915,59491
+poll_for_input_1 1919,59593
+poll_for_input 1930,59793
+start_polling 1942,60057
+input_polling_used 1979,61095
+stop_polling 1994,61394
+set_poll_suppress_count 2009,61763
+bind_polling_period 2029,62145
+make_ctrl_char 2048,62496
+show_help_echo 2113,64459
+static Lisp_Object kbd_buffer_get_event 2152,65488
+static void record_char 2154,65600
+static Lisp_Object help_form_saved_window_configs;2156,65642
+read_char_help_form_unwind 2158,65705
+#define STOP_POLLING   2166,65963
+#define RESUME_POLLING 2170,66088
+read_event_from_main_queue 2175,66233
+read_decoded_event_from_main_queue 2249,68421
+#define MAX_ENCODED_BYTES 2254,68668
+echo_keystrokes_p 2342,71560
+read_char 2376,72852
+record_menu_key 3225,98953
+help_char_p 3258,99678
+record_char 3273,99957
+save_getcjmp 3412,104239
+restore_getcjmp 3418,104330
+readable_events 3430,104701
+int stop_character EXTERNALLY_VISIBLE;3497,106441
+event_to_kboard 3500,106497
+kbd_buffer_nr_stored 3522,107146
+kbd_buffer_store_event 3534,107487
+kbd_buffer_store_event_hold 3550,108029
+kbd_buffer_unget_event 3684,111621
+#define INPUT_EVENT_POS_MAX 3698,112022
+#define INPUT_EVENT_POS_MIN 3701,112151
+position_to_Time 3706,112291
+Time_to_position 3716,112518
+gen_help_event 3738,113175
+kbd_buffer_store_help_event 3756,113615
+discard_mouse_events 3773,113980
+kbd_buffer_events_waiting 3803,114715
+clear_event 3823,115072
+kbd_buffer_get_event 3836,115412
+process_special_events 4258,127885
+swallow_events 4322,129709
+timer_start_idle 4339,130102
+timer_stop_idle 4355,130580
+timer_resume_idle 4363,130724
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130916
+Lisp_Object pending_funcalls;4377,131176
+decode_timer 4381,131297
+timer_check_2 4414,132250
+timer_check 4572,136821
+DEFUN ("current-idle-time", Fcurrent_idle_time,4607,137666
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137666
+static Lisp_Object accent_key_syms;4625,138243
+static Lisp_Object func_key_syms;4626,138279
+static Lisp_Object mouse_syms;4627,138313
+static Lisp_Object wheel_syms;4628,138344
+static Lisp_Object drag_n_drop_syms;4629,138375
+static const int lispy_accent_codes[lispy_accent_codes4634,138520
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139882
+#define FUNCTION_KEY_OFFSET 4766,140318
+const char *const lispy_function_keys[lispy_function_keys4768,140351
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148905
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150139
+#define FUNCTION_KEY_OFFSET 5061,151755
+static const char *const lispy_function_keys[lispy_function_keys5065,151898
+#define ISO_FUNCTION_KEY_OFFSET 5149,154433
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154473
+static Lisp_Object Vlispy_mouse_stem;5172,155332
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155371
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155623
+static short const scroll_bar_parts[scroll_bar_parts5189,155889
+static Lisp_Object button_down_location;5210,156914
+static int last_mouse_button;5215,157069
+static int last_mouse_x;5216,157099
+static int last_mouse_y;5217,157124
+static Time button_down_time;5218,157149
+static int double_click_count;5222,157233
+make_lispy_position 5228,157394
+toolkit_menubar_in_use 5456,163957
+make_scroll_bar_position 5469,164325
+make_lispy_event 5485,164971
+make_lispy_movement 6104,183534
+make_lispy_switch_frame 6131,184265
+make_lispy_focus_in 6137,184372
+make_lispy_focus_out 6145,184498
+parse_modifiers_uncached 6163,184948
+#define SINGLE_LETTER_MOD(6185,185468
+#undef SINGLE_LETTER_MOD6212,185909
+#define MULTI_LETTER_MOD(6214,185935
+#undef MULTI_LETTER_MOD6231,186403
+apply_modifiers_uncached 6273,187577
+static const char *const modifier_names[modifier_names6319,189196
+#define NUM_MOD_NAMES 6325,189402
+static Lisp_Object modifier_symbols;6327,189452
+lispy_modifier_list 6331,189589
+#define KEY_TO_CHAR(6353,190255
+parse_modifiers 6356,190331
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,6399,191520
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191520
+apply_modifiers 6422,192394
+reorder_modifiers 6491,194723
+modify_event_symbol 6536,196531
+DEFUN ("event-convert-list", Fevent_convert_list,6628,199247
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199247
+parse_solitary_modifier 6695,201138
+#define SINGLE_LETTER_MOD(6701,201261
+#define MULTI_LETTER_MOD(6705,201346
+#undef SINGLE_LETTER_MOD6763,202644
+#undef MULTI_LETTER_MOD6764,202669
+lucid_event_type_list_p 6775,202892
+get_input_pending 6814,203963
+record_asynch_buffer_change 6834,204582
+gobble_input 6872,205705
+tty_read_avail_input 6967,208313
+handle_async_input 7149,214042
+process_pending_signals 7165,214362
+unblock_input_to 7177,214648
+unblock_input 7200,215280
+totally_unblock_input 7209,215448
+handle_input_available_signal 7217,215532
+deliver_input_available_signal 7226,215703
+struct user_signal_info7235,215868
+  int sig;7238,215918
+  char *name;name7241,215959
+  int npending;7244,216010
+  struct user_signal_info *next;next7246,216027
+static struct user_signal_info *user_signals user_signals7250,216093
+add_user_signal 7253,216152
+handle_user_signal 7275,216601
+deliver_user_signal 7316,217561
+find_user_signal_name 7322,217662
+store_user_signal_events 7334,217844
+static void menu_bar_item 7362,218344
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218419
+static Lisp_Object menu_bar_items_vector;7368,218633
+static int menu_bar_items_index;7369,218675
+static const char *separator_names[separator_names7372,218710
+menu_separator_name_p 7393,219151
+menu_bar_items 7426,219855
+Lisp_Object item_properties;7568,224606
+menu_bar_item 7571,224648
+menu_item_eval_property_1 7647,227178
+eval_dyn 7658,227468
+menu_item_eval_property 7666,227678
+parse_menu_item 7686,228344
+static Lisp_Object tool_bar_items_vector;7965,236339
+static Lisp_Object tool_bar_item_properties;7970,236513
+static int ntool_bar_items;7974,236609
+static void init_tool_bar_items 7978,236667
+static void process_tool_bar_item 7979,236714
+static bool parse_tool_bar_item 7981,236804
+static void append_tool_bar_item 7982,236864
+tool_bar_items 7990,237086
+process_tool_bar_item 8075,239895
+#define PROP(8112,240972
+set_prop 8114,241041
+parse_tool_bar_item 8167,242456
+#undef PROP8379,248847
+init_tool_bar_items 8387,248972
+append_tool_bar_item 8401,249264
+read_char_x_menu_prompt 8443,250774
+read_char_minibuf_menu_prompt 8503,252448
+#define PUSH_C_STR(8527,253017
+follow_key 8726,258556
+active_maps 8733,258698
+typedef struct keyremap8742,259024
+  Lisp_Object parent;8745,259110
+  Lisp_Object map;8748,259227
+  int start,8753,259449
+  int start, end;8753,259449
+} keyremap;8754,259467
+access_keymap_keyremap 8764,259811
+keyremap_step 8811,261453
+test_undefined 8867,262937
+read_key_sequence 8916,264864
+read_key_sequence_vs 9826,295824
+DEFUN ("read-key-sequence", Fread_key_sequence,9885,297297
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297297
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,9938,299985
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299985
+detect_input_pending 9950,300491
+detect_input_pending_ignore_squeezables 9959,300657
+detect_input_pending_run_timers 9967,300873
+clear_input_pending 9985,301365
+requeued_events_pending_p 9997,301735
+DEFUN ("input-pending-p", Finput_pending_p,10002,301816
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301816
+DEFUN ("recent-keys", Frecent_keys,10024,302599
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302599
+DEFUN ("this-command-keys", Fthis_command_keys,10055,303520
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303520
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,10068,303961
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303961
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,10080,304383
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304383
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,10096,304958
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304958
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,10109,305498
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305498
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,10136,306513
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306513
+DEFUN ("recursion-depth", Frecursion_depth,10158,307072
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307072
+DEFUN ("open-dribble-file", Fopen_dribble_file,10169,307409
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307409
+DEFUN ("discard-input", Fdiscard_input,10203,308450
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308450
+DEFUN ("suspend-emacs", Fsuspend_emacs,10225,308952
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308952
+stuff_buffered_input 10285,311048
+set_waiting_for_input 10323,312019
+clear_waiting_for_input 10337,312393
+handle_interrupt_signal 10351,312757
+deliver_interrupt_signal 10378,313645
+static int volatile force_quit_count;10387,313935
+handle_interrupt 10401,314417
+quit_throw_to_read_char 10541,318714
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,10562,319291
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319291
+DEFUN ("set-output-flow-control", Fset_output_flow_control,10609,320519
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320519
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,10643,321435
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321435
+DEFUN ("set-quit-char", Fset_quit_char,10694,322709
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322709
+DEFUN ("set-input-mode", Fset_input_mode,10729,323573
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323573
+DEFUN ("current-input-mode", Fcurrent_input_mode,10750,324462
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324462
+DEFUN ("posn-at-x-y", Fposn_at_x_y,10787,325840
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325840
+DEFUN ("posn-at-point", Fposn_at_point,10824,327063
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327063
+init_kboard 10861,328217
+allocate_kboard 10893,329287
+wipe_kboard 10909,329640
+delete_kboard 10917,329754
+init_keyboard 10942,330284
+struct event_head11021,332699
+  short var;11023,332719
+  short kind;11024,332732
+static const struct event_head head_table[head_table11027,332750
+syms_of_keyboard 11045,333580
+  DEFVAR_LISP ("internal--top-level-message"11058,333975
+  DEFVAR_LISP ("last-command-event"11312,342176
+  DEFVAR_LISP ("last-nonmenu-event"11315,342300
+  DEFVAR_LISP ("last-input-event"11321,342639
+  DEFVAR_LISP ("unread-command-events"11324,342733
+  DEFVAR_LISP ("unread-post-input-method-events"11332,343193
+  DEFVAR_LISP ("unread-input-method-events"11338,343532
+  DEFVAR_LISP ("meta-prefix-char"11346,343901
+  DEFVAR_KBOARD ("last-command"11351,344109
+  DEFVAR_KBOARD ("real-last-command"11368,344790
+  DEFVAR_KBOARD ("last-repeatable-command"11372,344976
+  DEFVAR_LISP ("this-command"11378,345264
+  DEFVAR_LISP ("real-this-command"11384,345501
+  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345683
+  DEFVAR_LISP ("this-original-command"11396,346126
+  DEFVAR_INT ("auto-save-interval"11403,346523
+  DEFVAR_LISP ("auto-save-timeout"11408,346737
+  DEFVAR_LISP ("echo-keystrokes"11415,347082
+  DEFVAR_INT ("polling-period"11421,347353
+  DEFVAR_LISP ("double-click-time"11428,347696
+  DEFVAR_INT ("double-click-fuzz"11435,348032
+  DEFVAR_INT ("num-input-keys"11446,348522
+  DEFVAR_INT ("num-nonmacro-input-events"11452,348797
+  DEFVAR_LISP ("last-event-frame"11457,349035
+  DEFVAR_LISP ("tty-erase-char"11463,349314
+  DEFVAR_LISP ("help-char"11466,349437
+  DEFVAR_LISP ("help-event-list"11472,349720
+  DEFVAR_LISP ("help-form"11477,349931
+  DEFVAR_LISP ("prefix-help-command"11483,350179
+  DEFVAR_LISP ("top-level"11489,350457
+  DEFVAR_KBOARD ("keyboard-translate-table"11495,350678
+  DEFVAR_BOOL ("cannot-suspend"11511,351491
+  DEFVAR_BOOL ("menu-prompting"11516,351718
+  DEFVAR_LISP ("menu-prompt-more-char"11526,352148
+  DEFVAR_INT ("extra-keyboard-modifiers"11531,352394
+  DEFVAR_LISP ("deactivate-mark"11545,353120
+  DEFVAR_LISP ("pre-command-hook"11553,353489
+  DEFVAR_LISP ("post-command-hook"11560,353844
+  DEFVAR_LISP ("echo-area-clear-hook"11568,354207
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354422
+  DEFVAR_LISP ("menu-bar-final-items"11578,354625
+  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354875
+  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355233
+  DEFVAR_LISP ("overriding-local-map"11598,355655
+  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356106
+  DEFVAR_LISP ("special-event-map"11613,356445
+  DEFVAR_LISP ("track-mouse"11617,356633
+  DEFVAR_KBOARD ("system-key-alist"11620,356760
+  DEFVAR_KBOARD ("local-function-key-map"11629,357141
+  DEFVAR_KBOARD ("input-decode-map"11658,358600
+  DEFVAR_LISP ("function-key-map"11675,359388
+  DEFVAR_LISP ("key-translation-map"11683,359804
+  DEFVAR_LISP ("deferred-action-list"11689,360148
+  DEFVAR_LISP ("deferred-action-function"11694,360396
+  DEFVAR_LISP ("delayed-warnings-list"11700,360695
+  DEFVAR_LISP ("timer-list"11708,361103
+  DEFVAR_LISP ("timer-idle-list"11712,361255
+  DEFVAR_LISP ("input-method-function"11716,361418
+  DEFVAR_LISP ("input-method-previous-message"11737,362387
+  DEFVAR_LISP ("show-help-function"11744,362748
+  DEFVAR_LISP ("disable-point-adjustment"11749,362980
+  DEFVAR_LISP ("global-disable-point-adjustment"11761,363530
+  DEFVAR_LISP ("minibuffer-message-timeout"11770,363896
+  DEFVAR_LISP ("throw-on-input"11775,364174
+  DEFVAR_LISP ("command-error-function"11781,364425
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364912
+  DEFVAR_LISP ("select-active-regions"11798,365239
+  DEFVAR_LISP ("saved-region-selection"11807,365631
+  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366016
+  DEFVAR_LISP ("debug-on-event"11825,366557
+keys_of_keyboard 11841,367118
+mark_kboards 11916,370437
+  DEFVAR_LISP ("internal--top-level-message",\111058,333975
+  DEFVAR_LISP ("last-command-event",\111312,342176
+  DEFVAR_LISP ("last-nonmenu-event",\111315,342300
+  DEFVAR_LISP ("last-input-event",\111321,342639
+  DEFVAR_LISP ("unread-command-events",\111324,342733
+  DEFVAR_LISP ("unread-post-input-method-events",\111332,343193
+  DEFVAR_LISP ("unread-input-method-events",\111338,343532
+  DEFVAR_LISP ("meta-prefix-char",\111346,343901
+  DEFVAR_KBOARD ("last-command",\111351,344109
+  DEFVAR_KBOARD ("real-last-command",\111368,344790
+  DEFVAR_KBOARD ("last-repeatable-command",\111372,344976
+  DEFVAR_LISP ("this-command",\111378,345264
+  DEFVAR_LISP ("real-this-command",\111384,345501
+  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345683
+  DEFVAR_LISP ("this-original-command",\111396,346126
+  DEFVAR_INT ("auto-save-interval",\111403,346523
+  DEFVAR_LISP ("auto-save-timeout",\111408,346737
+  DEFVAR_LISP ("echo-keystrokes",\111415,347082
+  DEFVAR_INT ("polling-period",\111421,347353
+  DEFVAR_LISP ("double-click-time",\111428,347696
+  DEFVAR_INT ("double-click-fuzz",\111435,348032
+  DEFVAR_INT ("num-input-keys",\111446,348522
+  DEFVAR_INT ("num-nonmacro-input-events",\111452,348797
+  DEFVAR_LISP ("last-event-frame",\111457,349035
+  DEFVAR_LISP ("tty-erase-char",\111463,349314
+  DEFVAR_LISP ("help-char",\111466,349437
+  DEFVAR_LISP ("help-event-list",\111472,349720
+  DEFVAR_LISP ("help-form",\111477,349931
+  DEFVAR_LISP ("prefix-help-command",\111483,350179
+  DEFVAR_LISP ("top-level",\111489,350457
+  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350678
+  DEFVAR_BOOL ("cannot-suspend",\111511,351491
+  DEFVAR_BOOL ("menu-prompting",\111516,351718
+  DEFVAR_LISP ("menu-prompt-more-char",\111526,352148
+  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352394
+  DEFVAR_LISP ("deactivate-mark",\111545,353120
+  DEFVAR_LISP ("pre-command-hook",\111553,353489
+  DEFVAR_LISP ("post-command-hook",\111560,353844
+  DEFVAR_LISP ("echo-area-clear-hook",\111568,354207
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354422
+  DEFVAR_LISP ("menu-bar-final-items",\111578,354625
+  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354875
+  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355233
+  DEFVAR_LISP ("overriding-local-map",\111598,355655
+  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356106
+  DEFVAR_LISP ("special-event-map",\111613,356445
+  DEFVAR_LISP ("track-mouse",\111617,356633
+  DEFVAR_KBOARD ("system-key-alist",\111620,356760
+  DEFVAR_KBOARD ("local-function-key-map",\111629,357141
+  DEFVAR_KBOARD ("input-decode-map",\111658,358600
+  DEFVAR_LISP ("function-key-map",\111675,359388
+  DEFVAR_LISP ("key-translation-map",\111683,359804
+  DEFVAR_LISP ("deferred-action-list",\111689,360148
+  DEFVAR_LISP ("deferred-action-function",\111694,360396
+  DEFVAR_LISP ("delayed-warnings-list",\111700,360695
+  DEFVAR_LISP ("timer-list",\111708,361103
+  DEFVAR_LISP ("timer-idle-list",\111712,361255
+  DEFVAR_LISP ("input-method-function",\111716,361418
+  DEFVAR_LISP ("input-method-previous-message",\111737,362387
+  DEFVAR_LISP ("show-help-function",\111744,362748
+  DEFVAR_LISP ("disable-point-adjustment",\111749,362980
+  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363530
+  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363896
+  DEFVAR_LISP ("throw-on-input",\111775,364174
+  DEFVAR_LISP ("command-error-function",\111781,364425
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364912
+  DEFVAR_LISP ("select-active-regions",\111798,365239
+  DEFVAR_LISP ("saved-region-selection",\111807,365631
+  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366016
+  DEFVAR_LISP ("debug-on-event",\111825,366557
 
 c-src/emacs/src/lisp.h,41391
 #define EMACS_LISP_H22,801
@@ -3274,112 +3274,112 @@ el-src/emacs/lisp/progmodes/etags.el,5188
 (defcustom tags-tag-face 148,5700
 (defcustom tags-apropos-verbose 154,5835
 (defcustom tags-apropos-additional-actions 160,5999
-(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6918
-(defvar default-tags-table-function 189,7098
-(defvar tags-location-ring 194,7324
-(defvar tags-table-files 201,7600
-(defvar tags-completion-table 206,7767
-(defvar tags-included-tables 209,7859
-(defvar next-file-list 212,7954
-(defvar tags-table-format-functions 217,8060
-(defvar file-of-tag-function 224,8441
-(defvar tags-table-files-function 228,8635
-(defvar tags-completion-table-function 230,8746
-(defvar snarf-tag-function 232,8841
-(defvar goto-tag-location-function 236,9050
-(defvar find-tag-regexp-search-function 239,9223
-(defvar find-tag-regexp-tag-order 241,9344
-(defvar find-tag-regexp-next-line-after-failure-p 243,9453
-(defvar find-tag-search-function 245,9573
-(defvar find-tag-tag-order 247,9680
-(defvar find-tag-next-line-after-failure-p 249,9775
-(defvar list-tags-function 251,9881
-(defvar tags-apropos-function 253,9969
-(defvar tags-included-tables-function 255,10063
-(defvar verify-tags-table-function 257,10182
-(defun initialize-new-tags-table 260,10293
-(defun tags-table-mode 276,10981
-(defun visit-tags-table 285,11246
-(defun tags-table-check-computed-list 321,12784
-(defun tags-table-extend-computed-list 360,14655
-(defun tags-expand-table-name 400,16368
-(defun tags-table-list-member 409,16711
-(defun tags-verify-table 421,17183
-(defun tags-table-including 470,19303
-(defun tags-next-table 522,21347
-(defun visit-tags-table-buffer 543,22204
-(defun tags-reset-tags-tables 712,28514
-(defun file-of-tag 731,29171
-(defun tags-table-files 740,29521
-(defun tags-included-tables 749,29871
-(defun tags-completion-table 755,30117
-(defun tags-lazy-completion-table 783,31311
-(defun tags-completion-at-point-function 799,31946
-(defun find-tag-tag 818,32696
-(defvar last-tag 837,33369
-(defun find-tag-interactive 840,33428
-(defvar find-tag-history 852,33843
-(defvar etags-case-fold-search)855,33908
-(defvar etags-syntax-table)856,33940
-(defvar local-find-tag-hook)857,33968
-(defun find-tag-noselect 860,34013
-(defun find-tag 932,37127
-(defun find-tag-other-window 959,38343
-(defun find-tag-other-frame 1000,40271
-(defun find-tag-regexp 1025,41445
-(defalias 'pop-tag-mark pop-tag-mark1049,42607
-(defvar tag-lines-already-matched 1052,42658
-(defun find-tag-in-order 1055,42765
-(defun tag-find-file-of-tag-noselect 1167,47111
-(defun tag-find-file-of-tag 1200,48957
-(defun etags-recognize-tags-table 1208,49183
-(defun etags-verify-tags-table 1241,50814
-(defun etags-file-of-tag 1246,51012
-(defun etags-tags-completion-table 1256,51347
-(defun etags-snarf-tag 1286,52553
-(defun etags-goto-tag-location 1324,54122
-(defun etags-list-tags 1388,56565
-(defmacro tags-with-face 1423,57840
-(defun etags-tags-apropos-additional 1431,58173
-(defun etags-tags-apropos 1465,59410
-(defun etags-tags-table-files 1527,61619
-(defun etags-tags-included-tables 1542,62055
-(defun tags-recognize-empty-tags-table 1559,62595
-(defun tag-exact-file-name-match-p 1587,63741
-(defun tag-file-name-match-p 1596,64134
-(defun tag-exact-match-p 1609,64690
-(defun tag-implicit-name-match-p 1620,65258
-(defun tag-symbol-match-p 1633,65858
-(defun tag-word-match-p 1643,66294
-(defun tag-partial-file-name-match-p 1652,66692
-(defun tag-any-match-p 1662,67136
-(defun tag-re-match-p 1667,67320
-(defcustom tags-loop-revert-buffers 1675,67569
-(defun next-file 1685,67978
-(defvar tags-loop-operate 1760,70892
-(defvar tags-loop-scan1763,70986
-(defun tags-loop-eval 1771,71315
-(defun tags-loop-continue 1782,71644
-(defun tags-search 1850,73950
-(defun tags-query-replace 1871,74776
-(defun tags-complete-tags-table-file 1896,76000
-(defun list-tags 1906,76379
-(defun tags-apropos 1934,77332
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78158
-(defun select-tags-table 1964,78397
-(defvar select-tags-table-mode-map 2019,80524
-(define-derived-mode select-tags-table-mode 2030,80907
-(defun select-tags-table-select 2034,81091
-(defun select-tags-table-quit 2043,81457
-(defun complete-tag 2049,81612
-(defconst etags--xref-limit 2074,82553
-(defvar etags-xref-find-definitions-tag-order 2076,82588
-(defun etags-xref-find 2082,82878
-(defun etags--xref-find-definitions 2096,83407
-(defclass xref-etags-location 2129,85121
-(defun xref-make-etags-location 2135,85344
-(cl-defmethod xref-location-marker 2139,85499
-(cl-defmethod xref-location-line 2146,85743
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6921
+(defvar default-tags-table-function 189,7101
+(defvar tags-location-ring 194,7327
+(defvar tags-table-files 201,7603
+(defvar tags-completion-table 206,7770
+(defvar tags-included-tables 209,7862
+(defvar next-file-list 212,7957
+(defvar tags-table-format-functions 217,8063
+(defvar file-of-tag-function 224,8444
+(defvar tags-table-files-function 228,8638
+(defvar tags-completion-table-function 230,8749
+(defvar snarf-tag-function 232,8844
+(defvar goto-tag-location-function 236,9053
+(defvar find-tag-regexp-search-function 239,9226
+(defvar find-tag-regexp-tag-order 241,9347
+(defvar find-tag-regexp-next-line-after-failure-p 243,9456
+(defvar find-tag-search-function 245,9576
+(defvar find-tag-tag-order 247,9683
+(defvar find-tag-next-line-after-failure-p 249,9778
+(defvar list-tags-function 251,9884
+(defvar tags-apropos-function 253,9972
+(defvar tags-included-tables-function 255,10066
+(defvar verify-tags-table-function 257,10185
+(defun initialize-new-tags-table 260,10296
+(defun tags-table-mode 276,10984
+(defun visit-tags-table 285,11249
+(defun tags-table-check-computed-list 321,12787
+(defun tags-table-extend-computed-list 360,14658
+(defun tags-expand-table-name 400,16371
+(defun tags-table-list-member 409,16714
+(defun tags-verify-table 421,17186
+(defun tags-table-including 470,19306
+(defun tags-next-table 522,21350
+(defun visit-tags-table-buffer 543,22207
+(defun tags-reset-tags-tables 712,28517
+(defun file-of-tag 731,29174
+(defun tags-table-files 740,29524
+(defun tags-included-tables 749,29874
+(defun tags-completion-table 755,30120
+(defun tags-lazy-completion-table 783,31314
+(defun tags-completion-at-point-function 799,31949
+(defun find-tag-tag 818,32699
+(defvar last-tag 837,33372
+(defun find-tag-interactive 840,33431
+(defvar find-tag-history 852,33846
+(defvar etags-case-fold-search)855,33911
+(defvar etags-syntax-table)856,33943
+(defvar local-find-tag-hook)857,33971
+(defun find-tag-noselect 860,34016
+(defun find-tag 932,37130
+(defun find-tag-other-window 959,38346
+(defun find-tag-other-frame 1000,40274
+(defun find-tag-regexp 1025,41448
+(defalias 'pop-tag-mark pop-tag-mark1049,42610
+(defvar tag-lines-already-matched 1052,42661
+(defun find-tag-in-order 1055,42768
+(defun tag-find-file-of-tag-noselect 1167,47114
+(defun tag-find-file-of-tag 1200,48960
+(defun etags-recognize-tags-table 1208,49186
+(defun etags-verify-tags-table 1241,50817
+(defun etags-file-of-tag 1246,51015
+(defun etags-tags-completion-table 1256,51350
+(defun etags-snarf-tag 1286,52556
+(defun etags-goto-tag-location 1324,54125
+(defun etags-list-tags 1388,56568
+(defmacro tags-with-face 1423,57843
+(defun etags-tags-apropos-additional 1431,58176
+(defun etags-tags-apropos 1465,59413
+(defun etags-tags-table-files 1527,61622
+(defun etags-tags-included-tables 1542,62058
+(defun tags-recognize-empty-tags-table 1559,62598
+(defun tag-exact-file-name-match-p 1587,63744
+(defun tag-file-name-match-p 1596,64137
+(defun tag-exact-match-p 1609,64693
+(defun tag-implicit-name-match-p 1620,65261
+(defun tag-symbol-match-p 1633,65861
+(defun tag-word-match-p 1643,66297
+(defun tag-partial-file-name-match-p 1652,66695
+(defun tag-any-match-p 1662,67139
+(defun tag-re-match-p 1667,67323
+(defcustom tags-loop-revert-buffers 1675,67572
+(defun next-file 1685,67981
+(defvar tags-loop-operate 1760,70895
+(defvar tags-loop-scan1763,70989
+(defun tags-loop-eval 1771,71318
+(defun tags-loop-continue 1782,71647
+(defun tags-search 1850,73953
+(defun tags-query-replace 1871,74779
+(defun tags-complete-tags-table-file 1896,76003
+(defun list-tags 1906,76382
+(defun tags-apropos 1934,77335
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78161
+(defun select-tags-table 1964,78400
+(defvar select-tags-table-mode-map 2019,80527
+(define-derived-mode select-tags-table-mode 2030,80910
+(defun select-tags-table-select 2034,81094
+(defun select-tags-table-quit 2043,81460
+(defun complete-tag 2049,81615
+(defconst etags--xref-limit 2074,82556
+(defvar etags-xref-find-definitions-tag-order 2076,82591
+(defun etags-xref-find 2082,82881
+(defun etags--xref-find-definitions 2096,83410
+(defclass xref-etags-location 2129,85124
+(defun xref-make-etags-location 2135,85347
+(cl-defmethod xref-location-marker 2139,85502
+(cl-defmethod xref-location-line 2146,85746
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
diff --git a/test/manual/etags/c-src/emacs/src/keyboard.c 
b/test/manual/etags/c-src/emacs/src/keyboard.c
index 7228f8cb5d..506bf0d01c 100644
--- a/test/manual/etags/c-src/emacs/src/keyboard.c
+++ b/test/manual/etags/c-src/emacs/src/keyboard.c
@@ -759,7 +759,7 @@ force_auto_save_soon (void)
 DEFUN ("recursive-edit", Frecursive_edit, Srecursive_edit, 0, 0, "",
        doc: /* Invoke the editor command loop recursively.
 To get out of the recursive edit, a command can throw to `exit' -- for
-instance `(throw 'exit nil)'.
+instance `(throw \\='exit nil)'.
 If you throw a value other than t, `recursive-edit' returns normally
 to the function that called it.  Throwing a t value causes
 `recursive-edit' to quit, so that control returns to the command loop
diff --git a/test/manual/etags/el-src/emacs/lisp/progmodes/etags.el 
b/test/manual/etags/el-src/emacs/lisp/progmodes/etags.el
index e589263dc3..9ae8014955 100644
--- a/test/manual/etags/el-src/emacs/lisp/progmodes/etags.el
+++ b/test/manual/etags/el-src/emacs/lisp/progmodes/etags.el
@@ -171,7 +171,7 @@ is the symbol being selected.
 
 Example value:
 
-  '((\"Emacs Lisp\" Info-goto-emacs-command-node obarray)
+  \\='((\"Emacs Lisp\" Info-goto-emacs-command-node obarray)
     (\"Common Lisp\" common-lisp-hyperspec common-lisp-hyperspec-obarray)
     (\"SCWM\" scwm-documentation scwm-obarray))"
   :group 'etags
diff --git a/test/src/buffer-tests.el b/test/src/buffer-tests.el
index c1e5d0ebed..13d48b31a4 100644
--- a/test/src/buffer-tests.el
+++ b/test/src/buffer-tests.el
@@ -1482,4 +1482,53 @@ with parameters from the *Messages* buffer modification."
           (when auto-save
             (ignore-errors (delete-file auto-save))))))))
 
+(ert-deftest test-buffer-modifications ()
+  (ert-with-temp-file file
+    (with-current-buffer (find-file file)
+      (auto-save-mode 1)
+      (should-not (buffer-modified-p))
+      (insert "foo")
+      (should (buffer-modified-p))
+      (should-not (eq (buffer-modified-p) 'autosaved))
+      (do-auto-save nil t)
+      (should (eq (buffer-modified-p) 'autosaved))
+      (with-silent-modifications
+        (put-text-property 1 3 'face 'bold))
+      (should (eq (buffer-modified-p) 'autosaved))
+      (save-buffer)
+      (should-not (buffer-modified-p))
+      (with-silent-modifications
+        (put-text-property 1 3 'face 'italic))
+      (should-not (buffer-modified-p)))))
+
+(ert-deftest test-restore-buffer-modified-p ()
+  (ert-with-temp-file file
+    (with-current-buffer (find-file file)
+      (auto-save-mode 1)
+      (should-not (buffer-modified-p))
+      (insert "foo")
+      (should (buffer-modified-p))
+      (restore-buffer-modified-p nil)
+      (should-not (buffer-modified-p))
+      (insert "bar")
+      (do-auto-save nil t)
+      (should (eq (buffer-modified-p) 'autosaved))
+      (insert "zot")
+      (restore-buffer-modified-p 'autosaved)
+      (should (eq (buffer-modified-p) 'autosaved))
+
+      ;; Clean up.
+      (when (file-exists-p buffer-auto-save-file-name)
+        (delete-file buffer-auto-save-file-name))))
+
+  (ert-with-temp-file file
+    (with-current-buffer (find-file file)
+      (auto-save-mode 1)
+      (should-not (buffer-modified-p))
+      (insert "foo")
+      (should (buffer-modified-p))
+      (should-not (eq (buffer-modified-p) 'autosaved))
+      (restore-buffer-modified-p 'autosaved)
+      (should (eq (buffer-modified-p) 'autosaved)))))
+
 ;;; buffer-tests.el ends here
diff --git a/test/src/comp-tests.el b/test/src/comp-tests.el
index 212d9e999f..e7b534d00e 100644
--- a/test/src/comp-tests.el
+++ b/test/src/comp-tests.el
@@ -51,7 +51,14 @@
            (doc-string 3))
   `(ert-deftest ,(intern (concat "comp-tests-" (symbol-name name))) ,args
      :tags '(:nativecomp)
-     ,@docstring-and-body))
+     ,@(and (stringp (car docstring-and-body))
+            (list (pop docstring-and-body)))
+     ;; Some of the tests leave spill files behind -- so create a
+     ;; sub-dir where native-comp can do its work, and then delete it
+     ;; at the end.
+     (ert-with-temp-directory dir
+       (let ((temporary-file-directory dir))
+         ,@docstring-and-body))))
 
 
 
diff --git a/test/src/eval-tests.el b/test/src/eval-tests.el
index e4230c10ef..1b2ad99360 100644
--- a/test/src/eval-tests.el
+++ b/test/src/eval-tests.el
@@ -240,4 +240,31 @@ expressions works for identifiers starting with period."
       (should (equal (string-trim (buffer-string))
                      "Error: (error \"Boo\")")))))
 
+(ert-deftest eval-tests/funcall-with-delayed-message ()
+  ;; Check that `funcall-with-delayed-message' displays its message before
+  ;; its function terminates iff the timeout is short enough.
+
+  ;; This also serves as regression test for bug#55628 where a short
+  ;; timeout was rounded up to the next whole second.
+  (dolist (params '((0.8 0.4)
+                    (0.1 0.8)))
+    (let ((timeout (nth 0 params))
+          (work-time (nth 1 params)))
+      (ert-info ((prin1-to-string params) :prefix "params: ")
+        (with-current-buffer "*Messages*"
+          (let ((inhibit-read-only t))
+            (erase-buffer))
+          (let ((stop (+ (float-time) work-time)))
+            (funcall-with-delayed-message
+             timeout "timed out"
+             (lambda ()
+               (while (< (float-time) stop))
+               (message "finished"))))
+          (let ((expected-messages
+                 (if (< timeout work-time)
+                     "timed out\nfinished"
+                   "finished")))
+            (should (equal (string-trim (buffer-string))
+                           expected-messages))))))))
+
 ;;; eval-tests.el ends here
diff --git a/test/src/fileio-tests.el b/test/src/fileio-tests.el
index 511490c574..c137ce06f1 100644
--- a/test/src/fileio-tests.el
+++ b/test/src/fileio-tests.el
@@ -138,7 +138,7 @@ Also check that an encoding error can appear in a symlink."
     (should (and (file-name-absolute-p name)
                  (not (eq (aref name 0) ?~))))))
 
-(ert-deftest fileio-test--expand-file-name-null-bytes ()
+(ert-deftest fileio-tests--expand-file-name-null-bytes ()
   "Test that `expand-file-name' checks for null bytes in filenames."
   (should-error (expand-file-name (concat "file" (char-to-string ?\0) ".txt"))
                 :type 'wrong-type-argument)
@@ -193,4 +193,12 @@ Also check that an encoding error can appear in a symlink."
   (should (equal (file-name-concat "" "bar") "bar"))
   (should (equal (file-name-concat "" "") "")))
 
+(ert-deftest fileio-tests--non-regular-insert ()
+  (skip-unless (file-exists-p "/dev/urandom"))
+  (with-temp-buffer
+    (set-buffer-multibyte nil)
+    (should-error (insert-file-contents "/dev/urandom" nil 5 10))
+    (insert-file-contents "/dev/urandom" nil nil 10)
+    (should (= (buffer-size) 10))))
+
 ;;; fileio-tests.el ends here
diff --git a/test/src/image-tests.el b/test/src/image-tests.el
index 3885981e0b..f710aadea7 100644
--- a/test/src/image-tests.el
+++ b/test/src/image-tests.el
@@ -53,6 +53,8 @@
 
 ;;;; image-test-size
 
+(declare-function image-size "image.c" (spec &optional pixels frame))
+
 (ert-deftest image-tests-image-size/gif ()
   (image-skip-unless 'gif)
   (pcase (image-size (create-image (cdr (assq 'gif image-tests--images))))
@@ -126,6 +128,8 @@
 
 ;;;; image-mask-p
 
+(declare-function image-mask-p "image.c" (spec &optional frame))
+
 (ert-deftest image-tests-image-mask-p/gif ()
   (image-skip-unless 'gif)
   (should-not (image-mask-p (create-image
@@ -176,6 +180,8 @@
 
 ;;;; image-metadata
 
+(declare-function image-metadata "image.c" (spec &optional frame))
+
 ;; TODO: These tests could be expanded with files that actually
 ;;       contain metadata.
 
@@ -238,6 +244,7 @@
 
 (ert-deftest image-tests-init-image-library ()
   (skip-unless (fboundp 'init-image-library))
+  (declare-function init-image-library "image.c" (type))
   (should (init-image-library 'pbm)) ; built-in
   (should-not (init-image-library 'invalid-image-type)))
 
diff --git a/test/src/lread-tests.el b/test/src/lread-tests.el
index 9ec54c719c..f190f14781 100644
--- a/test/src/lread-tests.el
+++ b/test/src/lread-tests.el
@@ -281,4 +281,45 @@ literals (Bug#20852)."
       (should (equal (lread-test-read-and-print str) str))))
   (should-error (read-from-string "#1=#1#") :type 'invalid-read-syntax))
 
+(ert-deftest lread-deeply-nested ()
+  ;; Check that we can read a deeply nested data structure correctly.
+  (let ((levels 10000)
+        (prefix nil)
+        (suffix nil))
+    (dotimes (_ levels)
+      (push "([#s(r " prefix)
+      (push ")])" suffix))
+    (let ((str (concat (apply #'concat prefix)
+                       "a"
+                       (apply #'concat suffix))))
+      (let* ((read-circle t)
+             (result (read-from-string str)))
+        (should (equal (cdr result) (length str)))
+        ;; Check the result.  (We can't build a reference value and compare
+        ;; using `equal' because that function is currently depth-limited.)
+        (named-let check ((x (car result)) (level 0))
+          (if (equal level levels)
+              (should (equal x 'a))
+            (should (and (consp x) (null (cdr x))))
+            (let ((x2 (car x)))
+              (should (and (vectorp x2) (equal (length x2) 1)))
+              (let ((x3 (aref x2 0)))
+                (should (and (recordp x3) (equal (length x3) 2)
+                             (equal (aref x3 0) 'r)))
+                (check (aref x3 1) (1+ level))))))))))
+
+(ert-deftest lread-misc ()
+  ;; Regression tests for issues found and fixed in bug#55676:
+  ;; Non-breaking space after a dot makes it a dot token.
+  (should (equal (read-from-string "(a .\u00A0b)")
+                 '((a . b) . 7)))
+  ;; #_ without symbol following is the interned empty symbol.
+  (should (equal (read-from-string "#_")
+                 '(## . 2))))
+
+(ert-deftest lread-escaped-lf ()
+  ;; ?\LF should signal an error; \LF is ignored inside string literals.
+  (should-error (read-from-string "?\\\n x"))
+  (should (equal (read-from-string "\"a\\\nb\"") '("ab" . 6))))
+
 ;;; lread-tests.el ends here
diff --git a/test/src/print-tests.el b/test/src/print-tests.el
index 0bae1959d1..6ff7e99783 100644
--- a/test/src/print-tests.el
+++ b/test/src/print-tests.el
@@ -425,5 +425,110 @@ otherwise, use a different charset."
   (should (equal (prin1-to-string '\?bar) "\\?bar"))
   (should (equal (prin1-to-string '\?bar?) "\\?bar?")))
 
+(ert-deftest test-prin1-overrides ()
+  (with-temp-buffer
+    (let ((print-length 10))
+      (prin1 (make-list 20 t) (current-buffer) t)
+      (should (= print-length 10)))
+    (goto-char (point-min))
+    (should (= (length (read (current-buffer))) 20)))
+
+  (with-temp-buffer
+    (let ((print-length 10))
+      (prin1 (make-list 20 t) (current-buffer) '((length . 5)))
+      (should (= print-length 10)))
+    (goto-char (point-min))
+    (should (= (length (read (current-buffer))) 6)))
+
+  (with-temp-buffer
+    (let ((print-length 10))
+      (prin1 (make-list 20 t) (current-buffer) '(t (length . 5)))
+      (should (= print-length 10)))
+    (goto-char (point-min))
+    (should (= (length (read (current-buffer))) 6))))
+
+(ert-deftest test-prin1-to-string-overrides ()
+  (let ((print-length 10))
+    (should
+     (= (length (car (read-from-string
+                      (prin1-to-string (make-list 20 t) nil t))))
+        20)))
+
+  (let ((print-length 10))
+    (should
+     (= (length (car (read-from-string
+                      (prin1-to-string (make-list 20 t) nil
+                                       '((length . 5))))))
+        6)))
+
+  (should-error (prin1-to-string 'foo nil 'a))
+  (should-error (prin1-to-string 'foo nil '(a)))
+  (should-error (prin1-to-string 'foo nil '(t . b)))
+  (should-error (prin1-to-string 'foo nil '(t b)))
+  (should-error (prin1-to-string 'foo nil '((a . b) b)))
+  (should-error (prin1-to-string 'foo nil '((length . 10) . b))))
+
+(ert-deftest print-deeply-nested ()
+  ;; Check that we can print a deeply nested data structure correctly.
+  (let ((print-circle t))
+    (let ((levels 10000)
+          (x 'a)
+          (prefix nil)
+          (suffix nil))
+      (dotimes (_ levels)
+        (setq x (list (vector (record 'r x))))
+        (push "([#s(r " prefix)
+        (push ")])" suffix))
+      (let ((expected (concat (apply #'concat prefix)
+                              "a"
+                              (apply #'concat suffix))))
+        (should (equal (prin1-to-string x) expected))))))
+
+(defun print-test-rho (lead loop)
+  "A circular iota list with LEAD elements followed by LOOP in circle."
+ (let ((l (number-sequence 1 (+ lead loop))))
+   (setcdr (nthcdr (+ lead loop -1) l) (nthcdr lead l))
+   l))
+
+(ert-deftest print-circular ()
+  ;; Check printing of rho-shaped circular lists such as (1 2 3 4 5 4 5 4 . #6)
+  ;; when `print-circle' is nil.  The exact output may differ since the number
+  ;; of elements printed of the looping part can vary depending on when the
+  ;; circularity was detected.
+  (dotimes (lead 7)
+    (ert-info ((prin1-to-string lead) :prefix "lead: ")
+      (dolist (loop (number-sequence 1 7))
+        (ert-info ((prin1-to-string loop) :prefix "loop: ")
+          (let* ((rho (print-test-rho lead loop))
+                 (print-circle nil)
+                 (str (prin1-to-string rho)))
+            (should (string-match (rx "("
+                                      (group (+ (+ digit) " "))
+                                      ". #" (group (+ digit)) ")")
+                                  str))
+            (let* ((g1 (match-string 1 str))
+                   (g2 (match-string 2 str))
+                   (numbers (mapcar #'string-to-number (split-string g1)))
+                   (loopback-index (string-to-number g2)))
+              ;; Split the numbers in the lead and loop part.
+              (should (< lead (length numbers)))
+              (should (<= lead loopback-index))
+              (should (< loopback-index (length numbers)))
+              (let ((lead-part (butlast numbers (- (length numbers) lead)))
+                    (loop-part (nthcdr lead numbers)))
+                ;; The lead part must match exactly.
+                (should (equal lead-part (number-sequence 1 lead)))
+                ;; The loop part is at least LOOP long: make sure it matches.
+                (should (>= (length loop-part) loop))
+                (let ((expected-loop-part
+                       (mapcar (lambda (x) (+ lead 1 (% x loop)))
+                               (number-sequence 0 (1- (length loop-part))))))
+                  (should (equal loop-part expected-loop-part))
+                  ;; The loopback index must match the length of the
+                  ;; loop part.
+                  (should (equal (% (- (length numbers) loopback-index) loop)
+                                 0)))))))))))
+
+
 (provide 'print-tests)
 ;;; print-tests.el ends here
diff --git a/test/src/process-tests.el b/test/src/process-tests.el
index f5908d3cda..824c6da119 100644
--- a/test/src/process-tests.el
+++ b/test/src/process-tests.el
@@ -931,7 +931,7 @@ Return nil if FILENAME doesn't exist."
                         (< (float-time) (+ t0 limit)))
               (sit-for 0.1)))
           (should status)
-          (should-not (assq :error status))
+          (should-not (plist-get status ':error))
           (should buf)
           (should (> (buffer-size buf) 0))
           )



reply via email to

[Prev in Thread] Current Thread [Next in Thread]