emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] xwidget_mvp 5498c35 1/2: Merge remote-tracking branch 'ori


From: Joakim Verona
Subject: [Emacs-diffs] xwidget_mvp 5498c35 1/2: Merge remote-tracking branch 'origin/master' into xwidget_mvp
Date: Sat, 09 Jan 2016 15:48:38 +0000

branch: xwidget_mvp
commit 5498c3509b2a69207c807d23c6013b148ce37bc4
Merge: 2d27e24 fb6d826
Author: Joakim Verona <address@hidden>
Commit: Joakim Verona <address@hidden>

    Merge remote-tracking branch 'origin/master' into xwidget_mvp
---
 .gitignore                                         |    4 +
 CONTRIBUTE                                         |   21 +-
 ChangeLog.2                                        |  251 ++-
 INSTALL                                            |    2 +
 admin/notes/triage                                 |   68 +
 admin/release-process                              |   69 +-
 build-aux/gitlog-to-emacslog                       |    2 +-
 configure.ac                                       |   60 +-
 doc/emacs/abbrevs.texi                             |    4 +-
 doc/emacs/ack.texi                                 |    4 +
 doc/emacs/buffers.texi                             |    5 +-
 doc/emacs/custom.texi                              |    8 +
 doc/emacs/emacs.texi                               |   19 +-
 doc/emacs/files.texi                               |   11 +-
 doc/emacs/frames.texi                              |    9 +-
 doc/emacs/glossary.texi                            |   11 +
 doc/emacs/help.texi                                |   17 +-
 doc/emacs/killing.texi                             |   23 +-
 doc/emacs/m-x.texi                                 |   18 +-
 doc/emacs/maintaining.texi                         |  102 +-
 doc/emacs/mini.texi                                |   34 +-
 doc/emacs/misc.texi                                |   26 +-
 doc/emacs/package.texi                             |   33 +-
 doc/emacs/programs.texi                            |   77 +-
 doc/emacs/regs.texi                                |   10 +-
 doc/emacs/rmail.texi                               |   30 +-
 doc/emacs/search.texi                              |  779 ++++--
 doc/emacs/trouble.texi                             |    2 +-
 doc/lispref/buffers.texi                           |    4 +-
 doc/lispref/display.texi                           |   40 +-
 doc/lispref/elisp.texi                             |   20 +
 doc/lispref/eval.texi                              |    9 +-
 doc/lispref/files.texi                             |   32 +-
 doc/lispref/frames.texi                            |   40 +-
 doc/lispref/functions.texi                         |   17 +-
 doc/lispref/help.texi                              |   12 +-
 doc/lispref/internals.texi                         |    4 +-
 doc/lispref/loading.texi                           |   61 +-
 doc/lispref/modes.texi                             |   63 +
 doc/lispref/os.texi                                |   17 +-
 doc/lispref/positions.texi                         |   12 +
 doc/lispref/processes.texi                         |   48 +-
 doc/lispref/strings.texi                           |   13 +-
 doc/lispref/syntax.texi                            |    8 +
 doc/lispref/text.texi                              |  166 +-
 doc/lispref/tips.texi                              |   16 +-
 doc/lispref/windows.texi                           |  128 +-
 doc/man/etags.1                                    |    2 +-
 doc/misc/calc.texi                                 |   16 +-
 doc/misc/cc-mode.texi                              |    6 +-
 doc/misc/cl.texi                                   |    9 +-
 doc/misc/ert.texi                                  |    9 +
 doc/misc/eudc.texi                                 |   92 +-
 doc/misc/ido.texi                                  |    3 +-
 doc/misc/ses.texi                                  |   43 +-
 doc/misc/texinfo.tex                               |  400 ++--
 doc/misc/tramp.texi                                | 3194 +++++++++-----------
 doc/misc/trampver.texi                             |    2 +-
 doc/misc/url.texi                                  |   52 +-
 etc/DEBUG                                          |  250 +-
 etc/NEWS                                           |  699 +++--
 etc/PROBLEMS                                       |    4 +
 etc/tutorials/TUTORIAL.it                          | 1587 ++++++-----
 etc/tutorials/TUTORIAL.pt_BR                       |    2 +-
 lib-src/etags.c                                    |   55 +-
 lib-src/pop.c                                      |    4 -
 lib/gnulib.mk                                      |    2 +-
 lib/intprops.h                                     |    7 +-
 lisp/apropos.el                                    |    2 +-
 lisp/autorevert.el                                 |    2 +-
 lisp/calendar/cal-html.el                          |    9 +-
 lisp/calendar/calendar.el                          |    8 +-
 lisp/calendar/diary-lib.el                         |   17 +-
 lisp/calendar/holidays.el                          |    5 +-
 lisp/calendar/icalendar.el                         |   17 +-
 lisp/cedet/cedet-global.el                         |    3 +-
 lisp/cedet/ede.el                                  |    8 +-
 lisp/cedet/ede/files.el                            |    2 +-
 lisp/cedet/ede/locate.el                           |   10 +-
 lisp/cedet/mode-local.el                           |   24 +-
 lisp/cedet/semantic.el                             |    4 +-
 lisp/cedet/semantic/bovine/c.el                    |    4 +-
 lisp/cedet/semantic/db-find.el                     |    4 +-
 lisp/cedet/semantic/doc.el                         |    6 +-
 lisp/cedet/semantic/find.el                        |    4 +-
 lisp/cedet/semantic/fw.el                          |    4 +-
 lisp/cedet/semantic/lex.el                         |    4 +-
 lisp/cedet/semantic/sort.el                        |    2 +-
 lisp/cedet/semantic/symref.el                      |   14 +-
 lisp/cedet/semantic/tag.el                         |   24 +-
 lisp/character-fold.el                             |  240 +-
 lisp/desktop.el                                    |    8 +-
 lisp/dframe.el                                     |    6 +-
 lisp/emacs-lisp/advice.el                          |    4 +-
 lisp/emacs-lisp/avl-tree.el                        |    2 +-
 lisp/emacs-lisp/backquote.el                       |    4 +-
 lisp/emacs-lisp/bytecomp.el                        |   93 +-
 lisp/emacs-lisp/cconv.el                           |   41 +-
 lisp/emacs-lisp/chart.el                           |    4 +-
 lisp/emacs-lisp/checkdoc.el                        |    1 +
 lisp/emacs-lisp/cl-generic.el                      |    8 +-
 lisp/emacs-lisp/cl-macs.el                         |   13 +-
 lisp/emacs-lisp/cl-preloaded.el                    |    1 +
 lisp/emacs-lisp/easy-mmode.el                      |    4 +-
 lisp/emacs-lisp/eieio-compat.el                    |    1 +
 lisp/emacs-lisp/ert.el                             |  339 +--
 lisp/emacs-lisp/gv.el                              |    4 +-
 lisp/emacs-lisp/let-alist.el                       |    8 +-
 lisp/emacs-lisp/lisp-mode.el                       |    6 +-
 lisp/emacs-lisp/nadvice.el                         |   10 +-
 lisp/emacs-lisp/package.el                         |  235 +-
 lisp/emacs-lisp/pcase.el                           |    4 +-
 lisp/emacs-lisp/smie.el                            |   14 +-
 lisp/emulation/keypad.el                           |   18 +-
 lisp/emulation/viper-keym.el                       |    2 +-
 lisp/epg.el                                        |   16 +-
 lisp/erc/erc-backend.el                            |  150 +-
 lisp/erc/erc-button.el                             |    6 +-
 lisp/erc/erc-join.el                               |   10 +-
 lisp/erc/erc-log.el                                |    9 +-
 lisp/erc/erc-match.el                              |    2 +-
 lisp/erc/erc-ring.el                               |    3 +-
 lisp/erc/erc-track.el                              |    6 +-
 lisp/erc/erc.el                                    |   32 +-
 lisp/eshell/esh-cmd.el                             |    6 +-
 lisp/eshell/esh-util.el                            |    4 +-
 lisp/facemenu.el                                   |    4 +-
 lisp/faces.el                                      |    6 +-
 lisp/files.el                                      |   67 +-
 lisp/filesets.el                                   |    2 +-
 lisp/find-file.el                                  |    2 +-
 lisp/finder.el                                     |    2 +-
 lisp/follow.el                                     |  235 ++-
 lisp/font-lock.el                                  |    8 +-
 lisp/frame.el                                      |    6 +-
 lisp/generic-x.el                                  |    4 +-
 lisp/gnus/auth-source.el                           |   16 +-
 lisp/gnus/gnus-group.el                            |    3 +-
 lisp/gnus/gnus-mlspl.el                            |    4 +-
 lisp/gnus/gnus-util.el                             |   29 +-
 lisp/gnus/message.el                               |    4 +-
 lisp/gnus/mm-decode.el                             |    2 +-
 lisp/gnus/mm-util.el                               |    2 +-
 lisp/gnus/mml-sec.el                               |   48 +
 lisp/gnus/nnml.el                                  |   17 -
 lisp/gnus/qp.el                                    |    3 +-
 lisp/help-fns.el                                   |   33 +-
 lisp/help.el                                       |    4 +-
 lisp/hi-lock.el                                    |    2 +-
 lisp/htmlfontify.el                                |   40 +-
 lisp/ibuffer.el                                    |   47 +-
 lisp/ido.el                                        |   26 +-
 lisp/ielm.el                                       |    3 +-
 lisp/image-dired.el                                |    4 +-
 lisp/image.el                                      |    2 +-
 lisp/imenu.el                                      |    2 +-
 lisp/indent.el                                     |    2 +-
 lisp/international/mule-util.el                    |    3 +-
 lisp/international/ucs-normalize.el                |   11 +
 lisp/isearch.el                                    |  230 +-
 lisp/json.el                                       |    2 +-
 lisp/language/hebrew.el                            |   38 +-
 lisp/ldefs-boot.el                                 | 2444 ++++++++--------
 lisp/leim/quail/tamil-dvorak.el                    |  151 +
 lisp/loadup.el                                     |    7 +-
 lisp/mail/emacsbug.el                              |   14 +-
 lisp/mail/feedmail.el                              |   12 +-
 lisp/mail/hashcash.el                              |    2 +-
 lisp/mail/rfc2368.el                               |    2 +-
 lisp/mail/rmail.el                                 |    4 +-
 lisp/mail/rmailout.el                              |    5 +-
 lisp/menu-bar.el                                   |   34 +-
 lisp/mh-e/mh-e.el                                  |    8 +-
 lisp/mh-e/mh-identity.el                           |   12 +-
 lisp/mh-e/mh-seq.el                                |    2 +-
 lisp/net/ange-ftp.el                               |    2 +-
 lisp/net/browse-url.el                             |   40 +-
 lisp/net/eudc-export.el                            |   28 +-
 lisp/net/eudc-vars.el                              |    9 +-
 lisp/net/eudc.el                                   |   12 +
 lisp/net/eudcb-bbdb.el                             |   10 +-
 lisp/net/eww.el                                    |   43 +-
 lisp/net/gnutls.el                                 |   15 +-
 lisp/net/imap.el                                   |  123 +-
 lisp/net/mairix.el                                 |    2 +-
 lisp/net/net-utils.el                              |   35 +-
 lisp/net/network-stream.el                         |   12 +-
 lisp/net/newst-backend.el                          |   10 +-
 lisp/net/newst-plainview.el                        |   12 +-
 lisp/net/newst-treeview.el                         |   50 +-
 lisp/net/puny.el                                   |  248 ++
 lisp/net/rcirc.el                                  |    2 +-
 lisp/net/sasl-scram-rfc.el                         |    1 +
 lisp/net/shr.el                                    |   27 +-
 lisp/net/soap-client.el                            |    4 +-
 lisp/net/tls.el                                    |   24 +-
 lisp/net/tramp-compat.el                           |    3 +-
 lisp/net/tramp-gvfs.el                             |   13 +-
 lisp/net/tramp-sh.el                               |  175 +-
 lisp/net/tramp.el                                  |    8 +-
 lisp/net/trampver.el                               |    5 +-
 lisp/obsolete/complete.el                          |    2 +-
 lisp/{net => obsolete}/eudcb-ph.el                 |    1 +
 lisp/org/ob-core.el                                |    4 +-
 lisp/org/ob-exp.el                                 |    2 +-
 lisp/org/ob-table.el                               |    4 +-
 lisp/org/org-agenda.el                             |    4 +-
 lisp/org/org-faces.el                              |    2 +-
 lisp/org/org-list.el                               |    2 +-
 lisp/org/org-macs.el                               |    2 +-
 lisp/org/org.el                                    |    6 +-
 lisp/paren.el                                      |    5 +-
 lisp/play/dunnet.el                                |   23 +-
 lisp/printing.el                                   |    8 +-
 lisp/proced.el                                     |   16 +-
 lisp/progmodes/bug-reference.el                    |    2 +-
 lisp/progmodes/cc-awk.el                           |   19 +-
 lisp/progmodes/cc-bytecomp.el                      |   46 +-
 lisp/progmodes/cc-defs.el                          |   47 +-
 lisp/progmodes/cc-engine.el                        |  111 +-
 lisp/progmodes/cc-langs.el                         |   15 +-
 lisp/progmodes/cc-mode.el                          |    7 +-
 lisp/progmodes/compile.el                          |    6 +-
 lisp/progmodes/cpp.el                              |    2 +-
 lisp/progmodes/cwarn.el                            |    3 +-
 lisp/progmodes/elisp-mode.el                       |   32 +-
 lisp/progmodes/etags.el                            |   61 +-
 lisp/progmodes/f90.el                              |    4 +-
 lisp/progmodes/flymake.el                          |    2 +-
 lisp/progmodes/fortran.el                          |    4 +-
 lisp/progmodes/gdb-mi.el                           |   43 +-
 lisp/progmodes/gud.el                              |    2 +-
 lisp/progmodes/hideif.el                           |   32 +-
 lisp/progmodes/hideshow.el                         |   10 +-
 lisp/progmodes/idlwave.el                          |   26 +-
 lisp/progmodes/js.el                               |   13 +-
 lisp/progmodes/mantemp.el                          |    2 +-
 lisp/progmodes/pascal.el                           |    4 +-
 lisp/progmodes/prog-mode.el                        |   68 +-
 lisp/progmodes/project.el                          |  193 +-
 lisp/progmodes/python.el                           |   10 +-
 lisp/progmodes/ruby-mode.el                        |   10 +-
 lisp/progmodes/sh-script.el                        |   12 +-
 lisp/progmodes/simula.el                           |    8 +-
 lisp/progmodes/sql.el                              |    4 +-
 lisp/progmodes/vera-mode.el                        |    2 +-
 lisp/progmodes/verilog-mode.el                     |   12 +-
 lisp/progmodes/vhdl-mode.el                        |   30 +-
 lisp/progmodes/xref.el                             |   50 +-
 lisp/ps-bdf.el                                     |    2 +-
 lisp/ps-print.el                                   |   10 +-
 lisp/replace.el                                    |   60 +-
 lisp/saveplace.el                                  |    8 +
 lisp/scroll-all.el                                 |    2 +-
 lisp/server.el                                     |    2 +-
 lisp/ses.el                                        |   58 +-
 lisp/simple.el                                     |  119 +-
 lisp/speedbar.el                                   |   16 +-
 lisp/startup.el                                    |   11 +-
 lisp/subr.el                                       |   57 +-
 lisp/tempo.el                                      |    2 +-
 lisp/term.el                                       |   17 +-
 lisp/term/ns-win.el                                |   28 +-
 lisp/term/x-win.el                                 |    2 +-
 lisp/textmodes/artist.el                           |   28 +-
 lisp/textmodes/bibtex.el                           |    4 +-
 lisp/textmodes/css-mode.el                         |    3 +-
 lisp/textmodes/ispell.el                           |   80 +-
 lisp/textmodes/page-ext.el                         |    2 +-
 lisp/textmodes/refbib.el                           |    6 +-
 lisp/textmodes/refer.el                            |    6 +-
 lisp/textmodes/reftex-auc.el                       |    2 +-
 lisp/textmodes/reftex-vars.el                      |   10 +-
 lisp/textmodes/sgml-mode.el                        |    2 +-
 lisp/textmodes/table.el                            |    4 +-
 lisp/textmodes/tex-mode.el                         |    2 +-
 lisp/textmodes/text-mode.el                        |    2 +-
 lisp/time-stamp.el                                 |    2 +-
 lisp/url/url-auth.el                               |    4 +-
 lisp/url/url-handlers.el                           |   11 +-
 lisp/url/url-http.el                               |   23 +-
 lisp/url/url-util.el                               |    6 +-
 lisp/url/url-vars.el                               |   12 +
 lisp/userlock.el                                   |    4 +-
 lisp/vc/compare-w.el                               |    4 +-
 lisp/vc/ediff-init.el                              |    6 +-
 lisp/vc/ediff-wind.el                              |    2 +-
 lisp/vc/log-edit.el                                |    4 +-
 lisp/vc/pcvs.el                                    |    2 +-
 lisp/vc/smerge-mode.el                             |    6 +-
 lisp/vc/vc-cvs.el                                  |   20 +-
 lisp/vc/vc-dispatcher.el                           |   20 +-
 lisp/vc/vc-git.el                                  |    4 +-
 lisp/vc/vc-hg.el                                   |   16 +-
 lisp/vc/vc-hooks.el                                |   10 +-
 lisp/vc/vc-mtn.el                                  |    4 +-
 lisp/vc/vc-rcs.el                                  |    5 +-
 lisp/vc/vc-svn.el                                  |   10 +-
 lisp/vc/vc.el                                      |   18 +-
 lisp/version.el                                    |   64 +-
 lisp/wid-edit.el                                   |    2 +-
 lisp/windmove.el                                   |    2 +-
 lisp/window.el                                     |  163 +-
 lisp/woman.el                                      |    8 +-
 lisp/xml.el                                        |   10 +-
 lwlib/xlwmenu.c                                    |    6 -
 m4/ax_gcc_var_attribute.m4                         |  141 +
 modules/mod-test/Makefile                          |   45 +
 modules/mod-test/mod-test.c                        |  268 ++
 modules/mod-test/test.el                           |  134 +
 modules/modhelp.py                                 |  207 ++
 nextstep/templates/Info.plist.in                   |    2 +
 src/ChangeLog.13                                   |    4 +-
 src/Makefile.in                                    |   14 +-
 src/alloc.c                                        |   93 +-
 src/bytecode.c                                     |   14 +-
 src/cmds.c                                         |    6 +-
 src/conf_post.h                                    |    1 +
 src/data.c                                         |   24 +
 src/dired.c                                        |   48 +-
 src/dispnew.c                                      |   16 +-
 src/doc.c                                          |    3 +-
 src/doprnt.c                                       |    2 +-
 src/dynlib.c                                       |  330 ++
 src/dynlib.h                                       |   34 +
 src/emacs-module.c                                 | 1134 +++++++
 src/emacs-module.h                                 |  215 ++
 src/emacs.c                                        |   12 +
 src/eval.c                                         |  219 +-
 src/fileio.c                                       |   11 +-
 src/fns.c                                          |   24 +-
 src/font.c                                         |   27 +-
 src/font.h                                         |   48 +
 src/frame.c                                        |   27 +-
 src/ftfont.c                                       |   30 +-
 src/gmalloc.c                                      |   36 +-
 src/indent.c                                       |   11 +-
 src/insdel.c                                       |   23 +-
 src/keyboard.c                                     |   22 +-
 src/keyboard.h                                     |   12 +
 src/lisp.h                                         |  152 +-
 src/lread.c                                        |   87 +-
 src/macfont.m                                      |   19 +-
 src/nsfns.m                                        |   74 +-
 src/nsimage.m                                      |    2 +-
 src/nsmenu.m                                       |    8 +
 src/nsterm.h                                       |  176 +-
 src/nsterm.m                                       |  522 ++--
 src/print.c                                        |   13 +
 src/puresize.h                                     |   20 +-
 src/regex.c                                        |   18 +-
 src/syntax.c                                       |   18 +-
 src/syntax.h                                       |   14 +
 src/undo.c                                         |   69 +-
 src/unexelf.c                                      |   11 +-
 src/w32.c                                          |   13 +-
 src/w32.h                                          |    6 +-
 src/w32console.c                                   |    5 -
 src/w32fns.c                                       |   28 +-
 src/w32menu.c                                      |    5 +-
 src/w32term.c                                      |   46 +-
 src/w32term.h                                      |    2 +
 src/window.c                                       |   34 +-
 src/xdisp.c                                        |  110 +-
 src/xfns.c                                         |    4 +-
 .../package/macro-problem-package-1.0/macro-aux.el |   12 +
 .../macro-problem-package-1.0/macro-problem.el     |   21 +
 .../package/macro-problem-package-2.0/macro-aux.el |   16 +
 .../macro-problem-package-2.0/macro-problem.el     |   30 +
 test/{lisp/url => automated}/url-expand-tests.el   |    0
 test/automated/url-parse-tests.el                  |  167 +
 test/etags/lua-src/test.lua                        |   36 +
 test/etags/ruby-src/test.rb                        |   54 +
 test/etags/ruby-src/test1.ruby                     |    7 +
 test/lisp/abbrev-tests.el                          |   53 +
 test/lisp/autorevert-tests.el                      |    4 +-
 test/lisp/calendar/icalendar-tests.el              |   56 +
 test/lisp/character-fold-tests.el                  |   72 +-
 test/lisp/emacs-lisp/package-tests.el              |   14 +
 test/lisp/faces-tests.el                           |    5 +
 test/lisp/gnus/auth-source-tests.el                |   45 +
 test/lisp/gnus/message-tests.el                    |    6 +-
 test/lisp/help-fns-tests.el                        |   10 +
 test/lisp/json-tests.el                            |  297 ++-
 test/lisp/net/tramp-tests.el                       |   47 +-
 test/lisp/progmodes/elisp-mode-tests.el            |    4 +-
 test/lisp/simple-tests.el                          |   89 +-
 test/lisp/subr-tests.el                            |  112 +
 test/manual/etags/CTAGS.good                       |   33 +
 test/manual/etags/ETAGS.good_1                     |  187 +-
 test/manual/etags/ETAGS.good_2                     |  203 +-
 test/manual/etags/ETAGS.good_3                     |  203 +-
 test/manual/etags/ETAGS.good_4                     |  187 +-
 test/manual/etags/ETAGS.good_5                     |  219 +-
 test/manual/etags/ETAGS.good_6                     |  219 +-
 test/manual/etags/Makefile                         |    5 +-
 test/manual/indent/js.js                           |   14 +
 test/src/keymap-tests.el                           |    2 +-
 398 files changed, 15848 insertions(+), 8101 deletions(-)

diff --git a/.gitignore b/.gitignore
index 6821791..e544b10 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,6 +42,7 @@ InfoPlist.strings
 Makefile
 makefile
 !etc/refcards/Makefile
+!modules/mod-test/Makefile
 !test/lisp/progmodes/flymake-resources/Makefile
 !test/manual/indent/Makefile
 !test/manual/etags/Makefile
@@ -139,6 +140,8 @@ src/stamp-h1
 *.elc
 *.o
 *.res
+*.so
+*.dll
 [0-9]*.core
 core
 core.*[0-9]
@@ -209,6 +212,7 @@ lisp/international/uni-*.el
 *.cms
 *.cp
 *.cps
+*.doc
 *.dvi
 *.fn
 *.fns
diff --git a/CONTRIBUTE b/CONTRIBUTE
index b385d68..177a38c 100644
--- a/CONTRIBUTE
+++ b/CONTRIBUTE
@@ -186,10 +186,12 @@ branch later.
 
 However, if you know that the change will be difficult to merge to the
 trunk (eg because the trunk code has changed a lot), you can apply the
-change to both trunk and branch yourself.  Indicate in the release
-branch commit log that there is no need to merge the commit to the
-trunk; start the commit message with "Backport:".  gitmerge.el will
-then exclude that commit from the merge to trunk.
+change to both trunk and branch yourself.  It could also happen that a
+change is cherry-picked from master to the release branch, and so
+doesn't need to be merged back.  In these cases, indicate in the
+release branch commit log that there is no need to merge the commit to
+the trunk; start the commit message with "Backport:".  gitmerge.el
+will then exclude that commit from the merge to trunk.
 
 
 ** Other process information
@@ -222,6 +224,17 @@ the tracker with the corresponding bugs/issues.
 GNU ELPA has a 'debbugs' package that allows accessing the tracker
 database from Emacs.
 
+Bugs needs regular attention.  A large backlog of bugs is
+disheartening to the developers, and a culture of ignoring bugs is
+harmful to users, who expect software that works.  Bugs have to be
+regularly looked at and acted upon.  Not all bugs are critical, but at
+the least, each bug needs to be regularly re-reviewed to make sure it
+is still reproducible.
+
+The process of going through old or new bugs and acting on them is
+called bug triage.  This process is described in the file
+admin/notes/triage.
+
 ** Document your changes.
 
 Any change that matters to end-users should have an entry in etc/NEWS.
diff --git a/ChangeLog.2 b/ChangeLog.2
index 61b25ab..6a8f539 100644
--- a/ChangeLog.2
+++ b/ChangeLog.2
@@ -1,3 +1,240 @@
+2015-12-27  Lars Ingebrigtsen  <address@hidden>
+
+       * shr.el (shr-descend): Allow using lambdas in external functions.
+
+2015-12-25  Stefan Monnier  <address@hidden>
+
+       * admin/gitmerge.el: Tweaks that seemed necessary
+
+       * admin/gitmerge.el (gitmerge-skip-regexp): Remove "sync".
+       (gitmerge-maybe-resume): Provide explicit empty commit message.
+
+2015-12-25  Łukasz Stelmach  <address@hidden>  (tiny change)
+
+       Use a different port for TLS erc
+
+       * lisp/erc/erc.el (erc-default-port-tls): New variable
+       (bug#19497).
+       * lisp/erc/erc.el (erc-tls): Use it.
+
+2015-12-25  Alain Schneble  <address@hidden>
+
+       Make relative URL parsing and resolution consistent with RFC 3986 
(bug#22044)
+
+       * test/lisp/url/url-parse-tests.el: Add tests covering 
url-generic-parse-url.
+       * test/lisp/url/url-expand-tests.el: Add tests covering 
url-expand-file-name.
+       * lisp/url/url-parse.el (url-generic-parse-url): Keep empty fragment
+       information in URL-struct.
+       * lisp/url/url-parse.el (url-path-and-query): Do not artificially turn 
empty
+       path and query into nil path and query, respectively.
+       * lisp/url/url-expand.el (url-expander-remove-relative-links): Do not 
turn
+       empty path into an absolute ("/") path.
+       * lisp/url/url-expand.el (url-expand-file-name): Properly resolve
+       fragment-only URIs. Do not just return them unchanged.
+       * lisp/url/url-expand.el (url-default-expander): An empty path in the 
relative
+       reference URI should not drop the last segment.
+
+2015-12-25  Alain Schneble  <address@hidden>
+
+       Make relative URL parsing and resolution consistent with RFC 3986 
(bug#22044)
+
+       * test/lisp/url/url-parse-tests.el: Add tests covering 
url-generic-parse-url.
+       * test/lisp/url/url-expand-tests.el: Add tests covering 
url-expand-file-name.
+       * lisp/url/url-parse.el (url-generic-parse-url): Keep empty fragment
+       information in URL-struct.
+       * lisp/url/url-parse.el (url-path-and-query): Do not artificially turn 
empty
+       path and query into nil path and query, respectively.
+       * lisp/url/url-expand.el (url-expander-remove-relative-links): Do not 
turn
+       empty path into an absolute ("/") path.
+       * lisp/url/url-expand.el (url-expand-file-name): Properly resolve
+       fragment-only URIs. Do not just return them unchanged.
+       * lisp/url/url-expand.el (url-default-expander): An empty path in the 
relative
+       reference URI should not drop the last segment.
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Let url use default file modes when copying files
+
+       * lisp/url/url-handlers.el (url-copy-file): Use default file
+       modes when copying files (bug#11400).
+
+2015-12-25  Devon Sean McCullough  <address@hidden>
+
+       Doc fix for url-http
+
+       * lisp/url/url-http.el (url-http): Document better return values
+         (bug#13187) (tiny change)
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       * eww.el (eww-display-html): Support <button> tags (bug#20485).
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Made ffap-url-p a defun instead of a defsubst
+
+       * lisp/ffap.el (ffap-url-p): Change from defsusbt to defun,
+       since there doesn't seem to be much of a reason for it to be a
+       defsubst (bug#18203).
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Add a command to view files in the browser to dired
+
+       * lisp/dired.el (dired-mode-map): Add the `W' command
+       (bug#18810).
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Allow http://user:address@hidden/ URLs again
+
+       * lisp/url/url-auth.el (url-basic-auth): Allow explicit
+       user/passwords in URLs (bug#19046).
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       * eww.el (eww-mode-map): Fix command name of eww-toggle-colors.
+
+2015-12-25  Samer Masterson  <address@hidden>
+
+       Autoload url-insert-buffer-contents
+
+       * lisp/url/url-handlers.el: Add autoload cookie so that
+       `package-list-packages' doesn't bug out (bug#21927) (tiny change)
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Allow toggling colors in eww
+
+       * doc/misc/eww.texi (Basics): Mention "C".
+
+       * lisp/net/eww.el (eww-toggle-colors): New command and keystroke.
+
+       * lisp/net/shr.el (shr-use-colors): New variable.
+       (shr-colorize-region): Use it.
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Follow meta refresh tags in eww
+
+       * eww.el (eww-tag-meta): Follow meta refresh tags (bug#22234).
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       More eww file name coding fixes
+
+       * eww.el (eww-decode-url-file-name): Use the base coding
+       system to check for encodability.
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Always save eww history
+
+       * eww.el (eww-setup-buffer): Always save history, even when
+       called from outside the eww buffer (bug#19638).
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Default web pages to right-to-left
+
+       * eww.el (eww-mode): Most web pages are left-to-right, so make
+       that the default (bug#19801).
+
+       * shr.el (shr-tag-html): Respect "dir" attributes
+       (left-to-right, right-to-left).
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Make toggling checkboxes work again
+
+       * eww.el (eww-update-field): Make toggling checkboxes work
+       again (bug#21881).
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Don't store cookies with empty names
+
+       * lisp/url/url-cookie.el (url-cookie-store): Refuse to store
+       cookies with empty names (bug#21936).
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Stop rendering HTML before specdlr exhaustion
+
+       Fixes: 22117
+
+       * shr.el (shr-descend): Stop rendering before we run out of
+       specpdl room (bug#22117).
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Use cl-reduce, not reduce.
+
+2015-12-25  Lars Ingebrigtsen  <address@hidden>
+
+       Allow several <tbody> tags in shr
+
+       * shr.el (shr-table-body): New function to find the real body
+       of a table.
+       (shr-tag-table): Use it to render several <tbody> tags in a
+       table (bug#22170).
+
+2015-12-24  Lars Ingebrigtsen  <address@hidden>
+
+       Make prettier unique file names in eww
+
+       (eww-make-unique-file-name): Make unique file names by making
+       files like foo(2).jpg instead of foo(1)(2).jpg.
+
+2015-12-24  Lars Ingebrigtsen  <address@hidden>
+
+       Decode hex-encoded URLs before using them as file names
+
+       * eww.el (eww-decode-url-file-name): New function.
+       (eww-download-callback): Use it to decode file names before
+       saving them.
+
+2015-12-24  Ashish SHUKLA  <address@hidden>
+
+       Add FreeBSD cert bundle
+
+       * doc/misc/emacs-gnutls.texi (Help For Users): Document
+       FreeBSD bundle.
+
+       * lisp/net/gnutls.el (gnutls-trustfiles): Add FreeBSD cert bundle.
+
+2015-12-24  Lars Ingebrigtsen  <address@hidden>
+
+       Allow overriding shr functions from eww
+
+       * eww.el (eww-display-html): Allow overriding elements in
+       `shr-external-rendering-functions'.
+
+2015-12-24  Lars Ingebrigtsen  <address@hidden>
+
+       Ignore invalid SVG images
+
+       * shr.el (shr-tag-svg): Ignore SVG images that have no width
+       or height, because these can't be displayed by ImageMagick,
+       anyway.
+
+2015-12-24  Lars Ingebrigtsen  <address@hidden>
+
+       shr table rendering fix
+
+       * shr.el (shr-tag-table): Allow rendering body-less tables
+       that have headers.
+
+2015-12-22  Sam Steingold  <address@hidden>
+
+       clipboard should still work even if interprogram-* is disabled
+
+       (clipboard-yank): When `interprogram-cut-function' is nil,
+       bind it to `gui-selection-value' - the default value.
+       (clipboard-kill-region, clipboard-kill-ring-save): When
+       `interprogram-paste-function' is nil, bind it to `gui-select-text' -
+       the default value.
+
 2015-12-18  Phillip Lord  <address@hidden>
 
        Fix bootstrap issue with dired-loaddefs
@@ -2943,14 +3180,6 @@
        * lisp/net/tramp-compat.el (tramp-compat-delete-dups): New defun.
        * lisp/net/tramp-smb.el (tramp-smb-handle-directory-files): Use it.
 
-2015-10-28  Anders Lindgren  <address@hidden>
-
-       Merge branch 'master' of /Volumes/HD2/build/emacs-git-ssh
-
-       Merge branch 'master' of ssh://git.sv.gnu.org/srv/git/emacs
-
-       Merge branch 'master' of /Volumes/HD2/build/emacs-git-ssh
-
 2015-10-28  Michael Albinus  <address@hidden>
 
        * lisp/net/tramp-smb.el (tramp-smb-handle-directory-files):
@@ -2970,10 +3199,6 @@
        * nsterm.m (ns_constrain_all_frames, ns_init_term): Block input.
        * nsterm.m (ns_send_appdefined, EmacsApp): Trace output.
 
-2015-10-28  Anders Lindgren  <address@hidden>
-
-       Merge branch 'master' of ssh://git.sv.gnu.org/srv/git/emacs
-
 2015-10-28  Artur Malabarba  <address@hidden>
 
        * src/process.c (Fget_buffer_process): Improve docstring.
@@ -20125,7 +20350,7 @@
 
 This file records repository revisions from
 commit 9d56a21e6a696ad19ac65c4b405aeca44785884a (exclusive) to
-commit 138480a97bfc1104143b5fc10dfc962b95b78ae8 (inclusive).
+commit 531b28b4d96adf39d853fcb5e0bba7251fcce4b6 (inclusive).
 See ChangeLog.1 for earlier changes.
 
 ;; Local Variables:
diff --git a/INSTALL b/INSTALL
index 7a41505..5ca88fe 100644
--- a/INSTALL
+++ b/INSTALL
@@ -309,6 +309,8 @@ Use --with-wide-int to implement Emacs values with the type 
'long long',
 even on hosts where a narrower type would do.  With this option, on a
 typical 32-bit host, Emacs integers have 62 bits instead of 30.
 
+Use --with-cairo to compile Emacs with Cairo drawing.
+
 Use --enable-gcc-warnings to enable compile-time checks that warn
 about possibly-questionable C code.  This is intended for developers
 and is useful with GNU-compatible compilers.  On a recent GNU system
diff --git a/admin/notes/triage b/admin/notes/triage
new file mode 100644
index 0000000..bc91b6c
--- /dev/null
+++ b/admin/notes/triage
@@ -0,0 +1,68 @@
+HOW TO TRIAGE EMACS BUGS  -*- outline -*-
+
+This document just describes the procedure of triaging bugs, for information on
+how to work with the bug tracker, see the bugtracker file in this same 
directory
+for the basics.  You can also install the debbugs ELPA package for access to 
M-x
+debbugs-gnu, an emacs interface to debbugs, and M-x debbugs-org, an emacs
+interface via org-mode.
+
+* Bug backlog triage procedure
+
+The goal of this triage is to prune down the list of old bugs, closing
+the ones that are not reproducible on the current release.
+
+  1. To start, enter debbugs mode (either debbugs-gnu, debbugs-org, or via the
+     web browser), and accept the default list option of bugs that have 
severity
+     serious, important, or normal.
+  2. This will also show closed bugs that have yet to be archived.  You can
+     filter these out in debbugs-gnu with "x" (debbugs-gnu-toggle-suppress).
+  3. For each bug, do the following:
+     - Read the mail thread for the bug.  Find out if anyone has been able to
+       reproduce this on the current release.
+     - If someone has been able to, then your work is finished for this bug.
+     - Make sure there's enough information to reproduce the bug.  It should be
+       very clear how to reproduce.  If not, please ask for specific steps to
+       reproduce.  If you don't get them, and you can't reproduce without them,
+       you can close as "doneunreproducible".
+     - If no one has mentioned being able to reproduce on the current release,
+       read the bug description and attempt to reproduce on an emacs started
+       with "emacs -Q" (the goal is to not let our personal configs interfere
+       with bug testing).
+     - If you can reproduce, then reply on the thread (either on the original
+       message, or anywhere you find appropriate) that you can reproduce this 
on
+       the current release. If your reproduction gives additional info (such as
+       a backtrace), then add that as well, since it will help whoever attempts
+       to fix it.
+     - If you can't reproduce, state that you can't reproduce it on the current
+       release, ask if they can try again against the current release.  Tag the
+       bug as "unreproducable".  Wait a few weeks for their reply - if they can
+       reproduce it, then that's great, otherwise close as 
"doneunreproducible".
+     - If the bug ends up still open, make sure the priority and other tags
+       seems reasonable.
+  4. Your changes will take some time to take effect.  After a period of 
minutes
+     to hours, you will get a mail telling you the control message has been
+     processed.  At this point, if there were no errors detected, you and
+     everyone else can see your changes. If there are errors, read the error
+     text - if you need help, consulting the bugtracker documentation in this
+     same directory.
+
+* New bug triage process
+
+The goal of the new bug triage process is similar to the backlog triage 
process,
+except that the focus is on prioritizing the bug, and making sure it is has
+necessary information for others to act on.
+
+For each new bug, ask the following questions:
+
+  1. Is the bug report written in a way to be easy to reproduce (starts from
+     emacs -Q, etc.)?  If not, ask the reporter to try and reproduce it on an
+     emacs without customization.
+  2. Is the bug report written against the lastest emacs?  If not, try to
+     reproduce on the latest version, and if it can't be reproduced, ask the
+     reporter to try again with the latest version.
+  3. Is the bug the same as another bug?  If so, merge the bugs.
+  4. What is the priority of the bug?  Add a priority: critical, grave, 
serious,
+     important, normal, minor, or wishlist.
+  5. Who should be the owner?  This depends on what component the bug is part
+     of.  You can look at the admin/MAINTAINERS file (then you can just search
+     emacs-devel to match the name with an email address).
diff --git a/admin/release-process b/admin/release-process
index 1cfcf54..a6f9c2a 100644
--- a/admin/release-process
+++ b/admin/release-process
@@ -10,18 +10,30 @@ The first phase of the release schedule is the "heads-down" 
working
 period for new features, on the `master' branch and several feature
 branches.
 
-** Phase two: bugfixes
+** Phase two: fixing and stabilizing the release branch
 
 Shortly before this phase, Emacs developers will be devoted to
 figuring out what features to include in the next release and what
 features to defer to a later release.
 
+This phase is mostly spent fixing bugs and documenting new features
+and changes on the "emacs-NN" branch.  Actually, the default branch
+for pushing any work in this phase should be "emacs-NN", except for
+new features.
+
 At the beginning of this phase, a release branch called "emacs-NN"
 ("NN" represents the major version number of the new Emacs release)
-will be cut from `master'.
-
-This phase is spent fixing bugs and eliminating undocumented new
-features on the "emacs-NN" branch.
+will be cut from `master'.  When that happens, the version number on
+`master' should be incremented; use admin/admin.el's `set-version'
+command to do that, then commit the changes it made and push to
+`master'.  For major releases, also update the value of
+`customize-changed-options-previous-release'.
+
+The 2 main manuals, the User Manual and the Emacs Lisp Manual, need to
+be proofread, preferably by at least 2 different persons, and any
+uncovered problems fixed.  This is a lot of work, so it is advisable
+to divide the job between several people (see the checklist near the
+end of this file).
 
 In parallel to this phase, `master' can receive new features, to be
 released in the next release cycle.  From time to time, the master
@@ -48,8 +60,16 @@ files.  See `admin/notes/years' for information about 
maintaining
 copyright years for GNU Emacs.
 
 ** Make sure the necessary sources and scripts for any generated files
-are included in the source tarfile.  (They don't need to be installed,
-so eg admin/ is fine.)
+are included in the source tarball.  (They don't need to be installed,
+so e.g. admin/ is fine.)
+
+** Regenerate AUTHORS by using admin/authors.el
+(The instructions are at the beginning of that file.)
+
+** Remove temporary +++/--- lines in NEWS.
+But first make sure there are no unmarked entries, and update the
+documentation (or decide no updates are necessary) for those that
+aren't.
 
 ** Manuals
 Check for node names using problematic characters:
@@ -60,7 +80,15 @@ Check for major new features added since the last release 
(e.g. new
 lisp files), and add the relevant authors to the Acknowledgments in
 doc/emacs/ack.texi and emacs.texi.
 
-Check cross-references between the manuals (eg from emacs to elisp)
+For major releases, rewrite the "Antinews" appendix of the User Manual
+(doc/emacs/anti.texi) to describe features lost by downgrading to the
+previous version.  The way to do that is read NEWS, pick up the more
+significant changes and new features in the upcoming release, then
+describe the "benefits" from losing those features.  Be funny, use
+humor.  The text written for the previous major release can serve as
+good example.
+
+Check cross-references between the manuals (e.g. from emacs to elisp)
 are correct.  You can use something like the following in the info
 directory in the Emacs build tree:
 
@@ -78,32 +106,31 @@ Redirect /software/emacs/manual/html_node/automake/ 
/software/automake/manual/ht
 Another tool you can use to check links is gnu.org's linc.py:
 http://www.gnu.org/server/source/
 
-You run this something like:
+You run this with something like:
 
 cd /path/to/cvs/emacs-www
 linc.py -o /path/to/output-dir --url http://www.gnu.org/software/emacs/ .
 
 Be warned that it is really, really slow (as in, can take ~ a full day
 to check the manual/ directory).  It is probably best to run it on a
-single directory at a time from eg manual/html_node.  It is very
+single directory at a time from e.g. manual/html_node.  It is very
 inefficient, but may reveal a few things that info-xref does not.
 
-
 make emacs.dvi, elisp.dvi, and deal with any errors (undefined
 references etc) in the output.  Break any overfull lines.
 Underfull hboxes are not serious, but it can be nice to get rid of
 them if a simple rephrasing or rearrangement will work.
 
-Update the master menu and detailed menu (eg the antinews version).
+Update the master menu and detailed menu (e.g. the antinews version).
 The command texinfo-multiple-files-update can do this, but you
-probably want to apply the results selectively (eg the current master
+probably want to apply the results selectively (e.g. the current master
 menu has better line-breaks than the automatic version).  It includes
 the menu-entry name (if there is one) as well as the node name - using
 only the latter looks better.  Also, it doesn't seem to handle nested
 includes, so will miss edebug.texi etc.
 
 Check for widow and orphan lines in the printed manual; make sure all
-the pages really look ok in the manual as formatted.  Orphans/widows
+the pages really look OK in the manual as formatted.  Orphans/widows
 are cases where the first/last line of a paragraph is on its own at
 the end/start of a page, or where the last word in a paragraph is on
 its own at the start of a line.  It looks better if you reword/respace
@@ -117,9 +144,13 @@ pages of the manuals, and even if they do, the resulting 
page breaks
 depend on what paper and font size they use.  This also means that if
 you _are_ going to do this, it should be done with the paper and font
 size that the GNU Press are going to use when they print the manuals.
-I think this is different to what you get if you just use eg 'make
+I think this is different to what you get if you just use e.g. 'make
 emacs.pdf' (e.g., enable "smallbook").
 
+** Try to reorder NEWS: most important things first, related items together.
+
+** For a major release, add a "New in Emacs XX" section to faq.texi.
+
 ** Check the keybindings in the refcards are correct, and add any new ones.
 What paper size are the English versions supposed to be on?
 On Debian testing, the packages texlive-lang-czechslovak and
@@ -141,14 +172,6 @@ pt-br      Rodrigo Real
 ru     Alex Ott
 sk     Miroslav Vaško
 
-** For a major release, add a "New in Emacs XX" section to faq.texi.
-
-** Remove temporary +++/--- lines in NEWS.
-
-** Try to reorder NEWS: most important things first, related items together.
-
-** Consider bumping customize-changed-options-previous-release.
-
 ** cusver-check from admin.el can help find new defcustoms missing
 :version tags.
 
diff --git a/build-aux/gitlog-to-emacslog b/build-aux/gitlog-to-emacslog
index 3d61ba1..cd93ece 100755
--- a/build-aux/gitlog-to-emacslog
+++ b/build-aux/gitlog-to-emacslog
@@ -77,7 +77,7 @@ test -d .git || {
 # Maybe we should skip all "Merge branch 'master'" messages.
 # See eg the cairo-related ones.
 ./build-aux/gitlog-to-changelog \
-    --ignore-matching="^; |^Merge branch 'master' of 
git\.(savannah|sv)\.gnu\.org:/srv/git/emacs$|^Merge remote-tracking branch 
'.*'$" \
+    --ignore-matching="^; |^Merge branch '(master|emacs-[0-9][0-9])' of 
git\.(savannah|sv)\.gnu\.org:/srv/git/emacs$|^Merge remote-tracking branch 
'.*'$" \
   --ignore-line='^; ' --format='%B' \
   "$gen_origin..$new_origin" >"ChangeLog.tmp" || exit
 
diff --git a/configure.ac b/configure.ac
index 71fa688..ec5e780 100644
--- a/configure.ac
+++ b/configure.ac
@@ -316,7 +316,7 @@ this option's value should be 'yes', 'no', 'lucid', 
'athena', 'motif', 'gtk',
          with_x_toolkit=$val
 ])
 
-OPTION_DEFAULT_OFF([wide-int], [prefer wide Emacs integers (typically 62-bit)])
+OPTION_DEFAULT_OFF([wide-int], [prefer wide Emacs integers (typically 62-bit); 
allows buffer and string size up to 2GB on 32-bit hosts, at the cost of 10% to 
30% slowdown of Lisp interpreter and larger memory footprint])
 if test "$with_wide_int" = yes; then
   AC_DEFINE([WIDE_EMACS_INT], 1, [Use long long for EMACS_INT if available.])
 fi
@@ -353,6 +353,7 @@ OPTION_DEFAULT_ON([gsettings],[don't compile with GSettings 
support])
 OPTION_DEFAULT_ON([selinux],[don't compile with SELinux support])
 OPTION_DEFAULT_ON([gnutls],[don't use -lgnutls for SSL/TLS support])
 OPTION_DEFAULT_ON([zlib],[don't compile with zlib decompression support])
+OPTION_DEFAULT_OFF([modules],[compile with dynamic modules support])
 
 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)])],
@@ -2106,8 +2107,8 @@ AC_CACHE_CHECK(
          [[malloc_set_state (malloc_get_state ());
            __after_morecore_hook = hook;
            __malloc_initialize_hook = hook;]])],
-       [emacs_cv_var_doug_lea_malloc=yes])])
-   fi
+       [emacs_cv_var_doug_lea_malloc=yes])
+   fi])
 doug_lea_malloc=$emacs_cv_var_doug_lea_malloc
 
 system_malloc=$emacs_cv_sanitize_address
@@ -2202,7 +2203,6 @@ if test "$ac_cv_header_pthread_h" && test "$opsys" != 
"mingw32"; then
   AC_CACHE_CHECK([for pthread library],
     [emacs_cv_pthread_lib],
     [emacs_cv_pthread_lib=no
-     OLD_CPPFLAGS=$CPPFLAGS
      OLD_LIBS=$LIBS
      for emacs_pthread_lib in 'none needed' -lpthread; do
        case $emacs_pthread_lib in
@@ -2231,8 +2231,7 @@ if test "$ac_cv_header_pthread_h" && test "$opsys" != 
"mingw32"; then
        if test "$emacs_cv_pthread_lib" != no; then
         break
        fi
-     done
-     CPPFLAGS=$OLD_CPPFLAGS])
+     done])
   if test "$emacs_cv_pthread_lib" != no; then
     AC_DEFINE([HAVE_PTHREAD], 1, [Define to 1 if you have POSIX threads.])
     case $emacs_cv_pthread_lib in
@@ -3344,6 +3343,52 @@ if test "${HAVE_ZLIB}" = "yes"; then
 fi
 AC_SUBST(LIBZ)
 
+### Dynamic modules support
+LIBMODULES=
+HAVE_MODULES=no
+MODULES_OBJ=
+MODULES_SUFFIX=
+if test "${with_modules}" != "no"; then
+  if test "$opsys" = "gnu-linux"; then
+    LIBMODULES="-ldl"
+    MODULES_SUFFIX=".so"
+    HAVE_MODULES=yes
+  elif test "$opsys" = "cygwin"; then
+    MODULES_SUFFIX=".dll"
+    HAVE_MODULES=yes
+  elif test "$opsys" = "darwin"; then
+    MODULES_SUFFIX=".so"
+    HAVE_MODULES=yes
+  elif test "$opsys" = "mingw32"; then
+    MODULES_SUFFIX=".dll"
+    HAVE_MODULES=yes
+  else
+    # BSD system have dlopen in the libc
+    AC_CHECK_FUNC(dlopen, [MODULES_SUFFIX=".so"]
+                          [HAVE_MODULES=yes], [])
+  fi
+
+  if test "${HAVE_MODULES}" = no; then
+    AC_MSG_ERROR([Dynamic modules are not supported on your system])
+  else
+    SAVE_LIBS=$LIBS
+    LIBS="$LIBS $LIBMODULES"
+    AC_CHECK_FUNCS([dlfunc])
+    LIBS=$SAVE_LIBS
+  fi
+fi
+
+if test "${HAVE_MODULES}" = yes; then
+   MODULES_OBJ="dynlib.o emacs-module.o"
+   AC_DEFINE(HAVE_MODULES, 1, [Define to 1 if dynamic modules are enabled])
+   AC_DEFINE_UNQUOTED(MODULES_SUFFIX, "$MODULES_SUFFIX",
+     [System extension for dynamic libraries])
+fi
+AC_SUBST(MODULES_OBJ)
+AC_SUBST(LIBMODULES)
+AX_GCC_VAR_ATTRIBUTE(cleanup)
+AC_CHECK_FUNCS(dladdr)
+
 ### Use -lpng if available, unless '--with-png=no'.
 HAVE_PNG=no
 LIBPNG=
@@ -5237,7 +5282,7 @@ optsep=
 emacs_config_features=
 for opt in XAW3D XPM JPEG TIFF GIF PNG RSVG CAIRO IMAGEMAGICK SOUND GPM DBUS \
   GCONF GSETTINGS NOTIFY ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT \
-  LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS X_TOOLKIT X11 NS; do
+  LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS X_TOOLKIT X11 NS MODULES; do
 
     case $opt in
       NOTIFY|ACL) eval val=\${${opt}_SUMMARY} ;;
@@ -5285,6 +5330,7 @@ AS_ECHO(["  Does Emacs use -lXaw3d?                       
          ${HAVE_XAW3D
   Does Emacs use -lotf?                                   ${HAVE_LIBOTF}
   Does Emacs use -lxft?                                   ${HAVE_XFT}
   Does Emacs directly use zlib?                           ${HAVE_ZLIB}
+  Does Emacs have dynamic modules support?                ${HAVE_MODULES}
   Does Emacs use toolkit scroll bars?                     
${USE_TOOLKIT_SCROLL_BARS}
   Does Emacs support Xwidgets?                            ${HAVE_XWIDGETS}
       Does xwidgets support webkit(requires gtk3)?        ${HAVE_WEBKIT}
diff --git a/doc/emacs/abbrevs.texi b/doc/emacs/abbrevs.texi
index 23d7e28..695ffa8 100644
--- a/doc/emacs/abbrevs.texi
+++ b/doc/emacs/abbrevs.texi
@@ -407,7 +407,7 @@ you are expanding.
 in this search; if it is @code{nil}, the word and the expansion must
 match in case.  If the value is @code{case-fold-search} (the default),
 then the variable @code{case-fold-search} controls whether to ignore
-case while searching for expansions (@pxref{Search Case}).
+case while searching for expansions (@pxref{Lax Search}).
 
 @vindex dabbrev-case-replace
   Normally, dynamic abbrev expansion preserves the case pattern
@@ -421,7 +421,7 @@ the dynamic abbrev's case pattern is preserved in most 
cases; if it is
 @code{nil}, the expansion is always copied verbatim.  If the value is
 @code{case-replace} (the default), then the variable
 @code{case-replace} controls whether to copy the expansion verbatim
-(@pxref{Replacement and Case}).
+(@pxref{Replacement and Lax Matches}).
 
   However, if the expansion contains a complex mixed case pattern, and
 the dynamic abbrev matches this pattern as far as it goes, then the
diff --git a/doc/emacs/ack.texi b/doc/emacs/ack.texi
index 1c88e97..4d53456 100644
--- a/doc/emacs/ack.texi
+++ b/doc/emacs/ack.texi
@@ -64,6 +64,10 @@ point vertically fixed by scrolling the window when moving 
up and down
 in the buffer.
 
 @item
+Aurélien Aptel added dynamic module support to Emacs.  Philipp
+Stephani and others also worked on the dynamic module code.
+
address@hidden
 Joe Arceneaux wrote the original text property implementation, and
 implemented support for X11.
 
diff --git a/doc/emacs/buffers.texi b/doc/emacs/buffers.texi
index 5a4d1ab..ae64fef 100644
--- a/doc/emacs/buffers.texi
+++ b/doc/emacs/buffers.texi
@@ -703,5 +703,6 @@ C-b}.  To customize this buffer list, use the @code{bs} 
Custom group
   MSB global minor mode (``MSB'' stands for ``mouse select buffer'')
 provides a different and customizable mouse buffer menu which you may
 prefer.  It replaces the bindings of @code{mouse-buffer-menu},
-normally on @kbd{C-Down-Mouse-1}, and the menu bar buffer menu.  You
-can customize the menu in the @code{msb} Custom group.
+normally on @kbd{C-Down-Mouse-1} and @address@hidden, and the menu
+bar buffer menu.  You can customize the menu in the @code{msb} Custom
+group.
diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
index 8441c88..fc405e3 100644
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -403,6 +403,8 @@ customizations in your initialization file.  This is 
because saving
 customizations from such a session would wipe out all the other
 customizations you might have on your initialization file.
 
address@hidden unsaved customizations, reminder to save
address@hidden custom-prompt-customize-unsaved-options
   Please note that any customizations you have not chosen to save for
 future sessions will be lost when you terminate Emacs.  If you'd like
 to be prompted about unsaved customizations at termination time, add
@@ -1131,6 +1133,12 @@ won't confuse other programs that the file is intended 
for.  The
 example above is for the C programming language, where comments start
 with @samp{/*} and end with @samp{*/}.
 
+If some unrelated text might look to Emacs as a local variables list,
+you can countermand that by inserting a form-feed character (a page
+delimiter, @pxref{Pages}) after that text.  Emacs only looks for
+file-local variables in the last page of a file, after the last page
+delimiter.
+
 @findex add-file-local-variable
 @findex delete-file-local-variable
 @findex copy-dir-locals-to-file-locals
diff --git a/doc/emacs/emacs.texi b/doc/emacs/emacs.texi
index 27bb77d..0030467 100644
--- a/doc/emacs/emacs.texi
+++ b/doc/emacs/emacs.texi
@@ -188,6 +188,7 @@ Advanced Features
 * Sending Mail::        Sending mail in Emacs.
 * Rmail::               Reading mail in Emacs.
 * Gnus::                A flexible mail and news reader.
+* Host Security::       Security issues on a single computer.
 * Network Security::    Managing the network security.
 * Document View::       Viewing PDF, PS and DVI files.
 * EWW::                 A web browser in Emacs.
@@ -392,18 +393,20 @@ Searching and Replacement
 * Regexps::                Syntax of regular expressions.
 * Regexp Backslash::       Regular expression constructs starting with `\'.
 * Regexp Example::         A complex regular expression explained.
-* Search Case::            To ignore case while searching, or not.
+* Lax Search::                Search ignores some distinctions between
+                                similar characters, like letter-case.
 * Replace::                Search, and replace some or all matches.
 * Other Repeating Search:: Operating on all matches for some regexp.
+* Search Customizations::  Various search customizations.
 
 Incremental Search
 
 * Basic Isearch::        Basic incremental search commands.
 * Repeat Isearch::       Searching for the same string again.
-* Error in Isearch::     When your string is not found.
-* Special Isearch::      Special input in incremental search.
 * Isearch Yank::         Commands that grab text into the search string
                            or else edit the search string.
+* Error in Isearch::     When your string is not found.
+* Special Isearch::      Special input in incremental search.
 * Not Exiting Isearch::  Prefix argument and scrolling commands.
 * Isearch Minibuffer::   Incremental search of the minibuffer history.
 
@@ -411,7 +414,8 @@ Replacement Commands
 
 * Unconditional Replace::  Replacing all matches for a string.
 * Regexp Replace::         Replacing all matches for a regexp.
-* Replacement and Case::   How replacements preserve case of letters.
+* Replacement and Lax Matches::
+                           Lax searching for text to replace.
 * Query Replace::          How to use querying.
 
 Commands for Fixing Typos
@@ -534,6 +538,7 @@ Frames and Graphical Displays
 * Multiple Displays::   How one Emacs instance can talk to several displays.
 * Frame Parameters::    Changing the colors and other modes of frames.
 * Scroll Bars::         How to enable and disable scroll bars; how to use them.
+* Window Dividers::     Window separators that can be dragged with the mouse.
 * Drag and Drop::       Using drag and drop to open files and insert text.
 * Menu Bars::           Enabling and disabling the menu bar.
 * Tool Bars::           Enabling and disabling the tool bar.
@@ -589,6 +594,7 @@ Commands for Human Languages
 * Sentences::           Moving over and killing sentences.
 * Paragraphs::          Moving over paragraphs.
 * Pages::               Moving over pages.
+* Quotation Marks::     Inserting quotation marks.
 * Filling::             Filling or justifying text.
 * Case::                Changing the case of text.
 * Text Mode::           The major modes for editing text files.
@@ -1164,6 +1170,11 @@ Reporting Bugs
 * Checklist::           Steps to follow for a good bug report.
 * Sending Patches::     How to send a patch for GNU Emacs.
 
+Contributing to Emacs Development
+
+* Coding Standards::     Gnu Emacs coding standards.
+* Copyright Assignment:: Assigning copyright to the FSF.
+
 Command Line Arguments for Emacs Invocation
 
 * Action Arguments::    Arguments to visit files, load libraries,
diff --git a/doc/emacs/files.texi b/doc/emacs/files.texi
index 5752d02..4f7596e 100644
--- a/doc/emacs/files.texi
+++ b/doc/emacs/files.texi
@@ -1295,11 +1295,12 @@ would make to the file if you save the buffer.
 
 @findex compare-windows
   The command @kbd{M-x compare-windows} compares the text in the
-current window with that in the next window.  (For more information
-about windows in Emacs, @ref{Windows}.)  Comparison starts at point in
-each window, after pushing each initial point value on the mark ring
-in its respective buffer.  Then it moves point forward in each window,
-one character at a time, until it reaches characters that don't match.
+current window with that in the window that was the selected window
+before you selected the current one.  (For more information about
+windows in Emacs, @ref{Windows}.)  Comparison starts at point in each
+window, after pushing each initial point value on the mark ring in its
+respective buffer.  Then it moves point forward in each window, one
+character at a time, until it reaches characters that don't match.
 Then the command exits.
 
   If point in the two windows is followed by non-matching text when
diff --git a/doc/emacs/frames.texi b/doc/emacs/frames.texi
index 95b721f..acfdfe2 100644
--- a/doc/emacs/frames.texi
+++ b/doc/emacs/frames.texi
@@ -1265,10 +1265,11 @@ Some text terminals support mouse clicks in the 
terminal window.
   In a terminal emulator which is compatible with @command{xterm}, you
 can use @kbd{M-x xterm-mouse-mode} to give Emacs control over simple
 uses of the mouse---basically, only non-modified single clicks are
-supported.  The normal @command{xterm} mouse functionality for such
-clicks is still available by holding down the @kbd{SHIFT} key when you
-press the mouse button.  Xterm Mouse mode is a global minor mode
-(@pxref{Minor Modes}).  Repeating the command turns the mode off
+supported.  Newer versions of @command{xterm} also support
+mouse-tracking.  The normal @command{xterm} mouse functionality for
+such clicks is still available by holding down the @kbd{SHIFT} key
+when you press the mouse button.  Xterm Mouse mode is a global minor
+mode (@pxref{Minor Modes}).  Repeating the command turns the mode off
 again.
 
 @findex gpm-mouse-mode
diff --git a/doc/emacs/glossary.texi b/doc/emacs/glossary.texi
index e66cd79..cc81101 100644
--- a/doc/emacs/glossary.texi
+++ b/doc/emacs/glossary.texi
@@ -175,11 +175,22 @@ corresponding Control character.  @xref{User Input,C-M-}.
 Case conversion means changing text from upper case to lower case or
 vice versa.  @xref{Case}.
 
address@hidden Case Folding
+Case folding means ignoring the differences between case variants of
+the same letter: upper-case, lower-case, and title-case.  Emacs
+performs case folding by default in text search.  @xref{Lax Search}.
+
 @item Character
 Characters form the contents of an Emacs buffer.  Also, key sequences
 (q.v.@:) are usually made up of characters (though they may include
 other input events as well).  @xref{User Input}.
 
address@hidden Character Folding
+Character folding means ignoring differences between similarly looking
+characters, such as between @code{a}, and @code{@:a} and @code{@'a}.
+Emacs performs character folding by default in text search.  @xref{Lax
+Search}.
+
 @item Character Set
 Emacs supports a number of character sets, each of which represents a
 particular alphabet or script.  @xref{International}.
diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi
index a9c63b9..25e783f 100644
--- a/doc/emacs/help.texi
+++ b/doc/emacs/help.texi
@@ -126,6 +126,10 @@ Display documentation of the current major mode and minor 
modes
 (@code{describe-mode}).
 @item C-h n
 Display news of recent Emacs changes (@code{view-emacs-news}).
address@hidden C-h o @var{symbol}
+Display documentation of the Lisp symbol named @var{symbol}
+(@code{describe-symbol}).  This will show the documentation of all
+kinds of symbols: functions, variables, and faces.
 @item C-h p
 Find packages by topic keyword (@code{finder-by-keyword}).  This lists
 packages using a package menu buffer.  @xref{Packages}.
@@ -272,6 +276,14 @@ source files installed (@pxref{Hyperlinking}).
 (@code{Info-goto-emacs-command-node}).  This knows about various
 manuals, not just the Emacs manual, and finds the right one.
 
address@hidden C-h o
address@hidden describe-symbol
+  @kbd{C-h o} (@code{describe-symbol}) is like @kbd{C-h f} and
address@hidden v}, but it describes any symbol, be it a function, a
+variable, or a face.  If the symbol has more than one definition, like
+it has both definition as a function and as a variable, this command
+will show the documentation of all of them, one after the other.
+
 @node Apropos
 @section Apropos
 @cindex apropos
@@ -524,8 +536,9 @@ command works depend on the major mode.
 @findex view-lossage
   If something surprising happens, and you are not sure what you typed,
 use @kbd{C-h l} (@code{view-lossage}).  @kbd{C-h l} displays your last
-300 input keystrokes.  If you see commands that you don't know, you can
-use @kbd{C-h c} to find out what they do.
+300 input keystrokes and the commands they invoked.  If you see
+commands that you are not familiar with, you can use @kbd{C-h k} or
address@hidden f} to find out what they do.
 
 @kindex C-h e
 @findex view-echo-area-messages
diff --git a/doc/emacs/killing.texi b/doc/emacs/killing.texi
index d453647..9761ac7 100644
--- a/doc/emacs/killing.texi
+++ b/doc/emacs/killing.texi
@@ -504,9 +504,9 @@ does not alter the clipboard.  However, if you change
 @code{yank-pop-change-selection} to @code{t}, then @kbd{M-y} saves the
 new yank to the clipboard.
 
address@hidden x-select-enable-clipboard
address@hidden select-enable-clipboard
   To prevent kill and yank commands from accessing the clipboard,
-change the variable @code{x-select-enable-clipboard} to @code{nil}.
+change the variable @code{select-enable-clipboard} to @code{nil}.
 
 @cindex clipboard manager
 @vindex x-select-enable-clipboard-manager
@@ -519,14 +519,14 @@ when exiting Emacs; if you wish to prevent Emacs from 
transferring
 data to the clipboard manager, change the variable
 @code{x-select-enable-clipboard-manager} to @code{nil}.
 
address@hidden x-select-enable-primary
address@hidden select-enable-primary
 @findex clipboard-kill-region
 @findex clipboard-kill-ring-save
 @findex clipboard-yank
   Prior to Emacs 24, the kill and yank commands used the primary
 selection (@pxref{Primary Selection}), not the clipboard.  If you
-prefer this behavior, change @code{x-select-enable-clipboard} to
address@hidden, @code{x-select-enable-primary} to @code{t}, and
+prefer this behavior, change @code{select-enable-clipboard} to
address@hidden, @code{select-enable-primary} to @code{t}, and
 @code{mouse-drag-copy-region} to @code{t}.  In this case, you can use
 the following commands to act explicitly on the clipboard:
 @code{clipboard-kill-region} kills the region and saves it to the
@@ -853,6 +853,19 @@ so in a rectangular fashion, and killing and yanking 
operate on the
 rectangle.  @xref{Killing}.  The mode persists only as long as the
 region is active.
 
+Unlike the standard region, the region-rectangle can have its corners
+extended past the end of buffer, or inside stretches of white space
+that point normally cannot enter, like the TAB.
+
address@hidden rectangle-exchange-point-and-mark
address@hidden address@hidden, in rectangle-mark-mode}
address@hidden C-x address@hidden, in rectangle-mark-mode}
+When the region is in rectangle-mark-mode, @kbd{C-x C-x} runs the
+command @code{rectangle-exchange-point-and-mark}, which cycles between
+the four corners of the region-rectangle.  This comes in handy if you
+want to modify the dimensions of the region-rectangle before invoking
+an operation on the marked text.
+
 @node CUA Bindings
 @section CUA Bindings
 @findex cua-mode
diff --git a/doc/emacs/m-x.texi b/doc/emacs/m-x.texi
index c9ae559..795d6fe 100644
--- a/doc/emacs/m-x.texi
+++ b/doc/emacs/m-x.texi
@@ -43,6 +43,13 @@ Note that @code{forward-char} is the same command that you 
invoke with
 the key @kbd{C-f}.  The existence of a key binding does not stop you
 from running the command by name.
 
address@hidden obsolete command
+  When @kbd{M-x} completes on commands, it ignores the commands that
+are declared @dfn{obsolete}; for these, you will have to type their
+full name.  Obsolete commands are those for which newer, better
+alternatives exist, and which are slated for removal in some future
+Emacs release.
+
   To cancel the @kbd{M-x} and not run a command, type @kbd{C-g} instead
 of entering the command name.  This takes you back to command level.
 
@@ -57,7 +64,16 @@ mentions this in the echo area after running the command.  
For
 example, if you type @kbd{M-x forward-word}, the message says that you
 can run the same command by typing @kbd{M-f}.  You can turn off these
 messages by setting the variable @code{suggest-key-bindings} to
address@hidden
address@hidden  The value of @code{suggest-key-bindings} can also be a
+number, in which case Emacs will show the binding for that many
+seconds before removing it from display.  The default behavior is to
+display the binding for 2 seconds.
+
+  Commands that don't have key bindings, can still be invoked after
+typing less than their full name at the @samp{M-x} prompt.  Emacs
+mentions such shorthands in the echo area if they are significantly
+shorter than the full command name.  The setting of
address@hidden affects these hints as well.
 
   In this manual, when we speak of running a command by name, we often
 omit the @key{RET} that terminates the name.  Thus we might say
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index a571ea7..801d147 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -47,6 +47,17 @@ variable @code{vc-handled-backends} to @code{nil}
 (@pxref{Customizing VC}).
 @end ifnottex
 
address@hidden vc-refresh-state
address@hidden vc-state-refresh
+  To update the VC state information for the file visited in the
+current buffer, use the command @code{vc-refresh-state}.  This command
+is useful when you perform version control commands outside Emacs
+(e.g., from the shell prompt), or if you put the buffer's file under a
+different version control system, or remove it from version control
+entirely.  A companion command @code{vc-state-refresh} does the same,
+but does not consider switching the version control system or removal
+from VC.
+
 @menu
 * Introduction to VC::  How version control works in general.
 * VC Mode Line::        How the mode line shows version control status.
@@ -821,15 +832,19 @@ corresponding to @var{revision}, saves it to
 window.
 
 @findex vc-annotate
address@hidden vc-annotate-background-mode
 @kindex C-x v g
   Many version control systems allow you to view files @dfn{annotated}
 with per-line revision information, by typing @kbd{C-x v g}
 (@code{vc-annotate}).  This creates a new ``annotate'' buffer
-displaying the file's text, with each line colored to show
-how old it is.  Red text is new, blue is old, and intermediate colors
-indicate intermediate ages.  By default, the color is scaled over the
-full range of ages, such that the oldest changes are blue, and the
-newest changes are red.
+displaying the file's text, with each line colored to show how old it
+is.  Red text is new, blue is old, and intermediate colors indicate
+intermediate ages.  By default, the color is scaled over the full
+range of ages, such that the oldest changes are blue, and the newest
+changes are red.  If the variable @code{vc-annotate-background-mode}
+is address@hidden, the colors expressing the age of each line are
+applied to the background color, leaving the foreground at its default
+color.
 
   When you give a prefix argument to this command, Emacs reads two
 arguments using the minibuffer: the revision to display and annotate
@@ -1009,6 +1024,22 @@ increase the number of revisions shown in an existing
 entries} or @samp{Show unlimited entries} buttons at the end of the
 buffer.  However, RCS, SCCS, and CVS do not support this feature.
 
address@hidden vc-region-history
+A useful variant of examining changes is provided by the command
address@hidden, which shows a @file{*VC-history*} buffer with
+the history of changes to the region of the current file between point
+and the mark (@pxref{Mark}).  The history of changes includes the
+commit log messages and also the changes themselves in the Diff
+format.
+
+Invoke this command after marking the region of the current file in
+whose changes you are interested.  In the @file{*VC-history*} buffer
+it pops up, you can use all of the commands available in the
address@hidden buffer described above, and also the commands
+defined by Diff mode (@pxref{Diff Mode}).
+
+This command is currently available only with Git.
+
 @node VC Undo
 @subsection Undoing Version Control Actions
 
@@ -1353,19 +1384,43 @@ commit will be committed to that specific branch.
 @subsubsection Pulling/Pushing Changes into/from a Branch
 
 @table @kbd
address@hidden C-x v P
+On a decentralized version control system, update another location
+with changes from the current branch (a.k.a. ``push'' changes).  This
+concept does not exist for centralized version control systems
+
 @item C-x v +
 On a decentralized version control system, update the current branch
 by ``pulling in'' changes from another location.
 
 On a centralized version control system, update the current VC
 fileset.
-
address@hidden C-x v P
-On a decentralized version control system, ``push'' changes from the
-current branch to another location.  This concept does not exist
-for centralized version control systems.
 @end table
 
address@hidden C-x v P
address@hidden vc-push
+On a decentralized version control system, the command @kbd{C-x v P}
+(@code{vc-push}) updates another location with changes from the
+current branch.  With a prefix argument, it prompts for the exact
+version control command to run, which lets you specify where to push
+changes; the default is @command{bzr push} with Bazaar, @command{git
+push} with Git, and @command{hg push} with Mercurial.  The default
+commands always push to a default location determined by the version
+control system from your branch configuration.
+
+Prior to pushing, you can use @kbd{C-x v O} (@code{vc-log-outgoing})
+to view a log buffer of the changes to be sent.  @xref{VC Change Log}.
+
address@hidden bound branch (Bazaar VCS)
+This command is currently supported only by Bazaar, Git, and Mercurial.
+The concept of ``pushing'' does not exist for centralized version
+control systems, where this operation is a part of committing a
+changeset, so invoking this command on a centralized VCS signals an
+error.  This command also signals an error when attempted in a Bazaar
address@hidden branch}, where committing a changeset automatically pushes
+the changes to the remote repository to which the local branch is
+bound.
+
 @kindex C-x v +
 @findex vc-pull
   On a decentralized version control system, the command @kbd{C-x v +}
@@ -1377,12 +1432,12 @@ Otherwise, it pulls from a default location determined 
by the version
 control system.
 
   Amongst decentralized version control systems, @kbd{C-x v +} is
-currently supported only by Bazaar, Git, and Mercurial.  On Bazaar, it
-calls @command{bzr pull} for ordinary branches (to pull from a master
-branch into a mirroring branch), and @command{bzr update} for a bound
-branch (to pull from a central repository).  On Git, it calls
+currently supported only by Bazaar, Git, and Mercurial.  With Bazaar,
+it calls @command{bzr pull} for ordinary branches (to pull from a
+master branch into a mirroring branch), and @command{bzr update} for a
+bound branch (to pull from a central repository).  With Git, it calls
 @command{git pull} to fetch changes from a remote repository and merge
-it into the current branch.  On Mercurial, it calls @command{hg pull
+it into the current branch.  With Mercurial, it calls @command{hg pull
 -u} to fetch changesets from the default remote repository and update
 the working directory.
 
@@ -1393,21 +1448,6 @@ Log}.
   On a centralized version control system like CVS, @kbd{C-x v +}
 updates the current VC fileset from the repository.
 
address@hidden C-x v P
address@hidden vc-push
-  On a decentralized version control system, the command @kbd{C-x v P}
-(@code{vc-push}) sends changes from your current branch to another location.
-With a prefix argument, the command prompts for the exact
-version control command to use, which lets you specify where to push
-changes.  Otherwise, it pushes to a default location determined
-by the version control system.
-
-  Prior to pushing, you can use @kbd{C-x v O} (@code{vc-log-outgoing})
-to view a log buffer of the changes to be sent.  @xref{VC Change Log}.
-
-This command is currently supported only by Bazaar, Git, and Mercurial.
-It signals an error for centralized version control systems.
-
 @node Merging
 @subsubsection Merging Branches
 @cindex merging changes
@@ -2285,7 +2325,7 @@ input.  @xref{Query Replace}, for more information on 
query replace.
   You can control the case-sensitivity of tags search commands by
 customizing the value of the variable @code{tags-case-fold-search}.  The
 default is to use the same setting as the value of
address@hidden (@pxref{Search Case}).
address@hidden (@pxref{Lax Search}).
 
   It is possible to get through all the files in the tags table with a
 single invocation of @kbd{M-x tags-query-replace}.  But often it is
diff --git a/doc/emacs/mini.texi b/doc/emacs/mini.texi
index 2493fda..869e064 100644
--- a/doc/emacs/mini.texi
+++ b/doc/emacs/mini.texi
@@ -588,13 +588,17 @@ argument into the minibuffer:
 
 @table @kbd
 @item M-p
address@hidden @key{UP}
 Move to the previous item in the minibuffer history, an earlier
 argument (@code{previous-history-element}).
 @item M-n
address@hidden @key{DOWN}
 Move to the next item in the minibuffer history
 (@code{next-history-element}).
address@hidden @key{UP}
address@hidden @key{DOWN}
+Like @kbd{M-p} and @kbd{M-n}, but move to the previous or next line of
+a multi-line item before going to the previous history item
+(@code{previous-line-or-history-element} and
address@hidden) .
 @item M-r @var{regexp} @key{RET}
 Move to an earlier item in the minibuffer history that
 matches @var{regexp} (@code{previous-matching-history-element}).
@@ -609,13 +613,13 @@ Move to a later item in the minibuffer history that 
matches
 @kindex DOWN @r{(minibuffer history)}
 @findex next-history-element
 @findex previous-history-element
-  While in the minibuffer, @kbd{M-p} or @key{UP}
-(@code{previous-history-element}) moves through the minibuffer history
-list, one item at a time.  Each @kbd{M-p} fetches an earlier item from
-the history list into the minibuffer, replacing its existing contents.
-Typing @kbd{M-n} or @key{DOWN} (@code{next-history-element}) moves
-through the minibuffer history list in the opposite direction,
-fetching later entries into the minibuffer.
+  While in the minibuffer, @kbd{M-p} (@code{previous-history-element})
+moves through the minibuffer history list, one item at a time.  Each
address@hidden fetches an earlier item from the history list into the
+minibuffer, replacing its existing contents.  Typing @kbd{M-n}
+(@code{next-history-element}) moves through the minibuffer history
+list in the opposite direction, fetching later entries into the
+minibuffer.
 
   If you type @kbd{M-n} in the minibuffer when there are no later
 entries in the minibuffer history (e.g., if you haven't previously
@@ -623,6 +627,14 @@ typed @kbd{M-p}), Emacs tries fetching from a list of 
default
 arguments: values that you are likely to enter.  You can think of this
 as moving through the ``future history''.
 
address@hidden previous-line-or-history-element
address@hidden next-line-or-history-element
+  The arrow keys @address@hidden and @address@hidden work like
address@hidden and @kbd{M-n}, but if the current history item is longer
+than a single line, they allow you to move to the previous or next
+line of the current history item before going to the previous or next
+history item.
+
   If you edit the text inserted by the @kbd{M-p} or @kbd{M-n}
 minibuffer history commands, this does not change its entry in the
 history list.  However, the edited argument does go at the end of the
@@ -642,8 +654,8 @@ expressions.  A numeric prefix argument @var{n} means to 
fetch the
 @var{n}th matching entry.  These commands are unusual, in that they
 use the minibuffer to read the regular expression argument, even
 though they are invoked from the minibuffer.  An upper-case letter in
-the regular expression makes the search case-sensitive (@pxref{Search
-Case}).
+the regular expression makes the search case-sensitive (@pxref{Lax
+Search}).
 
   You can also search through the history using an incremental search.
 @xref{Isearch Minibuffer}.
diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi
index 7fad826..41dce52 100644
--- a/doc/emacs/misc.texi
+++ b/doc/emacs/misc.texi
@@ -6,7 +6,8 @@
 @chapter Miscellaneous Commands
 
   This chapter contains several brief topics that do not fit anywhere
-else: reading Usenet news, viewing PDFs and other such documents, web
+else: reading Usenet news, host and network security,
+viewing PDFs and other such documents, web
 browsing, running shell commands and shell subprocesses, using a
 single shared Emacs for utilities that expect to run an editor as a
 subprocess, printing, sorting text, editing binary files, saving an
@@ -249,6 +250,25 @@ Search forward for articles containing a match for 
@var{regexp}.
 Exit the summary buffer and return to the group buffer.
 @end table
 
address@hidden Host Security
address@hidden Host Security
address@hidden security
+
+Emacs runs inside an operating system such as GNU/Linux, and relies on
+the operating system to check security constraints such as accesses to
+files.  The default settings for Emacs are designed for typical use;
+they may require some tailoring in environments where security is more
+of a concern, or less of a concern, than usual.  For example,
+file-local variables can be risky, and you can set the variable
address@hidden to @code{:safe} or (even more
+conservatively) to @code{nil}; conversely, if your files can all be
+trusted and the default checking for these variables is irritating,
+you can set @code{enable-local-variables} to @code{:all}.  @xref{Safe
+File Variables}.
+
address@hidden Considerations,,, elisp, The Emacs Lisp Reference
+Manual}, for more information about security considerations when using
+Emacs as part of a larger application.
 
 @node Network Security
 @section Network Security
@@ -741,6 +761,10 @@ advancing point, and any terminal input for the subshell 
comes from
 text in the buffer.  To give input to the subshell, go to the end of
 the buffer and type the input, terminated by @key{RET}.
 
+  By default, when the subshell is invoked interactively, the
address@hidden buffer is displayed in a new window.  This behavior can
+be customized via @code{display-buffer-alist} (@pxref{Window Choice}).
+
   While the subshell is waiting or running a command, you can switch
 windows or buffers and perform other editing in Emacs.  Emacs inserts
 the output from the subshell into the Shell buffer whenever it has
diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index 1a6a735..5f80b0a 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -59,7 +59,12 @@ The package's version number (e.g., @samp{11.86}).
 The package's status---normally one of @samp{available} (can be
 downloaded from the package archive), @samp{installed},
 @c @samp{unsigned} (installed, but not signed; @pxref{Package Signing}),
-or @samp{built-in} (included in Emacs by default).
+or @samp{built-in} (included in Emacs by default).  The status
address@hidden means the package is not built-in and not from the
+directory specified by @code{package-user-dir} (@pxref{Package
+Files}).  External packages are treated much like built-in: they
+cannot be deleted through the package menu, and are not considered for
+upgrading.
 
 The status can also be @samp{new}.  This is equivalent to
 @samp{available}, except that it means the package became newly
@@ -106,7 +111,13 @@ line; typing @kbd{x} (see below) will delete the package.
 @xref{Package Files}, for information about what package deletion
 entails.
 
address@hidden ~
+Mark all obsolete packages for deletion
+(@code{package-menu-mark-obsolete-for-deletion}).  This marks for
+deletion all the packages whose status is @samp{obsolete}.
+
 @item u
address@hidden @key{DEL}
 Remove any installation or deletion mark previously added to the
 current line by an @kbd{i} or @kbd{d} command.
 
@@ -117,6 +128,7 @@ on the new available versions, and a deletion mark on the 
old
 installed versions.
 
 @item x
address@hidden package-menu-async
 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.
@@ -131,6 +143,14 @@ Filter the package list (@code{package-menu-filter}).  
This prompts
 for a keyword (e.g., @samp{games}), then shows only the packages
 that relate to that keyword.  To restore the full package list,
 type @kbd{q}.
+
address@hidden H
+Permanently hide packages that match a regexp
+(@code{package-menu-hide-package}).
+
address@hidden (
+Toggle visibility of old versions of packages and also of versions
+from lower-priority archives (@code{package-menu-toggle-hiding}).
 @end table
 
 @noindent
@@ -205,6 +225,17 @@ offer different versions of the same package, you may find 
the option
 pairs to this list, to ensure that the specified package is only ever
 downloaded from the specified archive.
 
address@hidden package-archive-priorities
address@hidden package-menu-hide-low-priority
+  Another option that is useful when you have several package archives
+enabled is @code{package-archive-priorities}.  It specifies the
+priority of each archive (higher numbers specify higher priority
+archives).  By default, archives have the priority of zero, unless
+specified otherwise by this option's value.  Packages from
+lower-priority archives will not be shown in the menu, if the same
+package is available from a higher-priority archive.  (This is
+controlled by the value of @code{package-menu-hide-low-priority}.)
+
   Once a package is downloaded and installed, it is @dfn{loaded} into
 the current Emacs session.  Loading a package is not quite the same as
 loading a Lisp library (@pxref{Lisp Libraries}); its effect varies
diff --git a/doc/emacs/programs.texi b/doc/emacs/programs.texi
index 1f2c8b1..8423b70 100644
--- a/doc/emacs/programs.texi
+++ b/doc/emacs/programs.texi
@@ -833,9 +833,36 @@ displayed.  The default is 102400.
 @findex show-paren-mode
   Show Paren mode, a global minor mode, provides a more powerful kind
 of automatic matching.  Whenever point is before an opening delimiter
-or after a closing delimiter, both that delimiter and its opposite
-delimiter are highlighted.  To toggle Show Paren mode, type @kbd{M-x
-show-paren-mode}.
+or after a closing delimiter, the delimiter, its matching delimiter,
+and optionally the text between them are highlighted.  To toggle Show
+Paren mode, type @kbd{M-x show-paren-mode}.  To customize it, type
address@hidden customize-group @key{RET} paren-showing}.  The customizable
+options which control the operation of this mode include:
+
address@hidden @bullet
address@hidden
address@hidden controls whether to highlight
+an open paren when point stands just before it, and hence its position
+is marked by the cursor anyway.  The default is address@hidden (yes).
+
address@hidden
address@hidden controls whether just the two parens, or also
+the space between them get highlighted.  The valid options here are
address@hidden (show the matching paren), @code{expression}
+(highlight the entire expression enclosed by the parens), and
address@hidden (highlight the matching paren if it is visible, the
+expression otherwise).
+
address@hidden
address@hidden, when address@hidden, causes
+highlighting also when point is on the inside of a parenthesis.
+
address@hidden
address@hidden, when address@hidden, causes
+highlighting also when point is in whitespace at the beginning or end
+of a line, and there is a paren at, respectively, the first or last,
+or the last, non-whitespace position on the line.
address@hidden itemize
 
 @cindex Electric Pair mode
 @cindex inserting matching parentheses
@@ -917,6 +944,8 @@ will indent the comment to the appropriate position.
 @item @kbd{M-;}
 Insert or realign comment on current line; if the region is active,
 comment or uncomment the region instead (@code{comment-dwim}).
address@hidden @kbd{C-x C-;}
+Comment or uncomment the current line (@code{comment-line}).
 @item @kbd{C-u M-;}
 Kill comment on current line (@code{comment-kill}).
 @item @kbd{C-x ;}
@@ -971,6 +1000,18 @@ are not moved.  Even when an existing comment is properly 
aligned,
 @kbd{M-;} is still useful for moving directly to the start of the
 comment text.
 
address@hidden comment-line
address@hidden C-x C-;
+  @kbd{C-x C-;} (@code{comment-line}) comments or uncomments complete
+lines.  When a region is active (@pxref{Mark}), @kbd{C-x C-;} either
+comments or uncomments the lines in the region.  If the region is not
+active, this command comments or uncomments the line point is on.
+With a positive prefix argument @var{n}, it operates on @var{n} lines
+starting with the current one; with a negative @var{n}, it affects
address@hidden preceding lines.  After invoking this command with a negative
+argument, successive invocations with a positive argument will operate
+on preceding lines as if the argument were negated.
+
 @findex comment-kill
 @kindex C-u M-;
   @kbd{C-u M-;} (@code{comment-dwim} with a prefix argument) kills any
@@ -1220,13 +1261,16 @@ variables that you want to use.  @xref{Name Help}.
 
 @cindex Eldoc mode
 @findex eldoc-mode
address@hidden global-eldoc-mode
   Eldoc is a buffer-local minor mode that helps with looking up Lisp
 documentation.  When it is enabled, the echo area displays some useful
 information whenever there is a Lisp function or variable at point;
 for a function, it shows the argument list, and for a variable it
 shows the first line of the variable's documentation string.  To
-toggle Eldoc mode, type @kbd{M-x eldoc-mode}.  Eldoc mode can be used
-with the Emacs Lisp and Lisp Interaction major modes.
+toggle Eldoc mode, type @kbd{M-x eldoc-mode}.  There's also a Global
+Eldoc mode, which is turned on by default, and affects buffers, such
+as @samp{*scratch*}, whose major mode is Emacs Lisp or Lisp
+Interaction (@address@hidden global-eldoc-mode}} to turn it off globally).
 
 @node Hideshow
 @section Hideshow minor mode
@@ -1484,14 +1528,21 @@ with the Foldout package (@pxref{Foldout}).
 
 @findex prettify-symbols-mode
   Prettify Symbols mode is a buffer-local minor mode that replaces
-certain strings with more attractive versions for display
-purposes.  For example, in Emacs Lisp mode, it replaces the string
address@hidden with the Greek lambda character @samp{λ}.  You may wish
-to use this
-in non-programming modes as well.  You can customize the mode by
-adding more entries to @code{prettify-symbols-alist}.  There is also a
-global version, @code{global-prettify-symbols-mode}, which enables the
-mode in all buffers that support it.
+certain strings with more attractive versions for display purposes.
+For example, in Emacs Lisp mode, it replaces the string @samp{lambda}
+with the Greek lambda character @samp{λ}.  You may wish to use this in
+non-programming modes as well.  You can customize the mode by adding
+more entries to @code{prettify-symbols-alist}.  More elaborate
+customization is available via customizing
address@hidden if its default value
address@hidden is not appropriate.  There
+is also a global version, @code{global-prettify-symbols-mode}, which
+enables the mode in all buffers that support it.
+
+  The symbol at point can be shown in its original form.  This is
+controlled by the variable @code{prettify-symbols-unprettify-at-point}:
+if address@hidden, the original form of symbol at point will be
+restored for as long as point is at it.
 
 
 @node C Modes
diff --git a/doc/emacs/regs.texi b/doc/emacs/regs.texi
index d8841ca..13c03f7 100644
--- a/doc/emacs/regs.texi
+++ b/doc/emacs/regs.texi
@@ -293,9 +293,11 @@ various files.
 Set the bookmark for the visited file, at point.
 
 @item C-x r m @var{bookmark} @key{RET}
address@hidden bookmark-set
 Set the bookmark named @var{bookmark} at point (@code{bookmark-set}).
 
address@hidden C-x r M @var{bookmark} @key{RET}
+Like @kbd{C-x r m}, but don't overwrite an existing bookmark.
+
 @item C-x r b @var{bookmark} @key{RET}
 @findex bookmark-jump
 Jump to the bookmark named @var{bookmark} (@code{bookmark-jump}).
@@ -320,6 +322,12 @@ name.  If you name each bookmark after the file it points 
to, then you
 can conveniently revisit any of those files with @kbd{C-x r b}, and move
 to the position of the bookmark at the same time.
 
address@hidden C-x r M
address@hidden bookmark-set-no-overwrite
+  The command @kbd{C-x r M} (@code{bookmark-set-no-overwrite}) works
+like @kbd{C-x r m}, but it signals an error if the specified bookmark
+already exists, instead of overwriting it.
+
 @kindex C-x r l
   To display a list of all your bookmarks in a separate buffer, type
 @kbd{C-x r l} (@code{list-bookmarks}).  If you switch to that buffer,
diff --git a/doc/emacs/rmail.texi b/doc/emacs/rmail.texi
index 6e2a60b..b37f42c 100644
--- a/doc/emacs/rmail.texi
+++ b/doc/emacs/rmail.texi
@@ -282,9 +282,9 @@ current message and select another.  @kbd{d}
 messages already deleted, while @kbd{C-d} (@code{rmail-delete-backward})
 moves to the previous nondeleted message.  If there is no nondeleted
 message to move to in the specified direction, the message that was just
-deleted remains current.  @kbd{d} with a prefix argument is equivalent
-to @kbd{C-d}.  Note that the Rmail summary versions of these commands
-behave slightly differently (@pxref{Rmail Summary Edit}).
+deleted remains current.  A numeric prefix argument serves as a repeat
+count, to allow deletion of several messages in a single command.  A
+negative argument reverses the meaning of @kbd{d} and @kbd{C-d}.
 
 @c mention other hooks, e.g., show message hook?
 @vindex rmail-delete-message-hook
@@ -305,7 +305,8 @@ type @kbd{x} (@code{rmail-expunge}).  Until you do this, 
you can still
 effect of a @kbd{d} command in most cases.  It undeletes the current
 message if the current message is deleted.  Otherwise it moves backward
 to previous messages until a deleted message is found, and undeletes
-that message.
+that message.  A numeric prefix argument serves as a repeat count, to
+allow deletion of several messages in a single command.
 
   You can usually undo a @kbd{d} with a @kbd{u} because the @kbd{u}
 moves back to and undeletes the message that the @kbd{d} deleted.  But
@@ -974,13 +975,11 @@ different lines.  It doesn't matter what Emacs command 
you use to move
 point; whichever line point is on at the end of the command, that
 message is selected in the Rmail buffer.
 
-  Almost all Rmail commands work in the summary buffer as well as in the
-Rmail buffer.  Thus, @kbd{d} in the summary buffer deletes the current
-message, @kbd{u} undeletes, and @kbd{x} expunges.  (However, in the
-summary buffer, a numeric argument to @kbd{d}, @kbd{C-d} and @kbd{u}
-serves as a repeat count.  A negative argument reverses the meaning of
address@hidden and @kbd{C-d}.  Also, if there are no more undeleted messages in
-the relevant direction, the delete commands go to the first or last
+  Almost all Rmail commands work in the summary buffer as well as in
+the Rmail buffer.  Thus, @kbd{d} in the summary buffer deletes the
+current message, @kbd{u} undeletes, and @kbd{x} expunges.  (However,
+in the summary buffer, if there are no more undeleted messages in the
+relevant direction, the delete commands go to the first or last
 message, rather than staying on the current message.)  @kbd{o} and
 @kbd{C-o} output the current message to a FILE; @kbd{r} starts a reply
 to it; etc.  You can scroll the current message while remaining in the
@@ -1224,6 +1223,15 @@ tagline (except for buttons for other actions, if there 
are any).  Type
 the undecoded @acronym{MIME} data.  With a prefix argument, this
 command toggles the display of only an entity at point.
 
address@hidden rmail-mime-prefer-html
+  If the message has an @acronym{HTML} @acronym{MIME} part, Rmail
+displays it in preference to the plain-text part, if Emacs can render
address@hidden@footnote{
+This capability requires that Emacs be built with @file{libxml2}
+support or that you have the Lynx browser installed.}.  To prevent
+that, and have the plain-text part displayed instead, customize the
+variable @code{rmail-mime-prefer-html} to a @code{nil} value.
+
   To prevent Rmail from handling MIME decoded messages, change the
 variable @code{rmail-enable-mime} to @code{nil}.  When this is the
 case, the @kbd{v} (@code{rmail-mime}) command instead creates a
diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi
index ae275d1..1cc7753 100644
--- a/doc/emacs/search.texi
+++ b/doc/emacs/search.texi
@@ -26,9 +26,11 @@ thing, but search for patterns instead of fixed strings.
 * Regexps::                   Syntax of regular expressions.
 * Regexp Backslash::          Regular expression constructs starting with `\'.
 * Regexp Example::            A complex regular expression explained.
-* Search Case::               To ignore case while searching, or not.
+* Lax Search::                Search ignores some distinctions among
+                                similar characters, like letter-case.
 * Replace::                   Search, and replace some or all matches.
 * Other Repeating Search::    Operating on all matches for some regexp.
+* Search Customizations::     Various search customizations.
 @end menu
 
 @node Incremental Search
@@ -54,10 +56,10 @@ Incremental search backward (@code{isearch-backward}).
 @menu
 * Basic Isearch::        Basic incremental search commands.
 * Repeat Isearch::       Searching for the same string again.
-* Error in Isearch::     When your string is not found.
-* Special Isearch::      Special input in incremental search.
 * Isearch Yank::         Commands that grab text into the search string
                            or else edit the search string.
+* Error in Isearch::     When your string is not found.
+* Special Isearch::      Special input in incremental search.
 * Not Exiting Isearch::  Prefix argument and scrolling commands.
 * Isearch Minibuffer::   Incremental search of the minibuffer history.
 @end menu
@@ -89,31 +91,46 @@ cursor moves to just after the first @samp{FOO}.
 @cindex isearch face
   At each step, Emacs highlights the @dfn{current match}---the buffer
 text that matches the search string---using the @code{isearch} face
-(@pxref{Faces}).  The current search string is also displayed in the
-echo area.
+(@pxref{Faces}).  @xref{Search Customizations}, for various options
+that customize this highlighting.  The current search string is also
+displayed in the echo area.
 
   If you make a mistake typing the search string, type @key{DEL}.
 Each @key{DEL} cancels the last character of the search string.
address@hidden in Isearch}, for more about dealing with unsuccessful
+search.
 
address@hidden exit incremental search
address@hidden incremental search, exiting
   When you are satisfied with the place you have reached, type
 @key{RET}.  This stops searching, leaving the cursor where the search
 brought it.  Also, any command not specially meaningful in searches
 stops the searching and is then executed.  Thus, typing @kbd{C-a}
-exits the search and then moves to the beginning of the line.
address@hidden is necessary only if the next command you want to type is a
-printing character, @key{DEL}, @key{RET}, or another character that is
-special within searches (@kbd{C-q}, @kbd{C-w}, @kbd{C-r}, @kbd{C-s},
address@hidden, @kbd{M-y}, @kbd{M-r}, @kbd{M-c}, @kbd{M-e}, and some others
-described below).
+exits the search and then moves to the beginning of the line; typing
+one of the arrow keys exits the search and performs the respective
+movement command; etc.  @key{RET} is necessary only if the next
+command you want to type is a printing character, @key{DEL},
address@hidden, or another character that is special within searches
+(@kbd{C-q}, @kbd{C-w}, @kbd{C-r}, @kbd{C-s}, @kbd{C-y}, @kbd{M-y},
address@hidden, @kbd{M-c}, @kbd{M-e}, and some others described below).
+You can fine-tune the commands that exit the search; see @ref{Not
+Exiting Isearch}.
 
   As a special exception, entering @key{RET} when the search string is
 empty launches nonincremental search (@pxref{Nonincremental Search}).
+(This can be customized; see @ref{Search Customizations}.)
+
+  To abandon the search and return to the place where you started,
+type @address@hidden @key{ESC} @key{ESC}} (@code{isearch-cancel}) or
address@hidden C-g} (@code{isearch-abort}).
 
   When you exit the incremental search, it adds the original value of
 point to the mark ring, without activating the mark; you can thus use
address@hidden address@hidden to return to where you were before beginning the
-search.  @xref{Mark Ring}.  It only does this if the mark was not
-already active.
address@hidden address@hidden or @kbd{C-x C-x} to return to where you were
+before beginning the search.  @xref{Mark Ring}.  (Emacs only does this
+if the mark was not already active; if the mark was active when you
+started the search, both @kbd{C-u address@hidden and @kbd{C-x C-x} will
+go to the mark.)
 
 @kindex C-r
 @findex isearch-backward
@@ -134,7 +151,6 @@ characters with @key{DEL}.  Similarly, each @kbd{C-r} in a 
backward
 incremental search repeats the backward search.
 
 @cindex lazy search highlighting
address@hidden isearch-lazy-highlight
   If you pause for a little while during incremental search, Emacs
 highlights all the other possible matches for the search string that
 are present on the screen.  This helps you anticipate where you can
@@ -142,21 +158,26 @@ get to by typing @kbd{C-s} or @kbd{C-r} to repeat the 
search.  The
 other matches are highlighted differently from the current match,
 using the customizable face @code{lazy-highlight} (@pxref{Faces}).  If
 you don't like this feature, you can disable it by setting
address@hidden to @code{nil}.
address@hidden to @code{nil}.  For other customizations
+related to highlighting matches, see @ref{Search Customizations}.
 
   After exiting a search, you can search for the same string again by
 typing just @kbd{C-s C-s}.  The first @kbd{C-s} is the key that
 invokes incremental search, and the second @kbd{C-s} means to search
-again.  Similarly, @kbd{C-r C-r} searches backward for the last
-search string.  In determining the last search string, it doesn't
-matter whether the string was searched for with @kbd{C-s} or
address@hidden
+again for the last search string.  Similarly, @kbd{C-r C-r} searches
+backward for the last search string.  In determining the last search
+string, it doesn't matter whether that string was searched for with
address@hidden or @kbd{C-r}.
 
   If you are searching forward but you realize you were looking for
 something before the starting point, type @kbd{C-r} to switch to a
 backward search, leaving the search string unchanged.  Similarly,
 @kbd{C-s} in a backward search switches to a forward search.
 
address@hidden search, wrapping around
address@hidden search, overwrapped
address@hidden wrapped search
address@hidden overwrapped search
   If a search is failing and you ask to repeat it by typing another
 @kbd{C-s}, it starts again from the beginning of the buffer.
 Repeating a failing reverse search with @kbd{C-r} starts again from
@@ -169,19 +190,86 @@ you have already seen.
 @cindex search ring
 @kindex M-n @r{(Incremental search)}
 @kindex M-p @r{(Incremental search)}
address@hidden search-ring-max
   To reuse earlier search strings, use the @dfn{search ring}.  The
 commands @kbd{M-p} and @kbd{M-n} move through the ring to pick a
 search string to reuse.  These commands leave the selected search ring
-element in the minibuffer, where you can edit it.
-
+element in the minibuffer, where you can edit it.  Type
address@hidden/@kbd{C-r} or @key{RET} to accept the string and start
+searching for it.  The number of most recently used search strings
+saved in the search ring is specified by the variable
address@hidden, 16 by default.
+
address@hidden incremental search, edit search string
address@hidden interactively edit search string
 @kindex M-e @r{(Incremental search)}
address@hidden Mouse-1 @r{in the minibuffer (Incremental Search)}
   To edit the current search string in the minibuffer without
-replacing it with items from the search ring, type @kbd{M-e}.  Type @key{RET},
address@hidden or @kbd{C-r} to finish editing the string and search for it.
+replacing it with items from the search ring, type @kbd{M-e} or click
address@hidden in the minibuffer.  Type @key{RET}, @kbd{C-s} or
address@hidden to finish editing the string and search for it.  Type
address@hidden or @address@hidden to add to the search string characters
+following point from the buffer from which you started the search.
+
address@hidden Isearch Yank
address@hidden Isearch Yanking
+
+  In many cases, you will want to use text at or near point as your
+search string.  The commands described in this subsection let you do
+that conveniently.
+
address@hidden C-w @r{(Incremental search)}
address@hidden isearch-yank-word-or-char
+  @kbd{C-w} (@code{isearch-yank-word-or-char}) appends the next
+character or word at point to the search string.  This is an easy way
+to search for another occurrence of the text at point.  (The decision
+of whether to copy a character or a word is heuristic.)
+
address@hidden M-s C-e @r{(Incremental search)}
address@hidden isearch-yank-line
+  Similarly, @kbd{M-s C-e} (@code{isearch-yank-line}) appends the rest
+of the current line to the search string.  If point is already at the
+end of a line, it appends the next line.  With a prefix argument
address@hidden, it appends the next @var{n} lines.
+
address@hidden C-y @r{(Incremental search)}
address@hidden M-y @r{(Incremental search)}
address@hidden Mouse-2 @r{in the minibuffer (Incremental search)}
address@hidden isearch-yank-kill
address@hidden isearch-yank-pop
address@hidden isearch-yank-x-selection
+  Within incremental search, @kbd{C-y} (@code{isearch-yank-kill})
+appends the current kill to the search string.  @kbd{M-y}
+(@code{isearch-yank-pop}), if called after @kbd{C-y}, replaces that
+appended text with an earlier kill, similar to the usual @kbd{M-y}
+(@code{yank-pop}) command (@pxref{Yanking}).  Clicking @kbd{Mouse-2}
+in the echo area appends the current X selection (@pxref{Primary
+Selection}) to the search string (@code{isearch-yank-x-selection}).
+
address@hidden C-M-w @r{(Incremental search)}
address@hidden C-M-y @r{(Incremental search)}
address@hidden isearch-del-char
address@hidden isearch-yank-char
+  @kbd{C-M-w} (@code{isearch-del-char}) deletes the last character
+from the search string, and @kbd{C-M-y} (@code{isearch-yank-char})
+appends the character after point to the search string.  An
+alternative method to add the character after point is to enter the
+minibuffer with @kbd{M-e} (@pxref{Repeat Isearch}) and type @kbd{C-f}
+or @address@hidden at the end of the search string in the
+minibuffer.  Each @kbd{C-f} or @address@hidden you type adds another
+character following point to the search string.
+
+  Normally, when the search is case-insensitive, text yanked into the
+search string is converted to lower case, so that the search remains
+case-insensitive (@pxref{Lax Search, case folding}).  However, if the
+value of the variable @code{search-upper-case} (@pxref{Lax Search,
+search-upper-case}) is other than @code{not-yanks}, that disables this
+down-casing.
 
 @node Error in Isearch
 @subsection Errors in Incremental Search
 
address@hidden isearch-fail face
   If your string is not found at all, the echo area says @samp{Failing
 I-Search}, and the cursor moves past the place where Emacs found as
 much of your string as it could.  Thus, if you search for @samp{FOOT},
@@ -192,12 +280,13 @@ string that failed to match is highlighted using the face
 
   At this point, there are several things you can do.  If your string
 was mistyped, you can use @key{DEL} to erase some of it and correct
-it.  If you like the place you have found, you can type @key{RET} to
-remain there.  Or you can type @kbd{C-g}, which removes from the
-search string the characters that could not be found (the @samp{T} in
address@hidden), leaving those that were found (the @samp{FOO} in
address@hidden).  A second @kbd{C-g} at that point cancels the search
-entirely, returning point to where it was when the search started.
+it, or you can type @kbd{M-e} and edit it.  If you like the place you
+have found, you can type @key{RET} to remain there.  Or you can type
address@hidden, which removes from the search string the characters that
+could not be found (the @samp{T} in @samp{FOOT}), leaving those that
+were found (the @samp{FOO} in @samp{FOOT}).  A second @kbd{C-g} at
+that point cancels the search entirely, returning point to where it
+was when the search started.
 
 @cindex quitting (in search)
 @kindex C-g @r{(Incremental search)}
@@ -216,34 +305,21 @@ search.
 @node Special Isearch
 @subsection Special Input for Incremental Search
 
-  Some of the characters you type during incremental search have
-special effects.
+  In addition to characters described in the previous subsections,
+some of the other characters you type during incremental search have
+special effects.  They are described here.
 
address@hidden lax space matching
address@hidden M-s SPC @r{(Incremental search)}
address@hidden SPC @r{(Incremental search)}
address@hidden isearch-toggle-lax-whitespace
address@hidden search-whitespace-regexp
-  By default, incremental search performs @dfn{lax space matching}:
-each space, or sequence of spaces, matches any sequence of one or more
-spaces in the text.  Hence, @samp{foo bar} matches @samp{foo bar},
address@hidden@w{  }bar}, @address@hidden   }bar}, and so on (but not
address@hidden).  More precisely, Emacs matches each sequence of space
-characters in the search string to a regular expression specified by
-the variable @code{search-whitespace-regexp}.  For example, to make
-spaces match sequences of newlines as well as spaces, set it to
address@hidden"[[:space:]\n]+"}.
-
-  To toggle lax space matching, type @kbd{M-s @key{SPC}}
-(@code{isearch-toggle-lax-whitespace}).  To disable this feature
-entirely, change @code{search-whitespace-regexp} to @code{nil}; then
-each space in the search string matches exactly one space.
-
-  If the search string you entered contains only lower-case letters,
-the search is case-insensitive; as long as an upper-case letter exists
-in the search string, the search becomes case-sensitive.  If you
-delete the upper-case character from the search string, it ceases to
-have this effect.  @xref{Search Case}.
+  To toggle lax space matching (@pxref{Lax Search, lax space
+matching}), type @kbd{M-s @key{SPC}}.
+
+  To toggle case sensitivity of the search, type @kbd{M-c} or
address@hidden c}.  @xref{Lax Search, case folding}.  If the search string
+includes upper-case letters, the search is case-sensitive by default.
+
+  To toggle whether or not the search will consider similar and
+equivalent characters as a match, type @kbd{M-s '}.  @xref{Lax Search,
+character folding}.  If the search string includes accented
+characters, that disables character folding during that search.
 
 @cindex invisible text, searching for
 @kindex M-s i @r{(Incremental search)}
@@ -251,7 +327,17 @@ have this effect.  @xref{Search Case}.
   To toggle whether or not invisible text is searched, type
 @kbd{M-s i} (@code{isearch-toggle-invisible}).  @xref{Outline Search}.
 
-  To search for a newline character, type @kbd{C-j}.
address@hidden M-r @r{(Incremental Search)}
address@hidden M-s r @r{(Incremental Search)}
address@hidden isearch-toggle-regexp
+  To toggle between non-regexp and regexp incremental search, type
address@hidden or @kbd{M-s r} (@code{isearch-toggle-regexp}).
address@hidden Search}.
+
+  To toggle symbol mode, type @kbd{M-s _}.  @xref{Symbol Search}.
+
+  To search for a newline character, type @kbd{C-j} as part of the
+search string.
 
   To search for address@hidden characters, use one of the
 following methods:
@@ -265,17 +351,21 @@ example, @kbd{C-q C-s} during incremental search adds the
 @samp{control-S} character to the search string.
 
 @item
-Type @kbd{C-x 8 @key{RET}}, followed by a Unicode name or code-point.
-This adds the specified character into the search string, similar to
-the usual @code{insert-char} command (@pxref{Inserting Text}).
+Type @kbd{C-x 8 @key{RET}}, followed by a Unicode name or code-point
+in hex.  This adds the specified character into the search string,
+similar to the usual @code{insert-char} command (@pxref{Inserting
+Text}).
 
 @item
address@hidden C-^ @r{(Incremental Search)}
address@hidden isearch-toggle-input-method
address@hidden isearch-toggle-specified-input-method
 Use an input method (@pxref{Input Methods}).  If an input method is
-enabled in the current buffer when you start the search, you can use
-it in the search string also.  While typing the search string, you can
-toggle the input method with @kbd{C-\}
-(@code{isearch-toggle-input-method}).  You can also turn on a
-non-default input method with @kbd{C-^}
+enabled in the current buffer when you start the search, the same
+method will be active in the minibuffer when you type the search
+string.  While typing the search string, you can toggle the input
+method with @kbd{C-\} (@code{isearch-toggle-input-method}).  You can
+also turn on a non-default input method with @kbd{C-^}
 (@code{isearch-toggle-specified-input-method}), which prompts for the
 name of the input method.  When an input method is active during
 incremental search, the search prompt includes the input method
@@ -286,13 +376,17 @@ I-search address@hidden:
 @end example
 
 @noindent
address@hidden isearch-toggle-input-method
address@hidden isearch-toggle-specified-input-method
 where @var{im} is the mnemonic of the active input method.  Any input
 method you enable during incremental search remains enabled in the
 current buffer afterwards.
 @end itemize
 
address@hidden M-s o @r{(Incremental Search)}
address@hidden isearch-occur
+  Typing @kbd{M-s o} in incremental search invokes
address@hidden, which runs @code{occur} with the current search
+string.  @xref{Other Repeating Search, occur}.
+
 @kindex M-% @r{(Incremental search)}
   Typing @kbd{M-%} in incremental search invokes @code{query-replace}
 or @code{query-replace-regexp} (depending on search mode) with the
@@ -302,83 +396,72 @@ prefix argument means to replace backward.  @xref{Query 
Replace}.
 @kindex M-TAB @r{(Incremental search)}
   Typing @address@hidden in incremental search invokes
 @code{isearch-complete}, which attempts to complete the search string
-using the search ring as a list of completion alternatives.
address@hidden  In many operating systems, the @address@hidden
-key sequence is captured by the window manager; you then need to
-rebind @code{isearch-complete} to another key sequence if you want to
-use it (@pxref{Rebinding}).
-
+using the search ring (the previous search strings you used) as a list
+of completion alternatives.  @xref{Completion}.  In many operating
+systems, the @address@hidden key sequence is captured by the window
+manager; you then need to rebind @code{isearch-complete} to another
+key sequence if you want to use it (@pxref{Rebinding}).
+
address@hidden M-s h r @r{(Incremental Search)}
address@hidden isearch-highlight-regexp
+  You can exit the search while leaving the matches for the last
+search string highlighted on display.  To this end, type @kbd{M-s h r}
+(@code{isearch-highlight-regexp}), which will run
address@hidden (@pxref{Highlight Interactively}) passing
+it the regexp derived from the last search string and prompting you
+for the face to use for highlighting.  To remove the highlighting,
+type @kbd{M-s h u} (@code{unhighlight-regexp}).
+
address@hidden incremental search, help on special keys
address@hidden C-h C-h @r{(Incremental Search)}
address@hidden isearch-help-map
 @vindex isearch-mode-map
-  When incremental search is active, you can type @kbd{C-h C-h} to
-access interactive help options, including a list of special key
-bindings.  These key bindings are part of the keymap
address@hidden (@pxref{Keymaps}).
-
address@hidden Isearch Yank
address@hidden Isearch Yanking
-
address@hidden C-y @r{(Incremental search)}
address@hidden M-y @r{(Incremental search)}
address@hidden isearch-yank-kill
address@hidden isearch-yank-pop
-  Within incremental search, @kbd{C-y} (@code{isearch-yank-kill})
-appends the current kill to the search string.  @kbd{M-y}
-(@code{isearch-yank-pop}), if called after @kbd{C-y}, replaces that
-appended text with an earlier kill, similar to the usual @kbd{M-y}
-(@code{yank-pop}) command (@pxref{Yanking}).  @kbd{Mouse-2} appends
-the current X selection (@pxref{Primary Selection}).
-
address@hidden C-w @r{(Incremental search)}
address@hidden isearch-yank-word-or-char
-  @kbd{C-w} (@code{isearch-yank-word-or-char}) appends the next
-character or word at point to the search string.  This is an easy way
-to search for another occurrence of the text at point.  (The decision
-of whether to copy a character or a word is heuristic.)
-
address@hidden M-s C-e @r{(Incremental search)}
address@hidden isearch-yank-line
-  Similarly, @kbd{M-s C-e} (@code{isearch-yank-line}) appends the rest
-of the current line to the search string.  If point is already at the
-end of a line, it appends the next line.  With a prefix argument
address@hidden, it appends the next @var{n} lines.
-
-  If the search is currently case-insensitive, both @kbd{C-w} and
address@hidden C-e} convert the text they copy to lower case, so that the
-search remains case-insensitive.
-
address@hidden C-M-w @r{(Incremental search)}
address@hidden C-M-y @r{(Incremental search)}
address@hidden isearch-del-char
address@hidden isearch-yank-char
-  @kbd{C-M-w} (@code{isearch-del-char}) deletes the last character
-from the search string, and @kbd{C-M-y} (@code{isearch-yank-char})
-appends the character after point to the search string.  An
-alternative method to add the character after point is to enter the
-minibuffer with @kbd{M-e} (@pxref{Repeat Isearch}) and type @kbd{C-f}
-at the end of the search string in the minibuffer.
+  When incremental search is active, you can type @kbd{C-h C-h}
+(@code{isearch-help-map}) to access interactive help options,
+including a list of special key bindings.  These key bindings are part
+of the keymap @code{isearch-mode-map} (@pxref{Keymaps}).
 
 @node Not Exiting Isearch
 @subsection Not Exiting Incremental Search
 
-This subsection describes two categories of commands which you can
-type without exiting the current incremental search, even though they
-are not themselves part of incremental search.
+This subsection describes how to control whether typing a command not
+specifically meaningful is searches exits the search before executing
+the command.  It also describes two categories of commands which you
+can type without exiting the current incremental search, even though
+they are not themselves part of incremental search.
+
address@hidden search-exit-option
+  Normally, typing a command that is not bound by the incremental
+search exits the search before executing the command.  Thus, the
+command operates on the buffer from which you invoked the search.
+However, if you customize the variable @code{search-exit-option} to
address@hidden, the characters which you type that are not interpreted by
+the incremental search are simply appended to the search string.  This
+is so you could include in the search string control characters, such
+as @kbd{C-a}, that would normally exit the search and invoke the
+command bound to them on the buffer.
 
 @table @asis
 @item Prefix Arguments
address@hidden prefix argument commands, during incremental search
 @vindex isearch-allow-prefix
-  In incremental search, when you enter a prefix argument
-(@pxref{Arguments}), by default it will apply either to the next
-action in the search or to the command that exits the search.
+  In incremental search, when you type a command that specifies a
+prefix argument (@pxref{Arguments}), by default it will apply either
+to the next action in the search or to the command that exits the
+search.  In other words, entering a prefix argument will not by itself
+terminate the search.
 
   In previous versions of Emacs, entering a prefix argument always
 terminated the search.  You can revert to this behavior by setting the
 variable @code{isearch-allow-prefix} to @code{nil}.
 
   When @code{isearch-allow-scroll} is address@hidden (see below),
-prefix arguments always have the default behavior described above.
+prefix arguments always have the default behavior described above,
+i.e., they don't terminate the search, even if
address@hidden is @code{nil}.
 
 @item Scrolling Commands
address@hidden scrolling commands, during incremental search
 @vindex isearch-allow-scroll
   Normally, scrolling commands exit incremental search.  If you change
 the variable @code{isearch-allow-scroll} to a address@hidden value,
@@ -390,12 +473,14 @@ prefix arguments to these commands in the usual way.  
This feature
 won't let you scroll the current match out of visibility, however.
 
   The @code{isearch-allow-scroll} feature also affects some other
-commands, such as @kbd{C-x 2} (@code{split-window-below}) and @kbd{C-x
-^} (@code{enlarge-window}), which don't exactly scroll but do affect
-where the text appears on the screen.  It applies to any command whose
-name has a address@hidden @code{isearch-scroll} property.  So you can
-control which commands are affected by changing these properties.
-
+commands, such as @kbd{C-x 2} (@code{split-window-below}) and
address@hidden ^} (@code{enlarge-window}), which don't exactly scroll but do
+affect where the text appears on the screen.  It applies to any
+command whose name has a address@hidden @code{isearch-scroll}
+property.  So you can control which commands are affected by changing
+these properties.
+
address@hidden prevent commands from exiting incremental search
   For example, to make @kbd{C-h l} usable within an incremental search
 in all future Emacs sessions, use @kbd{C-h c} to find what command it
 runs (@pxref{Key Help}), which is @code{view-lossage}.  Then you can
@@ -409,7 +494,8 @@ put the following line in your init file (@pxref{Init 
File}):
 This feature can be applied to any command that doesn't permanently
 change point, the buffer contents, the match data, the current buffer,
 or the selected window and frame.  The command must not itself attempt
-an incremental search.
+an incremental search.  This feature is disabled if
address@hidden is @code{nil} (which it is by default).
 @end table
 
 @node Isearch Minibuffer
@@ -455,14 +541,22 @@ This enters the minibuffer to read the search string; 
terminate the
 string with @key{RET}, and then the search takes place.  If the string
 is not found, the search command signals an error.
 
address@hidden search-forward
address@hidden search-backward
   When you type @kbd{C-s @key{RET}}, the @kbd{C-s} invokes incremental
 search as usual.  That command is specially programmed to invoke the
-command for nonincremental search, @code{search-forward}, if the
-string you specify is empty.  (Such an empty argument would otherwise
-be useless.)  @kbd{C-r @key{RET}} does likewise, invoking the command
address@hidden
+command for nonincremental search, if the string you specify is empty.
+(Such an empty argument would otherwise be useless.)  @kbd{C-r
address@hidden does likewise, invoking the nonincremental
+backward-searching command.
+
+  Nonincremental search can also be invoked form the menu bar's
address@hidden>Search} menu.
+
address@hidden search-forward
address@hidden search-backward
+  You can also use two simpler commands, @kbd{M-x search-forward} and
address@hidden search-backward}.  These commands look for the literal
+strings you specify, and don't support any of the lax-search features
+(@pxref{Lax Search}) except case folding.
 
 @node Word Search
 @section Word Search
@@ -475,11 +569,13 @@ search matches any sequence of those two words separated 
by one or
 more spaces, newlines, or other punctuation characters.  This is
 particularly useful for searching text documents, because you don't
 have to worry whether the words you are looking for are separated by
-newlines or spaces.
+newlines or spaces.  Note that major modes for programming languages
+or other specialized modes can modify the definition of a word to suit
+their syntactic needs.
 
 @table @kbd
 @item M-s w
-If incremental search is active, toggle word search mode
+  If incremental search is active, toggle word search mode
 (@code{isearch-toggle-word}); otherwise, begin an incremental forward
 word search (@code{isearch-forward-word}).
 @item M-s w @key{RET} @var{words} @key{RET}
@@ -514,6 +610,18 @@ so that the matching can proceed incrementally as you 
type.  This
 additional laxity does not apply to the lazy highlight
 (@pxref{Incremental Search}), which always matches whole words.
 
+  The word search commands don't perform character folding, and
+toggling lax whitespace matching (@pxref{Lax Search, lax space
+matching}) has no effect on them.
+
address@hidden M-s M-w
address@hidden eww-search-word
address@hidden eww-search-prefix
+  Search the Web for the text in region.  This command performs an
+Internet search for the words in region using the search engine whose
address@hidden is specified by the variable @code{eww-search-prefix}.
address@hidden, EWW, , eww, The Emacs Web Wowser Manual}.
+
 @node Symbol Search
 @section Symbol Search
 @cindex symbol search
@@ -529,6 +637,7 @@ searching source code.
 
 @table @kbd
 @item M-s _
address@hidden isearch-toggle-symbol
 If incremental search is active, toggle symbol search mode
 (@code{isearch-toggle-symbol}); otherwise, begin an incremental
 forward symbol search (@code{isearch-forward-symbol}).
@@ -561,6 +670,10 @@ search.  In nonincremental symbol searches, the beginning 
and end of
 the search string are required to match the beginning and end of a
 symbol, respectively.
 
+  The symbol search commands don't perform character folding, and
+toggling lax whitespace matching (@pxref{Lax Search, lax space
+matching}) has no effect on them.
+
 @node Regexp Search
 @section Regular Expression Search
 @cindex regexp search
@@ -595,22 +708,31 @@ for.  To search backward for a regexp, use @kbd{C-M-r}
 (@code{isearch-backward-regexp}), @kbd{C-r} with a prefix argument,
 or @kbd{M-r} within a backward incremental search.
 
address@hidden regexp-search-ring-max
   All of the special key sequences in an ordinary incremental search
-do similar things in an incremental regexp search.  For instance,
-typing @kbd{C-s} immediately after starting the search retrieves the
-last incremental search regexp used and searches forward for it.
-Incremental regexp and non-regexp searches have independent defaults.
-They also have separate search rings, which you can access with
address@hidden and @kbd{M-n}.
+(@pxref{Special Isearch}) do similar things in an incremental regexp
+search.  For instance, typing @kbd{C-s} immediately after starting the
+search retrieves the last incremental search regexp used and searches
+forward for it.  Incremental regexp and non-regexp searches have
+independent defaults.  They also have separate search rings, which you
+can access with @kbd{M-p} and @kbd{M-n}.  The maximum number of search
+regexps saved in the search ring is determined by the value of
address@hidden, 16 by default.
 
   Unlike ordinary incremental search, incremental regexp search
-do not use lax space matching by default.  To toggle this feature
+does not use lax space matching by default.  To toggle this feature
 use @kbd{M-s @key{SPC}} (@code{isearch-toggle-lax-whitespace}).
 Then any @key{SPC} typed in incremental regexp search will match
 any sequence of one or more whitespace characters.  The variable
 @code{search-whitespace-regexp} specifies the regexp for the lax
 space matching.  @xref{Special Isearch}.
 
+  Also unlike ordinary incremental search, incremental regexp search
+cannot use character folding (@pxref{Lax Search}).  (If you toggle
+character folding during incremental regexp search with @kbd{M-s '},
+the search becomes a non-regexp search and the search pattern you
+typed is interpreted as a literal string.)
+
   In some cases, adding characters to the regexp in an incremental
 regexp search can make the cursor move back and start again.  For
 example, if you have searched for @samp{foo} and you add @samp{\|bar},
@@ -629,7 +751,10 @@ starting position.  These search methods are not mirror 
images.
   Nonincremental search for a regexp is done with the commands
 @code{re-search-forward} and @code{re-search-backward}.  You can
 invoke these with @kbd{M-x}, or by way of incremental regexp search
-with @kbd{C-M-s @key{RET}} and @kbd{C-M-r @key{RET}}.
+with @kbd{C-M-s @key{RET}} and @kbd{C-M-r @key{RET}}.  When you invoke
+these commands with @kbd{M-x}, they search for the exact regexp you
+specify, and thus don't support any lax-search features (@pxref{Lax
+Search}) except case folding.
 
   If you use the incremental regexp search commands with a prefix
 argument, they perform ordinary string search, like
@@ -1030,21 +1155,67 @@ This contains two parts in succession: a character set 
matching
 period, @samp{?}, or @samp{!}, and a character set matching
 close-brackets, quotes, or parentheses, repeated zero or more times.
 
address@hidden Search Case
address@hidden Searching and Case
address@hidden Lax Search
address@hidden Lax Matching During Searching
 
-  Searches in Emacs normally ignore the case of the text they are
-searching through, if you specify the text in lower case.  Thus, if
-you specify searching for @samp{foo}, then @samp{Foo} and @samp{foo}
-also match.  Regexps, and in particular character sets, behave
-likewise: @samp{[ab]} matches @samp{a} or @samp{A} or @samp{b} or
address@hidden
address@hidden lax search
address@hidden character equivalence in search
+  Normally, you'd want search commands to disregard certain minor
+differences between the search string you type and the text being
+searched.  For example, sequences of whitespace characters of
+different length are usually perceived as equivalent; letter-case
+differences usually don't matter; etc.  This is known as
address@hidden equivalence}.
 
-  An upper-case letter anywhere in the incremental search string makes
-the search case-sensitive.  Thus, searching for @samp{Foo} does not find
address@hidden or @samp{FOO}.  This applies to regular expression search as
-well as to string search.  The effect ceases if you delete the
-upper-case letter from the search string.
+  This section describes the Emacs lax search features, and how to
+tailor them to your needs.
+
address@hidden lax space matching in search
address@hidden M-s SPC @r{(Incremental search)}
address@hidden SPC @r{(Incremental search)}
address@hidden isearch-toggle-lax-whitespace
address@hidden search-whitespace-regexp
+  By default, search commands perform @dfn{lax space matching}:
+each space, or sequence of spaces, matches any sequence of one or more
+whitespace characters in the text.  (Incremental regexp search has a
+separate default; see @ref{Regexp Search}.)  Hence, @samp{foo bar}
+matches @samp{foo bar}, @address@hidden  }bar}, @address@hidden   }bar}, and
+so on (but not @samp{foobar}).  More precisely, Emacs matches each
+sequence of space characters in the search string to a regular
+expression specified by the variable @code{search-whitespace-regexp}.
+For example, to make spaces match sequences of newlines as well as
+spaces, set it to @samp{"[[:space:]\n]+"}.  The default value of this
+variable depends on the buffer's major mode; most major modes classify
+spaces, tabs, and formfeed characters as whitespace.
+
+  If you want whitespace characters to match exactly, you can turn lax
+space matching off by typing @kbd{M-s @key{SPC}}
+(@code{isearch-toggle-lax-whitespace}) within an incremental search.
+Another @kbd{M-s @key{SPC}} turns lax space matching back on.  To
+disable lax whitespace matching for all searches, change
address@hidden to @code{nil}; then each space in the
+search string matches exactly one space.
+
address@hidden case folding in search
address@hidden case-sensitivity and search
+  Searches in Emacs by default ignore the case of the text they are
+searching through, if you specify the search string in lower case.
+Thus, if you specify searching for @samp{foo}, then @samp{Foo} and
address@hidden also match.  Regexps, and in particular character sets,
+behave likewise: @samp{[ab]} matches @samp{a} or @samp{A} or @samp{b}
+or @samp{B}.  This feature is known as @dfn{case folding}, and it is
+supported in both incremental and non-incremental search modes.
+
address@hidden search-upper-case
+  An upper-case letter anywhere in the search string makes the search
+case-sensitive.  Thus, searching for @samp{Foo} does not find
address@hidden or @samp{FOO}.  This applies to regular expression search
+as well as to literal string search.  The effect ceases if you delete
+the upper-case letter from the search string.  The variable
address@hidden controls this: if it is address@hidden (the
+default), an upper-case character in the search string make the search
+case-sensitive; setting it to @code{nil} disables this effect of
+upper-case characters.
 
 @vindex case-fold-search
   If you set the variable @code{case-fold-search} to @code{nil}, then
@@ -1055,12 +1226,14 @@ This variable applies to nonincremental searches also, 
including those
 performed by the replace commands (@pxref{Replace}) and the minibuffer
 history matching commands (@pxref{Minibuffer History}).
 
address@hidden isearch-toggle-case-fold
-  Typing @kbd{M-c} within an incremental search toggles the case
-sensitivity of that search.  The effect does not extend beyond the
-current incremental search to the next one, but it does override the
-effect of adding or removing an upper-case letter in the current
-search.
address@hidden M-c @r{(Incremental search)}
address@hidden M-s c @r{(Incremental search)}
address@hidden isearch-toggle-case-fold
+  Typing @kbd{M-c} or @kbd{M-s c} (@code{isearch-toggle-case-fold})
+within an incremental search toggles the case sensitivity of that
+search.  The effect does not extend beyond the current incremental
+search, but it does override the effect of adding or removing an
+upper-case letter in the current search.
 
   Several related variables control case-sensitivity of searching and
 matching for specific commands or activities.  For instance,
@@ -1068,6 +1241,45 @@ matching for specific commands or activities.  For 
instance,
 @code{find-tag}.  To find these variables, do @kbd{M-x
 apropos-variable @key{RET} case-fold-search @key{RET}}.
 
address@hidden character folding in search
address@hidden equivalent character sequences
+  Case folding disregards case distinctions among characters, making
+upper-case characters match lower-case variants, and vice versa.  A
+generalization of case folding is @dfn{character folding}, which
+disregards wider classes of distinctions among similar characters.
+For instance, under character folding the letter @code{a} matches all
+of its accented cousins like @code{@"a} and @code{@'a}, i.e., the
+match disregards the diacritics that distinguish these
+variants.  In addition, @code{a} matches other characters that
+resemble it, or have it as part of their graphical representation,
+such as @sc{u+249c parenthesized latin small letter a} and @sc{u+2100
+account of} (which looks like a small @code{a} over @code{c}).
+Similarly, the @acronym{ASCII} double-quote character @code{"} matches
+all the other variants of double quotes defined by the Unicode
+standard.  Finally, character folding can make a sequence of one or
+more characters match another sequence of a different length: for
+example, the sequence of two characters @code{ff} matches @sc{u+fb00
+latin small ligature ff}.  Character sequences that are not identical,
+but match under character folding are known as @dfn{equivalent
+character sequences}.
+
address@hidden M-s ' @r{(Incremental Search)}
address@hidden isearch-toggle-character-fold
+  Generally, search commands in Emacs by default perform character
+folding, thus matching equivalent character sequences.  You can
+disable this behavior by customizing the variable
address@hidden to @code{nil}.  @xref{Search
+Customizations}.  Within an incremental search, typing @kbd{M-s '}
+(@code{isearch-toggle-character-fold}) toggles character folding, but
+only for that search.  (Replace commands have a different default,
+controlled by a separate option; see @ref{Replacement and Lax
+Matches}.)
+
+  Like with case folding, typing an explicit variant of a character,
+such as @code{@"a}, as part of the search string disables character
+folding for that search.  If you delete such a character from the
+search string, this effect ceases.
+
 @node Replace
 @section Replacement Commands
 @cindex replacement
@@ -1078,7 +1290,8 @@ apropos-variable @key{RET} case-fold-search @key{RET}}.
   Emacs provides several commands for performing search-and-replace
 operations.  In addition to the simple @kbd{M-x replace-string}
 command, there is @kbd{M-%} (@code{query-replace}), which presents
-each occurrence of the pattern and asks you whether to replace it.
+each occurrence of the search pattern and asks you whether to replace
+it.
 
   The replace commands normally operate on the text from point to the
 end of the buffer.  When the region is active, they operate on it
@@ -1087,17 +1300,11 @@ instead (@pxref{Mark}).  The basic replace commands 
replace one
 is possible to perform several replacements in parallel, using the
 command @code{expand-region-abbrevs} (@pxref{Expanding Abbrevs}).
 
address@hidden replace-lax-whitespace
-  Unlike incremental search, the replacement commands do not use lax
-space matching (@pxref{Special Isearch}) by default.  To enable lax
-space matching for replacement, change the variable
address@hidden to @code{t}.  (This only affects how
-Emacs finds the text to replace, not the replacement text.)
-
 @menu
 * Unconditional Replace::   Replacing all matches for a string.
 * Regexp Replace::          Replacing all matches for a regexp.
-* Replacement and Case::    How replacements preserve case of letters.
+* Replacement and Lax Matches::
+                            Lax searching for text to replace.
 * Query Replace::           How to use querying.
 @end menu
 
@@ -1128,8 +1335,8 @@ activating the mark; use @kbd{C-u address@hidden to move 
back there.
   A prefix argument restricts replacement to matches that are
 surrounded by word boundaries.
 
-  @xref{Replacement and Case}, for details about case-sensitivity in
-replace commands.
+  @xref{Replacement and Lax Matches}, for details about
+case-sensitivity in replace commands.
 
 @node Regexp Replace
 @subsection Regexp Replacement
@@ -1137,7 +1344,7 @@ replace commands.
 
   The @kbd{M-x replace-string} command replaces exact matches for a
 single string.  The similar command @kbd{M-x replace-regexp} replaces
-any match for a specified pattern.
+any match for a specified regular expression pattern (@pxref{Regexps}).
 
 @table @kbd
 @item M-x replace-regexp @key{RET} @var{regexp} @key{RET} @var{newstring} 
@key{RET}
@@ -1218,9 +1425,28 @@ M-x replace-regexp @key{RET} 
address@hidden,address@hidden @key{RET}
 \,(format "%-72sABC%05d" \& \#) @key{RET}
 @end example
 
address@hidden Replacement and Case
address@hidden Replace Commands and Case
address@hidden Replacement and Lax Matches
address@hidden Replace Commands and Lax Matches
+
+  This subsection describes the behavior of replace commands with
+respect to lax matches (@pxref{Lax Search}) and how to customize it.
+In general, replace commands mostly default to stricter matching than
+their search counterparts.
 
address@hidden lax space matching in replace commands
address@hidden replace-lax-whitespace
+  Unlike incremental search, the replacement commands do not use lax
+space matching (@pxref{Lax Search, lax space matching}) by default.
+To enable lax space matching for replacement, change the variable
address@hidden to address@hidden  (This only affects
+how Emacs finds the text to replace, not the replacement text.)
+
address@hidden replace-regexp-lax-whitespace
+  A companion variable @code{replace-regexp-lax-whitespace} controls
+whether @code{query-replace-regexp} uses lax whitespace matching when
+searching for patterns.
+
address@hidden case folding in replace commands
   If the first argument of a replace command is all lower case, the
 command ignores case while searching for occurrences to
 replace---provided @code{case-fold-search} is address@hidden  If
@@ -1250,6 +1476,15 @@ exactly as given, with no case conversion.  Likewise, if 
either
 @code{case-replace} or @code{case-fold-search} is set to @code{nil},
 replacement is done without case conversion.
 
address@hidden character folding in replace commands
+  The replacement commands by default do not use character folding
+(@pxref{Lax Search, character folding}) when looking for the text to
+replace.  To enable character folding for matching in
address@hidden and @code{replace-string}, set the variable
address@hidden to a address@hidden value.  (This
+setting does not affect the replacement text, only how Emacs finds the
+text to replace.  It also doesn't affect @code{replace-regexp}.)
+
 @node Query Replace
 @subsection Query Replace
 @cindex query replace
@@ -1270,9 +1505,9 @@ occurrence and asks you whether to replace it.  Aside 
from querying,
 @code{query-replace} works just like @code{replace-string}
 (@pxref{Unconditional Replace}).  In particular, it preserves case
 provided @code{case-replace} is address@hidden, as it normally is
-(@pxref{Replacement and Case}).  A numeric argument means to consider
-only occurrences that are bounded by word-delimiter characters.  A
-negative prefix argument replaces backward.
+(@pxref{Replacement and Lax Matches}).  A numeric argument means to
+consider only occurrences that are bounded by word-delimiter
+characters.  A negative prefix argument replaces backward.
 
 @kindex C-M-%
 @findex query-replace-regexp
@@ -1280,18 +1515,38 @@ negative prefix argument replaces backward.
 It works like @code{replace-regexp} except that it queries
 like @code{query-replace}.
 
address@hidden query-replace-from-to-separator
+  You can reuse earlier replacements with these commands.  When
address@hidden or @code{query-replace-regexp} prompts for the
+search string, use @kbd{M-p} and @kbd{M-n} to show previous
+replacements in the form @address@hidden -> @var{to}}, where
address@hidden is the search pattern, @var{to} is its replacement, and the
+separator between them is determined by the value of the variable
address@hidden  Type @key{RET} to select the
+desired replacement.
+
 @cindex faces for highlighting query replace
 @cindex query-replace face
address@hidden lazy-highlight face
address@hidden lazy-highlight face, in replace
address@hidden query-replace-highlight
address@hidden query-replace-lazy-highlight
address@hidden query-replace-show-replacement
   These commands highlight the current match using the face
address@hidden  They highlight other matches using
address@hidden just like incremental search (@pxref{Incremental
-Search}).  By default, @code{query-replace-regexp} will show the
-substituted replacement string for the current match in the
-minibuffer.  If you want to keep special sequences @samp{\&} and
address@hidden@var{n}} unexpanded, customize
address@hidden  You can disable this highlight by setting the
+variable @code{query-replace-highlight} to @code{nil}.  They highlight
+other matches using @code{lazy-highlight} just like incremental search
+(@pxref{Incremental Search}); this can be disabled by setting
address@hidden to @code{nil}.  By default,
address@hidden will show the substituted replacement
+string for the current match in the minibuffer.  If you want to keep
+special sequences @samp{\&} and @address@hidden unexpanded, customize
 @code{query-replace-show-replacement} variable.
 
address@hidden query-replace-skip-read-only
+  The variable @code{query-replace-skip-read-only}, if set
address@hidden, will cause replacement commands to ignore matches in
+read-only text.  The default is not to ignore them.
+
   The characters you can type when you are shown a match for the string
 or regexp are:
 
@@ -1311,9 +1566,13 @@ or regexp are:
 @c WideCommands
 @table @kbd
 @item @key{SPC}
address@hidden y
 to replace the occurrence with @var{newstring}.
 
 @item @key{DEL}
address@hidden @key{Delete}
address@hidden @key{BACKSPACE}
address@hidden n
 to skip to the next occurrence without replacing this one.
 
 @item , @r{(Comma)}
@@ -1329,6 +1588,7 @@ must use @kbd{C-x @key{ESC} @key{ESC} @key{RET}} to 
restart
 (@pxref{Repetition}).
 
 @item @key{RET}
address@hidden q
 to exit without doing any more replacements.
 
 @item .@: @r{(Period)}
@@ -1338,19 +1598,6 @@ occurrences.
 @item !
 to replace all remaining occurrences without asking again.
 
address@hidden Y @r{(Upper-case)}
-to replace all remaining occurrences in all remaining buffers in
-multi-buffer replacements (like the Dired @key{Q} command that performs
-query replace on selected files).  It answers this question and all
-subsequent questions in the series with ``yes'', without further
-user interaction.
-
address@hidden N @r{(Upper-case)}
-to skip to the next buffer in multi-buffer replacements without
-replacing remaining occurrences in the current buffer.  It answers
-this question ``no'', gives up on the questions for the current buffer,
-and continues to the next buffer in the sequence.
-
 @item ^
 to go back to the position of the previous occurrence (or what used to
 be an occurrence), in case you changed it by mistake or want to
@@ -1378,19 +1625,30 @@ replacement string for any further occurrences.
 to redisplay the screen.  Then you must type another character to
 specify what to do with this occurrence.
 
address@hidden Y @r{(Upper-case)}
+to replace all remaining occurrences in all remaining buffers in
+multi-buffer replacements (like the Dired @key{Q} command that performs
+query replace on selected files).  It answers this question and all
+subsequent questions in the series with ``yes'', without further
+user interaction.
+
address@hidden N @r{(Upper-case)}
+to skip to the next buffer in multi-buffer replacements without
+replacing remaining occurrences in the current buffer.  It answers
+this question ``no'', gives up on the questions for the current buffer,
+and continues to the next buffer in the sequence.
+
 @item C-h
address@hidden ?
address@hidden @key{F1}
 to display a message summarizing these options.  Then you must type
 another character to specify what to do with this occurrence.
 @end table
 
-  Some other characters are aliases for the ones listed above: @kbd{y},
address@hidden and @kbd{q} are equivalent to @key{SPC}, @key{DEL} and
address@hidden
-
   Aside from this, any other character exits the @code{query-replace},
 and is then reread as part of a key sequence.  Thus, if you type
 @kbd{C-k}, it exits the @code{query-replace} and then kills to end of
-line.
+line.  In particular, @kbd{C-g} simply exits the @code{query-replace}.
 
   To restart a @code{query-replace} once it is exited, use @kbd{C-x
 @key{ESC} @key{ESC}}, which repeats the @code{query-replace} because it
@@ -1454,12 +1712,17 @@ a multi-file incremental search is activated 
automatically.
 
 @cindex Occur mode
 @cindex mode, Occur
address@hidden match (face name)
address@hidden list-matching-lines-default-context-lines
 @item M-x occur
 Prompt for a regexp, and display a list showing each line in the
-buffer that contains a match for it.  To limit the search to part of
-the buffer, narrow to that part (@pxref{Narrowing}).  A numeric
+buffer that contains a match for it.  The text that matched is
+highlighted using the @code{match} face.  To limit the search to part
+of the buffer, narrow to that part (@pxref{Narrowing}).  A numeric
 argument @var{n} specifies that @var{n} lines of context are to be
-displayed before and after each matching line.
+displayed before and after each matching line.  The default number of
+context lines is specified by the variable
address@hidden
 
 @kindex RET @r{(Occur mode)}
 @kindex o @r{(Occur mode)}
@@ -1526,3 +1789,89 @@ it never deletes lines that are only partially contained 
in the region
 
 If a match is split across lines, this command keeps all those lines.
 @end table
+
address@hidden Search Customizations
address@hidden Tailoring Search to Your Needs
address@hidden search customizations
+
+  This section describes miscellaneous search-related customizations
+not described elsewhere.
+
address@hidden default search mode
address@hidden search mode, default
+  The default search mode for the incremental search is specified by
+the variable @code{search-default-regexp-mode}.  It can be @code{nil},
address@hidden, or a function.  If it is @code{nil}, the default mode is to
+do literal searches without character folding, but with case folding
+and lax-whitespace matches as determined by @code{case-fold-search}
+and @code{search-whitespace-regexp}, respectively (@pxref{Lax
+Search}).  If the value is @code{t}, incremental search defaults to
+regexp searches.  The default value specifies a function that causes
+the default search mode to perform character folding in addition to
+case folding and lax-whitespace matching.
+
address@hidden search-highlight
+  The current match of an on-going incremental search is highlighted
+using the @code{isearch} face.  This highlighting can be disabled by
+setting the variable @code{search-highlight} to @code{nil}.
+
address@hidden lazy highlighting customizations
address@hidden isearch-lazy-highlight
address@hidden lazy-highlight face
+  The other matches for the search string that are visible on display
+are highlighted using the @code{lazy-highlight} face.  Setting the
+variable @code{isearch-lazy-highlight} to @code{nil} disables this
+highlighting.  Here are some other variables that customize the lazy
+highlighting:
+
address@hidden @code
address@hidden lazy-highlight-initial-delay
+Time in seconds to wait before highlighting visible matches.
+
address@hidden lazy-highlight-interval
+Time in seconds between highlighting successive matches.
+
address@hidden lazy-highlight-max-at-a-time
+The maximum number of matches to highlight before checking for input.
+A large number can take some time to highlight, so if you want to
+continue searching and type @kbd{C-s} or @kbd{C-r} during that time,
+Emacs will not respond until it finishes highlighting all those
+matches.  Thus, smaller values make Emacs more responsive.
address@hidden table
+
address@hidden search-nonincremental-instead
+  Normally, entering @key{RET} within incremental search when the
+search string is empty launches a nonincremental search.  (Actually,
+it lets you edit the search string, and the next @key{RET} does the
+search.)  However, if you customize the variable
address@hidden to @code{nil}, typing @key{RET}
+will always exit the incremental search, even if the search string is
+empty.
+
address@hidden isearch-hide-immediately
+  By default, incremental search and query-replace commands match
+invisible text, but hide any such matches as soon as the current match
+moves off the invisible text.  If you customize the variable
address@hidden to @code{nil}, any invisible text
+where matches were found stays on display until the search or the
+replace command exits.
+
address@hidden search display on slow terminals
address@hidden search-slow-speed
address@hidden search-slow-window-lines
+  Searching incrementally on slow terminals, such as displays
+connected to remote machines over slow connection, could be annoying
+due to the need to redraw large portions of the display as the search
+proceeds.  Emacs provides a special display mode for slow terminals,
+whereby search pops up a separate small window and displays the text
+surrounding the match in that window.  Small windows display faster,
+so the annoying effect of slow speed is alleviated.  The variable
address@hidden determines the baud rate threshold below
+which Emacs will use this display mode.  The variable
address@hidden controls the number of lines in the
+window Emacs pops up for displaying the search results; the default is
+1 line.  Normally, this window will pop up at the bottom of the window
+that displays the buffer where you start searching, bit if the value
+of @code{search-slow-window-lines} is negative, that means to put the
+window at the top and give it the number of lines that is the absolute
+value of that value.
diff --git a/doc/emacs/trouble.texi b/doc/emacs/trouble.texi
index 087681b..4286cfe 100644
--- a/doc/emacs/trouble.texi
+++ b/doc/emacs/trouble.texi
@@ -1065,7 +1065,7 @@ send it to the developers.  Sending it to
 recommended, because that list is coupled to a tracking system that
 makes it easier to locate patches.  If your patch is not complete and
 you think it needs more discussion, you might want to send it to
address@hidden@@gnu@@gnu.org} instead.  If you revise your patch,
address@hidden@@gnu.org} instead.  If you revise your patch,
 send it as a followup to the initial topic.
 
 We prefer to get the patches as plain text, either inline (be careful
diff --git a/doc/lispref/buffers.texi b/doc/lispref/buffers.texi
index 45a21c8..55fa5bc 100644
--- a/doc/lispref/buffers.texi
+++ b/doc/lispref/buffers.texi
@@ -716,7 +716,9 @@ The special commands of these modes bind 
@code{buffer-read-only} to
 
 @defvar buffer-read-only
 This buffer-local variable specifies whether the buffer is read-only.
-The buffer is read-only if this variable is address@hidden
+The buffer is read-only if this variable is address@hidden  However,
+characters that have the @code{inhibit-read-only} text property can
+still be modified.  @xref{Special Properties, inhibit-read-only}.
 @end defvar
 
 @defvar inhibit-read-only
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index ad248b1..d1ac85a 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -330,7 +330,7 @@ support them, then @code{message-box} uses the echo area, 
like
 @code{message}.
 @end defun
 
address@hidden display-message-or-buffer message &optional buffer-name 
not-this-window frame
address@hidden display-message-or-buffer message &optional buffer-name action 
frame
 This function displays the message @var{message}, which may be either a
 string or a buffer.  If it is shorter than the maximum height of the
 echo area, as defined by @code{max-mini-window-height}, it is displayed
@@ -346,7 +346,7 @@ pop-up buffer is used, defaulting to @file{*Message*}.  In 
the case
 where @var{message} is a string and displayed in the echo area, it is
 not specified whether the contents are inserted into the buffer anyway.
 
-The optional arguments @var{not-this-window} and @var{frame} are as for
+The optional arguments @var{action} and @var{frame} are as for
 @code{display-buffer}, and only used if a buffer is displayed.
 @end defun
 
@@ -1889,12 +1889,13 @@ end of the result if it falls short of @var{width}.  It 
is also used at
 the beginning of the result if one multi-column character in
 @var{string} extends across the column @var{start-column}.
 
address@hidden truncate-string-ellipsis
 If @var{ellipsis} is address@hidden, it should be a string which will
 replace the end of @var{string} (including any padding) if it extends
 beyond @var{width}, unless the display width of @var{string} is equal
 to or less than the display width of @var{ellipsis}.  If
 @var{ellipsis} is address@hidden and not a string, it stands for
address@hidden"..."}.
+the value of the variable @code{truncate-string-ellipsis}.
 
 @example
 (truncate-string-to-width "\tab\t" 12 4)
@@ -3659,6 +3660,39 @@ tag (or @code{nil}, which stands for the default 
langsys), and each
 @end table
 @end defun
 
address@hidden font information for layout
+The following four functions return size information about fonts used
+by various faces, allowing various layout considerations in Lisp
+programs.  These functions take face remapping into consideration,
+returning information about the remapped face, if the face in question
+was remapped.  @xref{Face Remapping}.
+
address@hidden default-font-width
+This function returns the average width in pixels of the font used by
+the current buffer's default face.
address@hidden defun
+
address@hidden default-font-height
+This function returns the height in pixels of the font used by the
+current buffer's default face.
address@hidden defun
+
address@hidden window-font-width &optional window face
+This function returns the average width in pixels for the font used by
address@hidden in @var{window}.  The specified @var{window} must be a live
+window.  If @code{nil} or omitted, @var{window} defaults to the
+selected window, and @var{face} defaults to the default face in
address@hidden
address@hidden defun
+
address@hidden window-font-height &optional window face
+This function returns the height in pixels for the font used by
address@hidden in @var{window}.  The specified @var{window} must be a live
+window.  If @code{nil} or omitted, @var{window} defaults to the
+selected window, and @var{face} defaults to the default face in
address@hidden
address@hidden defun
+
 @node Fringes
 @section Fringes
 @cindex fringes
diff --git a/doc/lispref/elisp.texi b/doc/lispref/elisp.texi
index 2d3548f..56d303e 100644
--- a/doc/lispref/elisp.texi
+++ b/doc/lispref/elisp.texi
@@ -467,6 +467,10 @@ Control Structures
 * Generators::              Generic sequences and coroutines.
 * Nonlocal Exits::          Jumping out of a sequence.
 
+Conditionals
+
+* Pattern matching case statement::  How to use @code{pcase}.
+
 Nonlocal Exits
 
 * Catch and Throw::         Nonlocal exits for the program's own purposes.
@@ -535,6 +539,7 @@ Functions
 * Function Cells::          Accessing or setting the function definition
                               of a symbol.
 * Closures::                Functions that enclose a lexical environment.
+* Advising Functions::      Adding to the definition of a function.
 * Obsolete Functions::      Declaring functions obsolete.
 * Inline Functions::        Defining functions that the compiler
                               will expand inline.
@@ -552,6 +557,13 @@ Lambda Expressions
 * Argument List::           Details and special features of argument lists.
 * Function Documentation::  How to put documentation in a function.
 
+Advising Emacs Lisp Functions
+
+* Core Advising Primitives::  Primitives to manipulate advice.
+* Advising Named Functions::  Advising named functions.
+* Advice combinators::        Ways to compose advice.
+* Porting old advice::        Adapting code using the old defadvice.
+
 Macros
 
 * Simple Macro::            A basic example.
@@ -602,6 +614,7 @@ Loading
 * Unloading::               How to unload a library that was loaded.
 * Hooks for Loading::       Providing code to be run when
                               particular libraries are loaded.
+* Dynamic Modules::         Modules provide additional Lisp primitives.
 
 Byte Compilation
 
@@ -1191,6 +1204,10 @@ Text Properties
 * Not Intervals::           Why text properties do not use
                               Lisp-visible text intervals.
 
+Parsing HTML and XML
+
+* Document Object Model::   Access, manipulate and search the @acronym{DOM}.
+
 address@hidden Characters
 
 * Text Representations::    How Emacs represents text.
@@ -1530,9 +1547,12 @@ GNU Emacs Internals
 * Building Emacs::          How the dumped Emacs is made.
 * Pure Storage::            Kludge to make preloaded Lisp functions shareable.
 * Garbage Collection::      Reclaiming space for Lisp objects no longer used.
+* Stack-allocated Objects:: Temporary conses and strings on C stack.
 * Memory Usage::            Info about total size of Lisp objects made so far.
+* C Dialect::               What C variant Emacs is written in.
 * Writing Emacs Primitives::  Writing C code for Emacs.
 * Object Internals::        Data formats of buffers, windows, processes.
+* C Integer Types::         How C integer types are used inside Emacs.
 
 Object Internals
 
diff --git a/doc/lispref/eval.texi b/doc/lispref/eval.texi
index 067dbd2..dfad9fb 100644
--- a/doc/lispref/eval.texi
+++ b/doc/lispref/eval.texi
@@ -780,7 +780,8 @@ to specify this function, but it is more robust to use the
 @deffn Command eval-buffer &optional buffer-or-name stream filename unibyte 
print
 This is similar to @code{eval-region}, but the arguments provide
 different optional features.  @code{eval-buffer} operates on the
-entire accessible portion of buffer @var{buffer-or-name}.
+entire accessible portion of buffer @var{buffer-or-name}
+(@pxref{Narrowing,,, emacs, The GNU Emacs Manual}).
 @var{buffer-or-name} can be a buffer, a buffer name (a string), or
 @code{nil} (or omitted), which means to use the current buffer.
 @var{stream} is used as in @code{eval-region}, unless @var{stream} is
@@ -833,9 +834,9 @@ The value of this variable is a list of the values returned 
by all the
 expressions that were read, evaluated, and printed from buffers
 (including the minibuffer) by the standard Emacs commands which do
 this.  (Note that this does @emph{not} include evaluation in
address@hidden buffers, nor evaluation using @kbd{C-j} in
address@hidden)  The elements are ordered most recent
-first.
address@hidden buffers, nor evaluation using @kbd{C-j}, @kbd{C-x C-e},
+and similar evaluation commands in @code{lisp-interaction-mode}.)  The
+elements are ordered most recent first.
 
 @example
 @group
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index 9a1b2cd..918bf5b 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -2030,11 +2030,6 @@ form.
 @end example
 @end defun
 
address@hidden directory-name-p filename
-This function returns address@hidden if @var{filename} ends with a
-forward slash (@samp{/}) character.
address@hidden defun
-
 @node Directory Names
 @subsection Directory Names
 @cindex directory name
@@ -2076,6 +2071,13 @@ string (if it does not already end in one).
 @end example
 @end defun
 
address@hidden directory-name-p filename
+This function returns address@hidden if @var{filename} ends with a
+directory separator character.  This is the forward slash @samp{/} on
+Unix and GNU systems; MS-Windows and MS-DOS recognize both the forward
+slash and the backslash @samp{\} as directory separators.
address@hidden defun
+
 @defun directory-file-name dirname
 This function returns a string representing @var{dirname} in a form
 that the operating system will interpret as the name of a file (a
@@ -2632,12 +2634,20 @@ An error is signaled if @var{directory} is not the name 
of a directory
 that can be read.
 @end defun
 
address@hidden directory-files-recursively directory match &optional 
include-directories
-Return all files under @var{directory} whose file names match
address@hidden recursively.  The file names are returned depth first,
-meaning that contents of sub-directories are returned before contents
-of the directories.  If @var{include-directories} is address@hidden,
-also return directory names that have matching names.
address@hidden directory-files-recursively directory regexp &optional 
include-directories
+Return all files under @var{directory} whose names match @var{regexp}.
+This function searches the specified @var{directory} and its
+sub-directories, recursively, for files whose basenames (i.e., without
+the leading directories) match the specified @var{regexp}, and returns
+a list of the absolute file names of the matching files
+(@pxref{Relative File Names, absolute file names}).  The file names
+are returned in depth-first order, meaning that files in some
+sub-directory are returned before the files in its parent directory.
+In addition, matching files found in each subdirectory are sorted
+alphabetically by their basenames.  By default, directories whose
+names match @var{regexp} are omitted from the list, but if the
+optional argument @var{include-directories} is address@hidden, they
+are included.
 @end defun
 
 @defun directory-files-and-attributes directory &optional full-name 
match-regexp nosort id-format
diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index 3ae3308..80a4af2 100644
--- a/doc/lispref/frames.texi
+++ b/doc/lispref/frames.texi
@@ -557,7 +557,7 @@ The top left corner of the native frame specifies the 
@dfn{native
 position} of the frame.  (1)--(3) in the drawing above indicate that
 position for the various builds:
 
address@hidden @w
address@hidden @w{}
 @item (1) non-toolkit and terminal frames
 
 @item (2) Lucid, Motif and Windows frames
@@ -1001,18 +1001,40 @@ parameters of @var{frame} and their values.  If 
@var{frame} is
 @end defun
 
 @defun modify-frame-parameters frame alist
-This function alters the parameters of frame @var{frame} based on the
-elements of @var{alist}.  Each element of @var{alist} has the form
address@hidden(@var{parm} . @var{value})}, where @var{parm} is a symbol naming a
-parameter.  If you don't mention a parameter in @var{alist}, its value
-doesn't change.  If @var{frame} is @code{nil}, it defaults to the selected
-frame.
+This function alters the frame @var{frame} based on the elements of
address@hidden  Each element of @var{alist} has the form
address@hidden(@var{parm} . @var{value})}, where @var{parm} is a symbol naming
+a parameter.  If you don't mention a parameter in @var{alist}, its
+value doesn't change.  If @var{frame} is @code{nil}, it defaults to
+the selected frame.
+
+Some parameters are only meaningful for frames on certain kinds of
+display (@pxref{Frames}).  If @var{alist} includes parameters that are
+not meaningful for the @var{frame}'s display, this function will
+change its value in the frame's parameter list, but will otherwise
+ignore it.
+
+When @var{alist} specifies more than one parameter whose value can
+affect the new size of @var{frame}, the final size of the frame may
+differ according to the toolkit used.  For example, specifying that a
+frame should from now on have a menu and/or tool bar instead of none and
+simultaneously specifying the new height of the frame will inevitably
+lead to a recalculation of the frame's height.  Conceptually, in such
+case, this function will try to have the explicit height specification
+prevail.  It cannot be excluded, however, that the addition (or removal)
+of the menu or tool bar, when eventually performed by the toolkit, will
+defeat this intention.
+
+Sometimes, binding @code{frame-inhibit-implied-resize} (@pxref{Implied
+Frame Resizing}) to a address@hidden value around calls to this function
+may fix the problem sketched here.  Sometimes, however, exactly such
+binding may be hit by the problem.
 @end defun
 
 @defun set-frame-parameter frame parm value
 This function sets the frame parameter @var{parm} to the specified
address@hidden  If @var{frame} is @code{nil}, it defaults to the
-selected frame.
address@hidden  If @var{frame} is @code{nil}, it defaults to the selected
+frame.
 @end defun
 
 @defun modify-all-frames-parameters alist
diff --git a/doc/lispref/functions.texi b/doc/lispref/functions.texi
index 8835667..7cc041fa7 100644
--- a/doc/lispref/functions.texi
+++ b/doc/lispref/functions.texi
@@ -861,15 +861,18 @@ into a list.  @code{mapc} always returns @var{sequence}.
 
 @defun mapconcat function sequence separator
 @code{mapconcat} applies @var{function} to each element of
address@hidden: the results, which must be strings, are concatenated.
-Between each pair of result strings, @code{mapconcat} inserts the string
address@hidden  Usually @var{separator} contains a space or comma or
-other suitable punctuation.
address@hidden; the results, which must be sequences of characters
+(strings, vectors, or lists), are concatenated into a single string
+return value.  Between each pair of result sequences, @code{mapconcat}
+inserts the characters from @var{separator}, which also must be a
+string, or a vector or list of characters.  @xref{Sequences Arrays
+Vectors}.
 
 The argument @var{function} must be a function that can take one
-argument and return a string.  The argument @var{sequence} can be any
-kind of sequence except a char-table; that is, a list, a vector, a
-bool-vector, or a string.
+argument and returns a sequence of characters: a string, a vector, or
+a list.  The argument @var{sequence} can be any kind of sequence
+except a char-table; that is, a list, a vector, a bool-vector, or a
+string.
 
 @example
 @group
diff --git a/doc/lispref/help.texi b/doc/lispref/help.texi
index 387587a..685995b 100644
--- a/doc/lispref/help.texi
+++ b/doc/lispref/help.texi
@@ -352,16 +352,16 @@ string in Emacs Lisp.
 @defvar text-quoting-style
 @cindex curved quotes
 @cindex curly quotes
-The value of this variable specifies the style used to generate text
-quotes.  If the variable's value is @code{curve}, the style is
+The value of this variable is a symbol that specifies the style Emacs
+should use for single quotes in the wording of help and messages.
+If the variable's value is @code{curve}, the style is
 @t{‘like this’} with curved single quotes.  If the value is
 @code{straight}, the style is @t{'like this'} with straight
 apostrophes.  If the value is @code{grave}, the style is @t{`like
-this'} with grave accent and apostrophe.  The default value @code{nil}
+this'} with grave accent and apostrophe, the standard style
+before Emacs version 25.  The default value @code{nil}
 acts like @code{curve} if curved single quotes are displayable, and
-like @code{grave} otherwise.  To use the traditional @code{grave}
-style, put the line @code{(setq text-quoting-style 'grave)} into your
address@hidden/.emacs} file.
+like @code{grave} otherwise.
 @end defvar
 
 @defun substitute-command-keys string
diff --git a/doc/lispref/internals.texi b/doc/lispref/internals.texi
index e620da0..e111d35 100644
--- a/doc/lispref/internals.texi
+++ b/doc/lispref/internals.texi
@@ -32,7 +32,9 @@ executable.  You don't have to know this material to build 
and install
 Emacs, since the makefiles do all these things automatically.  This
 information is pertinent to Emacs developers.
 
-   Compilation of the C source files in the @file{src} directory
+  Building Emacs requires GNU Make version 3.81 or later.
+
+  Compilation of the C source files in the @file{src} directory
 produces an executable file called @file{temacs}, also called a
 @dfn{bare impure Emacs}.  It contains the Emacs Lisp interpreter and
 I/O routines, but not the editing commands.
diff --git a/doc/lispref/loading.texi b/doc/lispref/loading.texi
index 82de765..e01f316 100644
--- a/doc/lispref/loading.texi
+++ b/doc/lispref/loading.texi
@@ -29,7 +29,15 @@ into a buffer and evaluated there.  (Indeed, most code is 
tested this
 way.)  Most often, the forms are function definitions and variable
 definitions.
 
-For on-demand loading of external libraries, @pxref{Dynamic Libraries}.
+  Emacs can also load compiled dynamic modules: shared libraries that
+provide additional functionality for use in Emacs Lisp programs, just
+like a package written in Emacs Lisp would.  When a dynamic module is
+loaded, Emacs calls a specially-named initialization function which
+the module needs to implement, and which exposes the additional
+functions and variables to Emacs Lisp programs.
+
+For on-demand loading of external libraries which are known in advance
+to be required by certain Emacs primitives, @pxref{Dynamic Libraries}.
 
 @menu
 * How Programs Do Loading:: The @code{load} function and others.
@@ -43,6 +51,7 @@ For on-demand loading of external libraries, @pxref{Dynamic 
Libraries}.
 * Unloading::               How to unload a library that was loaded.
 * Hooks for Loading::       Providing code to be run when
                               particular libraries are loaded.
+* Dynamic Modules::         Modules provide additional Lisp primitives.
 @end menu
 
 @node How Programs Do Loading
@@ -1076,3 +1085,53 @@ defined in another library (those meant for outside 
use), you can do
 it immediately---there is no need to wait until the library is loaded.
 If you need to call functions defined by that library, you should load
 the library, preferably with @code{require} (@pxref{Named Features}).
+
address@hidden Dynamic Modules
address@hidden Emacs Dynamic Modules
address@hidden dynamic modules
+
address@hidden FIXME: This is intentionally incomplete, as the module 
integration
address@hidden is not yet finished.  To be refined later.
+  A @dfn{dynamic Emacs module} is a shared library that provides
+additional functionality for use in Emacs Lisp programs, just like a
+package written in Emacs Lisp would.
+
+  Functions that load Emacs Lisp packages can also load dynamic
+modules.  They recognize dynamic modules by looking at their file-name
+extension, a.k.a.@: ``suffix''.  This suffix is platform-dependent.
+
address@hidden module-file-suffix
+This variable holds the system-dependent value of the file-name
+extension of the module files.  Its value is @file{.so} on Posix hosts
+and @file{.dll} on MS-Windows.
address@hidden defvar
+
address@hidden emacs_module_init
address@hidden plugin_is_GPL_compatible
+Every dynamic module should export a C-callable function named
address@hidden, which Emacs will call as part of the call to
address@hidden or @code{require} which loads the module.  It should also
+export a symbol named @code{plugin_is_GPL_compatible} to indicate that
+its code is released under the GPL or compatible license; Emacs will
+refuse to load modules that don't export such a symbol.
+
+If a module needs to call Emacs functions, it should do so through the
+API defined and documented in the header file @file{emacs-module.h}
+that is part of the Emacs distribution.
+
address@hidden user-ptr object
+Modules can create @code{user-ptr} Lisp objects that embed pointers to
+C struct's defined by the module.  This is useful for keeping around
+complex data structures created by a module, to be passed back to the
+module's functions.  User-ptr objects can also have associated
address@hidden -- functions to be run when the object is GC'ed; this
+is useful for freeing any resources allocated for the underlying data
+structure, such as memory, open file descriptors, etc.
+
address@hidden user-ptrp object
+This function returns @code{t} if its argument is a @code{user-ptr}
+object.
address@hidden defun
+
+Loadable modules in Emacs are enabled by using the
address@hidden option at configure time.
diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi
index a174770..3b8550e 100644
--- a/doc/lispref/modes.texi
+++ b/doc/lispref/modes.texi
@@ -2509,6 +2509,53 @@ Search-based fontification happens second.
 @node Font Lock Basics
 @subsection Font Lock Basics
 
+  The Font Lock functionality is based on several basic functions.
+Each of these calls the function specified by the corresponding
+variable.  This indirection allows major modes to modify the way
+fontification works in the buffers of that mode, and even use the Font
+Lock mechanisms for features that have nothing to do with
+fontification.  (This is why the description below says ``should''
+when it describes what the functions do: the major mode can customize
+the values of the corresponding variables to do something entirely
+different.)  The variables mentioned below are described in @ref{Other
+Font Lock Variables}.
+
address@hidden @code
address@hidden font-lock-fontify-buffer
+This function should fontify the current buffer's accessible portion,
+by calling the function specified by
address@hidden
+
address@hidden font-lock-unfontify-buffer
+Used when turning Font Lock off to remove the fontification.  Calls
+the function specified by @code{font-lock-unfontify-buffer-function}.
+
address@hidden font-lock-fontify-region beg end &optional loudly
+Should fontify the region between @var{beg} and @var{end}.  If
address@hidden is address@hidden, should display status messages while
+fontifying.  Calls the function specified by
address@hidden
+
address@hidden font-lock-unfontify-region beg end
+Should remove fontification from the region between @var{beg} and
address@hidden  Calls the function specified by
address@hidden
+
address@hidden font-lock-flush &optional beg end
+This function should mark the fontification of the region between
address@hidden and @var{end} as outdated.  If not specified or @code{nil},
address@hidden and @var{end} default to the beginning and end of the
+buffer's accessible portion.  Calls the function specified by
address@hidden
+
address@hidden font-lock-ensure &optional beg end
+This function should make sure the region between @var{beg} and
address@hidden has been fontified.  The optional arguments @var{beg} and
address@hidden default to the beginning and the end of the buffer's
+accessible portion.  Calls the function specified by
address@hidden
address@hidden ftable
+
   There are several variables that control how Font Lock mode highlights
 text.  But major modes should not set any of these variables directly.
 Instead, they should set @code{font-lock-defaults} as a buffer-local
@@ -2936,6 +2983,22 @@ arguments, the beginning and end of the region.  The 
default value is
 @code{font-lock-default-unfontify-region}.
 @end defvar
 
address@hidden font-lock-flush-function
+Function to use for declaring that a region's fontification is out of
+date.  It takes two arguments, the beginning and end of the region.
+The default value of this variable is
address@hidden
address@hidden defvar
+
address@hidden font-lock-ensure-function
+Function to use for making sure a region of the current buffer has
+been fontified.  It is called with two arguments, the beginning and
+end of the region.  The default value of this variable is a function
+that calls @code{font-lock-default-fontify-buffer} if the buffer is
+not fontified; the effect is to make sure the entire accessible
+portion of the buffer is fontified.
address@hidden defvar
+
 @defun jit-lock-register function &optional contextual
 This function tells Font Lock mode to run the Lisp function
 @var{function} any time it has to fontify or refontify part of the
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 17a0b47..92e3ee2 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -902,6 +902,9 @@ Hewlett-Packard HPUX operating system.
 @item irix
 Silicon Graphics Irix system.
 
address@hidden nacl
+Google Native Client (@acronym{NaCl}) sandboxing system.
+
 @item ms-dos
 Microsoft's address@hidden  Emacs compiled with DJGPP for MS-DOS binds
 @code{system-type} to @code{ms-dos} even when you run it on MS-Windows.
@@ -911,7 +914,7 @@ AT&T Unix System V.
 
 @item windows-nt
 Microsoft Windows NT, 9X and later.  The value of @code{system-type}
-is always @code{windows-nt}, e.g., even on Windows 7.
+is always @code{windows-nt}, e.g., even on Windows 10.
 
 @end table
 
@@ -2922,6 +2925,18 @@ means complete; it is intended to give you an idea of 
the security
 issues involved, rather than to be a security checklist.
 
 @table @asis
address@hidden File local variables
address@hidden file local variables
+A file that Emacs visits can contain variable settings that affects
+the buffer visiting that file; @xref{File Local Variables}.
+Similarly, a directory can specify local variable values common to all
+files in that directory; @xref{Directory Local Variables}.  Although
+Emacs takes some effort to protect against misuse of these variables,
+a security hole can be created merely by a package setting
address@hidden too optimistically, a problem that is all
+too common.  To disable this feature for both files and directories,
+set @code{enable-local-variables} to @code{nil}.
+
 @item Access control
 Although Emacs normally respects access permissions of the underlying
 operating system, in some cases it handles accesses specially.  For
diff --git a/doc/lispref/positions.texi b/doc/lispref/positions.texi
index 72b76ce..9daf5ce 100644
--- a/doc/lispref/positions.texi
+++ b/doc/lispref/positions.texi
@@ -572,6 +572,18 @@ The value returned is the window line number point has 
moved to, with
 the top line in the window numbered 0.
 @end deffn
 
address@hidden move-to-window-group-line-function
address@hidden move-to-window-group-line count
+This function is like @code{move-to-window-line}, except that when the
+selected window is a part of a group of windows (@pxref{Window
+Group}), @code{move-to-window-group-line} will move to a position with
+respect to the entire group, not just the single window.  This
+condition holds when the buffer local variable
address@hidden is set to a function.  In
+this case, @code{move-to-window-group-line} calls the function with
+the argument @var{count}, then returns its result.
address@hidden defun
+
 @defun compute-motion from frompos to topos width offsets window
 This function scans the current buffer, calculating screen positions.
 It scans the buffer forward from position @var{from}, assuming that is
diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi
index 0ce696a..41255e7 100644
--- a/doc/lispref/processes.texi
+++ b/doc/lispref/processes.texi
@@ -737,10 +737,12 @@ If @var{stopped} is address@hidden, start the process in 
the
 stopped state.
 
 @item :filter @var{filter}
-Initialize the process filter to @var{filter}.
+Initialize the process filter to @var{filter}.  If not specified, a
+default filter will be provided.  @xref{Filter Functions}.
 
 @item :sentinel @var{sentinel}
-Initialize the process sentinel to @var{sentinel}.
+Initialize the process sentinel to @var{sentinel}.  If not specified,
+a default sentinel will be used.  @xref{Sentinels}.
 
 @item :stderr @var{stderr}
 Associate @var{stderr} with the standard error of the process.
@@ -789,10 +791,12 @@ If @var{stopped} is address@hidden, start the process in 
the
 stopped state.
 
 @item :filter @var{filter}
-Initialize the process filter to @var{filter}.
+Initialize the process filter to @var{filter}.  If not specified, a
+default filter will be provided.  @xref{Filter Functions}.
 
 @item :sentinel @var{sentinel}
-Initialize the process sentinel to @var{sentinel}.
+Initialize the process sentinel to @var{sentinel}.  If not specified,
+a default sentinel will be used.  @xref{Sentinels}.
 @end table
 
 The original argument list, modified with the actual connection
@@ -922,9 +926,10 @@ For a network process, the values include (see
 @item :buffer
 The associated value is the process buffer.
 @item :filter
-The associated value is the process filter function.
+The associated value is the process filter function.  @xref{Filter
+Functions}.
 @item :sentinel
-The associated value is the process sentinel function.
+The associated value is the process sentinel function.  @xref{Sentinels}.
 @item :remote
 In a connection, the address in internal format of the remote peer.
 @item :local
@@ -1379,6 +1384,7 @@ subprocess with a @code{SIGHUP} signal (@pxref{Signals to 
Processes}).
 @cindex filter function
 @cindex process filter
 
address@hidden default filter function of a process
   A process @dfn{filter function} is a function that receives the
 standard output from the associated process.  @emph{All} output from
 that process is passed to the filter.  The default filter simply
@@ -1632,21 +1638,43 @@ also called if the process exits.  The sentinel 
receives two
 arguments: the process for which the event occurred, and a string
 describing the type of event.
 
address@hidden default sentinel function of a process
+  If no sentinel function was specified for a process, it will use the
+default sentinel function, which inserts a message in the process's
+buffer with the process name and the string describing the event.
+
   The string describing the event looks like one of the following:
 
address@hidden FIXME?  Also "killed\n" - see example below?
 @itemize @bullet
 @item
 @code{"finished\n"}.
 
 @item
address@hidden"exited abnormally with code @var{exitcode}\n"}.
address@hidden"deleted\n"}.
+
address@hidden
address@hidden"exited abnormally with code @var{exitcode} (core dumped)\n"}.
+The ``core dumped'' part is optional, and only appears if the process
+dumped core.
+
address@hidden
address@hidden"failed with code @var{fail-code}\n"}.
+
address@hidden
address@hidden"@var{signal-description} (core dumped)\n"}.  The
address@hidden is a system-dependent textual description of
+a signal, e.g., @code{"killed"} for @code{SIGKILL}.  The ``core
+dumped'' part is optional, and only appears if the process dumped
+core.
+
address@hidden
address@hidden"open from @var{host-name}\n"}.
 
 @item
address@hidden"@var{name-of-signal}\n"}.
address@hidden"open\n"}.
 
 @item
address@hidden"@var{name-of-signal} (core dumped)\n"}.
address@hidden"connection broken by remote peer\n"}.
 @end itemize
 
   A sentinel runs only while Emacs is waiting (e.g., for terminal
diff --git a/doc/lispref/strings.texi b/doc/lispref/strings.texi
index f8685d9..8aa4539 100644
--- a/doc/lispref/strings.texi
+++ b/doc/lispref/strings.texi
@@ -465,6 +465,7 @@ Representations}.
 @code{string-equal} is another name for @code{string=}.
 @end defun
 
address@hidden locale-dependent string equivalence
 @defun string-collate-equalp string1 string2 &optional locale ignore-case
 This function returns @code{t} if @var{string1} and @var{string2} are
 equal with respect to collation rules.  A collation rule is not only
@@ -493,6 +494,7 @@ systems.
 If @var{ignore-case} is address@hidden, characters are converted to lower-case
 before comparing them.
 
address@hidden w32-collate-ignore-punctuation
 To emulate Unicode-compliant collation on MS-Windows systems,
 bind @code{w32-collate-ignore-punctuation} to a address@hidden value, since
 the codeset part of the locale cannot be @code{"UTF-8"} on MS-Windows.
@@ -518,7 +520,7 @@ optional argument @var{ignore-case} is address@hidden, the 
comparison
 ignores case differences.
 @end defun
 
address@hidden lexical comparison
address@hidden lexical comparison of strings
 @defun string< string1 string2
 @c (findex string< causes problems for permuted index!!)
 This function compares two strings a character at a time.  It
@@ -576,6 +578,7 @@ are used.
 @code{string-lessp} is another name for @code{string<}.
 @end defun
 
address@hidden locale-dependent string comparison
 @defun string-collate-lessp string1 string2 &optional locale ignore-case
 This function returns @code{t} if @var{string1} is less than
 @var{string2} in collation order.  A collation order is not only
@@ -594,15 +597,15 @@ for sorting (@pxref{Sequence Functions}):
 @end group
 @end example
 
-This behavior is system-dependent; punctuation and whitespace are
-never ignored on Cygwin, regardless of locale.
+This behavior is system-dependent; e.g., punctuation and whitespace
+are never ignored on Cygwin, regardless of locale.
 
 The optional argument @var{locale}, a string, overrides the setting of
 your current locale identifier for collation.  The value is system
 dependent; a @var{locale} @code{"en_US.UTF-8"} is applicable on POSIX
 systems, while it would be, e.g., @code{"enu_USA.1252"} on MS-Windows
-systems.  The @var{locale} @code{"POSIX"} lets @code{string-collate-lessp}
-behave like @code{string-lessp}:
+systems.  The @var{locale} value of @code{"POSIX"} or @code{"C"} lets
address@hidden behave like @code{string-lessp}:
 
 @example
 @group
diff --git a/doc/lispref/syntax.texi b/doc/lispref/syntax.texi
index 7a984e3..831ebd1 100644
--- a/doc/lispref/syntax.texi
+++ b/doc/lispref/syntax.texi
@@ -945,6 +945,14 @@ whitespace by the functions in this section and by 
@code{forward-sexp},
 The behavior of @code{parse-partial-sexp} is also affected by
 @code{parse-sexp-lookup-properties} (@pxref{Syntax Properties}).
 
address@hidden comment-end-can-be-escaped
+If this buffer local variable is address@hidden, a single character
+which usually terminates a comment doesn't do so when that character
+is escaped.  This is used in C and C++ Modes, where line comments
+starting with @samp{//} can be continued onto the next line by
+escaping the newline with @samp{\}.
address@hidden defvar
+
 You can use @code{forward-comment} to move forward or backward over
 one comment or several comments.
 
diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi
index 6d9d26f..f3679a8 100644
--- a/doc/lispref/text.texi
+++ b/doc/lispref/text.texi
@@ -899,13 +899,25 @@ adds it to the most recent element.  It determines 
automatically (using
 @code{last-command}) whether the previous command was a kill command,
 and if so appends the killed text to the most recent entry.
 
address@hidden Command kill-region start end
-This function kills the text in the region defined by @var{start} and
address@hidden  The text is deleted but saved in the kill ring, along with
-its text properties.  The value is always @code{nil}.
address@hidden filtering killed text
+  The commands described below can filter the killed text before they
+save it in the kill ring.  They call @code{filter-buffer-substring}
+(@pxref{Buffer Contents}) to perform the filtering.  By default,
+there's no filtering, but major and minor modes and hook functions can
+set up filtering, so that text saved in the kill ring is different
+from what was in the buffer.
+
address@hidden Command kill-region start end &optional region
+This function kills the stretch of text between @var{start} and
address@hidden; but if the optional argument @var{region} is
address@hidden, it ignores @var{start} and @var{end}, and kills the
+text in the current region instead.  The text is deleted but saved in
+the kill ring, along with its text properties.  The value is always
address@hidden
 
 In an interactive call, @var{start} and @var{end} are point and
-the mark.
+the mark, and @var{region} is always address@hidden, so the command
+always kills the text in the current region.
 
 If the buffer or text is read-only, @code{kill-region} modifies the kill
 ring just the same, then signals an error without modifying the buffer.
@@ -919,18 +931,20 @@ error if the buffer or text is read-only.  Instead, it 
simply returns,
 updating the kill ring but not changing the buffer.
 @end defopt
 
address@hidden Command copy-region-as-kill start end
-This command saves the region defined by @var{start} and @var{end} on
-the kill ring (including text properties), but does not delete the text
-from the buffer.  It returns @code{nil}.
address@hidden Command copy-region-as-kill start end &optional region
+This function saves the stretch of text between @var{start} and
address@hidden on the kill ring (including text properties), but does not
+delete the text from the buffer.  However, if the optional argument
address@hidden is address@hidden, the function ignores @var{start} and
address@hidden, and saves the current region instead.  It always returns
address@hidden
+
+In an interactive call, @var{start} and @var{end} are point and
+the mark, and @var{region} is always address@hidden, so the command
+always saves the text in the current region.
 
 The command does not set @code{this-command} to @code{kill-region}, so a
 subsequent kill command does not append to the same kill ring entry.
-
address@hidden FIXME Why is it better?  Why isn't copy-region-as-kill obsolete 
then?
address@hidden Why is it used in many places in Emacs?
-In Lisp programs, it is better to use @code{kill-new} or
address@hidden instead of this command.  @xref{Low-Level Kill Ring}.
 @end deffn
 
 @node Yanking
@@ -1343,27 +1357,39 @@ This function places a boundary element in the undo 
list.  The undo
 command stops at such a boundary, and successive undo commands undo
 to earlier and earlier boundaries.  This function returns @code{nil}.
 
-The editor command loop automatically calls @code{undo-boundary} just
-before executing each key sequence, so that each undo normally undoes
-the effects of one command.  As an exception, the command
address@hidden, which produces self-inserting input
-characters (@pxref{Commands for Insertion}), may remove the boundary
-inserted by the command loop: a boundary is accepted for the first
-such character, the next 19 consecutive self-inserting input
-characters do not have boundaries, and then the 20th does; and so on
-as long as the self-inserting characters continue.  Hence, sequences
-of consecutive character insertions can be undone as a group.
-
-All buffer modifications add a boundary whenever the previous undoable
-change was made in some other buffer.  This is to ensure that
-each command makes a boundary in each buffer where it makes changes.
-
 Calling this function explicitly is useful for splitting the effects of
 a command into more than one unit.  For example, @code{query-replace}
 calls @code{undo-boundary} after each replacement, so that the user can
 undo individual replacements one by one.
+
+Mostly, however, this function is called automatically at an
+appropriate time.
address@hidden defun
+
address@hidden undo-auto-amalgamate
address@hidden amalgamating commands, and undo
+The editor command loop automatically calls @code{undo-boundary} just
+before executing each key sequence, so that each undo normally undoes
+the effects of one command.  A few exceptional commands are
address@hidden: these commands generally cause small changes to
+buffers, so with these a boundary is inserted only every 20th command,
+allowing to undo them as a group.  By default, commands
address@hidden, which produces self-inserting input
+characters (@pxref{Commands for Insertion}), and @code{delete-char}
+which deletes characters (@pxref{Deletion}) are amalgamating.
+Where a command affects the contents of several buffers, as may happen,
+for example, when a function on the @code{post-command-hook} affects a
+buffer other than the @code{current-buffer}, then @code{undo-boundary}
+will be called in each of the affected buffers.
 @end defun
 
address@hidden undo-auto-current-boundary-timer
+Some buffers, such as process buffers, can change even when no
+commands are executing.  In these cases, @code{undo-boundary} is
+normally called periodically by the timer in this variable.  Setting
+this variable to address@hidden prevents this behavior.
address@hidden defvar
+
 @defvar undo-in-progress
 This variable is normally @code{nil}, but the undo commands bind it to
 @code{t}.  This is so that various kinds of change hooks can tell when
@@ -2336,6 +2362,84 @@ already indented, it calls @code{completion-at-point} to 
complete the
 text at point (@pxref{Completion in Buffers}).
 @end defopt
 
address@hidden literate programming
address@hidden multi-mode indentation
+  Some major modes need to support embedded regions of text whose
+syntax belongs to a different major mode.  Examples include
address@hidden programming} source files that combine documentation and
+snippets of source code, Yacc/Bison programs that include snippets of
+plain C code, etc.  To correctly indent the embedded chunks, the major
+mode needs to delegate the indentation to another mode's indentation
+engine (e.g., call @code{c-indent-defun} for C code or
address@hidden for Python), while providing it with some
+context to guide the indentation.  The following facilities support
+such multi-mode indentation.
+
address@hidden prog-indentation-context
+This variable, when address@hidden, holds the indentation context for
+the sub-mode's indentation engine provided by the superior major mode.
+The value should be a list of the form @code{(@var{first-column}
address@hidden(@var{start} . @var{end})} @code{prev-chunk})}.  The members of 
the
+list have the following meaning:
+
address@hidden @var
address@hidden first-column
+The column to be used for top-level constructs.  This replaces the
+default value of the top-level column used by the sub-mode, usually
+zero.
address@hidden start
address@hidden end
+The region of the code chunk to be indented by the sub-mode.  The
+value of @var{end} can be @code{nil}, which stands for the value of
address@hidden
address@hidden prev-chunk
+If this is address@hidden, it should provide the sub-mode's
+indentation engine with a virtual context of the code chunk.  Valid
+values include:
+
address@hidden @minus
address@hidden
+A string whose contents is the text the sub-mode's indentation engine
+should consider to precede the code chunk.  The sub-mode's indentation
+engine can add text properties to that string, to be reused in
+repeated calls with the same string, thus using it as a cache.  An
+example where this is useful is code chunks that need to be indented
+as function bodies, but lack the function's preamble---the string
+could then include that missing preamble.
address@hidden
+A function.  It is expected to be called with the start position of
+the current chunk, and should return a cons cell
address@hidden@code{(@var{prev-start} . @var{prev-end})}} that specifies the
+region of the previous code chunk, or @code{nil} if there is no previous
+chunk.  This is useful in literate-programming sources, where code is
+split into chunks, and correct indentation needs to access previous
+chunks.
address@hidden itemize
address@hidden table
address@hidden defvar
+
+The following convenience functions should be used by major mode's
+indentation engine in support of invocations as sub-modes of another
+major mode.
+
address@hidden prog-first-column
+Call this function instead of using a literal value (usually, zero) of
+the column number for indenting top-level program constructs.  The
+function's value is the column number to use for top-level constructs.
+When no superior mode is in effect, this function returns zero.
address@hidden defun
+
address@hidden prog-widen
+Call this function instead of @code{widen} to remove any restrictions
+imposed by the mode's indentation engine and restore the restrictions
+recorded in @code{prog-indentation-context}.  This prevents the
+indentation engine of a sub-mode from inadvertently operating on text
+outside of the chunk it was supposed to indent, and preserves the
+restriction imposed by the superior mode.  When no superior mode is in
+effect, this function just calls @code{widen}.
address@hidden defun
+
+
 @node Region Indent
 @subsection Indenting an Entire Region
 
@@ -3256,8 +3360,8 @@ and then remove the property.  @xref{Read Only Buffers}.
 
 @item inhibit-read-only
 @kindex inhibit-read-only @r{(text property)}
-If a character has the property @code{inhibit-read-only}, and the
-buffer is read-only, editing the character in question is allowed.
+Characters that have the property @code{inhibit-read-only} can be
+edited even in read-only buffers.  @xref{Read Only Buffers}.
 
 @item invisible
 @kindex invisible @r{(text property)}
diff --git a/doc/lispref/tips.texi b/doc/lispref/tips.texi
index d9cbf47..ffce920 100644
--- a/doc/lispref/tips.texi
+++ b/doc/lispref/tips.texi
@@ -14,11 +14,17 @@ it gives advice on making effective use of the features 
described in the
 previous chapters, and describes conventions Emacs Lisp programmers
 should follow.
 
address@hidden checkdoc
address@hidden checkdoc-current-buffer
address@hidden checkdoc-file
   You can automatically check some of the conventions described below by
 running the command @kbd{M-x checkdoc RET} when visiting a Lisp file.
 It cannot check all of the conventions, and not all the warnings it
 gives necessarily correspond to problems, but it is worth examining them
-all.
+all.  Alternatively, use the command @kbd{M-x checkdoc-current-buffer RET}
+to check the conventions in the current buffer, or @code{checkdoc-file}
+when you want to check a file in batch mode, e.g., with a command run by
address@hidden@w{M-x compile RET}}.
 
 @menu
 * Coding Conventions::        Conventions for clean and robust programs.
@@ -1007,8 +1013,14 @@ of multiple files, we recommend not writing the version 
in every file,
 but only the main one.
 
 @item Keywords
address@hidden checkdoc-package-keywords-flag
address@hidden checkdoc-package-keywords
 This line lists keywords for the @code{finder-by-keyword} help command.
-Please use that command to see a list of the meaningful keywords.
+Please use that command to see a list of the meaningful keywords.  The
+command @kbd{M-x checkdoc-package-keywords RET} will find and display
+any keywords that are not in @code{finder-known-keywords}.  If you set
+the variable @code{checkdoc-package-keywords-flag} address@hidden,
+checkdoc commands will include the keyword verification in its checks.
 
 This field is how people will find your package when they're looking
 for things by topic.  To separate the keywords, you can use spaces,
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 357247e..e45201b 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -133,6 +133,30 @@ This function returns the selected window (which is always 
a live
 window).
 @end defun
 
address@hidden Group}Sometimes several windows collectively and
+cooperatively display a buffer, for example, under the management of
+Follow Mode (@pxref{Follow Mode,,, emacs}), where the windows together
+display a bigger portion of the buffer than one window could alone.
+It is often useful to consider such a @dfn{window group} as a single
+entity.  Several functions such as @code{window-group-start}
+(@pxref{Window Start and End}) allow you to do this by supplying, as
+an argument, one of the windows as a stand in for the whole group.
+
address@hidden selected-window-group
address@hidden selected-window-group-function
+When the selected window is a member of a group of windows, this
+function returns a list of the windows in the group, ordered such that
+the first window in the list is displaying the earliest part of the
+buffer, and so on.  Otherwise the function returns a list containing
+just the selected window.
+
+The selected window is considered part of a group when the buffer
+local variable @code{selected-window-group-function} is set to a
+function.  In this case, @code{selected-window-group} calls it with no
+arguments and returns its result (which should be the list of windows
+in the group).
address@hidden defun
+
 @node Windows and Frames
 @section Windows and Frames
 
@@ -521,9 +545,9 @@ its pixel height is the pixel height of the screen areas 
spanned by its
 children.
 @end defun
 
address@hidden window pixel height
address@hidden pixel height of a window
address@hidden total pixel height of a window
address@hidden window pixel width
address@hidden pixel width of a window
address@hidden total pixel width of a window
 
 @defun window-pixel-width &optional Lisp_Object &optional window
 This function returns the width of window @var{window} in pixels.
@@ -558,7 +582,6 @@ that of the root window on that frame.  If @var{window} is 
omitted or
 
 @cindex window body height
 @cindex body height of a window
address@hidden window body width
 The @dfn{body height} of a window is the height of its text area, which
 does not include a mode or header line, a horizontal scroll bar, or a
 bottom divider.
@@ -578,9 +601,8 @@ 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}.
 @end defun
 
address@hidden window body width
 @cindex body width of a window
address@hidden body size of a window
address@hidden window body size
 The @dfn{body width} of a window is the width of its text area, which
 does not include the scroll bar, fringes, margins or a right divider.
 
@@ -599,6 +621,8 @@ 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}.
 @end defun
 
address@hidden window body size
address@hidden body size of a window
 @defun window-body-size &optional window horizontal pixelwise
 This function returns the body height or body width of @var{window}.  If
 @var{horizontal} is omitted or @code{nil}, it is equivalent to calling
@@ -607,7 +631,7 @@ to calling @code{window-body-width}.  In either case, the 
optional
 argument @var{pixelwise} is passed to the function called.
 @end defun
 
-  For compatibility with previous versions of Emacs,
+For compatibility with previous versions of Emacs,
 @code{window-height} is an alias for @code{window-total-height}, and
 @code{window-width} is an alias for @code{window-body-width}.  These
 aliases are considered obsolete and will be removed in the future.
@@ -635,6 +659,22 @@ Functions for retrieving the height and/or width of window 
dividers
 (@pxref{Scroll Bars}), and display margins (@pxref{Display Margins}) are
 described in the corresponding sections.
 
+If your Lisp program needs to make layout decisions, you will find the
+following function useful:
+
address@hidden window-max-chars-per-line &optional window face
+This function returns the number of characters displayed in the
+specified @var{face} in the specified @var{window} (which must be a
+live window).  If @var{face} was remapped (@pxref{Face Remapping}),
+the information is returned for the remapped face.  If omitted or
address@hidden, @var{face} defaults to the default face, and @var{window}
+defaults to the selected window.  Unlike @code{window-body-width},
+this function accounts for the actual size of the @var{face}'s font,
+instead of working in units of frame's canonical character width.  It
+also accounts for space used by the continuation glyph, if
address@hidden lacks one or both of its fringes.
address@hidden defun
+
 @cindex fixed-size window
 @vindex window-min-height
 @vindex window-min-width
@@ -643,7 +683,7 @@ or split them (@pxref{Splitting Windows}), obey the 
variables
 @code{window-min-height} and @code{window-min-width}, which specify the
 smallest allowable window height and width.  They also obey the variable
 @code{window-size-fixed}, with which a window can be @dfn{fixed} in
-size:
+size (@pxref{Preserving Window Sizes}).
 
 @defopt window-min-height
 This option specifies the minimum total height, in lines, of any window.
@@ -3082,6 +3122,17 @@ window-start position; if you move point, do not expect 
the window-start
 position to change in response until after the next redisplay.
 @end defun
 
address@hidden window-group-start &optional window
address@hidden window-group-start-function
+This function is like @code{window-start}, except that when
address@hidden is a part of a group of windows (@pxref{Window Group}),
address@hidden returns the start position of the entire
+group.  This condition holds when the buffer local variable
address@hidden is set to a function.  In this
+case, @code{window-group-start} calls the function with the single
+argument @var{window}, then returns its result.
address@hidden defun
+
 @cindex window end position
 @defun window-end &optional window update
 This function returns the position where display of its buffer ends in
@@ -3108,6 +3159,18 @@ way real redisplay would do.  It does not alter the
 text will end if scrolling is not required.
 @end defun
 
address@hidden window-group-end-function
address@hidden window-group-end window update
+This function is like @code{window-end}, except that when @var{window}
+is a part of a group of windows (@pxref{Window Group}),
address@hidden returns the end position of the entire group.
+This condition holds when the buffer local variable
address@hidden is set to a function.  In this case,
address@hidden calls the function with the two arguments
address@hidden and @var{update}, then returns its result.  The argument
address@hidden has the same meaning as in @code{window-end}.
address@hidden defun
+
 @defun set-window-start window position &optional noforce
 This function sets the display-start position of @var{window} to
 @var{position} in @var{window}'s buffer.  It returns @var{position}.
@@ -3171,6 +3234,19 @@ off screen at the next redisplay, then redisplay 
computes a new window-start
 position that works well with point, and thus @var{position} is not used.
 @end defun
 
address@hidden set-window-group-start-function
address@hidden set-window-group-start window position &optional noforce
+This function is like @code{set-window-start}, except that when
address@hidden is a part of a group of windows (@pxref{Window Group}),
address@hidden sets the start position of the entire
+group.  This condition holds when the buffer local variable
address@hidden is set to a function.  In this
+case, @code{set-window-group-start} calls the function with the three
+arguments @var{window}, @var{position}, and @var{noforce}, then
+returns its result.  The arguments @var{position} and @var{noforce} in
+this function have the same meaning as in @code{set-window-start}.
address@hidden defun
+
 @defun pos-visible-in-window-p &optional position window partially
 This function returns address@hidden if @var{position} is within the
 range of text currently visible on the screen in @var{window}.  It
@@ -3212,6 +3288,21 @@ Here is an example:
 @end example
 @end defun
 
address@hidden pos-visible-in-window-group-p-function
address@hidden pos-visible-in-window-group-p &optional position window partially
+This function is like @code{pos-visible-in-window-p}, except that when
address@hidden is a part of a group of windows (@pxref{Window Group}),
address@hidden tests the visibility of @var{pos}
+in the entire group, not just in the single @var{window}.  This
+condition holds when the buffer local variable
address@hidden is set to a function.
+In this case @code{pos-visible-in-window-group-p} calls the function
+with the three arguments @var{position}, @var{window}, and
address@hidden, then returns its result.  The arguments
address@hidden and @var{partially} have the same meaning as in
address@hidden
address@hidden defun
+
 @defun window-line-height &optional line window
 This function returns the height of text line @var{line} in
 @var{window}.  If @var{line} is one of @code{header-line} or
@@ -3455,6 +3546,19 @@ the top of the window.  The command 
@code{recenter-top-bottom} offers
 a more convenient way to achieve this.
 @end deffn
 
address@hidden recenter-window-group-function
address@hidden recenter-window-group &optional count
+This function is like @code{recenter}, except that when the selected
+window is part of a group of windows (@pxref{Window Group}),
address@hidden scrolls the entire group.  This condition
+holds when the buffer local variable
address@hidden is set to a function.  In this
+case, @code{recenter-window-group} calls the function with the
+argument @var{count}, then returns its result.  The argument
address@hidden has the same meaning as in @code{recenter}, but with
+respect to the entire window group.
address@hidden defun
+
 @defopt recenter-redisplay
 If this variable is address@hidden, calling @code{recenter} with a
 @code{nil} argument redraws the frame.  The default value is
@@ -4264,10 +4368,10 @@ work.
 @end defvar
 
 @defvar window-size-change-functions
-This variable holds a list of functions to be called if the size of any
-window changes for any reason.  The functions are called just once per
-redisplay, and just once for each frame on which size changes have
-occurred.
+This variable holds a list of functions to be called if the size of
+any window changes for any reason.  The functions are called at the
+beginning of a redisplay cycle, and just once for each frame on which
+size changes have occurred.
 
 Each function receives the frame as its sole argument.  There is no
 direct way to find out which windows on that frame have changed size, or
diff --git a/doc/man/etags.1 b/doc/man/etags.1
index fab8901..7cb6b6c 100644
--- a/doc/man/etags.1
+++ b/doc/man/etags.1
@@ -51,7 +51,7 @@ format understood by
 \&.  Both forms of the program understand
 the syntax of C, Objective C, C++, Java, Fortran, Ada, Cobol, Erlang,
 Forth, HTML, LaTeX, Emacs Lisp/Common Lisp, Lua, Makefile, Pascal, Perl,
-PHP, PostScript, Python, Prolog, Scheme and
+Ruby, PHP, PostScript, Python, Prolog, Scheme and
 most assembler\-like syntaxes.
 Both forms read the files specified on the command line, and write a tag
 table (defaults: \fBTAGS\fP for \fBetags\fP, \fBtags\fP for
diff --git a/doc/misc/calc.texi b/doc/misc/calc.texi
index 43eb7af..02f9446 100644
--- a/doc/misc/calc.texi
+++ b/doc/misc/calc.texi
@@ -12597,7 +12597,6 @@ in this mode.  Explicit simplification commands, such 
as @kbd{=} or
 @xref{Algebraic Definitions}, for a sample use of
 No-Simplification mode.
 
-
 @kindex m N
 @pindex calc-num-simplify-mode
 The @kbd{m N} (@code{calc-num-simplify-mode}) command turns off simplification
@@ -22463,7 +22462,6 @@ Hyperbolic prefix @kbd{H} can be used similarly; the 
@kbd{H a s} will
 replace any hyperbolic functions in the formula with the appropriate
 combinations of @samp{sinh}s and @samp{cosh}s before simplifying.
 
-
 @menu
 * Basic Simplifications::
 * Algebraic Simplifications::
@@ -28032,7 +28030,7 @@ column of the Units Table.
 @noindent
 The definitions of many units have changed over the years.  For example,
 the meter was originally defined in 1791 as one ten-millionth of the
-distance from the equator to the north pole.  In order to be more
+distance from the Equator to the North Pole.  In order to be more
 precise, the definition was adjusted several times, and now a meter is
 defined as the distance that light will travel in a vacuum in
 1/299792458 of a second; consequently, the speed of light in a
@@ -28071,13 +28069,8 @@ of the various temperature scales.
 The unit of volume ``liters'' can be referred to by either the lower-case
 @code{l} or the upper-case @code{L}.
 
-The unit @code{A} stands for Amperes; the name @code{Ang} is used
address@hidden
-for \AA ngstroms.
address@hidden tex
address@hidden
-for Angstroms.
address@hidden ifnottex
+The unit @code{A} stands for amperes; the name @code{Ang} is used
+for angstroms.
 
 The unit @code{pt} stands for pints; the name @code{point} stands for
 a typographical point, defined by @samp{72 point = 1 in}.  This is
@@ -28099,7 +28092,6 @@ use the @samp{tex} prefix; the unit name for a @TeX{} 
point will be
 the unit names for pint and parsec will simply be @samp{pint} and
 @samp{parsec} instead of @samp{pt} and @samp{pc}.
 
-
 The unit @code{e} stands for the elementary (electron) unit of charge;
 because algebra command could mistake this for the special constant
 @expr{e}, Calc provides the alternate unit name @code{ech} which is
@@ -28496,7 +28488,6 @@ a frequency or a midi number to scientific pitch 
notation.  For
 example, @code{500 Hz} gets converted to
 @code{B_4 + 21.3094853649 cents} and @code{84} to @code{C_6}.
 
-
 @kindex l m
 @pindex calc-midi
 @tindex midi
@@ -28527,7 +28518,6 @@ notation @code{B_3 + 99.9962592773 cents}; with the 
default value of
 @code{1}, Calc converts @code{261.625 Hz} to @code{C_4}.
 
 
-
 @node Store and Recall, Graphics, Units, Top
 @chapter Storing and Recalling
 
diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi
index 9b488cb..7415da5 100644
--- a/doc/misc/cc-mode.texi
+++ b/doc/misc/cc-mode.texi
@@ -2461,7 +2461,7 @@ handled a little differently from the other style 
variables.  It's
 default global binding is the empty list @code{nil}, rather than
 @code{set-from-style}.  Before the style system is initialized, you
 can add individual elements to @code{c-offsets-alist} by calling
address@hidden(@pxref{c-offsets-alist}) just like you would set
address@hidden (@pxref{c-offsets-alist}) just like you would set
 other style variables with @code{setq}.  Those elements will then
 prevail when the style system later initializes a buffer-local copy of
 @code{c-offsets-alist}.
@@ -5234,13 +5234,13 @@ This command changes the entry for a syntactic symbol 
in the current
 binding of @code{c-offsets-alist}, or it inserts a new entry if there
 isn't already one for that syntactic symbol.
 
-You can use @code{c-set-offsets} interactively within a @ccmode{}
+You can use @code{c-set-offset} interactively within a @ccmode{}
 buffer to make experimental changes to your indentation settings.
 @kbd{C-c C-o} prompts you for the syntactic symbol to change
 (defaulting to that of the current line) and the new offset
 (defaulting to the current offset).
 
address@hidden takes two arguments when used programmatically:
address@hidden takes two arguments when used programmatically:
 @var{symbol}, the syntactic element symbol to change and @var{offset},
 the new offset for that syntactic element.  You can call the command
 in your @file{.emacs} to change the global binding of
diff --git a/doc/misc/cl.texi b/doc/misc/cl.texi
index 1f38ca9..0ab2477 100644
--- a/doc/misc/cl.texi
+++ b/doc/misc/cl.texi
@@ -2937,7 +2937,7 @@ error if the argument is not an integer.
 
 @defun cl-digit-char-p char radix
 Test if @var{char} is a digit in the specified @var{radix} (default is
-10).  If true return the decimal value of digit @var{char} in
+10).  If it is, return the numerical value of digit @var{char} in
 @var{radix}.
 @end defun
 
@@ -3027,9 +3027,10 @@ of @code{cl-truncate}.
 This function implements the Common Lisp @code{parse-integer}
 function.  It parses an integer in the specified @var{radix} from the
 substring of @var{string} between @var{start} and @var{end}.  Any
-leading and trailing whitespace chars are ignored. It signals an error
-if the substring between @var{start} and @var{end} cannot be parsed as
-an integer unless @var{junk-allowed} is non-nil.
+leading and trailing whitespace chars are ignored.  The function
+signals an error if the substring between @var{start} and @var{end}
+cannot be parsed as an integer, unless @var{junk-allowed} is
address@hidden
 @end defun
 
 @node Random Numbers
diff --git a/doc/misc/ert.texi b/doc/misc/ert.texi
index 35d315c..c236323 100644
--- a/doc/misc/ert.texi
+++ b/doc/misc/ert.texi
@@ -283,6 +283,15 @@ with a zero exit status if all tests passed, or nonzero if 
any tests
 failed or if anything else went wrong.  It will also print progress
 messages and error diagnostics to standard output.
 
+You can also redirect the above output to a log file, say
address@hidden, and use the
address@hidden function to produce a neat
+summary as shown below:
+
address@hidden
+emacs -batch -l ert -f ert-summarize-tests-batch-and-exit output.log
address@hidden example
+
 If ERT is not part of your Emacs distribution, you may need to use
 @code{-L /path/to/ert/} so that Emacs can find it.  You may need
 additional @code{-L} flags to ensure that @code{my-tests.el} and all the
diff --git a/doc/misc/eudc.texi b/doc/misc/eudc.texi
index 33c9a0e..8d59e97 100644
--- a/doc/misc/eudc.texi
+++ b/doc/misc/eudc.texi
@@ -9,11 +9,10 @@
 @c %**end of header
 
 @copying
-This file documents EUDC v1.30b.
+This file documents EUDC version 1.40.0.
 
 EUDC is the Emacs Unified Directory Client, a common interface to
-directory servers using various protocols such as LDAP or the CCSO white
-pages directory system (PH/QI)
+directory servers and contact information.
 
 Copyright @copyright{} 1998, 2000--2015 Free Software Foundation, Inc.
 
@@ -32,7 +31,7 @@ modify this GNU manual.''
 
 @dircategory Emacs network features
 @direntry
-* EUDC: (eudc).                 Emacs client for directory servers (LDAP, PH).
+* EUDC: (eudc).                 Emacs client for directory servers (LDAP, 
BBDB).
 @end direntry
 
 @footnotestyle end
@@ -41,7 +40,7 @@ modify this GNU manual.''
 @title EUDC Manual
 @subtitle The Emacs Unified Directory Client
 @author by Oscar Figueiredo
address@hidden
address@hidden
 
 @page
 @vskip 0pt plus 1fill
@@ -83,8 +82,6 @@ Currently supported back-ends are:
 @item
 LDAP, Lightweight Directory Access Protocol
 @item
-CCSO PH/QI
address@hidden
 BBDB, Big Brother's Insidious Database
 @end itemize
 
@@ -109,7 +106,6 @@ Interface to BBDB to let you insert server records into 
your own BBDB database
 
 @menu
 * LDAP::                        What is LDAP ?
-* CCSO PH/QI::                  What is CCSO, PH, QI ?
 * BBDB::                        What is BBDB ?
 @end menu
 
@@ -141,30 +137,6 @@ EUDC requires external support to access LDAP directory 
servers
 (@pxref{LDAP Configuration})
 
 
address@hidden CCSO PH/QI
address@hidden CCSO PH/QI
-
-The Central Computing Services Office (CCSO) of the University of
-Illinois at Urbana Champaign created and freely distributed a
-directory system that was used by many organizations in the 1990s.
-The system records information about people such as their address,
-phone number, email, academic information or any other details it was
-configured to.  Nowadays this system is not widely used.
-
-The system consists of two parts: a database server traditionally called
address@hidden and a command-line client called @samp{ph}.
address@hidden
-Until 2010, the code could be downloaded from
address@hidden://www-dev.cites.uiuc.edu/ph/}.
address@hidden ignore
-
-The original command-line @samp{ph} client that came with the
address@hidden/qi} distribution provided additional features that are
-not implemented in EUDC, like the possibility to communicate with the
-server in login-mode, which made it possible to change records in the
-database.
-
-
 @node BBDB
 @section BBDB
 
@@ -175,14 +147,14 @@ and news readers.
 
 It is often used as an enhanced email address book.
 
-EUDC considers BBDB as a directory server back end just like LDAP or
-PH/QI servers, though BBDB has no client/server protocol and thus always
-resides locally on your machine.  The point in this is not to offer an
+EUDC considers BBDB as a directory server back end just like LDAP,
+though BBDB has no client/server protocol and thus always resides
+locally on your machine.  The point in this is not to offer an
 alternate way to query your BBDB database (BBDB itself provides much
-more flexible ways to do that), but rather to offer an interface to your
-local directory that is consistent with the interface to external
-directories (LDAP, PH/QI).  This is particularly interesting when
-performing queries on multiple servers.
+more flexible ways to do that), but rather to offer an interface to
+your local directory that is consistent with the interface to external
+LDAP directories.  This is particularly interesting when performing
+queries on multiple servers.
 
 EUDC also offers a means to insert results from directory queries into
 your own local BBDB (@pxref{Creating BBDB Records})
@@ -473,7 +445,7 @@ it will be ignored anyway.
 
 @defvar eudc-protocol
 The directory protocol to use to query the server.  Currently supported
-protocols in this version of EUDC are @code{ph}, @code{ldap} and @code{bbdb}.
+protocols in this version of EUDC are @code{ldap} and @code{bbdb}.
 @end defvar
 
 @deffn Command eudc-set-server
@@ -510,11 +482,8 @@ attributes are ignored.  Default is @code{t}.
 
 Directory standards may authorize different instances of the same
 attribute in a record. For instance the record of a person may contain
-several email fields containing different email addresses. When using
-a QI directory server this is difficult to distinguish from attributes
-having multi-line values such as the postal address that may contain a
-line for the street and another one for the zip code and city name. In
-both cases, EUDC will consider the attribute duplicated.
+several email fields containing different email addresses, in which
+case EUDC will consider the attribute duplicated.
 
 EUDC has several methods to deal with duplicated attributes. The
 available methods are:
@@ -956,39 +925,6 @@ convenience functions to parse phones and addresses.
 @end table
 @end defvar
 
-The default value of the PH-specific value of that variable is
address@hidden:
-
address@hidden
-((name . name)
- (net . email)
- (address . (eudc-bbdbify-address address "Address"))
- (phone . ((eudc-bbdbify-phone phone "Phone")
-           (eudc-bbdbify-phone office_phone "Office Phone"))))
address@hidden lisp
-
-This means that:
-
address@hidden @bullet
address@hidden
-the @code{name} field of the BBDB record gets its value
-from the @code{name} attribute of the directory record
address@hidden
-the @code{net} field of the BBDB record gets its value
-from the @code{email} attribute of the directory record
address@hidden
-the @code{address} field of the BBDB record is obtained by parsing the
address@hidden attribute of the directory record with the function
address@hidden
address@hidden
-two @code{phone} fields are created (when possible) in the BBDB record.
-The first one has @cite{Phone} for location and its value is obtained by
-parsing the @code{phone} attribute of the PH/QI record with the function
address@hidden  The second one has @cite{Office Phone} for location
-its value is obtained by parsing the @code{office_phone} attribute of the
-PH/QI record with the function @code{eudc-bbdbify-phone}.
address@hidden itemize
-
 @defun eudc-bbdbify-phone phone location
 This is a convenience function provided for use in
 @code{eudc-bbdb-conversion-alist}.  It parses @var{phone} into a vector
diff --git a/doc/misc/ido.texi b/doc/misc/ido.texi
index afc3238..e06d248 100644
--- a/doc/misc/ido.texi
+++ b/doc/misc/ido.texi
@@ -706,7 +706,8 @@ packages.
 @noindent
 After @kbd{C-x b} (@code{ido-switch-buffer}), the buffer at the head
 of the list can be killed by pressing @kbd{C-k}.  If the buffer needs
-saving, you will be queried before the buffer is killed.
+saving, you will be queried before the buffer is killed.  @kbd{C-S-b}
+buries the buffer at the head of the list.
 
 Likewise, after @kbd{C-x C-f}, you can delete (i.e., physically
 remove) the file at the head of the list with @kbd{C-k}.  You will
diff --git a/doc/misc/ses.texi b/doc/misc/ses.texi
index 2f92e3e..fe6d5ab 100644
--- a/doc/misc/ses.texi
+++ b/doc/misc/ses.texi
@@ -377,6 +377,7 @@ Undo previous action (@code{(undo)}).
 @findex ses-read-cell-printer
 @findex ses-read-column-printer
 @findex ses-read-default-printer
address@hidden ses-define-local-printer
 @findex ses-center
 @findex ses-center-span
 @findex ses-dashfill
@@ -435,13 +436,43 @@ Centering with dashes and spill-over.
 Centering with tildes (~) and spill-over.
 @end table
 
-You can define printer function local to a sheet with command
address@hidden For instance define printer
address@hidden to @code{"%.2f"} and then use symbol @samp{foo} as a
-printer function. Then, if you call again
+You can define printer function local to a sheet with the command
address@hidden  For instance, define a printer
address@hidden to @code{"%.2f"}, and then use symbol @samp{foo} as a
+printer function.  Then, if you call again
 @code{ses-define-local-printer} on @samp{foo} to redefine it as
address@hidden"%.3f"} all the cells using printer @samp{foo} will be reprinted
-accordingly.
address@hidden"%.3f"}, all the cells using printer @samp{foo} will be
+reprinted accordingly.
+
+When you define a printer function with a lambda expression taking one
+argument, please take care that the returned value is a string, or a
+list containing a string, even when the input argument has an
+unexpected value. Here is an example:
+
address@hidden
+(lambda (val)
+   (cond
+      ((null val) "")
+      ((and (numberp val) (>= val 0)) (format "%.1f" val))
+      (t (ses-center-span (format "%S" val) ?#))))
address@hidden example
+
+This example will:
address@hidden
address@hidden
+When the cell is empty (ie.@: when @code{val} is @code{nil}), print an
+empty string @code{""}
address@hidden
+When the cell value is a non negative number, format the the value in
+fixed-point notation with one decimal after point
address@hidden
+Otherwise, handle the value as erroneous by printing it as an
+s-expression (using @code{prin1}), centered and surrounded by @code{#}
+filling.
address@hidden itemize
+
+
+
 
 @node Clearing cells
 @section Clearing cells
diff --git a/doc/misc/texinfo.tex b/doc/misc/texinfo.tex
index f555ce3..34fd353 100644
--- a/doc/misc/texinfo.tex
+++ b/doc/misc/texinfo.tex
@@ -3,7 +3,7 @@
 % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %
-\def\texinfoversion{2015-10-29.16}
+\def\texinfoversion{2015-12-17.20}
 %
 % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
@@ -158,22 +158,10 @@
 \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
 \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
 
-% Since the category of space is not known, we have to be careful.
-\chardef\spacecat = 10
-\def\spaceisspace{\catcode`\ =\spacecat}
+% Give the space character the catcode for a space.
+\def\spaceisspace{\catcode`\ =10\relax}
 
-% sometimes characters are active, so we need control sequences.
-\chardef\ampChar   = `\&
-\chardef\colonChar = `\:
-\chardef\commaChar = `\,
 \chardef\dashChar  = `\-
-\chardef\dotChar   = `\.
-\chardef\exclamChar= `\!
-\chardef\hashChar  = `\#
-\chardef\lquoteChar= `\`
-\chardef\questChar = `\?
-\chardef\rquoteChar= `\'
-\chardef\semiChar  = `\;
 \chardef\slashChar = `\/
 \chardef\underChar = `\_
 
@@ -271,11 +259,18 @@
 %
 % Another complication is to let the user choose whether \thischapter
 % (\thissection) refers to the chapter (section) in effect at the top
-% of a page, or that at the bottom of a page.  The solution is
-% described on page 260 of The TeXbook.  It involves outputting two
-% marks for the sectioning macros, one before the section break, and
-% one after.  I won't pretend I can describe this better than DEK...
-%
+% of a page, or that at the bottom of a page.
+
+% \domark is called twice inside \chapmacro, to add one
+% mark before the section break, and one after.
+%   In the second call \prevchapterdefs is the same as \lastchapterdefs,
+% and \prevsectiondefs is the same as \lastsectiondefs.
+%   Then if the page is not broken at the mark, some of the previous
+% section appears on the page, and we can get the name of this section
+% from \firstmark for @everyheadingmarks top.
+%   @everyheadingmarks bottom uses \botmark.
+%
+% See page 260 of The TeXbook.
 \def\domark{%
   \toks0=\expandafter{\lastchapterdefs}%
   \toks2=\expandafter{\lastsectiondefs}%
@@ -283,13 +278,14 @@
   \toks6=\expandafter{\prevsectiondefs}%
   \toks8=\expandafter{\lastcolordefs}%
   \mark{%
-                   \the\toks0 \the\toks2  % 0: top marks (\last...)
-      \noexpand\or \the\toks4 \the\toks6  % 1: bottom marks (default, \prev...)
+                   \the\toks0 \the\toks2  % 0: marks for @everyheadingmarks top
+      \noexpand\or \the\toks4 \the\toks6  % 1: for @everyheadingmarks bottom
     \noexpand\else \the\toks8             % 2: color marks
   }%
 }
 
-% \gettopheadingmarks, \getbottomheadingmarks - extract needed part of mark.
+% \gettopheadingmarks, \getbottomheadingmarks,
+% \getcolormarks - extract needed part of mark.
 %
 % \topmark doesn't work for the very first chapter (after the title
 % page or the contents), so we use \firstmark there -- this gets us
@@ -345,28 +341,21 @@
   % values in \headline and \footline.
   %
   % This is used to check if we are on the first page of a chapter.
-  \ifcase0\topmark\fi
-  \ifx\thischapter\empty
-    % See comment for \gettopheadingmarks
-    \ifcase0\firstmark\fi
-    \let\curchaptername\thischaptername
-    \ifcase1\firstmark\fi
-    \let\prevchaptername\thischaptername
-  \else
-    \let\curchaptername\thischaptername
-    \ifcase1\topmark\fi
-    \let\prevchaptername\thischaptername
-  \fi
+  \ifcase1\topmark\fi
+  \let\prevchaptername\thischaptername
+  \ifcase0\firstmark\fi
+  \let\curchaptername\thischaptername
   %
   \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
   \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
   %
   \ifx\curchaptername\prevchaptername
+    \let\thischapterheading\thischapter
   \else
-    % If on the first page of a chapter, clear @thischapter so it
-    % doesn't appear in the headline, because the chapter is already
-    % shown in the chapter heading.
-    \def\thischapter{}%
+    % \thischapterheading is the same as \thischapter except it is blank
+    % for the first page of a chapter.  This is to prevent the chapter name 
+    % being shown twice.
+    \def\thischapterheading{}%
   \fi
   %
   \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}%
@@ -1164,8 +1153,8 @@ output) for that.)}
   \def\rgbDarkRed{0.50 0.09 0.12}
   \def\rgbBlack{0 0 0}
   %
-  % k sets the color for filling (usual text, etc.);
-  % K sets the color for stroking (thin rules, e.g., normal _'s).
+  % rg sets the color for filling (usual text, etc.);
+  % RG sets the color for stroking (thin rules, e.g., normal _'s).
   \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
   %
   % Set color, and create a mark which defines \thiscolor accordingly,
@@ -1416,7 +1405,6 @@ output) for that.)}
       \normalturnoffactive
       address@hidden@}%
       \let\/=\empty
-      \let\xprocessmacroarg=\eatspaces % in case we are in a macro expansion
       \makevalueexpandable
       % do we want to go so far as to use \indexnofonts instead of just
       % special-casing \var here?
@@ -2452,8 +2440,8 @@ end
 %
 address@hidden
   \def\plainfrenchspacing{%
-    \sfcode\dotChar  address@hidden address@hidden address@hidden
-    address@hidden \sfcode\semiChar address@hidden \sfcode\commaChar 
address@hidden
+    address@hidden address@hidden address@hidden
+    \sfcode`\:address@hidden \sfcode`\;address@hidden \sfcode`\,address@hidden
     \def\endofsentencespacefactor{1000}% for @. and friends
   }
   \def\plainnonfrenchspacing{%
@@ -2641,9 +2629,9 @@ end
 
 % Allow line breaks around only a few characters (only).
 \def\urefcatcodes{%
-  \catcode\ampChar=\active   \catcode\dotChar=\active
-  \catcode\hashChar=\active  \catcode\questChar=\active
-  \catcode\slashChar=\active
+  \catcode`\&=\active \catcode`\.=\active
+  \catcode`\#=\active \catcode`\?=\active
+  \catcode`\/=\active
 }
 {
   \urefcatcodes
@@ -2852,23 +2840,24 @@ end
 \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
 %
 \def\math{%
-  \tex
-  \mathunderscore
-  \let\\ = \mathbackslash
-  \mathactive
-  % make the texinfo accent commands work in math mode
-  \let\"=\ddot
-  \let\'=\acute
-  \let\==\bar
-  \let\^=\hat
-  \let\`=\grave
-  \let\u=\breve
-  \let\v=\check
-  \let\~=\tilde
-  \let\dotaccent=\dot
-  % have to provide another name for sup operator
-  \let\mathopsup=\sup
-  $\finishmath
+  \ifmmode\else % only go into math if not in math mode already
+    \tex
+    \mathunderscore
+    \let\\ = \mathbackslash
+    \mathactive
+    % make the texinfo accent commands work in math mode
+    \let\"=\ddot
+    \let\'=\acute
+    \let\==\bar
+    \let\^=\hat
+    \let\`=\grave
+    \let\u=\breve
+    \let\v=\check
+    \let\~=\tilde
+    \let\dotaccent=\dot
+    % have to provide another name for sup operator
+    \let\mathopsup=\sup
+  $\expandafter\finishmath\fi
 }
 \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
 
@@ -3517,7 +3506,7 @@ end
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
 \global\let\contentsalignmacro = \chapoddpage
 }
 \let\contentsalignmacro = \chappager
@@ -3528,8 +3517,8 @@ end
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
 \global\let\contentsalignmacro = \chappager
 }
 \def\HEADINGSon{\HEADINGSdouble}
@@ -3540,7 +3529,7 @@ end
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
 \global\let\contentsalignmacro = \chapoddpage
 }
 
@@ -3548,8 +3537,8 @@ end
 \def\HEADINGSsinglex{%
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
 \global\let\contentsalignmacro = \chappager
 }
 
@@ -4676,16 +4665,6 @@ end
   \definedummyword\verb
   \definedummyword\w
   \definedummyword\xref
-  %
-  % Consider:
-  %   @macro mkind{arg1,arg2}
-  %   @cindex \arg2\
-  %   @end macro
-  %   @mkind{foo, bar}
-  % The space after the comma will end up in the temporary definition
-  % that we make for arg2 (see \parsemargdef ff.).  We want all this to be
-  % expanded for the sake of the index, so we end up just seeing "bar".
-  \let\xprocessmacroarg\eatspaces
 }
 
 % For testing: output @{ and @} in index sort strings as \{ and \}.
@@ -5212,16 +5191,12 @@ end
     % from @* into spaces.  The user might give these in long section
     % titles, for instance.
     \def\*{\unskip\space\ignorespaces}%
-    \def\entrybreak{\hfil\break}%
+    \def\entrybreak{\hfil\break}% An undocumented command
     %
     % A bit of stretch before each entry for the benefit of balancing
     % columns.
     \vskip 0pt plus0.5pt
     %
-    % Badness calculation for paragraph affected by -
-    %  How much \indexdotfill is stretched, or how much \parfillskip is shrunk
-    %  Number of lines (\linepenalty)
-    %  
     % Swallow the left brace of the text (first parameter):
     \afterassignment\doentry
     \let\temp =
@@ -5255,16 +5230,23 @@ end
       %
       \ifpdf
         \pdfgettoks#1.%
-        \hskip\skip\thinshrinkable\the\toksA
+        \bgroup\let\domark\relax
+          \hskip\skip\thinshrinkable\the\toksA
+        \egroup
+        % The redefinion of \domark stops marks being added in \pdflink to 
+        % preserve coloured links across page boundaries.  Otherwise the marks
+        % would get in the way of \lastbox in \insertindexentrybox.
       \else
         \hskip\skip\thinshrinkable #1%
       \fi
     \fi
     \egroup % end \boxA
     \ifdim\wd\boxB = 0pt
-      \global\setbox\entryindexbox=\box\boxA
+      \global\setbox\entryindexbox=\vbox{\unhbox\boxA}%
     \else
-    \global\setbox\entryindexbox=\vbox\bgroup\noindent
+    \global\setbox\entryindexbox=\vbox\bgroup
+      \prevdepth=\entrylinedepth
+      \noindent
       % We want the text of the entries to be aligned to the left, and the
       % page numbers to be aligned to the right.
       %
@@ -5333,10 +5315,21 @@ end
 
 \newbox\entryindexbox
 \def\insertindexentrybox{%
-\lineskip=.7ex plus .5ex % This comes into effect when the \vbox has a large 
-                         % height due to the paragraph in it having several 
-                         % lines.
-\box\entryindexbox}
+  \copy\entryindexbox
+  % The following gets the depth of the last box.  This is for even
+  % line spacing when entries span several lines.
+  \setbox\dummybox\vbox{%
+    \unvbox\entryindexbox
+    \nointerlineskip
+    \lastbox
+    \global\entrylinedepth=\prevdepth
+  }%
+  % Note that we couldn't simply \unvbox\entryindexbox followed by 
+  % \nointerlineskip\lastbox to remove the last box and then reinstate it, 
+  % because this resets how far the box has been \moveleft'ed to 0.  \unvbox
+  % doesn't affect \prevdepth either.
+}
+\newdimen\entrylinedepth
 
 % Default is no penalty
 \let\entryorphanpenalty\egroup
@@ -5387,16 +5380,35 @@ end
 % Define two-column mode, which we use to typeset indexes.
 % Adapted from the TeXbook, page 416, which is to say,
 % the manmac.tex format used to print the TeXbook itself.
address@hidden
address@hidden  % private names
 
 \newbox\partialpage
 \newdimen\doublecolumnhsize
 \newdimen\doublecolumntopgap
 \doublecolumntopgap = 0pt
 
-\newtoks\savedtopmark % Used in \begindoublecolumns
+% Use inside an output routine to save \topmark and \firstmark
+\def\savemarks{%
+  \global\savedtopmark=\expandafter{\topmark }%
+  \global\savedfirstmark=\expandafter{\firstmark }%
+}
+\newtoks\savedtopmark
 \newtoks\savedfirstmark
 
+% Set \topmark and \firstmark for next time \output runs.
+% Can't be run from withinside \output (because any material
+% added while an output routine is active, including 
+% penalties, is saved for after it finishes).  The page so far
+% should be empty, otherwise what's on it will be thrown away.
+\def\restoremarks{%
+  \mark{\the\savedtopmark}%
+  \bgroup\output = {%
+    \setbox\dummybox=\box\PAGE
+  }abc\eject\egroup
+  % "abc" because output routine doesn't fire for a completely empty page.
+  \mark{\the\savedfirstmark}%
+}
+
 \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
   % Grab any single-column material above us.
   \output = {%
@@ -5417,22 +5429,15 @@ end
       \unvbox\PAGE
       \kern-\topskip \kern\baselineskip
     }%
-    % Save \topmark and \firstmark
-    \global\savedtopmark=\expandafter{\topmark}%
-    \global\savedfirstmark=\expandafter{\firstmark}%
+    \savemarks
   }%
   \eject % run that output routine to set \partialpage
+  \restoremarks
   %
   % We recover the two marks that the last output routine saved in order
   % to propagate the information in marks added around a chapter heading,
   % which could be otherwise be lost by the time the final page is output.
   %
-  \mark{\the\savedtopmark}% Only mark in page passed to following \output.
-  \output = {%
-    \setbox0=\box\PAGE % clear box 255
-  }abc\eject
-  %
-  \mark{\the\savedfirstmark}%
   %
   % Use the double-column output routine for subsequent pages.
   \output = {\doublecolumnout}%
@@ -5465,12 +5470,14 @@ end
   \global\advance\vsize by -1\doublecolumntopgap
   \vsize = 2\vsize
   \topskip=0pt
+  \global\entrylinedepth=0pt\relax
 }
 
 % The double-column output routine for all double-column pages except
 % the last, which is done by \balancecolumns.
 %
 \def\doublecolumnout{%
+  %
   \splittopskip=\topskip \splitmaxdepth=\maxdepth
   % Get the available space for the double columns -- the normal
   % (undoubled) page height minus any material left over from the
@@ -5532,6 +5539,7 @@ end
   \output = {%
     % Split the last of the double-column material.  Leave it on the
     % current page, no automatic page break.
+    \savemarks
     \balancecolumns
     %
     % If we end up splitting too much material for the current page,
@@ -5545,6 +5553,8 @@ end
   }%
   \eject
   \endgroup % started in \begindoublecolumns
+  \restoremarks
+  \box\balancedcolumns
   %
   % \pagegoal was set to the doubled \vsize above, since we restarted
   % the current page.  We're now back to normal single-column
@@ -5552,6 +5562,8 @@ end
   % \endgroup where \vsize got restored).
   \pagegoal = \vsize
 }
+\newbox\balancedcolumns
+\setbox\balancedcolumns=\vbox{shouldnt see this}%
 %
 % Only called for the last of the double column material.  \doublecolumnout 
 % does the others.
@@ -5595,7 +5607,7 @@ end
     \fi
   \fi
   %
-  \pagesofar
+  \global\setbox\balancedcolumns=\vbox{\pagesofar}%
 }
 \catcode`\@ = \other
 
@@ -7612,8 +7624,7 @@ end
 % Argument is macro body with arguments substituted
 \def\scanmacro#1{%
   \newlinechar`\^^M
-  % Reduce doubled backslashes to one
-  \def\xprocessmacroarg{\passargtomacro\eatspaces}%
+  \def\xprocessmacroarg{\eatspaces}%
   %
   % Process the macro body under the current catcode regime.
   \scantokens{#1\texinfoc}\aftermacro%
@@ -7629,6 +7640,7 @@ end
   % to allow macros to open or close groups themselves.
 }
 
+% Used for copying and captions
 \def\scanexp#1{%
   \bgroup
   % Undo catcode changes of \startcontents and \printindex
@@ -7733,6 +7745,7 @@ end
 % an argument to another Texinfo command.
 \def\macroargctxt{%
   \scanctxt
+  \catcode`\ =\active
   \catcode`\^^M=\other
   \catcode`\\=\active
 }
@@ -8127,16 +8140,23 @@ end
          \egroup\noexpand\scanmacro{\macrobody}}%
     \else
       \ifnum\paramno<10\relax % at most 9
+        % See non-recursive section below for comments
         \expandafter\xdef\csname\the\macname\endcsname{%
-           \bgroup\noexpand\macroargctxt
-           \noexpand\csname\the\macname @@\endcsname}%
+          \bgroup
+          \noexpand\expandafter
+          \noexpand\macroargctxt
+          \noexpand\expandafter
+          \expandafter\noexpand\csname\the\macname @@\endcsname}%
         \expandafter\xdef\csname\the\macname @@\endcsname##1{%
-            \expandafter\noexpand\csname\the\macname @@@\endcsname ##1,}%
+            \noexpand\passargtomacro
+            \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
+        \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+            \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
         \expandafter\expandafter
         \expandafter\xdef
         \expandafter\expandafter
-          \csname\the\macname @@@\endcsname
-            \paramlist{\egroup\noexpand\scanmacro{\macrobody}}%
+          \csname\the\macname @@@@\endcsname\paramlist{%
+            \egroup\noexpand\scanmacro{\macrobody}}%
       \else % 10 or more
         \expandafter\xdef\csname\the\macname\endcsname{%
           address@hidden
@@ -8166,19 +8186,27 @@ end
         }%
     \else % at most 9
       \ifnum\paramno<10\relax
+        % @MACNAME sets the context for reading the macro argument
+        % @MACNAME@@ gets the argument, processes backslashes and appends a 
+        % comma.
+        % @MACNAME@@@ removes braces surrounding the argument list.
+        % @MACNAME@@@@ scans the macro body with arguments substituted.
         \expandafter\xdef\csname\the\macname\endcsname{%
-           \bgroup\noexpand\macroargctxt
-           \expandafter\noexpand\csname\the\macname @@\endcsname}%
+          \bgroup
+          \noexpand\expandafter  % This \expandafter skip any spaces after the
+          \noexpand\macroargctxt % macro before we change the catcode of space.
+          \noexpand\expandafter
+          \expandafter\noexpand\csname\the\macname @@\endcsname}%
         \expandafter\xdef\csname\the\macname @@\endcsname##1{%
-            \expandafter\noexpand\csname\the\macname @@@\endcsname ##1,}%
+            \noexpand\passargtomacro
+            \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
+        \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+            \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
         \expandafter\expandafter
         \expandafter\xdef
         \expandafter\expandafter
-        \csname\the\macname @@@\endcsname
-        \paramlist{%
-            \egroup
-            \noexpand\scanmacro{\macrobody}%
-            }%
+          \csname\the\macname @@@@\endcsname\paramlist{%
+            \egroup\noexpand\scanmacro{\macrobody}}%
       \else % 10 or more:
         \expandafter\xdef\csname\the\macname\endcsname{%
           address@hidden
@@ -8194,71 +8222,96 @@ end
 \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
 
 
address@hidden \catcode`\\=13
address@hidden@_=11
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
address@hidden \catcode`\\=13  % We need to manipulate \ so use @ as escape
address@hidden@_=11  % private names
address@hidden@!=11  % used as argument separator
 
+% \passargtomacro#1#2 -
 % Call #1 with a list of tokens #2, with any doubled backslashes in #2
 % compressed to one.
+%
+% This implementation works by expansion, and not execution (so we cannot use 
+% \def or similar).  This reduces the risk of this failing in contexts where 
+% complete expansion is done with no execution (for example, in writing out to 
+% an auxiliary file for an index entry).
+% 
+% State is kept in the input stream: the argument passed to
+% @look_ahead, @gobble_and_check_finish and @add_segment is
+%
+% THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN  (... rest of input)
+%
+% where:
+% THE_MACRO - name of the macro we want to call
+% ARG_RESULT - argument list we build to pass to that macro
+% PENDING_BS - either a backslash or nothing
+% NEXT_TOKEN - used to look ahead in the input stream to see what's coming next
+
 @address@hidden
-  @address@hidden
-  @address@hidden
-  @address@hidden@finish}%
-  @address@hidden
-  @address@hidden@relax
-  @address@hidden
-}
-
-% Input stream is just after a backslash.  If the next token is not a
-% backslash, process the rest of the argument; otherwise, remove the next
-% token.
address@hidden@look_ahead{%
-  @address@hidden@look_aheadzzz}
address@hidden@look_aheadzzz{%
-  @address@hidden
-   @address@hidden@gobble_and_check_finish 
-  @else
-   @address@hidden@add_segment
-  @address@hidden
+  @add_segment address@hidden@_finish\%
 }
address@hidden@address@hidden @address@hidden@address@hidden
 
-% Double backslash found.  Add a single backslash here.
address@hidden@gobble_and_check_finish#1{%
-  @add_the_backslash
-  @address@hidden
-  @address@hidden@add_segment
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 used to look ahead
+%
+% If the next token is not a backslash, process the rest of the argument; 
+% otherwise, remove the next token.
address@hidden@look_ahead#1!#2#3#4{%
+  @ifx#4\%
+   @address@hidden 
+  @else
+   @address@hidden
+  @fi#1!{#2}#4#4%
 }
 
-% append a backslash to \arg_result
address@hidden@add_the_backslash{%
-  @address@hidden@address@hidden@address@hidden
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 should be a backslash, which is gobbled.
+% #5 looks ahead
+%
+% Double backslash found.  Add a single backslash, and look ahead.
address@hidden@gobble_and_check_finish#1!#2#3#4#5{%
+  @add_segment#1\!{}#5#5%
 }
 
address@hidden@address@hidden
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 is input stream until next backslash
+%
 % Input stream is either at the start of the argument, or just after a 
 % backslash sequence, either a lone backslash, or a doubled backslash.  
-% \next_token contains the first token in the input stream: if it is \finish, 
-% finish; otherwise, append to \arg_result the segment of the argument up until
-% the next backslash.  \pending_backslash contains a backslash to represent
+% NEXT_TOKEN contains the first token in the input stream: if it is \finish, 
+% finish; otherwise, append to ARG_RESULT the segment of the argument up until
+% the next backslash.  PENDING_BACKSLASH contains a backslash to represent
 % a backslash just before the start of the input stream that has not been
-% added to \arg_result.
address@hidden@add_segment#1\{%
address@hidden@address@hidden
-  @address@hidden@call_the_macro%
+% added to ARG_RESULT.
address@hidden@add_segment#1!#2#3#4\{%
address@hidden@_finish
+  @call_the_macro#1!%
 @else
-  @address@hidden@look_ahead
-  %
-  % append to @arg_result
-  % token list registers might be better
-  @address@hidden@address@hidden
-  @address@hidden@address@hidden
-  @address@hidden@expandafter{%
-  @address@hidden
-  @pending_backslash#1}%
-  @address@hidden
address@hidden@next}
+  % append the pending backslash to the result, followed by the next segment
+  @address@hidden@address@hidden
+  % this @fi is discarded by @look_ahead.
+  % we can't get rid of it with \expandafter because we don't know how 
+  % long #4 is.
+}
 
address@hidden@address@hidden@address@hidden@arg_result}}
+% #1 - THE_MACRO
+% #2 - ARG_RESULT
+% #3 discards the res of the conditional in @add_segment, and @is_fi ends the 
+% conditional.
address@hidden@address@hidden@is_fi #1{#2}}
 
 }
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 % \braceorline MAC is used for a one-argument macro MAC.  It checks
 % whether the next non-whitespace character is a {.  It sets the context
@@ -10818,11 +10871,12 @@ directory should work if nowhere else does.}
 % this is not a problem.
 \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
 
-% Turn off all special characters except @
-% (and those which the user can use as if they were ordinary).
+% Set catcodes for Texinfo file
+
+% Active characters for printing the wanted glyph.
 % Most of these we simply print from the \tt font, but for some, we can
 % use math or other variants that look better in normal text.
-
+%
 \catcode`\"=\active
 \def\activedoublequote{{\tt\char34}}
 \let"=\activedoublequote
@@ -10832,12 +10886,10 @@ directory should work if nowhere else does.}
 
 \catcode`\_=\active
 \def_{\ifusingtt\normalunderscore\_}
-\let\realunder=_
-% Subroutine for the previous macro.
 \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+\let\realunder=_
 
-\catcode`\|=\active
-\def|{{\tt\char124}}
+\catcode`\|=\active \def|{{\tt\char124}}
 
 \chardef \less=`\<
 \catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 07d34bd..bd7d921 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -98,6 +98,7 @@ copy and modify this GNU manual.''
 
 @contents
 
+
 @ifnottex
 @node Top, Overview, (dir), (dir)
 @top @value{tramp} version @value{trampver} User Manual
@@ -176,7 +177,9 @@ For the end user:
 
 For the developer:
 
-* Files directories and localnames::  How file names, directories and 
localnames are mangled and managed.
+* Files directories and localnames::
+                                How file names, directories and localnames
+                                  are mangled and managed.
 * Traces and Profiles::         How to Customize Traces.
 * Issues::                      Debatable Issues and What Was Decided.
 
@@ -198,7 +201,7 @@ Installing @value{tramp} with your @value{emacsname}
 
 Configuring @value{tramp} for use
 
-* Connection types::            Types of connections made to remote hosts.
+* Connection types::            Types of connections to remote hosts.
 * Inline methods::              Inline methods.
 * External methods::            External methods.
 @ifset emacsgvfs
@@ -246,149 +249,138 @@ How file names, directories and localnames are mangled 
and managed
 @chapter An overview of @value{tramp}
 @cindex overview
 
-After the installation of @value{tramp} into your @value{emacsname}, you
-will be able to access files on remote hosts as though they were
-local.  Access to the remote file system for editing files, version
-control, and @code{dired} are transparently enabled.
-
-Your access to the remote host can be with the @command{rsh},
address@hidden, @command{telnet} programs or with any similar
-connection method.  This connection must pass @acronym{ASCII}
-successfully to be usable but need not be 8-bit clean.
-
-The package provides support for @command{ssh} connections out of the
-box, one of the more common uses of the package.  This allows
-relatively secure access to hosts, especially if @command{ftp}
-access is disabled.
-
-Under Windows, @value{tramp} is integrated with the PuTTY package,
-using the @command{plink} program.
-
-The majority of activity carried out by @value{tramp} requires only that
-the remote login is possible and is carried out at the terminal.  In
-order to access remote files @value{tramp} needs to transfer their content
-to the local host temporarily.
-
address@hidden can transfer files between the hosts in a variety of ways.
-The details are easy to select, depending on your needs and the
-hosts in question.
-
-The fastest transfer methods for large files rely on a remote file
-transfer package such as @command{rcp}, @command{scp}, @command{rsync}
-or (under Windows) @command{pscp}.
-
-If the remote copy methods are not suitable for you, @value{tramp} also
-supports the use of encoded transfers directly through the shell.
-This requires that the @command{mimencode} or @command{uuencode} tools
-are available on the remote host.  These methods are generally
-faster for small files.
-
address@hidden is still under active development and any problems you encounter,
-trivial or major, should be reported to the @value{tramp} developers.
address@hidden Reports}.
address@hidden is for transparently accessing remote files from within
address@hidden  @value{tramp} enables an easy, convenient, and
+consistent interface to remote files as if they are local files.
address@hidden's transparency extends to editing, version control, and
address@hidden
+
address@hidden can access remote hosts using any number of access
+methods, such as @command{rsh}, @command{rlogin}, @command{telnet},
+and related programs.  If these programs can successfully pass
address@hidden characters, @value{tramp} can use them.
address@hidden does not require or mandate 8-bit clean connections.
+
address@hidden's most common access method is through @command{ssh}, a
+more secure alternative to @command{ftp} and other older access
+methods.
+
address@hidden on Windows operating systems is integrated with the
+PuTTY package, and uses the @command{plink} program.
+
address@hidden mostly operates transparently in the background using
+the connection programs.  As long as these programs enable remote login
+and can use the terminal, @value{tramp} can adapt them for seamless
+and transparent access.
+
address@hidden temporarily transfers a remote file's contents to the
+local host editing and related operations.  @value{tramp} can also
+transfer files between hosts using standard Emacs interfaces, a
+benefit of direct integration of @value{tramp} in @value{emacsname}.
+
address@hidden can transfer files using any number of available host
+programs for remote files, such as @command{rcp}, @command{scp},
address@hidden or (under Windows) @command{pscp}.  @value{tramp}
+provides easy ways to specify these programs and customize them to
+specific files, hosts, or access methods.
+
+For faster small-size file transfers, @value{tramp} supports encoded
+transfers directly through the shell using @command{mimencode} or
address@hidden provided such tools are available on the remote
+host.
 
 
address@hidden Behind the scenes
address@hidden @value{tramp} behind the scenes
 @cindex behind the scenes
 @cindex details of operation
 @cindex how it works
 
-This section tries to explain what goes on behind the scenes when you
-access a remote file through @value{tramp}.
+Accessing a remote file through @value{tramp} entails a series of
+actions, many of which are transparent to the user.  Yet some actions
+may require user response (such as entering passwords or completing
+file names).  One typical scenario, opening a file on a remote host, is
+presented here to illustrate the steps involved:
 
-Suppose you type @kbd{C-x C-f} and enter part of an @value{tramp} file name,
-then hit @address@hidden for completion.  Suppose further that this is
-the first time that @value{tramp} is invoked for the host in question.  Here's
-what happens:
address@hidden C-f} to initiate find-file, enter part of the @value{tramp}
+file name, then hit @address@hidden for completion.  If this is the
+first time connection to that host, here's what happens:
 
 @itemize
 @item
address@hidden discovers that it needs a connection to the host.  So it
-invokes @samp{telnet @var{host}} or @samp{rsh @var{host} -l
address@hidden or a similar tool to connect to the remote host.
-Communication with this process happens through an
address@hidden buffer, that is, the output from the remote end
-goes into a buffer.
address@hidden invokes @samp{telnet @var{host}} or @samp{rsh @var{host}
+-l @var{user}} and establishes an external process to connect to the
+remote host.  @value{tramp} communicates with the process through an
address@hidden buffer, which also shows output from the remote
+host.
 
 @item
-The remote host may prompt for a login name (for @command{telnet}).
-The login name is given in the file name, so @value{tramp} sends the
-login name and a newline.
+The remote host may prompt for a login name (for @command{telnet}, for
+example) in the buffer.  If on the other hand, the login name was
+included in the file name portion, @value{tramp} sends the login name
+followed by a newline.
 
 @item
-The remote host may prompt for a password or pass phrase (for
address@hidden or for @command{telnet} after sending the login name).
address@hidden displays the prompt in the minibuffer, asking you for the
-password or pass phrase.
-
-You enter the password or pass phrase.  @value{tramp} sends it to the remote
-host, followed by a newline.
+The remote host may then prompt for a password or pass phrase (for
address@hidden or for @command{telnet}).  @value{tramp} displays the
+password prompt in the minibuffer.  @value{tramp} then sends whatever
+is entered to the remote host, followed by a newline.
 
 @item
address@hidden now waits for the shell prompt or for a message that the login
-failed.
address@hidden now waits for either the shell prompt or a failed login
+message.
 
-If @value{tramp} sees neither of them after a certain period of time
-(a minute, say), then it issues an error message saying that it
-couldn't find the remote shell prompt and shows you what the remote
-host has sent.
+If @value{tramp} does not receive any messages within a timeout period
+(a minute, for example), then @value{tramp} responds with an error
+message about not finding the remote shell prompt.  If any messages
+from the remote host, @value{tramp} displays them in the buffer.
 
-If @value{tramp} sees a @samp{login failed} message, it tells you so,
-aborts the login attempt and allows you to try again.
+For any @samp{login failed} message from the remote host,
address@hidden aborts the login attempt, and repeats the login steps
+again.
 
 @item
-Suppose that the login was successful and @value{tramp} sees the shell prompt
-from the remote host.  Now @value{tramp} invokes @command{/bin/sh} because
-Bourne shells and C shells have different command
address@hidden @command{/bin/sh} will fail if your login
-shell doesn't recognize @samp{exec /bin/sh} as a valid command.
-Maybe you use the Scheme shell @address@hidden
+Upon successful login and @value{tramp} recognizes the shell prompt
+from the remote host, @value{tramp} prepares the shell environment by
+turning off echoing, setting shell prompt, and other housekeeping
+chores.
 
-After the Bourne shell has come up, @value{tramp} sends a few commands to
-ensure a good working environment.  It turns off echoing, it sets the
-shell prompt, and a few other things.
address@hidden that for the remote shell, @value{tramp} invokes
address@hidden/bin/sh}.  The remote host must recognize @samp{exec /bin/sh}
+and execute the appropriate shell.  This shell must support Bourne
+shell syntax.
 
 @item
-Now the remote shell is up and it good working order.  Remember, what
-was supposed to happen is that @value{tramp} tries to find out what files exist
-on the remote host so that it can do file name completion.
-
-So, @value{tramp} basically issues @command{cd} and @command{ls} commands and
-also sometimes @command{echo} with globbing.  Another command that is
-often used is @command{test} to find out whether a file is writable or a
-directory or the like.  The output of each command is parsed for the
-necessary operation.
address@hidden executes @command{cd} and @command{ls} commands to find
+which files exist on the remote host.  @value{tramp} sometimes uses
address@hidden with globbing.  @value{tramp} checks if a file or
+directory is writable with @command{test}.  After each command,
address@hidden parses the output from the remote host for completing
+the next operation.
 
 @item
-Suppose you are finished with file name completion, have entered @kbd{C-x
-C-f}, a full file name and hit @address@hidden  Now comes the time to
-transfer the file contents from the remote host to the local host so
-that you can edit them.
-
-See above for an explanation of how @value{tramp} transfers the file contents.
+After remote file name completion, @value{tramp} transfers the file
+contents from the remote host.
 
-For inline transfers, @value{tramp} issues a command like @samp{mimencode -b
-/path/to/remote/file}, waits until the output has accumulated in the
-buffer that's used for communication, then decodes that output to
-produce the file contents.
+For inline transfers, @value{tramp} sends a command, such as
address@hidden -b /path/to/remote/file}, waits until the output has
+accumulated in the buffer, decodes that output to produce the file's
+contents.
 
-For external transfers, @value{tramp} issues a command like the
-following:
+For external transfers, @value{tramp} sends a command as follows:
 @example
 rcp user@@host:/path/to/remote/file /tmp/tramp.4711
 @end example
-It then reads the local temporary file @file{/tmp/tramp.4711} into a
-buffer and deletes the temporary file.
address@hidden reads the local temporary file @file{/tmp/tramp.4711}
+into a buffer, and then deletes the temporary file.
 
 @item
-You now edit the buffer contents, blithely unaware of what has happened
-behind the scenes.  (Unless you have read this section, that is.)  When
-you are finished, you type @kbd{C-x C-s} to save the buffer.
+Edit, modify, change the buffer contents as normal, and then save the
+buffer wth @kbd{C-x C-s}.
 
 @item
-Again, @value{tramp} transfers the file contents to the remote host
-either inline or external.  This is the reverse of what happens when
-reading the file.
address@hidden transfers the buffer contents to the remote host in
+a reverse of the process using the appropriate inline or external
+program.
 @end itemize
 
 I hope this has provided you with a basic overview of what happens
@@ -400,28 +392,23 @@ behind the scenes when you open a file with @value{tramp}.
 @chapter Obtaining Tramp.
 @cindex obtaining Tramp
 
address@hidden is freely available on the Internet and the latest
-release may be downloaded from @uref{ftp://ftp.gnu.org/gnu/tramp/}.
-This release includes the full documentation and code for
address@hidden, suitable for installation.  But Emacs (22 or later)
-includes @value{tramp} already, and there is a @value{tramp} package
-for XEmacs, as well.  So maybe it is easier to just use those.  But if
-you want the bleeding edge, read address@hidden
address@hidden is included as part of Emacs (since Emacs version 22.1).
 
-For the especially brave, @value{tramp} is available from Git.  The Git
-version is the latest version of the code and may contain incomplete
-features or new issues.  Use these versions at your own risk.
address@hidden is also freely packaged for download on the Internet at
address@hidden://ftp.gnu.org/gnu/tramp/}.
 
-Instructions for obtaining the latest development version of @value{tramp}
-from Git can be found by going to the Savannah project page at the
-following URL and then clicking on the Git link in the navigation bar
-at the top.
address@hidden development versions are available on Git servers.
+Development versions contain new and incomplete features.
+
+One way to obtain from Git server is to visit the Savannah project
+page at the following URL and then clicking on the Git link in the
+navigation bar at the top.
 
 @noindent
 @uref{http://savannah.gnu.org/projects/tramp/}
 
 @noindent
-Or follow the example session below:
+Another way is to follow the terminal session below:
 
 @example
 ] @strong{cd ~/@value{emacsdir}}
@@ -429,7 +416,7 @@ Or follow the example session below:
 @end example
 
 @noindent
-If you reside behind a firewall, you could use
+From behind a firewall:
 
 @example
 ] @strong{git config --global http.proxy 
http://user:pwd@@proxy.server.com:8080}
@@ -437,16 +424,18 @@ If you reside behind a firewall, you could use
 @end example
 
 @noindent
-Tramp developers use instead
+Tramp developers:
 
 @example
 ] @strong{git clone login@@git.sv.gnu.org:/srv/git/tramp.git}
 @end example
 
 @noindent
-You should now have a directory @file{~/@value{emacsdir}/tramp}
-containing the latest version of @value{tramp}.  You can fetch the latest
-updates from the repository by issuing the command:
+After one of the above commands, @file{~/@value{emacsdir}/tramp} will
+containing the latest version of @value{tramp}.
+
address@hidden
+To fetch updates from the repository, use git pull:
 
 @example
 ] @strong{cd ~/@value{emacsdir}/tramp}
@@ -454,9 +443,8 @@ updates from the repository by issuing the command:
 @end example
 
 @noindent
-Once you've got updated files from the Git repository, you need to run
address@hidden in order to get an up-to-date @file{configure}
-script:
+Run @command{autoconf} as follows to generate an up-to-date
address@hidden script:
 
 @example
 ] @strong{cd ~/@value{emacsdir}/tramp}
@@ -469,36 +457,32 @@ script:
 @cindex history
 @cindex development history
 
-Development was started end of November 1998.  The package was called
address@hidden, back then.  It only provided one method to access a
-file, using @command{ssh} to log in to a remote host and using
address@hidden to transfer the file contents.  After a while, the name
-was changed to @file{rcp.el}, and now it's @value{tramp}.  Along the way,
-many more methods for getting a remote shell and for transferring the
-file contents were added.  Support for VC was added.
-
-After that, there were added the multi-hop methods in April 2000 and
-the unification of @value{tramp} and Ange-FTP file names in July 2002.
-In July 2004, multi-hop methods have been replaced by proxy hosts.
-Running commands on remote hosts was introduced in December 2005.
address@hidden development started at the end of November 1998 as
address@hidden  It provided only one method of access.  It used
address@hidden for login and @command{scp} to transfer file contents.
+The name was changed to @file{rcp.el} before it got its preset name
address@hidden  New methods of remote access were added, so was support
+for version control.
+
+April 2000 was the first time when multi-hop methods were added.  In
+July 2002, @value{tramp} unified file names with address@hidden  In July
+2004, proxy hosts replaced multi-hop methods.  Running commands on
+remote hosts was introduced in December 2005.
 @ifset emacsgw
-Support of gateways exists since April 2007.
+Support for gateways since April 2007.
 @end ifset
 @ifset emacsgvfs
 GVFS integration started in February 2009.
 @end ifset
 @ifset emacs
-Remote commands on Windows hosts are available since September 2011.
+Remote commands on Windows hosts since September 2011.
 @end ifset
-Ad-hoc multi-hop methods (with a changed syntax) have been reenabled
-in November 2011.  In November 2012, Juergen Hoetzel's
address@hidden has been added.
+Ad-hoc multi-hop methods (with a changed syntax) re-enabled in November
+2011.
 
-In December 2001, @value{tramp} has been added to the XEmacs package
-repository.  Being part of the Emacs repository happened in June 2002,
-the first release including @value{tramp} was Emacs 22.1.
+In November 2012, added Juergen Hoetzel's @file{tramp-adb.el}.
 
address@hidden is also a Debian GNU/Linux package since February 2001.
+In December 2001, XEmacs package repository adds @value{tramp}.
 
 
 @c Installation chapter is necessary only in case of standalone
@@ -509,33 +493,25 @@ the first release including @value{tramp} was Emacs 22.1.
 
 
 @node Configuration
address@hidden Configuring @value{tramp} for use
address@hidden Configuring @value{tramp}
 @cindex configuration
-
 @cindex default configuration
address@hidden is (normally) fully functional when it is initially
-installed.  It is initially configured to use the @command{scp}
-program to connect to the remote host.  So in the easiest case, you
-just type @kbd{C-x C-f} and then enter the file name
address@hidden@trampfn{, user, host, /path/to.file}}.
-
-On some hosts, there are problems with opening a connection.  These are
-related to the behavior of the remote shell.  See @xref{Remote shell
-setup}, for details on this.
-
-If you do not wish to use these commands to connect to the remote
-host, you should change the default connection and transfer method
-that @value{tramp} uses.  There are several different methods that 
@value{tramp}
-can use to connect to remote hosts and transfer files
-(@pxref{Connection types}).
-
-If you don't know which method is right for you, see @xref{Default
-Method}.
-
address@hidden that the following descriptions reference the setting of
-user options or variables, not all of which are autoloaded by
address@hidden  All examples assume that you have loaded
address@hidden first:
+
address@hidden is initially configured to use the @command{scp} program
+to connect to the remote host.  Just type @kbd{C-x C-f} and then enter
+file name @address@hidden, user, host, /path/to.file}}.  For details,
+see @xref{Default Method}.
+
+For problems related to the behavior of remote shell, see @ref{Remote
+shell setup} for details.
+
+For changing the connection type and file access method from the
+defaults to one of several other options, see (@pxref{Connection
+types}).
+
address@hidden that some user options and variables described in these
+examples are not auto loaded by @value{emacsname}.  All examples
+require @value{tramp} is installed and loaded:
 
 @lisp
 (require 'tramp)
@@ -543,7 +519,7 @@ user options or variables, not all of which are autoloaded 
by
 
 
 @menu
-* Connection types::            Types of connections made to remote hosts.
+* Connection types::            Types of connections to remote hosts.
 * Inline methods::              Inline methods.
 * External methods::            External methods.
 @ifset emacsgvfs
@@ -574,35 +550,26 @@ user options or variables, not all of which are 
autoloaded by
 
 
 @node Connection types
address@hidden Types of connections made to remote hosts
address@hidden Types of connections to remote hosts
 @cindex connection types, overview
 
-There are two basic types of transfer methods, each with its own
-advantages and limitations.  Both types of connection make use of a
-remote shell access program such as @command{rsh}, @command{ssh} or
address@hidden to connect to the remote host.
-
-This connection is used to perform many of the operations that @value{tramp}
-requires to make the remote file system transparently accessible from
-the local host.  It is only when visiting files that the methods
-differ.
address@hidden method} and @dfn{external method} are the two basic types
+of access methods.  While they both use the same remote shell access
+programs, such as @command{rsh}, @command{ssh}, or @command{telnet},
+they differ in the file access methods.  Choosing the right method
+becomes important for editing files, transferring large files, or
+operating on a large number of files.
 
 @cindex inline methods
 @cindex external methods
 @cindex methods, inline
 @cindex methods, external
-Loading or saving a remote file requires that the content of the file
-be transferred between the two hosts.  The content of the file can
-be transferred using one of two methods: the @dfn{inline method} over
-the same connection used to log in to the remote host, or the
address@hidden method} through another connection using a remote copy
-program such as @command{rcp}, @command{scp} or @command{rsync}.
 
 The performance of the external methods is generally better than that
 of the inline methods, at least for large files.  This is caused by
 the need to encode and decode the data when transferring inline.
 
-The one exception to this rule are the @command{scp} based transfer
+The one exception to this rule are the @option{scp}-based access
 methods.  While these methods do see better performance when actually
 transferring files, the overhead of the cryptographic negotiation at
 startup may drown out the improvement in file transfer times.
@@ -621,68 +588,60 @@ action.
 @cindex inline methods
 @cindex methods, inline
 
-The inline methods in @value{tramp} are quite powerful and can work in
-situations where you cannot use an external transfer program to
-connect.  There are also strange inline methods which allow you to
-transfer files between @emph{user identities} rather than hosts, see
-below.
+Inline methods use the same login connection to transfer file
+contents.  Inline methods are quick and easy for small files.  They
+depend on the availability of suitable encoding and decoding programs
+on the remote host.  For local source and destination, @value{tramp}
+may use built-in equivalents of such programs in @value{emacsname}.
 
-These methods depend on the existence of a suitable encoding and
-decoding command on remote host.  Locally, @value{tramp} may be able to
-use features of @value{emacsname} to decode and encode the files or
-it may require access to external commands to perform that task.
+Inline methods can work in situations where an external transfer
+program is unavailable.  Inline methods also work when transferring
+files between different @emph{user identities} on the same host.
 
 @cindex uuencode
 @cindex mimencode
 @cindex base-64 encoding
address@hidden checks the availability and usability of commands like
address@hidden (part of the @command{metamail} package) or
address@hidden on the remote host.  The first reliable command
-will be used.  The search path can be customized, see @ref{Remote
-programs}.
 
-If both commands aren't available on the remote host, @value{tramp}
-transfers a small piece of Perl code to the remote host, and tries to
-apply it for encoding and decoding.
address@hidden checks the remote host for the availability and
+usability of @command{mimencode} (part of the @command{metamail}
+package) or @command{uuencode}.  @value{tramp} uses the first reliable
+command it finds.  @value{tramp}'s search path can be customized, see
address@hidden programs}.
 
-The variable @var{tramp-inline-compress-start-size} controls, whether
-a file shall be compressed before encoding.  This could increase
-transfer speed for large text files.
+In case both @command{mimencode} and @command{uuencode} are
+unavailable, @value{tramp} first transfers a small Perl program to the
+remote host, and then tries that program for encoding and decoding.
 
+To increase transfer speeds for large text files, use compression
+before encoding.  The variable @var{tramp-inline-compress-start-size}
+specifies the file size for such optimization.
 
 @table @asis
 @item @option{rsh}
 @cindex method rsh
 @cindex rsh method
 
-Connect to the remote host with @command{rsh}.  Due to the unsecure
-connection it is recommended for very local host topology only.
-
-On operating systems which provide the command @command{remsh} instead
-of @command{rsh}, you can use the method @option{remsh}.  This is true
-for HP-UX or Cray UNICOS, for example.
address@hidden is an option for connecting to hosts within local
+networks since @command{rsh} is not as secure as other methods.
 
 
 @item @option{ssh}
 @cindex method ssh
 @cindex ssh method
 
-Connect to the remote host with @command{ssh}.  This is identical to
-the previous option except that the @command{ssh} package is used,
-making the connection more secure.
-
-All the methods based on @command{ssh} have an additional feature: you
-can specify a host name which looks like @file{host#42} (the real host
-name, then a hash sign, then a port number).  This means to connect to
-the given host but to also pass @code{-p 42} as arguments to the
address@hidden command.
address@hidden is a more secure option than others to connect to a
+remote host.
 
address@hidden can also take extra parameters as port numbers.  For
+example, a host on port 42 is specified as @file{host#42} (the real
+host name, a hash sign, then a port number).  It is the same as passing
address@hidden 42} to the @command{ssh} command.
 
 @item @option{telnet}
 @cindex method telnet
 @cindex telnet method
 
-Connect to the remote host with @command{telnet}.  This is as unsecure
+Connecting to a remote host with @command{telnet} is as insecure
 as the @option{rsh} method.
 
 
@@ -690,63 +649,46 @@ as the @option{rsh} method.
 @cindex method su
 @cindex su method
 
-This method does not connect to a remote host at all, rather it uses
-the @command{su} program to allow you to edit files as another user.
-That means, the specified host name in the file name must be either
address@hidden or the host name as returned by the function
address@hidden(system-name)}.  For an exception of this rule see
address@hidden
-
+Instead of connecting to a remote host, @command{su} program allows
+editing as another user.  The host can be either @samp{localhost} or
+the host returned by the function @command{(system-name)}.  See
address@hidden for an exception to this behavior.
 
 @item @option{sudo}
 @cindex method sudo
 @cindex sudo method
 
-This is similar to the @option{su} method, but it uses @command{sudo}
-rather than @command{su} to become a different user.
-
-Note that @command{sudo} must be configured to allow you to start a
-shell as the user.  It would be nice if it was sufficient if
address@hidden and @command{mimencode} were allowed, but that is not
-easy to implement, so I haven't got around to it, yet.
-
+Similar to @option{su} method, @option{sudo} uses @command{sudo}.
address@hidden must have sufficient rights to start a shell.
 
 @item @option{sshx}
 @cindex method sshx
 @cindex sshx method
 
-As you would expect, this is similar to @option{ssh}, only a little
-different.  Whereas @option{ssh} opens a normal interactive shell on
-the remote host, this option uses @samp{ssh -t -t @var{host} -l
address@hidden /bin/sh} to open a connection.  This is useful for users
-where the normal login shell is set up to ask them a number of
-questions when logging in.  This procedure avoids these questions, and
-just gives @value{tramp} a more-or-less ``standard'' login shell to work
-with.
-
-Note that this procedure does not eliminate questions asked by
address@hidden itself.  For example, @command{ssh} might ask ``Are you
-sure you want to continue connecting?'' if the host key of the remote
-host is not known.  @value{tramp} does not know how to deal with such a
-question (yet), therefore you will need to make sure that you can log
-in without such questions.
+Works like @option{ssh} but without the extra authentication prompts.
address@hidden uses @samp{ssh -t -t @var{host} -l @var{user} /bin/sh}
+to open a connection with a ``standard'' login shell.
 
-This is also useful for Windows users where @command{ssh}, when
-invoked from an @value{emacsname} buffer, tells them that it is not
-allocating a pseudo tty.  When this happens, the login shell is wont
-to not print any shell prompt, which confuses @value{tramp} mightily.
address@hidden that @option{sshx} does not bypass authentication
+questions.  For example, if the host key of the remote host is not
+known, @option{sshx} will still ask ``Are you sure you want to
+continue connecting?''.  @value{tramp} cannot handle such questions.
+Connections will have to be setup where logins can proceed without
+such questions.
 
-This supports the @samp{-p} argument.
address@hidden is useful for Windows users when @command{ssh} triggers
+an error about allocating a pseudo tty.  This happens due to missing
+shell prompts that confuses @value{tramp}.
 
address@hidden supports the @samp{-p} argument.
 
 @item @option{krlogin}
 @cindex method krlogin
 @cindex krlogin method
 @cindex Kerberos (with krlogin method)
 
-This method is also similar to @option{ssh}.  It only uses the
address@hidden -x} command to log in to the remote host.
-
+This method is also similar to @option{ssh}.  It uses the
address@hidden -x} command only for remote host login.
 
 @item @option{ksu}
 @cindex method ksu
@@ -760,26 +702,26 @@ This is another method from the Kerberos suite.  It 
behaves like @option{su}.
 @cindex method plink
 @cindex plink method
 
-This method is mostly interesting for Windows users using the PuTTY
address@hidden method is for Windows users with the PuTTY
 implementation of address@hidden  It uses @samp{plink -ssh} to log in to the
 remote host.
 
-With a recent PuTTY, it is recommended to check the @samp{Share SSH
-connections if possible} control for that session.
+Check the @samp{Share SSH connections if possible} control for that
+session.
 
-This method supports the @samp{-P} argument.
address@hidden method supports the @samp{-P} argument.
 
 
 @item @option{plinkx}
 @cindex method plinkx
 @cindex plinkx method
 
-Another method using PuTTY on Windows.  Instead of host names, it
-expects PuTTY session names, calling @samp{plink -load @var{session}
--t}.  User names and port numbers must be defined in the session.
+Another method using PuTTY on Windows with session names instead of
+host names.  @option{plinkx} calls @samp{plink -load @var{session} -t}.
+User names and port numbers must be defined in the session.
 
-With a recent PuTTY, it is recommended to check the @samp{Share SSH
-connections if possible} control for that session.
+Check the @samp{Share SSH connections if possible} control for that
+session.
 
 @end table
 
@@ -789,17 +731,16 @@ connections if possible} control for that session.
 @cindex methods, external
 @cindex external methods
 
-The external methods operate through multiple channels, using the
-remote shell connection for many actions while delegating file
-transfers to an external transfer utility.
+External methods operate over multiple channels, using the remote
+shell connection for some actions while delegating file transfers to
+an external transfer program.
 
-This saves the overhead of encoding and decoding that multiplexing the
-transfer through the one connection has with the inline methods.
+External methods save on the overhead of encoding and decoding of
+inline methods.
 
-Since external methods need their own overhead opening a new channel,
-all files which are smaller than @var{tramp-copy-size-limit} are still
-transferred with the corresponding inline method.  It should provide a
-fair trade-off between both approaches.
+Since external methods have the overhead of opening a new channel,
+files smaller than @var{tramp-copy-size-limit} still use inline
+methods.
 
 @table @asis
 @item @address@hidden and @command{rcp}
@@ -808,14 +749,12 @@ fair trade-off between both approaches.
 @cindex rcp (with rcp method)
 @cindex rsh (with rcp method)
 
-This method uses the @command{rsh} and @command{rcp} commands to connect
-to the remote host and transfer files.  This is probably the fastest
-connection method available.
+This method uses the @command{rsh} and @command{rcp} commands to
+connect to the remote host and transfer files.  This is the fastest
+access method available.
 
 The alternative method @option{remcp} uses the @command{remsh} and
address@hidden commands.  It should be applied on hosts where
address@hidden is used instead of @command{rsh}.
-
address@hidden commands.
 
 @item @address@hidden and @command{scp}
 @cindex method scp
@@ -823,22 +762,16 @@ The alternative method @option{remcp} uses the 
@command{remsh} and
 @cindex scp (with scp method)
 @cindex ssh (with scp method)
 
-Using @command{ssh} to connect to the remote host and @command{scp} to
-transfer files between the hosts is the best method for securely
-connecting to a remote host and accessing files.
-
-The performance of this option is also quite good.  It may be slower than
-the inline methods when you often open and close small files however.
-The cost of the cryptographic handshake at the start of an @command{scp}
-session can begin to absorb the advantage that the lack of encoding and
-decoding presents.
-
-All the @command{ssh} based methods support the @samp{-p} feature
-where you can specify a port number to connect to in the host name.
-For example, the host name @file{host#42} tells @value{tramp} to
-specify @samp{-p 42} in the argument list for @command{ssh}, and to
-specify @samp{-P 42} in the argument list for @command{scp}.
+Using a combination of @command{ssh} to connect and @command{scp} to
+transfer is the most secure.  While the performance is good, it is
+slower than the inline methods for smaller files.  Though there is no
+overhead of encoding and decoding of the inline methods,
address@hidden's cryptographic handshake negates those speed gains.
 
address@hidden methods support @samp{-p} feature for specifying
+port numbers.  For example, @file{host#42} passes @samp{-p 42} in the
+argument list to @command{ssh}, and @samp{-P 42} in the argument list
+to @command{scp}.
 
 @item @address@hidden and @command{rsync}
 @cindex method rsync
@@ -846,17 +779,12 @@ specify @samp{-P 42} in the argument list for 
@command{scp}.
 @cindex rsync (with rsync method)
 @cindex ssh (with rsync method)
 
-Using the @command{ssh} command to connect securely to the remote
-host and the @command{rsync} command to transfer files is almost
-identical to the @option{scp} method.
address@hidden command to connect in combination with @command{rsync}
+command to transfer is similar to the @option{scp} method.
 
-While @command{rsync} performs much better than @command{scp} when
-transferring files that exist on both hosts, this advantage is lost if
-the file exists only on one side of the connection.  A file can exists
-on both the remote and local host, when you copy a file from/to a
-remote host.  When you just open a file from the remote host (or write
-a file there), a temporary file on the local side is kept as long as
-the corresponding buffer, visiting this file, is alive.
address@hidden performs much better than @command{scp} when
+transferring files that exist on both hosts.  However, this advantage
+is lost if the file exists only on one side of the connection.
 
 This method supports the @samp{-p} argument.
 
@@ -867,19 +795,13 @@ This method supports the @samp{-p} argument.
 @cindex scp (with scpx method)
 @cindex ssh (with scpx method)
 
-As you would expect, this is similar to @option{scp}, only a little
-different.  Whereas @option{scp} opens a normal interactive shell on
-the remote host, this option uses @samp{ssh -t -t @var{host} -l
address@hidden /bin/sh} to open a connection.  This is useful for users
-where the normal login shell is set up to ask them a number of
-questions when logging in.  This procedure avoids these questions, and
-just gives @value{tramp} a more-or-less ``standard'' login shell to work
-with.
address@hidden is useful to avoid login shell questions.  It is similar
+in performance to @option{scp}.  @option{scpx} uses @samp{ssh -t -t
address@hidden -l @var{user} /bin/sh} to open a connection.
 
-This is also useful for Windows users where @command{ssh}, when
-invoked from an @value{emacsname} buffer, tells them that it is not
-allocating a pseudo tty.  When this happens, the login shell is wont
-to not print any shell prompt, which confuses @value{tramp} mightily.
address@hidden is useful for Windows users when @command{ssh} triggers
+an error about allocating a pseudo tty.  This happens due to missing
+shell prompts that confuses @value{tramp}.
 
 This method supports the @samp{-p} argument.
 
@@ -902,8 +824,8 @@ use the @command{plink} command to connect to the remote 
host, and
 they use @command{pscp} or @command{psftp} for transferring the files.
 These programs are part of PuTTY, an SSH implementation for Windows.
 
-With a recent PuTTY, it is recommended to configure the @samp{Share
-SSH connections if possible} control for that session.
+Check the @samp{Share SSH connections if possible} control for that
+session.
 
 These methods support the @samp{-P} argument.
 
@@ -914,27 +836,22 @@ These methods support the @samp{-P} argument.
 @cindex fsh (with fcp method)
 @cindex fcp (with fcp method)
 
-This method is similar to @option{scp}, but it uses the @command{fsh}
-command to connect to the remote host, and it uses @command{fcp} for
-transferring the files.  @command{fsh/fcp} are a front-end for
address@hidden which allow for reusing the same @command{ssh} session
-for submitting several commands.  This avoids the startup overhead of
address@hidden (which has to establish a secure connection whenever it
-is called).  Note, however, that you can also use one of the inline
-methods to achieve a similar effect.
+This method is similar to @option{scp}, but uses @command{fsh} to
+connect and @command{fcp} to transfer files.  @command{fsh/fcp}, a
+front-end for @command{ssh}, reuse @command{ssh} session by
+submitting several commands.  This avoids the startup overhead due to
address@hidden's secure connection.  Inline methods have similar
+benefits.
 
-This method uses the command @samp{fsh @var{host} -l @var{user}
-/bin/sh -i} to establish the connection, it does not work to just say
address@hidden @var{host} -l @var{user}}.
+The command used for this connection is: @samp{fsh @var{host} -l
address@hidden /bin/sh -i}
 
 @cindex method fsh
 @cindex fsh method
 
-There is no inline method using @command{fsh} as the multiplexing
-provided by the program is not very useful in our context.  @value{tramp}
-opens just one connection to the remote host and then keeps it open,
-anyway.
-
address@hidden has no inline method since the multiplexing it offers is
+not useful for @value{tramp}.  @command{fsh} connects to remote host
+and @value{tramp} keeps that one connection open.
 
 @item @address@hidden and @command{nc}
 @cindex method nc
@@ -942,21 +859,22 @@ anyway.
 @cindex nc (with nc method)
 @cindex telnet (with nc method)
 
-Using @command{telnet} to connect to the remote host and @command{nc}
-for file transfer is often the only possibility to access dumb
-devices, like routers or NAS hosts.  Those hosts have just a
-restricted @command{busybox} as local shell, and there is no program
-to encode and decode files for transfer.
-
+Using @command{telnet} to connect and @command{nc} to transfer files
+is sometimes the only combination suitable for accessing routers or
+NAS hosts.  These dumb devices have severely restricted local shells,
+such as the @command{busybox} and do not host any other encode or
+decode programs.
 
 @item @option{ftp}
 @cindex method ftp
 @cindex ftp method
 
-This is not a native @value{tramp} method.  Instead, it forwards all
-requests to @value{ftppackagename}.
+When @value{tramp} uses @option{ftp}, it forwards requests to whatever
+ftp program is specified by @value{ftppackagename}.  This external
+program must be capable of servicing requests from @value{tramp}.
+
 @ifset xemacs
-This works only for unified file names, see @ref{Issues}.
+This method works only for unified file names, see @ref{Issues}.
 @end ifset
 
 
@@ -964,83 +882,107 @@ This works only for unified file names, see @ref{Issues}.
 @cindex method smb
 @cindex smb method
 
-This is another not native @value{tramp} method.  It uses the
address@hidden command on different Unices in order to connect to
-an SMB server.  An SMB server might be a Samba (or CIFS) server on
-another UNIX host or, more interesting, a host running MS Windows.  So
-far, it is tested against MS Windows NT, MS Windows 2000, MS Windows
-XP, MS Windows Vista, and MS Windows 7.
-
-The first directory in the localname must be a share name on the remote
-host.  Remember that the @code{$} character, in which default shares
-usually end, must be written @code{$$} due to environment variable
-substitution in file names.  If no share name is given (i.e., remote
-directory @code{/}), all available shares are listed.
-
-Since authorization is done on share level, you will always be
-prompted for a password if you access another share on the same host.
-This can be suppressed by @ref{Password handling}.
-
-For authorization, MS Windows uses both a user name and a domain name.
-Because of this, the @value{tramp} syntax has been extended: you can
-specify a user name which looks like @code{user%domain} (the real user
-name, then a percent sign, then the domain name).  So, to connect to
-the host @code{melancholia} as user @code{daniel} of the domain
address@hidden, and edit @file{.emacs} in the home directory (share
address@hidden) I would specify the file name @address@hidden,
-daniel%BIZARRE, melancholia, /daniel$$/.emacs}}.
-
-Depending on the Windows domain configuration, a Windows user might be
-considered as domain user per default.  In order to connect as local
-user, the WINS name of that host must be given as domain name.
-Usually, it is the host name in capital letters.  In the example
-above, the local user @code{daniel} would be specified as
address@hidden@trampfn{smb, daniel%MELANCHOLIA, melancholia, /daniel$$/.emacs}}.
-
-The domain name as well as the user name are optional.  If no user
-name is specified at all, the anonymous user (without password
-prompting) is assumed.  This is different from all other @value{tramp}
-methods, where in such a case the local user name is taken.
-
-The @option{smb} method supports the @samp{-p} argument.
-
address@hidden note:} If @value{emacsname} runs locally under MS
-Windows, this method isn't available.  Instead, you can use UNC
-file names like @file{//melancholia/daniel$$/.emacs}.  The only
-disadvantage is that there's no possibility to specify another user
-name.
+This is another non-native @value{tramp} method.  @command{smbclient}
+connects to any host with SMB/CIFS protocol, such as MS Windows and
+Samba Servers running on Unixes.  Tests show this @value{tramp} method
+works with MS Windows NT, MS Windows 2000, MS Windows XP, MS Windows
+Vista, and MS Windows 7.
+
+Using @command{smbclient} requires a few tweaks when working with
address@hidden:
+
+The first directory in the localname must be a share name on the
+remote host.
+
+Since smb shares end in the @code{$} character, @value{tramp} must use
address@hidden when specifying those shares to avoid environment variable
+substitutions.
+
+When @value{tramp} is not specific about the share name or uses the
+generic remote directory @code{/}, @command{smbclient} returns all
+available shares.
+
+Since SMB authentication is based on each SMB share, @value{tramp}
+prompts for a password even when accessing a different share on the
+same SMB host.  This prompting can be suppressed by @ref{Password
+handling}.
+
+To accommodate user name/domain name syntax required by MS Windows
+authorization, @value{tramp} provides for an extended syntax in
address@hidden format (where user is username, @code{%} is the
+percent symbol, and domain is the windows domain name).  An example:
+
address@hidden
address@hidden, daniel%BIZARRE, melancholia, /daniel$$/.emacs}
address@hidden example
+
+where user @code{daniel} connects as a domain user to the SMB host
address@hidden in the windows domain @code{BIZARRE} to edit
address@hidden located in the home directory (share @code{daniel$}).
+
+Alternatively, for local WINS users (as opposed to domain users),
+substitute the domain name with the name of the local host in
+UPPERCASE as shown here:
+
address@hidden
address@hidden, daniel%MELANCHOLIA, melancholia, /daniel$$/.emacs}
address@hidden example
+
+where user @code{daniel} connects as local user to the SMB host
address@hidden in the local domain @code{MELANCHOLIA} to edit
address@hidden located in the home directory (share @code{daniel$}).
+
+The domain name and user name are optional for @command{smbclient}
+authentication.  When user name is not specified, @command{smbclient}
+uses the anonymous user (without prompting for password).  This
+behavior is unlike other @value{tramp} methods, where local user name
+is substituted.
+
address@hidden method is unavailable if @value{emacsname} is run under a
+local user authentication context in MS Windows.  However such users
+can still access remote files using UNC file names instead of @value{tramp}:
+
address@hidden
+//melancholia/daniel$$/.emacs
address@hidden example
+
+UNC file name specification does not allow to specify a different user
+name for authentication like the @command{smbclient} can.
 
 
 @item @option{adb}
 @cindex method adb
 @cindex adb method
 
-This special method uses the Android Debug Bridge for accessing
-Android devices.  The Android Debug Bridge must be installed locally.
-Some GNU/Linux distributions offer it for installation, otherwise it
-can be installed as part of the Android address@hidden  If the @command{adb}
-program is not found via the @env{PATH} environment variable, the
-variable @var{tramp-adb-program} must point to its absolute path.
-
address@hidden does not connect Android devices to @command{adb},
-unless the custom option @option{tramp-adb-connect-if-not-connected}
-is address@hidden  If there is exactly one Android device connected
-to @command{adb}, a host name is not needed in the remote file name.
-The default @value{tramp} name to be used is @address@hidden, , ,}},
-therefore.  Otherwise, one could find potential host names with the
-command @command{adb devices}.
-
-Usually, the @command{adb} method does not need any user name.  It
-runs under the permissions of the @command{adbd} process on the
-Android device.  If a user name is specified, @value{tramp} applies an
address@hidden on the device.  This does not work with all Android
-devices, especially with unrooted ones.  In that case, an error
-message is displayed.
-
-If a device shall be connected via TCP/IP, it is possible to declare
-the port number to be used like @file{device#42}.  Without a port
-number, the default value as declared in @command{adb} will be used.
-Port numbers are not applicable to Android devices connected via USB.
+This method uses Android Debug Bridge program for accessing Android
+devices.  The Android Debug Bridge must be installed locally for
address@hidden to work.  Some GNU/Linux distributions provide Android
+Debug Bridge as an installation package.  Alternatively, the program is
+installed as part of the Android address@hidden  @value{tramp} finds the
address@hidden program either via the @env{PATH} environment variable
+or the absolute path set in the variable @var{tramp-adb-program}.
+
address@hidden connects to Android devices with @option{adb} only when
+the custom option @option{tramp-adb-connect-if-not-connected} is not
address@hidden  Otherwise, the connection must be established outside
address@hidden
+
address@hidden does not require a host name part of the remote file
+name when a single Android device is connected to @command{adb}.
address@hidden instead uses @address@hidden, , ,}} as the default
+name.  @command{adb devices} shows available host names.
+
address@hidden method normally does not need user name to authenticate
+on the Andriod device because it runs under the @command{adbd}
+process.  But when a user name is specified, however, @value{tramp}
+applies an @command{su} in the syntax.  When authentication does not
+succeed, especially on un-rooted Android devices, @value{tramp}
+displays login errors.
+
+For Andriod devices connected through TCP/IP, a port number can be
+specified using @file{device#42} host name syntax or @value{tramp} can
+use the default value as declared in @command{adb} command.  Port
+numbers are not applicable to Android devices connected through address@hidden
 
 @end table
 
@@ -1052,75 +994,68 @@ Port numbers are not applicable to Android devices 
connected via USB.
 @cindex gvfs based methods
 @cindex dbus
 
-The connection methods described in this section are based on GVFS
address@hidden://en.wikipedia.org/wiki/GVFS}.  Via GVFS, the remote
-filesystem is mounted locally through address@hidden  @value{tramp} uses
-this local mounted directory internally.
+GVFS is the virtual file system for the Gnome Desktop,
address@hidden://en.wikipedia.org/wiki/GVFS}.  Remote files on GVFS are
+mounted locally through FUSE and @value{tramp} uses this locally
+mounted directory internally.
 
-The communication with GVFS is implemented via D-Bus messages.
-Therefore, your @value{emacsname} must have D-Bus integration,
address@hidden, , D-Bus, dbus}.
address@hidden uses the D-Bus mechanism to communicate with address@hidden
address@hidden must have the message bus system, D-Bus integration
+active, @pxref{Top, , D-Bus, dbus}.
 
 @table @asis
 @item @option{afp}
 @cindex method afp
 @cindex afp method
 
-Access to Mac OS X volumes via the Apple Filing Protocol is offered by
-this method.  The access must always be performed with a leading
-volume (share) name, like @address@hidden, user, host, /volume}}.
-
-
+This method is for connecting to remote hosts with the Apple Filing
+Protocol for accessing files on Mac OS X volumes.  @value{tramp} access
+syntax requires a leading volume (share) name, for example:
address@hidden@trampfn{afp, user, host, /volume}}.
 
 @item @option{dav}
address@hidden @option{davs}
 @cindex method dav
 @cindex method davs
 @cindex dav method
 @cindex davs method
 
-This method provides access to WebDAV files and directories.  There
-exists also the external method @option{davs}, which uses SSL
-encryption for the access.
-
-Both methods support the port number specification as discussed above.
-
address@hidden method provides access to WebDAV files and directories
+based on standard protocols, such as address@hidden  @option{davs} does the 
same
+but with SSL encryption.  Both methods support the port numbers.
 
 @item @option{obex}
 @cindex method obex
 @cindex obex method
 
-OBEX is an FTP-like access protocol for simple devices, like cell
-phones.  For the time being, @value{tramp} only supports OBEX over Bluetooth.
+OBEX is an FTP-like access protocol for cell phones and similar simple
+devices.  @value{tramp} supports OBEX over Bluetooth.
 
 
 @item @option{sftp}
 @cindex method sftp
 @cindex sftp method
 
-As you might expect, this method uses @command{sftp} in order to
-access the remote host.  Contrary to the @option{ssh} and @option{scp}
-methods, it doesn't open an @command{ssh} session for login.
-Therefore, it could be used to access to remote hosts which refuse
address@hidden for security reasons.
-
+This method uses @command{sftp} in order to securely access remote
+hosts.  @command{sftp} is a more secure option for connecting to hosts
+that for security reasons refuse @command{ssh} connections.
 
 @item @option{synce}
 @cindex method synce
 @cindex synce method
 
-The @option{synce} method allows communication with Windows Mobile
-devices.  Beside GVFS for mounting remote files and directories via
-FUSE, it also needs the SYNCE-GVFS plugin.
address@hidden method allows connecting to Windows Mobile devices.  It
+uses GVFS for mounting remote files and directories via FUSE and
+requires the SYNCE-GVFS plugin.
 
 @end table
 
address@hidden tramp-gvfs-methods
 @defopt tramp-gvfs-methods
-This custom option, a list, defines the external methods which shall
-be used with address@hidden  Per default, these are @option{afp},
address@hidden, @option{davs}, @option{obex}, @option{sftp} and
address@hidden  Other possible values are @option{ftp} and
address@hidden
address@hidden tramp-gvfs-methods
+This custom option is a list of external methods for address@hidden  By
+default, this list includes @option{afp}, @option{dav}, @option{davs},
address@hidden, @option{sftp} and @option{synce}.  Other methods to
+include are: @option{ftp} and @option{smb}.
 @end defopt
 @end ifset
 
@@ -1131,20 +1066,19 @@ be used with address@hidden  Per default, these are 
@option{afp},
 @cindex methods, gateway
 @cindex gateway methods
 
-Gateway methods are not methods to access a remote host directly.
-These methods are intended to pass firewalls or proxy servers.
-Therefore, they can be used for proxy host declarations
-(@pxref{Multi-hops}) only.
+Gateway methods are for proxy host declarations (@pxref{Multi-hops})
+so as to pass through firewalls and proxy servers.  They are not like
+the other methods that declare direct connections to a remote host.
 
-A gateway method must always come along with a method which supports
-port setting.  This is because @value{tramp} targets the accompanied
-method to @file{localhost#random_port}, from where the firewall or
-proxy server is accessed.
+A gateway method always comes with a port setting.  @value{tramp}
+targets the port number with the gateway method
address@hidden from where the firewall or proxy server
+is accessed.
 
-Gateway methods support user name and password declarations.  These
-are used to authenticate towards the corresponding firewall or proxy
-server.  They can be passed only if your friendly administrator has
-granted your access.
+Gateway methods support user name and password declarations for
+authenticating the corresponding firewall or proxy server.  Such
+authentication can be passed through only if granted access by system
+administrators.
 
 @table @asis
 @item @option{tunnel}
@@ -1152,23 +1086,22 @@ granted your access.
 @cindex tunnel method
 
 This method implements an HTTP tunnel via the @command{CONNECT}
-command (see RFC 2616, 2817).  Any HTTP 1.1 compliant (proxy) server
-shall support this command.
+command (conforming to RFC 2616, 2817 specifications).  Proxy servers
+using HTTP version 1.1 or later protocol support this command.
 
-As authentication method, only @option{Basic Authentication} (see RFC
-2617) is implemented so far.  If no port number is given in the
-declaration, port @option{8080} is used for the proxy server.
+For authentication, this protocol uses only @option{Basic
+Authentication} (see RFC 2617).  When no port number is specified, this
+protocol defaults to @option{8080}.
 
 
 @item @option{socks}
 @cindex method socks
 @cindex socks method
 
-The @command{socks} method provides access to SOCKSv5 servers (see
-RFC 1928).  @option{Username/Password Authentication} according to RFC
-1929 is supported.
+The @option{socks} method connects to SOCKSv5 servers (see RFC 1928)
+and supports @option{Username/Password Authentication}.
 
-The default port number of the socks server is @option{1080}, if not
+The default port number for the socks server is @option{1080}, if not
 specified otherwise.
 
 @end table
@@ -1178,21 +1111,23 @@ specified otherwise.
 @node Default Method
 @section Selecting a default method
 @cindex default method
-
 @vindex tramp-default-method
-When you select an appropriate transfer method for your typical usage
-you should set the variable @code{tramp-default-method} to reflect that
-choice.  This variable controls which method will be used when a method
-is not specified in the @value{tramp} file name.  For example:
address@hidden tramp-default-method-alist
+
+Default method is for transferring files.  The variable
address@hidden sets it.  @value{tramp} uses this variable
+to determine the default method for tramp file names that do not have
+one specified.
 
 @lisp
 (setq tramp-default-method "ssh")
 @end lisp
 
address@hidden tramp-default-method-alist
-You can also specify different methods for certain user/host
-combinations, via the variable @code{tramp-default-method-alist}.  For
-example, the following two lines specify to use the @option{ssh}
+Default methods for transferring files can be customized for specific
+user and host combinations through the alist variable
address@hidden
+
+For example, the following two lines specify to use the @option{ssh}
 method for all user names matching @samp{john} and the @option{rsync}
 method for all host names matching @samp{lily}.  The third line
 specifies to use the @option{su} method for the user @samp{root} on
@@ -1207,95 +1142,82 @@ the host @samp{localhost}.
 
 @noindent
 See the documentation for the variable
address@hidden for more details.
address@hidden for details.
 
-External methods are normally preferable to inline methods, giving
-better performance.
address@hidden
+External methods performance faster for large files.
 
address@hidden
 @xref{Inline methods}.
 @xref{External methods}.
 
-Another consideration with the selection of transfer methods is the
-environment you will use them in and, especially when used over the
-Internet, the security implications of your preferred method.
+Choosing the access method also depends on the security environment.
+For example, @option{rsh} and @option{telnet} methods that use clear
+text password transfers are inappropriate for over the Internet
+connections.  Secure remote connections should use @option{ssh} that
+provide encryption.
 
-The @option{rsh} and @option{telnet} methods send your password as
-plain text as you log in to the remote host, as well as
-transferring the files in such a way that the content can easily be
-read from other hosts.
 
-If you need to connect to remote systems that are accessible from the
-Internet, you should give serious thought to using @option{ssh} based
-methods to connect.  These provide a much higher level of security,
-making it a non-trivial exercise for someone to obtain your password
-or read the content of the files you are editing.
address@hidden Which method to use?
address@hidden choosing the right method
 
address@hidden provides maximum number of choices for maximum
+flexibility.  Choosing which method depends on the hosts, clients,
+network speeds, and the security context.
 
address@hidden Which method is the right one for me?
address@hidden choosing the right method
+Start by using an inline method.
 
-Given all of the above, you are probably thinking that this is all fine
-and good, but it's not helping you to choose a method!  Right you are.
-As a developer, we don't want to boss our users around but give them
-maximum freedom instead.  However, the reality is that some users would
-like to have some guidance, so here I'll try to give you this guidance
-without bossing you around.  You tell me whether it works @dots{}
-
-My suggestion is to use an inline method.  For large files, external
-methods might be more efficient, but I guess that most people will
-want to edit mostly small files.  And if you access large text files,
-compression (driven by @var{tramp-inline-compress-start-size}) shall
-still result in good performance.
-
-I guess that these days, most people can access a remote host by
-using @command{ssh}.  So I suggest that you use the @option{ssh}
-method.  So, type @kbd{C-x C-f @trampfn{ssh, root, otherhost,
-/etc/motd} @key{RET}} to edit the @file{/etc/motd} file on the other
-host.
+External methods might be more efficient for large files, but most
address@hidden users edit small files more often than large files.
 
-If you can't use @option{ssh} to log in to the remote host, then
-select a method that uses a program that works.  For instance, Windows
-users might like the @option{plink} method which uses the PuTTY
-implementation of @command{ssh}.  Or you use Kerberos and thus like
address@hidden
+Enable compression, @var{tramp-inline-compress-start-size}, for a
+performance boost for large files.
 
-For the special case of editing files on the local host as another
-user, see the @option{su} or @option{sudo} methods.  They offer
-shortened syntax for the @samp{root} account, like
address@hidden@trampfn{su, , , /etc/motd}}.
+Since @command{ssh} has become the most common method of remote host
+access and it has the most reasonable security protocols, use
address@hidden method.  Typical @option{ssh} usage to edit the
address@hidden/etc/motd} file on the otherhost:
 
-People who edit large files may want to consider @option{scp} instead
-of @option{ssh}, or @option{pscp} instead of @option{plink}.  These
-external methods are faster than inline methods for large files.
-Note, however, that external methods suffer from some limitations.
-Please try first whether you really get a noticeable speed advantage
-from using an external method!  Maybe even for large files, inline
-methods are fast enough.
address@hidden
address@hidden C-f @trampfn{ssh, root, otherhost,/etc/motd} @key{RET}}
address@hidden example
+
+If @option{ssh} is unavailable for whatever reason, look for other
+obvious options.  For Windows, try the @option{plink} method.  For
+Kerberos, try @option{krlogin}.
+
+For editing local files as @option{su} or @option{sudo} methods, try
+the shortened syntax of @samp{root}:
+
address@hidden
address@hidden C-f @trampfn{su, , , /etc/motd} @key{RET}}
address@hidden example
+
+For editing large files, @option{scp} is faster than @option{ssh}.
address@hidden is faster than @option{plink}.  But this speed
+improvement is not always true.
 
 
 @node Default User
 @section Selecting a default user
 @cindex default user
address@hidden tramp-default-user
address@hidden tramp-default-user-alist
 
-The user part of a @value{tramp} file name can be omitted.  Usually,
-it is replaced by the user name you are logged in.  Often, this is not
-what you want.  A typical use of @value{tramp} might be to edit some
-files with root permissions on the local host.  This case, you should
-set the variable @code{tramp-default-user} to reflect that choice.
address@hidden file name can omit the user name part since
address@hidden substitutes the currently logged-in user name.  However
+this substitution can be overridden with @code{tramp-default-user}.
 For example:
 
 @lisp
 (setq tramp-default-user "root")
 @end lisp
 
address@hidden is regarded as obsolete, and will be removed
-soon.
-
address@hidden tramp-default-user-alist
-You can also specify different users for certain method/host
-combinations, via the variable @code{tramp-default-user-alist}.  For
-example, if you always have to use the user @samp{john} in the domain
address@hidden, you can specify the following:
+Instead of a single default user, @code{tramp-default-user-alist}
+allows multiple default user values based on access method or host
+name combinations.  The alist can hold multiple values.  For example, to
+use the @samp{john} as the default user for the domain
address@hidden only:
 
 @lisp
 (add-to-list 'tramp-default-user-alist
@@ -1306,69 +1228,54 @@ example, if you always have to use the user @samp{john} 
in the domain
 See the documentation for the variable @code{tramp-default-user-alist}
 for more details.
 
-One trap to fall in must be known.  If @value{tramp} finds a default
-user, this user will be passed always to the connection command as
-parameter (for example @command{ssh here.somewhere.else -l john}.  If
-you have specified another user for your command in its configuration
-files, @value{tramp} cannot know it, and the remote access will fail.
-If you have specified in the given example in @file{~/.ssh/config} the
-lines
-
address@hidden
-Host here.somewhere.else
-     User lily
address@hidden example
-
address@hidden
-than you must discard selecting a default user by @value{tramp}.  This
-will be done by setting it to @code{nil} (or @samp{lily}, likewise):
+A Caution: @value{tramp} will override any default user specified in
+the configuration files outside @value{emacsname}, such as
address@hidden/.ssh/config}.  To stop @value{tramp} from applying the default
+value, set the corresponding alist entry to nil:
 
 @lisp
 (add-to-list 'tramp-default-user-alist
              '("ssh" "\\`here\\.somewhere\\.else\\'" nil))
 @end lisp
 
-The last entry in @code{tramp-default-user-alist} could be your
-default user you'll apply predominantly.  You shall @emph{append} it
-to that list at the end:
+The last entry in @code{tramp-default-user-alist} should be reserved
+for catch-all or most often used login.
 
 @lisp
-(add-to-list 'tramp-default-user-alist '(nil nil "jonas") t)
+(add-to-list 'tramp-default-user-alist
+             '(nil nil "jonas") t)
 @end lisp
 
 
 @node Default Host
 @section Selecting a default host
 @cindex default host
-
 @vindex tramp-default-host
-Finally, it is even possible to omit the host name part of a
address@hidden file name.  This case, the value of the variable
address@hidden is used.  Per default, it is initialized
-with the host name your local @value{emacsname} is running.
address@hidden tramp-default-host-alist
 
-If you, for example, use @value{tramp} mainly to contact the host
address@hidden as user @samp{john}, you can specify:
+When host name is omitted, @value{tramp} substitutes the value from
+the @code{tramp-default-host} variable.  It is initially populated with
+the local hostname where @value{emacsname} is running.  Both the
+default user and default host can be overridden as follows:
 
 @lisp
 (setq tramp-default-user "john"
       tramp-default-host "target")
 @end lisp
 
-Then the simple file name @address@hidden, , ,}} will connect you
-to John's home directory on target.
+With both defaults set, @address@hidden, , ,}} will connect
address@hidden to John's home directory on target.
+
 @ifset emacs
-Note, however, that the most simplification @samp{/::} won't work,
-because @samp{/:} is the prefix for quoted file names.
address@hidden @samp{/::} won't work, because @samp{/:} is the prefix
+for quoted file names.
 @end ifset
 
address@hidden tramp-default-host-alist
-Like with methods and users, you can also specify different default
-hosts for certain method/user combinations via the variable
address@hidden  Usually, this isn't necessary,
-because @code{tramp-default-host} should be sufficient.  For some
-methods, like @option{adb}, that default value must be overwritten,
-which is already the initial value of @code{tramp-default-host-alist}.
+Instead of a single default host, @code{tramp-default-host-alist}
+allows multiple default host values based on access method or user
+name combinations.  The alist can hold multiple values.  While
address@hidden is sufficient in most cases, some methods,
+like @option{adb}, require defaults overwritten.
 
 @noindent
 See the documentation for the variable @code{tramp-default-host-alist}
@@ -1380,28 +1287,27 @@ for more details.
 @cindex multi-hop
 @cindex proxy hosts
 
-Sometimes, the methods described before are not sufficient.
-Sometimes, it is not possible to connect to a remote host using a
-simple command.  For example, if you are in a secured network, you
-might have to log in to a bastion host first before you can connect to
-the outside world.  Of course, the target host may also require a
-bastion host.
+Multi-hops are methods to reach hosts behind firewalls or to reach the
+outside world from inside a bastion host.  With multi-hops,
address@hidden can negotiate these hops with the appropriate user/host
+authentication at each hop.  All methods until now have been the single
+hop kind, where the start and end points of the connection did not
+have intermediate check points.
 
address@hidden tramp-default-proxies-alist
 @defopt tramp-default-proxies-alist
-In order to specify multiple hops, it is possible to define a proxy
-host to pass through, via the custom option
address@hidden  This variable keeps a list of
-triples (@var{host} @var{user} @var{proxy}).
-
-The first matching item specifies the proxy host to be passed for a
-file name located on a remote target matching @var{user}@@@var{host}.
address@hidden and @var{user} are regular expressions or @code{nil}, which
-is interpreted as a regular expression which always matches.
-
address@hidden must be a Tramp file name which localname part is ignored.
-Method and user name on @var{proxy} are optional, which is interpreted
-with the default values.
address@hidden tramp-default-proxies-alist
address@hidden specifies proxy hosts to pass
+through.  This variable is list of triples consisting of (@var{host}
address@hidden @var{proxy}).
+
+The first match is the proxy host through which passes the file name
+and the target host matching @var{user}@@@var{host}.  @var{host} and
address@hidden are regular expressions or @code{nil}, interpreted as a
+regular expression which always matches.
+
address@hidden is a literal @value{tramp} file name whose local name part
+is ignored, and the method and user name parts are optional.
+
 @ifset emacsgw
 The method must be an inline or gateway method (@pxref{Inline
 methods}, @pxref{Gateway methods}).
@@ -1412,9 +1318,8 @@ The method must be an inline method (@pxref{Inline 
methods}).
 If @var{proxy} is @code{nil}, no additional hop is required reaching
 @var{user}@@@var{host}.
 
-If you, for example, must pass the host @samp{bastion.your.domain} as
-user @samp{bird} for any remote host which is not located in your local
-domain, you can set
+For example, to pass through the host @samp{bastion.your.domain} as
+user @samp{bird} to reach remote hosts outside the local domain:
 
 @lisp
 (add-to-list 'tramp-default-proxies-alist
@@ -1423,13 +1328,12 @@ domain, you can set
              '("\\.your\\.domain\\'" nil nil))
 @end lisp
 
-Please note the order of the code.  @code{add-to-list} adds elements at the
-beginning of a list.  Therefore, most relevant rules must be added last.
address@hidden: @code{add-to-list} adds elements at the beginning of a
+list.  Therefore, most relevant rules must come last in the list.
 
-Proxy hosts can be cascaded.  If there is another host called
address@hidden, which is the only one in your local domain who
-is allowed connecting @samp{bastion.your.domain}, you can add another
-rule:
+Proxy hosts can be cascaded in the alist.  If there is another host
+called @samp{jump.your.domain}, which is the only host allowed to
+connect to @samp{bastion.your.domain}, then:
 
 @lisp
 (add-to-list 'tramp-default-proxies-alist
@@ -1438,31 +1342,31 @@ rule:
                "@trampfn{ssh, , jump.your.domain,}"))
 @end lisp
 
address@hidden can contain the patterns @code{%h} or @code{%u}.  These
-patterns are replaced by the strings matching @var{host} or
address@hidden, respectively.
address@hidden can take patterns @code{%h} or @code{%u} for @var{host} or
address@hidden respectively.
 
-If you, for example, wants to work as @samp{root} on hosts in the
-domain @samp{your.domain}, but login as @samp{root} is disabled for
-non-local access, you might add the following rule:
+To login as @samp{root} on remote hosts in the domain
address@hidden, but login as @samp{root} is disabled for non-local
+access, then use this alist entry:
 
 @lisp
 (add-to-list 'tramp-default-proxies-alist
              '("\\.your\\.domain\\'" "\\`root\\'" "@trampfn{ssh, , %h,}"))
 @end lisp
 
-Opening @address@hidden, , randomhost.your.domain,}} would connect
-first @samp{randomhost.your.domain} via @code{ssh} under your account
-name, and perform @code{sudo -u root} on that host afterwards.  It is
-important to know that the given method is applied on the host which
-has been reached so far.  @code{sudo -u root}, applied on your local
-host, wouldn't be useful here.
+Opening @address@hidden, , randomhost.your.domain,}} first
+connects to @samp{randomhost.your.domain} via @code{ssh} under your
+account name, and then perform @code{sudo -u root} on that host.
 
address@hidden, @var{user} and @var{proxy} can also be Lisp forms.  These
-forms are evaluated, and must return a string, or @code{nil}.  The
-previous example could be generalized then: For all hosts except my
-local one connect via @command{ssh} first, and apply @command{sudo -u
-root} afterwards:
+It is key for the sudo method in the above example to be applied on
+the host after reaching it and not on the local host.
+
address@hidden, @var{user} and @var{proxy} can also take Lisp forms.  These
+forms when evaluated must return either a string or @code{nil}.
+
+To generalize (from the previous example): For all hosts, except my
+local one, first connect via @command{ssh}, and then apply
address@hidden -u root}:
 
 @lisp
 (add-to-list 'tramp-default-proxies-alist
@@ -1471,46 +1375,45 @@ root} afterwards:
              '((regexp-quote (system-name)) nil nil))
 @end lisp
 
-This is the recommended configuration to work as @samp{root} on remote
-Ubuntu hosts.
+The above configuration allows @value{tramp} connection as @samp{root}
+to remote Ubuntu hosts.
 
 @ifset emacsgw
-Finally, @code{tramp-default-proxies-alist} can be used to pass
-firewalls or proxy servers.  Imagine your local network has a host
address@hidden which is used on port 3128 as HTTP proxy to
-the outer world.  Your friendly administrator has granted you access
-under your user name to @samp{host.other.domain} on that proxy
address@hidden tunnels are intended for secure SSL/TLS
-communication.  Therefore, many proxy server restrict the tunnels to
-related target ports.  You might need to run your ssh server on your
-target host @samp{host.other.domain} on such a port, like 443 (https).
-See @uref{http://savannah.gnu.org/maintenance/CvsFromBehindFirewall}
-for discussion of ethical issues.}  You would need to add the
-following rule:
address@hidden is also used for passing through
+firewalls or proxy servers.
+
+For example, the local host @samp{proxy.your.domain} on port 3128
+serves as HTTP proxy to the outer world.  User has access rights to
+another proxy server on @address@hidden tunnels
+are intended for secure SSL/TLS communication.  Therefore, many proxy
+servers restrict the tunnels to related target ports.  You might need
+to run your ssh server on your target host @samp{host.other.domain} on
+such a port, like 443 (https).  See
address@hidden://savannah.gnu.org/maintenance/CvsFromBehindFirewall} for
+discussion of ethical issues.}  Then the configuration is:
 
 @lisp
 (add-to-list 'tramp-default-proxies-alist
              '("\\`host\\.other\\.domain\\'" nil
-               "@trampfn{tunnel, , proxy.your.domain#3128,}"))
+             "@trampfn{tunnel, , proxy.your.domain#3128,}"))
 @end lisp
 
-Gateway methods can be declared as first hop only in a multiple hop
-chain.
+Gateway methods in a multiple hop chain can be declared only as the first hop.
 @end ifset
 @end defopt
 
-Hops to be passed tend to be restricted firewalls and alike.
-Sometimes they offer limited features only, like running @command{rbash}
-(restricted bash).  This must be told to @value{tramp}.
+Passing through hops involves dealing with restricted shells, such as
address@hidden  If @value{tramp} is made aware, then it would use
+them for proxies only.
 
address@hidden tramp-restricted-shell-hosts-alist
 @defopt tramp-restricted-shell-hosts-alist
-This custom option keeps a list of regular expressions, which denote
-hosts running a registered shell like @command{rbash}.  Those hosts
-can be used as proxies only.
address@hidden tramp-restricted-shell-hosts-alist
+An alist of regular expressions of hosts running restricted shells,
+such as @command{rbash}.  @value{tramp} will then use them only as
+proxies.
 
-If the bastion host from the example above runs a restricted shell,
-you shall apply
+To specify the bastion host from the example above as running a
+restricted shell:
 
 @lisp
 (add-to-list 'tramp-restricted-shell-hosts-alist
@@ -1525,11 +1428,10 @@ you shall apply
 @cindex using non-standard methods
 @cindex create your own methods
 
-There is a variable @code{tramp-methods} which you can change if the
-predefined methods don't seem right.
-
-For the time being, I'll refer you to the Lisp documentation of that
-variable, accessible with @kbd{C-h v tramp-methods @key{RET}}.
+The @code{tramp-methods} variable currently has an exhaustive list of
+predefined methods.  Any part of this list can be modified with more
+suitable settings.  Refer to the Lisp documentation of that variable,
+accessible with @kbd{C-h v tramp-methods @key{RET}}.
 
 
 @node Customizing Completion
@@ -1538,15 +1440,14 @@ variable, accessible with @kbd{C-h v tramp-methods 
@key{RET}}.
 @cindex selecting config files
 @vindex tramp-completion-function-alist
 
-The variable @code{tramp-completion-function-alist} is intended to
-customize which files are taken into account for user and host name
-completion (@pxref{File name completion}).  For every method, it keeps
-a set of configuration files, accompanied by a Lisp function able to
-parse that file.  Entries in @code{tramp-completion-function-alist}
-have the form (@var{method} @var{pair1} @var{pair2} @dots{}).
address@hidden uses predefined files for user
+and host name completion (@pxref{File name completion}).  For each
+method, it keeps a set of configuration files and a function that can
+parse that file.  Each entry in @code{tramp-completion-function-alist}
+is of the form (@var{method} @var{pair1} @var{pair2} @dots{}).
 
 Each @var{pair} is composed of (@var{function} @var{file}).
address@hidden is responsible to extract user names and host names
address@hidden is responsible for extracting user names and host names
 from @var{file} for completion.  There are two functions which access
 this variable:
 
@@ -1619,31 +1520,28 @@ case, hosts names are coded in file names
 @item @code{tramp-parse-hosts}
 @findex tramp-parse-hosts
 
-A function dedicated to @file{/etc/hosts} style files.  It returns
-host names only.
+A function dedicated to @file{/etc/hosts} for host names.
 
 @item @code{tramp-parse-passwd}
 @findex tramp-parse-passwd
 
-A function which parses @file{/etc/passwd} like files.  Obviously, it
-can return user names only.
+A function which parses @file{/etc/passwd} files for user names.
 
 @item @code{tramp-parse-netrc}
 @findex tramp-parse-netrc
 
-Finally, a function which parses @file{~/.netrc} like files.  This
-includes also @file{~/.authinfo}-style files.
+A function which parses @file{~/.netrc} and @file{~/.authinfo}-style files.
 
 @end table
 
-If you want to keep your own data in a file, with your own structure,
-you might provide such a function as well.  This function must meet
-the following conventions:
+To keep a custom file with custom data in a custom structure, a custom
+function has to be provided.  This function must meet the following
+conventions:
 
 @defun my-tramp-parse file
address@hidden must be either a file name on your host, or @code{nil}.
-The function must return a list of (@var{user} @var{host}), which are
-taken as candidates for user and host name completion.
address@hidden must be either a file on the host, or @code{nil}.  The
+function must return a list of (@var{user} @var{host}), which are
+taken as candidates for completion for user and host names.
 
 Example:
 @example
@@ -1658,144 +1556,127 @@ Example:
 @section Reusing passwords for several connections
 @cindex passwords
 
-Sometimes it is necessary to connect to the same remote host several
-times.  Reentering passwords again and again would be annoying, when
-the chosen method does not support access without password prompt
-through own configuration.
-
-The best recommendation is to use the method's own mechanism for
-password handling. Consider @command{ssh-agent} for @option{ssh}-like
+To avoid repeated prompts for passwords, consider native caching
+mechanisms, such as @command{ssh-agent} for @option{ssh}-like
 methods, or @command{pageant} for @option{plink}-like methods.
 
-However, if you cannot apply such native password handling,
address@hidden offers alternatives.
address@hidden offers alternatives when native solutions cannot meet
+the need.
 
 
 @anchor{Using an authentication file}
 @subsection Using an authentication file
-
 @vindex auth-sources
-The package @file{auth-source.el}, originally developed in No Gnus,
-offers the possibility to read passwords from a file, like FTP does it
-from @file{~/.netrc}.  The default authentication file is
address@hidden/.authinfo.gpg}, this can be changed via the variable
+
+The package @file{auth-source.el}, originally developed for No Gnus,
+reads passwords from different sources, @xref{Help for users, ,
+auth-source, auth}.  The default authentication file is
address@hidden/.authinfo.gpg}, but this can be changed via the variable
 @code{auth-sources}.
 
 @noindent
-A typical entry in the authentication file would be
+A typical entry in the authentication file:
 
 @example
 machine melancholia port scp login daniel password geheim
 @end example
 
-The port can be any @value{tramp} method (@pxref{Inline methods},
address@hidden methods}), to match only this method.  When you omit
-the port, you match all @value{tramp} methods.
+The port can take any @value{tramp} method (@pxref{Inline methods},
address@hidden methods}).  Omitting port values matches all
address@hidden methods.
 
-In case of problems, setting @code{auth-source-debug} to @code{t}
-gives useful debug messages.
+Setting @code{auth-source-debug} to @code{t} to debug messages.
 
 
 @anchor{Caching passwords}
 @subsection Caching passwords
 
-If there is no authentication file, @value{tramp} caches the passwords
-entered by you.  They will be reused next time if a connection needs
-them for the same user name and host name, independently of the
-connection method.
address@hidden can cache passwords as entered and reuse when needed for
+the same user or host name independent of the access method.
 
 @vindex password-cache-expiry
-Passwords are not saved permanently, that means the password caching
-is limited to the lifetime of your @value{emacsname} session.  You
-can influence the lifetime of password caching by customizing the
-variable @code{password-cache-expiry}.  The value is the number of
-seconds how long passwords are cached.  Setting it to @code{nil}
-disables the expiration.
+
address@hidden sets the duration (in seconds) the
+passwords are remembered.  Passwords are never saved permanently nor
+can they extend beyond the lifetime of the current @value{emacsname}
+session.  Set @code{password-cache-expiry} to @code{nil} to disable
+expiration.
 
 @vindex password-cache
-If you don't like this feature for security reasons, password caching
-can be disabled totally by customizing the variable
address@hidden (setting it to @code{nil}).
 
-Implementation Note: password caching is based on the package
address@hidden  For the time being, it is activated only
-when this package is seen in the @code{load-path} while loading
address@hidden
+Set @code{password-cache} to @code{nil} to disable password caching.
+
address@hidden Note}: password caching depends on
address@hidden package.  @value{tramp} activates password
+caching only if @value{tramp} can discover, while @value{emacsname} is
+loading, the package through @code{load-path}.
+
 @ifset installchapter
-If you don't use No Gnus, you can take @file{password.el} from the
address@hidden @file{contrib} directory, see @ref{Installation
-parameters}.
address@hidden is available from No Gnus or from the @value{tramp}
address@hidden directory, see @ref{Installation parameters}.
 @end ifset
 
 
 @node Connection caching
 @section Reusing connection related information
 @cindex caching
-
 @vindex tramp-persistency-file-name
-In order to reduce initial connection time, @value{tramp} stores
-connection related information persistently.  The variable
address@hidden keeps the file name where these
-information are written.  Its default value is
+
+For faster initial connection times, @value{tramp} stores previous
+connection properties in a file specified by the variable
address@hidden
+
+The default file name for @code{tramp-persistency-file-name} is:
 @ifset emacs
 @file{~/.emacs.d/tramp}.
 @end ifset
 @ifset xemacs
 @file{~/.xemacs/tramp}.
 @end ifset
-It is recommended to choose a local file name.
-
address@hidden reads this file during startup, and writes it when
-exiting @value{emacsname}.  You can simply remove this file if
address@hidden shall be urged to recompute these information next
address@hidden startup time.
-
-Using such persistent information can be disabled by setting
address@hidden to @code{nil}.
-
-Once consequence of reusing connection related information is that
address@hidden needs to distinguish hosts.  If you, for example, run a
-local @code{sshd} on port 3001, which tunnels @command{ssh} to another
-host, you could access both @address@hidden, , localhost,}} and
address@hidden@trampfn{ssh, , localhost#3001,}}.  @value{tramp} would use the
-same host related information (like paths, Perl variants, etc) for
-both connections, although the information is valid only for one of
-them.
 
-In order to avoid trouble, you must use another host name for one of
-the connections, like introducing a @option{Host} section in
address@hidden/.ssh/config} (@pxref{Frequently Asked Questions}) or applying
-multiple hops (@pxref{Multi-hops}).
address@hidden reads this file during @value{emacsname} startup, and
+writes to it when exiting @value{emacsname}.  Delete this file for
address@hidden to recreate a new one on next @value{emacsname} startup.
+
+Set @code{tramp-persistency-file-name} to @code{nil} to disable
+storing connections persistently.
 
-When @value{tramp} detects a changed operating system version on a
-remote host (via the command @command{uname -sr}), it flushes all
-connection related information for this host, and opens the
-connection again.
+To reuse connection information from the persistent list,
address@hidden needs to uniquely identify every host.  However in some
+cases, two different connections may result in the same persistent
+information.  For example, connecting to a host using @command{ssh} and
+connecting to the same host through @code{sshd} on port 3001.  Both
+access methods result in nearly identical persistent specifications
address@hidden@trampfn{ssh, , localhost,}} and @address@hidden, ,
+localhost#3001,}}.
+
+Changing host names could avoid duplicates.  One way is to add a
address@hidden section in @file{~/.ssh/config} (@pxref{Frequently Asked
+Questions}).  Another way is to apply multiple hops (@pxref{Multi-hops}).
+
+When @value{tramp} detects a change in the operating system version in
+a remote host (via the command @command{uname -sr}), it flushes all
+connection related information for that host and creates a new entry.
 
 
 @node Predefined connection information
 @section Setting own connection related information
address@hidden tramp-connection-properties
 
-Sometimes, method specific arguments in @code{tramp-methods} do not
-fit your needs.  Sometimes, @value{tramp} is not able to detect
-correct connection related information.  In such cases, you could tell
address@hidden which value it has to take.  Since this could result in
-errors, it has to be used with care.
+For more precise customization, parameters specified by
address@hidden can be overwritten manually.
 
address@hidden tramp-connection-properties
-Such settings can be performed via the list
address@hidden  An entry in this list has the
-form @code{(@var{regexp} @var{property} @var{value})}.  @var{regexp}
-matches remote file names for which a property shall be predefined.
-It can be @code{nil}.  @var{property} is a string, and @var{value} the
-corresponding value.
-
address@hidden could be any method specific parameter found in
address@hidden The parameter key in @code{tramp-methods} is a
-symbol name @code{tramp-<foo>}. In order to overwrite it,
address@hidden must be the string @samp{<foo>}.  If you, for example,
-want to change the remote shell to be used on a remote machine, you
-could apply
+Set @code{tramp-connection-properties} to manually override
address@hidden  Properties in this list are in the form
address@hidden(@var{regexp} @var{property} @var{value})}.  @var{regexp} matches
+remote file names.  Use @code{nil} to match all.  @var{property} is the
+property's name, and @var{value} is the property's value.
+
address@hidden is any method specific parameter contained in
address@hidden  The parameter key in @code{tramp-methods} is a
+symbol name @code{tramp-<foo>}.  To overwrite that property, use the
+string @samp{<foo>} for @var{property}.  For example, this changes the
+remote shell:
 
 @lisp
 (add-to-list 'tramp-connection-properties
@@ -1806,17 +1687,15 @@ could apply
                    "remote-shell-login" '("-")))
 @end lisp
 
-This would overwrite the @code{tramp-remote-shell} and
address@hidden parameters in @code{tramp-methods}, to
-be used on that remote host.
+The parameters @code{tramp-remote-shell} and
address@hidden in @code{tramp-methods} now have new
+values for the remote host.
 
address@hidden could also be any property found in the file
address@hidden could also be any property found in
 @code{tramp-persistency-file-name}.
 
-A special property is @samp{busybox}.  This must be set, if the remote
-host runs a very restricted busybox as shell, which closes the
-connection at will.  Since there is no reliable test for this,
address@hidden must be indicated this way.  Example:
+To get around how restricted shells randomly drop connections, set the
+special property @samp{busybox}.  For example:
 
 @lisp
 (add-to-list 'tramp-connection-properties
@@ -1828,69 +1707,55 @@ connection at will.  Since there is no reliable test 
for this,
 @node Remote programs
 @section How @value{tramp} finds and uses programs on the remote host
 
address@hidden depends on a number of programs on the remote host in order to
-function, including @command{ls}, @command{test}, @command{find} and
address@hidden requires access to and rights to several commands on
+remote hosts: @command{ls}, @command{test}, @command{find} and
 @command{cat}.
 
-In addition to these required tools, there are various tools that may be
-required based on the connection method.  See @ref{Inline methods} and
address@hidden methods} for details on these.
+Besides there are other required programs for @ref{Inline methods} and
address@hidden methods} of connection.
 
-Certain other tools, such as @command{perl} (or @command{perl5}) and
address@hidden will be used if they can be found.  When they are
-available, they are used to improve the performance and accuracy of
-remote file access.
+To improve performance and accuracy of remote file access,
address@hidden uses @command{perl} (or @command{perl5}) and
address@hidden when available.
 
address@hidden tramp-remote-path
 @vindex tramp-remote-path
 @vindex tramp-default-remote-path
 @vindex tramp-own-remote-path
address@hidden tramp-remote-path
-When @value{tramp} connects to the remote host, it searches for the
-programs that it can use.  The custom option
address@hidden controls the directories searched on the
-remote host.
address@hidden specifies which remote directory paths
address@hidden can search for @ref{Remote programs}.
 
-By default, this is set to a reasonable set of defaults for most
-hosts.  The symbol @code{tramp-default-remote-path} is a place
-holder, it is replaced by the list of directories received via the
-command @command{getconf PATH} on your remote host.  For example,
-on Debian GNU/Linux this is @file{/bin:/usr/bin}, whereas on Solaris
-this is @file{/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin}.
-It is recommended to apply this symbol on top of
address@hidden
address@hidden uses standard defaults, such as @file{/bin} and
address@hidden/usr/bin}, which are reasonable for most hosts.  To accommodate
+differences in hosts and paths, for example, @file{/bin:/usr/bin} on
+Debian GNU/Linux or
address@hidden/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin} on
+Solaris, @value{tramp} queries the remote host with @command{getconf
+PATH} and updates the symbol @code{tramp-default-remote-path}.
 
-It is possible, however, that your local (or remote ;) system
-administrator has put the tools you want in some obscure local
-directory.
-
-In this case, you can still use them with @value{tramp}.  You simply
-need to add code to your @file{.emacs} to add the directory to the
-remote path.  This will then be searched by @value{tramp} when you
-connect and the software found.
-
-To add a directory to the remote search path, you could use code such
-as:
+For instances where hosts keep obscure locations for paths for
+security reasons, manually add such paths to local @file{.emacs} as
+shown below for @value{tramp} to use when connecting.
 
 @lisp
 (add-to-list 'tramp-remote-path "/usr/local/perl/bin")
 @end lisp
 
-Another possibility is to reuse the path settings of your remote
-account when you log in.  Usually, these settings are overwritten,
-because they might not be useful for @value{tramp}.  The place holder
address@hidden preserves these settings.  You can
-activate it via
+Another way to find the remote path is to use the path assigned to the
+remote user by the remote host.  @value{tramp} does not normally retain
+this remote path after logging.  However, @code{tramp-own-remote-path}
+preserves the path value, which can be used to update
address@hidden
 
 @lisp
 (add-to-list 'tramp-remote-path 'tramp-own-remote-path)
 @end lisp
 @end defopt
 
address@hidden caches several information, like the Perl binary
-location.  The changed remote search path wouldn't affect these
-settings.  In order to force @value{tramp} to recompute these values,
-you must exit @value{emacsname}, remove your persistency file
-(@pxref{Connection caching}), and restart @value{emacsname}.
+When remote search paths are changed, local @value{tramp} caches must
+be recomputed.  To force @value{tramp} to recompute afresh, exit
address@hidden, remove the persistent file (@pxref{Connection
+caching}), and restart @value{emacsname}.
 
 
 @node Remote shell setup
@@ -1900,77 +1765,44 @@ you must exit @value{emacsname}, remove your 
persistency file
 @cindex @file{.login} file
 @cindex shell init files
 
-As explained in the @ref{Overview} section, @value{tramp} connects to the
-remote host and talks to the shell it finds there.  Of course, when you
-log in, the shell executes its init files.  Suppose your init file
-requires you to enter the birth date of your mother; clearly @value{tramp}
-does not know this and hence fails to log you in to that host.
-
-There are different possible strategies for pursuing this problem.  One
-strategy is to enable @value{tramp} to deal with all possible situations.
-This is a losing battle, since it is not possible to deal with
address@hidden situations.  The other strategy is to require you to set up
-the remote host such that it behaves like @value{tramp} expects.  This might
-be inconvenient because you have to invest a lot of effort into shell
-setup before you can begin to use @value{tramp}.
-
-The package, therefore, pursues a combined approach.  It tries to
-figure out some of the more common setups, and only requires you to
-avoid really exotic stuff.  For example, it looks through a list of
-directories to find some programs on the remote host.  And also, it
-knows that it is not obvious how to check whether a file exists, and
-therefore it tries different possibilities.  (On some hosts and
-shells, the command @command{test -e} does the trick, on some hosts
-the shell builtin doesn't work but the program @command{/usr/bin/test
--e} or @command{/bin/test -e} works.  And on still other hosts,
address@hidden -d} is the right way to do this.)
-
-Below you find a discussion of a few things that @value{tramp} does not deal
-with, and that you therefore have to set up correctly.
address@hidden checks for the availability of standard programs in the
+usual locations.  Common tactics include successively trying
address@hidden -e}, @command{/usr/bin/test -e}, and @command{/bin/test
+-e}.  @command{ls -d} is another approach.  But these approaches do not
+help with these new login patterns.
 
address@hidden @asis
address@hidden @var{shell-prompt-pattern}
address@hidden shell-prompt-pattern
-
-After logging in to the remote host, @value{tramp} has to wait for the remote
-shell startup to finish before it can send commands to the remote
-shell.  The strategy here is to wait for the shell prompt.  In order to
-recognize the shell prompt, the variable @code{shell-prompt-pattern} has
-to be set correctly to recognize the shell prompt on the remote host.
-
-Note that @value{tramp} requires the match for @code{shell-prompt-pattern}
-to be at the end of the buffer.  Many people have something like the
-following as the value for the variable: @samp{^[^>$][>$] *}.  Now
-suppose your shell prompt is @code{a <b> c $ }.  In this case,
address@hidden recognizes the @code{>} character as the end of the prompt,
-but it is not at the end of the buffer.
+When @value{tramp} encounters two-factor logins or additional challenge
+questions, such as entering birth date or security code or passphrase,
address@hidden needs a few more configuration steps to accommodate
+them.
 
+The difference between a password prompt and a passphrase prompt is
+that the password for completing the login while the passphrase is
+for authorizing access to local authentication information, such as
+the ssh key.
+
+There is no one configuration to accommodate all the variations in
+login security, especially not the exotic ones.  However, @value{tramp}
+provides a few tweaks to address the most common ones.
+
address@hidden @asis
 @item @var{tramp-shell-prompt-pattern}
 @vindex tramp-shell-prompt-pattern
 
-This regular expression is used by @value{tramp} in the same way as
address@hidden, to match prompts from the remote shell.
-This second variable exists because the prompt from the remote shell
-might be different from the prompt from a local shell---after all,
-the whole point of @value{tramp} is to log in to remote hosts as a
-different user.  The default value of
address@hidden is the same as the default value of
address@hidden, which is reported to work well in many
-circumstances.
address@hidden is for remote login shell prompt,
+which may not be the same as the local login shell prompt,
address@hidden  Since most hosts use identical prompts,
address@hidden sets a similar default value for both prompts.
 
 @item @var{tramp-password-prompt-regexp}
address@hidden @var{tramp-wrong-passwd-regexp}
 @vindex tramp-password-prompt-regexp
 @vindex tramp-wrong-passwd-regexp
 
-During login, @value{tramp} might be forced to enter a password or a
-passphrase.  The difference between both is that a password is
-requested from the shell on the remote host, while a passphrase is
-needed for accessing local authentication information, like your ssh
-key.
-
address@hidden handles the detection of such
-requests for English environments.  When you use another localization
-of your (local or remote) host, you might need to adapt this.  Example:
address@hidden uses @var{tramp-password-prompt-regexp} to distinguish
+between prompts for passwords and prompts for passphrases.  By default,
address@hidden handles the detection in English
+language environments.  See a localization example below:
 
 @lisp
 (setq
@@ -1988,29 +1820,29 @@ of your (local or remote) host, you might need to adapt 
this.  Example:
       ".*:\0? *"))
 @end lisp
 
-In parallel, it might also be necessary to adapt
address@hidden
+Similar localization may be necessary for handling wrong password
+prompts, for which @value{tramp} uses @var{tramp-wrong-passwd-regexp}.
 
 @item @command{tset} and other questions
 @cindex Unix command tset
 @cindex tset Unix command
address@hidden tramp-terminal-type
 
-Some people invoke the @command{tset} program from their shell startup
-scripts which asks the user about the terminal type of the shell.
-Maybe some shells ask other questions when they are started.
address@hidden does not know how to answer these questions.  There are
-two approaches for dealing with this problem.  One approach is to take
-care that the shell does not ask any questions when invoked from
address@hidden  You can do this by checking the @env{TERM}
-environment variable, it will be set to @code{dumb} when connecting.
+To suppress inappropriate prompts for terminal type, @value{tramp}
+sets the @env{TERM} to @code{dumb} before the remote login process
+begins via the variable @code{tramp-terminal-type}.  This will silence
+common @command{tset} related prompts.
 
address@hidden tramp-terminal-type
-The variable @code{tramp-terminal-type} can be used to change this value
-to @code{dumb}.
address@hidden's strategy for handling such prompts (commonly triggered
+from login scripts on remote hosts) is to set the environment
+variables so that no prompts interrupt the shell initialization
+process.
 
 @vindex tramp-actions-before-shell
-The other approach is to teach @value{tramp} about these questions.  See
-the variable @code{tramp-actions-before-shell}.  Example:
+
+An alternative approach is to configure @value{tramp} with strings
+that can identify such questions using
address@hidden  Example:
 
 @lisp
 (defconst my-tramp-prompt-regexp
@@ -2030,80 +1862,61 @@ the variable @code{tramp-actions-before-shell}.  
Example:
 @end lisp
 
 
address@hidden Environment variables named like users in @file{.profile}
address@hidden Conflicting names for users and variables in @file{.profile}
 
-If you have a user named frumple and set the variable @env{FRUMPLE} in
-your shell environment, then this might cause trouble.  Maybe rename
-the variable to @env{FRUMPLE_DIR} or the like.
-
-This weird effect was actually reported by a @value{tramp} user!
+When a user name is the same as a variable name in a local file, such
+as @file{.profile}, then @value{tramp} may send incorrect values for
+environment variables.  To avoid incorrect values, change the local
+variable name to something different from the user name.  For example,
+if the user name is @env{FRUMPLE}, then change the variable name to
address@hidden
 
 
 @item Non-Bourne commands in @file{.profile}
 
-After logging in to the remote host, @value{tramp} issues the command
address@hidden /bin/sh}.  (Actually, the command is slightly
-different.)  When @command{/bin/sh} is executed, it reads some init
-files, such as @file{~/.shrc} or @file{~/.profile}.
-
-Now, some people have a login shell which is not @code{/bin/sh} but a
-Bourne-ish shell such as bash or ksh.  Some of these people might put
-their shell setup into the files @file{~/.shrc} or @file{~/.profile}.
-This way, it is possible for non-Bourne constructs to end up in those
-files.  Then, @command{exec /bin/sh} might cause the Bourne shell to
-barf on those constructs.
-
-As an example, imagine somebody putting @command{export FOO=bar} into
-the file @file{~/.profile}.  The standard Bourne shell does not
-understand this syntax and will emit a syntax error when it reaches
-this line.
-
-Another example is the tilde (@code{~}) character, say when adding
address@hidden/bin} to @env{PATH}.  Many Bourne shells will not expand this
-character, and since there is usually no directory whose name consists
-of the single character tilde, strange things will happen.
-
-What can you do about this?
-
-Well, one possibility is to make sure that everything in
address@hidden/.shrc} and @file{~/.profile} on all remote hosts is
-Bourne-compatible.  In the above example, instead of @command{export
-FOO=bar}, you might use @command{FOO=bar; export FOO} instead.
-
-The other possibility is to put your non-Bourne shell setup into some
-other files.  For example, bash reads the file @file{~/.bash_profile}
-instead of @file{~/.profile}, if the former exists.  So bash
-aficionados just rename their @file{~/.profile} to
address@hidden/.bash_profile} on all remote hosts, and Bob's your uncle.
-
-The @value{tramp} developers would like to circumvent this problem, so
-if you have an idea about it, please tell us.  However, we are afraid
-it is not that simple: before saying @command{exec /bin/sh},
address@hidden does not know which kind of shell it might be talking
-to.  It could be a Bourne-ish shell like ksh or bash, or it could be a
-csh derivative like tcsh, or it could be zsh, or even rc.  If the
-shell is Bourne-ish already, then it might be prudent to omit the
address@hidden /bin/sh} step.  But how to find out if the shell is
-Bourne-ish?
+When the remote host's @file{.profile} is also used for shells other
+than Bourne shell, then some incompatible syntaxes for commands in
address@hidden may trigger errors in Bourne shell on the host and may
+not complete client's @value{tramp} connections.
+
+One example of a Bourne shell incompatible syntax in @file{.profile}:
+using @command{export FOO=bar} instead of @command{FOO=bar; export
+FOO}.  After remote login, @value{tramp} will trigger an error during
+its execution of @command{/bin/sh} on the remote host because Bourne
+shell does not recognize the export command as entered in
address@hidden
+
+Likewise, (@code{~}) character in paths will cause errors because
+Bourne shell does not do (@code{~}) character expansions.
+
+One approach to avoiding these incompatibilities is to make all
+commands in @file{~/.shrc} and @file{~/.profile} Bourne shell
+compatible so @value{tramp} can complete connections to that remote.
+To accommodate using non-Bourne shells on that remote, use other
+shell-specific config files.  For example, bash can use
address@hidden/.bash_profile} and ignore @file{.profile}.
 
 
 @item Interactive shell prompt
 
address@hidden redefines the shell prompt in order to parse the shell's
-output robustly.  When calling an interactive shell by @kbd{M-x
-shell}, this doesn't look nice.
address@hidden redefines the remote shell prompt internally for robust
+parsing.  This redefinition affects the looks of a prompt in an
+interactive remote shell through commands, such as @kbd{M-x
+shell}.  Such prompts, however, can be reset to something more readable
+and recognizable using these @value{tramp} variables.
 
-You can redefine the shell prompt by checking the environment variable
address@hidden, which is set by @value{tramp}, in your startup
-script @file{~/.emacs_SHELLNAME}. @env{SHELLNAME} might be the string
address@hidden or similar, in case of doubt you could set it the
-environment variable @env{ESHELL} in your @file{.emacs}:
address@hidden sets the @env{INSIDE_EMACS} variable in the startup
+script file @file{~/.emacs_SHELLNAME}.
+
address@hidden is @code{bash} or equivalent shell names.  Change it by
+setting the environment variable @env{ESHELL} in the @file{.emacs} as
+follows:
 
 @lisp
 (setenv "ESHELL" "bash")
 @end lisp
 
-Your file @file{~/.emacs_SHELLNAME} could contain code like
+Then re-set the prompt string in @file{~/.emacs_SHELLNAME} as follows:
 
 @example
 # Reset the prompt for remote Tramp shells.
@@ -2122,18 +1935,16 @@ fi
 @cindex Unix command nc
 @cindex nc Unix command
 
-The @command{nc} command will be used with the @option{nc} method.  On
-the remote host, a listener will be installed.  Unfortunately, the
-command line syntax for this has been changed with the different
address@hidden versions.  @value{tramp} uses the following syntax
-(see @code{tramp-methods}):
address@hidden's @option{nc} method uses the @command{nc} command to
+install and execute a listener as follows (see @code{tramp-methods}):
 
 @example
 # nc -l -p 42
 @end example
 
-If your remote @command{nc} refuses to accept the @command{-p}
-parameter, you could overwrite the syntax with the following form:
+The above command-line syntax has changed with @command{busybox}
+versions.  If @command{nc} refuses the @command{-p} parameter, then
+overwrite as follows:
 
 @lisp
 (add-to-list
@@ -2142,7 +1953,7 @@ parameter, you could overwrite the syntax with the 
following form:
 @end lisp
 
 @noindent
-with @samp{192.168.0.1} being the IP address of your remote host
+where @samp{192.168.0.1} is the remote host IP address
 (@pxref{Predefined connection information}).
 
 @end table
@@ -2152,18 +1963,17 @@ with @samp{192.168.0.1} being the IP address of your 
remote host
 @section Android shell setup hints
 @cindex android shell setup
 
-Android devices use a restricted shell.  They can be accessed via the
address@hidden method.  However, this restricts the access to a USB
-connection, and it requires the installation of the Android SDK on the
-local host.
address@hidden uses the @option{adb} method to access Android
+devices.  Android devices provide a restricted shell access through an
+USB connection.  The local host must have Andriod SDK installed.
 
-When an @command{sshd} process runs on the Android device, like
-provided by the @code{SSHDroid} app, any @option{ssh}-based method can
-be used.  This requires some special settings.
+Applications such as @code{SSHDroid} that run @command{sshd} process
+on the Android device can accept any @option{ssh}-based methods
+provided these settings are adjusted:
 
-The default shell @code{/bin/sh} does not exist.  Instead, you shall
-use just @code{sh}, which invokes the shell installed on the device.
-You can instruct @value{tramp} by this form:
address@hidden must be specified for remote shell since Android devices do
+not provide @code{/bin/sh}.  @code{sh} will then invoke whatever shell is
+installed on the device with this setting:
 
 @lisp
 (add-to-list 'tramp-connection-properties
@@ -2171,13 +1981,12 @@ You can instruct @value{tramp} by this form:
 @end lisp
 
 @noindent
-with @samp{192.168.0.26} being the IP address of your Android device
+where @samp{192.168.0.26} is the Android device's IP address.
 (@pxref{Predefined connection information}).
 
-The user settings for the @env{PATH} environment variable must be
-preserved.  It has also been reported, that the commands in
address@hidden/system/xbin} are better suited than the ones in
address@hidden/system/bin}.  Add these setting:
address@hidden requires preserving @env{PATH} environment variable from
+user settings.  Android devices prefer @file{/system/xbin} path over
address@hidden/system/bin}.  Both of these are set as follows:
 
 @lisp
 (add-to-list 'tramp-remote-path 'tramp-own-remote-path)
@@ -2185,20 +1994,20 @@ preserved.  It has also been reported, that the 
commands in
 @end lisp
 
 @noindent
-If the Android device is not @samp{rooted}, you must give the shell a
-writable directory for temporary files:
+When the Android device is not @samp{rooted}, specify a writable
+directory for temporary files:
 
 @lisp
 (add-to-list 'tramp-remote-process-environment "TMPDIR=$HOME")
 @end lisp
 
 @noindent
-Now you shall be able to open a remote connection with @kbd{C-x C-f
address@hidden, , 192.168.0.26#2222, }}, given that @command{sshd}
-listens on port @samp{2222}.
+Open a remote connection with the command @kbd{C-x C-f @trampfn{ssh, ,
+192.168.0.26#2222, }}, where @command{sshd} is listening on port
address@hidden
 
-It is also recommended to add a corresponding entry to your
address@hidden/.ssh/config} for that connection, like
+To add a corresponding entry to the @file{~/.ssh/config} file
+(recommended), use this:
 
 @example
 Host android
@@ -2208,7 +2017,8 @@ Host android
 @end example
 
 @noindent
-In this case, you must change the setting for the remote shell to
+To use the host name @samp{android} instead of the IP address shown in
+the previous example, fix the connection properties as follows:
 
 @lisp
 (add-to-list 'tramp-connection-properties
@@ -2216,8 +2026,8 @@ In this case, you must change the setting for the remote 
shell to
 @end lisp
 
 @noindent
-You would open the connection with @kbd{C-x C-f @trampfn{ssh, ,
-android, }} then.
+Open a remote connection with a more concise command @kbd{C-x C-f
address@hidden, , android, }}.
 
 
 @node Auto-save and Backup
@@ -2231,22 +2041,24 @@ android, }} then.
 @vindex bkup-backup-directory-info
 @end ifset
 
-Normally, @value{emacsname} writes backup files to the same directory
-as the original files, but this behavior can be changed via the
-variable
+To avoid @value{tramp} from saving backup files owned by root to
+locations accessible to others, default backup settings in
 @ifset emacs
address@hidden
address@hidden
 @end ifset
 @ifset xemacs
address@hidden
address@hidden
 @end ifset
-In connection with @value{tramp}, this can have unexpected side
-effects.  Suppose that you specify that all backups should go to the
-directory @file{~/.emacs.d/backups/}, and then you edit the file
address@hidden@trampfn{su, root, localhost, /etc/secretfile}}.  The effect is
-that the backup file will be owned by you and not by root, thus
-possibly enabling others to see it even if they were not intended to
-see it.
+have to be altered.
+
+Here's a scenario where files could be inadvertently
+exposed.  @value{emacsname} by default writes backup files to the same
+directory as the original files unless changed to another location,
+such as @file{~/.emacs.d/backups/}.  Such a directory will also be used
+by default by @value{tramp} when using, say, a restricted file
address@hidden@trampfn{su, root, localhost, /etc/secretfile}}.  The backup file
+of the secretfile is now owned by the user logged in from tramp and
+not root.
 
 When
 @ifset emacs
@@ -2257,16 +2069,8 @@ When
 @end ifset
 is @code{nil} (the default), such problems do not occur.
 
-Therefore, it is useful to set special values for @value{tramp}
-files.  For example, the following statement effectively ``turns off''
-the effect of
address@hidden emacs
address@hidden
address@hidden ifset
address@hidden xemacs
address@hidden
address@hidden ifset
-for @value{tramp} files:
+To ``turns off'' the backup feature for @value{tramp} files and stop
address@hidden from saving to the backup directory, use this:
 
 @ifset emacs
 @lisp
@@ -2283,8 +2087,8 @@ for @value{tramp} files:
 @end ifset
 
 @ifset emacs
-It is also possible to disable backups depending on the used method.
-The following code disables backups for the @option{su} and
address@hidden
+Disabling backups can be targetted to just @option{su} and
 @option{sudo} methods:
 
 @lisp
@@ -2298,24 +2102,28 @@ The following code disables backups for the @option{su} 
and
 @end lisp
 @end ifset
 
-
-Another possibility is to use the @value{tramp} variable
+Another option is to create better backup file naming with user and
+host names prefixed to the file name.  For example, transforming
address@hidden/etc/secretfile} to
address@hidden/.emacs.d/backups/!su:root@@localhost:!etc!secretfile}, set the
address@hidden variable
 @ifset emacs
address@hidden
address@hidden
 @end ifset
 @ifset xemacs
address@hidden
address@hidden
 @end ifset
-This variable has the same meaning like
+from the existing variable
 @ifset emacs
 @code{backup-directory-alist}.
 @end ifset
 @ifset xemacs
 @code{bkup-backup-directory-info}.
 @end ifset
-If a @value{tramp} file is backed up, and DIRECTORY is an absolute
-local file name, DIRECTORY is prepended with the @value{tramp} file
-name prefix of the file to be backed up.
+
+Then @value{tramp} backs up to a file name that is transformed with a
+prefix consisting of the DIRECTORY name.  This file name prefixing
+happens only when the DIRECTORY is an absolute local file name.
 
 @noindent
 Example:
@@ -2348,101 +2156,98 @@ The backup file name of @address@hidden, root, 
localhost,
 ~/.emacs.d/backups/![su!root@@localhost]!etc!secretfile~}}
 @end ifset
 
-The same problem can happen with auto-saving files.
+Just as for backup files, similar issues of file naming affect
+auto-saving @value{tramp} files.
 @ifset emacs
-The variable @code{auto-save-file-name-transforms} keeps information,
-on which directory an auto-saved file should go.  By default, it is
-initialized for @value{tramp} files to the local temporary directory.
-
-On some versions of @value{emacsname}, namely the version built for
-Debian GNU/Linux, the variable @code{auto-save-file-name-transforms}
-contains the directory where @value{emacsname} was built.  A
-workaround is to manually set the variable to a sane value.
+Auto-saved files are saved in the directory specified by the variable
address@hidden  By default this is set to the
+local temporary directory.  But in some versions of Debian GNU/Linux,
+this points to the source directory where the @value{emacsname} was
+compiled.   Reset such values to a valid directory.
 
-If auto-saved files should go into the same directory as the original
-files, @code{auto-save-file-name-transforms} should be set to @code{nil}.
+Set @code{auto-save-file-name-transforms} to @code{nil} to save
+auto-saved files to the same directory as the original file.
 
-Another possibility is to set the variable
address@hidden to a proper value.
+Alternatively, set the variable @code{tramp-auto-save-directory} to
+direct all auto saves to that location.
 @end ifset
 @ifset xemacs
-For this purpose you can set the variable @code{auto-save-directory}
-to a proper value.
address@hidden can also be used here instead of other
+locations specfied above.
 @end ifset
 
-
 @node Windows setup hints
 @section Issues with Cygwin ssh
 @cindex Cygwin, issues
 
-This section needs a lot of work!  Please help.
+This section is incomplete.  Please share your solutions.
 
 @cindex method sshx with Cygwin
 @cindex sshx method with Cygwin
-The recent Cygwin installation of @command{ssh} works only with a
-Cygwinized @value{emacsname}.  You can check it by typing @kbd{M-x
-eshell}, and starting @kbd{ssh test.host}.  The problem is evident
-if you see a message like this:
+
+Cygwin's @command{ssh} works only with a Cygwin version of
address@hidden  To check for compatibility: type @kbd{M-x eshell}, and
+start @kbd{ssh test.host}.  Incompatbilities trigger this message:
 
 @example
 Pseudo-terminal will not be allocated because stdin is not a terminal.
 @end example
 
-Older @command{ssh} versions of Cygwin are told to cooperate with
address@hidden selecting @option{sshx} as the connection method.  You
-can find information about setting up Cygwin in their FAQ at
address@hidden://cygwin.com/faq/}.
+Some older versions of Cygwin's @command{ssh} work with the
address@hidden access method.  Consult Cygwin's FAQ at
address@hidden://cygwin.com/faq/} for details.
+
 
 @cindex method scpx with Cygwin
 @cindex scpx method with Cygwin
-If you wish to use the @option{scpx} connection method, then you might
-have the problem that @value{emacsname} calls @command{scp} with a
-Windows file name such as @code{c:/foo}.  The Cygwin version of
address@hidden does not know about Windows file names and interprets
-this as a remote file name on the host @code{c}.
 
-One possible workaround is to write a wrapper script for @option{scp}
-which converts the Windows file name to a Cygwinized file name.
+When using the @option{scpx} access method, @value{emacsname} may call
address@hidden with Windows file naming, such as @code{c:/foo}.  But
+the version of @command{scp} that is installed with Cygwin does not
+know about Windows file naming, which causes it to incorrectly look
+for a host named @code{c}.
+
+A workaround: write a wrapper script for @option{scp} to convert
+Windows file names to Cygwin file names.
 
 @cindex Cygwin and ssh-agent
 @cindex SSH_AUTH_SOCK and @value{emacsname} on Windows
-If you want to use either @option{ssh} based method on Windows, then
-you might encounter problems with @command{ssh-agent}.  Using this
-program, you can avoid typing the pass-phrase every time you log in.
-However, if you start @value{emacsname} from a desktop shortcut, then
-the environment variable @env{SSH_AUTH_SOCK} is not set and so
address@hidden and thus @value{tramp} and thus @command{ssh} and
address@hidden started from @value{tramp} cannot communicate with
address@hidden  It works better to start @value{emacsname} from
-the shell.
 
-If anyone knows how to start @command{ssh-agent} under Windows in such a
-way that desktop shortcuts can profit, please holler.  I don't really
-know anything at all about address@hidden
+When using the @command{ssh-agent} on Windows for password-less
+interaction, @option{ssh} methods depend on the environment variable
address@hidden  But this variable is not set when
address@hidden is started from a Desktop shortcut and
+authentication fails.
+
+One workaround is to use a Windows based SSH Agent, such as
+Pageant.  It is part of the Putty Suite of tools.
+
+The fallback is to start @value{emacsname} from a shell.
 
 
 @node Usage
 @chapter Using @value{tramp}
 @cindex using @value{tramp}
 
-Once you have installed @value{tramp} it will operate fairly
-transparently.  You will be able to access files on any remote host
-that you can log in to as though they were local.
-
-Files are specified to @value{tramp} using a formalized syntax specifying the
-details of the system to connect to.  This is similar to the syntax used
-by the @value{ftppackagename} package.
address@hidden operates transparently, accessing remote files as if
+they are local.  However, @value{tramp} employs a formalized remote
+file naming syntax to perform its functions transparently.  This
+syntax consists of many parts specifying access methods,
+authentication, host names, and file names.
address@hidden emacs
address@hidden uses a similar syntax.
address@hidden ifset
 
 @cindex type-ahead
-Something that might happen which surprises you is that
address@hidden remembers all your keystrokes, so if you see a
-password prompt from @value{emacsname}, say, and hit @address@hidden
-twice instead of once, then the second keystroke will be processed by
address@hidden after @value{tramp} has done its thing.  Why, this
-type-ahead is normal behavior, you say.  Right you are, but be aware
-that opening a remote file might take quite a while, maybe half a
-minute when a connection needs to be opened.  Maybe after half a
-minute you have already forgotten that you hit that key!
+
+Unlike opening local files in @value{emacsname}, which are
+instantaneous, opening remote files in @value{tramp} is slower at
+first.  Sometimes there is a noticable delay before the prompts for
+passwords or authentication appear in the minibuffer.  Hitting
address@hidden@key{RET}} or other keys during this gap will be processed by
address@hidden  This type-ahead facility is a feature of
address@hidden that may cause missed prompts when using
address@hidden
 
 @menu
 * File name Syntax::            @value{tramp} file name conventions.
@@ -2458,107 +2263,96 @@ minute you have already forgotten that you hit that 
key!
 @cindex file name syntax
 @cindex file name examples
 
-To access the file @var{localname} on the remote host @var{host}
-you would specify the file name @address@hidden, , host,
-localname}}.  This will connect to @var{host} and transfer the file
-using the default method.  @xref{Default Method}.
-
-Some examples of @value{tramp} file names are shown below.
address@hidden@trampfn{, , host, localfilename}}
+opens file @var{localfilename} on the remote host @var{host}, using
+the default method.  @xref{Default Method}.
 
 @table @file
 @item @address@hidden
-Edit the file @file{.emacs} in your home directory on the host
+For the file @file{.emacs} located in the home directory, on the host
 @code{melancholia}.
 
 @item @address@hidden
-This edits the same file, using the fully qualified domain name of
+For the file @file{.emacs} specified using the fully qualified domain name of
 the host.
 
 @item @address@hidden/.emacs
-This also edits the same file; the @file{~} is expanded to your
-home directory on the remote host, just like it is locally.
+For the file @file{.emacs} specified using the @file{~}, which is expanded.
 
 @item @address@hidden/.emacs
-This edits the file @file{.emacs} in the home directory of the user
address@hidden on the host @code{melancholia}.  The @file{~<user>}
-construct is expanded to the home directory of that user on the remote
-host.
+For the file @file{.emacs} located in @code{daniel}'s home directory
+on the host, @code{melancholia}.  The @file{~<user>} construct is
+expanded to the home directory of that user on the remote host.
 
 @item @address@hidden/etc/squid.conf
-This edits the file @file{/etc/squid.conf} on the host
address@hidden
+For the file @file{/etc/squid.conf} on the host @code{melancholia}.
 
 @end table
 
address@hidden can also be an IPv4 or IPv6 address, like in
address@hidden@trampfn{, , 127.0.0.1, .emacs}} or @address@hidden, ,
address@hidden can take IPv4 or IPv6 address, as in @address@hidden, ,
+127.0.0.1, .emacs}} or @address@hidden, ,
 @value{ipv6prefix}::address@hidden, .emacs}}.
 @ifset emacs
 For syntactical reasons, IPv6 addresses must be embedded in square
 brackets @address@hidden and @address@hidden
 @end ifset
 
-Unless you specify a different name to use, @value{tramp} will use the
-current local user name as the remote user name to log in with.  If you
-need to log in as a different user, you can specify the user name as
-part of the file name.
+By default, @value{tramp} will use the current local user name as the
+remote user name for log in to the remote host.  Specifying a different
+name using the proper syntax will override this default behavior:
+
address@hidden
address@hidden, user, host, path/to.file}
address@hidden example
+
address@hidden@trampfn{, daniel, melancholia, .emacs}} is for file
address@hidden in @code{daniel}'s home directory on the host,
address@hidden
 
-To log in to the remote host as a specific user, you use the syntax
address@hidden@trampfn{, user, host, path/to.file}}.  That means that
-connecting to @code{melancholia} as @code{daniel} and editing
address@hidden in your home directory you would specify
address@hidden@trampfn{, daniel, melancholia, .emacs}}.
+Specify other file access methods (@pxref{Inline methods},
address@hidden methods}) as part of the file name.
 
-It is also possible to specify other file transfer methods
-(@pxref{Inline methods}, @pxref{External methods}) as part of the
-file name.
 @ifset emacs
-This is done by putting the method before the user and host name, as
-in @address@hidden@address@hidden (Note the
-trailing colon).
+Method name comes before user name, as in
address@hidden@address@hidden@value{postfixhop}} (Note the trailing
+colon).
 @end ifset
 @ifset xemacs
 This is done by replacing the initial @address@hidden with
address@hidden@value{prefix}<method>@value{postfixhop}}.  (Note the trailing
address@hidden@address@hidden@value{postfixhop}} (Note the trailing
 slash!).
 @end ifset
-The user, host and file specification remain the same.
+The syntax specificaton for user, host, and file do not change.
 
-So, to connect to the host @code{melancholia} as @code{daniel},
-using the @option{ssh} method to transfer files, and edit
address@hidden in my home directory I would specify the file name
address@hidden@trampfn{ssh, daniel, melancholia, .emacs}}.
+To connect to the host @code{melancholia} as @code{daniel}, using
address@hidden method for @file{.emacs} in @code{daniel}'s home
+directory, the full specification is: @address@hidden, daniel,
+melancholia, .emacs}}.
 
address@hidden emacs
-A remote file name containing a host name only, which is equal to a
-method name, is not allowed.  If such a host name is used, it must
-always be preceded by an explicit method name, like
address@hidden@address@hidden@value{postfix}}.
address@hidden ifset
+A remote file name containing a host name, which is the same string as
+a method name, is not allowed.
 
-Finally, for some methods it is possible to specify a different port
-number than the default one, given by the method.  This is specified
-by adding @file{#<port>} to the host name, like in @address@hidden,
-daniel, melancholia#42, .emacs}}.
+For specifying port numbers, affix @file{#<port>} to the host
+name.  For example: @address@hidden, daniel, melancholia#42,
+.emacs}}.
 
 
 @node File name completion
 @section File name completion
 @cindex file name completion
 
-File name completion works with @value{tramp} for completion of method
-names, of user names and of host names as well as for completion of
-file names on remote hosts.
address@hidden can complete the following @value{tramp} file name
+components: method names, user names, host names, and file names
+located on remote hosts.
 @ifset emacs
-In order to enable this, partial completion must be activated in your
address@hidden
+Enable this by activating partial completion in @file{.emacs}.
 @ifinfo
 @xref{Completion Options, , , @value{emacsdir}}.
 @end ifinfo
 @end ifset
 
-If you, for example, type @kbd{C-x C-f @value{prefix}t
address@hidden, @value{tramp} might give you as result the choice for
+For example, type @kbd{C-x C-f @value{prefix}t @key{TAB}},
address@hidden completion choices show up as
 
 @example
 @c @multitable address@hidden, , melancholia.danann.net,}} address@hidden, , 
192.168.0.1,}}
@@ -2580,12 +2374,11 @@ is a possible completion for the respective method,
 @end ifset
 and @address@hidden@value{postfix}}
 might be a host @value{tramp} has detected in your @file{~/.ssh/known_hosts}
-file (given you're using default method @option{ssh}).
+file (when using @option{ssh} as default method).
 
-If you go on to type @kbd{e @key{TAB}}, the minibuffer is completed to
address@hidden@address@hidden
-Next @address@hidden brings you all host names @value{tramp} detects in
-your @file{/etc/hosts} file, let's say
+Type @kbd{e @key{TAB}} for the minibuffer completion to
address@hidden@address@hidden  Typing @address@hidden
+shows host names @value{tramp} from @file{/etc/hosts} file, for example.
 
 @example
 @multitable @columnfractions .5 .5
@@ -2596,21 +2389,20 @@ your @file{/etc/hosts} file, let's say
 @end multitable
 @end example
 
-Now you can choose the desired host, and you can continue to
-complete file names on that host.
+Choose a host from the above list and then continue to complete file
+names on that host.
 
-If the configuration files (@pxref{Customizing Completion}), which
address@hidden uses for analysis of completion, offer user names, those user
-names will be taken into account as well.
+When the configuration (@pxref{Customizing Completion}) includes user
+names, then the completion lists will account for the user names as well.
 
-Remote hosts which have been visited in the past and kept
-persistently (@pxref{Connection caching}) will be offered too.
+Remote hosts previously visited or hosts whose connections are kept
+persistently (@pxref{Connection caching}) will be included in the
+completion lists.
 
-Once the remote host identification is completed, it comes to
-file name completion on the remote host.  This works pretty much like
-for files on the local host, with the exception that minibuffer
-killing via a double-slash works only on the file name part, except
-that file name part starts with @file{//}.
+After remote host name completion comes completion of file names on
+the remote host.  It works the same as on loal host file completion
+except when killing with double-slash @file{//} kills only the file
+name part of the @value{tramp} file name syntax.
 @ifset emacs
 A triple-slash stands for the default behavior.
 @end ifset
@@ -2642,18 +2434,17 @@ Example:
 @end ifset
 @end example
 
-A remote directory might have changed its contents out of
address@hidden control, for example by creation or deletion of
-files by other processes.  Therefore, during file name completion, the
-remote directory contents are reread regularly in order to detect such
-changes, which would be invisible otherwise (@pxref{Connection caching}).
+During file name completion, remote directory contents are re-read
+regularly to account for any changes in the filesystem that may affect
+the completion candidates.  Such re-reads can account for changes to
+the file system by applications outside @value{emacsname}
+(@pxref{Connection caching}).
 
address@hidden tramp-completion-reread-directory-timeout
 @defopt tramp-completion-reread-directory-timeout
-This custom option defines the number of seconds since last remote
-command before rereading a directory contents.  A value of 0 would
-require an immediate reread during file name completion, @code{nil}
-means to use always cached values for the directory contents.
address@hidden tramp-completion-reread-directory-timeout
+The timeout is number of seconds since last remote command for
+rereading remote directory contents.  0 re-reads immediately during
+file name completion, @code{nil} uses cached directory contents.
 @end defopt
 
 
@@ -2662,17 +2453,15 @@ means to use always cached values for the directory 
contents.
 @cindex multi-hop, ad-hoc
 @cindex proxy hosts, ad-hoc
 
-Multiple hops are configured with the variable
address@hidden (@pxref{Multi-hops}).  However,
-sometimes it is desirable to reach a remote host immediately, without
-configuration changes.  This can be reached by an ad-hoc specification
-of the proxies.
address@hidden file name syntax can accommodate ad hoc specification of
+multiple proxies without using @code{tramp-default-proxies-alist}
+configuration setup(@pxref{Multi-hops}).
 
-A proxy looks like a remote file name specification without the local
-file name part.  It is prepended to the target remote file name,
-separated by @samp{|}.  As an example, a remote file on
address@hidden@@remotehost}, passing the proxy @samp{bird@@bastion}, could
-be opened by
+Each proxy is specified using the same syntax as the remote host
+specification minus the file name part.  Each hop is separated by a
address@hidden|}.  Chain the proxies from the starting host to the destination
+remote host name and file name.  For example, hopping over a single
+proxy @samp{bird@@bastion} to a remote file on @samp{you@@remotehost}:
 
 @example
 @c @kbd{C-x C-f @address@hidden@@bastion|ssh, you,
@@ -2680,21 +2469,23 @@ be opened by
 @kbd{C-x C-f @address@hidden@@bastion|address@hidden@@address@hidden/path}
 @end example
 
-Multiple hops can be cascaded, separating all proxies by @samp{|}.
-The proxies can also contain the patterns @code{%h} or @code{%u}.
+Proxies can take patterns @code{%h} or @code{%u}.
 
-The ad-hoc definition is added on the fly to
address@hidden  Therefore, during the lifetime of
-the @value{emacsname} session it is not necessary to enter this ad-hoc
-specification, again.  The remote file name @address@hidden, you,
-remotehost, /path}} would be sufficient from now on.
address@hidden adds the ad-hoc definitions on the fly to
address@hidden and is available for re-use during
+that @value{emacsname} session.  Subsequent @value{tramp} connections
+to the same remote host can then use the shortcut form:
address@hidden@trampfn{ssh, you, remotehost, /path}}.
 
address@hidden tramp-save-ad-hoc-proxies
 @defopt tramp-save-ad-hoc-proxies
-This custom option controls whether ad-hoc definitions are kept
-persistently in @option{tramp-default-proxies-alist}.  That means,
-those definitions are available also for future @value{emacsname}
-sessions.
address@hidden tramp-save-ad-hoc-proxies
+For ad-hoc definitions to be saved automatically in
address@hidden for future @value{emacsname}
+sessions, set @option{tramp-save-ad-hoc-proxies}.
+
address@hidden
+(setq tramp-save-ad-hoc-proxies t)
address@hidden lisp
 @end defopt
 
 
@@ -2703,11 +2494,14 @@ sessions.
 @cindex compile
 @cindex recompile
 
address@hidden supports running processes on a remote host.  This
-allows to exploit @value{emacsname} packages without modification for
-remote file names.  It does not work for the @option{ftp} method.
-Association of a pty, as specified in @code{start-file-process}, is
-not supported.
address@hidden supports starting new running processes on the remote
+host for discovering remote file names.  @value{emacsname} packages on
+the remote host need no specific modifications for @value{tramp}'s
+use.
+
+This type of integration does not work with the @option{ftp} method,
+and does not support the pty association as specified in
address@hidden
 
 @code{process-file} and @code{start-file-process} work on the remote
 host when the variable @code{default-directory} is remote:
@@ -2718,51 +2512,53 @@ host when the variable @code{default-directory} is 
remote:
                       "/bin/sh" "-c" "grep -e tramp *"))
 @end lisp
 
+
 @ifset emacsgvfs
-If the remote host is mounted via GVFS (see @ref{GVFS based methods}),
-the remote filesystem is mounted locally.  Therefore, there are no
-remote processes; all processes run still locally on your host with
-an adapted @code{default-directory}.  This section does not apply for
-such connection methods.
+Remote processes do not apply to GVFS (see @ref{GVFS based methods})
+because the remote file system is mounted on the local host and
address@hidden just accesses by changing the @code{default-directory}.
 @end ifset
 
-Remote processes are started when a corresponding command is executed
-from a buffer belonging to a remote file or directory.  Up to now, the
-packages @file{compile.el} (commands like @code{compile} and
address@hidden) and @file{gud.el} (@code{gdb} or @code{perldb}) have been
-integrated.  Integration of further packages is planned, any help for
-this is welcome!
address@hidden starts a remote process when a command is executed in a
+remote file or directory buffer.  As of now, these packages have been
+integrated to work with @value{tramp}: @file{compile.el} (commands
+like @code{compile} and @code{grep}) and @file{gud.el} (@code{gdb} or
address@hidden).
 
-When your program is not found in the default search path
address@hidden sets on the remote host, you should either use an
-absolute path, or extend @code{tramp-remote-path} (see @ref{Remote
-programs}):
+For @value{tramp} to find the command on the remote, it must be
+accessible through the default search path as setup by @value{tramp}
+upon first connection.  Alternatively, use an absolute path or extend
address@hidden (see @ref{Remote programs}):
 
 @lisp
 (add-to-list 'tramp-remote-path "~/bin")
 (add-to-list 'tramp-remote-path "/appli/pub/bin")
 @end lisp
 
-The environment for your program can be adapted by customizing
address@hidden  This variable is a list of
-strings.  It is structured like @code{process-environment}.  Each
-element is a string of the form @samp{ENVVARNAME=VALUE}.  An entry
address@hidden disables the corresponding environment variable,
-which might have been set in your init file like @file{~/.profile}.
+Customize @code{tramp-remote-process-environment} to suit the remote
+program's environment for the remote host.
address@hidden is a list of strings
+structured similar to @code{process-environment}, where each element
+is a string of the form @samp{ENVVARNAME=VALUE}.
+
+To avoid any conflicts with local host variables set through local
+configuration files, such as @file{~/.profile}, use @samp{ENVVARNAME=}
+to unset them for the remote environment.
 
 @noindent
-Adding an entry can be performed via @code{add-to-list}:
+Use @code{add-to-list} to add entries:
 
 @lisp
 (add-to-list 'tramp-remote-process-environment "JAVA_HOME=/opt/java")
 @end lisp
 
-Changing or removing an existing entry is not encouraged.  The default
-values are chosen for proper @value{tramp} work.  Nevertheless, if for
-example a paranoid system administrator disallows changing the
address@hidden environment variable, you can customize
address@hidden, or you can apply the
-following code in your @file{.emacs}:
+Modifying or deleting already existing values in the
address@hidden list may not be feasible on
+restricted remote hosts.  For example, some system administrators
+disallow changing @env{HISTORY} variable.  To accommodate such
+restrictions when using @value{tramp}, fix the
address@hidden by the following code in the
+local @file{.emacs} file:
 
 @lisp
 (let ((process-environment tramp-remote-process-environment))
@@ -2770,31 +2566,29 @@ following code in your @file{.emacs}:
   (setq tramp-remote-process-environment process-environment))
 @end lisp
 
-When running @code{process-file} or @code{start-file-process} on a
-remote @code{default-directory}, the default settings in
address@hidden are not used as it is the case for local
-processes.  However, if you need environment variables other than set
-in @code{tramp-remote-process-environment}, you can let-bind them to
address@hidden Only those variables will be set then:
address@hidden does not use the defaults specified in
address@hidden for running @code{process-file} or
address@hidden on remote hosts.  When values from
address@hidden are needed for remote processes, then set
+them as follows:
 
 @lisp
 (let ((process-environment (cons "HGPLAIN=1" process-environment)))
   (process-file @dots{}))
 @end lisp
 
-This works only for environment variables which are not set already in
+This works only for environment variables not already set in the
 @code{process-environment}.
 
-If you use other @value{emacsname} packages which do not run
-out-of-the-box on a remote host, please let us know.  We will try to
-integrate them as well.  @xref{Bug Reports}.
+For integrating other @value{emacsname} packages so @value{tramp} can
+execute remotely, please file a bug report.  @xref{Bug Reports}.
 
 
 @subsection Running remote programs that create local X11 windows
 
-If you want to run a remote program, which shall connect the X11
-server you are using with your local host, you can set the
address@hidden environment variable on the remote host:
+To allow a remote program to create an X11 window on the local host,
+set the @env{DISPLAY} environment variable for the remote host as
+follows in the local @file{.emacs} file:
 
 @lisp
 (add-to-list 'tramp-remote-process-environment
@@ -2802,65 +2596,61 @@ server you are using with your local host, you can set 
the
 @end lisp
 
 @noindent
address@hidden(getenv "DISPLAY")} shall return a string containing a host
-name, which can be interpreted on the remote host; otherwise you might
-use a fixed host name.  Strings like @code{:0} cannot be used properly
-on the remote host.
-
-Another trick might be that you put @code{ForwardX11 yes} or
address@hidden yes} to your @file{~/.ssh/config} file for
-that host.
address@hidden(getenv "DISPLAY")} should return a recognizable name for the
+local host that the remote host can redirect X11 window
+interactions.  If querying for a recognizable name is not possible for
+whatever reason, then replace @code{(getenv "DISPLAY")} with a
+hard-coded, fixed name.  Note that using @code{:0} for X11 display name
+here will not work as expected.
+
+An alternate approach is specify @code{ForwardX11 yes} or
address@hidden yes} in the file @file{~/.ssh/config} on the
+local host.
 
 
 @subsection Running @code{shell} on a remote host
 @cindex shell
 
-Calling @kbd{M-x shell} in a buffer related to a remote host runs the
-local shell as defined in @option{shell-file-name}.  This might be
-also a valid file name for a shell to be applied on the remote host,
-but it will fail at least when your local and remote hosts belong to
-different system types, like @samp{windows-nt} and @samp{gnu/linux}.
-
-You must set the variable @option{explicit-shell-file-name} to the
-shell file name on the remote host, in order to start that shell on
-the remote host.
+Set @option{explicit-shell-file-name} to the appropriate shell name
+when using @value{tramp} between two hosts with different operating
+systems, such as @samp{windows-nt} and @samp{gnu/linux}.  This option
+ensures the correct name of the remote shell program.
 
 @ifset emacs
-Starting with Emacs 24 this won't be necessary, if you call
address@hidden interactively.  You will be asked for the remote shell
-file name, if you are on a remote buffer, and if
address@hidden is equal to @code{nil}.
+Starting with Emacs 24, when @option{explicit-shell-file-name} is
+equal to @code{nil}, calling @code{shell} interactively will prompt
+for a shell name.
 @end ifset
 
 
 @subsection Running @code{shell-command} on a remote host
 @cindex shell-command
 
address@hidden allows to execute commands in a shell, either
-synchronously, either asynchronously.  This works also on remote
-hosts.  Example:
address@hidden executes commands synchronously or asynchronously
+on remote hosts and displays output in buffers on the local
+host.  Example:
 
 @example
 @kbd{C-x C-f @trampfn{sudo, , , } @key{RET}}
 @kbd{M-! tail -f /var/log/syslog.log & @key{RET}}
 @end example
 
-You will see the buffer @file{*Async Shell Command*}, containing the
-continuous output of the @command{tail} command.
address@hidden command outputs continuously to the local buffer,
address@hidden Shell Command*}
 
 @ifset emacs
-A similar behavior can be reached by @kbd{M-x auto-revert-tail-mode},
-if available.
address@hidden auto-revert-tail-mode} runs similarly showing continuous output.
 @end ifset
 
 
 @subsection Running @code{eshell} on a remote host
 @cindex eshell
 
address@hidden is integrated into @file{eshell.el}.  That is, you can
-open an interactive shell on your remote host, and run commands there.
-After you have started @kbd{M-x eshell}, you could perform commands
-like this:
address@hidden is integrated into @file{eshell.el}, which enables
+interactive eshell sessions on remote hosts at the command prompt.
+You must add the module @code{eshell-tramp} to
address@hidden  Here's a sample interaction after opening
address@hidden eshell} on a remote host:
 
 @example
 @b{~ $} cd @trampfn{sudo, , , /etc} @key{RET}
@@ -2874,12 +2664,11 @@ uid=0(root) gid=0(root) groups=0(root)
 @end example
 
 @ifset emacs
-Since @value{emacsname} 23.2, @code{eshell} has also an own
-implementation of the @code{su} and @code{sudo} commands.  Both
-commands change the default directory of the @file{*eshell*} buffer to
-the value related to the user the command has switched to.  This works
-even on remote hosts, adding silently a corresponding entry to the
-variable @code{tramp-default-proxies-alist} (@pxref{Multi-hops}):
address@hidden in @value{emacsname} 23.2 added custom @code{su} and
address@hidden commands that set the default directory correctly for the
address@hidden buffer.  @value{tramp} silently updates
address@hidden with an entry for this directory
+(@pxref{Multi-hops}):
 
 @example
 @b{~ $} cd @trampfn{ssh, user, remotehost, /etc} @key{RET}
@@ -2902,56 +2691,51 @@ uid=0(root) gid=0(root) groups=0(root)
 @cindex gdb
 @cindex perldb
 
address@hidden offers a unified interface to several symbolic
-debuggers
address@hidden provides a unified interface to symbolic debuggers
 @ifset emacs
 @ifinfo
 (@ref{Debuggers, , , @value{emacsdir}}).
 @end ifinfo
 @end ifset
-With @value{tramp}, it is possible to debug programs on
-remote hosts.  You can call @code{gdb} with a remote file name:
address@hidden can run debug on remote hosts by calling @code{gdb}
+with a remote file name:
 
 @example
 @kbd{M-x gdb @key{RET}}
 @b{Run gdb (like this):} gdb --annotate=3 @trampfn{ssh, , host, ~/myprog} 
@key{RET}
 @end example
 
-The file name can also be relative to a remote default directory.
-Given you are in a buffer that belongs to the remote directory
address@hidden, , host, /home/user}, you could call
+Relative file names are based on the remote default directory.  When
address@hidden exists in @address@hidden, , host, /home/user}},
+valid calls include:
 
 @example
 @kbd{M-x perldb @key{RET}}
 @b{Run perldb (like this):} perl -d myprog.pl @key{RET}
 @end example
 
-It is not possible to use just the absolute local part of a remote
-file name as program to debug, like @kbd{perl -d
-/home/user/myprog.pl}, though.
+Just the local part of a remote file name, such as @kbd{perl -d
+/home/user/myprog.pl}, is not possible.
 
-Arguments of the program to be debugged are taken literally.  That
-means, file names as arguments must be given as ordinary relative or
-absolute file names, without any remote specification.
+Arguments of the program to be debugged must be literal, can take
+relative or absolute paths, but not remote paths.
 
 
 @subsection Running remote processes on Windows hosts
 @cindex winexe
 @cindex powershell
 
-With the help of the @command{winexe} it is possible tu run processes
-on a remote Windows host.  @value{tramp} has implemented this for
address@hidden and @code{start-file-process}.
address@hidden runs processes on a remote Windows host, and
address@hidden can use it for @code{process-file} and
address@hidden
 
-The variable @code{tramp-smb-winexe-program} must contain the file
-name of your local @command{winexe} command.  On the remote host,
-Powershell V2.0 must be installed; it is used to run the remote
-process.
address@hidden specifies the local @command{winexe}
+command.  Powershell V2.0 on the remote host is required to run
+processes triggered from @value{tramp}.
 
-In order to open a remote shell on the Windows host via @kbd{M-x
-shell}, you must set the variables @option{explicit-shell-file-name}
-and @option{explicit-*-args}.  If you want, for example, run
address@hidden, you must set:
address@hidden and @option{explicit-*-args} have to
+be set properly so @kbd{M-x shell} can open a proper remote shell on a
+Windows host.  To open @command{cmd}, set it as follows:
 
 @lisp
 (setq explicit-shell-file-name "cmd"
@@ -2959,7 +2743,7 @@ and @option{explicit-*-args}.  If you want, for example, 
run
 @end lisp
 
 @noindent
-In case of running @command{powershell} as remote shell, the settings are
+To open @command{powershell} as a remote shell, use this:
 
 @lisp
 (setq explicit-shell-file-name "powershell"
@@ -2971,34 +2755,32 @@ In case of running @command{powershell} as remote 
shell, the settings are
 @section Cleanup remote connections
 @cindex cleanup
 
-Sometimes it is useful to cleanup remote connections.  The following
-commands support this.
address@hidden provides several ways to flush remote connections.
 
 @deffn Command tramp-cleanup-connection vec
 This command flushes all connection related objects.  @option{vec} is
-the internal representation of a remote connection.  Called
-interactively, the command offers all active remote connections in the
-minibuffer as remote file name prefix like @address@hidden,
-user, host, }}.  The cleanup includes password cache (@pxref{Password
-handling}), file cache, connection cache (@pxref{Connection caching}),
-connection buffers.
+the internal representation of a remote connection.  When called
+interactively, this command lists active remote connections in the
+minibuffer.  Each connection is of the format @address@hidden,
+user, host, }}.  Flushing remote connections also cleans the password
+cache (@pxref{Password handling}), file cache, connection cache
+(@pxref{Connection caching}), and connection buffers.
 @end deffn
 
 @deffn Command tramp-cleanup-this-connection
-This command flushes all objects of the current buffer's remote
-connection.  The same objects are removed as in
address@hidden
+Flushes only the current buffer's remote connection objects, the same
+as in @code{tramp-cleanup-connection}.
 @end deffn
 
 @deffn Command tramp-cleanup-all-connections
-This command flushes objects for all active remote connections.  The
-same objects are removed as in @code{tramp-cleanup-connection}.
+Flushes all active remote connection objects, the same as in
address@hidden
 @end deffn
 
 @deffn Command tramp-cleanup-all-buffers
-Like in @code{tramp-cleanup-all-connections}, all remote connections
-are cleaned up.  Additionally all buffers, which are related to a
-remote connection, are killed.
+Just as for @code{tramp-cleanup-all-connections}, all remote
+connections are cleaned up in addition to killing buffers related to
+that remote connection.
 @end deffn
 
 
@@ -3006,60 +2788,62 @@ remote connection, are killed.
 @chapter Reporting Bugs and Problems
 @cindex bug reports
 
-Bugs and problems with @value{tramp} are actively worked on by the
-development team.  Feature requests and suggestions are also more than
-welcome.
address@hidden's development team is actively engaged in solving bugs
+and problems and looks to feature requests and suggestions.
+
address@hidden's mailing list is the place for more advice and
+information on working with @value{tramp}, solving problems,
+discussing, and general discussions about @value{tramp}.
 
-The @value{tramp} mailing list is a great place to get information on
-working with @value{tramp}, solving problems and general discussion
-and advice on topics relating to the package.  It is moderated so
-non-subscribers can post but messages will be delayed, possibly up to
-48 hours (or longer in case of holidays), until the moderator approves
-your message.
address@hidden's mailing list is moderated but even non-subscribers can
+post for moderator approval.  Sometimes this approval step may take as
+long as 48 hours due to public holidays.
 
-The mailing list is at @email{tramp-devel@@gnu.org}.  Messages sent to
-this address go to all the subscribers.  This is @emph{not} the address
-to send subscription requests to.
address@hidden@@gnu.org} is the mailing list.  Messages sent to
+this address go to all the subscribers.  This is @emph{not} the
+address to send subscription requests to.
 
-Subscribing to the list is performed via
address@hidden://lists.gnu.org/mailman/listinfo/tramp-devel/,
-the @value{tramp} Mail Subscription Page}.
+To subscribe to the mailing list, visit:
address@hidden://lists.gnu.org/mailman/listinfo/tramp-devel/, the
address@hidden Mail Subscription Page}.
 
 @ifset emacs
 @ifset installchapter
-Before sending a bug report, you could check whether @value{tramp}
-works at all.  Run the test suite on your local host, @ref{Testing}.
+Before sending a bug report, run the test suite first @ref{Testing}.
 @end ifset
 @end ifset
 
 @findex tramp-bug
-To report a bug in @value{tramp}, you should execute @kbd{M-x
-tramp-bug}.  This will automatically generate a buffer with the details
-of your system and @value{tramp} version.
-
-When submitting a bug report, please try to describe in excruciating
-detail the steps required to reproduce the problem, the setup of the
-remote host and any special conditions that exist.  You should also
-check that your problem is not described already in @xref{Frequently
+Check if the bug or problem is already addressed in @xref{Frequently
 Asked Questions}.
 
-If you can identify a minimal test case that reproduces the problem,
-include that with your bug report.  This will make it much easier for
-the development team to analyze and correct the problem.
+Run @kbd{M-x tramp-bug} to generate a buffer with details of the
+system along with the details of the @value{tramp}
+installation.  Please include these details with the bug report.
+
+The bug report must describe in as excruciating detail as possible the
+steps required to reproduce the problem.  These details must include
+the setup of the remote host and any special or unique conditions that
+exist.
+
+Include a minimal test case that reproduces the problem.  This will
+help the development team find the best solution and avoid unrelated
+detours.
 
-Sometimes, there might be also problems due to Tramp caches.  Flush
-all caches before running the test, @ref{Cleanup remote connections}.
+To exclude cache-related problems, flush all caches before running the
+test, @ref{Cleanup remote connections}.
 
-Before reporting the bug, you should set the verbosity level to 6
-(@pxref{Traces and Profiles, Traces}) in the @file{~/.emacs} file and
-repeat the bug.  Then, include the contents of the @file{*tramp/foo*}
-and @file{*debug tramp/foo*} buffers in your bug report.  A verbosity
-level greater than 6 will produce a very huge debug buffer, which is
-mostly not necessary for the analysis.
+When including @value{tramp}'s messages in the bug report, increase
+the verbosity level to 6 (@pxref{Traces and Profiles, Traces}) in the
address@hidden/.emacs} file before repeating steps to the bug.  Include the
+contents of the @file{*tramp/foo*} and @file{*debug tramp/foo*}
+buffers with the bug report.
 
-Please be aware that, with a verbosity level of 6 or greater, the
address@hidden that a verbosity level greater than 6 is not necessary
+at this stage.  Also note that a verbosity level of 6 or greater, the
 contents of files and directories will be included in the debug
-buffer.  Passwords you've typed will never be included there.
+buffer.  Passwords typed in @value{tramp} will never be included
+there.
 
 
 @node Frequently Asked Questions
@@ -3069,15 +2853,15 @@ buffer.  Passwords you've typed will never be included 
there.
 
 @itemize @bullet
 @item
-Where can I get the latest @value{tramp}?
+Where is the latest @value{tramp}?
 
address@hidden is available under the URL below.
address@hidden is available at the GNU URL:
 
 @noindent
 @uref{ftp://ftp.gnu.org/gnu/tramp/}
 
 @noindent
-There is also a Savannah project page.
address@hidden's GNU project page is located here:
 
 @noindent
 @uref{http://savannah.gnu.org/projects/tramp/}
@@ -3086,38 +2870,39 @@ There is also a Savannah project page.
 @item
 Which systems does it work on?
 
-The package has been used successfully on Emacs 22, Emacs 23, Emacs
-24, XEmacs 21 (starting with 21.4), and SXEmacs 22.
+The package works successfully on Emacs 22, Emacs 23, Emacs 24, Emacs
+25, XEmacs 21 (starting with 21.4), and SXEmacs 22.
 
-The package was intended to work on Unix, and it really expects a
-Unix-like system on the remote end (except the @option{smb} method),
-but some people seemed to have some success getting it to work on MS
-Windows XP/Vista/7 @value{emacsname}.
+While Unix and Unix-like systems are the primary remote targets,
address@hidden has equal success connecting to other platforms, such as
+MS Windows XP/Vista/7.
 
 
 @item
-How could I speed up @value{tramp}?
+How to speed up @value{tramp}?
 
-In the backstage, @value{tramp} needs a lot of operations on the
-remote host.  The time for transferring data from and to the remote
-host as well as the time needed to perform the operations there count.
-In order to speed up @value{tramp}, one could either try to avoid some
-of the operations, or one could try to improve their performance.
address@hidden does many things in the background, some of which
+depends on network speeds, response speeds of remote hosts, and
+authentication delays.  During these operations, @value{tramp}'s
+responsiveness slows down.  Some suggestions within the scope of
address@hidden's settings include:
 
-Use an external method, like @option{scp}.
+Use an external method, such as @option{scp}, which are faster than
+internal methods.
 
-Use caching.  This is already enabled by default.  Information about
-the remote host as well as the remote files are cached for reuse.  The
-information about remote hosts is kept in the file specified in
address@hidden  Keep this file.  If you are
-confident that files on remote hosts are not changed out of
address@hidden' control, set @code{remote-file-name-inhibit-cache}
-to @code{nil}.  Set also @code{tramp-completion-reread-directory-timeout}
-to @code{nil}, @ref{File name completion}.
+Keep the file @code{tramp-persistency-file-name}, which is where
address@hidden caches remote information about hosts and files.  Caching
+is enabled by default.  Don't disable it.
 
-Disable version control.  If you access remote files which are not
-under version control, a lot of check operations can be avoided by
-disabling address@hidden  This can be achieved by
+Set @code{remote-file-name-inhibit-cache} to @code{nil} if remote
+files are not independently updated outside @value{tramp}'s control.
+That cache cleanup will be necessary if the remote directories or
+files are updated independent of @value{tramp}.
+
+Set @code{tramp-completion-reread-directory-timeout} to @code{nil} to
+speed up completions, @ref{File name completion}.
+
+Disable version control to avoid delays:
 
 @lisp
 (setq vc-ignore-dir-regexp
@@ -3126,49 +2911,46 @@ disabling address@hidden  This can be achieved by
               tramp-file-name-regexp))
 @end lisp
 
-Disable excessive traces.  The default trace level of @value{tramp},
-defined in the variable @code{tramp-verbose}, is 3.  You should
-increase this level only temporarily, hunting bugs.
-
+Disable excessive traces.  Set @code{tramp-verbose} to 3 or lower,
+default being 3.  Increase trace levels temporarily when hunting for
+bugs.
 
 @item
 @value{tramp} does not connect to the remote host
 
-When @value{tramp} does not connect to the remote host, there are three
-reasons heading the bug mailing list:
+Three main reasons for why @value{tramp} does not connect to the remote host:
 
 @itemize @minus
 @item
 Unknown characters in the prompt
 
address@hidden needs to recognize the prompt on the remote host
-after execution any command.  This is not possible when the prompt
-contains unknown characters like escape sequences for coloring.  This
-should be avoided on the remote side.  @xref{Remote shell setup}. for
-setting the regular expression detecting the prompt.
address@hidden needs a clean recognizable prompt on the remote host for
+accurate parsing.  Shell prompts that contain escape sequences for
+coloring cause parsing problems.  @ref{Remote shell setup} for
+customizing prompt detection using regular expressions.
 
-You can check your settings after an unsuccessful connection by
-switching to the @value{tramp} connection buffer @file{*tramp/foo*},
-setting the cursor at the top of the buffer, and applying the expression
+To check if the remote host's prompt is being recognized, use this
+test: switch to @value{tramp} connection buffer @file{*tramp/foo*},
+put the cursor at the top of the buffer, and then apply the following
+expression:
 
 @example
 @kbd{M-: (re-search-forward (concat tramp-shell-prompt-pattern "$"))}
 @end example
 
-If it fails, or the cursor is not moved at the end of the buffer, your
-prompt is not recognized correctly.
+If the cursor has not moved to the prompt at the bottom of the buffer,
+then @value{tramp} has failed to recognize the prompt.
 
-A special problem is the zsh shell, which uses left-hand side and
-right-hand side prompts in parallel.  Therefore, it is necessary to
-disable the zsh line editor on the remote host.  You shall add to
address@hidden/.zshrc} the following command:
+When using zsh on remote hosts, disable zsh line editor because zsh
+uses left-hand side and right-hand side prompts in parallel.  Add the
+following line to @file{~/.zshrc}:
 
 @example
 [ $TERM = "dumb" ] && unsetopt zle && PS1='$ '
 @end example
 
-Similar fancy prompt settings are known from the fish shell.  Here you
-must add in @file{~/.config/fish/config.fish}:
+When using fish shell on remote hosts, disable fancy formatting by
+adding the following to @file{~/.config/fish/config.fish}:
 
 @example
 function fish_prompt
@@ -3180,35 +2962,30 @@ function fish_prompt
 end
 @end example
 
-Furthermore it has been reported, that @value{tramp} (like sshfs,
-incidentally) doesn't work with WinSSHD due to strange prompt settings.
+When using WinSSHD on remote hosts, @value{tramp} do not recognize the
+strange prompt settings.
 
 @item
 Echoed characters after login
 
-When the remote host opens an echoing shell, there might be control
-characters in the welcome message.  @value{tramp} tries to suppress
-such echoes via the @command{stty -echo} command, but sometimes this
-command is not reached, because the echoed output has confused
address@hidden already.  In such situations it might be helpful to use
-the @option{sshx} or @option{scpx} methods, which allocate a pseudo tty.
address@hidden methods}.
address@hidden suppresses echos from remote hosts with the
address@hidden -echo} command.  But sometimes it is too late to suppress
+welcome messages from the remote host containing harmful control
+characters.  Using @option{sshx} or @option{scpx} methods can avoid
+this problem because they allocate a pseudo tty.  @xref{Inline
+methods}.
 
 @item
address@hidden doesn't transfer strings with more than 500 characters
-correctly
-
-On some few systems, the implementation of @code{process-send-string}
-seems to be broken for longer strings.  It is reported for HP-UX,
-FreeBSD and Tru64 Unix, for example.  This case, you should customize
-the variable @code{tramp-chunksize} to 500.  For a description how to
-determine whether this is necessary see the documentation of
address@hidden
-
-Additionally, it will be useful to set @code{file-precious-flag} to
address@hidden for @value{tramp} files.  Then the file contents will be
-written into a temporary file first, which is checked for correct
-checksum.
address@hidden stops transferring strings longer than 500 characters
+
+Set @code{tramp-chunksize} to 500 to get around this problem, which is
+related to faulty implementation of @code{process-send-string} on
+HP-UX, FreeBSD and Tru64 Unix systems.  Consult the documentation for
address@hidden to see when this is necessary.
+
+Set @code{file-precious-flag} to @code{t} for files accessed by
address@hidden so the file contents are checked using checksum by
+first saving to a temporary file.
 @ifinfo
 @pxref{Saving Buffers, , , elisp}
 @end ifinfo
@@ -3224,17 +3001,12 @@ checksum.
 
 
 @item
address@hidden does not recognize hung @command{ssh} sessions
-
-When your network connection is down, @command{ssh} sessions might
-hang.  @value{tramp} cannot detect it safely, because it still sees a
-running @command{ssh} process.  Timeouts cannot be used as well,
-because it cannot be predicted how long a remote command will last,
-for example when copying very large files.
address@hidden does not recognize if a @command{ssh} session hangs
 
-Therefore, you must configure the @command{ssh} process to die
-in such a case.  The following entry in @file{~/.ssh/config} would do
-the job:
address@hidden sessions on the local host hang when the network is
+down.  @value{tramp} cannot safely detect such hangs.  The network
+configuration for @command{ssh} can be configured to kill such hangs
+with the following command in the @file{~/.ssh/config}:
 
 @example
 Host *
@@ -3243,25 +3015,17 @@ Host *
 
 
 @item
address@hidden does not use my @command{ssh} @code{ControlPath}
address@hidden does not use default @command{ssh} @code{ControlPath}
 
-Your @code{ControlPath} setting will be overwritten by @command{ssh}
-sessions initiated by @value{tramp}.  This is because a master
-session, initiated outside @value{emacsname}, could be closed, which
-would stall all other @command{ssh} sessions for that host inside
address@hidden
-
-Consequently, if you connect to a remote host via @value{tramp}, you
-might be prompted for a password again, even if you have established
-already an @command{ssh} connection to that host.  Further
address@hidden connections to that host, for example in order to run a
-process on that host, will reuse that initial @command{ssh}
-connection.
address@hidden overwrites @code{ControlPath} settings when initiating
address@hidden sessions.  @value{tramp} does this to fend off a stall
+if a master session opened outside the @value{emacsname} session is no
+longer open.  That is why @value{tramp} prompts for the password again
+even if there is an @command{ssh} already open.
 
-If your @command{ssh} version supports the @code{ControlPersist}
-option, you could customize the variable
address@hidden to use your @code{ControlPath},
-for example:
+Some @command{ssh} versions support a @code{ControlPersist} option,
+which allows to set the @code{ControlPath} provided the variable
address@hidden is customized as follows:
 
 @lisp
 (setq tramp-ssh-controlmaster-options
@@ -3270,11 +3034,12 @@ for example:
         "-o ControlMaster=auto -o ControlPersist=yes"))
 @end lisp
 
-Note, that "%r", "%h" and "%p" must be encoded as "%%r", "%%h" and
-"%%p", respectively.
+Note how "%r", "%h" and "%p" must be encoded as "%%r", "%%h" and
+"%%p".
 
-These settings can be suppressed, if they are configured properly in
-your @file{~/.ssh/config}:
+If the @file{~/.ssh/config} is configured appropriately for the above
+behavior, then any changes to @command{ssh} can be suppressed with
+this @code{nil} setting:
 
 @lisp
 (setq tramp-use-ssh-controlmaster-options nil)
@@ -3284,44 +3049,40 @@ your @file{~/.ssh/config}:
 @item
 File name completion does not work with @value{tramp}
 
-When you log in to the remote host, do you see the output of
address@hidden in color? If so, this may be the cause of your problems.
-
address@hidden outputs @acronym{ANSI} escape sequences that your terminal
-emulator interprets to set the colors.  These escape sequences will
-confuse @value{tramp} however.
-
-In your @file{.bashrc}, @file{.profile} or equivalent on the remote
-host you probably have an alias configured that adds the option
address@hidden or @option{--color=auto}.
address@hidden escape sequences from the remote shell may cause errors
+in @value{tramp}'s parsing of remote buffers.
 
-You should remove that alias and ensure that a new login @emph{does not}
-display the output of @command{ls} in color.  If you still cannot use
-file name completion, report a bug to the @value{tramp} developers.
+To test if this is the case, open a remote shell and check if the output
+of @command{ls} is in color.
 
+To disable @acronym{ANSI} escape sequences from the remote hosts,
+disable @option{--color=yes} or @option{--color=auto} in the remote
+host's @file{.bashrc} or @file{.profile}.  Turn this alias on and off
+to see if file name completion works.
 
 @item
-File name completion does not work in large directories
+File name completion does not work in directories with large number of
+files
 
address@hidden uses globbing for some operations.  (Globbing means to use the
-shell to expand wildcards such as @samp{*.c}.)  This might create long
-command lines, especially in directories with many files.  Some shells
-choke on long command lines, or don't cope well with the globbing
-itself.
+This may be related to globbing, which is the use of shell's ability
+to expand wild card specifications, such as @samp{*.c}.  For
+directories with large number of files, globbing might exceed the
+shell's limit on length of command lines and hang.  @value{tramp} uses
+globbing.
 
-If you have a large directory on the remote end, you may wish to execute
-a command like @samp{ls -d * ..?* > /dev/null} and see if it hangs.
-Note that you must first start the right shell, which might be
address@hidden/bin/sh}, @command{ksh} or @command{bash}, depending on which
-of those supports tilde expansion.
+To test if globbing hangs, open a shell on the remote host and then
+run @samp{ls -d * ..?* > /dev/null}.
+
+When testing, ensure the remote shell is the same shell
+(@command{/bin/sh}, @command{ksh} or @command{bash}), that
address@hidden uses when connecting to that host.
 
 
 @item
-How can I get notified when @value{tramp} file transfers are complete?
+How to get notified after @value{tramp} completes file transfers?
 
-The following snippet can be put in your @file{~/.emacs} file.  It
-makes @value{emacsname} beep after reading from or writing to the
-remote host.
+Make @value{emacsname} beep after reading from or writing to the
+remote host with the following code in @file{~/.emacs} file.
 
 @lisp
 (defadvice tramp-handle-write-region
@@ -3346,12 +3107,11 @@ remote host.
 
 @ifset emacs
 @item
-I'ld like to get a Visual Warning when working in a sudo:ed context
+How to get a Visual Warning when working with @samp{root} privileges
 
-When you are working with @samp{root} privileges, it might be useful
-to get an indication in the buffer's modeline.  The following code,
-tested with @value{emacsname} 22.1, does the job.  You should put it
-into your @file{~/.emacs}:
+Get a modeline indication when working with @samp{root} privileges
+with the following code (tested with @value{emacsname} 22.1) in
address@hidden/.emacs} file:
 
 @lisp
 (defun my-mode-line-function ()
@@ -3367,10 +3127,10 @@ into your @file{~/.emacs}:
 
 @ifset emacs
 @item
-I'ld like to see a host indication in the mode line when I'm remote
+How to get host indication in the mode line?
 
-The following code has been tested with @value{emacsname} 22.1.  You
-should put it into your @file{~/.emacs}:
+The following code (tested with @value{emacsname} 22.1) in
address@hidden/.emacs} file shows it:
 
 @lisp
 (defconst my-mode-line-buffer-identification
@@ -3398,11 +3158,11 @@ should put it into your @file{~/.emacs}:
     my-mode-line-buffer-identification)))
 @end lisp
 
-Since @value{emacsname} 23.1, the mode line contains an indication if
address@hidden for the current buffer is on a remote host.
-The corresponding tooltip includes the name of that host.  If you
-still want the host name as part of the mode line, you can use the
-example above, but the @code{:eval} clause can be simplified:
+The mode line in @value{emacsname} 23.1 and later versions now
+contains an indication if @code{default-directory} for the current
+buffer is on a remote host.  Moreover, the corresponding tool-tip
+shows the remote host name.  The above @code{:eval} clause can also be
+simplified to show the host name in the mode line:
 
 @lisp
    '(:eval
@@ -3418,12 +3178,11 @@ example above, but the @code{:eval} clause can be 
simplified:
 
 @ifset emacs
 @item
-My remote host does not understand default directory listing options
+Remote host does not understand default options for directory listing
 
address@hidden computes the @command{dired} options depending on
-the local host you are working.  If your @command{ls} command on the
-remote host does not understand those options, you can change them
-like this:
address@hidden computes the @command{dired} options based on the
+local host but if the remote host cannot understand the same
address@hidden command, then set them with a hook as follows:
 
 @lisp
 (add-hook
@@ -3436,13 +3195,12 @@ like this:
 
 
 @item
-There's this @file{~/.sh_history} file on the remote host which keeps
-growing and growing.  What's that?
+Why is @file{~/.sh_history} file on the remote host growing?
 
-Sometimes, @value{tramp} starts @command{ksh} on the remote host for
-tilde expansion.  Maybe @command{ksh} saves the history by default.
address@hidden tries to turn off saving the history, but maybe you have
-to help.  For example, you could put this in your @file{.kshrc}:
+Due to @command{ksh} saving tilde expansions triggered by
address@hidden, the history file is probably growing rapidly.  To fix,
+turn off saving history by putting this shell code in the
address@hidden file:
 
 @example
 if [ -f $HOME/.sh_history ] ; then
@@ -3456,23 +3214,24 @@ if [ "address@hidden@}" != "unset" ] ; then
 fi
 @end example
 
-Furthermore, if you use an @option{ssh}-based method, you could add
-the following line to your @file{~/.ssh/environment} file:
+For @option{ssh}-based method, add the following line to your
address@hidden/.ssh/environment} file:
 
 @example
 HISTFILE=/dev/null
 @end example
 
 
address@hidden There are longish file names to type.  How to shorten this?
address@hidden
+How to shorten long file names when typing in @value{tramp}?
 
-Let's say you need regularly access to @address@hidden, news,
-news.my.domain, /opt/news/etc}}, which is boring to type again and
-again.  The following approaches can be mixed:
+Adapt several of these approaches to reduce typing.  If the full name
+is @address@hidden, news, news.my.domain, /opt/news/etc}}, then:
 
 @enumerate
 
address@hidden Use default values for method and user name:
address@hidden
+Use default values for method name and user name:
 
 You can define default methods and user names for hosts,
 (@pxref{Default Method}, @pxref{Default User}):
@@ -3482,18 +3241,18 @@ You can define default methods and user names for hosts,
       tramp-default-user "news")
 @end lisp
 
-The file name left to type would be
address@hidden C-f @trampfn{, , news.my.domain, /opt/news/etc}}.
+The reduced typing: @kbd{C-x C-f @trampfn{, , news.my.domain, /opt/news/etc}}.
 
-Note that there are some useful settings already.  Accessing your
-local host as @samp{root} user, is possible just by @kbd{C-x C-f
address@hidden that there are some useful shortcuts already.  Accessing
+your local host as @samp{root} user, is possible just by @kbd{C-x C-f
 @trampfn{su, , ,}}.
 
address@hidden Use configuration possibilities of your method:
address@hidden
+Use configuration options of the access method:
 
-Several connection methods (i.e., the programs used) offer powerful
-configuration possibilities (@pxref{Customizing Completion}).  In the
-given case, this could be @file{~/.ssh/config}:
+Programs used for access methods already offer powerful configurations
+(@pxref{Customizing Completion}).  For @option{ssh}, configure the
+file @file{~/.ssh/config}:
 
 @example
 Host xy
@@ -3501,30 +3260,32 @@ Host xy
      User news
 @end example
 
-The file name left to type would be @kbd{C-x C-f @trampfn{ssh, , xy,
-/opt/news/etc}}.  Depending on files in your directories, it is even
-possible to complete the host name with @kbd{C-x C-f
+The reduced typing: @kbd{C-x C-f @trampfn{ssh, , xy, /opt/news/etc}}.
+
+Depending on the number of files in the directories, host names
+completion can further reduce key strokes: @kbd{C-x C-f
 @address@hidden @key{TAB}}.
 
address@hidden Use environment variables:
address@hidden
+Use environment variables to expand long strings
 
-File names typed in the minibuffer can be expanded by environment
-variables.  You can set them outside @value{emacsname}, or even with
-Lisp:
+For long file names, set up environment variables that are expanded in
+the minibuffer.  Environment variables are set either outside
address@hidden or inside @value{emacsname} with Lisp:
 
 @lisp
 (setenv "xy" "@trampfn{ssh, news, news.my.domain, /opt/news/etc/}")
 @end lisp
 
-Then you need simply to type @kbd{C-x C-f $xy @key{RET}}, and here you
-are.  The disadvantage is that you cannot edit the file name, because
+The reduced typing: @kbd{C-x C-f $xy @key{RET}}.
+
address@hidden that file name cannot be edited here because the
 environment variables are not expanded during editing in the
 minibuffer.
 
 @item Define own keys:
 
-You can define your own key sequences in @value{emacsname}, which can
-be used instead of @kbd{C-x C-f}:
+Redefine another key sequence in @value{emacsname} for @kbd{C-x C-f}:
 
 @lisp
 (global-set-key
@@ -3537,16 +3298,16 @@ be used instead of @kbd{C-x C-f}:
      "@trampfn{ssh, news, news.my.domain, /opt/news/etc/}"))))
 @end lisp
 
-Simply typing @kbd{C-x C-y} would initialize the minibuffer for
-editing with your beloved file name.
+Simply typing @kbd{C-x C-y} would prepare minibuffer editing of file
+name.
 
-See also @uref{http://www.emacswiki.org/cgi-bin/wiki/TrampMode, the
-Emacs Wiki} for a more comprehensive example.
+See @uref{http://www.emacswiki.org/cgi-bin/wiki/TrampMode, the Emacs
+Wiki} for a more comprehensive example.
 
address@hidden Define own abbreviation (1):
address@hidden
+Define own abbreviation (1):
 
-It is possible to define an own abbreviation list for expanding file
-names:
+Abbreviation list expansion can be used to reduce typing long file names:
 
 @lisp
 (add-to-list
@@ -3554,13 +3315,16 @@ names:
  '("^/xy" . "@trampfn{ssh, news, news.my.domain, /opt/news/etc/}"))
 @end lisp
 
-This shortens the file opening command to @kbd{C-x C-f /xy
address@hidden  The disadvantage is, again, that you cannot edit the file
-name, because the expansion happens after entering the file name only.
+The reduced typing: @kbd{C-x C-f /xy @key{RET}}.
+
address@hidden that file name cannot be edited here because the
+environment variables are not expanded during editing in the
+minibuffer.
 
address@hidden Define own abbreviation (2):
address@hidden
+Define own abbreviation (2):
 
-The @code{abbrev-mode} gives more flexibility for editing the
+The @code{abbrev-mode} gives additional flexibility for editing in the
 minibuffer:
 
 @lisp
@@ -3583,18 +3347,18 @@ minibuffer:
   (expand-abbrev))
 @end lisp
 
-After entering @kbd{C-x C-f xy @key{TAB}}, the minibuffer is
-expanded, and you can continue editing.
+The reduced typing: @kbd{C-x C-f xy @key{TAB}}.
+
+The minibuffer expands for further editing.
 
 @item Use bookmarks:
 
-Bookmarks can be used to visit Tramp files or directories.
+Use bookmarks to save Tramp file names.
 @ifinfo
address@hidden, , , @value{emacsdir}}
address@hidden, , , @value{emacsdir}}.
 @end ifinfo
 
-When you have opened @address@hidden, news, news.my.domain,
-/opt/news/etc/}}, you should save the bookmark via
+Upon visiting a location with @value{tramp}, save it as a bookmark with
 @ifset emacs
 @address@hidden @key{edit} @key{bookmarks} @key{set}}.
 @end ifset
@@ -3602,7 +3366,7 @@ When you have opened @address@hidden, news, 
news.my.domain,
 @address@hidden @key{view} @key{bookmarks} @key{set}}.
 @end ifset
 
-Later on, you can always navigate to that bookmark via
+To revisit that bookmark:
 @ifset emacs
 @address@hidden @key{edit} @key{bookmarks} @key{jump}}.
 @end ifset
@@ -3621,15 +3385,15 @@ Later on, you can always navigate to that bookmark via
 remembers visited places.
 @ifinfo
 @ifset emacs
address@hidden Conveniences, , , @value{emacsdir}}
address@hidden Conveniences, , , @value{emacsdir}}.
 @end ifset
 @ifset xemacs
address@hidden, , , edit-utils}
address@hidden, , , edit-utils}.
 @end ifset
 @end ifinfo
 
-You could keep remote file names in the recent list without checking
-their readability through a remote access:
+Keep remote file names in the recent list without have to check for
+their accessibility through remote access:
 
 @lisp
 @ifset emacs
@@ -3646,7 +3410,7 @@ their readability through a remote access:
 @end ifset
 @end lisp
 
-The list of files opened recently is reachable via
+Reaching recently opened files:
 @ifset emacs
 @address@hidden @key{file} @key{Open Recent}}.
 @end ifset
@@ -3657,8 +3421,8 @@ The list of files opened recently is reachable via
 @ifset emacs
 @item Use filecache:
 
address@hidden remembers visited places.  Add the directory into
-the cache:
+Since @file{filecache} remembers visited places, add the remote
+directory to the cache:
 
 @lisp
 (eval-after-load "filecache"
@@ -3666,30 +3430,28 @@ the cache:
     "@trampfn{ssh, news, news.my.domain, /opt/news/etc/}"))
 @end lisp
 
-Whenever you want to load a file, you can enter @kbd{C-x C-f
address@hidden in the minibuffer.  The completion is done for the given
-directory.
+Then use directory completion in the minibuffer with @kbd{C-x C-f
address@hidden
 @end ifset
 
 @ifset emacs
 @item Use bbdb:
 
 @file{bbdb} has a built-in feature for @value{ftppackagename} files,
-which works also for @value{tramp}.
+which also works for @value{tramp} file names.
 @ifinfo
address@hidden, Storing FTP sites in the BBDB, , bbdb}
address@hidden, Storing FTP sites in the BBDB, , bbdb}.
 @end ifinfo
 
-You need to load @file{bbdb}:
+Load @file{bbdb} in @value{emacs}:
 
 @lisp
 (require 'bbdb)
 (bbdb-initialize)
 @end lisp
 
-Then you can create a BBDB entry via @kbd{M-x bbdb-create-ftp-site}.
-Because BBDB is not prepared for @value{tramp} syntax, you must
-specify a method together with the user name when needed. Example:
+Create a BBDB entry with @kbd{M-x bbdb-create-ftp-site}.  Then specify
+a method and user name where needed.  Examples:
 
 @example
 @kbd{M-x bbdb-create-ftp-site @key{RET}}
@@ -3700,45 +3462,42 @@ specify a method together with the user name when 
needed. Example:
 @b{Additional Comments:} @key{RET}
 @end example
 
-When you have opened your BBDB buffer, you can access such an entry by
-pressing the key @key{F}.
+In BBDB buffer, access an entry by pressing the key @key{F}.
 @end ifset
 
 @end enumerate
 
-I would like to thank all @value{tramp} users who have contributed to
-the different recipes!
+Thanks to @value{tramp} users for contributing to these recipes.
 
address@hidden
+Why saved multi-hop file names do not work in a new @value{emacsname}
+session?
 
address@hidden I have saved @value{tramp} file names as indicated.  But it
-doesn't work in a new @value{emacsname} session!
-
-If you have saved an ad-hoc multi-hop @value{tramp} file name
-(@pxref{Ad-hoc multi-hops}) via bookmarks, recent files,
+When saving ad-hoc multi-hop @value{tramp} file names (@pxref{Ad-hoc
+multi-hops}) via bookmarks, recent files,
 @ifset emacs
 filecache, bbdb,
 @end ifset
-or another package, you must use the full ad-hoc file name including
-all hops, like @address@hidden, bird,
+or another package, use the full ad-hoc file name including all hops,
+like @address@hidden, bird,
 bastion|address@hidden, /opt/news/etc}}.
 
-Alternatively, if you save only the abbreviated multi-hop file name
+Alternatively, when saving abbreviated multi-hop file names
 @address@hidden, news, news.my.domain, /opt/news/etc}}, the custom
-option @code{tramp-save-ad-hoc-proxies} must be set to a to a
address@hidden value.
+option @code{tramp-save-ad-hoc-proxies} must be set address@hidden
+value.
 
 
 @ifset emacs
 @item
-How can I use @value{tramp} to connect to a remote @value{emacsname}
-session?
+How to connect to a remote @value{emacsname} session using @value{tramp}?
 
-You can configure Emacs Client doing this.
+Configure Emacs Client
 @ifinfo
address@hidden Server, , , @value{emacsdir}}.
+(@pxref{Emacs Server, , , @value{emacsdir}}).
 @end ifinfo
 
-On the remote host, you start the Emacs Server:
+Then on the remote host, start the Emacs Server:
 
 @lisp
 (require 'server)
@@ -3747,29 +3506,31 @@ On the remote host, you start the Emacs Server:
 (server-start)
 @end lisp
 
-Make sure that the result of @code{(system-name)} can be resolved on
-your local host; otherwise you might use a hard coded IP address.
+If @code{(system-name)} of the remote host cannot be resolved on the
+local host, use IP address instead.
+
+Copy from the remote host the resulting file
address@hidden/.emacs.d/server/server} to the local host, to the same
+location.
 
-The resulting file @file{~/.emacs.d/server/server} must be copied to
-your local host, at the same location.  You can call then the Emacs
-Client from the command line:
+Then start Emacs Client from the command line:
 
 @example
 emacsclient @trampfn{ssh, user, host, /file/to/edit}
 @end example
 
address@hidden and @code{host} shall be related to your local host.
address@hidden and @code{host} refer to the local host.
 
-If you want to use Emacs Client also as editor for other programs, you
-could write a script @file{emacsclient.sh}:
+To make Emacs Client an editor for other programs, use a wrapper
+script @file{emacsclient.sh}:
 
 @example
 #!/bin/sh
 emacsclient @trampfn{ssh, $(whoami), $(hostname --fqdn), $1}
 @end example
 
-Then you must set the environment variable @env{EDITOR} pointing to
-that script:
+Then change the environment variable @env{EDITOR} to point to the
+wrapper script:
 
 @example
 export EDITOR=/path/to/emacsclient.sh
@@ -3778,18 +3539,18 @@ export EDITOR=/path/to/emacsclient.sh
 
 
 @item
-There are packages which call @value{tramp} although I haven't entered
-a remote file name ever.  I dislike it, how could I disable it?
+How to disable other packages from calling @value{tramp}?
 
-In general, @value{tramp} functions are used only when
-you apply remote file name syntax.  However, some packages enable
address@hidden on their own.
+There are packages that call @value{tramp} without the user ever
+entering a remote file name.  Even without applying a remote file
+syntax, some packages enable @value{tramp} on their own.  How can users
+disable such features.
 
 @itemize @minus
 @item
 @file{ido.el}
 
-You could disable @value{tramp} file name completion:
+Disable @value{tramp} file name completion:
 
 @lisp
 (custom-set-variables
@@ -3799,7 +3560,7 @@ You could disable @value{tramp} file name completion:
 @item
 @file{rlogin.el}
 
-You could disable remote directory tracking mode:
+Disable remote directory tracking mode:
 
 @lisp
 (rlogin-directory-tracking-mode -1)
@@ -3808,15 +3569,13 @@ You could disable remote directory tracking mode:
 
 
 @item
-How can I disable @value{tramp} at all?
-
-Shame on you, why did you read until now?
+How to disable @value{tramp}?
 
 @itemize @minus
 @ifset emacs
 @item
-If you just want to have @value{ftppackagename} as default remote
-files access package, you should apply the following code:
+To keep @value{ftppackagename} as default the remote files access
+package, set this in @file{.emacs}:
 
 @lisp
 (setq tramp-default-method "ftp")
@@ -3824,24 +3583,23 @@ files access package, you should apply the following 
code:
 @end ifset
 
 @item
-In order to disable
+To disable both
 @ifset emacs
 @value{tramp} (and @value{ftppackagename}),
 @end ifset
 @ifset xemacs
 @value{tramp},
 @end ifset
-you must set @code{tramp-mode} to @code{nil}:
+set @code{tramp-mode} to @code{nil} in @file{.emacs}.
 
 @lisp
 (setq tramp-mode nil)
 @end lisp
 
 @item
-Unloading @value{tramp} can be achieved by applying @kbd{M-x
-tramp-unload-tramp}.
+To unload @value{tramp}, type @kbd{M-x tramp-unload-tramp}.
 @ifset emacs
-This resets also the @value{ftppackagename} plugins.
+Unloading @value{tramp} resets @value{ftppackagename} plugins also.
 @end ifset
 @end itemize
 @end itemize
@@ -3852,48 +3610,44 @@ This resets also the @value{ftppackagename} plugins.
 @chapter How file names, directories and localnames are mangled and managed.
 
 @menu
-* Localname deconstruction::    Breaking a localname into its components.
+* Localname deconstruction::    Splitting a localname into its component parts.
 @ifset emacs
-* External packages::           Integration with external Lisp packages.
+* External packages::           Integrating with external Lisp packages.
 @end ifset
 @end menu
 
 
 @node Localname deconstruction
address@hidden Breaking a localname into its components
-
address@hidden file names are somewhat different, obviously, to ordinary file
-names.  As such, the lisp functions @code{file-name-directory} and
address@hidden are overridden within the @value{tramp}
-package.
address@hidden Splitting a localname into its component parts
 
-Their replacements are reasonably simplistic in their approach.  They
-dissect the file name, call the original handler on the localname and
-then rebuild the @value{tramp} file name with the result.
address@hidden package redefines lisp functions
address@hidden and @code{file-name-nondirectory} to
+accommodate the unique file naming syntax that @value{tramp} requires.
 
-This allows the platform specific hacks in the original handlers to take
-effect while preserving the @value{tramp} file name information.
+The replacements dissect the file name, use the original handler for
+the localname, take that result, and then re-build the @value{tramp}
+file name.  By relying on the original handlers for localnames,
address@hidden benefits from platform specific hacks to the original
+handlers.
 
 
 @ifset emacs
 @node External packages
address@hidden Integration with external Lisp packages
address@hidden Integrating with external Lisp packages
 @subsection File name completion.
 
-While reading file names in the minibuffer, @value{tramp} must decide
-whether it completes possible incomplete file names, or not.  Imagine
-there is the following situation: You have typed @kbd{C-x C-f
address@hidden@value{postfixhop} @key{TAB}}.  @value{tramp} cannot
-know, whether @option{ssh} is a method or a host name.  It checks
-therefore the last input character you have typed.  If this is
address@hidden, @key{SPACE} or @kbd{?}, @value{tramp} assumes that you are
-still in file name completion, and it does not connect to the possible
-remote host @option{ssh}.
-
-External packages, which use other characters for completing file names
-in the minibuffer, must signal this to @value{tramp}.  For this case,
-the variable @code{non-essential} can be bound temporarily to
-a address@hidden value.
+For name completions in the minibuffer, @value{tramp} depends on the
+last input character to decide whether to look for method name
+completion or host name completion.  For example, @kbd{C-x C-f
address@hidden@value{postfixhop} @key{TAB}} is not entirely clear
+if @option{ssh} is a method or a host name.  But if the last input
+character was either @key{TAB}, @key{SPACE} or @kbd{?}, then
address@hidden favors file name completion over host name completion.
+
+What about external packages using other characters to trigger file
+name completions? They must somehow signal this to @value{tramp}.  Use
+the variable @code{non-essential} temporarily and bind it to
address@hidden value.
 
 @lisp
 (let ((non-essential t))
@@ -3903,27 +3657,27 @@ a address@hidden value.
 
 @subsection File attributes cache.
 
-When @value{tramp} runs remote processes, files on the remote host
-could change their attributes.  Consequently, @value{tramp} must flush
-its complete cache keeping attributes for all files of the remote host
-it has seen so far.
+Keeping a local cache of remote file attributes in sync with the
+remote host is a time-consuming operation.  Flushing and re-querying
+these attributes can tax @value{tramp} to a grinding halt on busy
+remote servers.
 
-This is a performance degradation, because the lost file attributes
-must be recomputed when needed again.  In cases where the caller of
address@hidden knows that there are no file attribute changes, it
-should let-bind the variable @code{process-file-side-effects} to
address@hidden  Then @value{tramp} won't flush the file attributes cache.
+To get around these types of slow-downs in @value{tramp}'s
+responsiveness, set the @code{process-file-side-effects} to @code{nil}
+to stop @value{tramp} from flushing the cache.  This is helpful in
+situations where callers to @code{process-file} know there are no file
+attribute changes.  The let-bind form to accomplish this:
 
 @lisp
 (let (process-file-side-effects)
   @dots{})
 @end lisp
 
-For asynchronous processes, @value{tramp} flushes the file attributes
-cache via a process sentinel.  If the caller of
address@hidden knows that there are no file attribute
-changes, it should set the process sentinel to the default.  In cases
-where the caller defines its own process sentinel, @value{tramp}'s process
+For asynchronous processes, @value{tramp} uses a process sentinel to
+flush file attributes cache.  When callers to @code{start-file-process}
+know beforehand no file attribute changes are expected, then the
+process sentinel should be set to the default state.  In cases where
+the caller defines its own process sentinel, @value{tramp}'s process
 sentinel is overwritten.  The caller can still flush the file
 attributes cache in its process sentinel with this code:
 
@@ -3932,21 +3686,18 @@ attributes cache in its process sentinel with this code:
   (dired-uncache remote-directory))
 @end lisp
 
address@hidden shall be the root directory, where file
-attribute changes can happen during the process lifetime.
address@hidden traverses all subdirectories, starting at this
-directory.  Often, it is sufficient to use @code{default-directory} of
-the process buffer as root directory.
+Since @value{tramp} traverses subdirectories starting with the
+root-directory, it is most likely sufficient to make the
address@hidden of the process buffer as the root directory.
 @end ifset
 
 
 @node Traces and Profiles
 @chapter How to Customize Traces
 
-All @value{tramp} messages are raised with a verbosity level.  The
-verbosity level can be any number between 0 and 10.  Only messages with
-a verbosity level less than or equal to @code{tramp-verbose} are
-displayed.
address@hidden messages are raised with verbosity levels ranging from 0
+to 10.  @value{tramp} does not display all messages; only those with a
+verbosity level less than or equal to @code{tramp-verbose}.
 
 The verbosity levels are
 
@@ -3962,11 +3713,10 @@ The verbosity levels are
 @address@hidden @w{ 9}  test commands
 @address@hidden @w{10}  traces (huge)
 
-When @code{tramp-verbose} is greater than or equal to 4, the messages
-are also written into a @value{tramp} debug buffer.  This debug buffer
-is useful for analyzing problems; sending a @value{tramp} bug report
-should be done with @code{tramp-verbose} set to a verbosity level of at
-least 6 (@pxref{Bug Reports}).
+With @code{tramp-verbose} greater than or equal to 4, messages are
+also written to a @value{tramp} debug buffer.  Such debug buffers are
+essential to bug and problem analyses.  For @value{tramp} bug reports,
+set the @code{tramp-verbose} level to 6 (@pxref{Bug Reports}).
 
 The debug buffer is in
 @ifinfo
@@ -3975,25 +3725,23 @@ The debug buffer is in
 @ifnotinfo
 Outline Mode.
 @end ifnotinfo
-That means, you can change the level of messages to be viewed.  If you
-want, for example, see only messages up to verbosity level 5, you must
-enter @kbd{C-u 6 C-c C-q}.
+In this buffer, messages can be filtered by their level.  To see
+messages up to verbosity level 5, enter @kbd{C-u 6 C-c C-q}.
 @ifinfo
-Other keys for navigating are described in
+Other navigation keys are described in
 @ref{Outline Visibility, , , @value{emacsdir}}.
 @end ifinfo
 
address@hidden errors are handled internally in order to raise the
-verbosity level 1 messages.  When you want to get a Lisp backtrace in
-case of an error, you need to set both
address@hidden handles errors internally.  But to get a Lisp backtrace,
+both the error and the signal have to be set as follows:
 
 @lisp
 (setq debug-on-error t
       debug-on-signal t)
 @end lisp
 
-Sometimes, it might be even necessary to step through @value{tramp}
-function call traces.  Such traces are enabled by the following code:
+To enable stepping through @value{tramp} function call traces, they
+have to be specifically enabled as shown in this code:
 
 @lisp
 (require 'trace)
@@ -4003,11 +3751,10 @@ function call traces.  Such traces are enabled by the 
following code:
 (untrace-function 'tramp-gw-basic-authentication)
 @end lisp
 
-The function call traces are inserted in the buffer
address@hidden  @code{tramp-read-passwd} and
address@hidden shall be disabled when the
-function call traces are added to @value{tramp}, because both
-functions return password strings, which should not be distributed.
+The buffer @file{*trace-output*} contains the output from the function
+call traces.  Disable @code{tramp-read-passwd} and
address@hidden to stop password strings from
+being written to @file{*trace-output*}.
 
 
 @node Issues
@@ -4016,52 +3763,49 @@ functions return password strings, which should not be 
distributed.
 @itemize @bullet
 @item The uuencode method does not always work.
 
-Due to the design of @value{tramp}, the encoding and decoding programs
-need to read from stdin and write to stdout.  On some systems,
address@hidden -o -} will read stdin and write the decoded file to
-stdout, on other systems @command{uudecode -p} does the same thing.
-But some systems have uudecode implementations which cannot do this at
-all---it is not possible to call these uudecode implementations with
-suitable parameters so that they write to stdout.
address@hidden on some systems cannot write to stdout, but
address@hidden depends on encoding and decoding programs to be able to
+read from stdin and write to stdout.
 
-Of course, this could be circumvented: the @code{begin foo 644} line
-could be rewritten to put in some temporary file name, then
address@hidden could be called, then the temp file could be
-printed and deleted.
+We can find ways to circumvent @command{uudecode}'s ability to write
+to stdout, such as writing to a temporary file and then piping that to
+stdout.
 
-But I have decided that this is too fragile to reliably work, so on some
-systems you'll have to do without the uuencode methods.
+But I have decided not to implement workarounds as they are too
+fragile to work reliably.  Some on systems, @value{tramp} will not have
+uuencode method.
 
 @item The @value{tramp} file name syntax differs between Emacs and XEmacs.
 
 The Emacs maintainers wish to use a unified file name syntax for
-Ange-FTP and @value{tramp} so that users don't have to learn a new
-syntax.  It is sufficient to learn some extensions to the old syntax.
+Ange-FTP and @value{tramp} so that users don't have to learn yet
+another syntax though it is okay to learn new extensions.
 
-For the XEmacs maintainers, the problems caused from using a unified
-file name syntax are greater than the gains.  The XEmacs package system
-uses EFS for downloading new packages.  So, obviously, EFS has to be
-installed from the start.  If the file names were unified, @value{tramp}
-would have to be installed from the start, too.
+For the XEmacs maintainers, the disruption from a unified file name
+syntax are not worth the gains.  Firstly, the XEmacs package system
+relies on EFS for downloading new packages and therefore is already
+installed.  On the other hand, @value{tramp} is not installed by
+default in XEmacs.  Unifying will require @value{tramp} installed from
+the start.
 
 @ifset xemacs
address@hidden:} If you'd like to use a similar syntax like
address@hidden, you need the following settings in your init
-file:
address@hidden:} To make the syntax similar to @value{ftppackagename},
+make this change to the init file:
 
 @lisp
 (setq tramp-unified-filenames t)
 (require 'tramp)
 @end lisp
 
-The autoload of the @value{emacsname} @value{tramp} package must be
-disabled.  This can be achieved by setting file permissions @code{000}
-to the files @address@hidden/xemacs-packages/lisp/tramp/auto-autoloads.el*}.
+To disable auto loading @value{emacsname} @value{tramp} package, set
+file permissions of
address@hidden@dots{}/xemacs-packages/lisp/tramp/auto-autoloads.el*} to
address@hidden
 
-In case of unified file names, all @value{emacsname} download sites are
-added to @code{tramp-default-method-alist} with default method
address@hidden @xref{Default Method}.  These settings shouldn't be
-touched for proper working of the @value{emacsname} package system.
+When using unified file names, @value{emacsname} download sites are
+added to @code{tramp-default-method-alist} with default method of
address@hidden @xref{Default Method} for proper working of the
address@hidden package system.
 
 The syntax for unified file names is described in the @value{tramp} manual
 for @value{emacsothername}.
diff --git a/doc/misc/trampver.texi b/doc/misc/trampver.texi
index dccf317..4366796 100644
--- a/doc/misc/trampver.texi
+++ b/doc/misc/trampver.texi
@@ -8,7 +8,7 @@
 @c In the Tramp GIT, the version number is auto-frobbed from
 @c configure.ac, so you should edit that file and run
 @c "autoconf && ./configure" to change the version number.
address@hidden trampver 2.2.13-pre
address@hidden trampver 2.2.13.25.1
 
 @c Other flags from configuration
 @set instprefix /usr/local
diff --git a/doc/misc/url.texi b/doc/misc/url.texi
index 95fe5ea..121c28e 100644
--- a/doc/misc/url.texi
+++ b/doc/misc/url.texi
@@ -373,9 +373,10 @@ for specific schemes.
 * rlogin/telnet/tn3270::        Remote host connectivity.
 * irc::                         Internet Relay Chat.
 * data::                        Embedded data URLs.
-* nfs::                         Networked File System
-* ldap::                        Lightweight Directory Access Protocol
+* nfs::                         Networked File System.
+* ldap::                        Lightweight Directory Access Protocol.
 * man::                         Unix man pages.
+* Tramp::                       Schemes supported via Tramp.
 @end menu
 
 @node http/https
@@ -549,8 +550,8 @@ 
file://@var{user}:@var{password}@@@var{host}:@var{port}/@var{file}
 @noindent
 If the URL specifies a local file, it is retrieved by reading the file
 contents in the usual way.  If it specifies a remote file, it is
-retrieved using the Ange-FTP package.  @xref{Remote Files,,, emacs,
-The GNU Emacs Manual}.
+retrieved using either the Tramp or the Ange-FTP package.
address@hidden Files,,, emacs, The GNU Emacs Manual}.
 
   When retrieving a compressed file, it is automatically uncompressed
 if it has the file suffix @file{.z}, @file{.gz}, @file{.Z},
@@ -682,7 +683,8 @@ telnet://@var{user}:@var{password}@@@var{host}:@var{port}
 @end example
 
 @noindent
-but the @var{password} component is ignored.
+but the @var{password} component is ignored.  By default, the
address@hidden scheme is handled via Tramp (@pxref{Tramp}).
 
 To handle rlogin, telnet and tn3270 URLs, a @code{rlogin},
 @code{telnet} or @code{tn3270} (the program names and arguments are
@@ -798,6 +800,38 @@ The @code{man} scheme is a non-standard one.  Such URLs 
have the form
 and are retrieved by passing @var{page-spec} to the Lisp function
 @code{man}.
 
address@hidden Tramp
address@hidden URL Types Supported via Tramp
+
address@hidden url-tramp-protocols
+Some additional URL types are supported by passing them to Tramp
+(@pxref{Top, The Tramp Manual,, tramp, The Tramp Manual}).  These
+protocols are listed in the @code{url-tramp-protocols} variable, which
+you can customize.  The default value includes the following
+protocols:
+
address@hidden @code
address@hidden ftp
+The file transfer protocol.  @xref{file/ftp}.
+
address@hidden ssh
address@hidden ssh
+The secure shell protocol.  @xref{Inline Methods,,, tramp, The Tramp
+Manual}.
+
address@hidden scp
address@hidden scp
+The secure file copy protocol.  @xref{External Methods,,, tramp, The
+Tramp Manual}.
+
address@hidden rsync
address@hidden rsync
+The remote sync protocol.
+
address@hidden telnet
+The telnet protocol.
address@hidden table
+
 @node General Facilities
 @chapter General Facilities
 
@@ -1296,6 +1330,14 @@ Connect directly.
 @end table
 @end defopt
 
address@hidden url-user-agent
+The User Agent string used for sending HTTP/HTTPS requests.  The value
+should be a string or a function of no arguments that returns a
+string.  The default value is @address@hidden: @var{package-name}
+URL/Emacs}}, where @var{package-name} is the value of
address@hidden and its version, if they are address@hidden
address@hidden defopt
+
 @node GNU Free Documentation License
 @appendix GNU Free Documentation License
 @include doclicense.texi
diff --git a/etc/DEBUG b/etc/DEBUG
index 4bb17e3..be6d9ec 100644
--- a/etc/DEBUG
+++ b/etc/DEBUG
@@ -3,27 +3,163 @@ Debugging GNU Emacs
 Copyright (C) 1985, 2000-2015 Free Software Foundation, Inc.
 See the end of the file for license conditions.
 
+** Preliminaries
 
-[People who debug Emacs on Windows using Microsoft debuggers should
-read the Windows-specific section near the end of this document.]
+This section can be skipped if you are already familiar with building
+Emacs with debug info, configuring and starting GDB, and simple GDB
+debugging techniques.
 
-** When you debug Emacs with GDB, you should start GDB in the directory
+*** Configuring Emacs for debugging
+
+It is best to configure and build Emacs with special options that will
+make the debugging easier.  Here's the configure-time options we
+recommend (they are in addition to any other options you might need,
+such as --prefix):
+
+  CFLAGS='-O0 -g3' ./configure --enable-checking='yes,glyphs' 
--enable-check-lisp-object-type
+
+The CFLAGS value is important: debugging optimized code can be very
+hard.  (If the problem only happens with optimized code, you may need
+to enable optimizations.  If that happens, try using -Og first,
+instead of -O2, as the former will disable some optimizations that
+make debugging some code exceptionally hard.)
+
+Modern versions of GCC support more elaborate debug info that is
+available by just using the -g3 compiler switch.  Try using -gdwarf-4
+in addition to -g3, and if that fails, try -gdwarf-3.  This is
+especially important if you have to debug optimized code.  More info
+about this is available below; search for "analyze failed assertions".
+
+The 2 --enable-* switches are optional.  They don't have any effect on
+debugging with GDB, but will compile additional code that might catch
+the problem you are debugging much earlier, in the form of assertion
+violation.  The --enable-checking option also enables additional
+functionality useful for debugging display problems; see more about
+this below under "Debugging Emacs redisplay problems".
+
+Emacs needs not be installed to be debugged, you can debug the binary
+created in the 'src' directory.
+
+*** Configuring GDB
+
+When you debug Emacs with GDB, you should start GDB in the directory
 where the Emacs executable was made (the 'src' directory in the Emacs
 source tree).  That directory has a .gdbinit file that defines various
 "user-defined" commands for debugging Emacs.  (These commands are
 described below under "Examining Lisp object values" and "Debugging
 Emacs Redisplay problems".)
 
+Starting the debugger from Emacs, via the "M-x gdb" command (described
+below), when the current buffer visits one of the Emacs C source files
+will automatically start GDB in the 'src' directory.
+
 Some GDB versions by default do not automatically load .gdbinit files
 in the directory where you invoke GDB.  With those versions of GDB,
 you will see a warning when GDB starts, like this:
 
   warning: File ".../src/.gdbinit" auto-loading has been declined by your 
`auto-load safe-path' set to "$debugdir:$datadir/auto-load".
 
-There are several ways to overcome that difficulty, they are all
-described in the node "Auto-loading safe path" in the GDB user
-manual.  If nothing else helps, type "source /path/to/.gdbinit RET" at
-the GDB prompt, to unconditionally load the GDB init file.
+The simplest way to fix this is to add the following line to your
+~/.gdbinit file:
+
+  add-auto-load-safe-path /path/to/emacs/src/.gdbinit
+
+There are other ways to overcome that difficulty, they are all
+described in the node "Auto-loading safe path" in the GDB user manual.
+If nothing else helps, type "source /path/to/.gdbinit RET" at the GDB
+prompt, to unconditionally load the GDB init file.
+
+*** Use the Emacs GDB UI front-end
+
+We recommend using the GUI front-end for GDB provided by Emacs.  With
+it, you can start GDB by typing "M-x GDB RET".  This will suggest the
+default binary to debug; if you are going to start a new Emacs
+process, change it as needed to point to the correct binary.
+Alternatively, if you want to attach the debugger to an already
+running Emacs process, change the GDB command shown in the minibuffer
+to say this:
+
+   gdb -i=mi -p PID
+
+where PID is the numerical process ID of the running Emacs process,
+displayed by system utilities such as 'top' or 'ps' on Posix hosts and
+Task Manager on MS-Windows.
+
+Once the debugger starts, open the additional windows provided by the
+GDB UI, by typing "M-x gdb-many-windows RET".  (Alternatively, click
+Gud->GDB-MI->Display Other Windows" from the menu bar.)  At this
+point, make your frame large enough (or full-screen) such that the
+windows you just opened have enough space to show the content without
+horizontal scrolling.
+
+You can later restore your window configuration with the companion
+command "M-x gdb-restore-windows RET", or by deselecting "Display
+Other Windows" from the menu bar.
+
+*** Setting initial breakpoints
+
+Before you let Emacs run, you should now set breakpoints in the code
+which you want to debug, so that Emacs stops there and lets GDB take
+control.  If the code which you want to debug is executed under some
+rare conditions, or only when a certain Emacs command is manually
+invoked, then just set your breakpoint there, let Emacs run, and
+trigger the breakpoint by invoking that command or reproducing those
+rare conditions.
+
+If you are less lucky, and the code in question is run very
+frequently, you will have to find some way of avoiding triggering your
+breakpoint when the conditions for the buggy behavior did not yet
+happen.  There's no single recipe for this, you will have to be
+creative and study the code to see what's appropriate.  Some useful
+tricks for that:
+
+  . Make your breakpoint conditional on certain buffer or string
+    position.  For example:
+
+      (gdb) break foo.c:1234 if PT >= 9876
+
+  . Set a break point in some rarely called function, then create the
+    conditions for the bug, call that rare function, and when GDB gets
+    control, set the breakpoint in the buggy code, knowing that it
+    will now be called when the bug happens.
+
+  . If the bug manifests itself as an error message, set a breakpoint
+    in Fsignal, and when it breaks, look at the backtrace to see what
+    triggers the error.
+
+Some additional techniques are described below under "Getting control
+to the debugger".
+
+You are now ready to start your debugging session.
+
+If you are starting a new Emacs session, type "run", followed by any
+command-line arguments (e.g., "-Q") into the *gud-emacs* buffer and
+press RET.
+
+If you attached the debugger to a running Emacs, type "continue" into
+the *gud-emacs* buffer and press RET.
+
+Many variables you will encounter while debugging are Lisp objects.
+These are displayed as integer values (or structures, if you used the
+"--enable-check-lisp-object-type" option at configure time) that are
+hard to interpret, especially if they represent long lists.  You can
+use the 'pp' command to display them in their Lisp form.  That command
+displays its output on the standard error stream (on GNU/Linux, you
+can redirect that to a file using "M-x redirect-debugging-output").
+This means that if you attach GDB to a running Emacs that was invoked
+from a desktop icon, chances are you will not see the output at all,
+or it will wind up in an obscure place (check the documentation of
+your desktop environment).
+
+Additional information about displaying Lisp objects can be found
+under "Examining Lisp object values" below.
+
+The rest of this document describes specific useful techniques for
+debugging Emacs; we suggest reading it in its entirety the first time
+you are about to debug Emacs, then look up your specific issues
+whenever you need.
+
+Good luck!
 
 ** When you are trying to analyze failed assertions or backtraces, it
 is essential to compile Emacs with flags suitable for debugging.
@@ -111,6 +247,12 @@ You can also use 'pp value' to print the emacs value 
directly.
 
 To see the current value of a Lisp Variable, use 'pv variable'.
 
+These commands send their output to stderr; if that is closed or
+redirected to some file you don't know, you won't see their output.
+This is particularly so for Emacs invoked on MS-Windows from the
+desktop shortcut.  On GNU/Linux, you can use the command
+'redirect-debugging-output' to redirect stderr to a file.
+
 Note: It is not a good idea to try 'pr', 'pp', or 'pv' if you know that Emacs
 is in deep trouble: its stack smashed (e.g., if it encountered SIGSEGV
 due to stack overflow), or crucial data structures, such as 'obarray',
@@ -181,7 +323,7 @@ Then Emacs hits the breakpoint:
     [...]
   }
 
-Now we can use 'pr' to print the frame parameters:
+Now we can use 'pp' to print the frame parameters:
 
   (gdb) pp $->param_alist
   ((background-mode . light) (display-type . color) [...])
@@ -400,15 +542,16 @@ Debugging with GDB in Emacs offers some advantages over 
the command line (See
 the GDB Graphical Interface node of the Emacs manual).  There are also some
 features available just for debugging Emacs:
 
-1) The command gud-pp is available on the tool bar (the 'pp' icon) and
+1) The command gud-print is available on the tool bar (the 'p' icon) and
    allows the user to print the s-expression of the variable at point,
    in the GUD buffer.
 
 2) Pressing 'p' on a component of a watch expression that is a lisp object
    in the speedbar prints its s-expression in the GUD buffer.
 
-3) The STOP button on the tool bar is adjusted so that it sends SIGTSTP
-   instead of the usual SIGINT.
+3) The STOP button on the tool bar and the Signals->STOP menu-bar menu
+   item are adjusted so that they send SIGTSTP instead of the usual
+   SIGINT.
 
 4) The command gud-pv has the global binding 'C-x C-a C-v' and prints the
    value of the lisp variable at point.
@@ -753,91 +896,6 @@ recovering the contents of Emacs buffers from a core dump 
file.  You
 might also find those commands useful for displaying the list of
 buffers in human-readable format from within the debugger.
 
-** Some suggestions for debugging on MS Windows:
-
-   (written by Marc Fleischeuers, Geoff Voelker and Andrew Innes)
-
-To debug Emacs with Microsoft Visual C++, you either start emacs from
-the debugger or attach the debugger to a running emacs process.
-
-To start emacs from the debugger, you can use the file bin/debug.bat.
-The Microsoft Developer studio will start and under Project, Settings,
-Debug, General you can set the command-line arguments and Emacs's
-startup directory.  Set breakpoints (Edit, Breakpoints) at Fsignal and
-other functions that you want to examine.  Run the program (Build,
-Start debug).  Emacs will start and the debugger will take control as
-soon as a breakpoint is hit.
-
-You can also attach the debugger to an already running Emacs process.
-To do this, start up the Microsoft Developer studio and select Build,
-Start debug, Attach to process.  Choose the Emacs process from the
-list.  Send a break to the running process (Debug, Break) and you will
-find that execution is halted somewhere in user32.dll.  Open the stack
-trace window and go up the stack to w32_msg_pump.  Now you can set
-breakpoints in Emacs (Edit, Breakpoints).  Continue the running Emacs
-process (Debug, Step out) and control will return to Emacs, until a
-breakpoint is hit.
-
-To examine the contents of a Lisp variable, you can use the function
-'debug_print'.  Right-click on a variable, select QuickWatch (it has
-an eyeglass symbol on its button in the toolbar), and in the text
-field at the top of the window, place 'debug_print(' and ')' around
-the expression.  Press 'Recalculate' and the output is sent to stderr,
-and to the debugger via the OutputDebugString routine.  The output
-sent to stderr should be displayed in the console window that was
-opened when the emacs.exe executable was started.  The output sent to
-the debugger should be displayed in the 'Debug' pane in the Output
-window.  If Emacs was started from the debugger, a console window was
-opened at Emacs' startup; this console window also shows the output of
-'debug_print'.
-
-For example, start and run Emacs in the debugger until it is waiting
-for user input.  Then click on the 'Break' button in the debugger to
-halt execution.  Emacs should halt in 'ZwUserGetMessage' waiting for
-an input event.  Use the 'Call Stack' window to select the procedure
-'w32_msp_pump' up the call stack (see below for why you have to do
-this).  Open the QuickWatch window and enter
-"debug_print(Vexec_path)".  Evaluating this expression will then print
-out the contents of the Lisp variable 'exec-path'.
-
-If QuickWatch reports that the symbol is unknown, then check the call
-stack in the 'Call Stack' window.  If the selected frame in the call
-stack is not an Emacs procedure, then the debugger won't recognize
-Emacs symbols.  Instead, select a frame that is inside an Emacs
-procedure and try using 'debug_print' again.
-
-If QuickWatch invokes debug_print but nothing happens, then check the
-thread that is selected in the debugger.  If the selected thread is
-not the last thread to run (the "current" thread), then it cannot be
-used to execute debug_print.  Use the Debug menu to select the current
-thread and try using debug_print again.  Note that the debugger halts
-execution (e.g., due to a breakpoint) in the context of the current
-thread, so this should only be a problem if you've explicitly switched
-threads.
-
-It is also possible to keep appropriately masked and typecast Lisp
-symbols in the Watch window, this is more convenient when steeping
-though the code.  For instance, on entering apply_lambda, you can
-watch (struct Lisp_Symbol *) (0xfffffff & args[0]).
-
-Optimizations often confuse the MS debugger.  For example, the
-debugger will sometimes report wrong line numbers, e.g., when it
-prints the backtrace for a crash.  It is usually best to look at the
-disassembly to determine exactly what code is being run--the
-disassembly will probably show several source lines followed by a
-block of assembler for those lines.  The actual point where Emacs
-crashes will be one of those source lines, but not necessarily the one
-that the debugger reports.
-
-Another problematic area with the MS debugger is with variables that
-are stored in registers: it will sometimes display wrong values for
-those variables.  Usually you will not be able to see any value for a
-register variable, but if it is only being stored in a register
-temporarily, you will see an old value for it.  Again, you need to
-look at the disassembly to determine which registers are being used,
-and look at those registers directly, to see the actual current values
-of these variables.
-
 
 This file is part of GNU Emacs.
 
diff --git a/etc/NEWS b/etc/NEWS
index 20a1232..d23c7fa 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -41,11 +41,18 @@ and Mac OS X machines.
 +++
 ** Building Emacs now requires C99 or later.
 
++++
 ** Building Emacs now requires GNU make, version 3.81 or later.
 
++++
 ** New configure option --with-cairo.
-Maybe add text based on 
http://lists.gnu.org/archive/html/emacs-devel/2015-05/msg00689.html
+This builds Emacs with Cairo drawing.  As a side effect, it provides
+support for built-in printing, when Emacs was built with GTK+.
 
+** New configure option --with-modules.
+This enables support for loading dynamic modules; see below.
+
+---
 ** By default, Emacs no longer works on IRIX.  We expect that Emacs
 users are not affected by this, as SGI stopped supporting IRIX in
 December 2013.  If you are affected, please send a bug report.  You
@@ -53,12 +60,14 @@ should be able to work around the problem either by porting 
the Emacs
 undumping code to GCC under IRIX, or by configuring --with-wide-int,
 or by sticking with Emacs 24.4.
 
+---
 ** The Emacs garbage collector assumes GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS.
 The GC_MAKE_GCPROS_NOOPS stack-marking variant has been the default
 since Emacs 24.4, and the other variants were undocumented and were
 obstacles to maintenance and development.  GC_MARK_STACK and its
 related symbols have been removed from the C internals.
 
+---
 ** 'configure' now prefers gnustep-config when configuring GNUstep.
 If gnustep-config is not available, the old heuristics are used.
 
@@ -77,6 +86,7 @@ supported, and its presence led to confusion during 
configuration.
 This affects only the 'movemail' utility; Emacs itself can still
 process MMDF-format files as before.
 
++++
 ** The configure option '--enable-silent-rules' is now the default,
 and silent rules are now quieter.  To get the old behavior where
 'make' chatters a lot, configure with '--disable-silent-rules' or
@@ -94,6 +104,7 @@ be installed setgid.  The option now defaults to the 'games' 
group.
 It has no particular connection to Emacs and has not changed in years,
 so if you want to use it, you can always take a copy from an older Emacs.
 
+---
 ** Emacs 25 comes with a new set of icons.
 Various resolutions are available as etc/images/icons/hicolor/*/apps/emacs.png.
 The old Emacs logo icons are available as `emacs23.png' in the same location.
@@ -116,59 +127,67 @@ and can contain escape sequences for command keys, 
quotes, and the like.
 
 * Changes in Emacs 25.1
 
-** Any file of the form .dir-locals*.el is now considered a dir-local
-   file, and multiple can be used in the same directory. See the
-   variable `dir-locals-file' for more information.
-** `xref-find-definitions' and `describe-function' now display
-   information about mode local overrides (defined by
-   cedet/mode-local.el `define-overloadable-function' and
-   `define-mode-local-overrides').
-
-** New `display-buffer' action function `display-buffer-use-some-frame'
-This displays the buffer in an existing frame other than the current
-frame, and allows the caller to specify a frame predicate to exclude
-frames.
-
-** New doc command `describe-symbol'.  Works for functions, vars, faces, etc...
-
-** New user option `search-default-regexp-mode' specifies the default mode for 
isearch
-
-** `isearch' and `query-replace' now perform character folding in matches.
-This is analogous to case-folding, but applies between Unicode
-characters and their ASCII counterparts.  This means many characters
-will match entire groups of characters.
-
-For instance, the " will match all variants of unicode double quotes
-(like “ and ”), and the letter a will match all of its accented
-cousins, even those composed of multiple characters, as well as many
-other symbols like ℀, ℁, ⒜, and ⓐ.
-
-** New function `character-fold-to-regexp' can be used
-by searching commands to produce a regexp matching anything that
-character-folds into STRING.
-
-** New command `checkdoc-package-keywords' checks if the
-current package keywords are recognized.  Set the new option
-`checkdoc-package-keywords-flag' to non-nil to make
-`checkdoc-current-buffer' call this function automatically.
-
-** New function `checkdoc-file' checks for style errors.
-It's meant for use together with `compile':
-emacs -batch --eval "(checkdoc-file \"subr.el\")"
-
-** New command `comment-line' bound to `C-x C-;'.
+** Emacs can now load shared/dynamic libraries (modules).
+A dynamic Emacs module is a shared library that provides additional
+functionality for use in Emacs Lisp programs, just like a package
+written in Emacs Lisp would.  The functions `load', `require',
+`load-file', etc. were extended to load such modules, as they do with
+Emacs Lisp packages.  The new variable `module-file-suffix' holds the
+system-dependent value of the file-name extension (`.so' on Posix
+hosts) of the module files.
+
+A module should export a C-callable function named
+`emacs_module_init', which Emacs will call as part of the call to
+`load' or `require' which loads the module.  It should also export a
+symbol named `plugin_is_GPL_compatible' to indicate that its code is
+released under the GPL or compatible license; Emacs will refuse to
+load modules that don't export such a symbol.
+
+If a module needs to call Emacs functions, it should do so through the
+API defined and documented in the header file `emacs-module.h'.  Note
+that any module that provides Lisp-callable functions will have to use
+Emacs functions such as `fset' and `funcall', in order to register its
+functions with the Emacs Lisp interpreter.
+
+Modules can create `user-ptr' Lisp objects that embed pointers to C
+struct's defined by the module.  This is useful for keeping around
+complex data structures created by a module, to be passed back to the
+module's functions.  User-ptr objects can also have associated
+"finalizers" -- functions to be run when the object is GC'ed; this is
+useful for freeing any resources allocated for the underlying data
+structure, such as memory, open file descriptors, etc.  A new
+predicate `user-ptrp' returns non-nil if its argument is a `user-ptr'
+object.
+
+Loadable modules in Emacs are an experimental feature, and subject to
+change in future releases.  For that reason, their support is disabled
+by default, and must be enabled by using the `--with-modules' option
+at configure time.
 
-** New function `custom-prompt-customize-unsaved-options' checks for
-unsaved customizations and prompts user to customize (if found).
++++
+** Any file of the form .dir-locals*.el is now considered a dir-local
+file, and multiple such files can be used in the same directory.  See
+the variable `dir-locals-file' for more information.
 
 +++
 ** Network security (TLS/SSL certificate validity and the like) is
 added via the new Network Security Manager (NSM) and controlled via
 the `network-security-level' variable.
 
+---
+** International domain names (IDNA) are now encoded via the new
+puny.el library, so that one can visit web sites like
+"http://méxico.icom.museum";.
+
+** If Emacs isn't built with TLS support, an external TLS-capable
+program is used instead.  This program used to be run in --insecure
+mode by default, but has now changed to be secure instead, and will
+fail if you try to connect to non-verifiable hosts.  This is
+controlled by the `tls-program' variable.
+
++++
 ** C-h l now also lists the commands that were run.
 
----
 ** The new M-s M-w key binding uses eww to search the web for the
 text in the region.
 
@@ -181,16 +200,21 @@ select-enable-primary is ineffective since the system 
doesn't
 have the equivalent of a primary selection.
 
 +++
-** terpri gets an optional arg ENSURE to conditionally output a newline.
+** New option `switch-to-buffer-in-dedicated-window' allows to customize
+how `switch-to-buffer' proceeds interactively when the selected window
+is strongly dedicated to its buffer.
 
 +++
-** New macro `define-advice'.
+** The option `even-window-heights' has been renamed to
+`even-window-sizes' and now handles window widths as well.
+
++++
+** terpri gets an optional arg ENSURE to conditionally output a newline.
 
++++
 ** `insert-register' now leaves point after the inserted text
 when called interactively.  A prefix argument toggles this behavior.
 
-** New var `truncate-string-ellipsis' to choose how to indicate truncation.
-
 +++
 ** The new variable `term-file-aliases' replaces some files from lisp/term.
 The function `tty-run-terminal-initialization' consults this variable
@@ -206,114 +230,49 @@ for use in Emacs bug reports.
 hiding character but the default `.' can be used by let-binding the
 variable `read-hide-char'.
 
-** The new functions `string-collate-lessp' and `string-collate-equalp'
-preserve the collation order as defined by the system's locale(1)
-environment.  For the time being this is implemented for modern POSIX
-systems and for MS-Windows, for other systems they fall back to their
-counterparts `string-lessp' and `string-equal'.
-
-*** The ls-lisp package uses `string-collate-lessp' to sort file names.
-If you want the old, locale-independent sorting, customize the new
-option `ls-lisp-use-string-collate' to a nil value.
-
-*** The MS-Windows specific variable `w32-collate-ignore-punctuation',
-if set to a non-nil value, causes the above 2 functions to ignore
-symbol and punctuation characters when collating strings.  This
-emulates the behavior of modern Posix platforms when the locale's
-codeset is "UTF-8" (as in "en_US.UTF-8").  This is needed because
-MS-Windows doesn't support UTF-8 as codeset in its locales.
-
-+++
-** The new function `bidi-find-overridden-directionality' allows to
-find characters whose directionality was, perhaps maliciously,
-overridden by directional override control characters.  Lisp programs
-can use this to detect potential phishing of URLs and other links that
-exploits bidirectional display reordering.
-
-+++
-** The new function `buffer-substring-with-bidi-context' allows to
-copy a portion of a buffer into a different location while preserving
-the visual appearance both of the copied text and the text at
-destination, even when the copied text includes mixed bidirectional
-text and directional control characters.
-
-** New variable `ns-use-fullscreen-animation' controls animation for
-non-native NS fullscreen.  The default is nil.  Set to t to enable
-animation when entering and leaving fullscreen.  For native OSX fullscreen
-this has no effect.
-
-** A new text property `inhibit-read-only' can be used in read-only
-buffers to allow certain parts of the text to be writable.
-
-** A new function `directory-files-recursively' returns all matching
-files (recursively) under a directory.
+---
+** New input method: `tamil-dvorak'.
 
-** The new function `directory-name-p' can be used to check whether a file
-name (as returned from, for instance, `file-name-all-completions' is
-a directory file name.  It returns non-nil if the last character in
-the name is a forward slash.
+
+* Editing Changes in Emacs 25.1
 
 +++
-** New variable `fast-but-imprecise-scrolling' inhibits
-fontification during full screen scrolling operations, giving less
-hesitant operation during auto-repeat of C-v, M-v at the cost of
-possible inaccuracies in the end position.
-
-** The function `font-info' now returns more details about a font.
-In particular, it now returns the average width of the font's
-characters, which can be used for geometry-related calculations.
-
-** A new function `default-font-width' returns the average width of a
-character in the current buffer's default font.  If the default face
-is remapped (see `face-remapping-alist'), the value for the remapped
-face is returned.  This function complements the existing function
-`default-font-height'.
-
-** New functions `window-font-height' and `window-font-width' return
-the height and average width of characters in a specified face and
-window.  If FACE is remapped (see `face-remapping-alist'), the
-function returns the information for the remapped face.
-
-** A new function `window-max-chars-per-line' returns the maximal
-number of characters that can be displayed on one line.  If a face
-and/or window are provided, these values are used for the
-calculation.  This function is different from `window-body-width' in
-that it accounts for (i) continuation glyphs, (ii) the size of the
-font, and (iii) the specified window.
+** M-x suggests shorthands and ignores obsolete commands for completion.
 
-** New possible value for `system-type': nacl.
+** Changes in undo
 
 +++
-** New variable `inhibit-message', when bound to non-nil, inhibits
-   `message' and related functions from displaying messages the Echo
-   Area.  The output is still logged to the *Messages* buffer.
+*** Successive single-char deletions are collapsed in the undo-log just like
+successive char insertions.  Which commands invoke this behavior is
+controlled by the new `undo-auto-amalgamate' function.  See the node
+"Undo" in the ELisp manual for more details.
 
 +++
-** It is now safe for a mode that derives `tabulated-list-mode' to not
-call `tabulated-list-init-header', in which case it will have no
-header.
+*** The heuristic used to insert `undo-boundary' after each command
+has changed, so that if a command causes changes in more than just the
+current buffer, Emacs now calls `undo-boundary' in every buffer
+affected by the command.
 
 +++
-** `tabulated-list-print' takes a second optional argument, update,
-which specifies an alternative printing method which is faster when
-few or no entries have changed.
-
-
-* Editing Changes in Emacs 25.1
+** New command `comment-line' bound to `C-x C-;'.
 
-** Successive single-char deletions are collapsed in the undo-log just like
-successive char insertions.
+** New and improved facilities for inserting Unicode characters
 
-** Unicode names entered via C-x 8 RET now use substring completion by default.
+---
+*** Unicode names entered via C-x 8 RET now use substring completion by 
default.
 
-** C-x 8 now has shorthands for these chars: ‐ ‑ ‒ – — ― ‘ ’ “ ” † ‡ • ′ ″
++++
+*** C-x 8 now has shorthands for these chars: ‐ ‑ ‒ – — ― ‘ ’ “ ” † ‡ • ′ ″
 € № ← → ↔ − ≈ ≠ ≤ ≥.  As before, you can type C-x 8 C-h to list shorthands.
 
-** New minor mode electric-quote-mode for quoting ‘like this’ and “like this”
++++
+*** New minor mode electric-quote-mode for quoting ‘like this’ and “like this”
 as you type.  See also the new variable ‘text-quoting-style’.
 
+---
 ** New minor mode global-eldoc-mode is enabled by default.
 
+---
 ** Emacs now supports "bracketed paste mode" when running on a terminal
 that supports it.  This facility allows Emacs to understand pasted
 chunks of text as strings to be inserted, instead of interpreting each
@@ -321,6 +280,7 @@ character in the pasted text as actual user input.  This 
results in a
 paste experience similar to that under a window system, and significant
 performance improvements when pasting large amounts of text.
 
++++
 ** Emacs now supports the latest version of the UBA.
 The Emacs implementation of the Unicode Bidirectional Algorithm (UBA)
 was updated to support all the latest additions and changes introduced
@@ -329,73 +289,140 @@ This includes full support for directional isolates and 
the
 Bidirectional Parentheses Algorithm (BPA) specified by these Unicode
 standards.
 
++++
 ** You can access `mouse-buffer-menu' (C-down-mouse-1) using C-f10.
 
 +++
 ** New buffer-local `electric-pair-local-mode'.
 
++++
+** New variable `fast-but-imprecise-scrolling' inhibits
+fontification during full screen scrolling operations, giving less
+hesitant operation during auto-repeat of C-v, M-v at the cost of
+possible inaccuracies in the end position.
+
++++
+** New documentation command `describe-symbol'.
+Works for functions, variables, faces, etc.  It is bound to `C-h o' by
+default.
+
++++
+** New function `custom-prompt-customize-unsaved-options' checks for
+unsaved customizations and prompts user to customize (if found).  It
+is intended for adding to 'kill-emacs-query-functions'.
+
 
 * Changes in Specialized Modes and Packages in Emacs 25.1
 
+** Checkdoc
+
++++
+*** New command `checkdoc-package-keywords' checks if the
+current package keywords are recognized.  Set the new option
+`checkdoc-package-keywords-flag' to non-nil to make
+`checkdoc-current-buffer' call this function automatically.
+
++++
+*** New function `checkdoc-file' checks for style errors.
+It's meant for use together with `compile':
+emacs -batch --eval "(checkdoc-file \"subr.el\")"
+
++++
 ** New function `bookmark-set-no-overwrite' bound to C-x r M.
 It raises an error if a bookmark of that name already exists,
 unlike `bookmark-set' which silently updates an existing bookmark.
 
+** IMAP
+
+---
+*** `imap-ssl-program' has been removed, and imap.el uses the internal
+GnuTLS encryption functions if possible.
+
 ** JSON
+
 ---
 *** `json-pretty-print' and `json-pretty-print-buffer' now maintain
 the ordering of object keys by default.
+
 ---
 *** New commands `json-pretty-print-ordered' and
 `json-pretty-print-buffer-ordered' pretty prints JSON objects with
 object keys sorted alphabetically.
 
-** You can recompute the VC state of a file buffer with `M-x vc-refresh-state'
++++
 ** Prog mode has some support for multi-mode indentation.
-See `prog-indentation-context' and `prog-widen'.
+This allows better indentation support in modes that support multiple
+programming languages in the same buffer, like literate programming
+environments or ANTLR programs with embedded Python code.
+
+A major mode can provide indentation context for a sub-mode through
+the `prog-indentation-context' variable.  To support this, modes that
+provide indentation should use `prog-widen' instead of `widen' and
+`prog-first-column' instead of a literal zero.  See the node
+"Mode-Specific Indent" in the ELisp manual for more details.
 
 ** Prettify Symbols mode
+
++++
 *** Prettify Symbols mode supports custom composition predicates.  By
 overriding the default `prettify-symbols-compose-predicate', modes can
-specify in which contexts a symbol map be composed to some unicode
+specify in which contexts a symbol may be displayed as some Unicode
 character.  `prettify-symbols-default-compose-p' is the default which
 is suitable for most programming languages such as C or Lisp (but not
 (La)TeX).
 
++++
 *** Symbols can be unprettified while point is inside them.
 New variable `prettify-symbols-unprettify-at-point' configures this.
 
-** New `xterm-screen-extra-capabilities' config.
+** Enhanced xterm support
 
-** The `save-place' variable is replaced by a `save-place-mode'.
+---
+*** The new variable `xterm-screen-extra-capabilities' for configuring xterm.
+This variable tells Emacs which advanced capabilities are available in
+the xterm terminal emulator used to display Emacs text-mode frames.
+The default is to check each capability, and use it if available.
+(This variable was introduced in Emacs 24.1, but was not announced in
+its NEWS.)
+
+---
+*** Killing text now also sets the CLIPBOARD/PRIMARY selection
+in the surrounding GUI (using the OSC-52 escape sequence).  This only works
+if your xterm supports it and enables the `allowWindowOps' options (disabled
+by default at least in Debian, for security reasons).
+
+Similarly, you can yank the CLIPBOARD/PRIMARY selection (using the OSC-52
+escape sequence) if your xterm has the feature enabled but for that you
+additionally need to add `getSelection' to `xterm-extra-capabilities'.
+
++++
+*** `xterm-mouse-mode' now supports mouse-tracking (if your xterm supports it).
+
+---
+** The `save-place' variable is replaced by `save-place-mode'.
 
 ** ERC
 
-*** Hide message types by network or channel.  `erc-hide-list' will
-hide all messages of the specified type, where `erc-network-hide-list'
-and `erc-channel-hide-list' will only hide the specified message types
-for the respective specified targets.
++++
+*** ERC can now hide message types by network or channel.
+`erc-hide-list' will hide all messages of the specified type, while
+`erc-network-hide-list' and `erc-channel-hide-list' will only hide the
+specified message types for the respective specified targets.
 
 *** New variable `erc-default-port-tls' used to connect to TLS IRC
 servers.
 
 ** Midnight-mode
-*** `midnight-mode' is a proper minor mode.
-*** clean-buffer-*-regexps can now specify buffers via predicate functions.
-
-** In xterms, killing text now also sets the CLIPBOARD/PRIMARY selection
-in the surrounding GUI (using the OSC-52 escape sequence).  This only works
-if your xterm supports it and enables the `allowWindowOps' options (disabled
-by default at least in Debian, for security reasons).
 
-Similarly, you can yank the CLIPBOARD/PRIMARY selection (using the OSC-52
-escape sequence) if your xterm has the feature enabled but for that you
-additionally need to add `getSelection' to `xterm-extra-capabilities'.
+---
+*** `midnight-mode' is now a proper minor mode.
 
-** xterm-mouse-mode now supports mouse-tracking (if your xterm supports it).
+---
+*** clean-buffer-*-regexps can now specify buffers via predicate functions.
 
 ** package.el
 
++++
 *** New "external" package status.
 An external package is any installed package that's not built-in and
 not from `package-user-dir', which usually means it's from an entry in
@@ -403,14 +430,16 @@ not from `package-user-dir', which usually means it's 
from an entry in
 packages, in that they cannot be deleted through the package menu and
 are not considered for upgrades.
 
-The effect, is that a user can manually place a specific version of a
+The effect is that a user can manually place a specific version of a
 package inside `package-directory-list' and the package menu will
 always respect that.
 
++++
 *** If a package is available on multiple archives and one has higher
 priority (as per `package-archive-priorities') only that one is
 listed.  This can be configured with `package-menu-hide-low-priority'.
 
++++
 *** `package-menu-toggle-hiding' now toggles the hiding of packages.
 This includes the above-mentioned low-priority packages, as well as
 available packages whose version is lower than the currently installed
@@ -418,34 +447,43 @@ version (which were previously impossible to display).
 This allows users to downgrade a package if a lower version is
 available.
 
+---
 *** When filtering the package menu, keywords starting with "arc:" or
 "status:" represent package archive or status, respectively, instead
 of actual keywords.
 
+---
 *** Most functions which involve downloading information now take an
 ASYNC argument.  If it is non-nil, package.el performs the download(s)
 asynchronously.
 
+---
 *** New variable `package-menu-async' controls whether the
 package-menu uses asynchronous downloads.
 
+---
 *** `package-install-from-buffer' and `package-install-file' work on 
directories.
 This follows the same rules as installing from a .tar file, except the
 -pkg file is optional.
 
+---
 *** Packages which are dependencies of other packages cannot be deleted.
 The FORCE argument to `package-delete' overrides this.
 
+---
 *** New custom variable `package-selected-packages' tracks packages
 which were installed by the user (as opposed to installed as
 dependencies).  This variable can also be manually customized.
 
+---
 *** New command `package-install-user-selected-packages' installs all
 packages from `package-selected-packages' which are currently missing.
 
+---
 *** New command `package-autoremove' removes all packages which were
 installed strictly as dependencies but are no longer needed.
 
++++
 ** Shell
 
 When you invoke `shell' interactively, the *shell* buffer will now
@@ -472,23 +510,61 @@ If you need your objects to be named, do it by inheriting 
from `eieio-named'.
 *** `constructor' is now an obsolete alias for `make-instance'.
 
 ** ido
+
++++
 *** New command `ido-bury-buffer-at-head' bound to C-S-b
 Bury the buffer at the head of `ido-matches', analogous to how C-k
 kills the buffer at head.
+
+---
 *** A prefix argument to `ido-restrict-to-matches' will reverse its
 meaning, and the list is restricted to those elements that do not
 match the current input.
 
 ** Minibuffer
 
-*** You can use <up> and <down> keys to move point in the multi-line
-minibuffer just as in an ordinary buffer.  Only when point moves over
++++
+*** You can use <UP> and <DOWN> arrow keys to move through history by lines.
+The new commands `next-line-or-history-element' and
+`previous-line-or-history-element', bound to <UP> and <DOWN> in the
+minibuffer, allow by-line movement through minibuffer history,
+similarly to an ordinary buffer.  Only when point moves over
 the bottom/top of the minibuffer it goes to the next/previous history
-element.  The new commands bound to <up> and <down> in the minibuffer:
-`next-line-or-history-element' and `previous-line-or-history-element'.
+element.  `M-p' and `M-n' still move directly to previous/next history
+item as before.
 
 ** Search and Replace
 
++++
+*** New user option `search-default-regexp-mode'
+specifies the default mode for I-search.
+
++++
+*** `isearch' and `query-replace' can now perform character folding in matches.
+Isearch does that by default, while `query-replace' will do that if
+the new variable `replace-character-fold' is customized to a non-nil
+value.  This is analogous to case folding, but instead of disregarding
+case variants, it disregards wider classes of distinctions between
+similar characters.  (Case folding is a special case of character
+folding.)  This means many characters in the search string will match
+entire groups of characters instead of just themselves.
+
+For instance, the " will match all variants of double quotes (like “
+and ”), and the letter a will match all of its accented cousins, even
+those composed of multiple characters, as well as many other symbols
+like ℀, ℁, ⒜, and ⓐ.
+
++++
+*** New function `character-fold-to-regexp' can be used
+by searching commands to produce a regexp matching anything that
+character-folds into STRING.
+
++++
+*** The new M-s M-w key binding uses eww to search the web for the
+text in the region.  The search engine to use for this is specified by
+the customizable variable `eww-search-prefix'.
+
++++
 *** Query-replace history is enhanced.
 When query-replace reads the FROM string from the minibuffer, typing
 `M-p' will now show previous replacements as "FROM SEP TO", where FROM
@@ -509,8 +585,16 @@ this you can tell Edebug not to stop at the start of the 
first
 instrumented function.
 
 ** ElDoc
+
++++
 *** New minor mode `global-eldoc-mode'
+It is turned on by default, and affects `*scratch*' and other buffers
+whose major mode supports Emacs Lisp.
+
+---
 *** `eldoc-documentation-function' now defaults to `ignore'
+
+---
 *** `describe-char-eldoc' displays information about character at point,
 and can be used as a default value of `eldoc-documentation-function'.  It is
 useful when, for example, one needs to distinguish various spaces (e.g. ] [,
@@ -527,9 +611,9 @@ whether to use variable-pitch fonts or not.  The user can 
also
 customize the `shr-use-fonts' variable.
 
 +++
-*** A new command `C' (`eww-toggle-colors) can be used to toggle
+*** A new command `C' (`eww-toggle-colors') can be used to toggle
 whether to use the HTML-specified colors or not.  The user can also
-customize the `shr-use-colors variable.
+customize the `shr-use-colors' variable.
 
 +++
 *** A new command `R' (`eww-readable') will try do identify the main
@@ -571,31 +655,45 @@ invalid certificates are marked in red.
 
 ** Message mode
 
+---
 *** text/html messages that contain inline image parts will be
 transformed into multipart/related messages before sending.
 
-** pcase
-*** New UPatterns `quote', `app', `cl-struct', and `eieio'.
-*** New UPatterns can be defined with `pcase-defmacro'.
 +++
-*** New vector QPattern.
+** In Show Paren Mode, a parenthesis can be highlighted when point
+stands inside it, and certain parens can be highlighted when point is
+at BOL or EOL, or in whitespace there.  To enable these, customize,
+respectively, `show-paren-when-point-inside-paren' or
+`show-paren-when-point-in-periphery'.
 
 ** Lisp mode
 *** Strings after `:documentation' are highlighted as docstrings.
 
 ** Rectangle editing
+
++++
 *** Rectangle Mark mode can have corners past EOL or in the middle of a TAB.
+
++++
 *** C-x C-x in rectangle-mark-mode now cycles through the four corners.
 *** `string-rectangle' provides on-the-fly preview of the result.
 
-** New font-lock functions font-lock-ensure and font-lock-flush, which
-should be used instead of font-lock-fontify-buffer when called from Elisp.
++++
+** New font-lock functions `font-lock-ensure' and `font-lock-flush'.
+These should be used in preference to `font-lock-fontify-buffer' when
+called from Lisp.
 
-** Macro `minibuffer-with-setup-hook' takes (:append FUN) to mean
-appending FUN to `minibuffer-setup-hook'.
+---
+** Macro `minibuffer-with-setup-hook' can optionally append a function
+to `minibuffer-setup-hook'.
+
+If the first argument of the macro is of the form `(:append FUN)',
+then FUN will be appended to `minibuffer-setup-hook', instead of
+prepending it.
 
 ** cl-lib
-*** New functions cl-fresh-line, cl-digit-char-p and cl-parse-integer.
++++
+*** New functions `cl-fresh-line', `cl-digit-char-p', and `cl-parse-integer'.
 
 ** Calendar and diary
 
@@ -639,15 +737,26 @@ The remainder were:
 
 **** The nil and list forms of `diary-display-function'.
 
++++
 ** New ERT function `ert-summarize-tests-batch-and-exit'.
+If the output of ERT tests in batch mode execution can be saved to a
+log file, then it can be passed as an argument to the above function
+to produce a neat summary.
 
 ** New js.el option `js-indent-first-init'.
 
+** Info
+
+---
+** Info mode now displays symbol names in fixed-pitch font.
+If you want to get the old behavior back, customize the `Info-quoted'
+face to use the same definitions as the default face.
+
 ---
-** `Info-fontify-maximum-menu-size' can be t for no limit.
+*** `Info-fontify-maximum-menu-size' can be t for no limit.
 
 +++
-** `info-display-manual' can now be given a prefix argument which (any
+*** `info-display-manual' can now be given a prefix argument which (any
 non-nil value) directs the command to limit the completion
 alternatives to currently visited manuals.
 
@@ -656,9 +765,11 @@ alternatives to currently visited manuals.
 
 ** Rmail
 
-*** The Rmail commands d, C-d and u take optional repeat counts to delete or
-undelete multiple messages.
++++
+*** The Rmail commands `d', `C-d' and `u' take optional repeat counts
+to delete or undelete multiple messages.
 
++++
 *** Rmail can now render HTML mail messages if your Emacs was built with
 libxml2 or if you have the Lynx browser installed.  By default, Rmail
 will display the HTML version of a mail message that has both HTML and
@@ -669,14 +780,18 @@ plain text parts, if display of HTML email is possible; 
customize the
 *** In the commands that make summaries by subject, recipients, or senders,
 you can no longer use commas to separate regular expressions.
 
++++
 ** SES now supports local printer functions; see `ses-define-local-printer'.
 
-** sh-script
+** Shell-script Mode
+---
 *** In sh-mode you can now use `sh-shell' as a file-local variable to
 specify the type of shell in use (bash, csh, etc).
 
-*** New value `always' for sh-indent-after-continuation.
+---
+*** New value `always' for `sh-indent-after-continuation'.
 This provides old-style ("dumb") indentation of continued lines.
+See the doc string of `sh-indent-after-continuation' for details.
 
 ** TLS
 ---
@@ -684,18 +799,22 @@ This provides old-style ("dumb") indentation of continued 
lines.
 
 ** URL
 
++++
 *** The URL package accepts now the protocols "ssh", "scp" and "rsync".
 When `url-handler-mode' is enabled, file operations for these
 protocols as well as for "telnet" and "ftp" are passed to Tramp.
 
++++
 *** The URL package allows customizing the `url-user-agent' string.
 The new `url-user-agent' variable can be customized to be a string or
 a function.
 
+---
 *** The new interface variable `url-request-noninteractive' can be used
 to specify that we're running in a noninteractive context, and that
 we should not be queried about things like TLS certificate validity.
 
+---
 *** If URL is used with a https connection, the first callback argument
 plist will contain a :peer element that has the output of
 `gnutls-peer-status' (if Emacs is built with GnuTLS support).
@@ -719,47 +838,72 @@ filesystem notifications.
 
 ** SQL mode
 
+---
 *** New user variable `sql-default-directory' enables remote
 connections using Tramp.
 
-*** New command `sql-send-line-and-next' sends the current line to the
-interactive buffer and advances to the next line, skipping whitespace
-and comments.
+---
+*** New command `sql-send-line-and-next'.
+This command, bound to `C-c C-n' by default, sends the current line to
+the SQL process and advances to the next line, skipping whitespace and
+comments.
 
-*** Add support for Vertica SQL.
+---
+*** Added support for Vertica SQL.
 
 ** VC and related modes
 
++++
 *** Basic push support, via `vc-push', bound to `C-x v P'.
 Implemented for Bzr, Git, Hg.  As part of this change, the pre-existing
 (undocumented) command vc-hg-push now behaves slightly differently.
 
++++
 *** The new command vc-region-history shows the log+diff of the active region.
 
++++
+*** You can refresh the VC state of a file buffer with `M-x vc-refresh-state'.
+This command is useful when you perform version control commands
+outside Emacs (e.g., from the shell prompt), or if you switch the VC
+back-end for the buffer's file, or remove it from version control.
+
++++
 *** New option `vc-annotate-background-mode' controls whether
 the color range from `vc-annotate-color-map' is applied to the
 background or to the foreground.
 
-*** `compare-windows' now compares text with the most recently used window
-instead of the next window.  The new option 
`compare-windows-get-window-function'
-allows to customize this.
++++
+*** `compare-windows' now compares text with the most recently selected window
+instead of the next window.  If you want the previous behavior of
+comparing with the next window, customize the new option
+`compare-windows-get-window-function' to the value
+`compare-windows-get-next-window'.
 
+---
 *** Two new faces `compare-windows-removed' and `compare-windows-added'
-replace the obsolete face `compare-windows'.
+replace the face `compare-windows', which is now an obsolete alias for
+`compare-windows-added'.
 
 ---
 *** `log-edit-insert-changelog' converts "(tiny change)" to
 "Copyright-paperwork-exempt: yes".  Set `log-edit-rewrite-tiny-change'
 nil to disable this.
 
-** VHDL mode supports VHDL'08.
+---
+** VHDL mode now supports VHDL'08.
+
+** Calculator
+
+---
+*** Decimal display mode uses "," groups, so it's more
+fitting for use in money calculations
 
-** Calculator: decimal display mode uses "," groups, so it's more
-fitting for use in money calculations; factorial works with
-non-integer inputs.
+---
+*** Factorial works with non-integer inputs.
 
-** HideIfDef mode now support full C/C++ expressions, argumented macro 
expansions,
-interactive macro evaluation and automatic scanning of #defined symbols.
+** HideIfDef mode now support full C/C++ expressions, argumented macro
+expansions, interactive macro evaluation and automatic scanning of
+#defined symbols.
 
 *** New custom variable `hide-ifdef-header-regexp' to define C/C++ header file
 name patterns.  Default case-insensitive .h, .hh, .hpp, .hxx, and .h++.
@@ -806,6 +950,11 @@ easier binding, which is now unoccupied (`M-,').
 alias for a private variable.  `xref-push-marker-stack' and
 `xref-pop-marker-stack' should be used to mutate it instead.
 
+---
+*** `xref-find-definitions' and `describe-function' now display
+information about mode local overrides (defined by cedet/mode-local.el
+`define-overloadable-function' `define-mode-local-overrides').
+
 ** etags
 As a result of the above, these commands are now obsolete:
 `find-tag-other-window', `find-tag-other-frame', `find-tag-regexp',
@@ -846,6 +995,10 @@ to avoid interfering with the kill ring.
 allow overriding the regular expression that recognizes the ldapsearch
 command line's password prompt.
 
+EUDC's BBDB backend now supports BBDB 3.
+
+EUDC's PH backend (eudcb-ph.el) is obsolete.
+
 ** Eshell
 
 +++
@@ -907,6 +1060,18 @@ compression command is determined from the new
 *** `W' is now bound to `browse-url-of-dired-file', and is useful for
 viewing HTML files and the like.
 
+** Tabulated List Mode
+
++++
+*** It is now safe for a mode that derives `tabulated-list-mode' to not
+call `tabulated-list-init-header', in which case it will have no
+header.
+
++++
+*** `tabulated-list-print' takes a second optional argument, update,
+which specifies an alternative printing method which is faster when
+few or no entries have changed.
+
 ** Obsolete packages
 
 ---
@@ -953,6 +1118,12 @@ support for JSX, an XML-like syntax extension to 
ECMAScript.
 
 * Incompatible Lisp Changes in Emacs 25.1
 
+---
+** `setq' and `setf' must now be called with an even number of
+arguments.  The earlier behavior of silently supplying a nil to the
+last variable when there was an odd number of arguments has been
+eliminated.
+
 ** `syntax-begin-function' is declared obsolete.
 Removed font-lock-beginning-of-syntax-function and the SYNTAX-BEGIN
 slot in font-lock-defaults.
@@ -979,6 +1150,7 @@ large portions of the Emacs display, and want to avoid 
changes in the
 pointer shape during dragging, should bind the variable `track-mouse'
 to the special value `dragging' in the body of the form.
 
+---
 ** The optional `predicate' argument of `lisp-complete-symbol' no longer
 has any effect.  (This change was made in Emacs 24.4 but was not
 advertised at the time.)
@@ -986,6 +1158,7 @@ advertised at the time.)
 ** `indirect-function' does not signal `void-function' any more.
 This is mostly a bug-fix, since this change was missed back in 24.4 when
 symbol-function was changed not to signal `void-function' any more.
+
 *** As a consequence, the second arg of `indirect-function' is now obsolete.
 
 ** Comint, term, and compile do not set the EMACS env var any more.
@@ -1085,6 +1258,12 @@ that happen, `unhandled-file-name-directory' now 
defaults to calling
 
 * Lisp Changes in Emacs 25.1
 
+** pcase
+*** New UPatterns `quote', `app', `cl-struct', `eieio', `seq', and `map'.
+*** New UPatterns can be defined with `pcase-defmacro'.
++++
+*** New vector QPattern.
+
 ** syntax-propertize is now automatically called on-demand during forward
 parsing functions like `forward-sexp'.
 
@@ -1114,6 +1293,27 @@ of subprocess.
 process filter, sentinel, etc., through keyword arguments (similar to
 `make-network-process').
 
++++
+** A new function `directory-files-recursively' returns all matching
+files (recursively) under a directory.
+
++++
+** New variable `inhibit-message', when bound to non-nil, inhibits
+`message' and related functions from displaying messages the Echo
+Area.  The output is still logged to the *Messages* buffer.
+
++++
+** A new text property `inhibit-read-only' can be used in read-only
+buffers to allow certain parts of the text to be writable.
+
++++
+** A new variable `comment-end-can-be-escaped' is useful in languages
+   such as C and C++ where line comments with escaped newlines are
+   continued to the next line.
+
++++
+** New macro `define-advice'.
+
 ** `read-buffer' takes a new `predicate' argument.
 
 ** Emacs Lisp now supports generators.
@@ -1140,6 +1340,26 @@ evaluated (and should return a string) when the closure 
is built.
 ** New function `string-greaterp', which return the opposite result of
 `string-lessp'.
 
++++
+** The new functions `string-collate-lessp' and `string-collate-equalp'
+preserve the collation order as defined by the system's locale(1)
+environment.  For the time being this is implemented for modern POSIX
+systems and for MS-Windows, for other systems they fall back to their
+counterparts `string-lessp' and `string-equal'.
+
+---
+*** The ls-lisp package uses `string-collate-lessp' to sort file names.
+If you want the old, locale-independent sorting, customize the new
+option `ls-lisp-use-string-collate' to a nil value.
+
++++
+*** The MS-Windows specific variable `w32-collate-ignore-punctuation',
+if set to a non-nil value, causes the above 2 functions to ignore
+symbol and punctuation characters when collating strings.  This
+emulates the behavior of modern Posix platforms when the locale's
+codeset is "UTF-8" (as in "en_US.UTF-8").  This is needed because
+MS-Windows doesn't support UTF-8 as codeset in its locales.
+
 ** New function `alist-get', which is also a valid place (aka lvalue).
 
 ** New function `funcall-interactively', which works like `funcall'
@@ -1149,6 +1369,20 @@ called interactively.
 ** New function `function-put' to use instead of `put' for function properties.
 
 +++
+** The new function `bidi-find-overridden-directionality' allows to
+find characters whose directionality was, perhaps maliciously,
+overridden by directional override control characters.  Lisp programs
+can use this to detect potential phishing of URLs and other links that
+exploits bidirectional display reordering.
+
++++
+** The new function `buffer-substring-with-bidi-context' allows to
+copy a portion of a buffer into a different location while preserving
+the visual appearance both of the copied text and the text at
+destination, even when the copied text includes mixed bidirectional
+text and directional control characters.
+
++++
 ** New properties that can be specified with `declare':
 *** (interactive-only INSTEAD), says to use INSTEAD for non-interactive use.
 *** (pure VAL), if VAL is non-nil, indicates the function is pure.
@@ -1174,6 +1408,35 @@ name.  The variable `system-name' is now obsolete.
 ** If `pwd' is called with a prefix argument, insert the current default
 directory at point.
 
++++
+** New functions return extended information about fonts and faces.
+
++++
+*** The function `font-info' now returns more details about a font.
+In particular, it now returns the average width of the font's
+characters, which can be used for geometry-related calculations.
+
++++
+*** A new function `default-font-width' returns the average width of a
+character in the current buffer's default font.  If the default face
+is remapped (see `face-remapping-alist'), the value for the remapped
+face is returned.  This function complements the existing function
+`default-font-height'.
+
++++
+*** New functions `window-font-height' and `window-font-width' return
+the height and average width of characters in a specified face and
+window.  If FACE is remapped (see `face-remapping-alist'), the
+function returns the information for the remapped face.
+
++++
+*** A new function `window-max-chars-per-line' returns the maximal
+number of characters that can be displayed on one line.  If a face
+and/or window are provided, these values are used for the
+calculation.  This function is different from `window-body-width' in
+that it accounts for (i) continuation glyphs, (ii) the size of the
+font, and (iii) the specified window.
+
 ---
 ** New utilities in subr-x.el:
 *** New macros `if-let' and `when-let' allow defining bindings and to
@@ -1235,12 +1498,26 @@ integers.
 ** New function `set-binary-mode' allows to switch a standard stream
 of the Emacs process to binary I/O mode.
 
++++
+** The new function `directory-name-p' can be used to check whether a file
+name (as returned from, for instance, `file-name-all-completions') is
+a directory file name.  It returns non-nil if the last character in
+the name is a directory separator character (forward slash on GNU and
+Unix systems, forward- or backslash on MS-Windows and MS-DOS).
+
 ** ASCII approximations to curved quotes are put in standard-display-table
 if the terminal cannot display curved quotes.
 
 ** Standard output and error streams now transliterate characters via
 standard-display-table, and encode output using locale-coding-system.
 
++++
+** New var `truncate-string-ellipsis' to choose how to indicate truncation.
+
++++
+** New possible value for `system-type': `nacl'.
+This is used by Google's Native Client (NaCl).
+
 ** Miscellaneous name change
 
 For consistency with the usual Emacs spelling, the Lisp variable
@@ -1321,25 +1598,23 @@ windows without "fixing" it.  It's supported by 
`fit-window-to-buffer',
 `temp-buffer-resize-mode' and `display-buffer'.
 
 +++
+** New `display-buffer' action function `display-buffer-use-some-frame'.
+This displays the buffer in an existing frame other than the current
+frame, and allows the caller to specify a frame predicate to exclude
+frames.
+
++++
 ** New minor mode `window-divider-mode' and options
 `window-divider-default-places', `window-divider-default-bottom-width'
 and `window-divider-default-right-width'.
 
-+++
-** New option `switch-to-buffer-in-dedicated-window' allows to customize
-how `switch-to-buffer' proceeds interactively when the selected window
-is strongly dedicated to its buffer.
-
-+++
-** The option `even-window-heights' has been renamed to
-`even-window-sizes' and now handles window widths as well.
-
 ** Tearoff menus and detachable toolbars for Gtk+ has been removed.
 Those features have been deprecated in Gtk+ for a long time.
 
-** Miscellaneous
+** Etags
 
 *** etags no longer qualifies class members by default.
+
 By default, `etags' will not qualify class members for C-like
 object-oriented languages with their class names and namespaces, and
 will remove qualifications used explicitly in the code from the tag
@@ -1353,6 +1628,16 @@ using -Q might make some class members become "unknown" 
to `M-.'
 (`xref-find-definitions'); if so, you can use `C-u M-.' to specify the
 qualified names by hand.
 
+*** New language Ruby
+
+Names of modules, classes, methods, and functions are tagged.
+Overloaded operators are also tagged.
+
+*** Improved support for Lua
+
+Etags now tags functions even if the "function" keyword follows some
+whitespace at line beginning.
+
 
 * Changes in Emacs 25.1 on Non-Free Operating Systems
 
@@ -1383,6 +1668,12 @@ Pass '--without-ns' to configure to create an X11 build, 
the old default.
 ** OS X on PowerPC is no longer supported.
 
 ---
+** New variable `ns-use-fullscreen-animation' controls animation for
+non-native NS fullscreen.  The default is nil.  Set to t to enable
+animation when entering and leaving fullscreen.  For native OSX fullscreen
+this has no effect.
+
+---
 ** The new function 'w32-application-type' returns the type of an
 MS-Windows application given the name of its executable program file.
 
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index 0f76bfc..18b1f84 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -2051,6 +2051,10 @@ pinned icon, a separate button appears on the taskbar, 
instead of the
 expected effect of the icon you clicked on being converted to that
 button.
 
+This is due to a bug in early versions of Windows 10, reportedly fixed
+in build 1511 of Windows 10 (a.k.a. "Windows 10 SP1").  If you cannot
+upgrade, read the work-around described below.
+
 First, be sure to edit the Properties of the pinned icon to invoke
 runemacs.exe, not emacs.exe.  (The latter will cause an extra cmd
 window to appear when you invoke Emacs from the pinned icon.)
diff --git a/etc/tutorials/TUTORIAL.it b/etc/tutorials/TUTORIAL.it
index 300fd22..1eb2573 100644
--- a/etc/tutorials/TUTORIAL.it
+++ b/etc/tutorials/TUTORIAL.it
@@ -1,36 +1,38 @@
 Esercitazione di Emacs.  Condizioni d'uso alla fine del file.
 
 I comandi di Emacs comportano generalmente l'uso del tasto CONTROL (a
-volte indicato con CTRL o CTL) o del tasto META (a volte indicato con EDIT
-o ALT).  Piuttosto che indicarli per esteso ogni volta, useremo le
-seguenti abbreviazioni:
-
- C-<car>  significa che bisogna tenere abbassato il tasto CONTROL mentre si
-          preme il carattere <car>.  Quindi C-f significa: tieni premuto
-          CONTROL e batti f.
-
- M-<car>  significa che bisogna tenere abbassato il tasto META o EDIT o ALT
-          mentre si preme il carattere <car>.  Se non ci sono tasti META,
-          EDIT o ALT, al loro posto si può premere e poi rilasciare il
-          tasto ESC e quindi premere <car>.  Useremo <ESC> per indicare il
-          tasto ESC.
+volte indicato con CTRL o CTL) o del tasto META (a volte indicato con
+EDIT o ALT).  Piuttosto che indicarli per esteso ogni volta, useremo
+le seguenti abbreviazioni:
+
+ C-<car>  significa che bisogna tenere abbassato il tasto CONTROL
+         mentre si preme il carattere <car>.  Quindi C-f significa:
+         tieni premuto CONTROL e batti f.
+ M-<car>  significa che bisogna tenere abbassato il tasto META o EDIT
+         o ALT mentre si preme il carattere <car>.  Se non ci sono
+         tasti META, EDIT o ALT, al loro posto si può premere e poi
+         rilasciare il tasto ESC e quindi premere <car>.  Useremo
+         <ESC> per indicare il tasto ESC.
 
 Nota importante: per chiudere una sessione di lavoro di Emacs usa C-x
-C-c.  (Due caratteri.)  I caratteri ">>" posti al margine sinistro
-indicano le direttive per provare a usare un comando.  Per esempio:
+C-c (due caratteri).  Per annullare un comando inserito parzialmente
+usa C-g.  I caratteri “>>” posti al margine sinistro indicano le
+direttive per provare a usare un comando.  Per esempio:
 <<Blank lines inserted here by startup of help-with-tutorial>>
->> Adesso premi C-v (Vedi schermata successiva) per spostarti
-   alla prossima schermata.  (Vai avanti, tieni premuto il tasto
-   CONTROL mentre premi v).  D'ora in poi dovrai fare così ogni volta
-   che finisci di leggere lo schermo.
+[Spaziatura inserita a scopo didattico.  Il testo continua sotto]
+>> Adesso premi C-v (vedi schermata successiva) per spostarti alla
+       prossima schermata (vai avanti, tieni premuto il tasto
+       CONTROL mentre premi v).  D'ora in poi dovrai fare così ogni
+       volta che finisci di leggere la schermata.
 
-Si noti che le ultime due righe di ogni schermata appaiono in cima alla
-schermata successiva, favorendo così la continuità di lettura.
+Si noti che le ultime due righe di ogni schermata appaiono in cima
+alla schermata successiva, favorendo così la continuità di lettura.
 
-La prima cosa che bisogna imparare è come raggiungere un certo punto del
-testo.  Sai già come andare avanti di una schermata, con C-v.  Per
-andare indietro di una schermata, premi M-v (tieni premuto il tasto META
-e poi premi v, oppure usa <ESC>v se non c'è un tasto META, EDIT o ALT).
+La prima cosa che bisogna imparare è come raggiungere un certo punto
+del testo.  Sai già come andare avanti di una schermata, con C-v.  Per
+andare indietro di una schermata, premi M-v (tieni premuto il tasto
+META e poi premi v, oppure usa <ESC>v se non c'è un tasto META, EDIT o
+ALT).
 
 >> Ora prova: premi M-v e quindi C-v alcune volte.
 
@@ -38,213 +40,221 @@ e poi premi v, oppure usa <ESC>v se non c'è un tasto 
META, EDIT o ALT).
 * SOMMARIO
 ----------
 
-I comandi seguenti sono utili per visualizzare le varie parti del testo:
+I comandi seguenti sono utili per visualizzare le schermate:
 
-    C-v    Vai avanti di una schermata
-    M-v    Vai indietro di una schermata
-    C-l    Cancella lo schermo e riscrivi tutto il testo, muovendo
-           il testo che si trova vicino al cursore al centro dello
-           schermo.  (Il tasto è CONTROL-L, non CONTROL-1.)
+       C-v     Vai avanti di una schermata
+       M-v     Vai indietro di una schermata
+       C-l     Cancella lo schermo e riscrivi tutto il testo,
+                muovendo il testo che si trova vicino al cursore al
+                centro dello schermo.  (Il tasto è CONTROL-L,
+                non CONTROL-1.)
 
 >> Trova il cursore, osserva quale parte di testo gli è vicina.  Premi
    C-l.  Trova di nuovo il cursore e osserva che si trova sullo stesso
-   punto del testo.
+   punto del testo, ma ora è al centro della schermata.  Se premi C-l
+   di nuovo, il testo verrà posizionato in cima allo schermo.
+   Premendo nuovamente C-l verrà posizionato in fondo.
+
+Puoi anche usare i tasti PagSu (Pag ↑) o PagGiù (Pag ↓) per passare
+alle schermate precedenti o successive, se sono presenti sul tuo
+terminale, ma C-v e M-v consentono una editazione più efficiente.
 
 
-* CONTROLLO DEL CURSORE
------------------------
+* CONTROLLO DI BASE DEL CURSORE
+-------------------------------
 
-Spostarsi da una schermata all'altra è utile, ma come ci si può spostare
-fino ad un certo preciso punto del testo?
+Spostarsi da una schermata all'altra è utile, ma come ci si può
+spostare fino ad un certo preciso punto del testo?
 
-Ci sono diversi modi per farlo.  Il più elementare consiste nell'usare i
-comandi C-p, C-b, C-f, C-n.  Ognuno di essi muove il cursore di una riga o
-di una colonna in una data direzione sullo schermo.  La tabella seguente
-mostra le direzioni in cui operano questi quattro comandi:
+Ci sono diversi modi per farlo.  Puoi usare i tasti con le frecce, ma
+è più efficiente tenere le mani nella posizione standard e utilizzare
+i comandi C-p, C-b, C-f e C-n.  Questi caratteri sono equivalenti ai
+quattro tasti con le frecce, in questo modo:
 
-                           Riga precedente, C-p
-                                    :
-                                    :
+                          Riga precedente, C-p
+                                   :
+                                   :
       Indietro, C-b .... Posizione attuale cursore .... Avanti, C-f
-                                    :
-                                    :
+                                   :
+                                   :
                           Riga successiva, C-n
 
->> Sposta il cursore sulla riga centrale del diagramma qui sopra usando
-   C-n o C-p.  Poi usa C-l per portare il diagramma al centro dello
-   schermo.
+>> Sposta il cursore sulla riga centrale del diagramma qui sopra
+   usando C-n o C-p.  Poi usa C-l per portare il diagramma al centro
+   dello schermo.
 
 Le quattro lettere dei comandi sono mnemoniche in inglese: P per
-precedente (previous), N per successivo (next), B per indietro (backward)
-e F per avanti (forward).  Questi sono tutti i comandi elementari per
-posizionare il cursore, li userai IN CONTINUAZIONE e conviene perciò
-impararli subito.
+precedente (previous), N per successivo (next), B per indietro
+(backward) e F per avanti (forward).  Userai questi comandi elementari
+in continuazione.
 
 >> Usa alcuni C-n per portare il cursore su questa riga.
+
 >> Muovi il cursore sulla riga con C-f e poi in alto con C-p.  Osserva
    l'effetto di un C-p quando il cursore si trova a metà della riga.
 
-Ogni riga di testo termina con un carattere Newline, che serve a separarla
-dalla successiva.  È bene che l'ultima riga del tuo file termini con un
-carattere Newline, benché Emacs non lo richieda.
+Ogni riga di testo termina con un carattere Newline (“a capo”), che
+serve a separarla dalla successiva.  (Di solito l'ultima riga di un
+file termina con un carattere Newline, ma Emacs non lo richiede.)
 
->> Prova a usare C-b all'inizio di una riga.  Sposterà il cursore
-   alla fine della precedente.  Questo avviene perché il cursore ha
+>> Prova a usare C-b all'inizio di una riga.  Sposterà il cursore alla
+   fine della precedente.  Questo avviene perché il cursore ha
    superato all'indietro il carattere Newline.
 
-C-f sposta il cursore avanti attravero il carattere Newline proprio come
-C-b.
+C-f sposta il cursore avanti attraverso il carattere Newline proprio
+come C-b.
 
->> Premi alcune volte C-b per vedere dove si trova il cursore.  Poi usa
-   C-f per tornare alla fine della riga.  Usa quindi C-f per andare alla
-   riga successiva.
+>> Premi alcune volte C-b per vedere dove si trova il cursore.  Poi
+   usa C-f per tornare alla fine della riga.  Usa quindi C-f per
+   andare alla riga successiva.
 
-Quando ci si sposta oltre l'inizio o la fine della schermata, il testo che
-si trova oltre si sposta sullo schermo, ottenendo uno "scorrimento"
-(scrolling).  In questo modo Emacs posiziona il cursore sulla parte di
-testo desiderata senza doverlo portare fuori dallo schermo visibile.
+Quando ci si sposta oltre l'inizio o la fine della schermata, il testo
+che si trova oltre si sposta sullo schermo, ottenendo uno
+“scorrimento” (scrolling).  Questo consente a Emacs di spostare il
+cursore sulla parte di testo desiderata mantenendolo all'interno della
+schermata.
 
->> Prova a muovere il cursore al di là della fine dello schermo con C-n e
-   osserva cosa succede.
+>> Prova a muovere il cursore al di là della fine dello schermo con
+   C-n e osserva cosa succede.
 
-Se lo spostamento di un solo carattere alla volta è troppo lento allora ci
-si può muovere di un'intera parola alla volta.  M-f (META-f) e M-b
-spostano il cursore rispettivamente in avanti e indietro di una parola.
+Se lo spostamento di un solo carattere alla volta è troppo lento
+allora ci si può muovere di un'intera parola alla volta.  M-f (META-f)
+e M-b spostano il cursore rispettivamente in avanti e indietro di una
+parola.
 
 >> Prova alcune volte M-f e M-b.
 
-Quando il cursore è a metà di una parola, M-f lo sposta alla fine della
-stessa.  Quando è sullo spazio bianco tra due parole, M-f lo sposta alla
-fine della parola successiva.  M-b funziona in modo simile ma in direzione
-opposta.
+Quando il cursore è a metà di una parola, M-f lo sposta alla fine
+della stessa.  Quando è sullo spazio bianco tra due parole, M-f lo
+sposta alla fine della parola successiva.  M-b funziona in modo simile
+ma in direzione opposta.
 
->> Ora prova M-f e M-b alcune volte, alternandoli con C-f e C-b così da
-   poter osservare l'azione di M-f e M-b da vari punti tra le parole e
-   sulle stesse.
+>> Ora prova M-f e M-b alcune volte, alternandoli con C-f e C-b così
+   da poter osservare l'azione di M-f e M-b da vari punti tra le
+   parole e sulle stesse.
 
-Osserva il parallelo tra C-f e C-b da una parte e M-f e M-b dall'altra.
-Molto spesso i caratteri con Meta sono usati per operazioni relative alle
-unità definite dal linguaggio (parole, frasi, paragrafi), mentre i
-caratteri con Control operano su unità base indipendenti da ciò che si
-scrive (caratteri, righe, ecc.).
+Osserva il parallelo tra C-f e C-b da una parte e M-f e M-b
+dall'altra.  Molto spesso i caratteri con Meta sono usati per
+operazioni relative alle unità definite dal linguaggio (parole, frasi,
+paragrafi), mentre i caratteri con Control operano su unità base
+indipendenti da ciò che si scrive (caratteri, righe, ecc.).
 
 Questo parallelo funziona anche tra righe e frasi: C-a e C-e spostano
-all'inizio o alla fine di una riga, e M-a e M-e all'inizio o alla fine di
-una frase.
+all'inizio o alla fine di una riga, mentre M-a e M-e all'inizio o alla
+fine di una frase.
 
 >> Prova due C-a e poi due C-e.  Prova due M-a e poi due M-e.
 
 Osserva come un C-a ripetuto non abbia effetto, mentre M-a ripetuti
-continuano a spostare il cursore all'inizio di frasi precendenti.  Sebbene
-questi due ultimi comandi non siano perfettamente analoghi, riteniamo che
-il loro comportamento sia ragionevole.
+continuano a spostare il cursore all'inizio di frasi precedenti.
+Sebbene questi due ultimi comandi non siano perfettamente analoghi,
+riteniamo che il loro comportamento sia ragionevole.
 
-La posizione del cursore nel testo è anche chiamata "punto".  Per meglio
-dire, il cursore mostra sullo schermo dove si trova, al momento, il punto
-nel testo.
+La posizione del cursore nel testo è anche chiamata “punto”.  Per
+meglio dire, il cursore mostra sullo schermo dove si trova, al
+momento, il punto nel testo.
 
-Ecco un sommario delle più semplici operazioni di spostamento del cursore,
-compresi i comandi di spostamento di parola in parola o di frase in frase:
+Ecco un sommario delle più semplici operazioni di spostamento del
+cursore, compresi i comandi di spostamento di parola in parola o di
+frase in frase:
 
-    C-f    Sposta avanti di un carattere
-    C-b    Sposta indietro di un carattere
+       C-f     Sposta avanti di un carattere
+       C-b     Sposta indietro di un carattere
 
-    M-f    Sposta avanti di una parola
-    M-b    Sposta indietro di una parola
+       M-f     Sposta avanti di una parola
+       M-b     Sposta indietro di una parola
 
-    C-n    Sposta alla riga successiva
-    C-p    Sposta alla riga precedente
+       C-n     Sposta alla riga successiva
+       C-p     Sposta alla riga precedente
 
-    C-a    Sposta all'inizio della riga
-    C-e    Sposta alla fine della riga
+       C-a     Sposta all'inizio della riga
+       C-e     Sposta alla fine della riga
 
-    M-a    Sposta all'inizio della frase
-    M-e    Sposta alla fine della frase
+       M-a     Sposta all'inizio della frase
+       M-e     Sposta alla fine della frase
 
->> Prova tutti questi comandi alcune volte per fare pratica.  Questi sono
-   i comandi più usati.
+>> Prova tutti questi comandi alcune volte per fare pratica.
+   Questi sono i comandi più usati.
 
 Altri due importanti comandi di spostamento del cursore sono M-< (META
 Minore-di), che sposta all'inizio dell'intero testo, e M-> (META
 Maggiore-di), che sposta alla fine dell'intero testo.
 
-Su molte tastiere il carattere ">" si raggiunge premendo il tasto SHIFT.
-Su queste tastiere bisogna usare il tasto SHIFT assieme a quello META;
-senza il tasto SHIFT si otterrebbe un carattere diverso.
+Su molte tastiere il carattere “<” trova sopra la virgola, quindi è
+necessario tenere premuto il tasto shift (⇑) per ottenerlo.  Su questi
+terminali dovrai usare il tasto shift per ottenere M-<, perché
+altrimenti digiteresti M-virgola.
 
 >> Prova M-< adesso per andare all'inizio del tutorial.  Poi usa C-v
    ripetutamente per tornare a questo punto.
->> Prova M-> adesso, per andare alla fine del tutorial.  Quindi usa M-v
-   ripetutamente per tornare a questo punto.
 
-Il cursore si può anche spostare con i tasti freccia, se il terminale li
-ha.  Noi raccomandiamo di imparare C-b, C-f, C-n e C-p per tre motivi:
-primo, funzionano su tutti i terminali; secondo, una volta acquisita
-pratica nell'uso di Emacs, ci si accorgerà che raggiungere questi
-caratteri di controllo è più rapido che usare i tasti freccia perché non
-bisogna spostare le mani dalla posizione di scrittura sulla tastiera;
-terzo, una volta acquisita l'abitudine ad usare questi comandi con il
-carattere Control, si può allo stesso modo imparare ad usare altri comandi
-avanzati di spostamento del cursore.
-
-Molti comandi di Emacs accettano un argomento numerico che spesso serve a
-conteggiare per quante volte vanno ripetuti.  Il modo in cui si può
-fornire ad un comando il numero di ripetizioni è il seguente: si usa C-u e
-quindi si indicano le cifre prima di impartire il comando stesso.  Se
-esiste un tasto META (o EDIT o ALT) c'è un modo alternativo: si battono le
-cifre tenendo premuto il tasto META.  Noi consigliamo di imparare il
-metodo con C-u perché funziona su tutti i terminali.  L'argomento numerico
-è anche chiamato "argomento prefisso", perché viene indicato prima del
-comando a cui si riferisce.
+>> Prova M-> adesso, per andare alla fine del tutorial.  Quindi usa
+   M-v ripetutamente per tornare a questo punto.
+
+Il cursore si può anche spostare con i tasti freccia, se il terminale
+li ha.  Noi raccomandiamo di imparare C-b, C-f, C-n e C-p per tre
+motivi: primo, funzionano su tutti i terminali; secondo, una volta
+acquisita pratica nell'uso di Emacs, ci si accorgerà che raggiungere
+questi caratteri di controllo è più rapido che usare i tasti freccia
+(perché non bisogna spostare le mani dalla posizione di scrittura
+sulla tastiera); terzo, una volta acquisita l'abitudine ad usare
+questi comandi con il carattere Control, si può allo stesso modo
+imparare ad usare altri comandi avanzati di spostamento del cursore.
+
+Molti comandi di Emacs accettano un argomento numerico che spesso
+serve a conteggiare per quante volte vanno ripetuti.  Il modo in cui
+si può fornire ad un comando il numero di ripetizioni è il seguente:
+si usa C-u e quindi si indicano le cifre prima di impartire il comando
+stesso.  Se esiste un tasto META (o EDIT o ALT) c'è un modo
+alternativo: si battono le cifre tenendo premuto il tasto META.  Noi
+consigliamo di imparare il metodo con C-u perché funziona su tutti i
+terminali.  L'argomento numerico è anche chiamato “argomento
+prefisso”, perché viene indicato prima del comando a cui si riferisce.
 
 Per esempio, C-u 8 C-f sposta il cursore in avanti di otto caratteri.
 
->> Prova ad usare C-n, o C-p, con un argomento numerico per spostare il
-   cursore su una riga vicina a questa con un solo comando.
+>> Prova ad usare C-n, o C-p, con un argomento numerico per spostare
+   il cursore su una riga vicina a questa con un solo comando.
 
-La maggior parte dei comandi usa l'argomento numerico come numero delle
-ripetizioni da effettuare, tuttavia alcuni lo usano in modo diverso.
-Altri comandi (ma nessuno di quelli imparati fino ad ora) lo usano come
-indicatore di alternativa: la presenza di un argomento prefisso,
-indipendentemente dal suo valore, modifica il comportamento del comando.
+La maggior parte dei comandi usa l'argomento numerico come numero
+delle ripetizioni da effettuare, tuttavia alcuni lo usano in modo
+diverso.  Altri comandi (ma nessuno di quelli imparati fino ad ora) lo
+usano come indicatore di alternativa: la presenza di un argomento
+prefisso, indipendentemente dal suo valore, modifica il comportamento
+del comando.
 
-C-v e M-v sono un'altra eccezione.  Quando gli si fornisce un argomento
-spostano l'area di testo visualizzato in alto o in basso del numero di
-righe indicato invece che del numero di schermate.  Per esempio, C-u 8 C-v
-fa scorrere lo schermo di 8 righe.
+C-v e M-v sono un'altra eccezione.  Quando gli si fornisce un
+argomento spostano l'area di testo visualizzato in alto o in basso del
+numero di righe indicato invece che del numero di schermate.  Per
+esempio, C-u 8 C-v fa scorrere lo schermo di 8 righe.
 
 >> Ora prova con C-u 8 C-v.
 
-La schermata si sposta di 8 righe verso l'alto.  Se vuoi tornare di nuovo
-in basso puoi usare un argomento numerico con M-v.
+La schermata si sposta di 8 righe verso l'alto.  Se vuoi tornare di
+nuovo in basso puoi usare un argomento numerico con M-v.
 
-Quando si usa un sistema a finestre, come X11 o MS-Windows, ci dovrebbe
+Quando si usa un sistema a finestre, come X o MS-Windows, ci dovrebbe
 essere un'area rettangolare allungata chiamata barra di scorrimento a
 un lato della finestra di Emacs.  Si può far scorrere il testo con un
 click del mouse nella barra di scorrimento.
 
->> Prova a premere il pulsante centrale del mouse sopra all'area
-   evidenziata nella barra di scorrimento.  Verrà visualizzata una parte
-   del testo, più verso l'inizio o la fine, a seconda del punto della
-   barra che il puntatore indicava mentre premevi il pulsante del mouse.
->> Prova a spostare il mouse in su e in giù mentre tieni premuto il
-   pulsante centrale.  Osserva come il testo scorre in su e in giù mentre
-   muovi il mouse.
+Se il tuo mouse dispone di una rotellina, puoi usare anche quella per
+far scorrere il testo.
 
 
 * QUANDO EMACS SI BLOCCA
 ------------------------
 
-Se Emacs smette di rispondere ai comandi può essere fermato in modo sicuro
-premendo C-g.  Si può usare C-g per fermare un comando che sta impiegando
-troppo tempo per l'esecuzione.
+Se Emacs smette di rispondere ai comandi può essere fermato in modo
+sicuro premendo C-g.  Si può usare C-g per fermare un comando che sta
+impiegando troppo tempo per l'esecuzione.
 
-Si può anche usare C-g per annullare un argomento numerico o l'esecuzione
-di un comando che non si vuole più portare a termine.
+Si può anche usare C-g per annullare un argomento numerico o
+l'esecuzione di un comando che non si vuole più portare a termine.
 
->> Batti C-u 100 per indicare un argomento numerico di 100, quindi premi
-   C-g.  Ora premi C-f.  Il cursore si sposta in avanti di un solo
-   carattere perché hai annullato l'argomento numerico con C-g.
+>> Batti C-u 100 per indicare un argomento numerico di 100, quindi
+   premi C-g.  Ora premi C-f.  Il cursore si sposta in avanti di un
+   solo carattere perché hai annullato l'argomento numerico con C-g.
 
 Se hai premuto <ESC> per errore puoi annullare con C-g.
 
@@ -252,170 +262,194 @@ Se hai premuto <ESC> per errore puoi annullare con C-g.
 * COMANDI DISATTIVATI
 ---------------------
 
-Alcuni comandi di Emacs sono "disattivati", così da evitare che utenti
+Alcuni comandi di Emacs sono “disattivati”, così da evitare che utenti
 principianti possano usarli per errore.
 
-Se si inserisce uno dei comandi disattivati Emacs mostra un messaggio in
-cui dice quale sia il comando e chiede se davvero si vuole procedere con
-l'esecuzione.
+Se si inserisce uno dei comandi disattivati Emacs mostra un messaggio
+in cui dice quale sia il comando e chiede se davvero si vuole
+procedere con l'esecuzione.
 
 Se effettivamente si vuole provare il comando bisogna premere la barra
-spaziatrice come risposta a questa domanda.  Normalmente, se non si vuole
-eseguire il comando disattivato, bisogna rispondere alla domanda con "n".
+spaziatrice come risposta a questa domanda.  Normalmente, se non si
+vuole eseguire il comando disattivato, bisogna rispondere alla domanda
+con "n".
 
->> Prova C-x C-l (che è un comando disattivato), poi rispondi con "n" alla
-   domanda.
+>> Prova C-x C-l (che è un comando disattivato), poi rispondi con “n”
+   alla domanda.
 
 
 * FINESTRE
 ----------
 
-Emacs può avere diverse finestre, ognuna contenente il suo testo.
+Emacs può avere diverse “finestre”, ognuna contenente il suo testo.
 Spiegheremo dopo come usare finestre multiple.  Adesso ci occupiamo di
-come eliminare le finestre in più e tornare alla scrittura con una sola
-finestra.  È semplice:
+come eliminare le finestre in più e tornare alla scrittura con una
+sola finestra.  È semplice:
 
-    C-x 1    Una finestra (cioè, elimina tutte le altre finestre).
+       C-x 1   Una finestra (cioè, elimina tutte le altre finestre).
 
 È un CONTROL-x seguito dalla cifra 1.  C-x 1 espande la finestra che
-continene il cursore su tutto lo schermo ed elimina tutte le altre
+contiene il cursore su tutto lo schermo ed elimina tutte le altre
 finestre.
 
 >> Sposta il cursore su questa riga e poi batti C-u 0 C-l.
+
 >> Batti C-h k C-f.  Osserva come questa finestra viene rimpicciolita
    mentre ne appare un'altra che contiene la spiegazione del comando
    CONTROL-f.
+
 >> Batti C-x 1 e guarda come la finestra contenente la spiegazione
    scompare.
 
-Questo comando è diverso da tutti quelli imparati finora perché contiene
-due caratteri.  Inizia con il carattere CONTROL-x.  C'è un'ampia serie di
-comandi che iniziano con CONTROL-x; molti di essi riguardano finestre,
-file, buffer, e cose simili.  Questi comandi possono essere lunghi due,
-tre o quattro caratteri.
+C'è un'ampia serie di comandi che iniziano con CONTROL-x; molti di
+essi riguardano finestre, file, buffer e cose simili.  Questi comandi
+possono essere lunghi due, tre o quattro caratteri.
 
 
 * INSERIMENTO E CANCELLAZIONE
 -----------------------------
 
 Per inserire del testo basta premere i tasti corrispondenti alle varie
-lettere che lo compongono.  I caratteri visibili, come A, 7, *, ecc., sono
-considerati testo e inseriti immediatamente.  Si usa <Return> (il tasto
-Invio) per inserire un carattere Newline.
-
-L'ultimo carattere inserito si cancella usando <Delete>.  <Delete> è un
-tasto che si trova sulla tastiera e che potrebbe essere etichettato come
-"Del" o "Canc".  Spesso il tasto "Backspace" (quello con la freccia
-rivolta verso sinistra sopra il tasto Invio) serve da <Delete>, ma non
-sempre!
-
-Più in generale <Delete> cancella il carattere posto immediatamente prima
-della posizione attuale del cursore.
-
->> Prova questo adesso - batti alcuni caratteri e poi cancellali con
-   <Delete> ripetuto alcune volte.  Non preoccuparti delle modifiche fatte
-   a questo file: l'esercitazione principale rimarrà intatta, quella che
-   stai usando ne è una tua copia personale.
-
-Quando una riga di testo diventa troppo lunga per essere visualizzata su
-una riga di schermo essa viene "continuata" su una seconda riga dello
-schermo.  Un carattere barra retroversa («\») posto accanto al margine
-sinistro indica la prosecuzione della riga precedente.  Quando si usa un
-sistema a finestre grafico, invece della barra retroversa comparirà una
-piccola freccia ricurva.
+lettere che lo compongono.  I caratteri visibili, come A, 7, *, ecc.,
+sono considerati testo e inseriti immediatamente.  Per inserire un
+Newline usa il tasto <Invio> (a volte contrassegnato col simbolo ↲).
+
+Per cancellare il carattere immediatamente prima del cursore, digita
+<DEL>: solitamente è un tasto più largo del normale etichettato con
+“Backspace” o con una freccia che punta a sinistra, sopra il tasto
+<Invio>; generalmente elimina l'ultimo carattere inserito
+
+Può esserci un altro tasto etichettato “Canc”, ma non è quello a cui
+ci riferiamo con <DEL>.
+
+>> Prova questo adesso: batti alcuni caratteri e poi cancellali con
+   <DEL> ripetuto alcune volte.  Non preoccuparti delle modifiche
+   fatte a questo file: l'esercitazione principale rimarrà intatta,
+   quella che stai usando ne è una tua copia personale.
+
+Quando una riga di testo diventa troppo lunga per essere visualizzata
+su una riga di schermo viene spezzata e “continua” su una seconda riga
+dello schermo.  Se stai usando un sistema a finestre grafico,
+compaiono delle piccole frecce ricurve ai lati del testo (nelle
+“frange” sinistra e destra), indicando che la riga continua.  Su un
+terminale testuale, la continuazione viene indicata da una barra
+rovescia (“\”) nell'ultima colonna a destra.
 
 >> Inserisci del testo fino a raggiungere il margine destro e poi
    continua.  Vedrai apparire la prosecuzione della riga.
->> Usa <Delete> per cancellare il testo fino a quando la riga di testo è
+
+>> Usa <DEL> per cancellare il testo fino a quando la riga di testo è
    di nuovo tutta contenuta in una sola riga dello schermo.  La
    prosecuzione alla riga successiva scompare.
 
-Si può cancellare un carattere Newline ("a capo", è un carattere che ha un
-effetto ma non viene visualizzato esplicitamente) proprio come ogni altro.
+Si può cancellare un carattere Newline proprio come ogni altro.
 Quando si cancella il carattere Newline che separa due righe queste
-vengono unite in una riga sola.  Se la riga risultante è troppo lunga per
-essere contenuta dallo schermo allora sarà continuata nella riga
+vengono unite in una riga sola.  Se la riga risultante è troppo lunga
+per essere contenuta dallo schermo allora sarà continuata nella riga
 successiva.
 
->> Muovi il cursore all'inizio di una riga e poi premi <Delete>.  Questo
+>> Muovi il cursore all'inizio di una riga e poi premi <DEL>.  Questo
    unisce la riga alla precedente.
+
 >> Premi <Invio> per inserire di nuovo il carattere Newline che hai
    cancellato.
 
-Si ricordi che la maggior parte dei comandi di Emacs può ricevere un
-argomento numerico, compresi i caratteri per inserire il testo.  Quando si
-ripete un carattere di testo questo viene inserito un certo numero di
-volte.
+Il tasto <Invio> è speciale in quanto può implicare più del semplice
+inserimento di un carattere Newline.  A seconda del testo circostante,
+può inserire degli spazi dopo l'“a capo” in modo tale che inserendo
+ulteriori caratteri nella nuova riga, il testo rimanga allineato con
+quello nelle righe precedenti.  Questo comportamento (cioè quando
+premendo un tasto vengono eseguite ulteriori azioni rispetto al
+semplice inserimento del carattere stesso) viene chiamato “elettrico”.
+
+>> Questo è un esempio del comportamento “elettrico” di <Invio>
+   Inserisci un <Invio> alla fine di questa riga.
 
->> Prova adesso - inserisci C-u 8 * per ottenere ********.
+Dovresti vedere che dopo essere andato a capo, Emacs ha inserito degli
+spazi per allineare il cursore sotto la “I” di “Inserisci”.
 
-Fino ad ora si è visto il modo più semplice di inserire testo in Emacs e
-di correggere gli errori.  In modo analogo è possibile cancellare parola
-per parola o riga per riga.  Ecco un sommario delle operazioni di
+Ricorda che la maggior parte dei comandi di Emacs può ricevere un
+argomento numerico, compresi i caratteri per inserire il testo.
+Quando si ripete un carattere di testo questo viene inserito un certo
+numero di volte.
+
+>> Prova adesso: inserisci C-u 8 * per ottenere ********.
+
+Fino ad ora si è visto il modo più semplice di inserire testo in Emacs
+e di correggere gli errori.  In modo analogo è possibile cancellare
+parole o righe di testo.  Ecco un sommario delle operazioni di
 cancellazione:
 
-    <Delete>    cancella il carattere posto subito prima del cursore
-    C-d         cancella il carattere posto subito dopo il cursore
-
-    M-<Delete>  elimina la parola posta prima del cursore
-    M-d         elimina la parola posta subito dopo il cursore
-
-    C-k         cancella dalla posizione del cursore fino a fine riga
-    M-k         cancella fino alla fine della frase corrente.
-
-Si osservi che <Delete> e C-d da una parte e M-<Delete> e M-d dall'altra
-estendono il parallelo tra C-f e M-f (a dire il vero, <Delete> non è un
-vero e proprio carattere di controllo, ma non preoccupiamoci di questo).
-C-k è simile a C-e e M-k è simile a M-e, nel senso che i primi operano su
-righe e i secondi su frasi.
-
-Si può anche cancellare una qualsiasi parte del buffer in modo uniforme:
-si sposta il cursore alla fine di quella parte e poi si usa C-@ o C-SPC
-(uno o l'altro, SPC è la Barra Spaziatrice), poi si muove il cursore
-all'altro estremo della zona e si preme C-w.  Questo cancella tutto il
-testo posto tra i due estremi.
-
->> Sposta il cursore sulla P all'inizio del paragrafo precedente.  Premi
-   C-SPC.  Emacs dovrebbe mostrarti il messaggio "Mark set" nella parte
-   bassa dello schermo.  Muovi il cursore sulla s di "estremi" del
-   paragrafo precedente.  Premi C-w.  Questo cancellerà il testo a partire
-   dalla "P" e fino alla lettera che precede "s".
-
-La differenza tra "killing" (eliminazione) e "deleting" (cancellazione) è
-che il testo "eliminato" può essere inserito di nuovo, mentre quello che
-viene cancellato non si può recuperare.  L'operazione di reinserimento del
-testo soppresso si chiama "yanking".  In genere i comandi che possono
-rimuovere molto testo fanno un'operazione di eliminazione (così da poterlo
-eventualmente reinserire), mentre i comandi che rimuovono un solo
-carattere o solo righe vuote e spazi effettuano una cancellazione (quindi
-non è possibile recuperare quel testo).
-
->> Muovi il cursore all'inizio di una riga non vuota.  Usa C-k per
-   eliminare il testo di quella riga.  Premi C-k una seconda volta.  Ti
-   accorgerai di come viene cancellato il carattere Newline posto dopo la
-   riga stessa.
+       <DEL>   cancella il carattere posto subito prima del cursore
+       C-d     cancella il carattere posto subito dopo il cursore
+
+       M-<DEL> elimina la parola posta prima del cursore
+       M-d     elimina la parola posta subito dopo il cursore
+
+       C-k     cancella dalla posizione del cursore fino a fine riga
+       M-k     cancella fino alla fine della frase corrente.
+
+Si osservi che <DEL> e C-d da una parte e M-<DEL> e M-d dall'altra
+estendono il parallelo tra C-f e M-f (a dire il vero, <DEL> non è un
+vero e proprio carattere di controllo, ma non preoccupiamoci di
+questo).  C-k è simile a C-e e M-k è simile a M-e, nel senso che i
+primi operano su righe e i secondi su frasi.
+
+Si può anche cancellare una qualsiasi parte del buffer in modo
+uniforme: si sposta il cursore alla fine di quella parte e poi si usa
+C-<SPC> (<SPC> è la barra spaziatrice), poi si muove il cursore
+all'altro estremo della zona.  Una volta fatto, Emacs evidenzia il
+testo compreso tra il cursore e la posizione dove hai digitato
+C-<SPC>.  A questo punto premendo C-w il testo evidenziato viene
+eliminato.
+
+>> Sposta il cursore sulla “S” all'inizio del paragrafo precedente.
+>> Premi C-<SPC>.  Emacs dovrebbe mostrarti il messaggio "Mark set"
+   nella parte bassa dello schermo.
+>> Muovi il cursore sulla “o” di “sposta”, nella seconda riga del
+   paragrafo.
+>> Premi C-w.  Questo eliminerà il testo a partire dalla "S" e fino
+   alla lettera che precede “o”.
+
+La differenza tra “eliminazione” (“killing”) e “cancellazione”
+(“deleting”) è che il testo “eliminato” può essere inserito di nuovo
+(in qualsiasi posizione), mentre quello che viene cancellato non può
+essere reinserito nello stesso modo (si può comunque annullare una
+cancellazione, vedi sotto).  L'operazione di reinserimento del testo
+cancellato si chiama “yanking”.  In genere i comandi che possono
+rimuovere molto testo lo eliminano (così da poterlo eventualmente
+reinserire), mentre i comandi che rimuovono un solo carattere o solo
+righe vuote e spazi effettuano una cancellazione (quindi non è
+possibile recuperare quel testo).  <DEL> e C-d eseguono una
+cancellazione nel caso più semplice, senza un argomento.  Con un
+argomento invece eliminano il testo.
+
+>> Muovi il cursore all'inizio di una riga non vuota, poi usa C-k per
+   eliminare il testo di quella riga.
+>> Premi C-k una seconda volta.  Ti accorgerai di come viene
+   eliminato il carattere Newline posto dopo la riga stessa.
 
 Si noti che un singolo C-k elimina il contenuto di una sola riga, un
-secondo C-k cancella la riga stessa, e fa spostare in alto tutte le righe
-successive.  C-k usa un eventuale argomento numerico in modo speciale:
-elimina quel numero di righe ed il loro contenuto.  Non è una semplice
-ripetizione del comando.  C-u 2 C-k elimina due righe e i rispettivi
-caratteri Newline; battere due volte C-k sarebbe diverso.
-
-Recuperare il testo eliminato è un'operazione chiamata "yanking".
-(Significa "strappare", si deve pensare di riprendere del testo che era
-stato portato via).  Si può recuperare il testo che è stato eliminato sia
-nella sua posizione originaria che in un altro punto del buffer o anche in
-un diverso file.  Si può reinserire diverse volte, facendone copie
-multiple.
+secondo C-k elimina la riga stessa, facendo spostare in alto tutte le
+righe successive.  C-k usa un eventuale argomento numerico in modo
+speciale: elimina quel numero di righe ED il loro contenuto.  Non è
+una semplice ripetizione del comando.  C-u 2 C-k elimina due righe e i
+rispettivi caratteri Newline; battere due volte C-k sarebbe diverso.
+
+Puoi reinserire il testo eliminato sia nella stessa posizione dove è
+stato rimosso, in un altro punto del testo che stai modificando,
+oppure in un file diverso.  Puoi reinserire lo stesso testo diverse
+volte, facendone copie multiple.  Altri editor usano termini diversi
+per queste operazioni, tipicamente “taglia” e “incolla” (consulta il
+Glossario nel manuale di Emacs).
 
 Il comando per fare "yanking" è C-y.  Inserisce il testo eliminato per
 ultimo nel punto in cui si trova attualmente il cursore.
 
 >> Prova: premi C-y per recuperare il testo di prima.
 
-Se si eseguono operazioni di eliminazione immediatamente successive il
-testo eliminato è considerato un tutt'uno e quindi un solo C-y inserirà
+Se si eseguono operazioni di eliminazione consecutive il testo
+eliminato è considerato un tutt'uno e quindi un solo C-y inserirà
 quelle righe tutte assieme.
 
 >> Prova adesso, premi C-k alcune volte.
@@ -423,56 +457,55 @@ quelle righe tutte assieme.
 Adesso, per recuperare il testo eliminato:
 
 >> Premi C-y.  Sposta il cursore alcune righe più in basso e premi di
-   nuovo C-y.  Hai appena visto come copiare una parte di testo.
+   nuovo C-y.  Hai appena visto come duplicare una parte di testo.
 
 Cosa succede se c'è del testo da recuperare tra quello eliminato ma è
 stato eliminato altro testo dopo di esso?  C-y restituirebbe il testo
-dell'ultima eliminazione, tuttavia il testo eliminato in precedenza non è
-perso.  Si recupera con il comando M-y.  Dopo aver usato C-y per
-recuperare il testo più recentemente eliminato, un M-y sostituisce quel
-testo con quello dell'eliminazione precedente.  Premere M-y altre volte
-recupera il testo delle eliminazioni via via precedenti.  Quando è stato
-trovato il testo cercato non si deve fare altro per tenerlo.  Si può
-andare avanti con la scrittura lasciando il testo recuperato dove si
-trova.
-
-Quando si usa M-y un certo numero di volte si arriva di nuovo al testo di
-partenza (quello eliminato per ultimo).
-
->> Elimina una riga, sposta il cursore, elimina un'altra riga.  Usa C-y per
-   recuperare la seconda riga eliminata.  Premi M-y e verrà sostituita
-   dalla riga eliminata prima.  Usa di nuovo M-y e osserva cosa succede.
-   Continua fino a quando non ritrovi la riga che avevi eliminato per
-   seconda.  Se vuoi puoi usare un argomento numerico sia positivo che
-   negativo per M-y.
+dell'ultima eliminazione, tuttavia il testo eliminato in precedenza
+non è perso.  Si recupera con il comando M-y.  Dopo aver usato C-y per
+recuperare il testo più recentemente eliminato, un M-y sostituisce
+quel testo con quello dell'eliminazione precedente.  Premendo M-y in
+successione si recupera il testo delle eliminazioni via via
+precedenti.  Quando è stato trovato il testo cercato non si deve fare
+altro per tenerlo.  Si può andare avanti con la scrittura lasciando il
+testo recuperato dove si trova.
+
+Quando si usa M-y un certo numero di volte si arriva di nuovo al testo
+di partenza (quello eliminato per ultimo).
+
+>> Elimina una riga, sposta il cursore, elimina un'altra riga.
+   Premi C-y per recuperare la seconda riga eliminata.
+   Premi M-y e verrà sostituita dalla riga eliminata prima.
+   Usa di nuovo M-y e osserva cosa succede.  Continua fino a quando
+   non ritrovi la riga che avevi eliminato per seconda.  Se vuoi puoi
+   usare un argomento numerico sia positivo che negativo per M-y.
 
 
 * ANNULLAMENTO
 --------------
 
 Se si modifica il testo e subito dopo ci si accorge di aver fatto un
-errore si può annullare la modifica con il comando di annullamento C-x u.
+errore si può annullare la modifica con il comando di annullamento,
+C-/.
 
-Normalmente C-x u annulla le modifiche fatte da un solo comando; se si usa
-C-x u alcune volte di seguito ogni ripetizione annulla un comando
-precedente.
+Normalmente C-/ annulla le modifiche fatte da un solo comando; se si
+usa C-/ di seguito ogni ripetizione annulla un ulteriore comando.
 
-Ci sono due eccezioni: i comandi che non modificano il testo non contano,
-tra questi i comandi di spostamento del cursore e quelli di scorrimento
-del testo; i caratteri inseriti nel testo sono gestiti in gruppi, fino a
-20 elementi, ciò per ridurre il numero di C-x u da usare per annullare
-l'inserimento del testo.
+Ci sono due eccezioni: i comandi che non modificano il testo non
+contano, tra questi i comandi di spostamento del cursore e quelli di
+scorrimento del testo; i caratteri inseriti nel testo sono gestiti in
+gruppi, fino a 20 elementi (al fine di ridurre il numero di C-/ da
+usare per annullare l'inserimento del testo).
 
->> Elimina questa riga con C-k poi usa C-x u e guardala ricomparire.
+>> Elimina questa riga con C-k poi usa C-/ e dovrebbe ricomparire.
 
-C-_ è un comando di annullamento alternativo; funziona come C-x u ma è più
-semplice da inserire più volte di seguito.  Lo svantaggio di C-_ è che su
-alcune tastiere non è di inserimento immediato.  Ecco perché abbiamo
-previsto anche C-x u.  Su alcuni terminali si può ottenere C-_ dal simbolo
-/ mentre si tiene premuto il tasto CONTROL.
+C-_ è un comando di annullamento alternativo, funziona esattamente
+come C-/.  Su alcuni terminali, la sequenza C-/ invia effettivamente
+C-_ a Emacs.  Alternativamente, anche C-x u ha la stessa funzione di
+C-/, ma è leggermente più scomoda da inserire.
 
-Un argomento numerico per C-x u o C-_ agisce come numero delle ripetizioni
-da effettuare.
+Un argomento numerico per C-/, C-_ o C-x u agisce come numero delle
+ripetizioni da effettuare.
 
 Si può annullare la cancellazione del testo proprio come se ne annulla
 l'eliminazione.  La distinzione tra l'eliminazione e la cancellazione
@@ -483,337 +516,361 @@ differenza rispetto all'operazione di annullamento.
 * FILE
 ------
 
-Per conservare in modo permanente il testo inserito biaogna conservarlo in
-un file, altrimenti sarà perso al termine dell'esecuzione di Emacs.  Per
-inserire il testo in un file bisogna aprire quel file prima di comporre il
-testo.  (Questa operazione si chiama anche "visita" del file.)
-
-Aprire un file significa osservarne il contenuto all'interno di Emacs.
-Per molti versi è come se si operasse sul file stesso, tuttavia le
-modifiche apportate al contenuto non sono definitive fino a quando non si
-"salva" il file.  Tutto questo avviene in modo tale da evitare di lasciare
-un file su disco quando è modificato solo in parte.  Persino quando si
-salva il file Emacs conserva il contenuto originale dello stesso in un
-file con un altro nome, nel caso in cui si capisca più tardi che le
-modifiche sono state un errore.
-
-Osservando la parte bassa dello schermo si noti che c'è una riga che
-inizia e finisce con dei trattini e che all'inizio contiene questo testo
-"--:-- TUTORIAL.it" o qualcosa di simile.  Questa parte dello schermo
-normalmente mostra il nome del file che si sta "visitando".  In questo
-momento si "visita" un file che si chiama "TUTORIAL.it" che è poi una
-copia dell'esercitazione di Emacs.  Quando si apre un file con Emacs il
-suo nome apparirà sempre in quel punto preciso.
-
-Una caratteristica particolare del comando per aprire i file è che bisogna
-fornirgli il nome del file.  Diciamo in questo caso che il comando "legge
-un argomento dal terminale" (l'argomento è proprio il nome del file).
-Dopo aver scritto il comando
-
-    C-x C-f    Trova un file
+Per conservare in modo permanente il testo inserito bisogna
+conservarlo in un file, altrimenti sarà perso al termine
+dell'esecuzione di Emacs.  Per inserire il testo in un file bisogna
+aprire quel file prima di comporre il testo.  (Questa operazione si
+chiama anche “visita” del file.)
+
+Aprire un file implica vederne il contenuto all'interno di Emacs.  Per
+molti versi è come se si operasse sul file stesso, tuttavia le
+modifiche apportate al contenuto non sono definitive fino a quando non
+si “salva” il file.  Tutto questo avviene in modo tale da evitare di
+lasciare un file su disco quando è modificato solo in parte.  Persino
+quando si salva il file Emacs conserva il contenuto originale dello
+stesso in un file con un altro nome, nel caso in cui si capisca più
+tardi che le modifiche sono state un errore.
+
+Osservando la parte bassa dello schermo puoi notare una riga che
+inizia qualcosa del tipo “--:-- TUTORIAL.it”.  Questa parte dello
+schermo normalmente mostra il nome del file che si sta “visitando”.
+In questo momento stai osservando la tua copia personale
+dell'esercitazione di Emacs, chiamata “TUTORIAL.it”.  Quando si apre
+un file con Emacs il suo nome apparirà sempre in quel punto preciso.
+
+Una caratteristica particolare del comando per aprire i file è che
+bisogna fornirgli il nome del file.  Diciamo in questo caso che il
+comando “legge un argomento dal terminale” (l'argomento è proprio il
+nome del file).  Dopo aver scritto il comando
+
+       C-x C-f   Trova un file
 
 Emacs chiede il nome del file.  Il nome che si inserisce compare nella
-riga più in basso sullo schermo.  La riga di fondo è chiamata "minibuffer"
-quando viene usato per questo genere di operazioni di inserimento.  Si
-possono usare i consueti comandi di Emacs per operare sul nome del file.
+riga più in basso sullo schermo.  La riga di fondo è chiamata
+“minibuffer” quando viene usato per questo genere di operazioni di
+inserimento.  Si possono usare i consueti comandi di Emacs per operare
+sul nome del file.
 
 Mentre si inserisce il nome del file (oppure ogni altro testo nel
-minibuffer), si può annullare il comando con un C-g.
+minibuffer), è possibile annullare l'operazione usando C-g.
 
->> Premi C-x C-f, poi premi C-g.  Questo vuota il "minibuffer" e
+>> Premi C-x C-f, poi premi C-g.  Questo annulla il minibuffer e
    interrompe l'esecuzione del comando C-x C-f che stava usando il
-   "minibuffer".  Quindi non sarà aperto alcun file.
+   minibuffer.  Quindi non sarà aperto alcun file.
 
-Quando si finisce di indicare il nome del file bisogna premere <Invio> per
-portare a termine il comando.  Il comando C-x C-f inizia il suo lavoro e
-trova il file che è stato scelto.  Il "minibuffer" scompare quando il
-comando C-x C-f ha terminato l'esecuzione.
+Quando hai finito di indicare il nome del file, premi <Invio> per
+portare a termine il comando.  Il minibuffer scompare e il comando C-x
+C-f inizia il suo lavoro e trova il file che è stato scelto.
 
 Subito dopo, il contenuto del file compare sullo schermo e si può
-modificare a piacere.  Quando si desidera rendere permanenti le modifiche
-si usa il comando
+modificare a piacere.  Quando si desidera rendere permanenti le
+modifiche si usa il comando
 
-    C-x C-s    Salva il file
+       C-x C-s   Salva il file
 
 Questo copia il testo contenuto in Emacs nel file su disco.  La prima
-volta che si effetta questa operazione Emacs dà un nuovo nome al file
-originale in modo da conservarlo.  Il nuovo nome è ottenuto aggiungendo un
-carattere "~" alla fine del nome originale.
-
-Quando il salvataggio è terminato Emacs mostra il nome del file appena
-scritto.  Si dovrebbero salvare le modifiche piuttosto spesso in modo da
-non perdere troppo lavoro se per caso il sistema dovesse bloccarsi.
-
->> Usa C-x C-f per salvare la tua copia di questa esercitazione.  Questo
-   dovrebbe mostrare il messaggio "Wrote ...TUTORIAL.it" nella parte bassa
-   dello schermo.
+volta che si effettua questa operazione Emacs rinomina il file
+originale in modo da conservarlo.  Il nuovo nome è ottenuto
+aggiungendo un carattere "~" alla fine del nome originale.  Quando il
+salvataggio termina, Emacs mostra il nome del file scritto.
+
+>> Premi C-x C-s TUTORIAL<Invio>.
+   Questo dovrebbe salvare questa esercitazione in un file chiamato
+   “TUTORIAL” e mostrare “Wrote ...TUTORIAL nella parte bassa dello
+   schermo.
 
-Si può aprire un file già esistente per leggerlo o modificarlo.  Si può
-anche "visitare" un file che ancora non esiste.  Questo è un modo per
-creare un nuovo file con Emacs: si apre il file che sarà inizialmente
-vuoto e quindi si inizia ad inserire il testo.  Quando si chiederà di
-salvare il file Emacs lo creerà ed esso conterrà tutto il testo che è
-stato inserito.  Da quel punto in poi si potrà pensare di operare su un
-file già esistente.
+Si può aprire un file già esistente per leggerlo o modificarlo.  Si
+può anche “visitare” un file che ancora non esiste.  Questo è un modo
+per creare un nuovo file con Emacs: si apre il file che sarà
+inizialmente vuoto e quindi si inizia ad inserire il testo.  Quando si
+chiederà di salvare il file Emacs lo creerà ed esso conterrà tutto il
+testo che è stato inserito.  Da quel punto in poi si potrà pensare di
+operare su un file già esistente.
 
 
 * BUFFER
 --------
 
-Se si apre un secondo file con C-x C-f il primo rimane aperto all'interno
-di Emacs.  Si può tornare a visualizzarlo "visitandolo" di nuovo con il
-comando C-x C-f.  In questo modo si possono aprire quanti file si vogliono
-all'interno di Emacs.
+Se si apre un secondo file con C-x C-f il primo rimane aperto
+all'interno di Emacs.  Si può tornare a visualizzarlo “visitandolo” di
+nuovo con il comando C-x C-f.  In questo modo si possono aprire quanti
+file si vogliono all'interno di Emacs.
 
->> Crea un file chiamato "pippo" usando C-x C-f pippo <Invio>.  Inserisci
-   del testo e poi salva "pippo" con C-x C-s.  Poi usa C-x C-f TUTORIAL.it
-   <Invio> per tornare all'esercitazione.
+Emacs conserva il testo di ogni file all'interno di un oggetto
+chiamato “buffer”.  L'apertura di un file crea un nuovo buffer
+all'interno di Emacs.  Per guardare una lista dei buffer che esistono
+attualmente nella tua sessione di Emacs si usa
 
-Emacs conserva il testo di ogni file all'interno di un oggetto chiamato
-"buffer".  La "visita" di un file produce un nuovo buffer all'interno di
-Emacs.  Per guardare una lista dei buffer che esistono attualmente nella
-tua sessione di Emacs si usa
-
-    C-x C-b    Elenca buffer
+       C-x C-b   Elenca buffer
 
 >> Prova C-x C-b adesso.
 
-Si osservi come ogni buffer abbia un nome e come possa avere anche il nome
-di un file del quale conserva il contenuto.  Alcuni buffer non
-corrispondono ad alcun file.  Per esempio il buffer che ha nome "*Buffer
-List*" non ha un file corrispondente, è quello che contiene la lista che è
-stata creata da C-x C-b.  OGNI testo che si legge all'interno di Emacs è
-sempre parte di un buffer.
+Osserva come ogni buffer abbia un nome e come possa avere anche il
+nome di un file del quale conserva il contenuto.  QUALSIASI testo
+mostrato in una finestra di Emacs appartiene a qualche buffer.
 
 >> Usa C-x 1 per eliminare la lista dei buffer.
 
-Se si modifica in qualche modo il testo di un file e poi si visita un altro
-file questo non comporta un salvataggio del primo.  Le modifiche rimangono
-solo all'interno di Emacs, nel buffer relativo a quel file.  La creazione
-o la modifica del buffer del secondo file non ha alcun effetto sul buffer
-del primo.  Sarebbe fastidioso dover tornare al primo file con C-x C-f per
-salvarlo con C-x C-s.  Così c'è il comando
+Quando ci sono svariati buffer, solo uno di essi è quello “corrente”
+in un certo istante.  Questo buffer è quello che è soggetto alle tue
+modifiche.  Se vuoi modificare un altro buffer, devi prima
+“selezionarlo”.  Se vuoi passare a un buffer che corrisponde a un
+file, puoi farlo visitando di nuovo quel file usando C-x C-f.  Ma c'è
+un modo più semplice: usa il comando C-x b.  Questo comando richiede
+il nome del buffer.
+
+>> Crea un file chiamato “pippo” con C-x C-f pippo<Invio>.
+   Torna poi a questa esercitazione con C-x b TUTORIAL<Invio>.
+
+La maggior parte delle volte, il nome del buffer corrisponde al nome
+del file (senza la parte relativa alla directory).  Questo non è
+sempre vero.  La lista dei buffer che ottieni con C-x C-b mostra sia
+il nome del buffer che il nome del file associato.
+
+Alcuni buffer non corrispondono ad alcun file.  Per esempio il buffer
+che ha nome “*Buffer List*” non è associato a nessun file.  Questo
+buffer TUTORIAL inizialmente non era associato a un file, mentre
+adesso lo è, dal momento che nella sezione precedente hai usato C-x
+C-s per salvarlo in un file.
+
+Anche il buffer chiamato “*Messages* non è associato ad alcun file.
+Quel buffer contiene tutti i messaggi che sono apparsi nella parte
+bassa dello schermo durante la sessione di Emacs.
+
+>> Passa al buffer con i messaggi con C-x b *Messages*<Invio>.
+   Torna poi a questa esercitazione con C-x b TUTORIAL<Invio>.
 
-    C-x s    Salva alcuni buffer
+Se si modifica in qualche modo il testo di un file e poi si visita un
+altro file questo non comporta il salvataggio del primo.  Le modifiche
+rimangono solo all'interno di Emacs, nel buffer relativo a quel file.
+La creazione o la modifica del buffer del secondo file non ha alcun
+effetto sul buffer del primo.  Questo è comodo, ma è conveniente avere
+la possibilità di salvare il buffer del primo file: sarebbe fastidioso
+dover prima passare a quel buffer per salvarlo con C-x C-s.  Così c'è
+il comando
 
-C-x s chiede conferma del salvataggio per ogni buffer che contiene testo
-modificato e non ancora salvato.  Chiede, per ognuno di quei buffer, se si
-voglia salvarne il contenuto nel file corrispondente.
+       C-x s   Salva alcuni buffer
 
->> Inserisci una riga di testo e poi premi C-x s.  Dovrebbe chiederti se
-   vuoi salvare il buffer chiamato TUTORIAL.it.  Rispondi di sì battendo
-   "y".
+C-x s chiede conferma del salvataggio per ogni buffer che contiene
+testo modificato e non ancora salvato.  Chiede, per ognuno di quei
+buffer, se si voglia salvarne il contenuto nel file corrispondente.
+
+>> Inserisci una riga di testo e poi premi C-x s.
+   Dovrebbe chiederti se vuoi salvare il file chiamato “...TUTORIAL”.
+   Rispondi di sì battendo “y”.
 
 
 * ESTENDERE L'INSIEME DEI COMANDI
 ---------------------------------
 
 Emacs ha molti comandi in più rispetto a quelli che potrebbero trovare
-posto su tutti i caratteri CONTROL e META.  Emacs risolve questo problema
-usando il comando "estendi" (eXtend).  Ce ne sono di due tipi:
-
-    C-x    Comando esteso carattere.  Seguito da un carattere.
-    M-x    Comando esteso con nome.  Seguito da un nome di comando.
-
-Si tratta di comandi utili ma meno utilizzati di quelli che già osservati.
-Se ne sono visti due: il comando C-x C-f per visitare un file e quello C-x
-C-s per salvarlo.  Un altro esempio è quello che serve per chiudere la
-sessione Emacs - cioè il comando C-x C-c.  Non bisogna temere di perdere
-le modifiche fatte: C-x C-c propone infatti di salvare ogni file
-modificato prima di chiudere Emacs.
-
-C-z è il comando che serve per uscire da Emacs *temporaneamente* - così da
-poter tornare alla stessa sessione di Emacs in un momento successivo.
-
-Su sistemi che lo permettono C-z "sospende" Emacs, cioè riporta alla shell
-che lo aveva invocato senza però porre termine alla sessione attuale.
-Nelle shell più comuni si può riaprire la sessione in corso con il comando
-"fg" oppure con "%emacs".
-
-Su sistemi che non prevedono la possibilità di "sospensione", C-z crea una
-subshell che funziona all'interno di Emacs per dare la possibilità di
-usare altri programmi e poi tornare a Emacs successivamente; in pratica
-non fa "uscire" veramente da Emacs.  In questo caso il comando di shell
-"exit" è il modo comune per tornare ad Emacs dalla subshell.
-
-Il momento di usare C-x C-c è quando si sta per effettuare il log-out dal
-sistema.  È anche il comando giusto quando si deve chiudere Emacs che è
-stato invocato da un programma che gestisce la posta o da altri programmi
-simili, dal momento che essi potrebbero non riuscire a gestire la
-sospensione di Emacs.  In circostanze normali, invece, se non si è sul
-punto di fare un log-out è meglio sospendere l'esecuzione di Emacs
-piuttosto che interromperla.
-
-Ci sono molti comandi che usano C-x.  Ecco una lista di quelli già
-conosciuti:
-
-    C-x C-f    Apri un file.
-    C-x C-s    Salva un file.
-    C-x C-b    Elenca buffer.
-    C-x C-c    Chiudi Emacs.
-    C-x 1      Elimina tutte le finestre tranne una.
-    C-x u      Annulla.
-
-I comandi estesi con nome sono usati ancora meno spesso, oppure sono usati
-solo in certi "modi" di esecuzione.  Un esempio è il comando
-replace-string per sostituire in tutto il testo una stringa di caratteri
-con un'altra.  Quando si usa M-x Emacs visualizza "M-x" nella parte bassa
-dello schermo, quindi si deve inserire per esteso il nome del comando; in
-questo caso "replace-string".  Inserisci solo "repl s<TAB>" ed Emacs
-completerà da solo il nome.  (<TAB> è il tasto di tabulazione, che si
-trova di solito sul lato sinistro della tastiera sopra al tasto Blocca
-Maiuscole).  Concludi l'inserimento del comando con il tasto <Invio>.
-
-Il comando replace-string richiede due argomenti: la stringa da sostituire
-e quella con cui sostituirla.  Bisogna indicare la fine di ogni argomento
-con <Invio>.
-
->> Muovi il cursore sulla riga bianca qui sotto, quindi batti M-x repl s
-   <Invio> cambiata <Invio> modificata <Invio>.
-
-Osserva come questa riga è cambiata: hai sostituito la parola cam-bia-ta
-con "modificata" tutte le volte che quella compariva nel testo, a partire
-dalla posizione iniziale del cursore.
+posto su tutti i caratteri CONTROL e META.  Emacs risolve questo
+problema usando il comando X (eXtend).  Ci sono due varianti:
+
+       C-x    Comando esteso carattere.  Seguito da un carattere.
+       M-x    Comando esteso con nome.  Seguito da un nome di comando.
+
+Si tratta di comandi utili ma meno utilizzati di quelli che già
+osservati.  Se ne sono visti alcuni: il comando C-x C-f per visitare
+un file e C-x C-s per salvarlo, ad esempio.  Un altro esempio è quello
+che serve per chiudere la sessione Emacs, cioè il comando C-x C-c.
+(Non preoccuparti di perdere le modifiche che hai apportato: C-x C-c
+propone infatti di salvare ogni file modificato prima di chiudere
+Emacs.)
+
+Se stai usando un terminale grafico, non devi fare niente di speciale
+per passare da Emacs a un'altra applicazione.  Puoi farlo con il mouse
+oppure utilizzare i comandi del “window manager”.  Al contrario, se
+stai usando un terminale a caratteri che può mostrare una sola
+applicazione alla volta, hai bisogno di un modo per “sospendere” Emacs
+e poter quindi usare un'altra applicazione.
+
+C-z è il comando che serve per uscire da Emacs *temporaneamente*, in
+modo tale da poter tornare alla stessa sessione di Emacs in un momento
+successivo.  Quando si è su un terminale a caratteri, C-z sospende
+Emacs, cioè si ritorna alla shell senza distruggere la sessione
+corrente.  Nelle shell più comuni, puoi ritornare in Emacs con il
+comando “fg” oppure con “%emacs”.
+
+Il momento di usare C-x C-c è quando si sta per effettuare il log-out
+dal sistema.  È anche il comando giusto quando si deve chiudere Emacs
+che è stato invocato da un altro programma, ad esempio da quello che
+gestisce la posta.
+
+Ci sono molti comandi C-x.  Ecco una lista di quelli già conosciuti:
+
+       C-x C-f    Apri un file.
+       C-x C-s    Salva un file.
+       C-x s      Salva alcuni buffer.
+       C-x C-b    Elenca buffer.
+       C-x b      Passa a un altro buffer.
+       C-x C-c    Chiudi Emacs.
+       C-x 1      Elimina tutte le finestre tranne una.
+       C-x u      Annulla.
+
+I comandi estesi con nome sono usati ancora meno spesso, oppure sono
+usati solo in certe modalità.  Un esempio è il comando replace-string
+per sostituire in tutto il testo una stringa di caratteri con
+un'altra.  Quando si usa M-x Emacs visualizza "M-x" nella parte bassa
+dello schermo, quindi si deve inserire per esteso il nome del comando;
+in questo caso “replace-string”.  Inserisci solo “repl s<TAB>” ed
+Emacs completerà da solo il nome.  (<TAB> è il tasto di tabulazione,
+che si trova di solito sul lato sinistro della tastiera sopra al tasto
+Blocca Maiuscole.)  Concludi l'inserimento del comando con il tasto
+<Invio>.
+
+Il comando replace-string richiede due argomenti: la stringa da
+sostituire e quella con cui sostituirla.  Bisogna indicare la fine di
+ogni argomento con <Invio>.
+
+>> Muovi il cursore sulla riga vuota due righe sotto questa.
+   Inserisci quindi M-x repl s<Invio>cambiata<Invio>modificata<Invio>.
+
+   Osserva come questa riga sia cambiata: hai sostituito la parola
+   “cambiata” con “modificata” tutte le volte che quella compariva nel
+   testo, a partire dalla posizione iniziale del cursore.
 
 
 * SALVATAGGIO AUTOMATICO
 ------------------------
 
-Quando si apportano delle modifiche ad un file ma non sono ancora state
-salvate potrebbero essere perse se per caso il sistema si bloccasse.  Per
-proteggerti da questa eventualità Emacs scrive periodicamente un file di
-"salvataggio automatico" per ogni file che si sta scrivendo.  Il nome del
-file di salvataggio automatico ha un carattere # all'inizio e alla fine;
-per esempio se il file si chiama "ciao.c" il nome del file di salvataggio
-automatico sarà "#ciao.c#".  Quando si salva il file nel modo consueto
-Emacs cancella il file di salvataggio automatico.
+Quando si apportano delle modifiche ad un file ma non sono ancora
+state salvate potrebbero essere perse se per caso il sistema si
+bloccasse.  Per proteggerti da questa eventualità Emacs scrive
+periodicamente un file di “salvataggio automatico” per ogni file che
+si sta modificando.  Il nome del file di salvataggio automatico ha un
+carattere # all'inizio e alla fine; per esempio se il file si chiama
+“ciao.c” il nome del file di salvataggio automatico sarà “#ciao.c#”.
+Quando si salva il file nel modo consueto Emacs cancella il file di
+salvataggio automatico.
 
-Se il computer si blocca si può recuperare il file salvato automaticamente
-aprendo il file in modo normale (il file che si stava scrivendo, non
-quello di salvataggio automatico) e usando poi M-x recover file<Invio>.
-Quando viene chiesta la conferma si risponda con yes<Invio> per andare
-avanti nel recupero dei dati salvati automaticamente.
+Se il computer si blocca si può recuperare il file salvato
+automaticamente aprendo il file in modo normale (il file che si stava
+scrivendo, non quello di salvataggio automatico) e usando poi M-x
+recover-file<Invio>.  Quando viene chiesta la conferma si risponda
+con yes<Invio> per procedere con il recupero dei dati salvati
+automaticamente.
 
 
 * AREA DI ECO
 -------------
 
 Se Emacs si accorge che si inseriscono comandi multicarattere in modo
-troppo lento allora mostra la sequenza nella parte bassa dello schermo in
-un'area chiamata "area di eco".  L'area in questione contiene l'ultima riga
-dello schermo.
+troppo lento allora mostra la sequenza nella parte bassa dello schermo
+in un'area chiamata "area di eco".  L'area in questione contiene
+l'ultima riga dello schermo.
 
 
 * MODE LINE
 -----------
 
-La riga immediatamente sopra all'area di eco è chiamata "mode line" (riga
-di modo).  La "mode line" si presenta più o meno così:
+La riga immediatamente sopra all'area di eco è chiamata "mode line"
+(riga di modo).  La "mode line" si presenta più o meno così:
 
---:** TUTORIAL.it (Fundamental)--L720--64%---------------
+ -:**-  TUTORIAL       62% L759    (Fundamental)
 
-Questa riga fornisce informazioni utili sullo stato di Emacs e sul testo
-che si inserisce.
+Questa riga fornisce informazioni utili sullo stato di Emacs e sul
+testo che si inserisce.
 
-Abbiamo già visto cosa significa il nome del file - è il file che si sta
-visitando.  --NN%-- (due cifre e il segno %) indica la posizione attuale
-nel testo: significa che NN percento del testo si trova sopra al margine
-superiore dello schermo.  Se si visualizza l'inizio del file ci sarà
-scritto --Top-- (inizio) invece che --00%--.  Se invece ci si trova alla
-fine del file ci sarà scritto --Bot-- (fine).  Se si osserva un file
-talmente piccolo da essere visualizzato per intero sullo schermo allora la
-"mode line" indicherà --All-- (tutto).
+Abbiamo già visto cosa significa il nome del file: è il file che si
+sta visitando.  NN% indica la posizione attuale nel testo: significa
+che NN percento del testo si trova sopra al margine superiore dello
+schermo.  Se si visualizza l'inizio del file ci sarà scritto “Top”
+(inizio) invece che “ 0%”.  Se invece ci si trova alla fine del file
+ci sarà scritto “Bot” (fine).  Se si osserva un file talmente piccolo
+da essere visualizzato per intero sullo schermo allora la mode line
+indicherà “All” (tutto).
 
 La lettera L e le cifre indicano il numero di riga (Line) del punto
 indicato dal cursore in quel momento.
 
 I due asterischi vicino all'inizio indicano che sono state fatte delle
 modifiche al testo.  Se il file è stato appena aperto o appena salvato
-quella parte della "mode line" non mostra alcun asterisco, solo trattini.
-
-La parte di "mode line" racchiusa tra parentesi serve ad indicare in quale
-modo di scrittura ci si trovi.  Il modo standard è "Fundamental" ed è
-quello che probabilmente è attivo adesso.  È un esempio di "modalità
-primaria" (major mode).
-
-Emacs ha tanti diversi tipi di "modalità primarie".  Alcuni di questi
-servono per la scrittura di diversi linguaggi di programmazione e/o tipi
-di testo, come la modalità Lisp, la modalità Testo, ecc.  In un
-determinato momento una sola "modalità primaria" alla volta può essere
-attiva, e il suo nome è visualizzato sulla "mode line", proprio come
-"Fundamental" lo è adesso.
-
-Ogni "modalità primaria" condiziona il comportamento di alcuni comandi.
+quella parte della mode line non mostra alcun asterisco, solo
+trattini.
+
+La parte di mode line racchiusa tra parentesi serve ad indicare in
+quale modo di scrittura ci si trovi.  Il modo standard è “Fundamental”
+ed è quello che probabilmente è attivo adesso.  È un esempio di
+“modalità primaria” (major mode).
+
+Emacs ha tanti diversi tipi di modalità primarie.  Alcuni di questi
+servono per la scrittura di diversi linguaggi di programmazione e/o
+tipi di testo, come la modalità Lisp, la modalità Testo, ecc.  In
+qualsiasi momento c'è una e una sola modalità primaria attiva, e il
+suo nome è visualizzato sulla mode line, dove adesso c'è
+“Fundamental”.
+
+Ogni modalità primaria condiziona il comportamento di alcuni comandi.
 Per esempio ci sono comandi per creare commenti in un programma e, dal
 momento che ogni linguaggio di programmazione ha un diverso tipo di
-commento, ogni "modalità primaria" deve inserire i commenti in modo
-diverso.  Ogni "modalità primaria" è anche il nome di un comando esteso
-con nome che serve per attivare quella "modalità primaria".  Per esempio
-M-x fundamental-mode è il comando per attivare la modalità primaria
-"Fundamental".
+commento, ogni modalità primaria deve inserire i commenti in modo
+diverso.  Ogni modalità primaria corrisponde al nome di un comando
+esteso, con cui puoi passare a quella modalità.  Per esempio M-x
+fundamental-mode è il comando per attivare la modalità primaria
+“Fundamental”.
 
-Se si vuole inserire del testo in italiano, come questo file, serve
-probabilmente la modalità testo ("text-mode").
+Se si vuole inserire del testo in italiano, come questo file,
+probabilmente è più adeguata la modalità testo.
 
->> Inserisci M-x text mode<Invio>.
+>> Inserisci M-x text-mode<Invio>.
 
-Non preoccuparti, nessuno dei comandi che hai imparato verrà modificato in
-modo sostanziale.  Tuttavia adesso puoi osservare come M-f e M-b
-considerino gli apostrofi come parti di parole.  Al contrario, nella
-modalità "Fundamental", M-f e M-b consideravano gli apostrofi dei
-separatori di parole.
+Non preoccuparti, nessuno dei comandi che hai imparato verrà
+modificato in modo sostanziale.  Tuttavia adesso puoi osservare come
+M-f e M-b considerino gli apostrofi come parti di parole.  In
+precedenza, nella modalità “Fundamental”, M-f e M-b consideravano gli
+apostrofi dei separatori di parole.
 
-Le "modalità primarie" di solito producono nei comandi piccoli cambiamenti
-come questo: la maggior parte di essi "fa lo stesso lavoro" ma in maniera
-appena diversa.
+Le modalità primarie di solito producono nei comandi piccoli
+cambiamenti come quello: la maggior parte di essi “fa lo stesso
+lavoro” ma in maniera un po' diversa.
 
-Per leggere la documentazione sulla "modalità primaria" attuale si usa
+Per leggere la documentazione sulla modalità primaria attuale, usa
 C-h m.
 
->> Usa C-u C-v una o più volte per portare questa riga vicino all'inizio
-   dello schermo.  Usa C-h m per leggere come il "text-mode" (modo testo)
-   differisce dalla modalità "Fundamental".  Premi C-x 1 per eliminare la
-   finestra contenente la documentazione.
-
-Le "modalità primarie" sono chiamate così perché ci sono anche delle
-"modalità secondarie" (minor modes).  Le "modalità secondarie" non sono
-alternative alle "modalità primarie" ma solo piccole varianti di esse.
-Ogni "modalità secondaria" può essere attivata o disattivata
-indipendentemente da tutte le altre "modalità secondarie" e
-indipendentemente dalla "modalità primaria" attiva in quel momento.  Si
-può quindi usare nessuna "modalità secondaria", una soltanto oppure ogni
-altra combinazione di modalità secondarie.
-
-Una "modalità secondaria" molto utile, specialmente per il testo italiano,
-è la modalità "Auto Fill".  Quando questa modalità è attiva, Emacs
-interrompe la riga tra due parole ogni volta che, nel corso
-dell'inserimento, essa diventa troppo lunga.
-
-Si può attivare il modo "Auto Fill" con: M-x auto fill mode<Invio>.
-Quando la modalità suddetta è attiva può essere disattivata con M-x auto
-fill mode<Invio>.  Se la modalità è disattivata questo comando la attiva,
-viceversa se è già attiva.  Un comando che funziona così si comporta come
-un interruttore, attiva o disattiva qualcosa ogni volta che viene premuto.
-
->> Usa M-x auto fill mode<Invio> adesso.  Inserisci una riga di "asdf"
+>> Sposta il cursore sulla riga successiva a questa.
+>> Premi C-l C-l per portare questa riga in cima allo schermo.
+>> Usa C-h m per leggere come la modalità Testo differisca dalla
+   Fundamental.
+>> Premi C-x 1 per eliminare la finestra contenente la documentazione.
+
+Le modalità primarie sono chiamate così perché ci sono anche delle
+“modalità secondarie” (minor modes).  Tali modalità non sono
+alternative a quelle primarie, introducono solo piccole varianti.
+Ogni modalità secondaria può essere attivata o disattivata,
+indipendentemente da tutte le altre modalità secondarie e
+indipendentemente dalla modalità primaria attiva in quel momento.  Si
+può quindi usare nessuna modalità secondaria, una soltanto oppure
+qualsiasi combinazione di modalità secondarie.
+
+Una modalità secondaria molto utile, specialmente per scrivere del
+testo, è la modalità “Auto Fill” (riempimento automatico).  Quando
+questa modalità è attiva, Emacs interrompe la riga tra due parole ogni
+volta che, nel corso dell'inserimento, essa diventa troppo lunga.
+
+Si può attivare il modo “Auto Fill” con M-x auto-fill-mode<Invio>.
+Quando la modalità suddetta è attiva può essere disattivata eseguendo
+di nuovo M-x auto-fill-mode<Invio>.  Se la modalità è disattivata
+questo comando la attiva, viceversa se è già attiva.  Un comando che
+funziona così si comporta come un interruttore, attiva o disattiva
+qualcosa ogni volta che viene premuto.
+
+>> Usa M-x auto fill mode<Invio> adesso.  Inserisci una riga di “asdf ”
    ripetuti fino a quando non la vedi dividersi in due righe.  Devi
-   interporre degli spazi perché la modalità "Auto Fill" spezza le righe
+   interporre degli spazi perché la modalità Auto Fill spezza le righe
    solo in corrispondenza di uno spazio.
 
-Il margine di solito è predisposto a 70 caratteri ma può essere spostato
-con il comando C-x f.  Bisogna fornire al comando l'argomento numerico del
-margine che si desidera.
+Il margine di solito è predisposto a 70 caratteri ma può essere
+spostato con il comando C-x f.  Bisogna fornire al comando l'argomento
+numerico del margine che si desidera.
 
 >> Usa C-x f con un argomento di 20 (C-u 2 0 C-x f), poi inserisci del
-   testo e osserva come Emacs interrompe le righe a 20 caratteri.  Infine
-   torna di nuovo a un margine di 70 caratteri con C-x f.
+   testo e osserva come Emacs interrompe le righe a 20 caratteri.
+   Infine torna di nuovo a un margine di 70 caratteri con C-x f.
 
-Se si modifica il testo all'interno di un paragrafo la modalità
-"Auto Fill" non
-lo risistema.
-Per risistemare i margini di un paragrafo
-si usa M-q (META-q)
-quando il cursore si trova in quel paragrafo.
+Se si modifica il testo all'interno di un paragrafo la modalità "Auto
+Fill" non lo risistema.  Per risistemare i margini di un paragrafo si
+usa M-q (META-q) quando il cursore si trova in quel paragrafo.
 
 >> Muovi il cursore sul paragrafo precedente e premi M-q.
 
@@ -821,250 +878,309 @@ quando il cursore si trova in quel paragrafo.
 * CERCARE DEL TESTO
 -------------------
 
-Emacs può effettuare la ricerca di stringhe (che sono gruppi di caratteri
-contigui o parole) in posizione sia successiva che precedente nel testo.
-Cercare una stringa è un comando che provoca lo spostamento del cursore:
-lo porta lì dove la stringa compare.
-
-Il comando di ricerca di Emacs è diverso da quello di molti altri editor
-perché è "incrementale".  Ciò significa che la ricerca avviene proprio
-mentre si inserisce la stringa da cercare.
-
-I comandi per iniziare la ricerca sono C-s per quella in avanti e C-r per
-quella all'indietro nel testo.  ASPETTA!  Non provarli ora.
-
-Quando si preme C-s si vede comparire il messaggio "I-search" nell'"area
-di eco", ciò significa che Emacs aspetta che si indichi ciò che deve
-cercare.  <Invio> serve a concludere la ricerca.
-
->> Adesso usa C-s per inziare la ricerca.  LENTAMENTE, una lettera alla
-   volta, inserisci la parola "cursore", facendo una pausa dopo ogni
-   carattere scritto per vedere cosa succede al cursore.  Hai cercato
-   "cursore" una volta sola.
->> Usa C-s un'altra volta per trovare il punto in cui la parola "cursore"
-   compare successivamente.
->> Adesso premi <Delete> quattro volte e osserva come si muove il cursore.
+Emacs può effettuare la ricerca di stringhe (una “stringa” è un gruppo
+di caratteri contigui) in posizione sia successiva che precedente nel
+testo.  Cercare una stringa è un comando che provoca lo spostamento
+del cursore: lo porta lì dove la stringa compare.
+
+Il comando di ricerca di Emacs è diverso da quello di molti altri
+editor perché è “incrementale”.  Ciò significa che la ricerca avviene
+proprio mentre si inserisce la stringa da cercare.
+
+I comandi per iniziare la ricerca sono C-s per quella in avanti e C-r
+per quella all'indietro nel testo.  ASPETTA!  Non provarli ora.
+
+Quando si preme C-s si vede comparire il messaggio “I-search”
+nell'area di eco: ciò significa che Emacs aspetta che si indichi ciò
+che deve cercare.  <Invio> serve a concludere la ricerca.
+
+>> Adesso usa C-s per iniziare la ricerca.  LENTAMENTE, una lettera
+   alla volta, inserisci la parola “cursore”, facendo una pausa dopo
+   ogni carattere scritto per vedere cosa succede al cursore.  Hai
+   cercato “cursore”, una volta sola.
+>> Usa C-s un'altra volta per trovare la successiva occorrenza della
+   parola “cursore”.
+>> Adesso premi <DEL> quattro volte e osserva come si muove il cursore.
 >> Premi <Invio> per concludere la ricerca.
 
-Hai visto cos'è successo?  Durante una ricerca incrementale Emacs prova ad
-andare al punto successivo in cui compare la stringa indicata fino a quel
-momento.  Per raggiungere il punto successivo in cui compare di nuovo
-"cursore" basta solo premere C-s ancora una volta.  Se la stringa cercata
-non compare in alcun punto successivo Emacs emette un "beep" e informa che
-la ricerca non è andata a buon fine ("failing").  C-g è un modo
-alternativo per concludere la ricerca.
-
-NOTA: su alcuni sistemi il comando C-s bloccherà lo schermo e poi non si
-vedrà alcun altro messaggio da Emacs.  Questo significa che una
-caratteristica del sistema operativo chiamata "controllo di flusso" sta
-intercettando il carattere C-s e non gli permette di arrivare fino ad
-Emacs.  Per sbloccare lo schermo si può usare C-q.  Poi si legga la
-sezione "Spontaneous Entry to Incremental Search" nel manuale di Emacs per
-suggerimenti su come gestire questa caratteristica del proprio sistema.
-
-Se durante una ricerca incrementale si preme il tasto <Delete> ci si
-accorgerà che l'ultimo carattere della stringa da cercare scompare e la
-ricerca torna all'ultimo risultato trovato prima che fosse stato scritto.
-Per esempio, supponiamo di aver battuto una "c" e di aver trovato la prima
-"c" che compare nel testo.  Se poi aggiungiamo una "u" il cursore si
-sposta alla prima stringa "cu" che trova.  Ora se si preme <Delete> la "u"
-viene cancellata dalla stringa da cercare e il cursore torna sulla "c" che
-era stata trovata in precedenza.
+Hai visto cos'è successo?  Durante una ricerca incrementale Emacs
+prova ad andare al punto successivo in cui compare la stringa indicata
+fino a quel momento.  Per raggiungere il punto successivo in cui
+compare di nuovo “cursore” basta solo premere C-s ancora una volta.
+Se la stringa cercata non compare in alcun punto successivo Emacs
+emette un “beep” e informa che la ricerca non è andata a buon fine
+(“failing”).  C-g è un modo alternativo per concludere la ricerca.
+
+Se durante una ricerca incrementale si preme il tasto <DEL> ci si
+accorgerà che l'ultimo carattere della stringa da cercare scompare e
+la ricerca torna all'ultimo risultato trovato prima che fosse stato
+scritto.  Per esempio, supponiamo di aver battuto una “c” e di aver
+trovato la prima “c” che compare nel testo.  Se poi aggiungiamo una
+“u” il cursore si sposta alla prima stringa “cu” che trova.  Ora se si
+preme <DEL> la “u” viene rimossa dalla stringa da cercare e il cursore
+torna sulla “c” trovata in precedenza.
 
 Se ci si trova nel mezzo di una operazione di ricerca e si usa un
-carattere control o meta (con poche eccezioni - i caratteri che hanno
-significato particolare durante la ricerca sono C-s e C-r) allora la
+carattere control o meta (con poche eccezioni, caratteri che hanno
+significato particolare durante la ricerca come C-s e C-r) allora la
 ricerca viene conclusa.
 
-Il comando C-s inizia la ricerca di ogni presenza della stringa in
-posizione SUCCESSIVA a quella attuale del cursore.  Se si vuole cercare
-qualcosa che nel testo precede il cursore allora bisogna usare il comando
-C-r.  Tutto quello che abbiamo detto su C-s si applica allo stesso modo
-per C-r, invertendo ovviamente la direzione di ricerca.
+Il comando C-s inizia la ricerca di ogni occorrenza della stringa in
+posizione SUCCESSIVA a quella attuale del cursore.  Se si vuole
+cercare qualcosa che nel testo precede il cursore allora bisogna usare
+il comando C-r.  Tutto quello che abbiamo detto su C-s si applica allo
+stesso modo per C-r, invertendo ovviamente la direzione di ricerca.
 
 
 * FINESTRE MULTIPLE
 -------------------
 
 Una delle caratteristiche interessanti di Emacs è che si possono
-visualizzare più finestre sullo schermo nello stesso momento.
+visualizzare più finestre sullo schermo nello stesso momento. (Nota
+che Emacs utilizza il termine “frame”, descritto nella sezione
+successiva, per indicare quello che altre applicazioni chiamano
+“window”.  Il manuale di Emacs contiene un Glossario dei termini usati
+da Emacs.)
+
+>> Muovi il cursore su questa riga e inserisci C-l C-l.
 
->> Muovi il cursore su questa riga e inserisci C-u 0 C-l (è CONTROL-L, non
-   CONTROL-1).
 >> Adesso usa C-x 2 che divide lo schermo in due parti.  Entrambe le
    finestre visualizzano questo tutorial.  Il cursore si trova nella
    finestra superiore.
+
 >> Premi C-M-v per far scorrere la finestra inferiore.  (Se non hai un
    tasto META usa <ESC> C-v.)
+
 >> Usa C-x o per muovere il cursore nella finestra inferiore.
 >> Usa C-v e M-v nella finestra inferiore per farvi scorrere il testo.
    Continua a leggere queste indicazioni nella finestra superiore.
->> Premi C-x o di nuovo per muovere il cursore nella finestra superiore.
-   Il cursore si trova sul punto che occupava in precedenza.
 
-Si può continuare a usare C-x o per andare da una finestra all'altra.  Ogni
-finestra ha la sua posizione per il cursore ma solo una alla volta lo
-visualizza.  Tutti i comandi impartiti funzionano sulla finestra in cui si
-trova il cursore.  Noi la chiamiamo la "finestra selezionata".
+>> Premi C-x o di nuovo per muovere il cursore nella finestra
+   superiore.  Il cursore si trova sul punto che occupava in
+   precedenza.
+
+Puoi continuare a usare C-x o per andare da una finestra all'altra.
+La “finestra selezionata”, dove avvengono le modifiche, è quella con
+un cursore che lampeggia quando non stai scrivendo. Le altre finestre
+conservano la loro posizione del cursore; se stai usando un terminale
+grafico, quei cursori appaiono come dei rettangoli vuoi e non
+lampeggianti.
 
 Il comando C-M-v è molto utile quando si inserisce del testo in una
-finestra mentre si usa l'altra solo come riferimento.  Si può tenere il
-cursore sempre nella finestra in cui si lavora e portare avanti
-sequenzialmente il testo contenuto nell'altra con C-M-v.
+finestra mentre si usa l'altra solo come riferimento.  Si può tenere
+il cursore sempre nella finestra in cui si lavora e far scorrere il
+testo contenuto nell'altra con C-M-v.
 
-C-M-v è un esempio di carattere CONTROL-META.  Se c'è un vero e proprio
-tasto META si può ottenere C-M-v tenendo premuti contemporaneamente
-CONTROL e META mentre si batte v.  Non importa quale tra CONTROL e META
-viene premuto per primo perché essi agiscono assieme modificando i
-caratteri inseriti dopo.
+C-M-v è un esempio di carattere CONTROL-META.  Se c'è un vero e
+proprio tasto META si può ottenere C-M-v tenendo premuti
+contemporaneamente CONTROL e META mentre si batte v.  Non importa
+quale tra CONTROL e META viene premuto per primo perché essi agiscono
+assieme modificando i caratteri inseriti dopo.
 
 Se non c'è un tasto META e si usa il tasto ESC l'ordine diventa
-importante: bisogna premere prima <ESC> e poi farlo seguire da CONTROL-v
-perché CONTROL-ESC-v non funziona.  Questo perché <ESC> è un carattere a
-sé stante e non uno che ne modifica altri.
+importante: bisogna premere prima <ESC> e poi farlo seguire da
+CONTROL-v perché CONTROL-ESC-v non funziona.  Questo perché <ESC> è un
+carattere a sé stante e non uno che ne modifica altri.
 
 >> Usa C-x 1 (nella finestra superiore) per eliminare la finestra
    inferiore.
 
 (Se usi C-x 1 nella finestra inferiore allora viene eliminata quella
-superiore.  Questo comando conserva una sola finestra, quella in cui si
-trova il cursore.)
+superiore.  Pensa a questo comando come “conserva una sola finestra,
+quella attualmente selezionata.”)
+
+Non devi necessariamente visualizzare il medesimo buffer in entrambe
+le finestre.  Se usi C-x C-f per visitare un file in una finestra, il
+contenuto dell'altra non cambia.  Si può visitare in modo indipendente
+un file diverso in ogni finestra.
 
-Due finestre aperte contemporaneamente non devono necessariamente
-contenere lo stesso buffer.  Quando si usa C-x C-f per visitare un file in
-una finestra il contenuto dell'altra non cambia.  Si può "visitare" in
-modo indipendente un file diverso in ogni finestra.
+Ecco un altro modo per usare due finestre per visualizzare cose
+diverse:
 
-Ecco un altro modo per usare due finestre per visualizzare cose diverse:
+>> Inserisci C-x 4 C-f seguito dal nome di uno dei tuoi file e termina
+   con <Invio>.  Osserva come il file viene aperto nella finestra
+   inferiore e il cursore venga posizionato là.
 
->> Inserisci C-x 4 C-f seguito dal nome di uno dei tuoi file.  Premi
-   <Invio>.  Osserva come il file viene aperto nella finestra inferiore.
-   Il cursore si posiziona in quella.
 >> Usa C-x o per tornare alla finestra superiore e C-x 1 per eliminare
    quella inferiore.
 
 
+* FRAME MULTIPLI
+----------------
+
+Emacs può anche creare dei “frame” multipli. Un frame il nome che
+diamo a una collezione di finestre, insieme con il suo menu, le barre
+di scorrimento, l'area di eco, ecc.  Su un terminale grafico, Emacs
+chiama “frame” quello che la maggior parte delle altre applicazioni
+chiamano “finestra”, ed è possibile mostrarne più di uno
+contemporaneamente.  Su un terminale testuale, è possibile mostrare un
+solo frame alla volta.
+
+>> Usa M-x make-frame<Invio>.
+   Un nuovo frame dovrebbe apparire sullo schermo.
+
+In questo nuovo frame puoi svolgere qualsiasi cosa come nel frame
+originale.  Non c'è nulla di speciale nel primo frame.
+
+>> Usa M-x delete-frame<Invio>.
+   Questo rimuove il frame selezionato.
+
+Puoi anche eliminare un frame usando i metodi offerti dal sistema
+grafico (normalmente cliccando sul pulsante “X” in uno degli angoli
+superiori del frame).  Se rimuovi in questo modo l'ultimo frame, la
+sessione Emacs viene terminata.
+
+
 * LIVELLI DI EDITING RICORSIVO
 ------------------------------
 
-A volte ci si può trovare in quello che si chiama un "livello di editing
-ricorsivo", ciò è indicato dalla presenza di parentesi quadre nella "mode
-line", attorno alle parentesi della "modalità primaria" attualmente in
-uso.  Per esempio si potrebbe leggere [(Fundamental)] invece che
-(Fundamental).
+A volte ci si può trovare in quello che si chiama un “livello di
+editing ricorsivo”: ciò è indicato dalla presenza di parentesi quadre
+nella mode line, attorno alle parentesi che delimitano il nome della
+modalità primaria.  Per esempio si potrebbe leggere [(Fundamental)]
+invece che (Fundamental).
 
-Per uscire dal livello di editing ricorsivo si usa <ESC> <ESC> <ESC>.  È
-un comando di uscita di uso piuttosto generale, si può anche usare per
-eliminare finestre in più e per uscire dal "minibuffer".
+Per uscire dal livello di editing ricorsivo si usa <ESC> <ESC> <ESC>.
+È un comando di uscita di uso piuttosto generale, si può anche usare
+per eliminare finestre in più e per uscire dal minibuffer.
 
 >> Usa M-x per entrare nel "minibuffer": poi usa <ESC> <ESC> <ESC> per
    uscirne.
 
-Non è possibile usare C-g per uscire da un livello di editing ricorsivo,
-ciò avviene perché C-g è usato per annullare i comandi all'INTERNO del
+Non è possibile usare C-g per uscire da un livello di editing
+ricorsivo, perché C-g è usato per annullare i comandi all'INTERNO del
 livello di editing ricorsivo.
 
 
 * COME IMPARARE ALTRO
 ---------------------
 
-In questo tutorial abbiamo provato a fornire le informazioni sufficienti
-per iniziare ad usare Emacs.  Ci sono così tante opzioni in Emacs che
-sarebbe impossibile spiegarle tutte qui, ma è possibile imparare tutte le
-altre caratteristiche di Emacs utili per il proprio lavoro.  Ci sono
-comandi per leggere la documentazione dei comandi disponibili in Emacs.
-Questi comandi di aiuto iniziano tutti con il carattere C-h, che infatti è
-chiamato "carattere di aiuto (help)".
+In questo tutorial abbiamo provato a fornire le informazioni
+sufficienti per iniziare ad usare Emacs.  Ci sono così tante opzioni
+in Emacs che sarebbe impossibile spiegarle tutte qui.  Tuttavia
+potresti voler saperne di più su Emacs, che offre molte altre utili
+funzionalità.  Ci sono comandi per leggere la documentazione dei
+comandi disponibili in Emacs.  Questi comandi di “aiuto” iniziano
+tutti con il carattere C-h, che infatti è chiamato “carattere di aiuto
+(help)”.
+
+Per raggiungere le voci di Aiuto si usa il carattere C-h e poi un
+altro carattere che specifica la richiesta.  Quando davvero non si sa
+cosa fare si può provare con C-h ? ed Emacs indicherà tutti i tipi di
+aiuto che può fornire.  Se si è attivato l'aiuto con C-h e si decide
+che non serve più si può annullare la richiesta con C-g.
 
-Per raggiungere le voci di Aiuto si usa il carattere C-h e poi un altro
-carattere che specifica la richiesta.  Quando davvero non si sa cosa fare
-si può provare con C-h ? ed Emacs indicherà tutti i tipi di aiuto che può
-fornire.  Se si è attivato l'aiuto con C-h e si decide che non serve più
-si può annullare la richiesta con C-g.
+(Se C-h non mostra un messaggio relativo all'aiuto nella parte bassa
+dello schermo, prova ad usare il tasto F1 oppure con M-x help<Invio>.)
 
-Alcuni sistemi fanno un diverso uso del carattere C-h perché questo viene
-indebitamente modificato dall'amministratore di sistema.  A parte
-rivolgerti allo stesso perché risolva il problema puoi provare ad accedere
-alla funzione aiuto di Emacs con il tasto F1 oppure con M-x help<Invio>.
+La forma base di aiuto è data da C-h c.  Si inserisce C-h, il
+carattere c e poi un carattere o una sequenza di caratteri; Emacs
+mostrerà una breve descrizione del comando stesso.
 
-La forma base di aiuto è data da C-h c.  Si inserisce C-h, il carattere c
-e poi un carattere o una sequenza di caratteri; Emacs mostrerà una breve
-descrizione del comando stesso.
+>> Prova C-h c C-p.
 
->> Prova C-h c C-p.  Dovresti leggere un messaggio del tipo
+Dovresti leggere un messaggio del tipo (purtroppo in inglese!):
 
-    C-p runs the command previous-line (purtroppo in inglese!)
+       C-p runs the command previous-line
 
-Questo messaggio indica il "nome della funzione".  I nomi di funzione sono
-usati principalmente per personalizzare ed estendere Emacs e sono scelti
-anche in modo da indicare che cosa il comando fa.  Servono quindi anche da
-breve descrizione, sufficiente per ricordarsi di comandi già imparati.
+Questo messaggio indica il “nome della funzione”.  Dal momento che i
+nomi di funzione sono scelti per indicare cosa fa il comando, servono
+quindi anche come breve descrizione, sufficiente per ricordarsi di
+comandi già imparati.
 
-I comandi con più caratteri come ad esempio C-x C-s e (se non c'è il tasto
-META o EDIT o ALT) <ESC>v sono permessi allo stesso modo dopo una
-richiesta di aiuto fatta con C-h c.
+I comandi con più caratteri come ad esempio C-x C-s e (se non c'è il
+tasto META o EDIT o ALT) <ESC>v sono permessi allo stesso modo dopo
+una richiesta di aiuto fatta con C-h c.
 
-Per avere ulteriori informazioni su un comando si usa C-h k invece che C-h
-c.
+Per avere ulteriori informazioni su un comando si usa C-h k invece che
+C-h c.
 
 >> Prova C-h k C-p.
 
-Questo mostrerà la documentazione della funzione, così come il suo nome,
-all'interno di una finestra di Emacs.  Quando hai finito di leggere usa
-C-x 1 per eliminare la finestra con il testo di aiuto.  Non sei obbligato
-a farlo subito.  Puoi anche lavorare sul tuo testo mentre fai riferimento
-al testo di aiuto e poi usare un C-x 1.
+Questo mostrerà la documentazione della funzione, così come il suo
+nome, all'interno di una finestra di Emacs.  Quando hai finito di
+leggere usa C-x 1 per eliminare la finestra con il testo di aiuto.
+Non sei obbligato a farlo subito.  Puoi anche lavorare sul tuo testo
+mentre fai riferimento al testo di aiuto e poi usare un C-x 1.
 
 Ecco altre utili opzioni di C-h:
 
-    C-h f    Descrive una funzione.  Inserisci il nome della funzione.
+       C-h f   Descrive una funzione.  Inserisci il nome della funzione.
 
->> Prova con C-h f previous-line<Invio>.  Avrai tutte le informazioni che
-   Emacs possiede sulla funzione che implementa il comando C-p.
+>> Prova con C-h f previous-line<Invio>.
+   Questo mostrerà tutte le informazioni che Emacs possiede sulla
+   funzione che implementa il comando C-p.
 
-Un comando simile è C-h v che mostra la documentazione di variabili i cui
-valori sono utilizzati per personalizzare il comportamento di Emacs.  Devi
-inserire il nome della variabile quando Emacs lo richiede.
+Un comando simile è C-h v che mostra la documentazione delle
+variabili, comprese quelle di cui puoi modificare il valore per
+personalizzare il comportamento di Emacs.  Devi inserire il nome della
+variabile quando Emacs lo richiede.
 
-    C-h a    "Apropos" comando.  Inserisci una parola ed Emacs ti
-             elencherà tutti i comandi il cui nome contiene quella
-             parola.  Questi comandi possono tutti essere eseguiti con
-             META-x.  Per alcuni comandi ti sarà mostrata anche una
-             sequenza di uno o due caratteri che serve a far partire il
-             comando senza doverlo inserire per esteso.
+    C-h a      "Apropos" comando.  Inserisci una parola ed Emacs ti
+               elencherà tutti i comandi il cui nome contiene quella
+               parola.  Questi comandi possono tutti essere eseguiti
+               con META-x.  Per alcuni comandi ti sarà mostrata anche
+               una sequenza di uno o due caratteri che serve a far
+               partire il comando senza doverlo inserire per esteso.
 
 >> Prova C-h a file<Invio>
 
 Questo mostrerà in un'altra finestra una lista di tutti i comandi che
-contengono la parola "file" nel nome.  Nella lista si vedranno
-comandi-carattere, come C-x C-f, assieme ai corrispondenti nomi per esteso
-come "find-file".
+contengono la parola “file” nel nome.  Nella lista si vedranno
+comandi-carattere, come C-x C-f, assieme ai corrispondenti nomi per
+esteso come find-file.
+
+>> Usa C-M-v per far scorrere il testo nella finestra di aiuto.
+   Ripeti per alcune volte.
 
->> Usa C-M-v per far scorrere il testo nella finestra di aiuto.  Ripeti
-   per alcune volte.
 >> Usa C-x 1 per eliminare la finestra di aiuto.
 
-    C-h i    Leggi la documentazione.  Questo comando apre un buffer
-             speciale chiamato "*info*" in cui puoi leggere i manuali
-             on-line dei pacchetti installati sul tuo sistema.  Batti m
-             emacs <Invio> per leggere il manuale di Emacs.  Se non hai
-             mai usato il sistema Info prima d'ora premi ? ed Emacs ti
-             guiderà nell'uso delle opzioni del modo Info.  Una volta
-             terminata questa esercitazione il manuale di Emacs contenuto
-             nel sistema Info dovrebbe diventare la tua principale fonte
-             di documentazione.
+   C-h i       Leggi la documentazione.  Questo comando apre un
+               buffer speciale chiamato “*info*” in cui puoi leggere
+               i manuali on-line dei pacchetti installati sul tuo
+               sistema.  Batti m emacs<Invio> per leggere il manuale
+               di Emacs.  Se non hai mai usato il sistema Info prima
+               d'ora premi ? ed Emacs ti guiderà nell'uso delle
+               opzioni del modo Info.  Una volta terminata questa
+               esercitazione il manuale di Emacs contenuto nel
+               sistema Info dovrebbe diventare la tua principale
+               fonte di documentazione.
+
+
+* ALTRE FUNZIONALITÀ
+--------------------
+
+Puoi imparare di più su Emacs leggendo il suo manuale, sia nella forma
+stampata piuttosto che da dentro Emacs stesso (usa il menu Help oppure
+C-h r).  Due funzionalità che possono farti comodo sono il
+completamento automatico, che consente di ridurre il numero di
+caratteri da digitare, e dired, che semplifica la gestione dei file.
+
+Il completamento è un modo per evitare la pressione di tasti quando
+non sia necessario.  Ad esempio, quando vuoi passare al buffer
+*Messages*, puoi inserire C-x b *M<Tab> e Emacs cercherà di completare
+il nome del buffer usando la parte che hai già inserito.  Questa
+funzione può essere usata anche sui nomi dei comandi oppure su quelli
+dei file, ed è descritta nel manuale Emacs nel nodo chiamato
+“Completion”.
+
+Dired ti consente di elencare i file in una directory (e opzionalmente
+nelle directory sottostanti), muoverti tra quei file, visitarli,
+rinominarli, cancellarli e in generale eseguire qualche operazione su
+quei file.  Dired è descritta nel manuale Emacs nel nodo chiamato
+“Dired”.
+
+Il manuale descrive molte altre funzionalità di Emacs.
 
 
 * CONCLUSIONI
 -------------
 
-Ricorda che per chiudere una sessione di Emacs si usa C-x C-c.  Per
-tornare temporaneamente alla shell, così da poter rientrare in Emacs
-successivamente, si usa C-z.
+Per chiudere una sessione di Emacs si usa C-x C-c.
 
-Questo documento è stato creato per essere utile a tutti i nuovi utenti,
-se qualcosa per te è stato poco chiaro non dare la colpa a te stesso -
-lamentati!
+Questo documento è stato creato per essere utile a tutti i nuovi
+utenti, se qualcosa per te è stato poco chiaro non dare la colpa a te
+stesso: lamentati!
 
 
 * COPIA
@@ -1072,8 +1188,8 @@ lamentati!
 
 La versione inglese di questo testo (disponibile nel file "TUTORIAL")
 deriva da una lunga serie di tutorial di Emacs che iniziò con quello
-scritto da Stuart Cracraft per il primo Emacs.  La versione italiana è a
-cura di Alfredo Finelli (address@hidden).
+scritto da Stuart Cracraft per il primo Emacs.  La versione italiana è
+a cura di Alfredo Finelli (address@hidden).
 
 Questo documento, come GNU Emacs, è coperto da copyright e viene
 distribuito con il permesso di farne copie a determinate condizioni:
@@ -1082,22 +1198,23 @@ distribuito con il permesso di farne copie a 
determinate condizioni:
    secondo i quali è possibile la copia e la distribuzione di questo
    documento è quella originale in lingua inglese contenuta nel file
    "TUTORIAL".  Qui di seguito se ne riporta una traduzione a scopo
-   indicativo, restando comunque inteso il fatto che è quella originale a
-   fare fede.
+   indicativo, restando comunque inteso il fatto che è quella
+   originale a fare fede.
 
 Copyright (C) 2003-2015 Free Software Foundation, Inc.
 
-   È permesso a chiunque copiare e distribuire attraverso ogni mezzo copie
-   fedeli di questo documento così come viene ricevuto, a condizione che
-   le informazioni sul copyright e sui permessi garantiti siano conservate
-   intatte e che il distributore riconosca a colui che riceve la copia il
-   diritto ad un'ulteriore distribuzione, che deve avvenire così come
-   definito in questa clausola.
-
-   È permesso distribuire versioni modificate di questo documento, o di
-   ogni sua parte, alle condizioni indicate precedentemente, purché esse
-   portino chiaramente indicato il nome di colui che le ha modificate per
-   ultimo.
+   È permesso a chiunque copiare e distribuire attraverso ogni mezzo
+   copie fedeli di questo documento così come viene ricevuto, a
+   condizione che le informazioni sul copyright e sui permessi
+   garantiti siano conservate intatte e che il distributore riconosca
+   a colui che riceve la copia il diritto ad un'ulteriore
+   distribuzione, che deve avvenire così come definito in questa
+   clausola.
+
+   È permesso distribuire versioni modificate di questo documento, o
+   di ogni sua parte, alle condizioni indicate precedentemente, purché
+   esse portino chiaramente indicato il nome di colui che le ha
+   modificate per ultimo.
 
 Le condizioni per copiare Emacs sono più complesse ma definite con lo
 stesso spirito.  Per favore, leggete il file COPYING e poi distribuite
diff --git a/etc/tutorials/TUTORIAL.pt_BR b/etc/tutorials/TUTORIAL.pt_BR
index 619f4fc..5fd0517 100644
--- a/etc/tutorials/TUTORIAL.pt_BR
+++ b/etc/tutorials/TUTORIAL.pt_BR
@@ -847,7 +847,7 @@ saída do Emacs. Isso indica que um "recurso" do sistema 
operacional
 chamado "controle de fluxo" (flow control) esta interceptando o C-s e
 não deixando que passe pelo Emacs. Para destravar a tela, digite
 C-q. Então, leia na seção "Spontaneous Entry to Incremental Search" no
-manual do Emacs para uma dica de como lhe dar com esse "recurso".
+manual do Emacs para uma dica de como lidar com esse "recurso".
 
 Se você estiver no meio de uma pesquisa incremental e digitar <Delete>,
 você perceberá que o último caractere da pesquisa será apagado e a
diff --git a/lib-src/etags.c b/lib-src/etags.c
index 8b980d3..3cb3968 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -364,6 +364,7 @@ static void PHP_functions (FILE *);
 static void PS_functions (FILE *);
 static void Prolog_functions (FILE *);
 static void Python_functions (FILE *);
+static void Ruby_functions (FILE *);
 static void Scheme_functions (FILE *);
 static void TeX_commands (FILE *);
 static void Texinfo_nodes (FILE *);
@@ -722,6 +723,12 @@ static const char Python_help [] =
 "In Python code, 'def' or 'class' at the beginning of a line\n\
 generate a tag.";
 
+static const char *Ruby_suffixes [] =
+  { "rb", "ruby", NULL };
+static const char Ruby_help [] =
+  "In Ruby code, 'def' or 'class' or 'module' at the beginning of\n\
+a line generate a tag.";
+
 /* Can't do the `SCM' or `scm' prefix with a version number. */
 static const char *Scheme_suffixes [] =
   { "oak", "sch", "scheme", "SCM", "scm", "SM", "sm", "ss", "t", NULL };
@@ -800,6 +807,7 @@ static language lang_names [] =
   { "proc",      no_lang_help,   plain_C_entries,   plain_C_suffixes   },
   { "prolog",    Prolog_help,    Prolog_functions,  Prolog_suffixes    },
   { "python",    Python_help,    Python_functions,  Python_suffixes    },
+  { "ruby",      Ruby_help,      Ruby_functions,    Ruby_suffixes      },
   { "scheme",    Scheme_help,    Scheme_functions,  Scheme_suffixes    },
   { "tex",       TeX_help,       TeX_commands,      TeX_suffixes       },
   { "texinfo",   Texinfo_help,   Texinfo_nodes,     Texinfo_suffixes   },
@@ -4532,6 +4540,35 @@ Python_functions (FILE *inf)
     }
 }
 
+/*
+ * Ruby support
+ * Original code by Xi Lu <address@hidden> (2015)
+ */
+static void
+Ruby_functions (FILE *inf)
+{
+  char *cp = NULL;
+
+  LOOP_ON_INPUT_LINES (inf, lb, cp)
+    {
+      cp = skip_spaces (cp);
+      if (LOOKING_AT (cp, "def")
+         || LOOKING_AT (cp, "class")
+         || LOOKING_AT (cp, "module"))
+       {
+         char *name = cp;
+
+        /* Ruby method names can end in a '='.  Also, operator overloading can
+           define operators whose names include '='.  */
+         while (!notinname (*cp) || *cp == '=')
+           cp++;
+
+         make_tag (name, cp - name, true,
+                   lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+       }
+    }
+}
+
 
 /*
  * PHP support
@@ -4948,13 +4985,29 @@ Lua_functions (FILE *inf)
 
   LOOP_ON_INPUT_LINES (inf, lb, bp)
     {
+      bp = skip_spaces (bp);
       if (bp[0] != 'f' && bp[0] != 'l')
        continue;
 
       (void)LOOKING_AT (bp, "local"); /* skip possible "local" */
 
       if (LOOKING_AT (bp, "function"))
-       get_tag (bp, NULL);
+       {
+         char *tag_name, *tp_dot, *tp_colon;
+
+         get_tag (bp, &tag_name);
+         /* If the tag ends with ".foo" or ":foo", make an additional tag for
+            "foo".  */
+         tp_dot = strrchr (tag_name, '.');
+         tp_colon = strrchr (tag_name, ':');
+         if (tp_dot || tp_colon)
+           {
+             char *p = tp_dot > tp_colon ? tp_dot : tp_colon;
+             int len_add = p - tag_name + 1;
+
+             get_tag (bp + len_add, NULL);
+           }
+       }
     }
 }
 
diff --git a/lib-src/pop.c b/lib-src/pop.c
index c6deaf7..42d3020 100644
--- a/lib-src/pop.c
+++ b/lib-src/pop.c
@@ -42,10 +42,6 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 #endif
 #include <pop.h>
 
-#ifdef sun
-#include <malloc.h>
-#endif /* sun */
-
 #ifdef HESIOD
 #include <hesiod.h>
 /*
diff --git a/lib/gnulib.mk b/lib/gnulib.mk
index 67c7e18..17a01af 100644
--- a/lib/gnulib.mk
+++ b/lib/gnulib.mk
@@ -21,7 +21,7 @@
 # the same distribution terms as the rest of that program.
 #
 # Generated by gnulib-tool.
-# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib 
--m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux 
--avoid=close --avoid=dup --avoid=fchdir --avoid=flexmember --avoid=fstat 
--avoid=malloc-posix --avoid=msvc-inval --avoid=msvc-nothrow --avoid=open 
--avoid=openat-die --avoid=opendir --avoid=raise --avoid=save-cwd 
--avoid=select --avoid=setenv --avoid=sigprocmask --avoid=stdarg 
--avoid=stdbool --avoid=threadlib --avoid=unsetenv --makefile-name=gnu [...]
+# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=lib 
--m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux 
--avoid=close --avoid=dup --avoid=fchdir --avoid=flexmember --avoid=fstat 
--avoid=malloc-posix --avoid=msvc-inval --avoid=msvc-nothrow --avoid=open 
--avoid=openat-die --avoid=opendir --avoid=raise --avoid=save-cwd 
--avoid=select --avoid=setenv --avoid=sigprocmask --avoid=stdarg 
--avoid=stdbool --avoid=threadlib --avoid=unsetenv --makefile-name=gnulib.mk - 
[...]
 
 
 MOSTLYCLEANFILES += core *.stackdump
diff --git a/lib/intprops.h b/lib/intprops.h
index 8fff86d..ecafaf7 100644
--- a/lib/intprops.h
+++ b/lib/intprops.h
@@ -272,9 +272,10 @@
 
    Example usage, assuming A and B are long int:
 
-     long int result = INT_MULTIPLY_WRAPV (a, b);
-     printf ("result is %ld (%s)\n", result,
-             INT_MULTIPLY_OVERFLOW (a, b) ? "after overflow" : "no overflow");
+     if (INT_MULTIPLY_OVERFLOW (a, b))
+       printf ("result would overflow\n");
+     else
+       printf ("result is %ld (no overflow)\n", a * b);
 
    Example usage with WRAPV flavor:
 
diff --git a/lisp/apropos.el b/lisp/apropos.el
index 6d7dc8a..77c5023 100644
--- a/lisp/apropos.el
+++ b/lisp/apropos.el
@@ -823,7 +823,7 @@ Returns list of symbols and documentation found."
               (lambda (symbol)
                 (setq f (apropos-safe-documentation symbol)
                       v (get symbol 'variable-documentation))
-                (if (integerp v) (setq v))
+                (if (integerp v) (setq v nil))
                 (setq f (apropos-documentation-internal f)
                       v (apropos-documentation-internal v))
                 (setq sf (apropos-score-doc f)
diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index 18b8161..17fa43a 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -2,7 +2,7 @@
 
 ;; Copyright (C) 1997-1999, 2001-2015 Free Software Foundation, Inc.
 
-;; Author: Anders Lindgren <address@hidden>
+;; Author: Anders Lindgren
 ;; Keywords: convenience
 ;; Created: 1997-06-01
 ;; Date: 1999-11-30
diff --git a/lisp/calendar/cal-html.el b/lisp/calendar/cal-html.el
index 4bddc38..8c46e3a 100644
--- a/lisp/calendar/cal-html.el
+++ b/lisp/calendar/cal-html.el
@@ -32,6 +32,7 @@
 ;;; Code:
 
 (require 'calendar)
+(require 'diary-lib)
 
 
 (defgroup calendar-html nil
@@ -358,12 +359,12 @@ of holidays, rather than diary entries."
 ;;  Monthly calendar
 ;;------------------------------------------------------------
 
-(autoload 'diary-list-entries "diary-lib")
-
 (defun cal-html-list-diary-entries (d1 d2)
   "Generate a list of all diary-entries from absolute date D1 to D2."
-  (diary-list-entries (calendar-gregorian-from-absolute d1)
-                      (1+ (- d2 d1)) t))
+  (if (with-demoted-errors "Not adding diary entries: %S"
+        (diary-check-diary-file))
+      (diary-list-entries (calendar-gregorian-from-absolute d1)
+                          (1+ (- d2 d1)) t)))
 
 (defun cal-html-insert-agenda-days (month year diary-list holiday-list)
   "Insert HTML commands for a range of days in monthly calendars.
diff --git a/lisp/calendar/calendar.el b/lisp/calendar/calendar.el
index 6c1b4c2..4c659bf 100644
--- a/lisp/calendar/calendar.el
+++ b/lisp/calendar/calendar.el
@@ -881,11 +881,11 @@ is a list of expressions that can involve the keywords 
`month', `day',
 and `year' (all numbers in string form), and `monthname' and `dayname'
 \(both alphabetic strings).  For example, a typical American form would be
 
-       '(month \"/\" day \"/\" (substring year -2))
+       (month \"/\" day \"/\" (substring year -2))
 
 whereas
 
-       '((format \"%9s, %9s %2s, %4s\" dayname monthname day year))
+       ((format \"%9s, %9s %2s, %4s\" dayname monthname day year))
 
 would give the usual American style in fixed-length fields.  The variables
 `calendar-iso-date-display-form', `calendar-european-date-display-form', and
@@ -1184,8 +1184,8 @@ A negative year is interpreted as BC; -1 being 1 BC, and 
so on."
 
 (defsubst calendar-day-number (date)
   "Return the day number within the year of the date DATE.
-For example, (calendar-day-number '(1 1 1987)) returns the value 1,
-while (calendar-day-number '(12 31 1980)) returns 366."
+For example, (calendar-day-number \\='(1 1 1987)) returns the value 1,
+while (calendar-day-number \\='(12 31 1980)) returns 366."
   (let* ((month (calendar-extract-month date))
          (day (calendar-extract-day date))
          (year (calendar-extract-year date))
diff --git a/lisp/calendar/diary-lib.el b/lisp/calendar/diary-lib.el
index 7382abf..0720d82 100644
--- a/lisp/calendar/diary-lib.el
+++ b/lisp/calendar/diary-lib.el
@@ -909,13 +909,15 @@ This is recursive; that is, included files may include 
other files."
                         (append diary-entries-list
                                 (diary-list-entries original-date number t)))))
             (display-warning
-             :error
+             'diary
              (format-message "Can't read included diary file %s\n"
-                            diary-file)))
+                            diary-file)
+             :error))
         (display-warning
-         :error
+         'diary
          (format-message "Can't find included diary file %s\n"
-                        diary-file)))))
+                        diary-file)
+         :error))))
   (goto-char (point-min)))
 
 (defun diary-include-other-diary-files ()
@@ -1190,7 +1192,7 @@ ensure that all relevant variables are set.
 
 \(setq diary-mail-days 3
       diary-file \"/path/to/diary.file\"
-      calendar-date-style 'european
+      calendar-date-style \\='european
       diary-mail-addr \"address@hidden")
 
 \(diary-mail-entries)
@@ -1410,11 +1412,12 @@ marks.  This is intended to deal with deleted diary 
entries."
                         (eval (car (read-from-string sexp)))
                       (error
                        (display-warning
-                        :error
+                        'diary
                         (format "Bad diary sexp at line %d in %s:\n%s\n\
 Error: %s\n"
                                 (count-lines (point-min) (point))
-                                diary-file sexp err))
+                                diary-file sexp err)
+                        :error)
                        nil))))))
     (cond ((stringp result) result)
           ((and (consp result)
diff --git a/lisp/calendar/holidays.el b/lisp/calendar/holidays.el
index 307ab4d..3e7289b 100644
--- a/lisp/calendar/holidays.el
+++ b/lisp/calendar/holidays.el
@@ -346,9 +346,10 @@ The holidays are those in the list `calendar-holidays'."
                          (eval p)
                        (error
                         (display-warning
-                         :error
+                         'holidays
                          (format "Bad holiday list item: %s\nError: %s\n"
-                                 p err))
+                                 p err)
+                         :error)
                         nil))))
            (setq res (append h res))))
      'calendar-date-compare)))
diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el
index 0955e72..ca6669d 100644
--- a/lisp/calendar/icalendar.el
+++ b/lisp/calendar/icalendar.el
@@ -321,18 +321,29 @@ other sexp entries are enumerated in any case."
   "Return a new buffer containing the unfolded contents of a buffer.
 Folding is the iCalendar way of wrapping long lines.  In the
 created buffer all occurrences of CR LF BLANK are replaced by the
-empty string.  Argument FOLDED-ICAL-BUFFER is the unfolded input
+empty string.  Argument FOLDED-ICAL-BUFFER is the folded input
 buffer."
   (let ((unfolded-buffer (get-buffer-create " *icalendar-work*")))
     (save-current-buffer
       (set-buffer unfolded-buffer)
       (erase-buffer)
       (insert-buffer-substring folded-ical-buffer)
+      (icalendar--clean-up-line-endings)
       (goto-char (point-min))
       (while (re-search-forward "\r?\n[ \t]" nil t)
         (replace-match "" nil nil)))
     unfolded-buffer))
 
+(defun icalendar--clean-up-line-endings ()
+  "Replace DOS- and MAC-like line endings with unix line endings.
+All occurrences of (CR LF) and (LF CF) are replaced with LF in
+the current buffer.  This is necessary in buffers which contain a
+mix of different line endings."
+  (save-excursion
+    (goto-char (point-min))
+    (while (re-search-forward "\r\n\\|\n\r" nil t)
+      (replace-match "\n" nil nil))))
+
 (defsubst icalendar--rris (regexp rep string &optional fixedcase literal)
   "Replace regular expression in string.
 Pass arguments REGEXP REP STRING FIXEDCASE LITERAL to
@@ -1296,8 +1307,8 @@ Returns an alist."
   "Return a VALARM block.
 Argument ADVANCE-TIME is a number giving the time when the alarm
 fires (minutes before the respective event).  Argument ALARM-SPEC
-is a list which must be one of '(audio), '(display) or
-'(email (ADDRESS1 ...)), see `icalendar-export-alarms'.  Argument
+is a list which must be one of (audio), (display) or
+(email (ADDRESS1 ...)), see `icalendar-export-alarms'.  Argument
 SUMMARY is a string which contains a short description for the
 alarm."
   (let* ((action (car alarm-spec))
diff --git a/lisp/cedet/cedet-global.el b/lisp/cedet/cedet-global.el
index 3ceed5d..77ffef0 100644
--- a/lisp/cedet/cedet-global.el
+++ b/lisp/cedet/cedet-global.el
@@ -104,7 +104,8 @@ SCOPE is the scope of the search, such as 'project or 
'subdirs."
 
 (defun cedet-gnu-global-expand-filename (filename)
   "Expand the FILENAME with GNU Global.
-Return a fully qualified filename."
+Return a list of absolute filenames or nil if none found.
+Signal an error if Gnu global not available."
   (interactive "sFile: ")
   (let ((ans (with-current-buffer (cedet-gnu-global-call (list "-Pa" filename))
               (goto-char (point-min))
diff --git a/lisp/cedet/ede.el b/lisp/cedet/ede.el
index 76ec356..2a522bc 100644
--- a/lisp/cedet/ede.el
+++ b/lisp/cedet/ede.el
@@ -81,12 +81,12 @@
   "Whether a new source file should be automatically added to a target.
 Whenever a new file is encountered in a directory controlled by a
 project file, all targets are queried to see if it should be added.
-If the value is 'always, then the new file is added to the first
-target encountered.  If the value is 'multi-ask, then if more than one
+If the value is `always', then the new file is added to the first
+target encountered.  If the value is `multi-ask', then if more than one
 target wants the file, the user is asked.  If only one target wants
 the file, then it is automatically added to that target.  If the
-value is 'ask, then the user is always asked, unless there is no
-target willing to take the file.  'never means never perform the check."
+value is `ask', then the user is always asked, unless there is no
+target willing to take the file.  `never' means never perform the check."
   :group 'ede
   :type '(choice (const always)
                 (const multi-ask)
diff --git a/lisp/cedet/ede/files.el b/lisp/cedet/ede/files.el
index 4ba823a..81a1a6a 100644
--- a/lisp/cedet/ede/files.el
+++ b/lisp/cedet/ede/files.el
@@ -304,7 +304,7 @@ Do this whenever a new project is created, as opposed to 
loaded."
 ;; instead so that -P can be obsoleted.
 (defun ede-directory-project-p (dir &optional force)
   "Return a project description object if DIR is in a project.
-Optional argument FORCE means to ignore a hash-hit of 'nomatch.
+Optional argument FORCE means to ignore a hash-hit of `nomatch'.
 This depends on an up to date `ede-project-class-files' variable.
 Any directory that contains the file .ede-ignore will always
 return nil.
diff --git a/lisp/cedet/ede/locate.el b/lisp/cedet/ede/locate.el
index a076c46..cee2f8e 100644
--- a/lisp/cedet/ede/locate.el
+++ b/lisp/cedet/ede/locate.el
@@ -100,9 +100,9 @@ based on `ede-locate-setup-options'."
 (defclass ede-locate-base ()
   ((root :initarg :root
         :documentation
-        "The root of these locat searches.")
+        "The root of these locate searches.")
    (file :documentation
-        "The last file search for with EDE locate.")
+        "The last file searched for with EDE locate.")
    (lastanswer :documentation
              "The last answer provided by the locator.")
    (hash :documentation
@@ -245,10 +245,8 @@ variable `cedet-global-command'.")
     newroot))
 
 (cl-defmethod ede-locate-file-in-project-impl ((loc ede-locate-global)
-                                           filesubstring)
-  "Locate with LOC occurrences of FILESUBSTRING under PROJECTROOT.
-Searches are done under the current root of the EDE project
-that created this EDE locate object."
+                                               filesubstring)
+  "Locate occurrences of FILESUBSTRING in LOC, using Gnu Global."
   (require 'cedet-global)
   (let ((default-directory (oref loc root)))
     (cedet-gnu-global-expand-filename filesubstring)))
diff --git a/lisp/cedet/mode-local.el b/lisp/cedet/mode-local.el
index b5995ff..48e73c2 100644
--- a/lisp/cedet/mode-local.el
+++ b/lisp/cedet/mode-local.el
@@ -627,7 +627,8 @@ SYMBOL is a function that can be overridden."
       (beginning-of-line)
       (forward-line -1))
     (let ((inhibit-read-only t))
-      (insert (overload-docstring-extension symbol) "\n")
+      (insert (substitute-command-keys (overload-docstring-extension symbol))
+              "\n")
       ;; NOTE TO SELF:
       ;; LIST ALL LOADED OVERRIDES FOR SYMBOL HERE
       )))
@@ -641,7 +642,8 @@ SYMBOL is a function that can be overridden."
                       (fetch-overload symbol)))
           modes)
 
-      (insert (overload-docstring-extension symbol) "\n\n")
+      (insert (substitute-command-keys (overload-docstring-extension symbol))
+              "\n\n")
       (insert (format-message "default function: `%s'\n" default))
       (if override
          (insert (format-message "\noverride in buffer `%s': `%s'\n"
@@ -872,24 +874,6 @@ invoked interactively."
   (when (setq mode (intern-soft mode))
     (mode-local-describe-bindings-1 mode (called-interactively-p 'any))))
 
-;; ;;; find-func support (Emacs 21.4, or perhaps 22.1)
-;; ;;
-;; (condition-case nil
-;;     ;; Try to get find-func so we can modify it.
-;;     (require 'find-func)
-;;   (error nil))
-
-;; (when (boundp 'find-function-regexp)
-;;   (unless (string-match "ine-overload" find-function-regexp)
-;;     (if (string-match "(def\\\\(" find-function-regexp)
-;;     (let ((end (match-end 0))
-;;           )
-;;       (setq find-function-regexp
-;;             (concat (substring find-function-regexp 0 end)
-;;                     "ine-overload\\|ine-mode-local-override\\|"
-;;                     "ine-child-mode\\|"
-;;                     (substring find-function-regexp end)))))))
-
 ;;; edebug support
 ;;
 (defun mode-local-setup-edebug-specs ()
diff --git a/lisp/cedet/semantic.el b/lisp/cedet/semantic.el
index 290cd90..a9af84a 100644
--- a/lisp/cedet/semantic.el
+++ b/lisp/cedet/semantic.el
@@ -1191,7 +1191,7 @@ This function can be used by 
`completion-at-point-functions'."
 (defun semantic-analyze-notc-completion-at-point-function ()
   "Return possible analysis completions at point.
 The completions provided are via `semantic-analyze-possible-completions',
-but with the 'no-tc option passed in, which means constraints based
+but with the `no-tc' option passed in, which means constraints based
 on what is being assigned to are ignored.
 This function can be used by `completion-at-point-functions'."
   (when (semantic-active-p)
@@ -1207,7 +1207,7 @@ This function can be used by 
`completion-at-point-functions'."
 (defun semantic-analyze-nolongprefix-completion-at-point-function ()
   "Return possible analysis completions at point.
 The completions provided are via `semantic-analyze-possible-completions',
-but with the 'no-tc and 'no-longprefix option passed in, which means
+but with the `no-tc' and `no-longprefix' option passed in, which means
 constraints resulting in a long multi-symbol dereference are ignored.
 This function can be used by `completion-at-point-functions'."
   (when (semantic-active-p)
diff --git a/lisp/cedet/semantic/bovine/c.el b/lisp/cedet/semantic/bovine/c.el
index 1c25c7b..d5af635 100644
--- a/lisp/cedet/semantic/bovine/c.el
+++ b/lisp/cedet/semantic/bovine/c.el
@@ -1513,7 +1513,7 @@ Override function for `semantic-tag-protection'."
 
 (define-mode-local-override semantic-find-tags-included c-mode
   (&optional table)
-  "Find all tags in TABLE that are of the 'include class.
+  "Find all tags in TABLE that are of the `include' class.
 TABLE is a tag table.  See `semantic-something-to-tag-table'.
 For C++, we also have to search namespaces for include tags."
   (let ((tags (semantic-find-tags-by-class 'include table))
@@ -1948,7 +1948,7 @@ For types with a :parent, create faux namespaces to put 
TAG into."
 (define-mode-local-override semanticdb-find-table-for-include c-mode
   (includetag &optional table)
   "For a single INCLUDETAG found in TABLE, find a `semanticdb-table' object
-INCLUDETAG is a semantic TAG of class 'include.
+INCLUDETAG is a semantic TAG of class `include'.
 TABLE is a semanticdb table that identifies where INCLUDETAG came from.
 TABLE is optional if INCLUDETAG has an overlay of :filename attribute.
 
diff --git a/lisp/cedet/semantic/db-find.el b/lisp/cedet/semantic/db-find.el
index 293f535..e5ce4cf 100644
--- a/lisp/cedet/semantic/db-find.el
+++ b/lisp/cedet/semantic/db-find.el
@@ -316,7 +316,7 @@ Default action as described in 
`semanticdb-find-translate-path'."
 ;;;###autoload
 (define-overloadable-function semanticdb-find-table-for-include (includetag 
&optional table)
   "For a single INCLUDETAG found in TABLE, find a `semanticdb-table' object
-INCLUDETAG is a semantic TAG of class 'include.
+INCLUDETAG is a semantic TAG of class `include'.
 TABLE is a semanticdb table that identifies where INCLUDETAG came from.
 TABLE is optional if INCLUDETAG has an overlay of :filename attribute."
   )
@@ -854,7 +854,7 @@ This makes it appear more like the results of a 
`semantic-find-' call.
 Optional FIND-FILE-MATCH loads all files associated with RESULTS
 into buffers.  This has the side effect of enabling `semantic-tag-buffer' to
 return a value.
-If FIND-FILE-MATCH is 'name, then only the filename is stored
+If FIND-FILE-MATCH is `name', then only the filename is stored
 in each tag instead of loading each file into a buffer.
 If the input RESULTS are not going to be used again, and if
 FIND-FILE-MATCH is nil, you can use `semanticdb-fast-strip-find-results'
diff --git a/lisp/cedet/semantic/doc.el b/lisp/cedet/semantic/doc.el
index 3ceb351..65718a0 100644
--- a/lisp/cedet/semantic/doc.el
+++ b/lisp/cedet/semantic/doc.el
@@ -41,7 +41,7 @@ some documentation in a comment preceding TAG's definition 
which we
 can look for.  When appropriate, this can be overridden by a language specific
 enhancement.
 Optional argument NOSNARF means to only return the lexical analyzer token for 
it.
-If nosnarf if 'lex, then only return the lex token."
+If NOSNARF is `lex', then only return the lex token."
   (if (not tag) (setq tag (semantic-current-tag)))
   (save-excursion
     (when (semantic-tag-with-position-p tag)
@@ -66,7 +66,7 @@ If nosnarf if 'lex, then only return the lex token."
 If TAG is nil.  use the tag under point.
 Searches the space between TAG and the preceding tag for a comment,
 and converts the comment into clean documentation.
-Optional argument NOSNARF with a value of 'lex means to return
+Optional argument NOSNARF with a value of `lex' means to return
 just the lexical token and not the string."
   (if (not tag) (setq tag (semantic-current-tag)))
   (save-excursion
@@ -92,7 +92,7 @@ just the lexical token and not the string."
   "Snarf up the comment at POINT for `semantic-documentation-for-tag'.
 Attempt to strip out comment syntactic sugar.
 Argument NOSNARF means don't modify the found text.
-If NOSNARF is 'lex, then return the lex token."
+If NOSNARF is `lex', then return the lex token."
   (let* ((semantic-ignore-comments nil)
         (semantic-lex-analyzer #'semantic-comment-lexer))
     (if (memq nosnarf '(lex flex)) ;; keep `flex' for compatibility
diff --git a/lisp/cedet/semantic/find.el b/lisp/cedet/semantic/find.el
index fdd5f52..5450ac9 100644
--- a/lisp/cedet/semantic/find.el
+++ b/lisp/cedet/semantic/find.el
@@ -378,11 +378,11 @@ See `semantic-tag-protected-p' for details on which tags 
are returned."
 
 ;;;###autoload
 (define-overloadable-function semantic-find-tags-included (&optional table)
-  "Find all tags in TABLE that are of the 'include class.
+  "Find all tags in TABLE that are of the `include' class.
 TABLE is a tag table.  See `semantic-something-to-tag-table'.")
 
 (defun semantic-find-tags-included-default (&optional table)
-  "Find all tags in TABLE that are of the 'include class.
+  "Find all tags in TABLE that are of the `include' class.
 TABLE is a tag table.  See `semantic-something-to-tag-table'.
 By default, just call `semantic-find-tags-by-class'."
   (semantic-find-tags-by-class 'include table))
diff --git a/lisp/cedet/semantic/fw.el b/lisp/cedet/semantic/fw.el
index d8ba6f2..fed50fb 100644
--- a/lisp/cedet/semantic/fw.el
+++ b/lisp/cedet/semantic/fw.el
@@ -171,7 +171,7 @@ That is remove the unsupported :help stuff."
 NAME specifies a special name that can be searched for later to
 recover the cached data with `semantic-get-cache-data'.
 LIFESPAN indicates how long the data cache will be remembered.
-The default LIFESPAN is 'end-of-command.
+The default LIFESPAN is `end-of-command'.
 Possible Lifespans are:
   `end-of-command' - Remove the cache at the end of the currently
                      executing command.
@@ -193,7 +193,7 @@ Possible Lifespans are:
     ))
 
 (defun semantic-cache-data-post-command-hook ()
-  "Flush `semantic-cache-data-overlays' based 'lifespan property.
+  "Flush `semantic-cache-data-overlays' based `lifespan' property.
 Remove self from `post-command-hook' if it is empty."
   (let ((newcache nil)
         (oldcache semantic-cache-data-overlays))
diff --git a/lisp/cedet/semantic/lex.el b/lisp/cedet/semantic/lex.el
index 7738e06..c8645c2 100644
--- a/lisp/cedet/semantic/lex.el
+++ b/lisp/cedet/semantic/lex.el
@@ -1815,13 +1815,13 @@ to keep comments as part of the token stream.")
 (make-variable-buffer-local 'semantic-ignore-comments)
 
 (defvar semantic-flex-enable-newlines nil
-  "When flexing, report 'newlines as syntactic elements.
+  "When flexing, report newlines as syntactic elements.
 Useful for languages where the newline is a special case terminator.
 Only set this on a per mode basis, not globally.")
 (make-variable-buffer-local 'semantic-flex-enable-newlines)
 
 (defvar semantic-flex-enable-whitespace nil
-  "When flexing, report 'whitespace as syntactic elements.
+  "When flexing, report whitespace as syntactic elements.
 Useful for languages where the syntax is whitespace dependent.
 Only set this on a per mode basis, not globally.")
 (make-variable-buffer-local 'semantic-flex-enable-whitespace)
diff --git a/lisp/cedet/semantic/sort.el b/lisp/cedet/semantic/sort.el
index 587d084..2282663 100644
--- a/lisp/cedet/semantic/sort.el
+++ b/lisp/cedet/semantic/sort.el
@@ -453,7 +453,7 @@ has some sort of label defining a parent.  The parent 
return will
 be a string.
 
 The default behavior, if not overridden with
-`tag-member-parent' gets the 'parent extra
+`tag-member-parent' gets the `parent' extra
 specifier of TAG.
 
 If this function is overridden, use
diff --git a/lisp/cedet/semantic/symref.el b/lisp/cedet/semantic/symref.el
index 89e8b40..0468403 100644
--- a/lisp/cedet/semantic/symref.el
+++ b/lisp/cedet/semantic/symref.el
@@ -101,7 +101,7 @@ If no tools are supported, then 'grep is assumed.")
 
 (defun semantic-symref-calculate-rootdir ()
   "Calculate the root directory for a symref search.
-Start with and EDE project, or use the default directory."
+Start with an EDE project, or use the default directory."
   (let* ((rootproj (when (and (featurep 'ede) ede-minor-mode)
                     (ede-toplevel)))
         (rootdirbase (if rootproj
@@ -162,7 +162,7 @@ ARGS are the initialization arguments to pass to the 
created class."
 ;;;###autoload
 (defun semantic-symref-find-references-by-name (name &optional scope 
tool-return)
   "Find a list of references to NAME in the current project.
-Optional SCOPE specifies which file set to search.  Defaults to 'project.
+Optional SCOPE specifies which file set to search.  Defaults to `project'.
 Refers to `semantic-symref-tool', to determine the reference tool to use
 for the current buffer.
 Returns an object of class `semantic-symref-result'.
@@ -186,7 +186,7 @@ to perform the search.  This was added for use by a test 
harness."
 ;;;###autoload
 (defun semantic-symref-find-tags-by-name (name &optional scope)
   "Find a list of tags by NAME in the current project.
-Optional SCOPE specifies which file set to search.  Defaults to 'project.
+Optional SCOPE specifies which file set to search.  Defaults to `project'.
 Refers to `semantic-symref-tool', to determine the reference tool to use
 for the current buffer.
 Returns an object of class `semantic-symref-result'."
@@ -206,7 +206,7 @@ Returns an object of class `semantic-symref-result'."
 ;;;###autoload
 (defun semantic-symref-find-tags-by-regexp (name &optional scope)
   "Find a list of references to NAME in the current project.
-Optional SCOPE specifies which file set to search.  Defaults to 'project.
+Optional SCOPE specifies which file set to search.  Defaults to `project'.
 Refers to `semantic-symref-tool', to determine the reference tool to use
 for the current buffer.
 Returns an object of class `semantic-symref-result'."
@@ -226,7 +226,7 @@ Returns an object of class `semantic-symref-result'."
 ;;;###autoload
 (defun semantic-symref-find-tags-by-completion (name &optional scope)
   "Find a list of references to NAME in the current project.
-Optional SCOPE specifies which file set to search.  Defaults to 'project.
+Optional SCOPE specifies which file set to search.  Defaults to `project'.
 Refers to `semantic-symref-tool', to determine the reference tool to use
 for the current buffer.
 Returns an object of class `semantic-symref-result'."
@@ -246,7 +246,7 @@ Returns an object of class `semantic-symref-result'."
 ;;;###autoload
 (defun semantic-symref-find-file-references-by-name (name &optional scope)
   "Find a list of references to NAME in the current project.
-Optional SCOPE specifies which file set to search.  Defaults to 'project.
+Optional SCOPE specifies which file set to search.  Defaults to `project'.
 Refers to `semantic-symref-tool', to determine the reference tool to use
 for the current buffer.
 Returns an object of class `semantic-symref-result'."
@@ -267,7 +267,7 @@ Returns an object of class `semantic-symref-result'."
 (defun semantic-symref-find-text (text &optional scope)
   "Find a list of occurrences of TEXT in the current project.
 TEXT is a regexp formatted for use with egrep.
-Optional SCOPE specifies which file set to search.  Defaults to 'project.
+Optional SCOPE specifies which file set to search.  Defaults to `project'.
 Refers to `semantic-symref-tool', to determine the reference tool to use
 for the current buffer.
 Returns an object of class `semantic-symref-result'."
diff --git a/lisp/cedet/semantic/tag.el b/lisp/cedet/semantic/tag.el
index 34fc8ba..f53f5d2 100644
--- a/lisp/cedet/semantic/tag.el
+++ b/lisp/cedet/semantic/tag.el
@@ -375,7 +375,7 @@ Optional argument IGNORABLE-ATTRIBUTES is passed down to
 
 (defun semantic-tag-of-type-p (tag type)
   "Compare TAG's type against TYPE.  Non nil if equivalent.
-TYPE can be a string, or a tag of class 'type.
+TYPE can be a string, or a tag of class `type'.
 This can be complex since some tags might have a :type that is a tag,
 while other tags might just have a string.  This function will also be
 return true of TAG's type is compared directly to the declaration of a
@@ -462,12 +462,12 @@ pairs eliminated:
   "Create a generic semantic tag.
 NAME is a string representing the name of this tag.
 CLASS is the symbol that represents the class of tag this is,
-such as 'variable, or 'function.
+such as `variable', or `function'.
 ATTRIBUTES is a list of additional attributes belonging to this tag."
   (list name class (semantic-tag-make-plist attributes) nil nil))
 
 (defsubst semantic-tag-new-variable (name type &optional default-value &rest 
attributes)
-  "Create a semantic tag of class 'variable.
+  "Create a semantic tag of class `variable'.
 NAME is the name of this variable.
 TYPE is a string or semantic tag representing the type of this variable.
 Optional DEFAULT-VALUE is a string representing the default value of this
@@ -479,7 +479,7 @@ tag."
          attributes))
 
 (defsubst semantic-tag-new-function (name type arg-list &rest attributes)
-  "Create a semantic tag of class 'function.
+  "Create a semantic tag of class `function'.
 NAME is the name of this function.
 TYPE is a string or semantic tag representing the type of this function.
 ARG-LIST is a list of strings or semantic tags representing the
@@ -491,7 +491,7 @@ ATTRIBUTES is a list of additional attributes belonging to 
this tag."
          attributes))
 
 (defsubst semantic-tag-new-type (name type members parents &rest attributes)
-  "Create a semantic tag of class 'type.
+  "Create a semantic tag of class `type'.
 NAME is the name of this type.
 TYPE is a string or semantic tag representing the type of this type.
 MEMBERS is a list of strings or semantic tags representing the
@@ -516,7 +516,7 @@ ATTRIBUTES is a list of additional attributes belonging to 
this tag."
          attributes))
 
 (defsubst semantic-tag-new-include (name system-flag &rest attributes)
-  "Create a semantic tag of class 'include.
+  "Create a semantic tag of class `include'.
 NAME is the name of this include.
 SYSTEM-FLAG represents that we were able to identify this include as belonging
 to the system, as opposed to belonging to the local project.
@@ -526,7 +526,7 @@ ATTRIBUTES is a list of additional attributes belonging to 
this tag."
          attributes))
 
 (defsubst semantic-tag-new-package (name detail &rest attributes)
-  "Create a semantic tag of class 'package.
+  "Create a semantic tag of class `package'.
 NAME is the name of this package.
 DETAIL is extra information about this package, such as a location where
 it can be found.
@@ -536,7 +536,7 @@ ATTRIBUTES is a list of additional attributes belonging to 
this tag."
          attributes))
 
 (defsubst semantic-tag-new-code (name detail &rest attributes)
-  "Create a semantic tag of class 'code.
+  "Create a semantic tag of class `code'.
 NAME is a name for this code.
 DETAIL is extra information about the code.
 ATTRIBUTES is a list of additional attributes belonging to this tag."
@@ -823,7 +823,7 @@ in SUPERS."
 (defun semantic-tag-type-superclass-protection (tag parentstring)
   "Return the inheritance protection in TAG from PARENTSTRING.
 PARENTSTRING is the name of the parent being inherited.
-The return protection is a symbol, 'public, 'protection, and 'private."
+The return protection is a symbol, `public', `protection', and `private'."
   (let ((supers (semantic-tag-get-attribute tag :superclasses)))
     (cond ((stringp supers)
           'public)
@@ -946,7 +946,7 @@ ATTRIBUTES is a list of additional attributes belonging to 
this tag."
 The returned value is a tag of the class that
 `semantic-tag-alias-class' returns for TAG.
 The default is to return the value of the :definition attribute.
-Return nil if TAG is not of class 'alias."
+Return nil if TAG is not of class `alias'."
   (when (semantic-tag-of-class-p tag 'alias)
     (:override
      (semantic-tag-get-attribute tag :definition))))
@@ -958,8 +958,8 @@ Return nil if TAG is not of class 'alias."
   "Return a list of components for TAG.
 A Component is a part of TAG which itself may be a TAG.
 Examples include the elements of a structure in a
-tag of class 'type, or the list of arguments to a
-tag of class 'function."
+tag of class `type', or the list of arguments to a
+tag of class `function'."
   )
 
 (defun semantic-tag-components-default (tag)
diff --git a/lisp/character-fold.el b/lisp/character-fold.el
index 0e156c5..1e49fe2 100644
--- a/lisp/character-fold.el
+++ b/lisp/character-fold.el
@@ -22,65 +22,79 @@
 
 ;;; Code:
 
+(eval-and-compile (put 'character-fold-table 'char-table-extra-slots 1))
 
 (defconst character-fold-table
   (eval-when-compile
-    (let* ((equiv (make-char-table 'character-fold-table))
-           (table (unicode-property-table-internal 'decomposition))
-           (func (char-table-extra-slot table 1)))
+    (let ((equiv (make-char-table 'character-fold-table))
+          (equiv-multi (make-char-table 'character-fold-table))
+          (table (unicode-property-table-internal 'decomposition)))
+      (set-char-table-extra-slot equiv 0 equiv-multi)
+
       ;; Ensure the table is populated.
-      (map-char-table
-       (lambda (i v) (when (consp i) (funcall func (car i) v table)))
-       table)
+      (let ((func (char-table-extra-slot table 1)))
+        (map-char-table (lambda (char v)
+                          (when (consp char)
+                            (funcall func (car char) v table)))
+                        table))
 
       ;; Compile a list of all complex characters that each simple
       ;; character should match.
+      ;; In summary this loop does 3 things:
+      ;; - A complex character might be allowed to match its decomp.
+      ;; - The decomp is allowed to match the complex character.
+      ;; - A single char of the decomp might be allowed to match the
+      ;;   character.
+      ;; Some examples in the comments below.
       (map-char-table
-       (lambda (i dec)
-         (when (consp dec)
-           ;; Discard a possible formatting tag.
-           (when (symbolp (car dec))
-             (setq dec (cdr dec)))
+       (lambda (char decomp)
+         (when (consp decomp)
            ;; Skip trivial cases like ?a decomposing to (?a).
-           (unless (or (and (eq i (car dec))
-                            (not  (cdr dec))))
-             (let ((d dec)
-                   (fold-decomp t)
-                   k found)
-               (while (and d (not found))
-                 (setq k (pop d))
-                 ;; Is k a number or letter, per unicode standard?
-                 (setq found (memq (get-char-code-property k 'general-category)
-                                   '(Lu Ll Lt Lm Lo Nd Nl No))))
-               (if found
-                   ;; Check if the decomposition has more than one letter,
-                   ;; because then we don't want the first letter to match
-                   ;; the decomposition.
-                   (dolist (k d)
-                     (when (and fold-decomp
-                                (memq (get-char-code-property k 
'general-category)
-                                      '(Lu Ll Lt Lm Lo Nd Nl No)))
-                       (setq fold-decomp nil)))
-                 ;; If there's no number or letter on the
-                 ;; decomposition, take the first character in it.
-                 (setq found (car-safe dec)))
-               ;; Finally, we only fold multi-char decomposition if at
-               ;; least one of the chars is non-spacing (combining).
-               (when fold-decomp
-                 (setq fold-decomp nil)
-                 (dolist (k dec)
-                   (when (and (not fold-decomp)
-                              (> (get-char-code-property k 
'canonical-combining-class) 0))
-                     (setq fold-decomp t))))
-               ;; Add i to the list of characters that k can
-               ;; represent. Also possibly add its decomposition, so we can
-               ;; match multi-char representations like (format "a%c" 769)
-               (when (and found (not (eq i k)))
-                 (let ((chars (cons (char-to-string i) (aref equiv k))))
-                   (aset equiv k
-                         (if fold-decomp
-                             (cons (apply #'string dec) chars)
-                           chars))))))))
+           (unless (and (not (cdr decomp))
+                        (eq char (car decomp)))
+             (if (symbolp (car decomp))
+                 ;; Discard a possible formatting tag.
+                 (setq decomp (cdr decomp))
+               ;; If there's no formatting tag, ensure that char matches
+               ;; its decomp exactly.  This is because we want 'ä' to
+               ;; match 'ä', but we don't want '¹' to match '1'.
+               (aset equiv char
+                     (cons (apply #'string decomp)
+                           (aref equiv char))))
+
+             ;; Allow the entire decomp to match char.  If decomp has
+             ;; multiple characters, this is done by adding an entry
+             ;; to the alist of the first character in decomp.  This
+             ;; allows 'ff' to match 'ff', 'ä' to match 'ä', and '1' to
+             ;; match '¹'.
+             (let ((make-decomp-match-char
+                    (lambda (decomp char)
+                      (if (cdr decomp)
+                          (aset equiv-multi (car decomp)
+                                (cons (cons (apply #'string (cdr decomp))
+                                            (regexp-quote (string char)))
+                                      (aref equiv-multi (car decomp))))
+                        (aset equiv (car decomp)
+                              (cons (char-to-string char)
+                                    (aref equiv (car decomp))))))))
+               (funcall make-decomp-match-char decomp char)
+               ;; Do it again, without the non-spacing characters.
+               ;; This allows 'a' to match 'ä'.
+               (let ((simpler-decomp nil)
+                     (found-one nil))
+                 (dolist (c decomp)
+                   (if (> (get-char-code-property c 
'canonical-combining-class) 0)
+                       (setq found-one t)
+                     (push c simpler-decomp)))
+                 (when (and simpler-decomp found-one)
+                   (funcall make-decomp-match-char simpler-decomp char)
+                   ;; Finally, if the decomp only had one spacing
+                   ;; character, we allow this character to match the
+                   ;; decomp.  This is to let 'a' match 'ä'.
+                   (unless (cdr simpler-decomp)
+                     (aset equiv (car simpler-decomp)
+                           (cons (apply #'string decomp)
+                                 (aref equiv (car simpler-decomp)))))))))))
        table)
 
       ;; Add some manual entries.
@@ -93,13 +107,34 @@
 
       ;; Convert the lists of characters we compiled into regexps.
       (map-char-table
-       (lambda (i v) (let ((re (regexp-opt (cons (char-to-string i) v))))
-                  (if (consp i)
-                      (set-char-table-range equiv i re)
-                    (aset equiv i re))))
+       (lambda (char dec-list)
+         (let ((re (regexp-opt (cons (char-to-string char) dec-list))))
+           (if (consp char)
+               (set-char-table-range equiv char re)
+             (aset equiv char re))))
        equiv)
       equiv))
-  "Used for folding characters of the same group during search.")
+  "Used for folding characters of the same group during search.
+This is a char-table with the `character-fold-table' subtype.
+
+Let us refer to the character in question by char-x.
+Each entry is either nil (meaning char-x only matches literally)
+or a regexp.  This regexp should match anything that char-x can
+match by itself \(including char-x).  For instance, the default
+regexp for the ?+ character is \"[+⁺₊﬩﹢+]\".
+
+This table also has one extra slot which is also a char-table.
+Each entry in the extra slot is an alist used for multi-character
+matching (which may be nil).  The elements of the alist should
+have the form (SUFFIX . OTHER-REGEXP).  If the characters after
+char-x are equal to SUFFIX, then this combination of char-x +
+SUFFIX is allowed to match OTHER-REGEXP.  This is in addition to
+char-x being allowed to match REGEXP.
+For instance, the default alist for ?f includes:
+    \((\"fl\" . \"ffl\") (\"fi\" . \"ffi\")
+     (\"i\" . \"fi\") (\"f\" . \"ff\"))
+
+Exceptionally for the space character (32), ALIST is ignored.")
 
 (defun character-fold--make-space-string (n)
   "Return a string that matches N spaces."
@@ -109,35 +144,80 @@
                  (make-list n (or (aref character-fold-table ?\s) " ")))))
 
 ;;;###autoload
-(defun character-fold-to-regexp (string &optional _lax)
+(defun character-fold-to-regexp (string &optional _lax from)
   "Return a regexp matching anything that character-folds into STRING.
 Any character in STRING that has an entry in
 `character-fold-table' is replaced with that entry (which is a
-regexp) and other characters are `regexp-quote'd."
+regexp) and other characters are `regexp-quote'd.
+
+If the resulting regexp would be too long for Emacs to handle,
+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."
   (let* ((spaces 0)
-         (chars (mapcar #'identity string))
-         (out chars))
-    ;; When the user types a space, we want to match the table entry,
-    ;; but we also want the ?\s to be visible to `search-spaces-regexp'.
-    ;; See commit message for a longer description.
-    (while chars
-      (let ((c (car chars)))
-        (setcar chars
-                (cond
-                 ((eq c ?\s)
-                  (setq spaces (1+ spaces))
-                  nil)
-                 ((> spaces 0)
-                  (prog1 (concat (character-fold--make-space-string spaces)
-                                 (or (aref character-fold-table c)
-                                     (regexp-quote (string c))))
-                    (setq spaces 0)))
-                 (t (or (aref character-fold-table c)
-                        (regexp-quote (string c))))))
-        (setq chars (cdr chars))))
-    (concat (apply #'concat out)
-            (when (> spaces 0)
-              (character-fold--make-space-string spaces)))))
+         (multi-char-table (char-table-extra-slot character-fold-table 0))
+         (i (or from 0))
+         (end (length string))
+         (out nil))
+    ;; When the user types a space, we want to match the table entry
+    ;; for ?\s, which is generally a regexp like "[ ...]".  However,
+    ;; the `search-spaces-regexp' variable doesn't "see" spaces inside
+    ;; these regexp constructs, so we need to use "\\( \\|[ ...]\\)"
+    ;; instead (to manually expose a space).  Furthermore, the lax
+    ;; search engine acts on a bunch of spaces, not on individual
+    ;; spaces, so if the string contains sequential spaces like "  ", we
+    ;; need to keep them grouped together like this: "\\(  \\|[ ...][ ...]\\)".
+    (while (< i end)
+      (pcase (aref string i)
+        (`?\s (setq spaces (1+ spaces)))
+        (c (when (> spaces 0)
+             (push (character-fold--make-space-string spaces) out)
+             (setq spaces 0))
+           (let ((regexp (or (aref character-fold-table c)
+                             (regexp-quote (string c))))
+                 ;; Long string.  The regexp would probably be too long.
+                 (alist (unless (> end 50)
+                          (aref multi-char-table c))))
+             (push (let ((matched-entries nil)
+                         (max-length 0))
+                     (dolist (entry alist)
+                       (let* ((suffix (car entry))
+                              (len-suf (length suffix)))
+                         (when (eq (compare-strings suffix 0 nil
+                                                    string (1+ i) (+ i 1 
len-suf)
+                                                    nil)
+                                   t)
+                           (push (cons len-suf (cdr entry)) matched-entries)
+                           (setq max-length (max max-length len-suf)))))
+                     ;; If no suffixes matched, just go on.
+                     (if (not matched-entries)
+                         regexp
+;;; If N suffixes match, we "branch" out into N+1 executions for the
+;;; length of the longest match.  This means "fix" will match "fix" but
+;;; not "fⅸ", but it's necessary to keep the regexp size from scaling
+;;; exponentially.  See 
https://lists.gnu.org/archive/html/emacs-devel/2015-11/msg02562.html
+                       (let ((subs (substring string (1+ i) (+ i 1 
max-length))))
+                         ;; `i' is still going to inc by 1 below.
+                         (setq i (+ i max-length))
+                         (concat
+                          "\\(?:"
+                          (mapconcat (lambda (entry)
+                                       (let ((length (car entry))
+                                             (suffix-regexp (cdr entry)))
+                                         (concat suffix-regexp
+                                                 (character-fold-to-regexp 
subs nil length))))
+                                     `((0 . ,regexp) . ,matched-entries) "\\|")
+                          "\\)"))))
+                   out))))
+      (setq i (1+ i)))
+    (when (> spaces 0)
+      (push (character-fold--make-space-string spaces) out))
+    (let ((regexp (apply #'concat (nreverse out))))
+      ;; Limited by `MAX_BUF_SIZE' in `regex.c'.
+      (if (> (length regexp) 5000)
+          (regexp-quote string)
+        regexp))))
 
 
 ;;; Commands provided for completeness.
diff --git a/lisp/desktop.el b/lisp/desktop.el
index e95a8c9..5a709b9 100644
--- a/lisp/desktop.el
+++ b/lisp/desktop.el
@@ -519,8 +519,8 @@ code like
 
    (defun foo-restore-desktop-buffer
    ...
-   (add-to-list 'desktop-buffer-mode-handlers
-                '(foo-mode . foo-restore-desktop-buffer))
+   (add-to-list \\='desktop-buffer-mode-handlers
+                \\='(foo-mode . foo-restore-desktop-buffer))
 
 The major mode function must either be autoloaded, or of the form
 \"foobar-mode\" and defined in library \"foobar\", so that desktop
@@ -586,8 +586,8 @@ code like
 
    (defun foo-desktop-restore
    ...
-   (add-to-list 'desktop-minor-mode-handlers
-                '(foo-mode . foo-desktop-restore))
+   (add-to-list \\='desktop-minor-mode-handlers
+                \\='(foo-mode . foo-desktop-restore))
 
 The minor mode function must either be autoloaded, or of the form
 \"foobar-mode\" and defined in library \"foobar\", so that desktop
diff --git a/lisp/dframe.el b/lisp/dframe.el
index d8ddbc8..b5df1bc 100644
--- a/lisp/dframe.el
+++ b/lisp/dframe.el
@@ -420,7 +420,7 @@ CREATE-HOOK is a hook to run after creating a frame."
 
 (defun dframe-reposition-frame (new-frame parent-frame location)
   "Move NEW-FRAME to be relative to PARENT-FRAME.
-LOCATION can be one of 'random, 'left, 'right, 'left-right, or 'top-bottom."
+LOCATION can be one of `random', `left', `right', `left-right', or 
`top-bottom'."
   (if (featurep 'xemacs)
       (dframe-reposition-frame-xemacs new-frame parent-frame location)
     (dframe-reposition-frame-emacs new-frame parent-frame location)))
@@ -431,7 +431,7 @@ LOCATION can be one of 'random, 'left, 'right, 'left-right, 
or 'top-bottom."
 
 (defun dframe-reposition-frame-emacs (new-frame parent-frame location)
   "Move NEW-FRAME to be relative to PARENT-FRAME.
-LOCATION can be one of 'random, 'left-right, 'top-bottom, or
+LOCATION can be one of `random', `left-right', `top-bottom', or
 a cons cell indicating a position of the form (LEFT . TOP)."
   ;; Position dframe.
   ;; Do no positioning if not on a windowing system,
@@ -514,7 +514,7 @@ a cons cell indicating a position of the form (LEFT . TOP)."
 
 (defun dframe-reposition-frame-xemacs (_new-frame _parent-frame _location)
   "Move NEW-FRAME to be relative to PARENT-FRAME.
-LOCATION can be one of 'random, 'left-right, or 'top-bottom."
+LOCATION can be one of `random', `left-right', or `top-bottom'."
   ;; Not yet implemented
   )
 
diff --git a/lisp/emacs-lisp/advice.el b/lisp/emacs-lisp/advice.el
index 4ee8300..d13bc2f 100644
--- a/lisp/emacs-lisp/advice.el
+++ b/lisp/emacs-lisp/advice.el
@@ -1629,7 +1629,7 @@ COMPILE argument of `ad-activate' was supplied as nil."
 Only proper subtrees are considered, for example, if TREE is (1 (2 (3)) 4)
 then the subtrees will be 1 (2 (3)) 2 (3) 3 4, dotted structures are
 allowed too.  Once a qualifying subtree has been found its subtrees will
-not be considered anymore.  (ad-substitute-tree 'atom 'identity tree)
+not be considered anymore.  (ad-substitute-tree \\='atom \\='identity tree)
 generates a copy of TREE."
   (cond ((consp tReE)
          (cons (if (funcall sUbTrEe-TeSt (car tReE))
@@ -2419,7 +2419,7 @@ as if they had been supplied to a function with 
TARGET-ARGLIST directly.
 Excess source arguments will be neglected, missing source arguments will be
 supplied as nil.  Returns a `funcall' or `apply' form with the second element
 being `function' which has to be replaced by an actual function argument.
-Example: (ad-map-arglists '(a &rest args) '(w x y z)) will return
+Example: (ad-map-arglists \\='(a &rest args) \\='(w x y z)) will return
          (funcall ad--addoit-function a (car args) (car (cdr args)) (nth 2 
args))."
   (let* ((parsed-source-arglist (ad-parse-arglist source-arglist))
         (source-reqopt-args (append (nth 0 parsed-source-arglist)
diff --git a/lisp/emacs-lisp/avl-tree.el b/lisp/emacs-lisp/avl-tree.el
index 99a329b..9dcebb2 100644
--- a/lisp/emacs-lisp/avl-tree.el
+++ b/lisp/emacs-lisp/avl-tree.el
@@ -561,7 +561,7 @@ Note that if you don't care about the order in which 
FUNCTION is
 applied, just that the resulting list is in the correct order,
 then
 
-  (avl-tree-mapf function 'cons tree (not reverse))
+  (avl-tree-mapf function \\='cons tree (not reverse))
 
 is more efficient."
   (nreverse (avl-tree-mapf fun 'cons tree reverse)))
diff --git a/lisp/emacs-lisp/backquote.el b/lisp/emacs-lisp/backquote.el
index dc61e15..12bd8da 100644
--- a/lisp/emacs-lisp/backquote.el
+++ b/lisp/emacs-lisp/backquote.el
@@ -43,7 +43,7 @@
 (defun backquote-list*-function (first &rest list)
   "Like `list' but the last argument is the tail of the new list.
 
-For example (backquote-list* 'a 'b 'c) => (a b . c)"
+For example (backquote-list* \\='a \\='b \\='c) => (a b . c)"
   ;; The recursive solution is much nicer:
   ;; (if list (cons first (apply 'backquote-list*-function list)) first))
   ;; but Emacs is not very good at efficiently processing recursion.
@@ -60,7 +60,7 @@ For example (backquote-list* 'a 'b 'c) => (a b . c)"
 (defmacro backquote-list*-macro (first &rest list)
   "Like `list' but the last argument is the tail of the new list.
 
-For example (backquote-list* 'a 'b 'c) => (a b . c)"
+For example (backquote-list* \\='a \\='b \\='c) => (a b . c)"
   ;; The recursive solution is much nicer:
   ;; (if list (list 'cons first (cons 'backquote-list*-macro list)) first))
   ;; but Emacs is not very good at efficiently processing such things.
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index db200f3..b5b618e 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -265,8 +265,8 @@ This option is enabled by default because it reduces Emacs 
memory usage."
 
 (defcustom byte-optimize-log nil
   "If non-nil, the byte-compiler will log its optimizations.
-If this is 'source, then only source-level optimizations will be logged.
-If it is 'byte, then only byte-level optimizations will be logged.
+If this is `source', then only source-level optimizations will be logged.
+If it is `byte', then only byte-level optimizations will be logged.
 The information is logged to `byte-compile-log-buffer'."
   :group 'bytecomp
   :type '(choice (const :tag "none" nil)
@@ -456,10 +456,20 @@ Return the compile-time value of FORM."
                               (byte-compile-recurse-toplevel
                                (macroexp-progn body)
                                (lambda (form)
-                                 (setf result
-                                       (byte-compile-eval
-                                        (byte-compile-top-level
-                                         (byte-compile-preprocess form))))))
+                                 ;; Insulate the following variables
+                                 ;; against changes made in the
+                                 ;; subsidiary compilation.  This
+                                 ;; prevents spurious warning
+                                 ;; messages: "not defined at runtime"
+                                 ;; etc.
+                                 (let ((byte-compile-unresolved-functions
+                                        byte-compile-unresolved-functions)
+                                       (byte-compile-new-defuns
+                                        byte-compile-new-defuns))
+                                   (setf result
+                                         (byte-compile-eval
+                                          (byte-compile-top-level
+                                           (byte-compile-preprocess form)))))))
                               (list 'quote result))))
     (eval-and-compile . ,(lambda (&rest body)
                            (byte-compile-recurse-toplevel
@@ -503,6 +513,11 @@ defined with incorrect args.")
 Used for warnings about calling a function that is defined during compilation
 but won't necessarily be defined when the compiled file is loaded.")
 
+(defvar byte-compile-new-defuns nil
+  "List of (runtime) functions defined in this compilation run.
+This variable is used to qualify `byte-compile-noruntime-functions' when
+outputting warnings about functions not being defined at runtime.")
+
 ;; Variables for lexical binding
 (defvar byte-compile--lexical-environment nil
   "The current lexical environment.")
@@ -1503,8 +1518,9 @@ extra args."
       ;; Separate the functions that will not be available at runtime
       ;; from the truly unresolved ones.
       (dolist (f byte-compile-unresolved-functions)
-       (setq f (car f))
-       (if (fboundp f) (push f noruntime) (push f unresolved)))
+        (setq f (car f))
+        (when (not (memq f byte-compile-new-defuns))
+          (if (fboundp f) (push f noruntime) (push f unresolved))))
       ;; Complain about the no-run-time functions
       (byte-compile-print-syms
        "the function `%s' might not be defined at runtime."
@@ -1691,7 +1707,7 @@ Any other non-nil value of ARG means to ask the user.
 If optional argument LOAD is non-nil, loads the file after compiling.
 
 If compilation is needed, this functions returns the result of
-`byte-compile-file'; otherwise it returns 'no-byte-compile."
+`byte-compile-file'; otherwise it returns `no-byte-compile'."
   (interactive
    (let ((file buffer-file-name)
         (file-name nil)
@@ -1961,6 +1977,8 @@ With argument ARG, insert value in current buffer after 
the form."
        ;; compiled.  A: Yes!  b-c-u-f might contain dross from a
        ;; previous byte-compile.
        (setq byte-compile-unresolved-functions nil)
+        (setq byte-compile-noruntime-functions nil)
+        (setq byte-compile-new-defuns nil)
 
        ;; Compile the forms from the input buffer.
        (while (progn
@@ -2287,8 +2305,7 @@ list that represents a doc string reference.
      ;; byte-compile-warn-about-unresolved-functions.
      (if (memq funsym byte-compile-noruntime-functions)
          (setq byte-compile-noruntime-functions
-               (delq funsym byte-compile-noruntime-functions)
-               byte-compile-noruntime-functions)
+               (delq funsym byte-compile-noruntime-functions))
        (setq byte-compile-unresolved-functions
              (delq (assq funsym byte-compile-unresolved-functions)
                    byte-compile-unresolved-functions)))))
@@ -2346,8 +2363,21 @@ list that represents a doc string reference.
 (defun byte-compile-file-form-require (form)
   (let ((args (mapcar 'eval (cdr form)))
        (hist-orig load-history)
-       hist-new)
+       hist-new prov-cons)
     (apply 'require args)
+
+    ;; Record the functions defined by the require in 
`byte-compile-new-defuns'.
+    (setq hist-new load-history)
+    (setq prov-cons (cons 'provide (car args)))
+    (while (and hist-new
+                (not (member prov-cons (car hist-new))))
+      (setq hist-new (cdr hist-new)))
+    (when hist-new
+      (dolist (x (car hist-new))
+        (when (and (consp x)
+                   (memq (car x) '(defun t)))
+          (push (cdr x) byte-compile-new-defuns))))
+
     (when (byte-compile-warning-enabled-p 'cl-functions)
       ;; Detect (require 'cl) in a way that works even if cl is already loaded.
       (if (member (car args) '("cl" cl))
@@ -2403,6 +2433,7 @@ not to take responsibility for the actual compilation of 
the code."
          (byte-compile-current-form name)) ; For warnings.
 
     (byte-compile-set-symbol-position name)
+    (push name byte-compile-new-defuns)
     ;; When a function or macro is defined, add it to the call tree so that
     ;; we can tell when functions are not used.
     (if byte-compile-generate-call-tree
@@ -3710,16 +3741,25 @@ discarding."
 (byte-defop-compiler-1 quote)
 
 (defun byte-compile-setq (form)
-  (let ((args (cdr form)))
-    (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))
+  (let* ((args (cdr form))
+         (len (length args)))
+    (if (= (logand len 1) 1)
+        (progn
+          (byte-compile-log-warning
+           (format "missing value for `%S' at end of setq" (car (last args)))
+           nil :error)
+          (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)))
     (setq byte-compile--for-effect nil)))
 
 (defun byte-compile-setq-default (form)
@@ -3973,8 +4013,13 @@ that suppresses all warnings during execution of BODY."
     (setq byte-compile--for-effect nil)))
 
 (defun byte-compile-funcall (form)
-  (mapc 'byte-compile-form (cdr form))
-  (byte-compile-out 'byte-call (length (cdr (cdr form)))))
+  (if (cdr form)
+      (progn
+        (mapc 'byte-compile-form (cdr form))
+        (byte-compile-out 'byte-call (length (cdr (cdr form)))))
+    (byte-compile-log-warning "`funcall' called with no arguments" nil :error)
+    (byte-compile-form '(signal 'wrong-number-of-arguments '(funcall 0))
+                       byte-compile--for-effect)))
 
 
 ;; let binding
diff --git a/lisp/emacs-lisp/cconv.el b/lisp/emacs-lisp/cconv.el
index efa9a3d..355913a 100644
--- a/lisp/emacs-lisp/cconv.el
+++ b/lisp/emacs-lisp/cconv.el
@@ -473,25 +473,28 @@ places where they originally did not directly appear."
         :fun-body ,(cconv--convert-function () body env form)))
 
     (`(setq . ,forms)                   ; setq special 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) `(setq ,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))))
+     (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) `(setq ,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)))))
 
     (`(,(and (or `funcall `apply) callsym) ,fun . ,args)
      ;; These are not special forms but we treat them separately for the needs
diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
index 0660125..c0a4203 100644
--- a/lisp/emacs-lisp/chart.el
+++ b/lisp/emacs-lisp/chart.el
@@ -479,7 +479,7 @@ See `chart-sort-matchlist' for more details."
 
 (defun chart-sort-matchlist (namelst numlst pred)
   "Sort NAMELST and NUMLST (both sequence objects) based on predicate PRED.
-PRED should be the equivalent of '<, except it must expect two
+PRED should be the equivalent of `<', except it must expect two
 cons cells of the form (NAME . NUM).  See `sort' for more details."
   ;; 1 - create 1 list of cons cells
   (let ((newlist nil)
@@ -571,7 +571,7 @@ R1 and R2 are dotted pairs.  Colorize it with FACE."
 (defun chart-bar-quickie (dir title namelst nametitle numlst numtitle
                              &optional max sort-pred)
   "Wash over the complex EIEIO stuff and create a nice bar chart.
-Create it going in direction DIR ['horizontal 'vertical] with TITLE
+Create it going in direction DIR [`horizontal' `vertical'] with TITLE
 using a name sequence NAMELST labeled NAMETITLE with values NUMLST
 labeled NUMTITLE.
 Optional arguments:
diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el
index bf1a21a..88d5f32 100644
--- a/lisp/emacs-lisp/checkdoc.el
+++ b/lisp/emacs-lisp/checkdoc.el
@@ -270,6 +270,7 @@ made in the style guide relating to order."
 (defcustom checkdoc-package-keywords-flag nil
   "Non-nil means warn if this file's package keywords are not recognized.
 Currently, all recognized keywords must be on `finder-known-keywords'."
+  :version "25.1"
   :type 'boolean)
 
 (define-obsolete-variable-alias 'checkdoc-style-hooks
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index 9e6102c..78f580c 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -797,10 +797,10 @@ methods.")
 
 ;;; Define some pre-defined generic functions, used internally.
 
-(define-error 'cl-no-method "No method for %S")
-(define-error 'cl-no-next-method "No next method for %S" 'cl-no-method)
-(define-error 'cl-no-primary-method "No primary method for %S" 'cl-no-method)
-(define-error 'cl-no-applicable-method "No applicable method for %S"
+(define-error 'cl-no-method "No method")
+(define-error 'cl-no-next-method "No next method" 'cl-no-method)
+(define-error 'cl-no-primary-method "No primary method" 'cl-no-method)
+(define-error 'cl-no-applicable-method "No applicable method"
   'cl-no-method)
 
 (cl-defgeneric cl-no-next-method (generic method &rest args)
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index 80f0cd7..c8aad3a 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -298,9 +298,10 @@ FORM is of the form (ARGS . BODY)."
                                (if (stringp (car header)) (pop header))
                                ;; Be careful with make-symbol and (back)quote,
                                ;; see bug#12884.
-                               (let ((print-gensym nil) (print-quoted t))
-                                 (format "%S" (cons 'fn (cl--make-usage-args
-                                                         orig-args)))))
+                               (help--docstring-quote
+                                (let ((print-gensym nil) (print-quoted t))
+                                  (format "%S" (cons 'fn (cl--make-usage-args
+                                                          orig-args))))))
                               header)))
                 ;; FIXME: we'd want to choose an arg name for the &rest param
                 ;; and pass that as `expr' to cl--do-arglist, but that ends up
@@ -2829,8 +2830,8 @@ is a shorthand for (NAME NAME)."
 
 (defun cl-struct-sequence-type (struct-type)
   "Return the sequence used to build STRUCT-TYPE.
-STRUCT-TYPE is a symbol naming a struct type.  Return 'vector or
-'list, or nil if STRUCT-TYPE is not a struct type. "
+STRUCT-TYPE is a symbol naming a struct type.  Return `vector' or
+`list', or nil if STRUCT-TYPE is not a struct type. "
   (declare (side-effect-free t) (pure t))
   (cl--struct-class-type (cl--struct-get-class struct-type)))
 
@@ -2884,7 +2885,7 @@ Of course, we really can't know that for sure, so it's 
just a heuristic."
 (put 'real 'cl-deftype-satisfies #'numberp)
 (put 'fixnum 'cl-deftype-satisfies #'integerp)
 (put 'base-char 'cl-deftype-satisfies #'characterp)
-(put 'character 'cl-deftype-satisfies #'integerp)
+(put 'character 'cl-deftype-satisfies #'natnump)
 
 
 ;;;###autoload
diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el
index 03480b2..4fc271b 100644
--- a/lisp/emacs-lisp/cl-preloaded.el
+++ b/lisp/emacs-lisp/cl-preloaded.el
@@ -3,6 +3,7 @@
 ;; Copyright (C) 2015  Free Software Foundation, Inc
 
 ;; Author: Stefan Monnier <address@hidden>
+;; Package: emacs
 
 ;; This file is part of GNU Emacs.
 
diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el
index 56f9511..321895d 100644
--- a/lisp/emacs-lisp/easy-mmode.el
+++ b/lisp/emacs-lisp/easy-mmode.el
@@ -148,7 +148,7 @@ BODY contains code to execute each time the mode is enabled 
or disabled.
 
 For example, you could write
   (define-minor-mode foo-mode \"If enabled, foo on you!\"
-    :lighter \" Foo\" :require 'foo :global t :group 'hassle :version \"27.5\"
+    :lighter \" Foo\" :require \\='foo :global t :group \\='hassle :version 
\"27.5\"
     ...BODY CODE...)"
   (declare (doc-string 2)
            (debug (&define name string-or-null-p
@@ -502,7 +502,7 @@ Valid keywords and arguments are:
   :inherit   Parent keymap.
   :group     Ignored.
   :suppress  Non-nil to call `suppress-keymap' on keymap,
-             'nodigits to suppress digits as prefix arguments."
+             `nodigits' to suppress digits as prefix arguments."
   (let (inherit dense suppress)
     (while args
       (let ((key (pop args))
diff --git a/lisp/emacs-lisp/eieio-compat.el b/lisp/emacs-lisp/eieio-compat.el
index e48e2d2..9f1b895 100644
--- a/lisp/emacs-lisp/eieio-compat.el
+++ b/lisp/emacs-lisp/eieio-compat.el
@@ -4,6 +4,7 @@
 
 ;; Author: Eric M. Ludlam <address@hidden>
 ;; Keywords: OO, lisp
+;; Package: eieio
 
 ;; This file is part of GNU Emacs.
 
diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el
index 21c1f1b..02ae41b 100644
--- a/lisp/emacs-lisp/ert.el
+++ b/lisp/emacs-lisp/ert.el
@@ -187,7 +187,7 @@ using :expected-result.  See `ert-test-result-type-p' for a
 description of valid values for RESULT-TYPE.
 
 \(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] \
-[:tags '(TAG...)] BODY...)"
+[:tags \\='(TAG...)] BODY...)"
   (declare (debug (&define :name test
                            name sexp [&optional stringp]
                           [&rest keywordp sexp] def-body))
@@ -374,9 +374,9 @@ Returns nil."
 Determines whether CONDITION matches TYPE and EXCLUDE-SUBTYPES,
 and aborts the current test as failed if it doesn't."
   (let ((signaled-conditions (get (car condition) 'error-conditions))
-        (handled-conditions (cl-etypecase type
-                              (list type)
-                              (symbol (list type)))))
+        (handled-conditions (pcase-exhaustive type
+                              ((pred listp) type)
+                              ((pred symbolp) (list type)))))
     (cl-assert signaled-conditions)
     (unless (cl-intersection signaled-conditions handled-conditions)
       (ert-fail (append
@@ -466,18 +466,18 @@ Errors during evaluation are caught and handled like nil."
 
 (defun ert--explain-format-atom (x)
   "Format the atom X for `ert--explain-equal'."
-  (cl-typecase x
-    (character (list x (format "#x%x" x) (format "?%c" x)))
-    (fixnum (list x (format "#x%x" x)))
-    (t x)))
+  (pcase x
+    ((pred characterp) (list x (format "#x%x" x) (format "?%c" x)))
+    ((pred integerp) (list x (format "#x%x" x)))
+    (_ x)))
 
 (defun ert--explain-equal-rec (a b)
   "Return a programmer-readable explanation of why A and B are not `equal'.
 Returns nil if they are."
   (if (not (equal (type-of a) (type-of b)))
       `(different-types ,a ,b)
-    (cl-etypecase a
-      (cons
+    (pcase-exhaustive a
+      ((pred consp)
        (let ((a-proper-p (ert--proper-list-p a))
              (b-proper-p (ert--proper-list-p b)))
          (if (not (eql (not a-proper-p) (not b-proper-p)))
@@ -502,24 +502,26 @@ Returns nil if they are."
                        `(cdr ,cdr-x)
                      (cl-assert (equal a b) t)
                      nil))))))))
-      (array (if (not (equal (length a) (length b)))
-                 `(arrays-of-different-length ,(length a) ,(length b)
-                                              ,a ,b
-                                              ,@(unless (char-table-p a)
-                                                  `(first-mismatch-at
-                                                    ,(cl-mismatch a b :test 
'equal))))
-               (cl-loop for i from 0
-                        for ai across a
-                        for bi across b
-                        for xi = (ert--explain-equal-rec ai bi)
-                        do (when xi (cl-return `(array-elt ,i ,xi)))
-                        finally (cl-assert (equal a b) t))))
-      (atom (if (not (equal a b))
-                (if (and (symbolp a) (symbolp b) (string= a b))
-                    `(different-symbols-with-the-same-name ,a ,b)
-                  `(different-atoms ,(ert--explain-format-atom a)
-                                    ,(ert--explain-format-atom b)))
-              nil)))))
+      ((pred arrayp)
+       (if (not (equal (length a) (length b)))
+           `(arrays-of-different-length ,(length a) ,(length b)
+                                        ,a ,b
+                                        ,@(unless (char-table-p a)
+                                            `(first-mismatch-at
+                                              ,(cl-mismatch a b :test 
'equal))))
+         (cl-loop for i from 0
+                  for ai across a
+                  for bi across b
+                  for xi = (ert--explain-equal-rec ai bi)
+                  do (when xi (cl-return `(array-elt ,i ,xi)))
+                  finally (cl-assert (equal a b) t))))
+      ((pred atom)
+       (if (not (equal a b))
+           (if (and (symbolp a) (symbolp b) (string= a b))
+               `(different-symbols-with-the-same-name ,a ,b)
+             `(different-atoms ,(ert--explain-format-atom a)
+                               ,(ert--explain-format-atom b)))
+         nil)))))
 
 (defun ert--explain-equal (a b)
   "Explainer function for `equal'."
@@ -694,23 +696,20 @@ and is displayed in front of the value of MESSAGE-FORM."
         (print-level 8)
         (print-length 50))
     (dolist (frame backtrace)
-      (cl-ecase (car frame)
-        ((nil)
+      (pcase-exhaustive frame
+        (`(nil ,special-operator . ,arg-forms)
          ;; Special operator.
-         (cl-destructuring-bind (special-operator &rest arg-forms)
-             (cdr frame)
-           (insert
-            (format "  %S\n" (cons special-operator arg-forms)))))
-        ((t)
+         (insert
+          (format "  %S\n" (cons special-operator arg-forms))))
+        (`(t ,fn . ,args)
          ;; Function call.
-         (cl-destructuring-bind (fn &rest args) (cdr frame)
-           (insert (format "  %S(" fn))
-           (cl-loop for firstp = t then nil
-                    for arg in args do
-                    (unless firstp
-                      (insert " "))
-                    (insert (format "%S" arg)))
-           (insert ")\n")))))))
+         (insert (format "  %S(" fn))
+         (cl-loop for firstp = t then nil
+                  for arg in args do
+                  (unless firstp
+                    (insert " "))
+                  (insert (format "%S" arg)))
+         (insert ")\n"))))))
 
 ;; A container for the state of the execution of a single test and
 ;; environment data needed during its execution.
@@ -894,33 +893,32 @@ t -- Always matches.
                            RESULT."
   ;; It would be easy to add `member' and `eql' types etc., but I
   ;; haven't bothered yet.
-  (cl-etypecase result-type
-    ((member nil) nil)
-    ((member t) t)
-    ((member :failed) (ert-test-failed-p result))
-    ((member :passed) (ert-test-passed-p result))
-    ((member :skipped) (ert-test-skipped-p result))
-    (cons
-     (cl-destructuring-bind (operator &rest operands) result-type
-       (cl-ecase operator
-         (and
-          (cl-case (length operands)
-            (0 t)
-            (t
-             (and (ert-test-result-type-p result (car operands))
-                  (ert-test-result-type-p result `(and ,@(cdr operands)))))))
-         (or
-          (cl-case (length operands)
-            (0 nil)
-            (t
-             (or (ert-test-result-type-p result (car operands))
-                 (ert-test-result-type-p result `(or ,@(cdr operands)))))))
-         (not
-          (cl-assert (eql (length operands) 1))
-          (not (ert-test-result-type-p result (car operands))))
-         (satisfies
-          (cl-assert (eql (length operands) 1))
-          (funcall (car operands) result)))))))
+  (pcase-exhaustive result-type
+    ('nil nil)
+    ('t t)
+    (:failed (ert-test-failed-p result))
+    (:passed (ert-test-passed-p result))
+    (:skipped (ert-test-skipped-p result))
+    (`(,operator . ,operands)
+     (cl-ecase operator
+       (and
+        (cl-case (length operands)
+          (0 t)
+          (t
+           (and (ert-test-result-type-p result (car operands))
+                (ert-test-result-type-p result `(and ,@(cdr operands)))))))
+       (or
+        (cl-case (length operands)
+          (0 nil)
+          (t
+           (or (ert-test-result-type-p result (car operands))
+               (ert-test-result-type-p result `(or ,@(cdr operands)))))))
+       (not
+        (cl-assert (eql (length operands) 1))
+        (not (ert-test-result-type-p result (car operands))))
+       (satisfies
+        (cl-assert (eql (length operands) 1))
+        (funcall (car operands) result))))))
 
 (defun ert-test-result-expected-p (test result)
   "Return non-nil if TEST's expected result type matches RESULT."
@@ -961,95 +959,96 @@ as (satisfies ...), strings, :new, etc. make use of 
UNIVERSE.
 Selectors that do not, such as (member ...), just return the
 set implied by them without checking whether it is really
 contained in UNIVERSE."
-  ;; This code needs to match the etypecase in
+  ;; This code needs to match the cases in
   ;; `ert-insert-human-readable-selector'.
-  (cl-etypecase selector
-    ((member nil) nil)
-    ((member t) (cl-etypecase universe
-                  (list universe)
-                  ((member t) (ert-select-tests "" universe))))
-    ((member :new) (ert-select-tests
-                    `(satisfies ,(lambda (test)
-                                   (null (ert-test-most-recent-result test))))
-                    universe))
-    ((member :failed) (ert-select-tests
-                       `(satisfies ,(lambda (test)
-                                      (ert-test-result-type-p
-                                       (ert-test-most-recent-result test)
-                                       ':failed)))
-                       universe))
-    ((member :passed) (ert-select-tests
-                       `(satisfies ,(lambda (test)
-                                      (ert-test-result-type-p
-                                       (ert-test-most-recent-result test)
-                                       ':passed)))
-                       universe))
-    ((member :expected) (ert-select-tests
-                         `(satisfies
-                           ,(lambda (test)
-                              (ert-test-result-expected-p
-                               test
-                               (ert-test-most-recent-result test))))
-                         universe))
-    ((member :unexpected) (ert-select-tests `(not :expected) universe))
-    (string
-     (cl-etypecase universe
-       ((member t) (mapcar #'ert-get-test
-                           (apropos-internal selector #'ert-test-boundp)))
-       (list (cl-remove-if-not (lambda (test)
-                                   (and (ert-test-name test)
-                                        (string-match selector
-                                                      (symbol-name
-                                                       (ert-test-name test)))))
-                                 universe))))
-    (ert-test (list selector))
-    (symbol
+  (pcase-exhaustive selector
+    ('nil nil)
+    ('t (pcase-exhaustive universe
+          ((pred listp) universe)
+          (`t (ert-select-tests "" universe))))
+    (:new (ert-select-tests
+           `(satisfies ,(lambda (test)
+                          (null (ert-test-most-recent-result test))))
+           universe))
+    (:failed (ert-select-tests
+              `(satisfies ,(lambda (test)
+                             (ert-test-result-type-p
+                              (ert-test-most-recent-result test)
+                              ':failed)))
+              universe))
+    (:passed (ert-select-tests
+              `(satisfies ,(lambda (test)
+                             (ert-test-result-type-p
+                              (ert-test-most-recent-result test)
+                              ':passed)))
+              universe))
+    (:expected (ert-select-tests
+                `(satisfies
+                  ,(lambda (test)
+                     (ert-test-result-expected-p
+                      test
+                      (ert-test-most-recent-result test))))
+                universe))
+    (:unexpected (ert-select-tests `(not :expected) universe))
+    ((pred stringp)
+     (pcase-exhaustive universe
+       (`t (mapcar #'ert-get-test
+                   (apropos-internal selector #'ert-test-boundp)))
+       ((pred listp)
+        (cl-remove-if-not (lambda (test)
+                            (and (ert-test-name test)
+                                 (string-match selector
+                                               (symbol-name
+                                                (ert-test-name test)))))
+                          universe))))
+    ((pred ert-test-p) (list selector))
+    ((pred symbolp)
      (cl-assert (ert-test-boundp selector))
      (list (ert-get-test selector)))
-    (cons
-     (cl-destructuring-bind (operator &rest operands) selector
-       (cl-ecase operator
-         (member
-          (mapcar (lambda (purported-test)
-                    (cl-etypecase purported-test
-                      (symbol (cl-assert (ert-test-boundp purported-test))
-                              (ert-get-test purported-test))
-                      (ert-test purported-test)))
-                  operands))
-         (eql
-          (cl-assert (eql (length operands) 1))
-          (ert-select-tests `(member ,@operands) universe))
-         (and
-          ;; Do these definitions of AND, NOT and OR satisfy de
-          ;; Morgan's laws?  Should they?
-          (cl-case (length operands)
-            (0 (ert-select-tests 't universe))
-            (t (ert-select-tests `(and ,@(cdr operands))
-                                 (ert-select-tests (car operands)
-                                                   universe)))))
-         (not
-          (cl-assert (eql (length operands) 1))
-          (let ((all-tests (ert-select-tests 't universe)))
-            (cl-set-difference all-tests
-                                 (ert-select-tests (car operands)
-                                                   all-tests))))
-         (or
-          (cl-case (length operands)
-            (0 (ert-select-tests 'nil universe))
-            (t (cl-union (ert-select-tests (car operands) universe)
-                           (ert-select-tests `(or ,@(cdr operands))
-                                             universe)))))
-         (tag
-          (cl-assert (eql (length operands) 1))
-          (let ((tag (car operands)))
-            (ert-select-tests `(satisfies
-                                ,(lambda (test)
-                                   (member tag (ert-test-tags test))))
-                              universe)))
-         (satisfies
-          (cl-assert (eql (length operands) 1))
-          (cl-remove-if-not (car operands)
-                              (ert-select-tests 't universe))))))))
+    (`(,operator . ,operands)
+     (cl-ecase operator
+       (member
+        (mapcar (lambda (purported-test)
+                  (pcase-exhaustive purported-test
+                    ((pred symbolp)
+                     (cl-assert (ert-test-boundp purported-test))
+                     (ert-get-test purported-test))
+                    ((pred ert-test-p) purported-test)))
+                operands))
+       (eql
+        (cl-assert (eql (length operands) 1))
+        (ert-select-tests `(member ,@operands) universe))
+       (and
+        ;; Do these definitions of AND, NOT and OR satisfy de
+        ;; Morgan's laws?  Should they?
+        (cl-case (length operands)
+          (0 (ert-select-tests 't universe))
+          (t (ert-select-tests `(and ,@(cdr operands))
+                               (ert-select-tests (car operands)
+                                                 universe)))))
+       (not
+        (cl-assert (eql (length operands) 1))
+        (let ((all-tests (ert-select-tests 't universe)))
+          (cl-set-difference all-tests
+                             (ert-select-tests (car operands)
+                                               all-tests))))
+       (or
+        (cl-case (length operands)
+          (0 (ert-select-tests 'nil universe))
+          (t (cl-union (ert-select-tests (car operands) universe)
+                       (ert-select-tests `(or ,@(cdr operands))
+                                         universe)))))
+       (tag
+        (cl-assert (eql (length operands) 1))
+        (let ((tag (car operands)))
+          (ert-select-tests `(satisfies
+                              ,(lambda (test)
+                                 (member tag (ert-test-tags test))))
+                            universe)))
+       (satisfies
+        (cl-assert (eql (length operands) 1))
+        (cl-remove-if-not (car operands)
+                          (ert-select-tests 't universe)))))))
 
 (defun ert--insert-human-readable-selector (selector)
   "Insert a human-readable presentation of SELECTOR into the current buffer."
@@ -1058,26 +1057,24 @@ contained in UNIVERSE."
   ;; `most-recent-result' slots of test case objects in (eql ...) or
   ;; (member ...) selectors.
   (cl-labels ((rec (selector)
-                ;; This code needs to match the etypecase in
+                ;; This code needs to match the cases in
                 ;; `ert-select-tests'.
-                (cl-etypecase selector
-                  ((or (member nil t
-                               :new :failed :passed
-                               :expected :unexpected)
-                       string
-                       symbol)
+                (pcase-exhaustive selector
+                  ((or
+                    ;; 'nil 't :new :failed :passed :expected :unexpected
+                    (pred stringp)
+                    (pred symbolp))
                    selector)
-                  (ert-test
+                  ((pred ert-test-p)
                    (if (ert-test-name selector)
                        (make-symbol (format "<%S>" (ert-test-name selector)))
                      (make-symbol "<unnamed test>")))
-                  (cons
-                   (cl-destructuring-bind (operator &rest operands) selector
-                     (cl-ecase operator
-                       ((member eql and not or)
-                        `(,operator ,@(mapcar #'rec operands)))
-                       ((member tag satisfies)
-                        selector)))))))
+                  (`(,operator . ,operands)
+                   (pcase operator
+                     ((or 'member 'eql 'and 'not 'or)
+                      `(,operator ,@(mapcar #'rec operands)))
+                     ((or 'tag 'satisfies)
+                      selector))))))
     (insert (format "%S" (rec selector)))))
 
 
diff --git a/lisp/emacs-lisp/gv.el b/lisp/emacs-lisp/gv.el
index 94fe6c3..1fea38c 100644
--- a/lisp/emacs-lisp/gv.el
+++ b/lisp/emacs-lisp/gv.el
@@ -260,6 +260,8 @@ The return value is the last VAL in the list.
 
 \(fn PLACE VAL PLACE VAL ...)"
   (declare (debug (&rest [gv-place form])))
+  (if (/= (logand (length args) 1) 0)
+      (signal 'wrong-number-of-arguments (list 'setf (length args))))
   (if (and args (null (cddr args)))
       (let ((place (pop args))
             (val (car args)))
@@ -534,7 +536,7 @@ This macro only makes sense when used in a place."
   "Return a reference to PLACE.
 This is like the `&' operator of the C language.
 Note: this only works reliably with lexical binding mode, except for very
-simple PLACEs such as (function-symbol 'foo) which will also work in dynamic
+simple PLACEs such as (function-symbol \\='foo) which will also work in dynamic
 binding mode."
   (let ((code
          (gv-letplace (getter setter) place
diff --git a/lisp/emacs-lisp/let-alist.el b/lisp/emacs-lisp/let-alist.el
index 0b5dede..0b647a0 100644
--- a/lisp/emacs-lisp/let-alist.el
+++ b/lisp/emacs-lisp/let-alist.el
@@ -120,10 +120,10 @@ For instance, the following code
 
 essentially expands to
 
-  (let ((.title (cdr (assq 'title alist)))
-        (.body  (cdr (assq 'body alist)))
-        (.site  (cdr (assq 'site alist)))
-        (.site.contents (cdr (assq 'contents (cdr (assq 'site alist))))))
+  (let ((.title (cdr (assq \\='title alist)))
+        (.body  (cdr (assq \\='body alist)))
+        (.site  (cdr (assq \\='site alist)))
+        (.site.contents (cdr (assq \\='contents (cdr (assq \\='site alist))))))
     (if (and .title .body)
         .body
       .site
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 9ce0dfd..3448b72 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -106,8 +106,10 @@
                                "define-global-minor-mode"
                                "define-globalized-minor-mode"
                                "define-derived-mode" "define-generic-mode"
+                               "ert-deftest"
                                "cl-defun" "cl-defsubst" "cl-defmacro"
-                               "cl-define-compiler-macro"
+                               "cl-define-compiler-macro" "cl-defgeneric"
+                               "cl-defmethod"
                                 ;; CL.
                                "define-compiler-macro" "define-modify-macro"
                                "defsetf" "define-setf-expander"
@@ -270,7 +272,7 @@ This will generate compile-time constants from BINDINGS."
                  "define-derived-mode" "define-minor-mode"
                  "define-generic-mode" "define-global-minor-mode"
                  "define-globalized-minor-mode" "define-skeleton"
-                 "define-widget"))
+                 "define-widget" "ert-deftest"))
      (el-vdefs '("defconst" "defcustom" "defvaralias" "defvar-local"
                  "defface"))
      (el-tdefs '("defgroup" "deftheme"))
diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el
index 2cd34e1..a1bc38c 100644
--- a/lisp/emacs-lisp/nadvice.el
+++ b/lisp/emacs-lisp/nadvice.el
@@ -279,7 +279,7 @@ a special meaning:
   whereas a depth of -100 means that the advice should be outermost.
 
 If PLACE is a symbol, its `default-value' will be affected.
-Use (local 'SYMBOL) if you want to apply FUNCTION to SYMBOL buffer-locally.
+Use (local \\='SYMBOL) if you want to apply FUNCTION to SYMBOL buffer-locally.
 Use (var VAR) if you want to apply FUNCTION to the (lexical) VAR.
 
 If one of FUNCTION or OLDFUN is interactive, then the resulting function
@@ -289,7 +289,10 @@ is also interactive.  There are 3 cases:
   argument (the interactive spec of OLDFUN, which it can pass to
   `advice-eval-interactive-spec') and return the list of arguments to use.
 - Else, use the interactive spec of FUNCTION and ignore the one of OLDFUN."
-  (declare (debug t)) ;;(indent 2)
+  (declare
+   ;;(indent 2)
+   (debug (form [&or symbolp ("local" form) ("var" sexp) gv-place]
+           form &optional form)))
   `(advice--add-function ,where (gv-ref ,(advice--normalize-place place))
                          ,function ,props))
 
@@ -311,7 +314,8 @@ is also interactive.  There are 3 cases:
 If FUNCTION was not added to PLACE, do nothing.
 Instead of FUNCTION being the actual function, it can also be the `name'
 of the piece of advice."
-  (declare (debug t))
+  (declare (debug ([&or symbolp ("local" form) ("var" sexp) gv-place]
+                   form)))
   (gv-letplace (getter setter) (advice--normalize-place place)
     (macroexp-let2 nil new `(advice--remove-function ,getter ,function)
       `(unless (eq ,new ,getter) ,(funcall setter new)))))
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index fdad84a..97b8997 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -5,7 +5,7 @@
 ;; Author: Tom Tromey <address@hidden>
 ;;         Daniel Hackney <address@hidden>
 ;; Created: 10 Mar 2007
-;; Version: 1.0.1
+;; Version: 1.1.0
 ;; Keywords: tools
 ;; Package-Requires: ((tabulated-list "1.0"))
 
@@ -24,14 +24,6 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
-;;; Change Log:
-
-;;  2 Apr 2007 - now using ChangeLog file
-;; 15 Mar 2007 - updated documentation
-;; 14 Mar 2007 - Changed how obsolete packages are handled
-;; 13 Mar 2007 - Wrote package-install-from-buffer
-;; 12 Mar 2007 - Wrote package-menu mode
-
 ;;; Commentary:
 
 ;; The idea behind package.el is to be able to download packages and
@@ -69,6 +61,7 @@
 ;; * Download.  Fetching the package from ELPA.
 ;; * Install.  Untar the package, or write the .el file, into
 ;;   ~/.emacs.d/elpa/ directory.
+;; * Autoload generation.
 ;; * Byte compile.  Currently this phase is done during install,
 ;;   but we may change this.
 ;; * Activate.  Evaluate the autoloads for the package to make it
@@ -127,14 +120,9 @@
 ;; - "installed" instead of a blank in the status column
 ;; - tramp needs its files to be compiled in a certain order.
 ;;   how to handle this?  fix tramp?
-;; - on emacs 21 we don't kill the -autoloads.el buffer.  what about 22?
 ;; - maybe we need separate .elc directories for various emacs versions
 ;;   and also emacs-vs-xemacs.  That way conditional compilation can
 ;;   work.  But would this break anything?
-;; - should store the package's keywords in archive-contents, then
-;;   let the users filter the package-menu by keyword.  See
-;;   finder-by-keyword.  (We could also let people view the
-;;   Commentary, but it isn't clear how useful this is.)
 ;; - William Xu suggests being able to open a package file without
 ;;   installing it
 ;; - Interface with desktop.el so that restarting after an install
@@ -145,15 +133,9 @@
 ;;   private data dir, aka ".../etc".  Or, maybe data-directory
 ;;   needs to be a list (though this would be less nice)
 ;;   a few packages want this, eg sokoban
-;; - package menu needs:
-;;     ability to know which packages are built-in & thus not deletable
-;;     it can sometimes print odd results, like 0.3 available but 0.4 active
-;;        why is that?
-;; - Allow multiple versions on the server...?
-;;   [ why bother? ]
-;; - Don't install a package which will invalidate dependencies overall
-;; - Allow something like (or (>= emacs 21.0) (>= xemacs 21.5))
-;;   [ currently thinking, why bother.. KISS ]
+;; - Allow multiple versions on the server, so that if a user doesn't
+;;   meet the requirements for the most recent version they can still
+;;   install an older one.
 ;; - Allow optional package dependencies
 ;;   then if we require 'bbdb', bbdb-specific lisp in lisp/bbdb
 ;;   and just don't compile to add to load path ...?
@@ -235,7 +217,7 @@ of it available such that:
 
 This variable has three possible values:
     nil: no packages are hidden;
-    `archive': only criteria (a) is used;
+    `archive': only criterion (a) is used;
     t: both criteria are used.
 
 This variable has no effect if `package-menu--hide-packages' is
@@ -253,7 +235,7 @@ Each element has the form (ARCHIVE-ID . PRIORITY).
 
 When installing packages, the package with the highest version
 number from the archive with the highest priority is
-selected. When higher versions are available from archives with
+selected.  When higher versions are available from archives with
 lower priorities, the user has to select those manually.
 
 Archives not in this list have the priority 0.
@@ -665,8 +647,30 @@ PKG-DESC is a `package-desc' object."
 (defvar Info-directory-list)
 (declare-function info-initialize "info" ())
 
-(defun package-activate-1 (pkg-desc &optional reload)
+(defun package--load-files-for-activation (pkg-desc reload)
+  "Load files for activating a package given by PKG-DESC.
+Load the autoloads file, and ensure `load-path' is setup.  If
+RELOAD is non-nil, also load all files in the package that
+correspond to previously loaded files."
+  (let* ((loaded-files-list (when reload
+                              (package--list-loaded-files (package-desc-dir 
pkg-desc)))))
+    ;; Add to load path, add autoloads, and activate the package.
+    (package--activate-autoloads-and-load-path pkg-desc)
+    ;; Call `load' on all files in `package-desc-dir' already present in
+    ;; `load-history'.  This is done so that macros in these files are updated
+    ;; to their new definitions.  If another package is being installed which
+    ;; depends on this new definition, not doing this update would cause
+    ;; compilation errors and break the installation.
+    (with-demoted-errors "Error in package--load-files-for-activation: %s"
+      (mapc (lambda (feature) (load feature nil t))
+            ;; Skip autoloads file since we already evaluated it above.
+            (remove (file-truename (package--autoloads-file-name pkg-desc))
+                    loaded-files-list)))))
+
+(defun package-activate-1 (pkg-desc &optional reload deps)
   "Activate package given by PKG-DESC, even if it was already active.
+If DEPS is non-nil, also activate its dependencies (unless they
+are already activated).
 If RELOAD is non-nil, also `load' any files inside the package which
 correspond to previously loaded files (those returned by
 `package--list-loaded-files')."
@@ -675,20 +679,15 @@ correspond to previously loaded files (those returned by
     (unless pkg-dir
       (error "Internal error: unable to find directory for `%s'"
              (package-desc-full-name pkg-desc)))
-    (let* ((loaded-files-list (when reload
-                                (package--list-loaded-files pkg-dir))))
-      ;; Add to load path, add autoloads, and activate the package.
-      (package--activate-autoloads-and-load-path pkg-desc)
-      ;; Call `load' on all files in `pkg-dir' already present in
-      ;; `load-history'.  This is done so that macros in these files are 
updated
-      ;; to their new definitions.  If another package is being installed which
-      ;; depends on this new definition, not doing this update would cause
-      ;; compilation errors and break the installation.
-      (with-demoted-errors "Error in package-activate-1: %s"
-        (mapc (lambda (feature) (load feature nil t))
-              ;; Skip autoloads file since we already evaluated it above.
-              (remove (file-truename (package--autoloads-file-name pkg-desc))
-                      loaded-files-list))))
+    ;; Activate its dependencies recursively.
+    ;; FIXME: This doesn't check whether the activated version is the
+    ;; required version.
+    (when deps
+      (dolist (req (package-desc-reqs pkg-desc))
+        (unless (package-activate (car req))
+          (error "Unable to activate package `%s'.\nRequired package `%s-%s' 
is unavailable"
+                 name (car req) (package-version-join (cadr req))))))
+    (package--load-files-for-activation pkg-desc reload)
     ;; Add info node.
     (when (file-exists-p (expand-file-name "dir" pkg-dir))
       ;; FIXME: not the friendliest, but simple.
@@ -740,7 +739,7 @@ DIR, sorted by most recently loaded last."
 ;; one was already activated.  It also loads a features of this
 ;; package which were already loaded.
 (defun package-activate (package &optional force)
-  "Activate package PACKAGE.
+  "Activate the package named PACKAGE.
 If FORCE is true, (re-)activate it if it's already activated.
 Newer versions are always activated, regardless of FORCE."
   (let ((pkg-descs (cdr (assq package package-alist))))
@@ -760,19 +759,7 @@ Newer versions are always activated, regardless of FORCE."
      ((and (memq package package-activated-list) (not force))
       t)
      ;; Otherwise, proceed with activation.
-     (t
-      (let* ((pkg-vec (car pkg-descs))
-             (fail (catch 'dep-failure
-                     ;; Activate its dependencies recursively.
-                     (dolist (req (package-desc-reqs pkg-vec))
-                       (unless (package-activate (car req))
-                         (throw 'dep-failure req))))))
-        (if fail
-            (warn "Unable to activate package `%s'.
-Required package `%s-%s' is unavailable"
-                  package (car fail) (package-version-join (cadr fail)))
-          ;; If all goes well, activate the package itself.
-          (package-activate-1 pkg-vec force)))))))
+     (t (package-activate-1 (car pkg-descs) nil 'deps)))))
 
 
 ;;; Installation -- Local operations
@@ -843,13 +830,21 @@ untar into a directory named DIR; otherwise, signal an 
error."
     (package--make-autoloads-and-stuff pkg-desc pkg-dir)
     ;; Update package-alist.
     (let ((new-desc (package-load-descriptor pkg-dir)))
-      ;; FIXME: Check that `new-desc' matches `desc'!
+      (unless (equal (package-desc-full-name new-desc)
+                     (package-desc-full-name pkg-desc))
+        (error "The retrieved package (`%s') doesn't match what the archive 
offered (`%s')"
+               (package-desc-full-name new-desc) (package-desc-full-name 
pkg-desc)))
+      ;; Activation has to be done before compilation, so that if we're
+      ;; upgrading and macros have changed we load the new definitions
+      ;; before compiling.
+      (package-activate-1 new-desc :reload :deps)
       ;; FIXME: Compilation should be done as a separate, optional, step.
       ;; E.g. for multi-package installs, we should first install all packages
       ;; and then compile them.
-      (package--compile new-desc))
-    ;; Try to activate it.
-    (package-activate name 'force)
+      (package--compile new-desc)
+      ;; After compilation, load again any files loaded by
+      ;; `activate-1', so that we use the byte-compiled definitions.
+      (package--load-files-for-activation new-desc :reload))
     pkg-dir))
 
 (defun package-generate-description-file (pkg-desc pkg-file)
@@ -932,11 +927,12 @@ untar into a directory named DIR; otherwise, signal an 
error."
 ;;;; Compilation
 (defvar warning-minimum-level)
 (defun package--compile (pkg-desc)
-  "Byte-compile installed package PKG-DESC."
+  "Byte-compile installed package PKG-DESC.
+This assumes that `pkg-desc' has already been activated with
+`package-activate-1'."
   (let ((warning-minimum-level :error)
         (save-silently inhibit-message)
         (load-path load-path))
-    (package--activate-autoloads-and-load-path pkg-desc)
     (byte-recompile-directory (package-desc-dir pkg-desc) 0 t)))
 
 ;;;; Inferring package from current buffer
@@ -1142,46 +1138,50 @@ Point is after the headers when BODY runs.
 FILE, if provided, is added to URL.
 URL can be a local file name, which must be absolute.
 ASYNC, if non-nil, runs the request asynchronously.
-ERROR-FORM is run only if an error occurs.  If NOERROR is
-non-nil, don't propagate errors caused by the connection or by
-BODY (does not apply to errors signaled by ERROR-FORM).
+ERROR-FORM is run only if a connection error occurs.  If NOERROR
+is non-nil, don't propagate connection errors (does not apply to
+errors signaled by ERROR-FORM or by BODY).
 
 \(fn URL &key ASYNC FILE ERROR-FORM NOERROR &rest BODY)"
   (declare (indent defun) (debug t))
   (while (keywordp (car body))
     (setq body (cdr (cdr body))))
-  (macroexp-let2* nil ((url-1 url))
-    `(cl-macrolet ((wrap-errors (&rest bodyforms)
-                                (let ((err (make-symbol "err")))
-                                  `(condition-case ,err
-                                       ,(macroexp-progn bodyforms)
-                                     ,(list 'error ',error-form
-                                            (list 'unless ',noerror
-                                                  `(signal (car ,err) (cdr 
,err))))))))
+  (macroexp-let2* nil ((url-1 url)
+                       (noerror-1 noerror))
+    `(cl-macrolet ((unless-error (body-2 &rest before-body)
+                                 (let ((err (make-symbol "err")))
+                                   `(with-temp-buffer
+                                      (when (condition-case ,err
+                                                (progn ,@before-body t)
+                                              ,(list 'error ',error-form
+                                                     (list 'unless ',noerror-1
+                                                           `(signal (car ,err) 
(cdr ,err)))))
+                                        ,@body-2)))))
        (if (string-match-p "\\`https?:" ,url-1)
            (let* ((url (concat ,url-1 ,file))
                   (callback (lambda (status)
                               (let ((b (current-buffer)))
-                                (unwind-protect (wrap-errors
-                                                 (when-let ((er (plist-get 
status :error)))
-                                                   (error "Error retrieving: 
%s %S" url er))
-                                                 (unless 
(search-forward-regexp "^\r?\n\r?" nil 'noerror)
-                                                   (error "Error retrieving: 
%s %S" url "incomprehensible buffer"))
-                                                 (with-temp-buffer
-                                                   (url-insert-buffer-contents 
b url)
-                                                   (kill-buffer b)
-                                                   (goto-char (point-min))
-                                                   ,@body)))))))
+                                (require 'url-handlers)
+                                (unless-error ,body
+                                              (when-let ((er (plist-get status 
:error)))
+                                                (error "Error retrieving: %s 
%S" url er))
+                                              (with-current-buffer b
+                                                (goto-char (point-min))
+                                                (unless (search-forward-regexp 
"^\r?\n\r?" nil 'noerror)
+                                                  (error "Error retrieving: %s 
%S" url "incomprehensible buffer")))
+                                              (url-insert-buffer-contents b 
url)
+                                              (kill-buffer b)
+                                              (goto-char (point-min)))))))
              (if ,async
-                 (wrap-errors (url-retrieve url callback nil 'silent))
-               (with-current-buffer (wrap-errors (url-retrieve-synchronously 
url 'silent))
-                 (funcall callback nil))))
-         (wrap-errors (with-temp-buffer
-                        (let ((url (expand-file-name ,file ,url-1)))
-                          (unless (file-name-absolute-p url)
-                            (error "Location %s is not a url nor an absolute 
file name" url))
-                          (insert-file-contents url))
-                        ,@body))))))
+                 (unless-error nil (url-retrieve url callback nil 'silent))
+               (unless-error ,body (url-insert-file-contents url))))
+         (unless-error ,body
+                       (let ((url (expand-file-name ,file ,url-1)))
+                         (unless (file-name-absolute-p url)
+                           (error "Location %s is not a url nor an absolute 
file name" url))
+                         (insert-file-contents url)))))))
+
+(define-error 'bad-signature "Failed to verify signature")
 
 (defun package--check-signature-content (content string &optional sig-file)
   "Check signature CONTENT against STRING.
@@ -1193,7 +1193,7 @@ errors."
     (condition-case error
         (epg-verify-string context content string)
       (error (package--display-verify-error context sig-file)
-        (signal (car error) (cdr error))))
+             (signal 'bad-signature error)))
     (let (good-signatures had-fatal-error)
       ;; The .sig file may contain multiple signatures.  Success if one
       ;; of the signatures is good.
@@ -1209,10 +1209,10 @@ errors."
             (setq had-fatal-error t))))
       (when (and (null good-signatures) had-fatal-error)
         (package--display-verify-error context sig-file)
-        (error "Failed to verify signature %s" sig-file))
+        (signal 'bad-signature (list sig-file)))
       good-signatures)))
 
-(defun package--check-signature (location file &optional string async callback)
+(defun package--check-signature (location file &optional string async callback 
unwind)
   "Check signature of the current buffer.
 Download the signature file from LOCATION by appending \".sig\"
 to FILE.
@@ -1221,18 +1221,35 @@ STRING is the string to verify, it defaults to 
`buffer-string'.
 If ASYNC is non-nil, the download of the signature file is
 done asynchronously.
 
-If the signature is verified and CALLBACK was provided, CALLBACK
-is `funcall'ed with the list of good signatures as argument (the
-list can be empty).  If the signatures file is not found,
-CALLBACK is called with no arguments."
+If the signature does not verify, signal an error.
+If the signature is verified and CALLBACK was provided, `funcall'
+CALLBACK with the list of good signatures as argument (the list
+can be empty).
+If no signatures file is found, and `package-check-signature' is
+`allow-unsigned', call CALLBACK with a nil argument.
+Otherwise, an error is signaled.
+
+UNWIND, if provided, is a function to be called after everything
+else, even if an error is signaled."
   (let ((sig-file (concat file ".sig"))
         (string (or string (buffer-string))))
     (package--with-response-buffer location :file sig-file
       :async async :noerror t
-      :error-form (when callback (funcall callback nil))
-      (let ((sig (package--check-signature-content (buffer-substring (point) 
(point-max)) string sig-file)))
-        (when callback (funcall callback sig))
-        sig))))
+      ;; Connection error is assumed to mean "no sig-file".
+      :error-form (let ((allow-unsigned (eq package-check-signature 
'allow-unsigned)))
+                    (when (and callback allow-unsigned)
+                      (funcall callback nil))
+                    (when unwind (funcall unwind))
+                    (unless allow-unsigned
+                      (error "Unsigned file `%s' at %s" file location)))
+      ;; OTOH, an error here means "bad signature", which we never
+      ;; suppress.  (Bug#22089)
+      (unwind-protect
+          (let ((sig (package--check-signature-content (buffer-substring 
(point) (point-max))
+                                                       string sig-file)))
+            (when callback (funcall callback sig))
+            sig)
+        (when unwind (funcall unwind))))))
 
 ;;; Packages on Archives
 ;; The following variables store information about packages available
@@ -1495,19 +1512,12 @@ similar to an entry in `package-alist'.  Save the 
cached copy to
            location file content async
            ;; This function will be called after signature checking.
            (lambda (&optional good-sigs)
-             (unless (or good-sigs (eq package-check-signature 
'allow-unsigned))
-               ;; Even if the sig fails, this download is done, so
-               ;; remove it from the in-progress list.
-               (package--update-downloads-in-progress archive)
-               (error "Unsigned archive `%s'" name))
-             ;; Either everything worked or we don't mind not signing.
-             ;; Write out the archives file.
              (write-region content nil local-file nil 'silent)
              ;; Write out good signatures into archive-contents.signed file.
              (when good-sigs
                (write-region (mapconcat #'epg-signature-to-string good-sigs 
"\n")
-                             nil (concat local-file ".signed") nil 'silent))
-             (package--update-downloads-in-progress archive))))))))
+                             nil (concat local-file ".signed") nil 'silent)))
+           (lambda () (package--update-downloads-in-progress archive))))))))
 
 (defun package--download-and-read-archives (&optional async)
   "Download descriptions of all `package-archives' and read them.
@@ -1789,11 +1799,6 @@ if all the in-between dependencies are also in 
PACKAGE-LIST."
            location file content nil
            ;; This function will be called after signature checking.
            (lambda (&optional good-sigs)
-             (unless (or good-sigs (eq package-check-signature 
'allow-unsigned))
-               ;; Even if the sig fails, this download is done, so
-               ;; remove it from the in-progress list.
-               (error "Unsigned package: `%s'"
-                 (package-desc-name pkg-desc)))
              ;; Signature checked, unpack now.
              (with-temp-buffer (insert content)
                                (let ((save-silently t))
diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
index bf6550d..c87c231 100644
--- a/lisp/emacs-lisp/pcase.el
+++ b/lisp/emacs-lisp/pcase.el
@@ -865,8 +865,10 @@ Otherwise, it defers to REST which is a list of branches 
of the form
 
 (def-edebug-spec
   pcase-QPAT
+  ;; Cf. edebug spec for `backquote-form' in edebug.el.
   (&or ("," pcase-PAT)
-       (pcase-QPAT . pcase-QPAT)
+       (pcase-QPAT [&rest [&not ","] pcase-QPAT]
+                  . [&or nil pcase-QPAT])
        (vector &rest pcase-QPAT)
        sexp))
 
diff --git a/lisp/emacs-lisp/smie.el b/lisp/emacs-lisp/smie.el
index 738bddd..c9c002b 100644
--- a/lisp/emacs-lisp/smie.el
+++ b/lisp/emacs-lisp/smie.el
@@ -717,9 +717,10 @@ Possible return values:
                      (goto-char pos)
                      (throw 'return
                             (list t epos
-                                  (buffer-substring-no-properties
-                                   epos
-                                   (+ epos (if (< (point) epos) -1 1))))))))
+                                  (unless (= (point) epos)
+                                    (buffer-substring-no-properties
+                                     epos
+                                     (+ epos (if (< (point) epos) -1 1)))))))))
                 (if (eq pos (point))
                     ;; We did not move, so let's abort the loop.
                     (throw 'return (list t (point))))))
@@ -809,7 +810,12 @@ Possible return values:
   nil: we skipped over an identifier, matched parentheses, ..."
   (smie-next-sexp
    (indirect-function smie-backward-token-function)
-   (indirect-function #'backward-sexp)
+   (lambda (n)
+     (if (bobp)
+         ;; Arguably backward-sexp should signal this error for us.
+         (signal 'scan-error
+                 (list "Beginning of buffer" (point) (point)))
+       (backward-sexp n)))
    (indirect-function #'smie-op-left)
    (indirect-function #'smie-op-right)
    halfsexp))
diff --git a/lisp/emulation/keypad.el b/lisp/emulation/keypad.el
index 8d5e6cf..b491110 100644
--- a/lisp/emulation/keypad.el
+++ b/lisp/emulation/keypad.el
@@ -199,15 +199,15 @@ keys are bound.
 
  Setup      Binding
  -------------------------------------------------------------
- 'prefix   Command prefix argument, i.e.  M-0 .. M-9 and M--
- 'S-cursor Bind shifted keypad keys to the shifted cursor movement keys.
- 'cursor   Bind keypad keys to the cursor movement keys.
- 'numeric  Plain numeric keypad, i.e. 0 .. 9 and .  (or DECIMAL arg)
- 'none     Removes all bindings for keypad keys in function-key-map;
-           this enables any user-defined bindings for the keypad keys
-           in the global and local keymaps.
+ `prefix'   Command prefix argument, i.e.  M-0 .. M-9 and M--
+ `S-cursor' Bind shifted keypad keys to the shifted cursor movement keys.
+ `cursor'   Bind keypad keys to the cursor movement keys.
+ `numeric'  Plain numeric keypad, i.e. 0 .. 9 and .  (or DECIMAL arg)
+ `none'     Removes all bindings for keypad keys in function-key-map;
+            this enables any user-defined bindings for the keypad keys
+            in the global and local keymaps.
 
-If SETUP is 'numeric and the optional fourth argument DECIMAL is non-nil,
+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 `.'"
   (let* ((i 0)
         (var (cond
diff --git a/lisp/emulation/viper-keym.el b/lisp/emulation/viper-keym.el
index 272556d..e26994c 100644
--- a/lisp/emulation/viper-keym.el
+++ b/lisp/emulation/viper-keym.el
@@ -497,7 +497,7 @@ Useful in some modes, such as Gnus, MH, etc.")
   "Override some vi-state or insert-state bindings in the current buffer.
 The effect is seen in the current buffer only.
 Useful for customizing  mailer buffers, gnus, etc.
-STATE is 'vi-state, 'insert-state, or 'emacs-state
+STATE is `vi-state', `insert-state', or `emacs-state'.
 ALIST is of the form ((key . func) (key . func) ...)
 Normally, this would be called from a hook to a major mode or
 on a per buffer basis.
diff --git a/lisp/epg.el b/lisp/epg.el
index 71a83c3..88829e5 100644
--- a/lisp/epg.el
+++ b/lisp/epg.el
@@ -1339,8 +1339,8 @@ callback data (if any)."
 
 (defun epg-list-keys (context &optional name mode)
   "Return a list of epg-key objects matched with NAME.
-If MODE is nil or 'public, only public keyring should be searched.
-If MODE is t or 'secret, only secret keyring should be searched.
+If MODE is nil or `public', only public keyring should be searched.
+If MODE is t or `secret', only secret keyring should be searched.
 Otherwise, only public keyring should be searched and the key
 signatures should be included.
 NAME is either a string or a list of strings."
@@ -1680,8 +1680,8 @@ which will return a list of `epg-signature' object."
   "Initiate a sign operation on PLAIN.
 PLAIN is a data object.
 
-If optional 3rd argument MODE is t or 'detached, it makes a detached signature.
-If it is nil or 'normal, it makes a normal signature.
+If optional 3rd argument MODE is t or `detached', it makes a detached 
signature.
+If it is nil or `normal', it makes a normal signature.
 Otherwise, it makes a cleartext signature.
 
 If you use this function, you will need to wait for the completion of
@@ -1724,8 +1724,8 @@ If you are unsure, use synchronous version of this 
function
 (defun epg-sign-file (context plain signature &optional mode)
   "Sign a file PLAIN and store the result to a file SIGNATURE.
 If SIGNATURE is nil, it returns the result as a string.
-If optional 3rd argument MODE is t or 'detached, it makes a detached signature.
-If it is nil or 'normal, it makes a normal signature.
+If optional 3rd argument MODE is t or `detached', it makes a detached 
signature.
+If it is nil or `normal', it makes a normal signature.
 Otherwise, it makes a cleartext signature."
   (unwind-protect
       (progn
@@ -1745,8 +1745,8 @@ Otherwise, it makes a cleartext signature."
 
 (defun epg-sign-string (context plain &optional mode)
   "Sign a string PLAIN and return the output as string.
-If optional 3rd argument MODE is t or 'detached, it makes a detached signature.
-If it is nil or 'normal, it makes a normal signature.
+If optional 3rd argument MODE is t or `detached', it makes a detached 
signature.
+If it is nil or `normal', it makes a normal signature.
 Otherwise, it makes a cleartext signature."
   (let ((input-file
         (unless (or (eq (epg-context-protocol context) 'CMS)
diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index ec45dcf..e07dc90 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -370,13 +370,13 @@ This overrides `erc-server-coding-system' depending on the
 current target as returned by `erc-default-target'.
 
 Example: If you know that the channel #linux-ru uses the coding-system
-`cyrillic-koi8', then add '(\"#linux-ru\" . cyrillic-koi8) to the
+`cyrillic-koi8', then add (\"#linux-ru\" . cyrillic-koi8) to the
 alist."
   :group 'erc-server
   :type '(repeat (cons (string :tag "Target")
                        coding-system)))
 
-(defcustom erc-server-connect-function 'open-network-stream
+(defcustom erc-server-connect-function 'erc-open-network-stream
   "Function used to initiate a connection.
 It should take same arguments as `open-network-stream' does."
   :group 'erc-server
@@ -493,9 +493,19 @@ The current buffer is given by BUFFER."
                                      4 erc-server-send-ping-interval
                                      #'erc-server-send-ping
                                      buffer))
-      (setq erc-server-ping-timer-alist (cons (cons buffer
-                                                    erc-server-ping-handler)
-                                              erc-server-ping-timer-alist)))))
+
+      ;; I check the timer alist for an existing timer. If one exists,
+      ;; I get rid of it
+      (let ((timer-tuple (assq buffer erc-server-ping-timer-alist)))
+        (if timer-tuple
+            ;; this buffer already has a timer. Cancel it and set the new one
+            (progn
+              (erc-cancel-timer (cdr timer-tuple))
+              (setf (cdr (assq buffer erc-server-ping-timer-alist)) 
erc-server-ping-handler))
+
+          ;; no existing timer for this buffer. Add new one
+          (add-to-list 'erc-server-ping-timer-alist
+                       (cons buffer erc-server-ping-handler)))))))
 
 (defun erc-server-process-alive (&optional buffer)
   "Return non-nil when BUFFER has an `erc-server-process' open or running."
@@ -505,51 +515,53 @@ The current buffer is given by BUFFER."
          (memq (process-status erc-server-process) '(run open)))))
 
 ;;;; Connecting to a server
+(defun erc-open-network-stream (name buffer host service)
+  "As `open-network-stream', but does non-blocking IO"
+  (make-network-process :name name :buffer  buffer
+                        :host host :service service :nowait t))
 
 (defun erc-server-connect (server port buffer)
   "Perform the connection and login using the specified SERVER and PORT.
 We will store server variables in the buffer given by BUFFER."
-  (let ((msg (erc-format-message 'connect ?S server ?p port)))
+  (let ((msg (erc-format-message 'connect ?S server ?p port)) process)
     (message "%s" msg)
-    (let ((process (funcall erc-server-connect-function
-                            (format "erc-%s-%s" server port)
-                            nil server port)))
-      (unless (processp process)
-        (error "Connection attempt failed"))
+    (setq process (funcall erc-server-connect-function
+                           (format "erc-%s-%s" server port) nil server port))
+    (unless (processp process)
+      (error "Connection attempt failed"))
+    ;; Misc server variables
+    (with-current-buffer buffer
+      (setq erc-server-process process)
+      (setq erc-server-quitting nil)
+      (setq erc-server-reconnecting nil)
+      (setq erc-server-timed-out nil)
+      (setq erc-server-banned nil)
+      (setq erc-server-error-occurred nil)
+      (let ((time (erc-current-time)))
+        (setq erc-server-last-sent-time time)
+        (setq erc-server-last-ping-time time)
+        (setq erc-server-last-received-time time))
+      (setq erc-server-lines-sent 0)
+      ;; last peers (sender and receiver)
+      (setq erc-server-last-peers '(nil . nil)))
+    ;; we do our own encoding and decoding
+    (when (fboundp 'set-process-coding-system)
+      (set-process-coding-system process 'raw-text))
+    ;; process handlers
+    (set-process-sentinel process 'erc-process-sentinel)
+    (set-process-filter process 'erc-server-filter-function)
+    (set-process-buffer process buffer)
+    (erc-log "\n\n\n********************************************\n")
+    (message "%s" (erc-format-message
+                   'login ?n
+                   (with-current-buffer buffer (erc-current-nick))))
+    ;; wait with script loading until we receive a confirmation (first
+    ;; MOTD line)
+    (if (eq (process-status process) 'connect)
+        ;; waiting for a non-blocking connect - keep the user informed
+        (erc-display-message nil nil buffer "Opening connection..\n")
       (message "%s...done" msg)
-      ;; Misc server variables
-      (with-current-buffer buffer
-        (setq erc-server-process process)
-        (setq erc-server-quitting nil)
-        (setq erc-server-reconnecting nil)
-        (setq erc-server-timed-out nil)
-        (setq erc-server-banned nil)
-        (setq erc-server-error-occurred nil)
-        (let ((time (erc-current-time)))
-          (setq erc-server-last-sent-time time)
-          (setq erc-server-last-ping-time time)
-          (setq erc-server-last-received-time time))
-        (setq erc-server-lines-sent 0)
-        ;; last peers (sender and receiver)
-        (setq erc-server-last-peers '(nil . nil)))
-      ;; we do our own encoding and decoding
-      (when (fboundp 'set-process-coding-system)
-        (set-process-coding-system process 'raw-text))
-      ;; process handlers
-      (set-process-sentinel process 'erc-process-sentinel)
-      (set-process-filter process 'erc-server-filter-function)
-      (set-process-buffer process buffer)))
-  (erc-log "\n\n\n********************************************\n")
-  (message "%s" (erc-format-message
-            'login ?n
-            (with-current-buffer buffer (erc-current-nick))))
-  ;; wait with script loading until we receive a confirmation (first
-  ;; MOTD line)
-  (if (eq erc-server-connect-function 'open-network-stream-nowait)
-      ;; it's a bit unclear otherwise that it's attempting to establish a
-      ;; connection
-      (erc-display-message nil nil buffer "Opening connection..\n")
-    (erc-login)))
+      (erc-login)) ))
 
 (defun erc-server-reconnect ()
 "Reestablish the current IRC connection.
@@ -565,10 +577,15 @@ Make sure you are in an ERC buffer when running this."
       (setq erc-server-last-sent-time 0)
       (setq erc-server-lines-sent 0)
       (let ((erc-server-connect-function (or erc-session-connector
-                                             'open-network-stream)))
+                                             'erc-open-network-stream)))
         (erc-open erc-session-server erc-session-port erc-server-current-nick
                   erc-session-user-full-name t erc-session-password)))))
 
+(defun erc-server-delayed-reconnect (event buffer)
+  (if (buffer-live-p buffer)
+    (with-current-buffer buffer
+      (erc-server-reconnect))))
+
 (defun erc-server-filter-function (process string)
   "The process filter for the ERC server."
   (with-current-buffer (process-buffer process)
@@ -615,17 +632,16 @@ EVENT is the message received from the closed connection 
process."
            (or erc-server-timed-out
                (not (string-match "^deleted" event)))
            ;; open-network-stream-nowait error for connection refused
-           (not (string-match "^failed with code 111" event)))))
+           (if (string-match "^failed with code 111" event) 'nonblocking t))))
 
 (defun erc-process-sentinel-2 (event buffer)
   "Called when `erc-process-sentinel-1' has detected an unexpected disconnect."
   (if (not (buffer-live-p buffer))
       (erc-update-mode-line)
     (with-current-buffer buffer
-      (let ((reconnect-p (erc-server-reconnect-p event)))
-        (erc-display-message nil 'error (current-buffer)
-                             (if reconnect-p 'disconnected
-                               'disconnected-noreconnect))
+      (let ((reconnect-p (erc-server-reconnect-p event)) message delay)
+        (setq message (if reconnect-p 'disconnected 'disconnected-noreconnect))
+        (erc-display-message nil 'error (current-buffer) message)
         (if (not reconnect-p)
             ;; terminate, do not reconnect
             (progn
@@ -637,23 +653,16 @@ EVENT is the message received from the closed connection 
process."
           ;; reconnect
           (condition-case err
               (progn
-                (setq erc-server-reconnecting nil)
-                (erc-server-reconnect)
-                (setq erc-server-reconnect-count 0))
-            (error (when (buffer-live-p buffer)
-                     (set-buffer buffer)
-                     (if (integerp erc-server-reconnect-attempts)
-                         (setq erc-server-reconnect-count
-                               (1+ erc-server-reconnect-count))
-                       (message "%s ... %s"
-                                "Reconnecting until we succeed"
-                                "kill the ERC server buffer to stop"))
-                     (if (numberp erc-server-reconnect-timeout)
-                         (run-at-time erc-server-reconnect-timeout nil
-                                      #'erc-process-sentinel-2
-                                      event buffer)
-                       (error (concat "`erc-server-reconnect-timeout'"
-                                      " must be a number")))))))))))
+                (setq erc-server-reconnecting   nil
+                      erc-server-reconnect-count (1+ 
erc-server-reconnect-count))
+                (setq delay erc-server-reconnect-timeout)
+                (run-at-time delay nil
+                             #'erc-server-delayed-reconnect event buffer))
+            (error (unless (integerp erc-server-reconnect-attempts)
+                     (message "%s ... %s"
+                              "Reconnecting until we succeed"
+                              "kill the ERC server buffer to stop"))
+                   (erc-server-delayed-reconnect event buffer))))))))
 
 (defun erc-process-sentinel-1 (event buffer)
   "Called when `erc-process-sentinel' has decided that we're disconnecting.
@@ -692,6 +701,9 @@ Conditionally try to reconnect and take appropriate action."
                    (setq erc-server-ping-handler nil)))
           (run-hook-with-args 'erc-disconnected-hook
                               (erc-current-nick) (system-name) "")
+          (dolist (buf (erc-buffer-filter (lambda () (boundp 
'erc-channel-users)) cproc))
+            (with-current-buffer buf
+              (setq erc-channel-users (make-hash-table :test 'equal))))
           ;; Remove the prompt
           (goto-char (or (marker-position erc-input-marker) (point-max)))
           (forward-line 0)
@@ -794,7 +806,9 @@ protection algorithm."
 (defun erc-server-send-ping (buf)
   "Send a ping to the IRC server buffer in BUF.
 Additionally, detect whether the IRC process has hung."
-  (if (buffer-live-p buf)
+  (if (and (buffer-live-p buf)
+           (with-current-buffer buf
+             erc-server-last-received-time))
       (with-current-buffer buf
         (if (and erc-server-send-ping-timeout
                  (>
diff --git a/lisp/erc/erc-button.el b/lisp/erc/erc-button.el
index 0e4c709..d6f4b12 100644
--- a/lisp/erc/erc-button.el
+++ b/lisp/erc/erc-button.el
@@ -165,11 +165,11 @@ REGEXP is the string matching text around the button or a 
symbol
   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
+  \\='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,
@@ -180,7 +180,7 @@ 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."
   :group 'erc-button
   :version "24.1"                       ; remove finger (bug#4443)
diff --git a/lisp/erc/erc-join.el b/lisp/erc/erc-join.el
index 4c99898..c1ce14a 100644
--- a/lisp/erc/erc-join.el
+++ b/lisp/erc/erc-join.el
@@ -156,7 +156,13 @@ This function is run from `erc-nickserv-identified-hook'."
     (dolist (l erc-autojoin-channels-alist)
       (when (string-match (car l) server)
        (dolist (chan (cdr l))
-         (erc-server-join-channel server chan)))))
+         (let ((buffer (erc-get-buffer chan)))
+           ;; Only auto-join the channels that we aren't already in
+           ;; using a different nick.
+           (when (or (not buffer)
+                     (not (with-current-buffer buffer
+                            (erc-server-process-alive))))
+             (erc-server-join-channel server chan)))))))
   ;; Return nil to avoid stomping on any other hook funcs.
   nil)
 
@@ -170,7 +176,7 @@ This function is run from `erc-nickserv-identified-hook'."
         (password (if (functionp secret)
                       (funcall secret)
                     secret)))
-    (erc-server-send (concat "join " channel
+    (erc-server-send (concat "JOIN " channel
                             (if password
                                 (concat " " password)
                               "")))))
diff --git a/lisp/erc/erc-log.el b/lisp/erc/erc-log.el
index f022284..4ac13aa 100644
--- a/lisp/erc/erc-log.el
+++ b/lisp/erc/erc-log.el
@@ -270,9 +270,12 @@ The current buffer is given by BUFFER."
       (setq buffer-file-name nil)
       (erc-set-write-file-functions '(erc-save-buffer-in-logs))
       (when erc-log-insert-log-on-open
-       (ignore-errors (insert-file-contents (erc-current-logfile))
-                      (move-marker erc-last-saved-position
-                                   (1- (point-max))))))))
+       (ignore-errors
+         (save-excursion
+           (goto-char (point-min))
+           (insert-file-contents (erc-current-logfile)))
+         (move-marker erc-last-saved-position
+                      (1- (point-max))))))))
 
 (defun erc-log-disable-logging (buffer)
   "Disable logging in BUFFER."
diff --git a/lisp/erc/erc-match.el b/lisp/erc/erc-match.el
index 0622b18..ec3266f 100644
--- a/lisp/erc/erc-match.el
+++ b/lisp/erc/erc-match.el
@@ -191,7 +191,7 @@ use for the logged message."
   "Flag specifying when matched message logging should happen.
 When nil, don't log any matched messages.
 When t, log messages.
-When 'away, log messages only when away."
+When `away', log messages only when away."
   :group 'erc-match
   :type '(choice (const nil)
                 (const away)
diff --git a/lisp/erc/erc-ring.el b/lisp/erc/erc-ring.el
index de988cc..77528ea 100644
--- a/lisp/erc/erc-ring.el
+++ b/lisp/erc/erc-ring.el
@@ -58,7 +58,7 @@ be recalled using M-p and M-n."
 
 (defvar erc-input-ring-index nil
   "Position in the input ring for erc.
-If nil, the input line is blank and the user is conceptually 'after'
+If nil, the input line is blank and the user is conceptually after
 the most recently added item in the ring. If an integer, the input
 line is non-blank and displays the item from the ring indexed by this
 variable.")
@@ -148,4 +148,3 @@ containing a password."
 ;; Local Variables:
 ;; indent-tabs-mode: nil
 ;; End:
-
diff --git a/lisp/erc/erc-track.el b/lisp/erc/erc-track.el
index 2ebc1f2..5af1663 100644
--- a/lisp/erc/erc-track.el
+++ b/lisp/erc/erc-track.el
@@ -101,7 +101,7 @@ disconnected from `erc-modified-channels-alist'."
 
 (defcustom erc-track-exclude-types '("NICK" "333" "353")
   "List of message types to be ignored.
-This list could look like '(\"JOIN\" \"PART\").
+This list could look like (\"JOIN\" \"PART\").
 
 By default, exclude changes of nicknames (NICK), display of who
 set the channel topic (333), and listing of users on the current
@@ -210,7 +210,7 @@ If you would like to ignore changes in certain channels 
where there
 are no faces corresponding to your `erc-track-faces-priority-list', set
 this variable.  You can set a list of channel name strings, so those
 will be ignored while all other channels will be tracked as normal.
-Other options are 'all, to apply this to all channels or nil, to disable
+Other options are `all', to apply this to all channels or nil, to disable
 this feature.
 
 Note: If you have a lot of faces listed in `erc-track-faces-priority-list',
@@ -326,7 +326,7 @@ when there are no more active channels."
   leastactive -  find buffer with least unseen messages
   mostactive  -  find buffer with most unseen messages.
 
-If set to 'importance, the importance is determined by position
+If set to `importance', the importance is determined by position
 in `erc-track-faces-priority-list', where first is most
 important."
   :group 'erc-track
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index cd8c8a8..49ba4cc 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -629,7 +629,7 @@ See also: `erc-get-channel-user-list'."
 
 (defvar erc-channel-modes nil
   "List of strings representing channel modes.
-E.g. '(\"i\" \"m\" \"s\" \"b address@hidden")
+E.g. (\"i\" \"m\" \"s\" \"b address@hidden")
 \(not sure the ban list will be here, but why not)")
 (make-variable-buffer-local 'erc-channel-modes)
 
@@ -1967,7 +1967,9 @@ Returns the buffer for the given server or channel."
     (erc-update-modules)
     (set-buffer buffer)
     (setq old-point (point))
-    (erc-mode)
+    (let ((old-recon-count erc-server-reconnect-count))
+      (erc-mode)
+      (setq erc-server-reconnect-count old-recon-count))
     (setq erc-server-announced-name server-announced-name)
     (setq erc-server-connected connected-p)
     ;; connection parameters
@@ -2027,7 +2029,8 @@ Returns the buffer for the given server or channel."
                            (auth-source-search :host server
                                                :max 1
                                                :user nick
-                                               :port port
+                                               ;; secrets.el wouldn’t accept a 
number
+                                               :port (if (numberp port) 
(number-to-string port) port)
                                                :require '(:secret)))
                       :secret)))
                 (if (functionp secret)
@@ -2208,6 +2211,7 @@ Arguments are the same as for `erc'."
 The process will be given the name NAME, its target buffer will be
 BUFFER.  HOST and PORT specify the connection target."
   (open-network-stream name buffer host port
+                      :nowait t
                        :type 'tls))
 
 ;;; Displaying error messages
@@ -2421,9 +2425,9 @@ If STRING is nil, the function does nothing."
   "Display STRING in the ERC BUFFER.
 All screen output must be done through this function.  If BUFFER is nil
 or omitted, the default ERC buffer for the `erc-session-server' is used.
-The BUFFER can be an actual buffer, a list of buffers, 'all or 'active.
-If BUFFER = 'all, the string is displayed in all the ERC buffers for the
-current session.  'active means the current active buffer
+The BUFFER can be an actual buffer, a list of buffers, `all' or `active'.
+If BUFFER = `all', the string is displayed in all the ERC buffers for the
+current session.  `active' means the current active buffer
 \(`erc-active-buffer').  If the buffer can't be resolved, the current
 buffer is used.  `erc-display-line-1' is used to display STRING.
 
@@ -3251,7 +3255,7 @@ LINE has the format \"USER ACTION\"."
 (put 'erc-cmd-ME 'do-not-parse-args t)
 
 (defun erc-cmd-ME\'S (line)
-  "Do a /ME command, but add the string \" 's\" to the beginning."
+  "Do a /ME command, but add the string \" \\='s\" to the beginning."
   (erc-cmd-ME (concat " 's" line)))
 (put 'erc-cmd-ME\'S 'do-not-parse-args t)
 
@@ -4488,6 +4492,7 @@ Set user modes and run `erc-after-connect' hook."
             (nick (car (erc-response.command-args parsed)))
             (buffer (process-buffer proc)))
         (setq erc-server-connected t)
+       (setq erc-server-reconnect-count 0)
         (erc-update-mode-line)
         (erc-set-initial-user-mode nick buffer)
         (erc-server-setup-periodical-ping buffer)
@@ -4826,6 +4831,11 @@ channel."
                        (_ (error "Unknown prefix char `%S'" ch) voice))
                      'on)))
           (when updatep
+           ;; If we didn't issue the NAMES request (consider two clients
+           ;; talking to an IRC proxy), `erc-channel-begin-receiving-names'
+           ;; will not have been called, so we have to do it here.
+           (unless erc-channel-new-member-names
+             (erc-channel-begin-receiving-names))
             (puthash (erc-downcase name) t
                      erc-channel-new-member-names)
             (erc-update-current-channel-member
@@ -5026,7 +5036,7 @@ See also `erc-remove-current-channel-member'."
 (defun erc-update-channel-topic (channel topic &optional modify)
   "Find a buffer for CHANNEL and set the TOPIC for it.
 
-If optional MODIFY is 'append or 'prepend, then append or prepend the
+If optional MODIFY is `append' or `prepend', then append or prepend the
 TOPIC string to the current topic."
   (erc-with-buffer (channel)
     (cond ((eq modify 'append)
@@ -5189,7 +5199,7 @@ person who changed the modes."
               (t (setq erc-channel-user-limit nil))))))
 
 (defun erc-update-channel-key (channel onoff key)
-  "Update CHANNEL's key to KEY if ONOFF is 'on or to nil if it's 'off."
+  "Update CHANNEL's key to KEY if ONOFF is `on' or to nil if it's `off'."
   (erc-with-buffer
       (channel)
     (cond ((eq onoff 'on) (setq erc-channel-key key))
@@ -6703,7 +6713,7 @@ or `erc-kill-buffer-hook' if any other buffer."
     (cond
      ((eq (erc-server-buffer) (current-buffer))
       (run-hooks 'erc-kill-server-hook))
-     ((erc-channel-p (erc-default-target))
+     ((erc-channel-p (or (erc-default-target) (buffer-name)))
       (run-hooks 'erc-kill-channel-hook))
      (t
       (run-hooks 'erc-kill-buffer-hook)))))
@@ -6731,7 +6741,7 @@ This function should be on `erc-kill-channel-hook'."
   (text-property-not-all (point-min) (point-max) 'erc-parsed nil))
 
 (defun erc-restore-text-properties ()
-  "Restore the property 'erc-parsed for the region."
+  "Restore the property `erc-parsed' for the region."
   (let ((parsed-posn (erc-find-parsed-property)))
     (put-text-property
      (point-min) (point-max)
diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el
index 535e169..72c8a23 100644
--- a/lisp/eshell/esh-cmd.el
+++ b/lisp/eshell/esh-cmd.el
@@ -284,7 +284,7 @@ command line.")
 (defvar eshell-command-arguments nil)
 (defvar eshell-in-pipeline-p nil
   "Internal Eshell variable, non-nil inside a pipeline.
-Has the value 'first, 'last for the first/last commands in the pipeline,
+Has the value `first', `last' for the first/last commands in the pipeline,
 otherwise t.")
 (defvar eshell-in-subcommand-p nil)
 (defvar eshell-last-arguments nil)
@@ -670,8 +670,8 @@ For an external command, it means an exit code of 0."
   "Separate TERMS using SEPARATOR.
 If REVERSED is non-nil, the list of separated term groups will be
 returned in reverse order.  If LAST-TERMS-SYM is a symbol, its value
-will be set to a list of all the separator operators found (or '(list
-nil)' if none)."
+will be set to a list of all the separator operators found (or (nil)
+if none)."
   (let ((sub-terms (list t))
        (eshell-sep-terms (list t))
        subchains)
diff --git a/lisp/eshell/esh-util.el b/lisp/eshell/esh-util.el
index f645702..e99a316 100644
--- a/lisp/eshell/esh-util.el
+++ b/lisp/eshell/esh-util.el
@@ -678,8 +678,8 @@ If NOSORT is non-nil, the list is not sorted--its order is 
unpredictable.
 (defun eshell-file-attributes (file &optional id-format)
   "Return the attributes of FILE, playing tricks if it's over ange-ftp.
 The optional argument ID-FORMAT specifies the preferred uid and
-gid format.  Valid values are 'string and 'integer, defaulting to
-'integer.  See `file-attributes'."
+gid format.  Valid values are `string' and `integer', defaulting to
+`integer'.  See `file-attributes'."
   (let* ((file (expand-file-name file))
         entry)
     (if (string-equal (file-remote-p file 'method) "ftp")
diff --git a/lisp/facemenu.el b/lisp/facemenu.el
index 3d58943..885c15f 100644
--- a/lisp/facemenu.el
+++ b/lisp/facemenu.el
@@ -637,8 +637,8 @@ color.  The function should accept a single argument, the 
color name."
 (defun list-colors-duplicates (&optional list)
   "Return a list of colors with grouped duplicate colors.
 If a color has no duplicates, then the element of the returned list
-has the form '(COLOR-NAME).  The element of the returned list with
-duplicate colors has the form '(COLOR-NAME DUPLICATE-COLOR-NAME ...).
+has the form (COLOR-NAME).  The element of the returned list with
+duplicate colors has the form (COLOR-NAME DUPLICATE-COLOR-NAME ...).
 This function uses the predicate `facemenu-color-equal' to compare
 color names.  If the optional argument LIST is non-nil, it should
 be a list of colors to display.  Otherwise, this function uses
diff --git a/lisp/faces.el b/lisp/faces.el
index f96df05..ecd34a5 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -276,7 +276,7 @@ If FRAME is omitted or nil, use the selected frame."
 (defun face-list-p (face-or-list)
   "True if FACE-OR-LIST is a list of faces.
 Return nil if FACE-OR-LIST is a non-nil atom, or a cons cell whose car
-is either 'foreground-color, 'background-color, or a keyword."
+is either `foreground-color', `background-color', or a keyword."
   ;; The logic of merge_face_ref (xfaces.c) is recreated here.
   (and (listp face-or-list)
        (not (memq (car face-or-list)
@@ -1971,7 +1971,9 @@ unnamed faces (e.g, `foreground-color')."
                         (get-char-property (point) 'font-lock-face))
                    (get-char-property (point) 'face)))
         (found nil))
-    (dolist (face (if (listp faces) faces (list faces)))
+    (dolist (face (if (face-list-p faces)
+                      faces
+                    (list faces)))
       (cond (found)
             ((and face (symbolp face))
              (let ((value (face-attribute-specified-or
diff --git a/lisp/files.el b/lisp/files.el
index fdda9b2..ea09c2a 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -740,20 +740,27 @@ The path separator is colon in GNU and GNU-like systems."
        (error "No such directory found via CDPATH environment variable"))))
 
 (defsubst directory-name-p (name)
-  "Return non-nil if NAME ends with a slash character."
-  (and (> (length name) 0)
-       (char-equal (aref name (1- (length name))) ?/)))
-
-(defun directory-files-recursively (dir match &optional include-directories)
-  "Return all files under DIR that have file names matching MATCH (a regexp).
+  "Return non-nil if NAME ends with a directory separator character."
+  (let ((len (length name))
+        (lastc ?.))
+    (if (> len 0)
+        (setq lastc (aref name (1- len))))
+    (or (= lastc ?/)
+        (and (memq system-type '(windows-nt ms-dos))
+             (= lastc ?\\)))))
+
+(defun directory-files-recursively (dir regexp &optional include-directories)
+  "Return list of all files under DIR that have file names matching REGEXP.
 This function works recursively.  Files are returned in \"depth first\"
-and alphabetical order.
-If INCLUDE-DIRECTORIES, also include directories that have matching names."
+order, and files from each directory are sorted in alphabetical order.
+Each file name appears in the returned list in its absolute form.
+Optional argument INCLUDE-DIRECTORIES non-nil means also include in the
+output directories whose names match REGEXP."
   (let ((result nil)
        (files nil)
        ;; When DIR is "/", remote file names like "/method:" could
        ;; also be offered.  We shall suppress them.
-       (tramp-mode (and tramp-mode (file-remote-p dir))))
+       (tramp-mode (and tramp-mode (file-remote-p (expand-file-name dir)))))
     (dolist (file (sort (file-name-all-completions "" dir)
                        'string<))
       (unless (member file '("./" "../"))
@@ -764,19 +771,23 @@ If INCLUDE-DIRECTORIES, also include directories that 
have matching names."
              (unless (file-symlink-p full-file)
                (setq result
                      (nconc result (directory-files-recursively
-                                    full-file match include-directories))))
+                                    full-file regexp include-directories))))
              (when (and include-directories
-                        (string-match match leaf))
+                        (string-match regexp leaf))
                (setq result (nconc result (list full-file)))))
-         (when (string-match match file)
+         (when (string-match regexp file)
            (push (expand-file-name file dir) files)))))
     (nconc result (nreverse files))))
 
+(defvar module-file-suffix)
+
 (defun load-file (file)
   "Load the Lisp file named FILE."
-  ;; This is a case where .elc makes a lot of sense.
+  ;; This is a case where .elc and .so/.dll make a lot of sense.
   (interactive (list (let ((completion-ignored-extensions
-                           (remove ".elc" completion-ignored-extensions)))
+                            (remove module-file-suffix
+                                    (remove ".elc"
+                                            completion-ignored-extensions))))
                       (read-file-name "Load file: " nil nil 'lambda))))
   (load (expand-file-name file) nil nil t))
 
@@ -787,8 +798,8 @@ return nil.
 PATH should be a list of directories to look in, like the lists in
 `exec-path' or `load-path'.
 If SUFFIXES is non-nil, it should be a list of suffixes to append to
-file name when searching.  If SUFFIXES is nil, it is equivalent to '(\"\").
-Use '(\"/\") to disable PATH search, but still try the suffixes in SUFFIXES.
+file name when searching.  If SUFFIXES is nil, it is equivalent to (\"\").
+Use (\"/\") to disable PATH search, but still try the suffixes in SUFFIXES.
 If non-nil, PREDICATE is used instead of `file-readable-p'.
 
 This function will normally skip directories, so if you want it to find
@@ -1012,6 +1023,7 @@ Return nil if COMMAND is not found anywhere in 
`exec-path'."
 
 (defun load-library (library)
   "Load the Emacs Lisp library named LIBRARY.
+LIBRARY should be a string.
 This is an interface to the function `load'.  LIBRARY is searched
 for in `load-path', both with and without `load-suffixes' (as
 well as `load-file-rep-suffixes').
@@ -1019,10 +1031,11 @@ well as `load-file-rep-suffixes').
 See Info node `(emacs)Lisp Libraries' for more details.
 See `load-file' for a different interface to `load'."
   (interactive
-   (list (completing-read "Load library: "
-                         (apply-partially 'locate-file-completion-table
-                                           load-path
-                                           (get-load-suffixes)))))
+   (let (completion-ignored-extensions)
+     (list (completing-read "Load library: "
+                            (apply-partially 'locate-file-completion-table
+                                             load-path
+                                             (get-load-suffixes))))))
   (load library))
 
 (defun file-remote-p (file &optional identification connected)
@@ -1418,8 +1431,10 @@ return value, which may be passed as the REQUIRE-MATCH 
arg to
 
 (defmacro minibuffer-with-setup-hook (fun &rest body)
   "Temporarily add FUN to `minibuffer-setup-hook' while executing BODY.
-FUN can also be (:append FUN1), in which case FUN1 is appended to
-`minibuffer-setup-hook'.
+
+By default, FUN is prepended to `minibuffer-setup-hook'.  But if FUN is of
+the form `(:append FUN1)', FUN1 will be appended to `minibuffer-setup-hook'
+instead of prepending it.
 
 BODY should use the minibuffer at most once.
 Recursive uses of the minibuffer are unaffected (FUN is not
@@ -3407,7 +3422,7 @@ local variables, but directory-local variables may still 
be applied."
                               (unless hack-local-variables--warned-lexical
                                 (setq hack-local-variables--warned-lexical t)
                                 (display-warning
-                                  :warning
+                                  'files
                                   (format-message
                                    "%s: `lexical-binding' at end of file 
unreliable"
                                    (file-name-nondirectory
@@ -3871,7 +3886,7 @@ This does nothing if either `enable-local-variables' or
              (if (eq (car elt) 'coding)
                   (unless hack-dir-local-variables--warned-coding
                     (setq hack-dir-local-variables--warned-coding t)
-                    (display-warning :warning
+                    (display-warning 'files
                                      "Coding cannot be specified by 
dir-locals"))
                (unless (memq (car elt) '(eval mode))
                  (setq dir-local-variables-alist
@@ -6242,7 +6257,7 @@ invokes the program specified by 
`directory-free-space-program'
 and `directory-free-space-args'.  If the system call or program
 is unsuccessful, or if DIR is a remote directory, this function
 returns nil."
-  (unless (file-remote-p dir)
+  (unless (file-remote-p (expand-file-name dir))
     ;; Try to find the number of free blocks.  Non-Posix systems don't
     ;; always have df, but might have an equivalent system call.
     (if (fboundp 'file-system-info)
@@ -6884,7 +6899,7 @@ as in \"og+rX-w\"."
 
 (defun read-file-modes (&optional prompt orig-file)
   "Read file modes in octal or symbolic notation and return its numeric value.
-PROMPT is used as the prompt, default to `File modes (octal or symbolic): '.
+PROMPT is used as the prompt, default to \"File modes (octal or symbolic): \".
 ORIG-FILE is the name of a file on whose mode bits to base returned
 permissions if what user types requests to add, remove, or set permissions
 based on existing mode bits, as in \"og+rX-w\"."
diff --git a/lisp/filesets.el b/lisp/filesets.el
index 28d0cd8..ad3b4db 100644
--- a/lisp/filesets.el
+++ b/lisp/filesets.el
@@ -140,7 +140,7 @@ put \"(setq filesets-menu-ensure-use-cached VALUE)\" into 
your startup
 file -- before loading filesets.el.
 
 So, when should you think about setting this value to t? If filesets.el
-is loaded before user customizations.  Thus, if (require 'filesets)
+is loaded before user customizations.  Thus, if (require \\='filesets)
 precedes the `custom-set-variables' command or, for XEmacs, if init.el
 is loaded before custom.el, set this variable to t.")
 
diff --git a/lisp/find-file.el b/lisp/find-file.el
index 5c2c506..f6e6daf 100644
--- a/lisp/find-file.el
+++ b/lisp/find-file.el
@@ -222,7 +222,7 @@ may not exist.
 
 A typical format is
 
-    '(\".\" \"/usr/include\" \"$PROJECT/*/include\")
+    (\".\" \"/usr/include\" \"$PROJECT/*/include\")
 
 Environment variables can be inserted between slashes (`/').
 They will be replaced by their definition.  If a variable does
diff --git a/lisp/finder.el b/lisp/finder.el
index 715dd94..c40e04a 100644
--- a/lisp/finder.el
+++ b/lisp/finder.el
@@ -238,7 +238,7 @@ from; the default is `load-path'."
                    ;; The idea here is that eg calc.el gets to define
                    ;; the description of the calc package.
                    ;; This does not work for eg nxml-mode.el.
-                   ((eq base-name package)
+                   ((or (eq base-name package) version)
                     (setq desc (cdr entry))
                     (aset desc 0 version)
                     (aset desc 2 summary)))
diff --git a/lisp/follow.el b/lisp/follow.el
index 938c59e..71e8824 100644
--- a/lisp/follow.el
+++ b/lisp/follow.el
@@ -3,8 +3,8 @@
 ;; Copyright (C) 1995-1997, 1999, 2001-2015 Free Software Foundation,
 ;; Inc.
 
-;; Author: Anders Lindgren <address@hidden>
-;; Maintainer: address@hidden (Anders' email bounces, Sep 2005)
+;; Author: Anders Lindgren
+;; Maintainer: address@hidden
 ;; Created: 1995-05-25
 ;; Keywords: display, window, minor-mode, convenience
 
@@ -421,7 +421,21 @@ Keys specific to Follow mode:
       (progn
        (add-hook 'compilation-filter-hook 'follow-align-compilation-windows t 
t)
        (add-hook 'post-command-hook 'follow-post-command-hook t)
-       (add-hook 'window-size-change-functions 'follow-window-size-change t))
+       (add-hook 'window-size-change-functions 'follow-window-size-change t)
+        (add-hook 'after-change-functions 'follow-after-change nil t)
+        (add-hook 'isearch-update-post-hook 'follow-post-command-hook nil t)
+        (add-hook 'replace-update-post-hook 'follow-post-command-hook nil t)
+        (add-hook 'ispell-update-post-hook 'follow-post-command-hook nil t)
+
+        (setq window-group-start-function 'follow-window-start)
+        (setq window-group-end-function 'follow-window-end)
+        (setq set-window-group-start-function 'follow-set-window-start)
+        (setq recenter-window-group-function 'follow-recenter)
+        (setq pos-visible-in-window-group-p-function
+              'follow-pos-visible-in-window-p)
+        (setq selected-window-group-function 'follow-all-followers)
+        (setq move-to-window-group-line-function 'follow-move-to-window-line))
+
     ;; Remove globally-installed hook functions only if there is no
     ;; other Follow mode buffer.
     (let ((buffers (buffer-list))
@@ -432,6 +446,19 @@ Keys specific to Follow mode:
       (unless following
        (remove-hook 'post-command-hook 'follow-post-command-hook)
        (remove-hook 'window-size-change-functions 'follow-window-size-change)))
+
+    (kill-local-variable 'move-to-window-group-line-function)
+    (kill-local-variable 'selected-window-group-function)
+    (kill-local-variable 'pos-visible-in-window-group-p-function)
+    (kill-local-variable 'recenter-window-group-function)
+    (kill-local-variable 'set-window-group-start-function)
+    (kill-local-variable 'window-group-end-function)
+    (kill-local-variable 'window-group-start-function)
+
+    (remove-hook 'ispell-update-post-hook 'follow-post-command-hook t)
+    (remove-hook 'replace-update-post-hook 'follow-post-command-hook t)
+    (remove-hook 'isearch-update-post-hook 'follow-post-command-hook t)
+    (remove-hook 'after-change-functions 'follow-after-change t)
     (remove-hook 'compilation-filter-hook 'follow-align-compilation-windows 
t)))
 
 (defun follow-find-file-hook ()
@@ -865,10 +892,10 @@ Note that this handles the case when the cache has been 
set to nil."
     (let ((orig-win (selected-window))
          win-start-end)
       (dolist (w windows)
-       (select-window w)
+       (select-window w 'norecord)
        (push (cons w (cons (window-start) (follow-calc-win-end)))
              win-start-end))
-      (select-window orig-win)
+      (select-window orig-win 'norecord)
       (setq follow-windows-start-end-cache (nreverse win-start-end)))))
 
 (defsubst follow-pos-visible (pos win win-start-end)
@@ -1015,6 +1042,10 @@ Otherwise, return nil."
 ;; is nil.  Start every window directly after the end of the previous
 ;; window, to make sure long lines are displayed correctly.
 
+(defvar follow-start-end-invalid t
+  "When non-nil, indicates `follow-windows-start-end-cache' is invalid.")
+(make-variable-buffer-local 'follow-start-end-invalid)
+
 (defun follow-redisplay (&optional windows win preserve-win)
   "Reposition the WINDOWS around WIN.
 Should point be too close to the roof we redisplay everything
@@ -1047,7 +1078,8 @@ repositioning the other windows."
     (dolist (w windows)
       (unless (and preserve-win (eq w win))
        (set-window-start w start))
-      (setq start (car (follow-calc-win-end w))))))
+      (setq start (car (follow-calc-win-end w))))
+    (setq follow-start-end-invalid nil)))
 
 (defun follow-estimate-first-window-start (windows win start)
   "Estimate the position of the first window.
@@ -1416,36 +1448,173 @@ non-first windows in Follow mode."
   "Redraw all windows in FRAME, when in Follow mode."
   ;; Below, we call `post-command-hook'.  Avoid an infloop.
   (unless follow-inside-post-command-hook
-    (let ((buffers '())
-         (orig-window (selected-window))
-         (orig-buffer (current-buffer))
-         (orig-frame (selected-frame))
-         windows
-         buf)
-      (select-frame frame)
-      (unwind-protect
-         (walk-windows
-          (lambda (win)
-            (setq buf (window-buffer win))
-            (unless (memq buf buffers)
-              (set-buffer buf)
-              (when follow-mode
-                (setq windows (follow-all-followers win))
-                (if (not (memq orig-window windows))
-                    (follow-redisplay windows win)
-                  ;; Make sure we're redrawing around the selected
-                  ;; window.
-                  (select-window orig-window)
-                  (follow-post-command-hook)
-                  (setq orig-window (selected-window)))
-                (setq buffers (cons buf buffers)))))
-          'no-minibuf)
-       (select-frame orig-frame)
-       (set-buffer orig-buffer)
-       (select-window orig-window)))))
+    (save-current-buffer
+      (let ((orig-frame (selected-frame)))
+        (select-frame frame)
+        (let ((picked-window (selected-window))   ; Note: May change below.
+              (seen-buffers '()))
+          (unwind-protect
+              (walk-windows
+               (lambda (win)
+                 (let ((buf (window-buffer win)))
+                   (unless (memq buf seen-buffers)
+                     (set-buffer buf)
+                     (when follow-mode
+                       (let ((windows (follow-all-followers win)))
+                         (if (not (memq picked-window windows))
+                             (follow-redisplay windows win)
+                           ;; Make sure we're redrawing around the selected
+                           ;; window.
+                           (select-window picked-window 'norecord)
+                           (follow-post-command-hook)
+                           (setq picked-window (selected-window))))
+                       (push buf seen-buffers)))))
+               'no-minibuf)
+            (select-window picked-window 'norecord)))
+        (select-frame orig-frame)))))
 
 (add-hook 'window-scroll-functions 'follow-avoid-tail-recenter t)
 
+;;; Low level window start and end.
+
+;; These routines are the Follow Mode versions of the low level
+;; functions described on page "Window Start and End" of the elisp
+;; manual, e.g. `window-group-start'.  The aim is to be able to handle
+;; Follow Mode windows by replacing `window-start' by
+;; `window-group-start', etc.
+
+(defun follow-after-change (_beg _end _old-len)
+  "After change function: set `follow-start-end-invalid'."
+  (setq follow-start-end-invalid t))
+
+(defun follow-window-start (&optional window)
+  "Return position at which display currently starts in the
+Follow Mode group of windows which includes WINDOW.
+
+WINDOW must be a live window and defaults to the selected one.
+This is updated by redisplay or by calling
+`follow-set-window-start'."
+  (let ((windows (follow-all-followers window)))
+    (window-start (car windows))))
+
+(defun follow-window-end (&optional window update)
+  "Return position at which display currently ends in the Follow
+  Mode group of windows which includes WINDOW.
+
+  WINDOW must be a live window and defaults to the selected one.
+  This is updated by redisplay, when it runs to completion.
+  Simply changing the buffer text or setting `window-start' does
+  not update this value.
+
+  Return nil if there is no recorded value.  (This can happen if
+  the last redisplay of WINDOW was preempted, and did not
+  finish.)  If UPDATE is non-nil, compute the up-to-date position
+  if it isn't already recorded."
+  (let* ((windows (follow-all-followers window))
+         (last (car (last windows))))
+    (when (and update follow-start-end-invalid)
+      (follow-redisplay windows (car windows)))
+    (window-end last update)))
+
+(defun follow-set-window-start (window pos &optional noforce)
+  "Make display in the Follow Mode group of windows which includes
+WINDOW start at position POS in WINDOW's buffer.
+
+WINDOW must be a live window and defaults to the selected one.  Return
+POS.  Optional third arg NOFORCE non-nil inhibits next redisplay from
+overriding motion of point in order to display at this exact start."
+  (let ((windows (follow-all-followers window)))
+    (setq follow-start-end-invalid t)
+    (set-window-start (car windows) pos noforce)))
+
+(defun follow-pos-visible-in-window-p (&optional pos window partially)
+  "Return non-nil if position POS is currently on the frame in one of
+  the windows in the Follow Mode group which includes WINDOW.
+
+WINDOW must be a live window and defaults to the selected one.
+
+Return nil if that position is scrolled vertically out of view.  If a
+character is only partially visible, nil is returned, unless the
+optional argument PARTIALLY is non-nil.  If POS is only out of view
+because of horizontal scrolling, return non-nil.  If POS is t, it
+specifies the position of the last visible glyph in WINDOW.  POS
+defaults to point in WINDOW; WINDOW defaults to the selected window.
+
+If POS is visible, return t if PARTIALLY is nil; if PARTIALLY is non-nil,
+the return value is a list of 2 or 6 elements (X Y [RTOP RBOT ROWH VPOS]),
+where X and Y are the pixel coordinates relative to the top left corner
+of the actual window containing it.  The remaining elements are
+omitted if the character after POS is fully visible; otherwise, RTOP
+and RBOT are the number of pixels off-window at the top and bottom of
+the screen line (\"row\") containing POS, ROWH is the visible height
+of that row, and VPOS is the row number \(zero-based)."
+  (let* ((windows (follow-all-followers window))
+         (last (car (last windows))))
+    (when follow-start-end-invalid
+      (follow-redisplay windows (car windows)))
+    (let* ((cache (follow-windows-start-end windows))
+           (last-elt (car (last cache)))
+           our-pos pertinent-elt)
+      (setq pertinent-elt
+            (if (eq pos t)
+                last-elt
+              (setq our-pos (or pos (point)))
+              (catch 'element
+                (while cache
+                  (when (< our-pos (nth 2 (car cache)))
+                    (throw 'element (car cache)))
+                  (setq cache (cdr cache)))
+                last-elt)))
+      (pos-visible-in-window-p our-pos (car pertinent-elt) partially))))
+
+(defun follow-move-to-window-line (arg)
+  "Position point relative to the Follow mode group containing the selected 
window.
+ARG nil means position point at center of the window group.
+Else, ARG specifies vertical position within the window group;
+zero means top of the first window in the group, negative means
+  relative to bottom of the last window in the group."
+  (let* ((windows (follow-all-followers))
+         (start-end (follow-windows-start-end windows))
+         (rev-start-end (reverse start-end))
+         (lines 0)
+         middle-window elt count)
+    (select-window
+     (cond
+      ((null arg)
+       (setq rev-start-end (nthcdr (/ (length windows) 2) rev-start-end))
+       (prog1 (car (car rev-start-end))
+         (while (setq rev-start-end (cdr rev-start-end))
+           (setq elt (car rev-start-end)
+                 count (count-screen-lines (cadr elt) (nth 2 elt)
+                                           nil (car elt))
+                 lines (+ lines count)))))
+      ((>= arg 0)
+       (while (and (cdr start-end)
+                   (progn
+                     (setq elt (car start-end)
+                           count (count-screen-lines (cadr elt) (nth 2 elt)
+                                                     nil (car elt)))
+                     (>= arg count)))
+         (setq arg (- arg count)
+               lines (+ lines count)
+               start-end (cdr start-end)))
+       (car (car start-end)))
+      (t                                ; (< arg 0)
+       (while (and (cadr rev-start-end)
+                   (progn
+                     (setq elt (car rev-start-end)
+                           count (count-lines (cadr elt) (nth 2 elt)))
+                     (<= arg (- count))))
+         (setq arg (+ arg count)
+               rev-start-end (cdr rev-start-end)))
+       (prog1 (car (car rev-start-end))
+         (while (setq rev-start-end (cdr rev-start-end))
+           (setq elt (car rev-start-end)
+                 count (count-screen-lines (cadr elt) (nth 2 elt)
+                                           nil (car elt))
+                 lines (+ lines count)))))))
+    (+ lines (move-to-window-line arg))))
+
 ;;; Profile support
 
 ;; The following (non-evaluated) section can be used to
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index 21cf3ae..93d677c 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -763,7 +763,7 @@ see the variables `c-font-lock-extra-types', 
`c++-font-lock-extra-types',
              (setq font-lock-removed-keywords-alist
                    (delq cell font-lock-removed-keywords-alist)))))))
 
-;; Written by Anders Lindgren <address@hidden>.
+;; Written by Anders Lindgren
 ;;
 ;; Case study:
 ;; (I)  The keywords are removed from a major mode.
@@ -1065,7 +1065,8 @@ Called with two arguments BEG and END.")
 
 (defun font-lock-flush (&optional beg end)
   "Declare the region BEG...END's fontification as out-of-date.
-If the region is not specified, it defaults to the whole buffer."
+If the region is not specified, it defaults to the entire
+accessible portion of the current buffer."
   (and font-lock-mode
        font-lock-fontified
        (funcall font-lock-flush-function
@@ -1079,7 +1080,8 @@ Called with two arguments BEG and END.")
 
 (defun font-lock-ensure (&optional beg end)
   "Make sure the region BEG...END has been fontified.
-If the region is not specified, it defaults to the whole buffer."
+If the region is not specified, it defaults to the entire accessible
+portion of the buffer."
   (font-lock-set-defaults)
   (funcall font-lock-ensure-function
            (or beg (point-min)) (or end (point-max))))
diff --git a/lisp/frame.el b/lisp/frame.el
index f024065..2584d09 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -68,7 +68,7 @@ handles the corresponding kind of display.")
 You can set this in your init file; for example,
 
  (setq initial-frame-alist
-       '((top . 1) (left . 1) (width . 80) (height . 55)))
+       \\='((top . 1) (left . 1) (width . 80) (height . 55)))
 
 Parameters specified here supersede the values given in
 `default-frame-alist'.
@@ -103,7 +103,7 @@ initial minibuffer frame.
 You can set this in your init file; for example,
 
  (setq minibuffer-frame-alist
-       '((top . 1) (left . 1) (width . 80) (height . 2)))
+       \\='((top . 1) (left . 1) (width . 80) (height . 2)))
 
 It is not necessary to include (minibuffer . only); that is
 appended when the minibuffer frame is created."
@@ -911,7 +911,7 @@ if you want Emacs to examine the brightness for you.
 
 If you change this without using customize, you should use
 `frame-set-background-mode' to update existing frames;
-e.g. (mapc 'frame-set-background-mode (frame-list))."
+e.g. (mapc \\='frame-set-background-mode (frame-list))."
   :group 'faces
   :set #'(lambda (var value)
           (set-default var value)
diff --git a/lisp/generic-x.el b/lisp/generic-x.el
index 56e1761..e5b4455d 100644
--- a/lisp/generic-x.el
+++ b/lisp/generic-x.el
@@ -62,7 +62,7 @@
 ;; Folding mode should use invisible text properties instead.  -- Dave
 ;; Love]
 ;;
-;; From Anders Lindgren <address@hidden>
+;; From Anders Lindgren
 ;;
 ;; Problem summary: Wayne Adams has found a problem when using folding
 ;; mode in conjunction with font-lock for a mode defined in
@@ -1315,7 +1315,7 @@ like an INI file.  You can add this hook to 
`find-file-hook'."
 ;;;    comment-start-skip           ""
        )
   ;; (set-syntax-table rul-generic-mode-syntax-table)
-  (setq font-lock-syntax-table rul-generic-mode-syntax-table))
+  (setq-local font-lock-syntax-table rul-generic-mode-syntax-table))
 
 ;; moved mode-definition behind defun-definition to be warning-free - 
15.11.02/RSan
 (define-generic-mode rul-generic-mode
diff --git a/lisp/gnus/auth-source.el b/lisp/gnus/auth-source.el
index 9d842c0..10d32d4 100644
--- a/lisp/gnus/auth-source.el
+++ b/lisp/gnus/auth-source.el
@@ -919,13 +919,15 @@ while \(:host t) would find all host entries."
   prompt)
 
 (defun auth-source-ensure-strings (values)
-  (unless (listp values)
-    (setq values (list values)))
-  (mapcar (lambda (value)
-            (if (numberp value)
-                (format "%s" value)
-              value))
-          values))
+  (if (eq values t)
+      values
+    (unless (listp values)
+      (setq values (list values)))
+    (mapcar (lambda (value)
+             (if (numberp value)
+                 (format "%s" value)
+               value))
+           values)))
 
 ;;; Backend specific parsing: netrc/authinfo backend
 
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index b1a4933..9f272f4 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -1396,7 +1396,8 @@ if it is a string, only list groups matching REGEXP."
       (gnus-group-prepare-flat-list-dead
        (gnus-union
        not-in-list
-       (setq gnus-killed-list (sort gnus-killed-list 'string<)))
+       (setq gnus-killed-list (sort gnus-killed-list 'string<))
+       :test 'equal)
        gnus-level-killed ?K regexp))
 
     (gnus-group-set-mode-line)
diff --git a/lisp/gnus/gnus-mlspl.el b/lisp/gnus/gnus-mlspl.el
index 37a5d61..cb95aac 100644
--- a/lisp/gnus/gnus-mlspl.el
+++ b/lisp/gnus/gnus-mlspl.el
@@ -122,9 +122,9 @@ clauses will be generated.
 If CATCH-ALL is nil, no catch-all handling is performed, regardless of
 catch-all marks in group parameters.  Otherwise, if there is no
 selected group whose SPLIT-REGEXP matches the empty string, nor is
-there a selected group whose SPLIT-SPEC is 'catch-all, this fancy
+there a selected group whose SPLIT-SPEC is `catch-all', this fancy
 split (say, a group name) will be appended to the returned SPLIT list,
-as the last element of a '| SPLIT.
+as the last element of a `|' SPLIT.
 
 For example, given the following group parameters:
 
diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el
index 40e2dcf..63ae2e6 100644
--- a/lisp/gnus/gnus-util.el
+++ b/lisp/gnus/gnus-util.el
@@ -1372,18 +1372,25 @@ Return the modified alist."
 
 (if (fboundp 'union)
     (defalias 'gnus-union 'union)
-  (defun gnus-union (l1 l2)
-    "Set union of lists L1 and L2."
+  (defun gnus-union (l1 l2 &rest keys)
+    "Set union of lists L1 and L2.
+If KEYS contains the `:test' and `equal' pair, use `equal' to compare
+items in lists, otherwise use `eq'."
     (cond ((null l1) l2)
          ((null l2) l1)
          ((equal l1 l2) l1)
          (t
           (or (>= (length l1) (length l2))
               (setq l1 (prog1 l2 (setq l2 l1))))
-          (while l2
-            (or (member (car l2) l1)
-                (push (car l2) l1))
-            (pop l2))
+          (if (eq 'equal (plist-get keys :test))
+              (while l2
+                (or (member (car l2) l1)
+                    (push (car l2) l1))
+                (pop l2))
+            (while l2
+              (or (memq (car l2) l1)
+                  (push (car l2) l1))
+              (pop l2)))
           l1))))
 
 (declare-function gnus-add-text-properties "gnus"
@@ -1989,6 +1996,16 @@ to case differences."
   (defun gnus-timer--function (timer)
     (elt timer 5)))
 
+(defun gnus-subsetp (list1 list2)
+  "Return t if LIST1 is a subset of LIST2.
+Similar to `subsetp' but use member for element test so that this works for
+lists of strings."
+  (when (and (listp list1) (listp list2))
+    (if list1
+       (and (member (car list1) list2)
+            (gnus-subsetp (cdr list1) list2))
+      t)))
+
 (provide 'gnus-util)
 
 ;;; gnus-util.el ends here
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 1b693d7..a6c8282 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -865,7 +865,7 @@ It may also be a function.
 
 For e.g., if you wish to set the envelope sender address so that bounces
 go to the right place or to deal with listserv's usage of that address, you
-might set this variable to '(\"-f\" \"address@hidden")."
+might set this variable to (\"-f\" \"address@hidden")."
   :group 'message-sending
   :link '(custom-manual "(message)Mail Variables")
   :type '(choice (function)
@@ -1114,7 +1114,7 @@ Note: Many newsgroups frown upon nontraditional reply 
styles. You
 probably want to set this variable only for specific groups,
 e.g. using `gnus-posting-styles':
 
-  (eval (set (make-local-variable 'message-cite-reply-position) 'above))"
+  (eval (set (make-local-variable \\='message-cite-reply-position) \\='above))"
   :version "24.1"
   :type '(choice (const :tag "Reply inline" traditional)
                 (const :tag "Reply above" above)
diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el
index 327b0e6..be56d23 100644
--- a/lisp/gnus/mm-decode.el
+++ b/lisp/gnus/mm-decode.el
@@ -393,7 +393,7 @@ enables you to choose manually one of two types those mails 
include."
 
 (defcustom mm-inline-large-images nil
   "If t, then all images fit in the buffer.
-If 'resize, try to resize the images so they fit."
+If `resize', try to resize the images so they fit."
   :type '(radio
           (const :tag "Inline large images as they are." t)
           (const :tag "Resize large images." resize)
diff --git a/lisp/gnus/mm-util.el b/lisp/gnus/mm-util.el
index ab9145f..24d3a9e 100644
--- a/lisp/gnus/mm-util.el
+++ b/lisp/gnus/mm-util.el
@@ -1074,7 +1074,7 @@ can be encoded using a single one of the corresponding 
coding systems.
 
 It treats `mm-coding-system-priorities' as the list of preferred
 coding systems; a useful example setting for this list in Western
-Europe would be '(iso-8859-1 iso-8859-15 utf-8), which would default
+Europe would be (iso-8859-1 iso-8859-15 utf-8), which would default
 to the very standard Latin 1 coding system, and only move to coding
 systems that are less supported as is necessary to encode the
 characters that exist in the buffer.
diff --git a/lisp/gnus/mml-sec.el b/lisp/gnus/mml-sec.el
index 45da937..fd01098 100644
--- a/lisp/gnus/mml-sec.el
+++ b/lisp/gnus/mml-sec.el
@@ -25,10 +25,13 @@
 
 (eval-when-compile (require 'cl))
 
+(autoload 'gnus-subsetp "gnus-util")
+(autoload 'mail-strip-quoted-names "mail-utils")
 (autoload 'mml2015-sign "mml2015")
 (autoload 'mml2015-encrypt "mml2015")
 (autoload 'mml1991-sign "mml1991")
 (autoload 'mml1991-encrypt "mml1991")
+(autoload 'message-fetch-field "message")
 (autoload 'message-goto-body "message")
 (autoload 'mml-insert-tag "mml")
 (autoload 'mml-smime-sign "mml-smime")
@@ -122,6 +125,21 @@ Whether the passphrase is cached at all is controlled by
   :group 'message
   :type 'integer)
 
+(defcustom mml-secure-safe-bcc-list nil
+  "List of e-mail addresses that are safe to use in Bcc headers.
+EasyPG encrypts e-mails to Bcc addresses, and the encrypted e-mail
+by default identifies the used encryption keys, giving away the
+Bcc'ed identities.  Clearly, this contradicts the original goal of
+*blind* copies.
+For an academic paper explaining the problem, see URL
+`http://crypto.stanford.edu/portia/papers/bb-bcc.pdf'.
+Use this variable to specify e-mail addresses whose owners do not
+mind if they are identifiable as recipients.  This may be useful if
+you use Bcc headers to encrypt e-mails to yourself."
+  :version "25.1"
+  :group 'message
+  :type '(repeat string))
+
 ;;; Configuration/helper functions
 
 (defun mml-signencrypt-style (method &optional style)
@@ -272,6 +290,36 @@ Use METHOD if given.  Else use `mml-secure-method' or
   (interactive)
   (mml-secure-part "smime"))
 
+(defun mml-secure-is-encrypted-p ()
+  "Check whether secure encrypt tag is present."
+  (save-excursion
+    (goto-char (point-min))
+    (re-search-forward
+     (concat "^" (regexp-quote mail-header-separator) "\n"
+            "<#secure[^>]+encrypt")
+     nil t)))
+
+(defun mml-secure-bcc-is-safe ()
+  "Check whether usage of Bcc is safe (or absent).
+Bcc usage is safe in two cases: first, if the current message does
+not contain an MML secure encrypt tag;
+second, if the Bcc addresses are a subset of `mml-secure-safe-bcc-list'.
+In all other cases, ask the user whether Bcc usage is safe.
+Raise error if user answers no.
+Note that this function does not produce a meaningful return value:
+either an error is raised or not."
+  (when (mml-secure-is-encrypted-p)
+    (let ((bcc (mail-strip-quoted-names (message-fetch-field "bcc"))))
+      (when bcc
+       (let ((bcc-list (mapcar #'cadr
+                               (mail-extract-address-components bcc t))))
+         (unless (gnus-subsetp bcc-list mml-secure-safe-bcc-list)
+           (unless (yes-or-no-p "Message for encryption contains Bcc header.\
+  This may give away all Bcc'ed identities to all recipients.\
+  Are you sure that this is safe?\
+  (Customize `mml-secure-safe-bcc-list' to avoid this warning.) ")
+             (error "Aborted"))))))))
+
 ;; defuns that add the proper <#secure ...> tag to the top of the message body
 (defun mml-secure-message (method &optional modesym)
   (let ((mode (prin1-to-string modesym))
diff --git a/lisp/gnus/nnml.el b/lisp/gnus/nnml.el
index 33eae1c..a2947c0 100644
--- a/lisp/gnus/nnml.el
+++ b/lisp/gnus/nnml.el
@@ -268,23 +268,6 @@ non-nil.")
                           (max (1+ (- (cdr active) (car active))) 0)
                           (car active) (cdr active) group)))))))
 
-(deffoo nnml-retrieve-groups (groups &optional server)
-  (when nnml-get-new-mail
-    (if (nnmail-get-new-mail-per-group)
-       (dolist (group groups)
-         (nnml-request-scan group server))
-      (nnml-request-scan nil server)))
-  (with-current-buffer nntp-server-buffer
-    (erase-buffer)
-    (dolist (group groups)
-      (let* ((entry (assoc group nnml-group-alist))
-            (active (nth 1 entry)))
-       (if (consp active)
-           (insert (format "211 %d %d %d %s\n"
-                           (max (1+ (- (cdr active) (car active))) 0)
-                           (car active) (cdr active) group))))))
-  'group)
-
 (deffoo nnml-request-scan (&optional group server)
   (setq nnml-article-file-alist nil)
   (nnml-possibly-change-directory group server)
diff --git a/lisp/gnus/qp.el b/lisp/gnus/qp.el
index 6c48f0f..d7ed30d 100644
--- a/lisp/gnus/qp.el
+++ b/lisp/gnus/qp.el
@@ -143,7 +143,8 @@ encode lines starting with \"From\"."
             (and (boundp 'mm-use-ultra-safe-encoding)
                  mm-use-ultra-safe-encoding)))
        (when (or fold mm-use-ultra-safe-encoding)
-         (let ((tab-width 1))          ; HTAB is one character.
+         (let ((tab-width 1)           ; HTAB is one character.
+               (case-fold-search nil))
            (goto-char (point-min))
            (while (not (eobp))
              ;; In ultra-safe mode, encode "From " at the beginning
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index 4e0bfee..e750f51 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -763,8 +763,12 @@ it is displayed along with the global value."
                (let ((from (point))
                      (line-beg (line-beginning-position))
                      (print-rep
-                      (let ((print-quoted t))
-                        (prin1-to-string val))))
+                      (let ((rep
+                             (let ((print-quoted t))
+                               (prin1-to-string val))))
+                        (if (and (symbolp val) (not (booleanp val)))
+                            (format-message "`%s'" rep)
+                          rep))))
                  (if (< (+ (length print-rep) (point) (- line-beg)) 68)
                      (insert print-rep)
                    (terpri)
@@ -997,7 +1001,10 @@ file-local variable.\n")
 ;;;###autoload
 (defun describe-symbol (symbol &optional buffer frame)
   "Display the full documentation of SYMBOL.
-Will show the info of SYMBOL as a function, variable, and/or face."
+Will show the info of SYMBOL as a function, variable, and/or face.
+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."
   (interactive
    (let* ((v-or-f (symbol-at-point))
           (found (cl-some (lambda (x) (funcall (nth 1 x) v-or-f))
@@ -1040,15 +1047,17 @@ Will show the info of SYMBOL as a function, variable, 
and/or face."
         (let ((inhibit-read-only t)
               (name (caar docs))        ;Name of doc currently at BOB.
               (doc (cdr (cadr docs))))  ;Doc to add at BOB.
-          (insert doc)
-          (delete-region (point) (progn (skip-chars-backward " \t\n") (point)))
-          (insert "\n\n"
-                  (eval-when-compile
-                    (propertize "\n" 'face '(:height 0.1 :inverse-video t)))
-                  "\n")
-          (when name
-            (insert (symbol-name symbol)
-                    " is also a " name "." "\n\n")))
+          (when doc
+            (insert doc)
+            (delete-region (point)
+                           (progn (skip-chars-backward " \t\n") (point)))
+            (insert "\n\n"
+                    (eval-when-compile
+                      (propertize "\n" 'face '(:height 0.1 :inverse-video t)))
+                    "\n")
+            (when name
+              (insert (symbol-name symbol)
+                      " is also a " name "." "\n\n"))))
         (setq docs (cdr docs)))
       (unless single
         ;; Don't record the `describe-variable' item in the stack.
diff --git a/lisp/help.el b/lisp/help.el
index c558b65..d6cfae4 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -1069,7 +1069,7 @@ is currently activated with completion."
 ;;; Automatic resizing of temporary buffers.
 (defcustom temp-buffer-max-height
   (lambda (buffer)
-    (if (eq (selected-window) (frame-root-window))
+    (if (and (display-graphic-p) (eq (selected-window) (frame-root-window)))
        (/ (x-display-pixel-height) (frame-char-height) 2)
       (/ (- (frame-height) 2) 2)))
   "Maximum height of a window displaying a temporary buffer.
@@ -1086,7 +1086,7 @@ function is called, the window to be resized is selected."
 
 (defcustom temp-buffer-max-width
   (lambda (buffer)
-    (if (eq (selected-window) (frame-root-window))
+    (if (and (display-graphic-p) (eq (selected-window) (frame-root-window)))
        (/ (x-display-pixel-width) (frame-char-width) 2)
       (/ (- (frame-width) 2) 2)))
   "Maximum width of a window displaying a temporary buffer.
diff --git a/lisp/hi-lock.el b/lisp/hi-lock.el
index 89b1204..5bab906 100644
--- a/lisp/hi-lock.el
+++ b/lisp/hi-lock.el
@@ -332,7 +332,7 @@ which can be called interactively, are:
   (See `font-lock-keywords'.)  They may be edited and re-loaded with 
\\[hi-lock-find-patterns],
   any valid `font-lock-keywords' form is acceptable.  When a file is
   loaded the patterns are read if `hi-lock-file-patterns-policy' is
-  'ask and the user responds y to the prompt, or if
+  `ask' and the user responds y to the prompt, or if
   `hi-lock-file-patterns-policy' is bound to a function and that
   function returns t.
 
diff --git a/lisp/htmlfontify.el b/lisp/htmlfontify.el
index d00fae2..3731be6 100644
--- a/lisp/htmlfontify.el
+++ b/lisp/htmlfontify.el
@@ -262,10 +262,10 @@ These functions will be called with the HTML buffer as 
the current buffer."
   :type    '(hook))
 
 (defcustom hfy-default-face-def nil
-  "Fallback `defface' specification for the face 'default, used when
+  "Fallback `defface' specification for the face `default', used when
 `hfy-display-class' has been set (the normal htmlfontify way of extracting
 potentially non-current face information doesn't necessarily work for
-'default).\n
+`default').\n
 Example: I customize this to:\n
 \((t :background \"black\" :foreground \"white\" :family \"misc-fixed\"))"
   :group   'htmlfontify
@@ -410,23 +410,23 @@ calculating a face's attributes.  This is useful when, 
for example, you
 are running Emacs on a tty or in batch mode, and want htmlfontify to have
 access to the face spec you would use if you were connected to an X display.\n
 Some valid class specification elements are:\n
-  '(class      color)
-  '(class      grayscale)
-  '(background dark)
-  '(background light)
-  '(type       x-toolkit)
-  '(type       tty)
-  '(type       motif)
-  '(type       lucid)
+  (class      color)
+  (class      grayscale)
+  (background dark)
+  (background light)
+  (type       x-toolkit)
+  (type       tty)
+  (type       motif)
+  (type       lucid)
 Multiple values for a tag may be combined, to indicate that any one or more
 of these values in the specification key constitutes a match, eg:\n
-'((class color grayscale) (type tty)) would match any of:\n
-  '((class color))
-  '((class grayscale))
-  '((class color grayscale))
-  '((class color foo))
-  '((type  tty))
-  '((type  tty) (class color))\n
+((class color grayscale) (type tty)) would match any of:\n
+  ((class color))
+  ((class grayscale))
+  ((class color grayscale))
+  ((class color foo))
+  ((type  tty))
+  ((type  tty) (class color))\n
 and so on."
   :type    '(alist :key-type (symbol) :value-type (symbol))
   :group   'htmlfontify
@@ -881,10 +881,10 @@ specify - this matches Emacs's behavior when deciding on 
which face attributes
 to use, to the best of my understanding).\n
 If CLASS is nil, then you just get whatever `face-attr-construct' returns,
 ie the current specification in effect for FACE.\n
-*NOTE*: This function forces any face that is not 'default and which has
-no :inherit property to inherit from 'default (this is because 'default
+*NOTE*: This function forces any face that is not `default' and which has
+no :inherit property to inherit from `default' (this is because `default'
 is magical in that Emacs's fonts behave as if they inherit implicitly from
-'default, but no such behavior exists in HTML/CSS).\n
+`default', but no such behavior exists in HTML/CSS).\n
 See also `hfy-display-class' for details of valid values for CLASS."
   (let ((face-spec
          (if class
diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el
index 3253a63..517e80f 100644
--- a/lisp/ibuffer.el
+++ b/lisp/ibuffer.el
@@ -129,7 +129,7 @@ own!):
 Thus, if you wanted to use these two formats, the appropriate
 value for this variable would be
 
-  '((mark \" \" name)
+  \\='((mark \" \" name)
     (mark modified read-only
           (name 16 16 :left)
           (size 6 -1 :right)))
@@ -1355,23 +1355,36 @@ group."
     (message "%s buffers marked" count))
   (ibuffer-redisplay t))
 
-(defun ibuffer-mark-forward (arg)
-  "Mark the buffer on this line, and move forward ARG lines.
+(defsubst ibuffer-get-region-and-prefix ()
+  (let ((arg (prefix-numeric-value current-prefix-arg)))
+    (if (use-region-p) (list (region-beginning) (region-end) arg)
+      (list nil nil arg))))
+
+(defun ibuffer-mark-forward (start end arg)
+  "Mark the buffers in the region, or ARG buffers.
 If point is on a group name, this function operates on that group."
-  (interactive "p")
-  (ibuffer-mark-interactive arg ibuffer-marked-char))
+  (interactive (ibuffer-get-region-and-prefix))
+  (ibuffer-mark-region-or-n-with-char start end arg ibuffer-marked-char))
 
-(defun ibuffer-unmark-forward (arg)
-  "Unmark the buffer on this line, and move forward ARG lines.
+(defun ibuffer-unmark-forward (start end arg)
+  "Unmark the buffers in the region, or ARG buffers.
 If point is on a group name, this function operates on that group."
-  (interactive "p")
-  (ibuffer-mark-interactive arg ?\s))
+  (interactive (ibuffer-get-region-and-prefix))
+  (ibuffer-mark-region-or-n-with-char start end arg ?\s))
 
 (defun ibuffer-unmark-backward (arg)
-  "Unmark the buffer on this line, and move backward ARG lines.
+  "Unmark the ARG previous buffers.
 If point is on a group name, this function operates on that group."
   (interactive "p")
-  (ibuffer-unmark-forward (- arg)))
+  (ibuffer-unmark-forward nil nil (- arg)))
+
+(defun ibuffer-mark-region-or-n-with-char (start end arg mark-char)
+  (if (use-region-p)
+      (let ((cur (point)) (line-count (count-lines start end)))
+        (goto-char start)
+        (ibuffer-mark-interactive line-count mark-char)
+        (goto-char cur))
+      (ibuffer-mark-interactive arg mark-char)))
 
 (defun ibuffer-mark-interactive (arg mark &optional movement)
   (ibuffer-assert-ibuffer-mode)
@@ -1410,16 +1423,16 @@ If point is on a group name, this function operates on 
that group."
                       (list (ibuffer-current-buffer)
                             mark))))
 
-(defun ibuffer-mark-for-delete (arg)
-  "Mark the buffers on ARG lines forward for deletion.
+(defun ibuffer-mark-for-delete (start end arg)
+  "Mark for deletion the buffers in the region, or ARG buffers.
 If point is on a group name, this function operates on that group."
-  (interactive "P")
-  (ibuffer-mark-interactive arg ibuffer-deletion-char 1))
+  (interactive (ibuffer-get-region-and-prefix))
+  (ibuffer-mark-region-or-n-with-char start end arg ibuffer-deletion-char))
 
 (defun ibuffer-mark-for-delete-backwards (arg)
-  "Mark the buffers on ARG lines backward for deletion.
+  "Mark for deletion the ARG previous buffers.
 If point is on a group name, this function operates on that group."
-  (interactive "P")
+  (interactive "p")
   (ibuffer-mark-interactive arg ibuffer-deletion-char -1))
 
 (defun ibuffer-current-buffer (&optional must-be-live)
diff --git a/lisp/ido.el b/lisp/ido.el
index 6ad354c..e2a9165 100644
--- a/lisp/ido.el
+++ b/lisp/ido.el
@@ -742,8 +742,8 @@ not provide the normal completion.  To show the 
completions, use \\[ido-toggle-i
 
 (defcustom ido-enter-matching-directory 'only
   "Additional methods to enter sub-directory of first/only matching item.
-If value is 'first, enter first matching sub-directory when typing a slash.
-If value is 'only, typing a slash only enters the sub-directory if it is
+If value is `first', enter first matching sub-directory when typing a slash.
+If value is `only', typing a slash only enters the sub-directory if it is
 the only matching item.
 If value is t, automatically enter a sub-directory when it is the only
 matching item, even without typing a slash."
@@ -755,8 +755,8 @@ matching item, even without typing a slash."
 
 (defcustom ido-create-new-buffer 'prompt
   "Specify whether a new buffer is created if no buffer matches substring.
-Choices are 'always to create new buffers unconditionally, 'prompt to
-ask user whether to create buffer, or 'never to never create new buffer."
+Choices are `always' to create new buffers unconditionally, `prompt' to
+ask user whether to create buffer, or `never' to never create new buffer."
   :type '(choice (const always)
                 (const prompt)
                 (const never))
@@ -1605,8 +1605,8 @@ With ARG, turn Ido mode on if arg is positive, off 
otherwise.
 Turning on Ido mode will remap (via a minor-mode keymap) the default
 keybindings for the `find-file' and `switch-to-buffer' families of
 commands to the Ido versions of these functions.
-However, if ARG arg equals 'files, remap only commands for files, or
-if it equals 'buffers, remap only commands for buffer switching.
+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."
   (interactive "P")
   (setq ido-mode
@@ -3491,14 +3491,12 @@ This is to make them appear as if they were \"virtual 
buffers\"."
   ;; the file which the user might thought was still open.
   (unless recentf-mode (recentf-mode 1))
   (setq ido-virtual-buffers nil)
-  (let ((bookmarks (and (boundp 'bookmark-alist)
-                        bookmark-alist))
-        name)
+  (let (name)
     (dolist (head (append
                    recentf-list
-                   (delq nil (mapcar (lambda (bookmark)
-                                       (cdr (assoc 'filename bookmark)))
-                                     bookmarks))))
+                   (and (fboundp 'bookmark-get-filename)
+                        (delq nil (mapcar #'bookmark-get-filename
+                                          (bound-and-true-p 
bookmark-alist))))))
       (setq name (file-name-nondirectory head))
       ;; In case HEAD is a directory with trailing /.  See bug#14552.
       (when (equal name "")
@@ -3559,7 +3557,9 @@ it is put to the start of the list."
     (let* ((len (1- (length dir)))
           (non-essential t)
           (compl
-           (or (file-name-all-completions "" dir)
+           (or ;; We do not want to be disturbed by "File does not
+                ;; exist" errors.
+                (ignore-errors (file-name-all-completions "" dir))
                ;; work around bug in ange-ftp.
                ;; /ftp:address@hidden: => nil
                ;; /ftp:address@hidden:./ => ok
diff --git a/lisp/ielm.el b/lisp/ielm.el
index b035432..2c5613a 100644
--- a/lisp/ielm.el
+++ b/lisp/ielm.el
@@ -1,5 +1,4 @@
-;;; -*- lexical-binding: t -*-
-;;; ielm.el --- interaction mode for Emacs Lisp
+;;; ielm.el --- interaction mode for Emacs Lisp  -*- lexical-binding: t -*-
 
 ;; Copyright (C) 1994, 2001-2015 Free Software Foundation, Inc.
 
diff --git a/lisp/image-dired.el b/lisp/image-dired.el
index c5efb33..ae3921c 100644
--- a/lisp/image-dired.el
+++ b/lisp/image-dired.el
@@ -1205,8 +1205,8 @@ comment."
 
 (defun image-dired-modify-mark-on-thumb-original-file (command)
   "Modify mark in dired buffer.
-COMMAND is one of 'mark for marking file in dired, 'unmark for
-unmarking file in dired or 'flag for flagging file for delete in
+COMMAND is one of `mark' for marking file in dired, `unmark' for
+unmarking file in dired or `flag' for flagging file for delete in
 dired."
   (let ((file-name (image-dired-original-file-name))
         (dired-buf (image-dired-associated-dired-buffer)))
diff --git a/lisp/image.el b/lisp/image.el
index 295b79f..4ee22b5 100644
--- a/lisp/image.el
+++ b/lisp/image.el
@@ -154,7 +154,7 @@ compatibility with versions of Emacs that lack the variable
 
     (let* ((load-path (image-load-path-for-library \"mh-e\" \"mh-logo.xpm\"))
            (image-load-path (cons (car load-path)
-                                  (when (boundp 'image-load-path)
+                                  (when (boundp \\='image-load-path)
                                     image-load-path))))
       (mh-tool-bar-folder-buttons-init))"
   (unless library (error "No library specified"))
diff --git a/lisp/imenu.el b/lisp/imenu.el
index 717ac63..57db686 100644
--- a/lisp/imenu.el
+++ b/lisp/imenu.el
@@ -509,7 +509,7 @@ If REVERSE is non-nil then the beginning is 100 and the end 
is 0."
 
 (defun imenu--split (list n)
   "Split LIST into sublists of max length N.
-Example (imenu--split '(1 2 3 4 5 6 7 8) 3)-> '((1 2 3) (4 5 6) (7 8))
+Example (imenu--split \\='(1 2 3 4 5 6 7 8) 3) => ((1 2 3) (4 5 6) (7 8))
 The returned list DOES NOT share structure with LIST."
   (let ((remain list)
        (result '())
diff --git a/lisp/indent.el b/lisp/indent.el
index cba8f75..cf3770f 100644
--- a/lisp/indent.el
+++ b/lisp/indent.el
@@ -610,7 +610,7 @@ See also `indent-relative-maybe'."
   "List of tab stop positions used by `tab-to-tab-stop'.
 This should be nil, or a list of integers, ordered from smallest to largest.
 It implicitly extends to infinity through repetition of the last step.
-For example, '(1 2 5) is equivalent to '(1 2 5 8 11 ...).  If the list has
+For example, (1 2 5) is equivalent to (1 2 5 8 11 ...).  If the list has
 fewer than 2 elements, `tab-width' is used as the \"last step\".
 A value of nil means a tab stop every `tab-width' columns."
   :group 'indent
diff --git a/lisp/international/mule-util.el b/lisp/international/mule-util.el
index b575c2b..c70a3ee 100644
--- a/lisp/international/mule-util.el
+++ b/lisp/international/mule-util.el
@@ -55,7 +55,8 @@
   string)
 
 (defvar truncate-string-ellipsis "..."  ;"…"
-  "String to use to indicate truncation.")
+  "String to use to indicate truncation.
+Serves as default value of ELLIPSIS argument to `truncate-string-to-width'.")
 
 ;;;###autoload
 (defun truncate-string-to-width (str end-column
diff --git a/lisp/international/ucs-normalize.el 
b/lisp/international/ucs-normalize.el
index 8839b00..de3c545 100644
--- a/lisp/international/ucs-normalize.el
+++ b/lisp/international/ucs-normalize.el
@@ -176,6 +176,13 @@
     (setq decomposition-pair-to-composition nil)
   (defvar non-starter-decompositions nil)
     (setq non-starter-decompositions nil)
+  ;; This file needs to access these 2 Unicode properties, but when we
+  ;; compile it during bootstrap, charprop.el was not built yet, and
+  ;; therefore is not yet loaded into bootstrap-emacs, so
+  ;; char-code-property-alist is nil, and get-char-code-property
+  ;; always returns nil, something the code here doesn't like.
+  (define-char-code-property 'decomposition "uni-decomposition.el")
+  (define-char-code-property 'canonical-combining-class "uni-combining.el")
   (let ((char 0) ccc decomposition)
     (mapc
      (lambda (start-end)
@@ -627,6 +634,10 @@ be decomposed."
   :pre-write-conversion 'ucs-normalize-hfs-nfd-pre-write-conversion
   )
 
+;; This is tested in dired.c:file_name_completion in order to reject
+;; false positives due to comparison of encoded file names.
+(coding-system-put 'utf-8-hfs 'decomposed-characters 't)
+
 (provide 'ucs-normalize)
 
 ;; Local Variables:
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 9f8ba8d..05dc293 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -96,8 +96,12 @@ in Isearch mode is always downcased."
 
 (defcustom search-nonincremental-instead t
   "If non-nil, do a nonincremental search instead of exiting immediately.
-Actually, `isearch-edit-string' is called to let you enter the search
-string, and RET terminates editing and does a nonincremental search."
+This affects the behavior of `isearch-exit' and any key bound to that
+command: if this variable is nil, `isearch-exit' always exits the search;
+if the value is non-nil, and the search string is empty, `isearch-exit'
+starts a nonincremental search instead.  (Actually, `isearch-edit-string'
+is called to let you enter the search string, and RET terminates editing
+and does a nonincremental search.)"
   :type 'boolean)
 
 (defcustom search-whitespace-regexp (purecopy "\\s-+")
@@ -142,9 +146,11 @@ whenever point is in one of them."
 (defcustom isearch-hide-immediately t
   "If non-nil, re-hide an invisible match right away.
 This variable makes a difference when `search-invisible' is set to `open'.
+If non-nil, invisible matches are re-hidden as soon as the match moves
+off the invisible text surrounding the match.
 If nil then do not re-hide opened invisible text when the match moves.
 Whatever the value, all opened invisible text is hidden again after exiting
-the search."
+the search, with the exception of the last successful match, if any."
   :type 'boolean)
 
 (defcustom isearch-resume-in-command-history nil
@@ -511,8 +517,6 @@ This is like `describe-bindings', but displays only Isearch 
keys."
     (define-key map "\M-r" 'isearch-toggle-regexp)
     (define-key map "\M-e" 'isearch-edit-string)
 
-    (put 'isearch-toggle-case-fold :advertised-binding "\M-sc")
-    (put 'isearch-toggle-regexp    :advertised-binding "\M-sr")
     (put 'isearch-edit-string      :advertised-binding "\M-se")
 
     (define-key map "\M-se" 'isearch-edit-string)
@@ -770,7 +774,8 @@ as a regexp.  See the command `isearch-forward' for more 
information.
 In incremental searches, a space or spaces normally matches any
 whitespace defined by the variable `search-whitespace-regexp'.
 To search for a literal space and nothing else, enter C-q SPC.
-To toggle whitespace matching, use `isearch-toggle-lax-whitespace'."
+To toggle whitespace matching, use `isearch-toggle-lax-whitespace'.
+This command does not support character folding."
   (interactive "P\np")
   (isearch-mode t (null not-regexp) nil (not no-recursive-edit)))
 
@@ -779,7 +784,9 @@ To toggle whitespace matching, use 
`isearch-toggle-lax-whitespace'."
 With a prefix argument, do a regular string search instead.
 Like ordinary incremental search except that your input is treated
 as a sequence of words without regard to how the words are separated.
-See the command `isearch-forward' for more information."
+See the command `isearch-forward' for more information.
+This command does not support character folding, and lax space matching
+has no effect on it."
   (interactive "P\np")
   (isearch-mode t nil nil (not no-recursive-edit) (null not-word)))
 
@@ -788,7 +795,9 @@ See the command `isearch-forward' for more information."
 The prefix argument is currently unused.
 Like ordinary incremental search except that your input is treated
 as a symbol surrounded by symbol boundary constructs \\_< and \\_>.
-See the command `isearch-forward' for more information."
+See the command `isearch-forward' for more information.
+This command does not support character folding, and lax space matching
+has no effect on it."
   (interactive "P\np")
   (isearch-mode t nil nil (not no-recursive-edit) 'isearch-symbol-regexp))
 
@@ -803,7 +812,7 @@ See the command `isearch-forward' for more information."
   "Do incremental search backward for regular expression.
 With a prefix argument, do a regular string search instead.
 Like ordinary incremental search except that your input is treated
-as a regexp.  See the command `isearch-forward' for more information."
+as a regexp.  See the command `isearch-forward-regexp' for more information."
   (interactive "P\np")
   (isearch-mode nil (null not-regexp) nil (not no-recursive-edit)))
 
@@ -952,7 +961,8 @@ used to set the value of `isearch-regexp-function'."
 
 (defun isearch-update ()
   "This is called after every isearch command to update the display.
-The last thing it does is to run `isearch-update-post-hook'."
+The second last thing it does is to run `isearch-update-post-hook'.
+The last thing is to trigger a new round of lazy highlighting."
   (unless (eq (current-buffer) isearch--current-buffer)
     (when (buffer-live-p isearch--current-buffer)
       (with-current-buffer isearch--current-buffer
@@ -969,12 +979,10 @@ The last thing it does is to run 
`isearch-update-post-hook'."
           (null executing-kbd-macro))
       (progn
         (if (not (input-pending-p))
-           (if isearch-message-function
-               (funcall isearch-message-function)
-             (isearch-message)))
+          (funcall (or isearch-message-function #'isearch-message)))
         (if (and isearch-slow-terminal-mode
                  (not (or isearch-small-window
-                          (pos-visible-in-window-p))))
+                          (pos-visible-in-window-group-p))))
             (let ((found-point (point)))
               (setq isearch-small-window t)
               (move-to-window-line 0)
@@ -995,10 +1003,10 @@ The last thing it does is to run 
`isearch-update-post-hook'."
          (let ((current-scroll (window-hscroll))
                visible-p)
            (set-window-hscroll (selected-window) isearch-start-hscroll)
-           (setq visible-p (pos-visible-in-window-p nil nil t))
+           (setq visible-p (pos-visible-in-window-group-p nil nil t))
            (if (or (not visible-p)
                    ;; When point is not visible because of hscroll,
-                   ;; pos-visible-in-window-p returns non-nil, but
+                   ;; pos-visible-in-window-group-p returns non-nil, but
                    ;; the X coordinate it returns is 1 pixel beyond
                    ;; the last visible one.
                    (>= (car visible-p) (window-body-width nil t)))
@@ -1011,12 +1019,12 @@ The last thing it does is to run 
`isearch-update-post-hook'."
   (setq ;; quit-flag nil  not for isearch-mode
    isearch-adjusted nil
    isearch-yank-flag nil)
-  (when isearch-lazy-highlight
-    (isearch-lazy-highlight-new-loop))
   ;; We must prevent the point moving to the end of composition when a
   ;; part of the composition has just been searched.
   (setq disable-point-adjustment t)
-  (run-hooks 'isearch-update-post-hook))
+  (run-hooks 'isearch-update-post-hook)
+  (when isearch-lazy-highlight
+    (isearch-lazy-highlight-new-loop)))
 
 (defun isearch-done (&optional nopush edit)
   "Exit Isearch mode.
@@ -1049,7 +1057,7 @@ NOPUSH is t and EDIT is t."
   (setq minibuffer-message-timeout isearch-original-minibuffer-message-timeout)
   (isearch-dehighlight)
   (lazy-highlight-cleanup lazy-highlight-cleanup)
-  (let ((found-start (window-start))
+  (let ((found-start (window-group-start))
        (found-point (point)))
     (when isearch-window-configuration
       (set-window-configuration isearch-window-configuration)
@@ -1059,7 +1067,7 @@ NOPUSH is t and EDIT is t."
        ;; This has an annoying side effect of clearing the last_modiff
        ;; field of the window, which can cause unwanted scrolling,
        ;; so don't do it unless truly necessary.
-       (set-window-start (selected-window) found-start t))))
+       (set-window-group-start (selected-window) found-start t))))
 
   (setq isearch-mode nil)
   (if isearch-input-method-local-p
@@ -1207,6 +1215,14 @@ If MSG is non-nil, use variable `isearch-message', 
otherwise `isearch-string'."
          (length succ-msg)
        0))))
 
+(defvar isearch-new-regexp-function nil
+  "Holds the next `isearch-regexp-function' inside `with-isearch-suspended'.
+If this is set inside code wrapped by the macro
+`with-isearch-suspended', then the value set will be used as the
+`isearch-regexp-function' once isearch resumes.")
+(define-obsolete-variable-alias 'isearch-new-word
+  'isearch-new-regexp-function "25.1")
+
 (defmacro with-isearch-suspended (&rest body)
   "Exit Isearch mode, run BODY, and reinvoke the pending search.
 You can update the global isearch variables by setting new values to
@@ -1282,13 +1298,6 @@ You can update the global isearch variables by setting 
new values to
          (unwind-protect
              (progn ,@body)
 
-           ;; Set point at the start (end) of old match if forward (backward),
-           ;; so after exiting minibuffer isearch resumes at the start (end)
-           ;; of this match and can find it again.
-           (if (and old-other-end (eq old-point (point))
-                    (eq isearch-forward isearch-new-forward))
-               (goto-char old-other-end))
-
            ;; Always resume isearching by restarting it.
            (isearch-mode isearch-forward
                          isearch-regexp
@@ -1301,7 +1310,17 @@ You can update the global isearch variables by setting 
new values to
                  isearch-message isearch-new-message
                  isearch-forward isearch-new-forward
                  isearch-regexp-function isearch-new-regexp-function
-                 isearch-case-fold-search isearch-new-case-fold))
+                 isearch-case-fold-search isearch-new-case-fold)
+
+           ;; Restore the minibuffer message before moving point.
+            (funcall (or isearch-message-function #'isearch-message) nil t)
+
+           ;; Set point at the start (end) of old match if forward (backward),
+           ;; so after exiting minibuffer isearch resumes at the start (end)
+           ;; of this match and can find it again.
+           (if (and old-other-end (eq old-point (point))
+                    (eq isearch-forward isearch-new-forward))
+               (goto-char old-other-end)))
 
          ;; Empty isearch-string means use default.
          (when (= 0 (length isearch-string))
@@ -1490,14 +1509,15 @@ Use `isearch-exit' to quit without signaling."
 ;;; Toggles for `isearch-regexp-function' and `search-default-regexp-mode'.
 (defmacro isearch-define-mode-toggle (mode key function &optional docstring 
&rest body)
   "Define a command called `isearch-toggle-MODE' and bind it to `M-s KEY'.
-The first line of the docstring is auto-generated, the remainder
-may be provided in DOCSTRING.
+The first line of the command's docstring is auto-generated, the
+remainder may be provided in DOCSTRING.
 If FUNCTION is a symbol, this command first toggles the value of
 `isearch-regexp-function' between nil and FUNCTION.  Also set the
 `isearch-message-prefix' property of FUNCTION.
 The command then executes BODY and updates the isearch prompt."
   (declare (indent defun))
-  (let ((command-name (intern (format "isearch-toggle-%s" mode))))
+  (let ((command-name (intern (format "isearch-toggle-%s" mode)))
+        (key (concat "\M-s" key)))
     `(progn
        (defun ,command-name ()
          ,(format "Toggle %s searching on or off.%s" mode
@@ -1511,17 +1531,21 @@ The command then executes BODY and updates the isearch 
prompt."
          ,@body
          (setq isearch-success t isearch-adjusted t)
          (isearch-update))
-       (define-key isearch-mode-map ,(concat "\M-s" key) #',command-name)
+       (define-key isearch-mode-map ,key #',command-name)
        ,@(when (symbolp function)
            `((put ',function 'isearch-message-prefix ,(format "%s " mode))
+             (put ',function :advertised-binding ,key)
              (cl-callf (lambda (types) (cons 'choice
                                         (cons '(const :tag ,(capitalize 
(format "%s search" mode)) ,function)
                                               (cdr types))))
                  (get 'search-default-regexp-mode 'custom-type)))))))
 
-(isearch-define-mode-toggle word "w" word-search-regexp)
-(isearch-define-mode-toggle symbol "_" isearch-symbol-regexp)
-(isearch-define-mode-toggle character-fold "'" character-fold-to-regexp)
+(isearch-define-mode-toggle word "w" word-search-regexp "\
+Turning on word search turns off regexp mode.")
+(isearch-define-mode-toggle symbol "_" isearch-symbol-regexp "\
+Turning on symbol search turns off regexp mode.")
+(isearch-define-mode-toggle character-fold "'" character-fold-to-regexp "\
+Turning on character-folding turns off regexp mode.")
 (put 'character-fold-to-regexp 'isearch-message-prefix "char-fold ")
 
 (isearch-define-mode-toggle regexp "r" nil nil
@@ -1604,7 +1628,9 @@ Optional fourth argument is repeat count--search for 
successive occurrences.
 
 Relies on the function `word-search-regexp' to convert a sequence
 of words in STRING to a regexp used to search words without regard
-to punctuation."
+to punctuation.
+This command does not support character folding, and lax space matching
+has no effect on it."
   (interactive "sWord search backward: ")
   (re-search-backward (word-search-regexp string nil) bound noerror count))
 
@@ -1619,7 +1645,9 @@ Optional fourth argument is repeat count--search for 
successive occurrences.
 
 Relies on the function `word-search-regexp' to convert a sequence
 of words in STRING to a regexp used to search words without regard
-to punctuation."
+to punctuation.
+This command does not support character folding, and lax space matching
+has no effect on it."
   (interactive "sWord search: ")
   (re-search-forward (word-search-regexp string nil) bound noerror count))
 
@@ -1638,7 +1666,9 @@ Optional fourth argument is repeat count--search for 
successive occurrences.
 
 Relies on the function `word-search-regexp' to convert a sequence
 of words in STRING to a regexp used to search words without regard
-to punctuation."
+to punctuation.
+This command does not support character folding, and lax space matching
+has no effect on it."
   (interactive "sWord search backward: ")
   (re-search-backward (word-search-regexp string t) bound noerror count))
 
@@ -1657,7 +1687,9 @@ Optional fourth argument is repeat count--search for 
successive occurrences.
 
 Relies on the function `word-search-regexp' to convert a sequence
 of words in STRING to a regexp used to search words without regard
-to punctuation."
+to punctuation.
+This command does not support character folding, and lax space matching
+has no effect on it."
   (interactive "sWord search: ")
   (re-search-forward (word-search-regexp string t) bound noerror count))
 
@@ -1828,7 +1860,13 @@ characters in that string."
                 isearch-regexp-lax-whitespace
               isearch-lax-whitespace)
             search-whitespace-regexp)))
-    (occur regexp nlines)))
+    (occur (if isearch-regexp-function
+              (propertize regexp
+                          'isearch-string isearch-string
+                          'isearch-regexp-function-descr
+                           (isearch--describe-regexp-mode 
isearch-regexp-function))
+            regexp)
+          nlines)))
 
 (declare-function hi-lock-read-face-name "hi-lock" ())
 
@@ -1895,6 +1933,8 @@ If search string is empty, just beep."
                                            (length isearch-string))))
           isearch-message (mapconcat 'isearch-text-char-description
                                      isearch-string "")))
+  ;; Do the following before moving point.
+  (funcall (or isearch-message-function #'isearch-message) nil t)
   ;; Use the isearch-other-end as new starting point to be able
   ;; to find the remaining part of the search string again.
   ;; This is like what `isearch-search-and-update' does,
@@ -2071,6 +2111,8 @@ With argument, add COUNT copies of the character."
              (setq isearch-case-fold-search
                    (isearch-no-upper-case-p isearch-string isearch-regexp))))
       ;; Not regexp, not reverse, or no match at point.
+      ;; Do the following before moving point.
+      (funcall (or isearch-message-function #'isearch-message) nil t)
       (if (and isearch-other-end (not isearch-adjusted))
          (goto-char (if isearch-forward isearch-other-end
                       (min isearch-opoint
@@ -2237,10 +2279,12 @@ Return nil if it's completely visible, or if point is 
visible,
 together with as much of the search string as will fit; the symbol
 `above' if we need to scroll the text downwards; the symbol `below',
 if upwards."
-  (let ((w-start (window-start))
-        (w-end (window-end nil t))
-        (w-L1 (save-excursion (move-to-window-line 1) (point)))
-        (w-L-1 (save-excursion (move-to-window-line -1) (point)))
+  (let ((w-start (window-group-start))
+        (w-end (window-group-end nil t))
+        (w-L1 (save-excursion
+                (save-selected-window (move-to-window-group-line 1) (point))))
+        (w-L-1 (save-excursion
+                 (save-selected-window (move-to-window-group-line -1) 
(point))))
         start end)                  ; start and end of search string in buffer
     (if isearch-forward
         (setq end isearch-point  start (or isearch-other-end isearch-point))
@@ -2267,15 +2311,15 @@ the bottom."
     (if above
         (progn
           (goto-char start)
-          (recenter 0)
-          (when (>= isearch-point (window-end nil t))
+          (recenter-window-group 0)
+          (when (>= isearch-point (window-group-end nil t))
             (goto-char isearch-point)
-            (recenter -1)))
+            (recenter-window-group -1)))
       (goto-char end)
-      (recenter -1)
-      (when (< isearch-point (window-start))
+      (recenter-window-group -1)
+      (when (< isearch-point (window-group-start))
         (goto-char isearch-point)
-        (recenter 0))))
+        (recenter-window-group 0))))
   (goto-char isearch-point))
 
 (defvar isearch-pre-scroll-point nil)
@@ -2422,6 +2466,7 @@ Search is updated accordingly."
   (isearch-ring-adjust1 advance)
   (if search-ring-update
       (progn
+        (funcall (or isearch-message-function #'isearch-message) nil t)
        (isearch-search)
        (isearch-push-state)
        (isearch-update))
@@ -2494,6 +2539,13 @@ If there is no completion possible, say so and continue 
searching."
 
 (defun isearch-message (&optional c-q-hack ellipsis)
   ;; Generate and print the message string.
+
+  ;; N.B.: This function should always be called with point at the
+  ;; search point, because in certain (rare) circumstances, undesired
+  ;; scrolling can happen when point is elsewhere.  These
+  ;; circumstances are when follow-mode is active, the search string
+  ;; spans two (or several) windows, and the message about to be
+  ;; displayed will cause the echo area to expand.
   (let ((cursor-in-echo-area ellipsis)
        (m isearch-message)
        (fail-pos (isearch-fail-pos t)))
@@ -2623,16 +2675,23 @@ Can be changed via `isearch-search-fun-function' for 
special needs."
                                        (isearch-regexp 
isearch-regexp-lax-whitespace)
                                        (t isearch-lax-whitespace))
                                   search-whitespace-regexp)))
-      (funcall
-       (if isearch-forward #'re-search-forward #'re-search-backward)
-       (cond (isearch-regexp-function
-              (let ((lax (isearch--lax-regexp-function-p)))
-                (if (functionp isearch-regexp-function)
-                    (funcall isearch-regexp-function string lax)
-                  (word-search-regexp string lax))))
-             (isearch-regexp string)
-             (t (regexp-quote string)))
-       bound noerror count))))
+      (condition-case er
+          (funcall
+           (if isearch-forward #'re-search-forward #'re-search-backward)
+           (cond (isearch-regexp-function
+                  (let ((lax (isearch--lax-regexp-function-p)))
+                    (if (functionp isearch-regexp-function)
+                        (funcall isearch-regexp-function string lax)
+                      (word-search-regexp string lax))))
+                 (isearch-regexp string)
+                 (t (regexp-quote string)))
+           bound noerror count)
+        (search-failed
+         (signal (car er)
+                 (let ((prefix (get isearch-regexp-function 
'isearch-message-prefix)))
+                   (if (and isearch-regexp-function (stringp prefix))
+                       (list (format "%s   [using %ssearch]" string prefix))
+                     (cdr er)))))))))
 
 (defun isearch-search-string (string bound noerror)
   "Search for the first occurrence of STRING or its translation.
@@ -2680,9 +2739,6 @@ update the match data, and return point."
 
 (defun isearch-search ()
   ;; Do the search with the current search string.
-  (if isearch-message-function
-      (funcall isearch-message-function nil t)
-    (isearch-message nil t))
   (if (and (eq isearch-case-fold-search t) search-upper-case)
       (setq isearch-case-fold-search
            (isearch-no-upper-case-p isearch-string isearch-regexp)))
@@ -2980,6 +3036,7 @@ since they have special meaning in a regexp."
 (defvar isearch-lazy-highlight-timer nil)
 (defvar isearch-lazy-highlight-last-string nil)
 (defvar isearch-lazy-highlight-window nil)
+(defvar isearch-lazy-highlight-window-group nil)
 (defvar isearch-lazy-highlight-window-start nil)
 (defvar isearch-lazy-highlight-window-end nil)
 (defvar isearch-lazy-highlight-case-fold-search nil)
@@ -3021,8 +3078,8 @@ by other Emacs features."
              (sit-for 0)         ;make sure (window-start) is credible
              (or (not (equal isearch-string
                              isearch-lazy-highlight-last-string))
-                 (not (eq (selected-window)
-                          isearch-lazy-highlight-window))
+                 (not (memq (selected-window)
+                            isearch-lazy-highlight-window-group))
                 (not (eq isearch-lazy-highlight-case-fold-search
                          isearch-case-fold-search))
                 (not (eq isearch-lazy-highlight-regexp
@@ -3033,9 +3090,9 @@ by other Emacs features."
                          isearch-lax-whitespace))
                 (not (eq isearch-lazy-highlight-regexp-lax-whitespace
                          isearch-regexp-lax-whitespace))
-                 (not (= (window-start)
+                 (not (= (window-group-start)
                          isearch-lazy-highlight-window-start))
-                 (not (= (window-end)   ; Window may have been split/joined.
+                 (not (= (window-group-end) ; Window may have been 
split/joined.
                         isearch-lazy-highlight-window-end))
                 (not (eq isearch-forward
                          isearch-lazy-highlight-forward))
@@ -3043,7 +3100,7 @@ by other Emacs features."
                 (not (equal isearch-error
                             isearch-lazy-highlight-error))))
     ;; something important did indeed change
-    (lazy-highlight-cleanup t) ;kill old loop & remove overlays
+    (lazy-highlight-cleanup t)        ;kill old loop & remove overlays
     (setq isearch-lazy-highlight-error isearch-error)
     ;; It used to check for `(not isearch-error)' here, but actually
     ;; lazy-highlighting might find matches to highlight even when
@@ -3051,8 +3108,9 @@ by other Emacs features."
     (setq isearch-lazy-highlight-start-limit beg
          isearch-lazy-highlight-end-limit end)
     (setq isearch-lazy-highlight-window       (selected-window)
-         isearch-lazy-highlight-window-start (window-start)
-         isearch-lazy-highlight-window-end   (window-end)
+          isearch-lazy-highlight-window-group (selected-window-group)
+         isearch-lazy-highlight-window-start (window-group-start)
+         isearch-lazy-highlight-window-end   (window-group-end)
          ;; Start lazy-highlighting at the beginning of the found
          ;; match (`isearch-other-end').  If no match, use point.
          ;; One of the next two variables (depending on search direction)
@@ -3070,10 +3128,10 @@ by other Emacs features."
          isearch-lazy-highlight-regexp-lax-whitespace 
isearch-regexp-lax-whitespace
          isearch-lazy-highlight-regexp-function  isearch-regexp-function
          isearch-lazy-highlight-forward      isearch-forward)
-      (unless (equal isearch-string "")
-       (setq isearch-lazy-highlight-timer
-             (run-with-idle-timer lazy-highlight-initial-delay nil
-                                  'isearch-lazy-highlight-update)))))
+    (unless (equal isearch-string "")
+      (setq isearch-lazy-highlight-timer
+            (run-with-idle-timer lazy-highlight-initial-delay nil
+                                 'isearch-lazy-highlight-update)))))
 
 (defun isearch-lazy-highlight-search ()
   "Search ahead for the next or previous match, for lazy highlighting.
@@ -3096,13 +3154,13 @@ Attempt to do the search exactly the way the pending 
Isearch would."
                                (+ isearch-lazy-highlight-start
                                   ;; Extend bound to match whole string at 
point
                                   (1- (length 
isearch-lazy-highlight-last-string)))
-                             (window-end)))
+                             (window-group-end)))
                     (max (or isearch-lazy-highlight-start-limit (point-min))
                          (if isearch-lazy-highlight-wrapped
                              (- isearch-lazy-highlight-end
                                 ;; Extend bound to match whole string at point
                                 (1- (length 
isearch-lazy-highlight-last-string)))
-                           (window-start))))))
+                           (window-group-start))))))
        ;; Use a loop like in `isearch-search'.
        (while retry
          (setq success (isearch-search-string
@@ -3126,7 +3184,7 @@ Attempt to do the search exactly the way the pending 
Isearch would."
     (with-local-quit
       (save-selected-window
        (if (and (window-live-p isearch-lazy-highlight-window)
-                (not (eq (selected-window) isearch-lazy-highlight-window)))
+                (not (memq (selected-window) 
isearch-lazy-highlight-window-group)))
            (select-window isearch-lazy-highlight-window))
        (save-excursion
          (save-match-data
@@ -3146,12 +3204,12 @@ Attempt to do the search exactly the way the pending 
Isearch would."
                          (if isearch-lazy-highlight-forward
                              (if (= mb (if isearch-lazy-highlight-wrapped
                                            isearch-lazy-highlight-start
-                                         (window-end)))
+                                         (window-group-end)))
                                  (setq found nil)
                                (forward-char 1))
                            (if (= mb (if isearch-lazy-highlight-wrapped
                                          isearch-lazy-highlight-end
-                                       (window-start)))
+                                       (window-group-start)))
                                (setq found nil)
                              (forward-char -1)))
 
@@ -3161,8 +3219,8 @@ Attempt to do the search exactly the way the pending 
Isearch would."
                          ;; 1000 is higher than ediff's 100+,
                          ;; but lower than isearch main overlay's 1001
                          (overlay-put ov 'priority 1000)
-                         (overlay-put ov 'face lazy-highlight-face)
-                         (overlay-put ov 'window (selected-window))))
+                         (overlay-put ov 'face lazy-highlight-face)))
+                         ;(overlay-put ov 'window (selected-window))))
                      ;; Remember the current position of point for
                      ;; the next call of `isearch-lazy-highlight-update'
                      ;; when `lazy-highlight-max-at-a-time' is too small.
@@ -3178,12 +3236,12 @@ Attempt to do the search exactly the way the pending 
Isearch would."
                      (setq isearch-lazy-highlight-wrapped t)
                      (if isearch-lazy-highlight-forward
                          (progn
-                           (setq isearch-lazy-highlight-end (window-start))
+                           (setq isearch-lazy-highlight-end 
(window-group-start))
                            (goto-char (max (or 
isearch-lazy-highlight-start-limit (point-min))
-                                           (window-start))))
-                       (setq isearch-lazy-highlight-start (window-end))
+                                           (window-group-start))))
+                       (setq isearch-lazy-highlight-start (window-group-end))
                        (goto-char (min (or isearch-lazy-highlight-end-limit 
(point-max))
-                                       (window-end))))))))
+                                       (window-group-end))))))))
            (unless nomore
              (setq isearch-lazy-highlight-timer
                    (run-at-time lazy-highlight-interval nil
diff --git a/lisp/json.el b/lisp/json.el
index 0214a3e..85827b5 100644
--- a/lisp/json.el
+++ b/lisp/json.el
@@ -149,7 +149,7 @@ respectively.")
   (null list))
 
 (defun json-plist-p (list)
-  "Non-null if and only if LIST is a plist."
+  "Non-null if and only if LIST is a plist with keyword keys."
   (while (consp list)
     (setq list (if (and (keywordp (car list))
                         (consp (cdr list)))
diff --git a/lisp/language/hebrew.el b/lisp/language/hebrew.el
index a3f4b3d..05f2f25 100644
--- a/lisp/language/hebrew.el
+++ b/lisp/language/hebrew.el
@@ -216,24 +216,26 @@ Bidirectional editing is supported.")))
          (setq idx 1 nglyphs nchars))
        ;; Now IDX is an index to the first non-precomposed glyph.
        ;; Adjust positions of the remaining glyphs artificially.
-       (setq base-width (lglyph-width (lgstring-glyph gstring 0)))
-       (while (< idx nglyphs)
-         (setq glyph (lgstring-glyph gstring idx))
-         (lglyph-set-from-to glyph 0 (1- nchars))
-         (if (>= (lglyph-lbearing glyph) (lglyph-width glyph))
-             ;; It seems that this glyph is designed to be rendered
-             ;; before the base glyph.
-             (lglyph-set-adjustment glyph (- base-width) 0 0)
-           (if (>= (lglyph-lbearing glyph) 0)
-               ;; Align the horizontal center of this glyph to the
-               ;; horizontal center of the base glyph.
-               (let ((width (- (lglyph-rbearing glyph)
-                               (lglyph-lbearing glyph))))
-                 (lglyph-set-adjustment glyph
-                                        (- (/ (- base-width width) 2)
-                                           (lglyph-lbearing glyph)
-                                           base-width) 0 0))))
-         (setq idx (1+ idx))))))
+        (if (font-get font :combining-capability)
+            (font-shape-gstring gstring)
+          (setq base-width (lglyph-width (lgstring-glyph gstring 0)))
+          (while (< idx nglyphs)
+            (setq glyph (lgstring-glyph gstring idx))
+            (lglyph-set-from-to glyph 0 (1- nchars))
+            (if (>= (lglyph-lbearing glyph) (lglyph-width glyph))
+                ;; It seems that this glyph is designed to be rendered
+                ;; before the base glyph.
+                (lglyph-set-adjustment glyph (- base-width) 0 0)
+              (if (>= (lglyph-lbearing glyph) 0)
+                  ;; Align the horizontal center of this glyph to the
+                  ;; horizontal center of the base glyph.
+                  (let ((width (- (lglyph-rbearing glyph)
+                                  (lglyph-lbearing glyph))))
+                    (lglyph-set-adjustment glyph
+                                           (- (/ (- base-width width) 2)
+                                              (lglyph-lbearing glyph)
+                                              base-width) 0 0))))
+            (setq idx (1+ idx)))))))
     gstring))
 
 (let* ((base "[\u05D0-\u05F2]")
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index 4691056..f0c65fa 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -3,7 +3,7 @@
 ;;; Code:
 
 
-;;;### (autoloads nil "5x5" "play/5x5.el" (22026 25907 631502 692000))
+;;;### (autoloads nil "5x5" "play/5x5.el" (22086 11930 122062 731000))
 ;;; Generated autoloads from play/5x5.el
 
 (autoload '5x5 "5x5" "\
@@ -65,8 +65,8 @@ should return a grid vector array that is the new solution.
 
 ;;;***
 
-;;;### (autoloads nil "ada-mode" "progmodes/ada-mode.el" (22011 58553
-;;;;;;  865858 469000))
+;;;### (autoloads nil "ada-mode" "progmodes/ada-mode.el" (22086 11930
+;;;;;;  138062 731000))
 ;;; Generated autoloads from progmodes/ada-mode.el
 
 (autoload 'ada-add-extensions "ada-mode" "\
@@ -85,8 +85,8 @@ Ada mode is the major mode for editing Ada code.
 
 ;;;***
 
-;;;### (autoloads nil "ada-stmt" "progmodes/ada-stmt.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "ada-stmt" "progmodes/ada-stmt.el" (22086 11930
+;;;;;;  138062 731000))
 ;;; Generated autoloads from progmodes/ada-stmt.el
 
 (autoload 'ada-header "ada-stmt" "\
@@ -96,8 +96,8 @@ Insert a descriptive header at the top of the file.
 
 ;;;***
 
-;;;### (autoloads nil "ada-xref" "progmodes/ada-xref.el" (22011 58553
-;;;;;;  869858 469000))
+;;;### (autoloads nil "ada-xref" "progmodes/ada-xref.el" (22086 11930
+;;;;;;  138062 731000))
 ;;; Generated autoloads from progmodes/ada-xref.el
 
 (autoload 'ada-find-file "ada-xref" "\
@@ -108,8 +108,8 @@ Completion is available.
 
 ;;;***
 
-;;;### (autoloads nil "add-log" "vc/add-log.el" (22011 58554 85858
-;;;;;;  469000))
+;;;### (autoloads nil "add-log" "vc/add-log.el" (22086 11930 366062
+;;;;;;  731000))
 ;;; Generated autoloads from vc/add-log.el
 
 (put 'change-log-default-name 'safe-local-variable 'string-or-null-p)
@@ -238,8 +238,8 @@ old-style time formats for entries are supported.
 
 ;;;***
 
-;;;### (autoloads nil "advice" "emacs-lisp/advice.el" (22011 58553
-;;;;;;  345858 469000))
+;;;### (autoloads nil "advice" "emacs-lisp/advice.el" (22092 27717
+;;;;;;  604268 464000))
 ;;; Generated autoloads from emacs-lisp/advice.el
 
 (defvar ad-redefinition-action 'warn "\
@@ -374,7 +374,7 @@ usage: (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] 
FLAG...)
 
 ;;;***
 
-;;;### (autoloads nil "align" "align.el" (21998 46516 830024 649000))
+;;;### (autoloads nil "align" "align.el" (22086 11929 490062 731000))
 ;;; Generated autoloads from align.el
 
 (autoload 'align "align" "\
@@ -477,7 +477,7 @@ A replacement function for `newline-and-indent', aligning 
as it goes.
 
 ;;;***
 
-;;;### (autoloads nil "allout" "allout.el" (22015 55603 653705 321000))
+;;;### (autoloads nil "allout" "allout.el" (22086 11929 494062 731000))
 ;;; Generated autoloads from allout.el
 (push (purecopy '(allout 2 3)) package--builtin-versions)
 
@@ -837,8 +837,8 @@ for details on preparing Emacs for automatic allout 
activation.
 
 ;;;***
 
-;;;### (autoloads nil "allout-widgets" "allout-widgets.el" (21998
-;;;;;;  46516 830024 649000))
+;;;### (autoloads nil "allout-widgets" "allout-widgets.el" (22086
+;;;;;;  11929 490062 731000))
 ;;; Generated autoloads from allout-widgets.el
 (push (purecopy '(allout-widgets 1 0)) package--builtin-versions)
 
@@ -896,8 +896,8 @@ outline hot-spot navigation (see `allout-mode').
 
 ;;;***
 
-;;;### (autoloads nil "ange-ftp" "net/ange-ftp.el" (22011 58553 761858
-;;;;;;  469000))
+;;;### (autoloads nil "ange-ftp" "net/ange-ftp.el" (22092 27717 960268
+;;;;;;  464000))
 ;;; Generated autoloads from net/ange-ftp.el
 
 (defalias 'ange-ftp-re-read-dir 'ange-ftp-reread-dir)
@@ -918,8 +918,8 @@ directory, so that Emacs will know its current contents.
 
 ;;;***
 
-;;;### (autoloads nil "animate" "play/animate.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "animate" "play/animate.el" (22086 11930 122062
+;;;;;;  731000))
 ;;; Generated autoloads from play/animate.el
 
 (autoload 'animate-string "animate" "\
@@ -951,8 +951,8 @@ the buffer *Birthday-Present-for-Name*.
 
 ;;;***
 
-;;;### (autoloads nil "ansi-color" "ansi-color.el" (21952 37178 110214
-;;;;;;  961000))
+;;;### (autoloads nil "ansi-color" "ansi-color.el" (22086 11929 494062
+;;;;;;  731000))
 ;;; Generated autoloads from ansi-color.el
 (push (purecopy '(ansi-color 3 4 2)) package--builtin-versions)
 
@@ -978,8 +978,8 @@ This is a good function to put in 
`comint-output-filter-functions'.
 
 ;;;***
 
-;;;### (autoloads nil "antlr-mode" "progmodes/antlr-mode.el" (22011
-;;;;;;  58553 873858 469000))
+;;;### (autoloads nil "antlr-mode" "progmodes/antlr-mode.el" (22086
+;;;;;;  11930 138062 731000))
 ;;; Generated autoloads from progmodes/antlr-mode.el
 (push (purecopy '(antlr-mode 2 2 3)) package--builtin-versions)
 
@@ -1015,8 +1015,8 @@ Used in `antlr-mode'.  Also a useful function in 
`java-mode-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "appt" "calendar/appt.el" (21998 46516 878024
-;;;;;;  649000))
+;;;### (autoloads nil "appt" "calendar/appt.el" (22086 11929 526062
+;;;;;;  731000))
 ;;; Generated autoloads from calendar/appt.el
 
 (autoload 'appt-add "appt" "\
@@ -1037,8 +1037,8 @@ ARG is positive, otherwise off.
 
 ;;;***
 
-;;;### (autoloads nil "apropos" "apropos.el" (21998 46516 834024
-;;;;;;  649000))
+;;;### (autoloads nil "apropos" "apropos.el" (22099 26170 362017
+;;;;;;  16000))
 ;;; Generated autoloads from apropos.el
 
 (autoload 'apropos-read-pattern "apropos" "\
@@ -1153,8 +1153,8 @@ Returns list of symbols and documentation found.
 
 ;;;***
 
-;;;### (autoloads nil "arc-mode" "arc-mode.el" (22085 50883 177731
-;;;;;;  271000))
+;;;### (autoloads nil "arc-mode" "arc-mode.el" (22086 11929 494062
+;;;;;;  731000))
 ;;; Generated autoloads from arc-mode.el
 
 (autoload 'archive-mode "arc-mode" "\
@@ -1174,7 +1174,7 @@ archive.
 
 ;;;***
 
-;;;### (autoloads nil "array" "array.el" (21670 32330 885624 725000))
+;;;### (autoloads nil "array" "array.el" (22086 11929 494062 731000))
 ;;; Generated autoloads from array.el
 
 (autoload 'array-mode "array" "\
@@ -1245,8 +1245,8 @@ Entering array mode calls the function `array-mode-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "artist" "textmodes/artist.el" (21906 58826
-;;;;;;  78640 200000))
+;;;### (autoloads nil "artist" "textmodes/artist.el" (22086 11930
+;;;;;;  310062 731000))
 ;;; Generated autoloads from textmodes/artist.el
 (push (purecopy '(artist 1 2 6)) package--builtin-versions)
 
@@ -1452,8 +1452,8 @@ Keymap summary
 
 ;;;***
 
-;;;### (autoloads nil "asm-mode" "progmodes/asm-mode.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "asm-mode" "progmodes/asm-mode.el" (22086 11930
+;;;;;;  142062 731000))
 ;;; Generated autoloads from progmodes/asm-mode.el
 
 (autoload 'asm-mode "asm-mode" "\
@@ -1480,8 +1480,8 @@ Special commands:
 
 ;;;***
 
-;;;### (autoloads nil "auth-source" "gnus/auth-source.el" (22067
-;;;;;;  17342 158157 143000))
+;;;### (autoloads nil "auth-source" "gnus/auth-source.el" (22086
+;;;;;;  11929 774062 731000))
 ;;; Generated autoloads from gnus/auth-source.el
 
 (defvar auth-source-cache-expiry 7200 "\
@@ -1493,8 +1493,8 @@ let-binding.")
 
 ;;;***
 
-;;;### (autoloads nil "autoarg" "autoarg.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "autoarg" "autoarg.el" (22086 11929 494062
+;;;;;;  731000))
 ;;; Generated autoloads from autoarg.el
 
 (defvar autoarg-mode nil "\
@@ -1554,8 +1554,8 @@ This is similar to `autoarg-mode' but rebinds the keypad 
keys
 
 ;;;***
 
-;;;### (autoloads nil "autoconf" "progmodes/autoconf.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "autoconf" "progmodes/autoconf.el" (22086 11930
+;;;;;;  142062 731000))
 ;;; Generated autoloads from progmodes/autoconf.el
 
 (autoload 'autoconf-mode "autoconf" "\
@@ -1565,8 +1565,8 @@ Major mode for editing Autoconf configure.ac files.
 
 ;;;***
 
-;;;### (autoloads nil "autoinsert" "autoinsert.el" (21980 16567 365544
-;;;;;;  893000))
+;;;### (autoloads nil "autoinsert" "autoinsert.el" (22086 11929 494062
+;;;;;;  731000))
 ;;; Generated autoloads from autoinsert.el
 
 (autoload 'auto-insert "autoinsert" "\
@@ -1604,8 +1604,8 @@ insert a template for the file depending on the mode of 
the buffer.
 
 ;;;***
 
-;;;### (autoloads nil "autoload" "emacs-lisp/autoload.el" (21935
-;;;;;;  28080 450075 956000))
+;;;### (autoloads nil "autoload" "emacs-lisp/autoload.el" (22086
+;;;;;;  11929 634062 731000))
 ;;; Generated autoloads from emacs-lisp/autoload.el
 
 (put 'generated-autoload-file 'safe-local-variable 'stringp)
@@ -1656,8 +1656,8 @@ should be non-nil).
 
 ;;;***
 
-;;;### (autoloads nil "autorevert" "autorevert.el" (22065 61995 826407
-;;;;;;  852000))
+;;;### (autoloads nil "autorevert" "autorevert.el" (22089 51528 204929
+;;;;;;  316000))
 ;;; Generated autoloads from autorevert.el
 
 (autoload 'auto-revert-mode "autorevert" "\
@@ -1745,7 +1745,7 @@ specifies in the mode line.
 
 ;;;***
 
-;;;### (autoloads nil "avoid" "avoid.el" (21955 13362 292569 401000))
+;;;### (autoloads nil "avoid" "avoid.el" (22086 11929 498062 731000))
 ;;; Generated autoloads from avoid.el
 
 (defvar mouse-avoidance-mode nil "\
@@ -1783,8 +1783,8 @@ definition of \"random distance\".)
 
 ;;;***
 
-;;;### (autoloads nil "bat-mode" "progmodes/bat-mode.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "bat-mode" "progmodes/bat-mode.el" (22086 11930
+;;;;;;  142062 731000))
 ;;; Generated autoloads from progmodes/bat-mode.el
 
 (add-to-list 'auto-mode-alist '("\\.\\(bat\\|cmd\\)\\'" . bat-mode))
@@ -1802,8 +1802,8 @@ Run script using `bat-run' and `bat-run-args'.
 
 ;;;***
 
-;;;### (autoloads nil "battery" "battery.el" (22026 25907 487502
-;;;;;;  692000))
+;;;### (autoloads nil "battery" "battery.el" (22086 11929 498062
+;;;;;;  731000))
 ;;; Generated autoloads from battery.el
  (put 'battery-mode-line-string 'risky-local-variable t)
 
@@ -1838,8 +1838,8 @@ seconds.
 
 ;;;***
 
-;;;### (autoloads nil "benchmark" "emacs-lisp/benchmark.el" (21670
-;;;;;;  32330 885624 725000))
+;;;### (autoloads nil "benchmark" "emacs-lisp/benchmark.el" (22086
+;;;;;;  11929 638062 731000))
 ;;; Generated autoloads from emacs-lisp/benchmark.el
 
 (autoload 'benchmark-run "benchmark" "\
@@ -1875,8 +1875,8 @@ For non-interactive use see also `benchmark-run' and
 
 ;;;***
 
-;;;### (autoloads nil "bibtex" "textmodes/bibtex.el" (22011 58554
-;;;;;;  41858 469000))
+;;;### (autoloads nil "bibtex" "textmodes/bibtex.el" (22092 27718
+;;;;;;  508268 464000))
 ;;; Generated autoloads from textmodes/bibtex.el
 
 (autoload 'bibtex-initialize "bibtex" "\
@@ -1968,7 +1968,7 @@ A prefix arg negates the value of 
`bibtex-search-entry-globally'.
 ;;;***
 
 ;;;### (autoloads nil "bibtex-style" "textmodes/bibtex-style.el"
-;;;;;;  (21670 32331 885635 586000))
+;;;;;;  (22086 11930 310062 731000))
 ;;; Generated autoloads from textmodes/bibtex-style.el
 
 (autoload 'bibtex-style-mode "bibtex-style" "\
@@ -1978,8 +1978,8 @@ Major mode for editing BibTeX style files.
 
 ;;;***
 
-;;;### (autoloads nil "binhex" "mail/binhex.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "binhex" "mail/binhex.el" (22086 11929 930062
+;;;;;;  731000))
 ;;; Generated autoloads from mail/binhex.el
 
 (defconst binhex-begin-line 
"^:...............................................................$" "\
@@ -2003,8 +2003,8 @@ Binhex decode region between START and END.
 
 ;;;***
 
-;;;### (autoloads nil "blackbox" "play/blackbox.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "blackbox" "play/blackbox.el" (22086 11930
+;;;;;;  122062 731000))
 ;;; Generated autoloads from play/blackbox.el
 
 (autoload 'blackbox "blackbox" "\
@@ -2123,8 +2123,8 @@ a reflection.
 
 ;;;***
 
-;;;### (autoloads nil "bookmark" "bookmark.el" (22081 53819 631137
-;;;;;;  351000))
+;;;### (autoloads nil "bookmark" "bookmark.el" (22086 11929 498062
+;;;;;;  731000))
 ;;; Generated autoloads from bookmark.el
  (define-key ctl-x-r-map "b" 'bookmark-jump)
  (define-key ctl-x-r-map "m" 'bookmark-set)
@@ -2348,8 +2348,8 @@ Incremental search of bookmarks, hiding the non-matches 
as we go.
 
 ;;;***
 
-;;;### (autoloads nil "browse-url" "net/browse-url.el" (21993 28596
-;;;;;;  198597 473000))
+;;;### (autoloads nil "browse-url" "net/browse-url.el" (22086 11929
+;;;;;;  990062 731000))
 ;;; Generated autoloads from net/browse-url.el
 
 (defvar browse-url-browser-function 'browse-url-default-browser "\
@@ -2689,7 +2689,7 @@ from `browse-url-elinks-wrapper'.
 
 ;;;***
 
-;;;### (autoloads nil "bs" "bs.el" (21998 46516 834024 649000))
+;;;### (autoloads nil "bs" "bs.el" (22086 11929 498062 731000))
 ;;; Generated autoloads from bs.el
 (push (purecopy '(bs 1 17)) package--builtin-versions)
 
@@ -2730,8 +2730,8 @@ name of buffer configuration.
 
 ;;;***
 
-;;;### (autoloads nil "bubbles" "play/bubbles.el" (22026 25907 631502
-;;;;;;  692000))
+;;;### (autoloads nil "bubbles" "play/bubbles.el" (22086 11930 122062
+;;;;;;  731000))
 ;;; Generated autoloads from play/bubbles.el
 
 (autoload 'bubbles "bubbles" "\
@@ -2753,7 +2753,7 @@ columns on its right towards the left.
 ;;;***
 
 ;;;### (autoloads nil "bug-reference" "progmodes/bug-reference.el"
-;;;;;;  (21980 16567 993544 893000))
+;;;;;;  (22086 11930 142062 731000))
 ;;; 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)))))
@@ -2773,8 +2773,8 @@ Like `bug-reference-mode', but only buttonize in comments 
and strings.
 
 ;;;***
 
-;;;### (autoloads nil "bytecomp" "emacs-lisp/bytecomp.el" (22067
-;;;;;;  17342 138157 143000))
+;;;### (autoloads nil "bytecomp" "emacs-lisp/bytecomp.el" (22108
+;;;;;;  15942 526032 987000))
 ;;; 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)
@@ -2894,8 +2894,8 @@ and corresponding effects.
 
 ;;;***
 
-;;;### (autoloads nil "cal-china" "calendar/cal-china.el" (21670
-;;;;;;  32330 885624 725000))
+;;;### (autoloads nil "cal-china" "calendar/cal-china.el" (22086
+;;;;;;  11929 526062 731000))
 ;;; Generated autoloads from calendar/cal-china.el
 
 (put 'calendar-chinese-time-zone 'risky-local-variable t)
@@ -2904,8 +2904,8 @@ and corresponding effects.
 
 ;;;***
 
-;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (21990 52406
-;;;;;;  468500 385000))
+;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (22086 11929
+;;;;;;  526062 731000))
 ;;; Generated autoloads from calendar/cal-dst.el
 
 (put 'calendar-daylight-savings-starts 'risky-local-variable t)
@@ -2916,8 +2916,8 @@ and corresponding effects.
 
 ;;;***
 
-;;;### (autoloads nil "cal-hebrew" "calendar/cal-hebrew.el" (21993
-;;;;;;  28595 970597 473000))
+;;;### (autoloads nil "cal-hebrew" "calendar/cal-hebrew.el" (22086
+;;;;;;  11929 526062 731000))
 ;;; Generated autoloads from calendar/cal-hebrew.el
 
 (autoload 'calendar-hebrew-list-yahrzeits "cal-hebrew" "\
@@ -2929,7 +2929,7 @@ from the cursor position.
 
 ;;;***
 
-;;;### (autoloads nil "calc" "calc/calc.el" (22073 59712 746803 451000))
+;;;### (autoloads nil "calc" "calc/calc.el" (22086 11929 522062 731000))
 ;;; Generated autoloads from calc/calc.el
  (define-key ctl-x-map "*" 'calc-dispatch)
 
@@ -3015,8 +3015,8 @@ See Info node `(calc)Defining Functions'.
 
 ;;;***
 
-;;;### (autoloads nil "calc-undo" "calc/calc-undo.el" (22073 59712
-;;;;;;  730803 451000))
+;;;### (autoloads nil "calc-undo" "calc/calc-undo.el" (22086 11929
+;;;;;;  518062 731000))
 ;;; Generated autoloads from calc/calc-undo.el
 
 (autoload 'calc-undo "calc-undo" "\
@@ -3026,8 +3026,8 @@ See Info node `(calc)Defining Functions'.
 
 ;;;***
 
-;;;### (autoloads nil "calculator" "calculator.el" (22109 33223 416655
-;;;;;;  811000))
+;;;### (autoloads nil "calculator" "calculator.el" (22092 27717 520268
+;;;;;;  464000))
 ;;; Generated autoloads from calculator.el
 
 (autoload 'calculator "calculator" "\
@@ -3038,8 +3038,8 @@ See the documentation for `calculator-mode' for more 
information.
 
 ;;;***
 
-;;;### (autoloads nil "calendar" "calendar/calendar.el" (22042 14122
-;;;;;;  205169 136000))
+;;;### (autoloads nil "calendar" "calendar/calendar.el" (22092 27717
+;;;;;;  540268 464000))
 ;;; Generated autoloads from calendar/calendar.el
 
 (autoload 'calendar "calendar" "\
@@ -3082,8 +3082,8 @@ This function is suitable for execution in an init file.
 
 ;;;***
 
-;;;### (autoloads nil "canlock" "gnus/canlock.el" (21852 24381 567240
-;;;;;;  49000))
+;;;### (autoloads nil "canlock" "gnus/canlock.el" (22086 11929 774062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/canlock.el
 
 (autoload 'canlock-insert-header "canlock" "\
@@ -3100,8 +3100,8 @@ it fails.
 
 ;;;***
 
-;;;### (autoloads nil "cc-engine" "progmodes/cc-engine.el" (22084
-;;;;;;  30014 95762 3000))
+;;;### (autoloads nil "cc-engine" "progmodes/cc-engine.el" (22108
+;;;;;;  15942 570032 987000))
 ;;; Generated autoloads from progmodes/cc-engine.el
 
 (autoload 'c-guess-basic-syntax "cc-engine" "\
@@ -3111,8 +3111,8 @@ Return the syntactic context of the current line.
 
 ;;;***
 
-;;;### (autoloads nil "cc-guess" "progmodes/cc-guess.el" (21976 19510
-;;;;;;  84430 241000))
+;;;### (autoloads nil "cc-guess" "progmodes/cc-guess.el" (22086 11930
+;;;;;;  150062 731000))
 ;;; Generated autoloads from progmodes/cc-guess.el
 
 (defvar c-guess-guessed-offsets-alist nil "\
@@ -3210,8 +3210,8 @@ the absolute file name of the file if STYLE-NAME is nil.
 
 ;;;***
 
-;;;### (autoloads nil "cc-mode" "progmodes/cc-mode.el" (22084 30014
-;;;;;;  99762 3000))
+;;;### (autoloads nil "cc-mode" "progmodes/cc-mode.el" (22101 42694
+;;;;;;  157526 804000))
 ;;; Generated autoloads from progmodes/cc-mode.el
 
 (autoload 'c-initialize-cc-mode "cc-mode" "\
@@ -3369,8 +3369,8 @@ Key bindings:
 
 ;;;***
 
-;;;### (autoloads nil "cc-styles" "progmodes/cc-styles.el" (21976
-;;;;;;  19510 104430 241000))
+;;;### (autoloads nil "cc-styles" "progmodes/cc-styles.el" (22086
+;;;;;;  11930 154062 731000))
 ;;; Generated autoloads from progmodes/cc-styles.el
 
 (autoload 'c-set-style "cc-styles" "\
@@ -3421,8 +3421,8 @@ and exists only for compatibility reasons.
 
 ;;;***
 
-;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (22011 58553
-;;;;;;  885858 469000))
+;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (22086 11930
+;;;;;;  154062 731000))
 ;;; Generated autoloads from progmodes/cc-vars.el
 (put 'c-basic-offset 'safe-local-variable 'integerp)
 (put 'c-backslash-column 'safe-local-variable 'integerp)
@@ -3430,8 +3430,8 @@ and exists only for compatibility reasons.
 
 ;;;***
 
-;;;### (autoloads nil "ccl" "international/ccl.el" (22064 41137 985468
-;;;;;;  395000))
+;;;### (autoloads nil "ccl" "international/ccl.el" (22086 11929 874062
+;;;;;;  731000))
 ;;; Generated autoloads from international/ccl.el
 
 (autoload 'ccl-compile "ccl" "\
@@ -3724,8 +3724,8 @@ See the documentation of `define-ccl-program' for the 
detail of CCL program.
 
 ;;;***
 
-;;;### (autoloads nil "cconv" "emacs-lisp/cconv.el" (22026 25907
-;;;;;;  559502 692000))
+;;;### (autoloads nil "cconv" "emacs-lisp/cconv.el" (22102 63557
+;;;;;;  288509 103000))
 ;;; Generated autoloads from emacs-lisp/cconv.el
 
 (autoload 'cconv-closure-convert "cconv" "\
@@ -3744,15 +3744,15 @@ Add the warnings that closure conversion would 
encounter.
 
 ;;;***
 
-;;;### (autoloads nil "cedet" "cedet/cedet.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "cedet" "cedet/cedet.el" (22086 11929 542062
+;;;;;;  731000))
 ;;; Generated autoloads from cedet/cedet.el
 (push (purecopy '(cedet 2 0)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "cfengine" "progmodes/cfengine.el" (22011 58553
-;;;;;;  889858 469000))
+;;;### (autoloads nil "cfengine" "progmodes/cfengine.el" (22086 11930
+;;;;;;  154062 731000))
 ;;; Generated autoloads from progmodes/cfengine.el
 (push (purecopy '(cfengine 1 4)) package--builtin-versions)
 
@@ -3781,8 +3781,8 @@ Choose `cfengine2-mode' or `cfengine3-mode' by buffer 
contents.
 
 ;;;***
 
-;;;### (autoloads nil "character-fold" "character-fold.el" (22068
-;;;;;;  38191 905155 451000))
+;;;### (autoloads nil "character-fold" "character-fold.el" (22109
+;;;;;;  36809 195889 179000))
 ;;; Generated autoloads from character-fold.el
 
 (autoload 'character-fold-to-regexp "character-fold" "\
@@ -3791,19 +3791,25 @@ Any character in STRING that has an entry in
 `character-fold-table' is replaced with that entry (which is a
 regexp) and other characters are `regexp-quote'd.
 
-\(fn STRING &optional LAX)" nil nil)
+If the resulting regexp would be too long for Emacs to handle,
+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)
 
 ;;;***
 
-;;;### (autoloads nil "chart" "emacs-lisp/chart.el" (21998 46516
-;;;;;;  978024 649000))
+;;;### (autoloads nil "chart" "emacs-lisp/chart.el" (22092 27717
+;;;;;;  628268 464000))
 ;;; Generated autoloads from emacs-lisp/chart.el
 (push (purecopy '(chart 0 2)) package--builtin-versions)
 
 ;;;***
 
 ;;;### (autoloads nil "check-declare" "emacs-lisp/check-declare.el"
-;;;;;;  (22011 58553 361858 469000))
+;;;;;;  (22086 11929 650062 731000))
 ;;; Generated autoloads from emacs-lisp/check-declare.el
 
 (autoload 'check-declare-file "check-declare" "\
@@ -3820,8 +3826,8 @@ Returns non-nil if any false statements are found.
 
 ;;;***
 
-;;;### (autoloads nil "checkdoc" "emacs-lisp/checkdoc.el" (22002
-;;;;;;  43570 516887 749000))
+;;;### (autoloads nil "checkdoc" "emacs-lisp/checkdoc.el" (22104
+;;;;;;  18893 193441 487000))
 ;;; Generated autoloads from emacs-lisp/checkdoc.el
 (push (purecopy '(checkdoc 0 6 2)) package--builtin-versions)
 (put 'checkdoc-force-docstrings-flag 'safe-local-variable #'booleanp)
@@ -4031,8 +4037,8 @@ Find package keywords that aren't in 
`finder-known-keywords'.
 
 ;;;***
 
-;;;### (autoloads nil "china-util" "language/china-util.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "china-util" "language/china-util.el" (22086
+;;;;;;  11929 890062 731000))
 ;;; Generated autoloads from language/china-util.el
 
 (autoload 'decode-hz-region "china-util" "\
@@ -4069,8 +4075,8 @@ Encode the text in the current buffer to HZ.
 
 ;;;***
 
-;;;### (autoloads nil "chistory" "chistory.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "chistory" "chistory.el" (22086 11929 582062
+;;;;;;  731000))
 ;;; Generated autoloads from chistory.el
 
 (autoload 'repeat-matching-complex-command "chistory" "\
@@ -4109,8 +4115,8 @@ and runs the normal hook `command-history-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "cl-indent" "emacs-lisp/cl-indent.el" (21901
-;;;;;;  9907 369083 895000))
+;;;### (autoloads nil "cl-indent" "emacs-lisp/cl-indent.el" (22086
+;;;;;;  11929 654062 731000))
 ;;; Generated autoloads from emacs-lisp/cl-indent.el
 
 (autoload 'common-lisp-indent-function "cl-indent" "\
@@ -4193,8 +4199,8 @@ instead.
 
 ;;;***
 
-;;;### (autoloads nil "cl-lib" "emacs-lisp/cl-lib.el" (21903 51634
-;;;;;;  278370 580000))
+;;;### (autoloads nil "cl-lib" "emacs-lisp/cl-lib.el" (22086 11929
+;;;;;;  654062 731000))
 ;;; Generated autoloads from emacs-lisp/cl-lib.el
 (push (purecopy '(cl-lib 1 0)) package--builtin-versions)
 
@@ -4212,8 +4218,8 @@ a future Emacs interpreter will be able to use it.")
 
 ;;;***
 
-;;;### (autoloads nil "cmacexp" "progmodes/cmacexp.el" (22026 25907
-;;;;;;  631502 692000))
+;;;### (autoloads nil "cmacexp" "progmodes/cmacexp.el" (22086 11930
+;;;;;;  158062 731000))
 ;;; Generated autoloads from progmodes/cmacexp.el
 
 (autoload 'c-macro-expand "cmacexp" "\
@@ -4233,8 +4239,8 @@ For use inside Lisp programs, see also 
`c-macro-expansion'.
 
 ;;;***
 
-;;;### (autoloads nil "cmuscheme" "cmuscheme.el" (22011 58553 281858
-;;;;;;  469000))
+;;;### (autoloads nil "cmuscheme" "cmuscheme.el" (22086 11929 582062
+;;;;;;  731000))
 ;;; Generated autoloads from cmuscheme.el
 
 (autoload 'run-scheme "cmuscheme" "\
@@ -4254,7 +4260,7 @@ is run).
 
 ;;;***
 
-;;;### (autoloads nil "color" "color.el" (22055 26158 710447 352000))
+;;;### (autoloads nil "color" "color.el" (22086 11929 582062 731000))
 ;;; Generated autoloads from color.el
 
 (autoload 'color-name-to-rgb "color" "\
@@ -4273,7 +4279,7 @@ If FRAME cannot display COLOR, return nil.
 
 ;;;***
 
-;;;### (autoloads nil "comint" "comint.el" (22011 58553 293858 469000))
+;;;### (autoloads nil "comint" "comint.el" (22086 11929 586062 731000))
 ;;; Generated autoloads from comint.el
 
 (defvar comint-output-filter-functions '(ansi-color-process-output 
comint-postoutput-scroll-to-bottom comint-watch-for-password-prompt) "\
@@ -4374,8 +4380,8 @@ REGEXP-GROUP is the regular expression group in REGEXP to 
use.
 
 ;;;***
 
-;;;### (autoloads nil "compare-w" "vc/compare-w.el" (21872 61770
-;;;;;;  310089 300000))
+;;;### (autoloads nil "compare-w" "vc/compare-w.el" (22086 11930
+;;;;;;  370062 731000))
 ;;; Generated autoloads from vc/compare-w.el
 
 (autoload 'compare-windows "compare-w" "\
@@ -4411,8 +4417,8 @@ on third call it again advances points to the next 
difference and so on.
 
 ;;;***
 
-;;;### (autoloads nil "compile" "progmodes/compile.el" (22032 64681
-;;;;;;  370838 183000))
+;;;### (autoloads nil "compile" "progmodes/compile.el" (22099 26170
+;;;;;;  422017 16000))
 ;;; Generated autoloads from progmodes/compile.el
 
 (defvar compilation-mode-hook nil "\
@@ -4593,8 +4599,8 @@ This is the value of `next-error-function' in Compilation 
buffers.
 
 ;;;***
 
-;;;### (autoloads nil "completion" "completion.el" (21804 59688 154807
-;;;;;;  989000))
+;;;### (autoloads nil "completion" "completion.el" (22086 11929 586062
+;;;;;;  731000))
 ;;; Generated autoloads from completion.el
 
 (defvar dynamic-completion-mode nil "\
@@ -4616,8 +4622,8 @@ if ARG is omitted or nil.
 
 ;;;***
 
-;;;### (autoloads nil "conf-mode" "textmodes/conf-mode.el" (22026
-;;;;;;  25907 647502 692000))
+;;;### (autoloads nil "conf-mode" "textmodes/conf-mode.el" (22086
+;;;;;;  11930 314062 731000))
 ;;; Generated autoloads from textmodes/conf-mode.el
 
 (autoload 'conf-mode "conf-mode" "\
@@ -4772,8 +4778,8 @@ For details see `conf-mode'.  Example:
 
 ;;;***
 
-;;;### (autoloads nil "cookie1" "play/cookie1.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "cookie1" "play/cookie1.el" (22086 11930 122062
+;;;;;;  731000))
 ;;; Generated autoloads from play/cookie1.el
 
 (autoload 'cookie "cookie1" "\
@@ -4801,8 +4807,8 @@ and subsequent calls on the same file won't go to disk.
 
 ;;;***
 
-;;;### (autoloads nil "copyright" "emacs-lisp/copyright.el" (22026
-;;;;;;  25907 575502 692000))
+;;;### (autoloads nil "copyright" "emacs-lisp/copyright.el" (22086
+;;;;;;  11929 662062 731000))
 ;;; Generated autoloads from emacs-lisp/copyright.el
 (put 'copyright-at-end-flag 'safe-local-variable 'booleanp)
 (put 'copyright-names-regexp 'safe-local-variable 'stringp)
@@ -4840,8 +4846,8 @@ If FIX is non-nil, run `copyright-fix-years' instead.
 
 ;;;***
 
-;;;### (autoloads nil "cperl-mode" "progmodes/cperl-mode.el" (22011
-;;;;;;  58553 893858 469000))
+;;;### (autoloads nil "cperl-mode" "progmodes/cperl-mode.el" (22086
+;;;;;;  11930 162062 731000))
 ;;; Generated autoloads from progmodes/cperl-mode.el
 (put 'cperl-indent-level 'safe-local-variable 'integerp)
 (put 'cperl-brace-offset 'safe-local-variable 'integerp)
@@ -5039,8 +5045,8 @@ Run a `perldoc' on the word around point.
 
 ;;;***
 
-;;;### (autoloads nil "cpp" "progmodes/cpp.el" (21988 10682 33624
-;;;;;;  461000))
+;;;### (autoloads nil "cpp" "progmodes/cpp.el" (22092 27718 148268
+;;;;;;  464000))
 ;;; Generated autoloads from progmodes/cpp.el
 
 (autoload 'cpp-highlight-buffer "cpp" "\
@@ -5058,8 +5064,8 @@ Edit display information for cpp conditionals.
 
 ;;;***
 
-;;;### (autoloads nil "crm" "emacs-lisp/crm.el" (21980 16567 501544
-;;;;;;  893000))
+;;;### (autoloads nil "crm" "emacs-lisp/crm.el" (22086 11929 662062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lisp/crm.el
 
 (autoload 'completing-read-multiple "crm" "\
@@ -5085,8 +5091,8 @@ with empty strings removed.
 
 ;;;***
 
-;;;### (autoloads nil "css-mode" "textmodes/css-mode.el" (22038 17067
-;;;;;;  867243 731000))
+;;;### (autoloads nil "css-mode" "textmodes/css-mode.el" (22086 11930
+;;;;;;  314062 731000))
 ;;; Generated autoloads from textmodes/css-mode.el
 
 (autoload 'css-mode "css-mode" "\
@@ -5102,8 +5108,8 @@ Major mode to edit \"Sassy CSS\" files.
 
 ;;;***
 
-;;;### (autoloads nil "cua-base" "emulation/cua-base.el" (21990 52406
-;;;;;;  528500 385000))
+;;;### (autoloads nil "cua-base" "emulation/cua-base.el" (22086 11929
+;;;;;;  690062 731000))
 ;;; Generated autoloads from emulation/cua-base.el
 
 (defvar cua-mode nil "\
@@ -5148,8 +5154,8 @@ Enable CUA selection mode without the C-z/C-x/C-c/C-v 
bindings.
 
 ;;;***
 
-;;;### (autoloads nil "cua-rect" "emulation/cua-rect.el" (22087 6213
-;;;;;;  764351 952000))
+;;;### (autoloads nil "cua-rect" "emulation/cua-rect.el" (22087 9807
+;;;;;;  178279 951000))
 ;;; Generated autoloads from emulation/cua-rect.el
 
 (autoload 'cua-rectangle-mark-mode "cua-rect" "\
@@ -5161,7 +5167,7 @@ Activates the region if needed.  Only lasts until the 
region is deactivated.
 ;;;***
 
 ;;;### (autoloads nil "cursor-sensor" "emacs-lisp/cursor-sensor.el"
-;;;;;;  (22069 62806 562804 836000))
+;;;;;;  (22086 11929 662062 731000))
 ;;; Generated autoloads from emacs-lisp/cursor-sensor.el
 
 (autoload 'cursor-intangible-mode "cursor-sensor" "\
@@ -5181,8 +5187,8 @@ entering the area covered by the text-property property 
or leaving it.
 
 ;;;***
 
-;;;### (autoloads nil "cus-edit" "cus-edit.el" (22087 6213 748351
-;;;;;;  952000))
+;;;### (autoloads nil "cus-edit" "cus-edit.el" (22086 11929 590062
+;;;;;;  731000))
 ;;; Generated autoloads from cus-edit.el
 
 (defvar custom-browse-sort-alphabetically nil "\
@@ -5501,8 +5507,8 @@ The format is suitable for use with `easy-menu-define'.
 
 ;;;***
 
-;;;### (autoloads nil "cus-theme" "cus-theme.el" (21998 46516 910024
-;;;;;;  649000))
+;;;### (autoloads nil "cus-theme" "cus-theme.el" (22086 11929 590062
+;;;;;;  731000))
 ;;; Generated autoloads from cus-theme.el
 
 (autoload 'customize-create-theme "cus-theme" "\
@@ -5535,8 +5541,8 @@ omitted, a buffer named *Custom Themes* is used.
 
 ;;;***
 
-;;;### (autoloads nil "cvs-status" "vc/cvs-status.el" (22026 25907
-;;;;;;  671502 692000))
+;;;### (autoloads nil "cvs-status" "vc/cvs-status.el" (22086 11930
+;;;;;;  370062 731000))
 ;;; Generated autoloads from vc/cvs-status.el
 
 (autoload 'cvs-status-mode "cvs-status" "\
@@ -5546,8 +5552,8 @@ Mode used for cvs status output.
 
 ;;;***
 
-;;;### (autoloads nil "cwarn" "progmodes/cwarn.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "cwarn" "progmodes/cwarn.el" (22089 51528 280929
+;;;;;;  316000))
 ;;; Generated autoloads from progmodes/cwarn.el
 (push (purecopy '(cwarn 1 3 1)) package--builtin-versions)
 
@@ -5591,8 +5597,8 @@ See `cwarn-mode' for more information on Cwarn mode.
 
 ;;;***
 
-;;;### (autoloads nil "cyril-util" "language/cyril-util.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "cyril-util" "language/cyril-util.el" (22086
+;;;;;;  11929 890062 731000))
 ;;; Generated autoloads from language/cyril-util.el
 
 (autoload 'cyrillic-encode-koi8-r-char "cyril-util" "\
@@ -5620,8 +5626,8 @@ If the argument is nil, we return the display table to 
its standard state.
 
 ;;;***
 
-;;;### (autoloads nil "dabbrev" "dabbrev.el" (22011 58553 321858
-;;;;;;  469000))
+;;;### (autoloads nil "dabbrev" "dabbrev.el" (22086 11929 590062
+;;;;;;  731000))
 ;;; Generated autoloads from dabbrev.el
 (put 'dabbrev-case-fold-search 'risky-local-variable t)
 (put 'dabbrev-case-replace 'risky-local-variable t)
@@ -5667,8 +5673,8 @@ See also `dabbrev-abbrev-char-regexp' and 
\\[dabbrev-completion].
 
 ;;;***
 
-;;;### (autoloads nil "data-debug" "cedet/data-debug.el" (21974 64192
-;;;;;;  556009 993000))
+;;;### (autoloads nil "data-debug" "cedet/data-debug.el" (22086 11929
+;;;;;;  542062 731000))
 ;;; Generated autoloads from cedet/data-debug.el
 
 (autoload 'data-debug-new-buffer "data-debug" "\
@@ -5678,7 +5684,7 @@ Create a new data-debug buffer with NAME.
 
 ;;;***
 
-;;;### (autoloads nil "dbus" "net/dbus.el" (22011 58553 761858 469000))
+;;;### (autoloads nil "dbus" "net/dbus.el" (22086 11929 990062 731000))
 ;;; Generated autoloads from net/dbus.el
 
 (autoload 'dbus-handle-event "dbus" "\
@@ -5691,8 +5697,8 @@ If the HANDLER returns a `dbus-error', it is propagated 
as return message.
 
 ;;;***
 
-;;;### (autoloads nil "dcl-mode" "progmodes/dcl-mode.el" (22011 58553
-;;;;;;  897858 469000))
+;;;### (autoloads nil "dcl-mode" "progmodes/dcl-mode.el" (22086 11930
+;;;;;;  162062 731000))
 ;;; Generated autoloads from progmodes/dcl-mode.el
 
 (autoload 'dcl-mode "dcl-mode" "\
@@ -5818,8 +5824,8 @@ There is some minimal font-lock support (see vars
 
 ;;;***
 
-;;;### (autoloads nil "debug" "emacs-lisp/debug.el" (21918 44225
-;;;;;;  955204 84000))
+;;;### (autoloads nil "debug" "emacs-lisp/debug.el" (22086 11929
+;;;;;;  662062 731000))
 ;;; Generated autoloads from emacs-lisp/debug.el
 
 (setq debugger 'debug)
@@ -5862,8 +5868,8 @@ To specify a nil argument interactively, exit with an 
empty minibuffer.
 
 ;;;***
 
-;;;### (autoloads nil "decipher" "play/decipher.el" (21948 40114
-;;;;;;  398686 453000))
+;;;### (autoloads nil "decipher" "play/decipher.el" (22086 11930
+;;;;;;  126062 731000))
 ;;; Generated autoloads from play/decipher.el
 
 (autoload 'decipher "decipher" "\
@@ -5891,8 +5897,8 @@ The most useful commands are:
 
 ;;;***
 
-;;;### (autoloads nil "delim-col" "delim-col.el" (21980 16567 477544
-;;;;;;  893000))
+;;;### (autoloads nil "delim-col" "delim-col.el" (22086 11929 590062
+;;;;;;  731000))
 ;;; Generated autoloads from delim-col.el
 (push (purecopy '(delim-col 2 1)) package--builtin-versions)
 
@@ -5917,7 +5923,7 @@ START and END delimits the corners of text rectangle.
 
 ;;;***
 
-;;;### (autoloads nil "delsel" "delsel.el" (21973 43315 242113 285000))
+;;;### (autoloads nil "delsel" "delsel.el" (22086 11929 594062 731000))
 ;;; Generated autoloads from delsel.el
 
 (defalias 'pending-delete-mode 'delete-selection-mode)
@@ -5945,8 +5951,8 @@ point regardless of any selection.
 
 ;;;***
 
-;;;### (autoloads nil "derived" "emacs-lisp/derived.el" (21978 61237
-;;;;;;  450488 269000))
+;;;### (autoloads nil "derived" "emacs-lisp/derived.el" (22086 11929
+;;;;;;  666062 731000))
 ;;; Generated autoloads from emacs-lisp/derived.el
 
 (autoload 'define-derived-mode "derived" "\
@@ -6014,8 +6020,8 @@ the first time the mode is used.
 
 ;;;***
 
-;;;### (autoloads nil "descr-text" "descr-text.el" (21998 46516 914024
-;;;;;;  649000))
+;;;### (autoloads nil "descr-text" "descr-text.el" (22086 11929 594062
+;;;;;;  731000))
 ;;; Generated autoloads from descr-text.el
 
 (autoload 'describe-text-properties "descr-text" "\
@@ -6064,8 +6070,8 @@ This function is meant to be used as a value of
 
 ;;;***
 
-;;;### (autoloads nil "desktop" "desktop.el" (22026 25907 555502
-;;;;;;  692000))
+;;;### (autoloads nil "desktop" "desktop.el" (22092 27717 592268
+;;;;;;  464000))
 ;;; Generated autoloads from desktop.el
 
 (defvar desktop-save-mode nil "\
@@ -6153,8 +6159,8 @@ code like
 
    (defun foo-restore-desktop-buffer
    ...
-   (add-to-list 'desktop-buffer-mode-handlers
-                '(foo-mode . foo-restore-desktop-buffer))
+   (add-to-list \\='desktop-buffer-mode-handlers
+                \\='(foo-mode . foo-restore-desktop-buffer))
 
 The major mode function must either be autoloaded, or of the form
 \"foobar-mode\" and defined in library \"foobar\", so that desktop
@@ -6197,8 +6203,8 @@ code like
 
    (defun foo-desktop-restore
    ...
-   (add-to-list 'desktop-minor-mode-handlers
-                '(foo-mode . foo-desktop-restore))
+   (add-to-list \\='desktop-minor-mode-handlers
+                \\='(foo-mode . foo-desktop-restore))
 
 The minor mode function must either be autoloaded, or of the form
 \"foobar-mode\" and defined in library \"foobar\", so that desktop
@@ -6274,8 +6280,8 @@ Revert to the last loaded desktop.
 
 ;;;***
 
-;;;### (autoloads nil "deuglify" "gnus/deuglify.el" (21855 576 877944
-;;;;;;  285000))
+;;;### (autoloads nil "deuglify" "gnus/deuglify.el" (22086 11929
+;;;;;;  774062 731000))
 ;;; Generated autoloads from gnus/deuglify.el
 
 (autoload 'gnus-article-outlook-unwrap-lines "deuglify" "\
@@ -6307,8 +6313,8 @@ Deuglify broken Outlook (Express) articles and redisplay.
 
 ;;;***
 
-;;;### (autoloads nil "diary-lib" "calendar/diary-lib.el" (22026
-;;;;;;  25907 547502 692000))
+;;;### (autoloads nil "diary-lib" "calendar/diary-lib.el" (22092
+;;;;;;  27717 544268 464000))
 ;;; Generated autoloads from calendar/diary-lib.el
 
 (autoload 'diary "diary-lib" "\
@@ -6334,7 +6340,7 @@ ensure that all relevant variables are set.
 
 \(setq diary-mail-days 3
       diary-file \"/path/to/diary.file\"
-      calendar-date-style 'european
+      calendar-date-style \\='european
       diary-mail-addr \"address@hidden")
 
 \(diary-mail-entries)
@@ -6350,7 +6356,7 @@ Major mode for editing the diary file.
 
 ;;;***
 
-;;;### (autoloads nil "diff" "vc/diff.el" (21804 59688 284811 0))
+;;;### (autoloads nil "diff" "vc/diff.el" (22086 11930 370062 731000))
 ;;; Generated autoloads from vc/diff.el
 
 (defvar diff-switches (purecopy "-u") "\
@@ -6398,8 +6404,8 @@ This requires the external program `diff' to be in your 
`exec-path'.
 
 ;;;***
 
-;;;### (autoloads nil "diff-mode" "vc/diff-mode.el" (22087 6213 816351
-;;;;;;  952000))
+;;;### (autoloads nil "diff-mode" "vc/diff-mode.el" (22087 9807 430279
+;;;;;;  951000))
 ;;; Generated autoloads from vc/diff-mode.el
 
 (autoload 'diff-mode "diff-mode" "\
@@ -6431,7 +6437,7 @@ the mode if ARG is omitted or nil.
 
 ;;;***
 
-;;;### (autoloads nil "dig" "net/dig.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "dig" "net/dig.el" (22086 11929 990062 731000))
 ;;; Generated autoloads from net/dig.el
 
 (autoload 'dig "dig" "\
@@ -6442,7 +6448,7 @@ Optional arguments are passed to `dig-invoke'.
 
 ;;;***
 
-;;;### (autoloads nil "dired" "dired.el" (22085 50883 181731 271000))
+;;;### (autoloads nil "dired" "dired.el" (22086 11929 598062 731000))
 ;;; Generated autoloads from dired.el
 
 (defvar dired-listing-switches (purecopy "-al") "\
@@ -6568,8 +6574,8 @@ Keybindings:
 
 ;;;***
 
-;;;### (autoloads nil "dirtrack" "dirtrack.el" (21981 37426 531399
-;;;;;;  97000))
+;;;### (autoloads nil "dirtrack" "dirtrack.el" (22086 11929 598062
+;;;;;;  731000))
 ;;; Generated autoloads from dirtrack.el
 
 (autoload 'dirtrack-mode "dirtrack" "\
@@ -6599,8 +6605,8 @@ from `default-directory'.
 
 ;;;***
 
-;;;### (autoloads nil "disass" "emacs-lisp/disass.el" (21993 28596
-;;;;;;  58597 473000))
+;;;### (autoloads nil "disass" "emacs-lisp/disass.el" (22086 11929
+;;;;;;  666062 731000))
 ;;; Generated autoloads from emacs-lisp/disass.el
 
 (autoload 'disassemble "disass" "\
@@ -6614,8 +6620,8 @@ redefine OBJECT if it is a symbol.
 
 ;;;***
 
-;;;### (autoloads nil "disp-table" "disp-table.el" (21981 37426 535399
-;;;;;;  97000))
+;;;### (autoloads nil "disp-table" "disp-table.el" (22086 11929 598062
+;;;;;;  731000))
 ;;; Generated autoloads from disp-table.el
 
 (autoload 'make-display-table "disp-table" "\
@@ -6736,8 +6742,8 @@ in `.emacs'.
 
 ;;;***
 
-;;;### (autoloads nil "dissociate" "play/dissociate.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "dissociate" "play/dissociate.el" (22086 11930
+;;;;;;  126062 731000))
 ;;; Generated autoloads from play/dissociate.el
 
 (autoload 'dissociated-press "dissociate" "\
@@ -6753,7 +6759,7 @@ Default is 2.
 
 ;;;***
 
-;;;### (autoloads nil "dnd" "dnd.el" (22026 25907 555502 692000))
+;;;### (autoloads nil "dnd" "dnd.el" (22086 11929 598062 731000))
 ;;; 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)) "\
@@ -6773,8 +6779,8 @@ if some action was made, or nil if the URL is ignored.")
 
 ;;;***
 
-;;;### (autoloads nil "dns-mode" "textmodes/dns-mode.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "dns-mode" "textmodes/dns-mode.el" (22086 11930
+;;;;;;  314062 731000))
 ;;; Generated autoloads from textmodes/dns-mode.el
 
 (autoload 'dns-mode "dns-mode" "\
@@ -6797,8 +6803,8 @@ Locate SOA record and increment the serial field.
 
 ;;;***
 
-;;;### (autoloads nil "doc-view" "doc-view.el" (22058 2348 742214
-;;;;;;  951000))
+;;;### (autoloads nil "doc-view" "doc-view.el" (22086 11929 598062
+;;;;;;  731000))
 ;;; Generated autoloads from doc-view.el
 
 (autoload 'doc-view-mode-p "doc-view" "\
@@ -6844,8 +6850,8 @@ See the command `doc-view-mode' for more information on 
this mode.
 
 ;;;***
 
-;;;### (autoloads nil "doctor" "play/doctor.el" (22011 58553 865858
-;;;;;;  469000))
+;;;### (autoloads nil "doctor" "play/doctor.el" (22086 11930 126062
+;;;;;;  731000))
 ;;; Generated autoloads from play/doctor.el
 
 (autoload 'doctor "doctor" "\
@@ -6855,7 +6861,7 @@ Switch to *doctor* buffer and start giving psychotherapy.
 
 ;;;***
 
-;;;### (autoloads nil "double" "double.el" (21953 58033 239058 929000))
+;;;### (autoloads nil "double" "double.el" (22086 11929 602062 731000))
 ;;; Generated autoloads from double.el
 
 (autoload 'double-mode "double" "\
@@ -6871,8 +6877,8 @@ strings when pressed twice.  See `double-map' for details.
 
 ;;;***
 
-;;;### (autoloads nil "dunnet" "play/dunnet.el" (21980 16567 965544
-;;;;;;  893000))
+;;;### (autoloads nil "dunnet" "play/dunnet.el" (22093 48588 576393
+;;;;;;  539000))
 ;;; Generated autoloads from play/dunnet.el
 (push (purecopy '(dunnet 2 2)) package--builtin-versions)
 
@@ -6883,8 +6889,8 @@ Switch to *dungeon* buffer and start game.
 
 ;;;***
 
-;;;### (autoloads nil "easy-mmode" "emacs-lisp/easy-mmode.el" (22011
-;;;;;;  58553 361858 469000))
+;;;### (autoloads nil "easy-mmode" "emacs-lisp/easy-mmode.el" (22092
+;;;;;;  27717 632268 464000))
 ;;; Generated autoloads from emacs-lisp/easy-mmode.el
 
 (defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
@@ -6954,7 +6960,7 @@ BODY contains code to execute each time the mode is 
enabled or disabled.
 
 For example, you could write
   (define-minor-mode foo-mode \"If enabled, foo on you!\"
-    :lighter \" Foo\" :require 'foo :global t :group 'hassle :version \"27.5\"
+    :lighter \" Foo\" :require \\='foo :global t :group \\='hassle :version 
\"27.5\"
     ...BODY CODE...)
 
 \(fn MODE DOC &optional INIT-VALUE LIGHTER KEYMAP &rest BODY)" nil t)
@@ -7009,7 +7015,7 @@ Valid keywords and arguments are:
   :inherit   Parent keymap.
   :group     Ignored.
   :suppress  Non-nil to call `suppress-keymap' on keymap,
-             'nodigits to suppress digits as prefix arguments.
+             `nodigits' to suppress digits as prefix arguments.
 
 \(fn BS &optional NAME M ARGS)" nil nil)
 
@@ -7028,8 +7034,8 @@ CSS contains a list of syntax specifications of the form 
(CHAR . SYNTAX).
 
 ;;;***
 
-;;;### (autoloads nil "easymenu" "emacs-lisp/easymenu.el" (21670
-;;;;;;  32330 885624 725000))
+;;;### (autoloads nil "easymenu" "emacs-lisp/easymenu.el" (22086
+;;;;;;  11929 666062 731000))
 ;;; Generated autoloads from emacs-lisp/easymenu.el
 
 (autoload 'easy-menu-define "easymenu" "\
@@ -7167,8 +7173,8 @@ To implement dynamic menus, either call this from
 
 ;;;***
 
-;;;### (autoloads nil "ebnf2ps" "progmodes/ebnf2ps.el" (22011 58553
-;;;;;;  897858 469000))
+;;;### (autoloads nil "ebnf2ps" "progmodes/ebnf2ps.el" (22086 11930
+;;;;;;  166062 731000))
 ;;; Generated autoloads from progmodes/ebnf2ps.el
 (push (purecopy '(ebnf2ps 4 4)) package--builtin-versions)
 
@@ -7433,8 +7439,8 @@ See `ebnf-style-database' documentation.
 
 ;;;***
 
-;;;### (autoloads nil "ebrowse" "progmodes/ebrowse.el" (21998 46517
-;;;;;;  206024 649000))
+;;;### (autoloads nil "ebrowse" "progmodes/ebrowse.el" (22086 11930
+;;;;;;  170062 731000))
 ;;; Generated autoloads from progmodes/ebrowse.el
 
 (autoload 'ebrowse-tree-mode "ebrowse" "\
@@ -7582,8 +7588,8 @@ Display statistics for a class tree.
 
 ;;;***
 
-;;;### (autoloads nil "ebuff-menu" "ebuff-menu.el" (21953 58033 239058
-;;;;;;  929000))
+;;;### (autoloads nil "ebuff-menu" "ebuff-menu.el" (22086 11929 602062
+;;;;;;  731000))
 ;;; Generated autoloads from ebuff-menu.el
 
 (autoload 'electric-buffer-list "ebuff-menu" "\
@@ -7615,8 +7621,8 @@ Run hooks in `electric-buffer-menu-mode-hook' on entry.
 
 ;;;***
 
-;;;### (autoloads nil "echistory" "echistory.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "echistory" "echistory.el" (22086 11929 602062
+;;;;;;  731000))
 ;;; Generated autoloads from echistory.el
 
 (autoload 'Electric-command-history-redo-expression "echistory" "\
@@ -7627,8 +7633,8 @@ With prefix arg NOCONFIRM, execute current line as-is 
without editing.
 
 ;;;***
 
-;;;### (autoloads nil "ecomplete" "gnus/ecomplete.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "ecomplete" "gnus/ecomplete.el" (22086 11929
+;;;;;;  774062 731000))
 ;;; Generated autoloads from gnus/ecomplete.el
 
 (autoload 'ecomplete-setup "ecomplete" "\
@@ -7638,7 +7644,7 @@ With prefix arg NOCONFIRM, execute current line as-is 
without editing.
 
 ;;;***
 
-;;;### (autoloads nil "ede" "cedet/ede.el" (22040 58794 676259 771000))
+;;;### (autoloads nil "ede" "cedet/ede.el" (22092 27717 556268 464000))
 ;;; Generated autoloads from cedet/ede.el
 (push (purecopy '(ede 1 2)) package--builtin-versions)
 
@@ -7664,8 +7670,8 @@ an EDE controlled project.
 
 ;;;***
 
-;;;### (autoloads nil "edebug" "emacs-lisp/edebug.el" (22022 28851
-;;;;;;  765037 303000))
+;;;### (autoloads nil "edebug" "emacs-lisp/edebug.el" (22086 11929
+;;;;;;  670062 731000))
 ;;; Generated autoloads from emacs-lisp/edebug.el
 
 (defvar edebug-all-defs nil "\
@@ -7729,7 +7735,7 @@ Toggle edebugging of all forms.
 
 ;;;***
 
-;;;### (autoloads nil "ediff" "vc/ediff.el" (22011 58554 93858 469000))
+;;;### (autoloads nil "ediff" "vc/ediff.el" (22086 11930 378062 731000))
 ;;; Generated autoloads from vc/ediff.el
 (push (purecopy '(ediff 2 81 4)) package--builtin-versions)
 
@@ -8001,8 +8007,8 @@ With optional NODE, goes to that node.
 
 ;;;***
 
-;;;### (autoloads nil "ediff-help" "vc/ediff-help.el" (21870 54319
-;;;;;;  247944 919000))
+;;;### (autoloads nil "ediff-help" "vc/ediff-help.el" (22086 11930
+;;;;;;  370062 731000))
 ;;; Generated autoloads from vc/ediff-help.el
 
 (autoload 'ediff-customize "ediff-help" "\
@@ -8012,8 +8018,8 @@ With optional NODE, goes to that node.
 
 ;;;***
 
-;;;### (autoloads nil "ediff-mult" "vc/ediff-mult.el" (21993 28596
-;;;;;;  422597 473000))
+;;;### (autoloads nil "ediff-mult" "vc/ediff-mult.el" (22086 11930
+;;;;;;  374062 731000))
 ;;; Generated autoloads from vc/ediff-mult.el
 
 (autoload 'ediff-show-registry "ediff-mult" "\
@@ -8025,8 +8031,8 @@ Display Ediff's registry.
 
 ;;;***
 
-;;;### (autoloads nil "ediff-util" "vc/ediff-util.el" (22026 25907
-;;;;;;  671502 692000))
+;;;### (autoloads nil "ediff-util" "vc/ediff-util.el" (22086 11930
+;;;;;;  374062 731000))
 ;;; Generated autoloads from vc/ediff-util.el
 
 (autoload 'ediff-toggle-multiframe "ediff-util" "\
@@ -8045,8 +8051,8 @@ To change the default, set the variable 
`ediff-use-toolbar-p', which see.
 
 ;;;***
 
-;;;### (autoloads nil "edmacro" "edmacro.el" (21976 19509 748430
-;;;;;;  241000))
+;;;### (autoloads nil "edmacro" "edmacro.el" (22086 11929 602062
+;;;;;;  731000))
 ;;; Generated autoloads from edmacro.el
 (push (purecopy '(edmacro 2 1)) package--builtin-versions)
 
@@ -8095,8 +8101,8 @@ or nil, use a compact 80-column format.
 
 ;;;***
 
-;;;### (autoloads nil "edt" "emulation/edt.el" (22011 58553 453858
-;;;;;;  469000))
+;;;### (autoloads nil "edt" "emulation/edt.el" (22086 11929 694062
+;;;;;;  731000))
 ;;; Generated autoloads from emulation/edt.el
 
 (autoload 'edt-set-scroll-margins "edt" "\
@@ -8113,7 +8119,7 @@ Turn on EDT Emulation.
 
 ;;;***
 
-;;;### (autoloads nil "ehelp" "ehelp.el" (21953 58033 247058 929000))
+;;;### (autoloads nil "ehelp" "ehelp.el" (22086 11929 602062 731000))
 ;;; Generated autoloads from ehelp.el
 
 (autoload 'with-electric-help "ehelp" "\
@@ -8149,15 +8155,15 @@ BUFFER is put back into its original major mode.
 
 ;;;***
 
-;;;### (autoloads nil "eieio" "emacs-lisp/eieio.el" (22102 59970
-;;;;;;  680776 103000))
+;;;### (autoloads nil "eieio" "emacs-lisp/eieio.el" (22086 11929
+;;;;;;  674062 731000))
 ;;; Generated autoloads from emacs-lisp/eieio.el
 (push (purecopy '(eieio 1 4)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "eieio-core" "emacs-lisp/eieio-core.el" (22102
-;;;;;;  59970 668776 103000))
+;;;### (autoloads nil "eieio-core" "emacs-lisp/eieio-core.el" (22086
+;;;;;;  11929 670062 731000))
 ;;; Generated autoloads from emacs-lisp/eieio-core.el
 (push (purecopy '(eieio-core 1 4)) package--builtin-versions)
 
@@ -8173,8 +8179,8 @@ It creates an autoload function for CNAME's constructor.
 
 ;;;***
 
-;;;### (autoloads nil "elec-pair" "elec-pair.el" (21888 48869 288181
-;;;;;;  796000))
+;;;### (autoloads nil "elec-pair" "elec-pair.el" (22086 11929 602062
+;;;;;;  731000))
 ;;; Generated autoloads from elec-pair.el
 
 (defvar electric-pair-text-pairs '((34 . 34)) "\
@@ -8215,8 +8221,8 @@ Toggle `electric-pair-mode' only in this buffer.
 
 ;;;***
 
-;;;### (autoloads nil "elide-head" "elide-head.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "elide-head" "elide-head.el" (22086 11929 602062
+;;;;;;  731000))
 ;;; Generated autoloads from elide-head.el
 
 (autoload 'elide-head "elide-head" "\
@@ -8231,8 +8237,8 @@ This is suitable as an entry on `find-file-hook' or 
appropriate mode hooks.
 
 ;;;***
 
-;;;### (autoloads nil "elint" "emacs-lisp/elint.el" (22030 22952
-;;;;;;  921158 467000))
+;;;### (autoloads nil "elint" "emacs-lisp/elint.el" (22086 11929
+;;;;;;  674062 731000))
 ;;; Generated autoloads from emacs-lisp/elint.el
 
 (autoload 'elint-file "elint" "\
@@ -8267,8 +8273,8 @@ optional prefix argument REINIT is non-nil.
 
 ;;;***
 
-;;;### (autoloads nil "elp" "emacs-lisp/elp.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "elp" "emacs-lisp/elp.el" (22086 11929 674062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lisp/elp.el
 
 (autoload 'elp-instrument-function "elp" "\
@@ -8302,8 +8308,8 @@ displayed.
 
 ;;;***
 
-;;;### (autoloads nil "emacs-lock" "emacs-lock.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "emacs-lock" "emacs-lock.el" (22086 11929 690062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lock.el
 
 (autoload 'emacs-lock-mode "emacs-lock" "\
@@ -8330,8 +8336,8 @@ Other values are interpreted as usual.
 
 ;;;***
 
-;;;### (autoloads nil "emacsbug" "mail/emacsbug.el" (22030 22952
-;;;;;;  933158 467000))
+;;;### (autoloads nil "emacsbug" "mail/emacsbug.el" (22086 11929
+;;;;;;  934062 731000))
 ;;; Generated autoloads from mail/emacsbug.el
 
 (autoload 'report-emacs-bug "emacsbug" "\
@@ -8344,8 +8350,8 @@ Prompts for bug subject.  Leaves you in a mail buffer.
 
 ;;;***
 
-;;;### (autoloads nil "emerge" "vc/emerge.el" (21953 58033 507058
-;;;;;;  929000))
+;;;### (autoloads nil "emerge" "vc/emerge.el" (22086 11930 378062
+;;;;;;  731000))
 ;;; Generated autoloads from vc/emerge.el
 
 (autoload 'emerge-files "emerge" "\
@@ -8405,8 +8411,8 @@ Emerge two RCS revisions of a file, with another revision 
as ancestor.
 
 ;;;***
 
-;;;### (autoloads nil "enriched" "textmodes/enriched.el" (21691 38459
-;;;;;;  74604 918000))
+;;;### (autoloads nil "enriched" "textmodes/enriched.el" (22086 11930
+;;;;;;  314062 731000))
 ;;; Generated autoloads from textmodes/enriched.el
 
 (autoload 'enriched-mode "enriched" "\
@@ -8441,7 +8447,7 @@ Commands:
 
 ;;;***
 
-;;;### (autoloads nil "epa" "epa.el" (22093 44991 758016 539000))
+;;;### (autoloads nil "epa" "epa.el" (22086 11929 698062 731000))
 ;;; Generated autoloads from epa.el
 
 (autoload 'epa-list-keys "epa" "\
@@ -8629,8 +8635,8 @@ Insert selected KEYS after the point.
 
 ;;;***
 
-;;;### (autoloads nil "epa-dired" "epa-dired.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "epa-dired" "epa-dired.el" (22086 11929 698062
+;;;;;;  731000))
 ;;; Generated autoloads from epa-dired.el
 
 (autoload 'epa-dired-do-decrypt "epa-dired" "\
@@ -8655,8 +8661,8 @@ Encrypt marked files.
 
 ;;;***
 
-;;;### (autoloads nil "epa-file" "epa-file.el" (21964 28338 113695
-;;;;;;  749000))
+;;;### (autoloads nil "epa-file" "epa-file.el" (22086 11929 698062
+;;;;;;  731000))
 ;;; Generated autoloads from epa-file.el
 
 (autoload 'epa-file-handler "epa-file" "\
@@ -8676,8 +8682,8 @@ Encrypt marked files.
 
 ;;;***
 
-;;;### (autoloads nil "epa-mail" "epa-mail.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "epa-mail" "epa-mail.el" (22086 11929 698062
+;;;;;;  731000))
 ;;; Generated autoloads from epa-mail.el
 
 (autoload 'epa-mail-mode "epa-mail" "\
@@ -8754,7 +8760,7 @@ if ARG is omitted or nil.
 
 ;;;***
 
-;;;### (autoloads nil "epg" "epg.el" (22076 35900 86633 595000))
+;;;### (autoloads nil "epg" "epg.el" (22092 27717 648268 464000))
 ;;; Generated autoloads from epg.el
 (push (purecopy '(epg 1 0 0)) package--builtin-versions)
 
@@ -8765,8 +8771,8 @@ Return a context object.
 
 ;;;***
 
-;;;### (autoloads nil "epg-config" "epg-config.el" (21927 33969 780642
-;;;;;;  720000))
+;;;### (autoloads nil "epg-config" "epg-config.el" (22086 11929 698062
+;;;;;;  731000))
 ;;; Generated autoloads from epg-config.el
 
 (autoload 'epg-configuration "epg-config" "\
@@ -8786,7 +8792,7 @@ Look at CONFIG and try to expand GROUP.
 
 ;;;***
 
-;;;### (autoloads nil "erc" "erc/erc.el" (22011 58553 477858 469000))
+;;;### (autoloads nil "erc" "erc/erc.el" (22093 48588 540393 539000))
 ;;; Generated autoloads from erc/erc.el
 (push (purecopy '(erc 5 3)) package--builtin-versions)
 
@@ -8835,36 +8841,36 @@ Otherwise, connect to HOST:PORT as USER and /join 
CHANNEL.
 
 ;;;***
 
-;;;### (autoloads nil "erc-autoaway" "erc/erc-autoaway.el" (21989
-;;;;;;  31537 763825 721000))
+;;;### (autoloads nil "erc-autoaway" "erc/erc-autoaway.el" (22086
+;;;;;;  11929 706062 731000))
 ;;; Generated autoloads from erc/erc-autoaway.el
  (autoload 'erc-autoaway-mode "erc-autoaway")
 
 ;;;***
 
-;;;### (autoloads nil "erc-button" "erc/erc-button.el" (21998 46517
-;;;;;;  30024 649000))
+;;;### (autoloads nil "erc-button" "erc/erc-button.el" (22092 27717
+;;;;;;  652268 464000))
 ;;; Generated autoloads from erc/erc-button.el
  (autoload 'erc-button-mode "erc-button" nil t)
 
 ;;;***
 
-;;;### (autoloads nil "erc-capab" "erc/erc-capab.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "erc-capab" "erc/erc-capab.el" (22086 11929
+;;;;;;  706062 731000))
 ;;; Generated autoloads from erc/erc-capab.el
  (autoload 'erc-capab-identify-mode "erc-capab" nil t)
 
 ;;;***
 
-;;;### (autoloads nil "erc-compat" "erc/erc-compat.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "erc-compat" "erc/erc-compat.el" (22086 11929
+;;;;;;  706062 731000))
 ;;; Generated autoloads from erc/erc-compat.el
  (autoload 'erc-define-minor-mode "erc-compat")
 
 ;;;***
 
-;;;### (autoloads nil "erc-dcc" "erc/erc-dcc.el" (21998 46517 30024
-;;;;;;  649000))
+;;;### (autoloads nil "erc-dcc" "erc/erc-dcc.el" (22086 11929 706062
+;;;;;;  731000))
 ;;; Generated autoloads from erc/erc-dcc.el
  (autoload 'erc-dcc-mode "erc-dcc")
 
@@ -8894,14 +8900,14 @@ that subcommand.
 ;;;***
 
 ;;;### (autoloads nil "erc-desktop-notifications" 
"erc/erc-desktop-notifications.el"
-;;;;;;  (21670 32330 885624 725000))
+;;;;;;  (22086 11929 706062 731000))
 ;;; Generated autoloads from erc/erc-desktop-notifications.el
 (autoload 'erc-notifications-mode "erc-desktop-notifications" "" t)
 
 ;;;***
 
-;;;### (autoloads nil "erc-ezbounce" "erc/erc-ezbounce.el" (21855
-;;;;;;  576 787951 155000))
+;;;### (autoloads nil "erc-ezbounce" "erc/erc-ezbounce.el" (22086
+;;;;;;  11929 710062 731000))
 ;;; Generated autoloads from erc/erc-ezbounce.el
 
 (autoload 'erc-cmd-ezb "erc-ezbounce" "\
@@ -8963,8 +8969,8 @@ Add EZBouncer convenience functions to ERC.
 
 ;;;***
 
-;;;### (autoloads nil "erc-fill" "erc/erc-fill.el" (21989 31537 771825
-;;;;;;  721000))
+;;;### (autoloads nil "erc-fill" "erc/erc-fill.el" (22086 11929 710062
+;;;;;;  731000))
 ;;; Generated autoloads from erc/erc-fill.el
  (autoload 'erc-fill-mode "erc-fill" nil t)
 
@@ -8976,8 +8982,8 @@ You can put this on `erc-insert-modify-hook' and/or 
`erc-send-modify-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "erc-identd" "erc/erc-identd.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "erc-identd" "erc/erc-identd.el" (22086 11929
+;;;;;;  710062 731000))
 ;;; Generated autoloads from erc/erc-identd.el
  (autoload 'erc-identd-mode "erc-identd")
 
@@ -8998,8 +9004,8 @@ system.
 
 ;;;***
 
-;;;### (autoloads nil "erc-imenu" "erc/erc-imenu.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "erc-imenu" "erc/erc-imenu.el" (22086 11929
+;;;;;;  710062 731000))
 ;;; Generated autoloads from erc/erc-imenu.el
 
 (autoload 'erc-create-imenu-index "erc-imenu" "\
@@ -9009,22 +9015,22 @@ system.
 
 ;;;***
 
-;;;### (autoloads nil "erc-join" "erc/erc-join.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "erc-join" "erc/erc-join.el" (22086 11929 710062
+;;;;;;  731000))
 ;;; Generated autoloads from erc/erc-join.el
  (autoload 'erc-autojoin-mode "erc-join" nil t)
 
 ;;;***
 
-;;;### (autoloads nil "erc-list" "erc/erc-list.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "erc-list" "erc/erc-list.el" (22086 11929 710062
+;;;;;;  731000))
 ;;; Generated autoloads from erc/erc-list.el
  (autoload 'erc-list-mode "erc-list")
 
 ;;;***
 
-;;;### (autoloads nil "erc-log" "erc/erc-log.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "erc-log" "erc/erc-log.el" (22086 11929 710062
+;;;;;;  731000))
 ;;; Generated autoloads from erc/erc-log.el
  (autoload 'erc-log-mode "erc-log" nil t)
 
@@ -9053,8 +9059,8 @@ You can save every individual message by putting this 
function on
 
 ;;;***
 
-;;;### (autoloads nil "erc-match" "erc/erc-match.el" (22011 58553
-;;;;;;  461858 469000))
+;;;### (autoloads nil "erc-match" "erc/erc-match.el" (22092 27717
+;;;;;;  652268 464000))
 ;;; Generated autoloads from erc/erc-match.el
  (autoload 'erc-match-mode "erc-match")
 
@@ -9100,15 +9106,15 @@ Delete dangerous-host interactively to 
`erc-dangerous-hosts'.
 
 ;;;***
 
-;;;### (autoloads nil "erc-menu" "erc/erc-menu.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "erc-menu" "erc/erc-menu.el" (22086 11929 710062
+;;;;;;  731000))
 ;;; Generated autoloads from erc/erc-menu.el
  (autoload 'erc-menu-mode "erc-menu" nil t)
 
 ;;;***
 
-;;;### (autoloads nil "erc-netsplit" "erc/erc-netsplit.el" (21670
-;;;;;;  32330 885624 725000))
+;;;### (autoloads nil "erc-netsplit" "erc/erc-netsplit.el" (22086
+;;;;;;  11929 710062 731000))
 ;;; Generated autoloads from erc/erc-netsplit.el
  (autoload 'erc-netsplit-mode "erc-netsplit")
 
@@ -9119,8 +9125,8 @@ Show who's gone.
 
 ;;;***
 
-;;;### (autoloads nil "erc-networks" "erc/erc-networks.el" (22011
-;;;;;;  58553 473858 469000))
+;;;### (autoloads nil "erc-networks" "erc/erc-networks.el" (22086
+;;;;;;  11929 710062 731000))
 ;;; Generated autoloads from erc/erc-networks.el
 
 (autoload 'erc-determine-network "erc-networks" "\
@@ -9137,8 +9143,8 @@ Interactively select a server to connect to using 
`erc-server-alist'.
 
 ;;;***
 
-;;;### (autoloads nil "erc-notify" "erc/erc-notify.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "erc-notify" "erc/erc-notify.el" (22086 11929
+;;;;;;  710062 731000))
 ;;; Generated autoloads from erc/erc-notify.el
  (autoload 'erc-notify-mode "erc-notify" nil t)
 
@@ -9156,36 +9162,36 @@ with args, toggle notify status of people.
 
 ;;;***
 
-;;;### (autoloads nil "erc-page" "erc/erc-page.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "erc-page" "erc/erc-page.el" (22086 11929 710062
+;;;;;;  731000))
 ;;; Generated autoloads from erc/erc-page.el
  (autoload 'erc-page-mode "erc-page")
 
 ;;;***
 
-;;;### (autoloads nil "erc-pcomplete" "erc/erc-pcomplete.el" (22079
-;;;;;;  12092 327174 267000))
+;;;### (autoloads nil "erc-pcomplete" "erc/erc-pcomplete.el" (22086
+;;;;;;  11929 710062 731000))
 ;;; Generated autoloads from erc/erc-pcomplete.el
  (autoload 'erc-completion-mode "erc-pcomplete" nil t)
 
 ;;;***
 
-;;;### (autoloads nil "erc-replace" "erc/erc-replace.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "erc-replace" "erc/erc-replace.el" (22086 11929
+;;;;;;  710062 731000))
 ;;; Generated autoloads from erc/erc-replace.el
  (autoload 'erc-replace-mode "erc-replace")
 
 ;;;***
 
-;;;### (autoloads nil "erc-ring" "erc/erc-ring.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "erc-ring" "erc/erc-ring.el" (22092 27717 652268
+;;;;;;  464000))
 ;;; Generated autoloads from erc/erc-ring.el
  (autoload 'erc-ring-mode "erc-ring" nil t)
 
 ;;;***
 
-;;;### (autoloads nil "erc-services" "erc/erc-services.el" (22011
-;;;;;;  58553 473858 469000))
+;;;### (autoloads nil "erc-services" "erc/erc-services.el" (22086
+;;;;;;  11929 710062 731000))
 ;;; Generated autoloads from erc/erc-services.el
  (autoload 'erc-services-mode "erc-services" nil t)
 
@@ -9202,15 +9208,15 @@ When called interactively, read the password using 
`read-passwd'.
 
 ;;;***
 
-;;;### (autoloads nil "erc-sound" "erc/erc-sound.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "erc-sound" "erc/erc-sound.el" (22086 11929
+;;;;;;  714062 731000))
 ;;; Generated autoloads from erc/erc-sound.el
  (autoload 'erc-sound-mode "erc-sound")
 
 ;;;***
 
-;;;### (autoloads nil "erc-speedbar" "erc/erc-speedbar.el" (21980
-;;;;;;  16567 521544 893000))
+;;;### (autoloads nil "erc-speedbar" "erc/erc-speedbar.el" (22086
+;;;;;;  11929 714062 731000))
 ;;; Generated autoloads from erc/erc-speedbar.el
 
 (autoload 'erc-speedbar-browser "erc-speedbar" "\
@@ -9221,22 +9227,22 @@ This will add a speedbar major display mode.
 
 ;;;***
 
-;;;### (autoloads nil "erc-spelling" "erc/erc-spelling.el" (21727
-;;;;;;  11963 635339 992000))
+;;;### (autoloads nil "erc-spelling" "erc/erc-spelling.el" (22086
+;;;;;;  11929 714062 731000))
 ;;; Generated autoloads from erc/erc-spelling.el
  (autoload 'erc-spelling-mode "erc-spelling" nil t)
 
 ;;;***
 
-;;;### (autoloads nil "erc-stamp" "erc/erc-stamp.el" (21860 18496
-;;;;;;  27951 644000))
+;;;### (autoloads nil "erc-stamp" "erc/erc-stamp.el" (22086 11929
+;;;;;;  714062 731000))
 ;;; Generated autoloads from erc/erc-stamp.el
  (autoload 'erc-timestamp-mode "erc-stamp" nil t)
 
 ;;;***
 
-;;;### (autoloads nil "erc-track" "erc/erc-track.el" (21980 16567
-;;;;;;  521544 893000))
+;;;### (autoloads nil "erc-track" "erc/erc-track.el" (22092 27717
+;;;;;;  656268 464000))
 ;;; Generated autoloads from erc/erc-track.el
 
 (defvar erc-track-minor-mode nil "\
@@ -9261,8 +9267,8 @@ keybindings will not do anything useful.
 
 ;;;***
 
-;;;### (autoloads nil "erc-truncate" "erc/erc-truncate.el" (21670
-;;;;;;  32330 885624 725000))
+;;;### (autoloads nil "erc-truncate" "erc/erc-truncate.el" (22086
+;;;;;;  11929 714062 731000))
 ;;; Generated autoloads from erc/erc-truncate.el
  (autoload 'erc-truncate-mode "erc-truncate" nil t)
 
@@ -9281,8 +9287,8 @@ Meant to be used in hooks, like `erc-insert-post-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "erc-xdcc" "erc/erc-xdcc.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "erc-xdcc" "erc/erc-xdcc.el" (22086 11929 714062
+;;;;;;  731000))
 ;;; Generated autoloads from erc/erc-xdcc.el
  (autoload 'erc-xdcc-mode "erc-xdcc")
 
@@ -9293,8 +9299,8 @@ Add a file to `erc-xdcc-files'.
 
 ;;;***
 
-;;;### (autoloads nil "ert" "emacs-lisp/ert.el" (22063 20273 739891
-;;;;;;  395000))
+;;;### (autoloads nil "ert" "emacs-lisp/ert.el" (22092 27717 632268
+;;;;;;  464000))
 ;;; Generated autoloads from emacs-lisp/ert.el
 
 (autoload 'ert-deftest "ert" "\
@@ -9312,7 +9318,7 @@ Tests that are expected to fail can be marked as such
 using :expected-result.  See `ert-test-result-type-p' for a
 description of valid values for RESULT-TYPE.
 
-\(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags '(TAG...)] 
BODY...)" nil t)
+\(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] 
BODY...)" nil t)
 
 (function-put 'ert-deftest 'doc-string-elt '3)
 
@@ -9363,8 +9369,8 @@ Display the documentation for TEST-OR-TEST-NAME (a symbol 
or ert-test).
 
 ;;;***
 
-;;;### (autoloads nil "ert-x" "emacs-lisp/ert-x.el" (22011 58553
-;;;;;;  393858 469000))
+;;;### (autoloads nil "ert-x" "emacs-lisp/ert-x.el" (22086 11929
+;;;;;;  674062 731000))
 ;;; Generated autoloads from emacs-lisp/ert-x.el
 
 (put 'ert-with-test-buffer 'lisp-indent-function 1)
@@ -9376,8 +9382,8 @@ Kill all test buffers that are still live.
 
 ;;;***
 
-;;;### (autoloads nil "esh-mode" "eshell/esh-mode.el" (22065 61995
-;;;;;;  862407 852000))
+;;;### (autoloads nil "esh-mode" "eshell/esh-mode.el" (22086 11929
+;;;;;;  722062 731000))
 ;;; Generated autoloads from eshell/esh-mode.el
 
 (autoload 'eshell-mode "esh-mode" "\
@@ -9387,8 +9393,8 @@ Emacs shell interactive mode.
 
 ;;;***
 
-;;;### (autoloads nil "eshell" "eshell/eshell.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "eshell" "eshell/eshell.el" (22086 11929 722062
+;;;;;;  731000))
 ;;; Generated autoloads from eshell/eshell.el
 (push (purecopy '(eshell 2 4 2)) package--builtin-versions)
 
@@ -9423,8 +9429,8 @@ corresponding to a successful execution.
 
 ;;;***
 
-;;;### (autoloads nil "etags" "progmodes/etags.el" (22087 6213 768351
-;;;;;;  952000))
+;;;### (autoloads nil "etags" "progmodes/etags.el" (22105 39773 947886
+;;;;;;  896000))
 ;;; Generated autoloads from progmodes/etags.el
 
 (defvar tags-file-name nil "\
@@ -9734,10 +9740,15 @@ for \\[find-tag] (which see).
 
 \(fn)" t nil)
 
+(autoload 'etags--xref-backend "etags" "\
+
+
+\(fn)" nil nil)
+
 ;;;***
 
-;;;### (autoloads nil "ethio-util" "language/ethio-util.el" (21862
-;;;;;;  60209 768658 443000))
+;;;### (autoloads nil "ethio-util" "language/ethio-util.el" (22086
+;;;;;;  11929 894062 731000))
 ;;; Generated autoloads from language/ethio-util.el
 
 (autoload 'setup-ethiopic-environment-internal "ethio-util" "\
@@ -9905,7 +9916,7 @@ With ARG, insert that many delimiters.
 
 ;;;***
 
-;;;### (autoloads nil "eudc" "net/eudc.el" (22026 25907 611502 692000))
+;;;### (autoloads nil "eudc" "net/eudc.el" (22099 965 90725 479000))
 ;;; Generated autoloads from net/eudc.el
 
 (autoload 'eudc-set-server "eudc" "\
@@ -9959,8 +9970,8 @@ This does nothing except loading eudc by autoload 
side-effect.
 
 ;;;***
 
-;;;### (autoloads nil "eudc-bob" "net/eudc-bob.el" (22026 25907 607502
-;;;;;;  692000))
+;;;### (autoloads nil "eudc-bob" "net/eudc-bob.el" (22086 11929 990062
+;;;;;;  731000))
 ;;; Generated autoloads from net/eudc-bob.el
 
 (autoload 'eudc-display-generic-binary "eudc-bob" "\
@@ -9995,8 +10006,8 @@ Display a button for the JPEG DATA.
 
 ;;;***
 
-;;;### (autoloads nil "eudc-export" "net/eudc-export.el" (22026 25907
-;;;;;;  607502 692000))
+;;;### (autoloads nil "eudc-export" "net/eudc-export.el" (22099 965
+;;;;;;  74725 479000))
 ;;; Generated autoloads from net/eudc-export.el
 
 (autoload 'eudc-insert-record-at-point-into-bbdb "eudc-export" "\
@@ -10012,8 +10023,8 @@ Call `eudc-insert-record-at-point-into-bbdb' if on a 
record.
 
 ;;;***
 
-;;;### (autoloads nil "eudc-hotlist" "net/eudc-hotlist.el" (22026
-;;;;;;  25907 607502 692000))
+;;;### (autoloads nil "eudc-hotlist" "net/eudc-hotlist.el" (22086
+;;;;;;  11929 990062 731000))
 ;;; Generated autoloads from net/eudc-hotlist.el
 
 (autoload 'eudc-edit-hotlist "eudc-hotlist" "\
@@ -10023,8 +10034,8 @@ Edit the hotlist of directory servers in a specialized 
buffer.
 
 ;;;***
 
-;;;### (autoloads nil "ewoc" "emacs-lisp/ewoc.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "ewoc" "emacs-lisp/ewoc.el" (22086 11929 674062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lisp/ewoc.el
 
 (autoload 'ewoc-create "ewoc" "\
@@ -10050,7 +10061,7 @@ fourth arg NOSEP non-nil inhibits this.
 
 ;;;***
 
-;;;### (autoloads nil "eww" "net/eww.el" (22063 20273 743891 395000))
+;;;### (autoloads nil "eww" "net/eww.el" (22093 48588 548393 539000))
 ;;; Generated autoloads from net/eww.el
 
 (defvar eww-suggest-uris '(eww-links-at-point url-get-url-at-point 
eww-current-url) "\
@@ -10097,8 +10108,8 @@ Display the bookmarks.
 
 ;;;***
 
-;;;### (autoloads nil "executable" "progmodes/executable.el" (21988
-;;;;;;  10682 37624 461000))
+;;;### (autoloads nil "executable" "progmodes/executable.el" (22086
+;;;;;;  11930 170062 731000))
 ;;; Generated autoloads from progmodes/executable.el
 
 (autoload 'executable-command-find-posix-p "executable" "\
@@ -10133,7 +10144,7 @@ file modes.
 
 ;;;***
 
-;;;### (autoloads nil "expand" "expand.el" (22011 58553 477858 469000))
+;;;### (autoloads nil "expand" "expand.el" (22086 11929 726062 731000))
 ;;; Generated autoloads from expand.el
 
 (autoload 'expand-add-abbrevs "expand" "\
@@ -10182,8 +10193,8 @@ This is used only in conjunction with 
`expand-add-abbrevs'.
 
 ;;;***
 
-;;;### (autoloads nil "f90" "progmodes/f90.el" (22071 17982 246921
-;;;;;;  531000))
+;;;### (autoloads nil "f90" "progmodes/f90.el" (22092 27718 152268
+;;;;;;  464000))
 ;;; Generated autoloads from progmodes/f90.el
 
 (autoload 'f90-mode "f90" "\
@@ -10250,8 +10261,8 @@ with no args, if that value is non-nil.
 
 ;;;***
 
-;;;### (autoloads nil "face-remap" "face-remap.el" (21888 47150 706945
-;;;;;;  440000))
+;;;### (autoloads nil "face-remap" "face-remap.el" (22086 11929 726062
+;;;;;;  731000))
 ;;; Generated autoloads from face-remap.el
 
 (autoload 'face-remap-add-relative "face-remap" "\
@@ -10410,8 +10421,8 @@ Besides the choice of face, it is the same as 
`buffer-face-mode'.
 
 ;;;***
 
-;;;### (autoloads nil "feedmail" "mail/feedmail.el" (22011 58553
-;;;;;;  677858 469000))
+;;;### (autoloads nil "feedmail" "mail/feedmail.el" (22092 27717
+;;;;;;  880268 464000))
 ;;; Generated autoloads from mail/feedmail.el
 (push (purecopy '(feedmail 11)) package--builtin-versions)
 
@@ -10445,7 +10456,7 @@ backup file names and the like).
 (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
-is triggering the reminder activity.  The default is 'on-demand, which
+is triggering the reminder activity.  The default is `on-demand', which
 is what you typically would use if you were putting this in your Emacs start-up
 or mail hook code.  Other recognized values for WHAT-EVENT (these are passed
 internally by feedmail):
@@ -10465,7 +10476,7 @@ you can set `feedmail-queue-reminder-alist' to nil.
 
 ;;;***
 
-;;;### (autoloads nil "ffap" "ffap.el" (21993 28596 82597 473000))
+;;;### (autoloads nil "ffap" "ffap.el" (22086 11929 730062 731000))
 ;;; Generated autoloads from ffap.el
 
 (autoload 'ffap-next "ffap" "\
@@ -10528,8 +10539,8 @@ Evaluate the forms in variable `ffap-bindings'.
 
 ;;;***
 
-;;;### (autoloads nil "filecache" "filecache.el" (21740 23998 26747
-;;;;;;  125000))
+;;;### (autoloads nil "filecache" "filecache.el" (22086 11929 734062
+;;;;;;  731000))
 ;;; Generated autoloads from filecache.el
 
 (autoload 'file-cache-add-directory "filecache" "\
@@ -10586,8 +10597,8 @@ the name is considered already unique; only the second 
substitution
 
 ;;;***
 
-;;;### (autoloads nil "filenotify" "filenotify.el" (22102 59970 680776
-;;;;;;  103000))
+;;;### (autoloads nil "filenotify" "filenotify.el" (22086 11929 734062
+;;;;;;  731000))
 ;;; Generated autoloads from filenotify.el
 
 (autoload 'file-notify-handle-event "filenotify" "\
@@ -10602,7 +10613,8 @@ Otherwise, signal a `file-notify-error'.
 
 ;;;***
 
-;;;### (autoloads nil "files-x" "files-x.el" (22083 9150 136915 960000))
+;;;### (autoloads nil "files-x" "files-x.el" (22086 11929 734062
+;;;;;;  731000))
 ;;; Generated autoloads from files-x.el
 
 (autoload 'add-file-local-variable "files-x" "\
@@ -10667,8 +10679,8 @@ Copy directory-local variables to the -*- line.
 
 ;;;***
 
-;;;### (autoloads nil "filesets" "filesets.el" (22026 25907 587502
-;;;;;;  692000))
+;;;### (autoloads nil "filesets" "filesets.el" (22092 27717 792268
+;;;;;;  464000))
 ;;; Generated autoloads from filesets.el
 
 (autoload 'filesets-init "filesets" "\
@@ -10679,8 +10691,8 @@ Set up hooks, load the cache file -- if existing -- and 
build the menu.
 
 ;;;***
 
-;;;### (autoloads nil "find-cmd" "find-cmd.el" (22011 58553 489858
-;;;;;;  469000))
+;;;### (autoloads nil "find-cmd" "find-cmd.el" (22086 11929 746062
+;;;;;;  731000))
 ;;; Generated autoloads from find-cmd.el
 (push (purecopy '(find-cmd 0 6)) package--builtin-versions)
 
@@ -10700,8 +10712,8 @@ result is a string that should be ready for the command 
line.
 
 ;;;***
 
-;;;### (autoloads nil "find-dired" "find-dired.el" (22011 58553 489858
-;;;;;;  469000))
+;;;### (autoloads nil "find-dired" "find-dired.el" (22086 11929 746062
+;;;;;;  731000))
 ;;; Generated autoloads from find-dired.el
 
 (autoload 'find-dired "find-dired" "\
@@ -10741,8 +10753,8 @@ use in place of \"-ls\" as the final argument.
 
 ;;;***
 
-;;;### (autoloads nil "find-file" "find-file.el" (22011 58553 489858
-;;;;;;  469000))
+;;;### (autoloads nil "find-file" "find-file.el" (22092 27717 792268
+;;;;;;  464000))
 ;;; Generated autoloads from find-file.el
 
 (defvar ff-special-constructs `((,(purecopy "^#\\s *\\(include\\|import\\)\\s 
+[<\"]\\(.*\\)[>\"]") lambda nil (buffer-substring (match-beginning 2) 
(match-end 2)))) "\
@@ -10832,8 +10844,8 @@ Visit the file you click on in another window.
 
 ;;;***
 
-;;;### (autoloads nil "find-func" "emacs-lisp/find-func.el" (22011
-;;;;;;  58553 409858 469000))
+;;;### (autoloads nil "find-func" "emacs-lisp/find-func.el" (22086
+;;;;;;  11929 678062 731000))
 ;;; Generated autoloads from emacs-lisp/find-func.el
 
 (autoload 'find-library "find-func" "\
@@ -11003,8 +11015,8 @@ Define some key bindings for the find-function family 
of functions.
 
 ;;;***
 
-;;;### (autoloads nil "find-lisp" "find-lisp.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "find-lisp" "find-lisp.el" (22086 11929 746062
+;;;;;;  731000))
 ;;; Generated autoloads from find-lisp.el
 
 (autoload 'find-lisp-find-dired "find-lisp" "\
@@ -11024,7 +11036,7 @@ Change the filter on a `find-lisp-find-dired' buffer to 
REGEXP.
 
 ;;;***
 
-;;;### (autoloads nil "finder" "finder.el" (21998 46517 46024 649000))
+;;;### (autoloads nil "finder" "finder.el" (22086 11929 750062 731000))
 ;;; Generated autoloads from finder.el
 (push (purecopy '(finder 1 0)) package--builtin-versions)
 
@@ -11046,8 +11058,8 @@ Find packages matching a given keyword.
 
 ;;;***
 
-;;;### (autoloads nil "flow-ctrl" "flow-ctrl.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "flow-ctrl" "flow-ctrl.el" (22086 11929 750062
+;;;;;;  731000))
 ;;; Generated autoloads from flow-ctrl.el
 
 (autoload 'enable-flow-control "flow-ctrl" "\
@@ -11068,8 +11080,8 @@ to get the effect of a C-q.
 
 ;;;***
 
-;;;### (autoloads nil "flow-fill" "gnus/flow-fill.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "flow-fill" "gnus/flow-fill.el" (22086 11929
+;;;;;;  774062 731000))
 ;;; Generated autoloads from gnus/flow-fill.el
 
 (autoload 'fill-flowed-encode "flow-fill" "\
@@ -11084,8 +11096,8 @@ to get the effect of a C-q.
 
 ;;;***
 
-;;;### (autoloads nil "flymake" "progmodes/flymake.el" (22011 58553
-;;;;;;  901858 469000))
+;;;### (autoloads nil "flymake" "progmodes/flymake.el" (22092 27718
+;;;;;;  156268 464000))
 ;;; Generated autoloads from progmodes/flymake.el
 (push (purecopy '(flymake 0 3)) package--builtin-versions)
 
@@ -11115,8 +11127,8 @@ Turn flymake mode off.
 
 ;;;***
 
-;;;### (autoloads nil "flyspell" "textmodes/flyspell.el" (21980 16568
-;;;;;;  77544 893000))
+;;;### (autoloads nil "flyspell" "textmodes/flyspell.el" (22086 11930
+;;;;;;  314062 731000))
 ;;; Generated autoloads from textmodes/flyspell.el
 
 (autoload 'flyspell-prog-mode "flyspell" "\
@@ -11186,14 +11198,14 @@ Flyspell whole buffer.
 
 ;;;***
 
-;;;### (autoloads nil "foldout" "foldout.el" (22011 58553 513858
-;;;;;;  469000))
+;;;### (autoloads nil "foldout" "foldout.el" (22086 11929 750062
+;;;;;;  731000))
 ;;; Generated autoloads from foldout.el
 (push (purecopy '(foldout 1 10)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "follow" "follow.el" (22023 49716 552634 164000))
+;;;### (autoloads nil "follow" "follow.el" (22096 24780 228094 47000))
 ;;; Generated autoloads from follow.el
 
 (autoload 'turn-on-follow-mode "follow" "\
@@ -11287,8 +11299,8 @@ selected if the original window is the first one in the 
frame.
 
 ;;;***
 
-;;;### (autoloads nil "footnote" "mail/footnote.el" (22026 25907
-;;;;;;  595502 692000))
+;;;### (autoloads nil "footnote" "mail/footnote.el" (22086 11929
+;;;;;;  934062 731000))
 ;;; Generated autoloads from mail/footnote.el
 (push (purecopy '(footnote 0 19)) package--builtin-versions)
 
@@ -11307,7 +11319,7 @@ play around with the following keys:
 
 ;;;***
 
-;;;### (autoloads nil "forms" "forms.el" (21981 37426 535399 97000))
+;;;### (autoloads nil "forms" "forms.el" (22086 11929 754062 731000))
 ;;; Generated autoloads from forms.el
 
 (autoload 'forms-mode "forms" "\
@@ -11343,8 +11355,8 @@ Visit a file in Forms mode in other window.
 
 ;;;***
 
-;;;### (autoloads nil "fortran" "progmodes/fortran.el" (22011 58553
-;;;;;;  901858 469000))
+;;;### (autoloads nil "fortran" "progmodes/fortran.el" (22092 27718
+;;;;;;  156268 464000))
 ;;; Generated autoloads from progmodes/fortran.el
 
 (autoload 'fortran-mode "fortran" "\
@@ -11421,8 +11433,8 @@ with no args, if that value is non-nil.
 
 ;;;***
 
-;;;### (autoloads nil "fortune" "play/fortune.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "fortune" "play/fortune.el" (22086 11930 126062
+;;;;;;  731000))
 ;;; Generated autoloads from play/fortune.el
 
 (autoload 'fortune-add-fortune "fortune" "\
@@ -11470,8 +11482,8 @@ and choose the directory as the fortune-file.
 
 ;;;***
 
-;;;### (autoloads nil "frameset" "frameset.el" (21799 41766 981374
-;;;;;;  972000))
+;;;### (autoloads nil "frameset" "frameset.el" (22086 11929 754062
+;;;;;;  731000))
 ;;; Generated autoloads from frameset.el
 
 (defvar frameset-session-filter-alist '((name . :never) (left . 
frameset-filter-iconified) (minibuffer . frameset-filter-minibuffer) (top . 
frameset-filter-iconified)) "\
@@ -11657,15 +11669,15 @@ Interactively, reads the register using 
`register-read-with-preview'.
 
 ;;;***
 
-;;;### (autoloads nil "gamegrid" "play/gamegrid.el" (21720 38720
-;;;;;;  956749 443000))
+;;;### (autoloads nil "gamegrid" "play/gamegrid.el" (22086 11930
+;;;;;;  126062 731000))
 ;;; Generated autoloads from play/gamegrid.el
 (push (purecopy '(gamegrid 1 2)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "gdb-mi" "progmodes/gdb-mi.el" (22030 22952
-;;;;;;  977158 467000))
+;;;### (autoloads nil "gdb-mi" "progmodes/gdb-mi.el" (22092 27718
+;;;;;;  172268 464000))
 ;;; Generated autoloads from progmodes/gdb-mi.el
 
 (defvar gdb-enable-debug nil "\
@@ -11742,8 +11754,8 @@ detailed description of this mode.
 
 ;;;***
 
-;;;### (autoloads nil "generic" "emacs-lisp/generic.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "generic" "emacs-lisp/generic.el" (22086 11929
+;;;;;;  678062 731000))
 ;;; Generated autoloads from emacs-lisp/generic.el
 
 (defvar generic-mode-list nil "\
@@ -11823,8 +11835,8 @@ regular expression that can be used as an element of
 
 ;;;***
 
-;;;### (autoloads nil "glasses" "progmodes/glasses.el" (22011 58553
-;;;;;;  901858 469000))
+;;;### (autoloads nil "glasses" "progmodes/glasses.el" (22086 11930
+;;;;;;  178062 731000))
 ;;; Generated autoloads from progmodes/glasses.el
 
 (autoload 'glasses-mode "glasses" "\
@@ -11838,8 +11850,8 @@ add virtual separators (like underscores) at places 
they belong to.
 
 ;;;***
 
-;;;### (autoloads nil "gmm-utils" "gnus/gmm-utils.el" (21993 28596
-;;;;;;  86597 473000))
+;;;### (autoloads nil "gmm-utils" "gnus/gmm-utils.el" (22086 11929
+;;;;;;  778062 731000))
 ;;; Generated autoloads from gnus/gmm-utils.el
 
 (autoload 'gmm-regexp-concat "gmm-utils" "\
@@ -11893,7 +11905,7 @@ DEFAULT-MAP specifies the default key map for ICON-LIST.
 
 ;;;***
 
-;;;### (autoloads nil "gnus" "gnus/gnus.el" (22011 58553 561858 469000))
+;;;### (autoloads nil "gnus" "gnus/gnus.el" (22086 11929 810062 731000))
 ;;; Generated autoloads from gnus/gnus.el
 (push (purecopy '(gnus 5 13)) package--builtin-versions)
 (when (fboundp 'custom-autoload)
@@ -11943,8 +11955,8 @@ prompt the user for the name of an NNTP server to use.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-agent" "gnus/gnus-agent.el" (21989 31537
-;;;;;;  791825 721000))
+;;;### (autoloads nil "gnus-agent" "gnus/gnus-agent.el" (22086 11929
+;;;;;;  778062 731000))
 ;;; Generated autoloads from gnus/gnus-agent.el
 
 (autoload 'gnus-unplugged "gnus-agent" "\
@@ -12034,8 +12046,8 @@ CLEAN is obsolete and ignored.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-art" "gnus/gnus-art.el" (22011 58553
-;;;;;;  521858 469000))
+;;;### (autoloads nil "gnus-art" "gnus/gnus-art.el" (22086 11929
+;;;;;;  782062 731000))
 ;;; Generated autoloads from gnus/gnus-art.el
 
 (autoload 'gnus-article-prepare-display "gnus-art" "\
@@ -12045,8 +12057,8 @@ Make the current buffer look like a nice article.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-bookmark" "gnus/gnus-bookmark.el" (22011
-;;;;;;  58553 521858 469000))
+;;;### (autoloads nil "gnus-bookmark" "gnus/gnus-bookmark.el" (22086
+;;;;;;  11929 782062 731000))
 ;;; Generated autoloads from gnus/gnus-bookmark.el
 
 (autoload 'gnus-bookmark-set "gnus-bookmark" "\
@@ -12069,8 +12081,8 @@ deletion, or > if it is flagged for displaying.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-cache" "gnus/gnus-cache.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gnus-cache" "gnus/gnus-cache.el" (22086 11929
+;;;;;;  782062 731000))
 ;;; Generated autoloads from gnus/gnus-cache.el
 
 (autoload 'gnus-jog-cache "gnus-cache" "\
@@ -12111,8 +12123,8 @@ supported.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-delay" "gnus/gnus-delay.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gnus-delay" "gnus/gnus-delay.el" (22086 11929
+;;;;;;  786062 731000))
 ;;; Generated autoloads from gnus/gnus-delay.el
 
 (autoload 'gnus-delay-article "gnus-delay" "\
@@ -12147,8 +12159,8 @@ Checking delayed messages is skipped if optional arg 
NO-CHECK is non-nil.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-diary" "gnus/gnus-diary.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gnus-diary" "gnus/gnus-diary.el" (22086 11929
+;;;;;;  786062 731000))
 ;;; Generated autoloads from gnus/gnus-diary.el
 
 (autoload 'gnus-user-format-function-d "gnus-diary" "\
@@ -12163,8 +12175,8 @@ Checking delayed messages is skipped if optional arg 
NO-CHECK is non-nil.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-dired" "gnus/gnus-dired.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gnus-dired" "gnus/gnus-dired.el" (22086 11929
+;;;;;;  786062 731000))
 ;;; Generated autoloads from gnus/gnus-dired.el
 
 (autoload 'turn-on-gnus-dired-mode "gnus-dired" "\
@@ -12174,8 +12186,8 @@ Convenience method to turn on gnus-dired-mode.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-draft" "gnus/gnus-draft.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gnus-draft" "gnus/gnus-draft.el" (22086 11929
+;;;;;;  786062 731000))
 ;;; Generated autoloads from gnus/gnus-draft.el
 
 (autoload 'gnus-draft-reminder "gnus-draft" "\
@@ -12185,8 +12197,8 @@ Reminder user if there are unsent drafts.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-fun" "gnus/gnus-fun.el" (21989 31537
-;;;;;;  811825 721000))
+;;;### (autoloads nil "gnus-fun" "gnus/gnus-fun.el" (22086 11929
+;;;;;;  786062 731000))
 ;;; Generated autoloads from gnus/gnus-fun.el
 
 (autoload 'gnus--random-face-with-type "gnus-fun" "\
@@ -12251,8 +12263,8 @@ Insert a random Face header from `gnus-face-directory'.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-gravatar" "gnus/gnus-gravatar.el" (21670
-;;;;;;  32330 885624 725000))
+;;;### (autoloads nil "gnus-gravatar" "gnus/gnus-gravatar.el" (22086
+;;;;;;  11929 786062 731000))
 ;;; Generated autoloads from gnus/gnus-gravatar.el
 
 (autoload 'gnus-treat-from-gravatar "gnus-gravatar" "\
@@ -12269,8 +12281,8 @@ If gravatars are already displayed, remove them.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-group" "gnus/gnus-group.el" (22011 58553
-;;;;;;  529858 469000))
+;;;### (autoloads nil "gnus-group" "gnus/gnus-group.el" (22086 11929
+;;;;;;  790062 731000))
 ;;; Generated autoloads from gnus/gnus-group.el
 
 (autoload 'gnus-fetch-group "gnus-group" "\
@@ -12287,8 +12299,8 @@ Pop up a frame and enter GROUP.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-html" "gnus/gnus-html.el" (21972 22452
-;;;;;;  190264 357000))
+;;;### (autoloads nil "gnus-html" "gnus/gnus-html.el" (22086 11929
+;;;;;;  790062 731000))
 ;;; Generated autoloads from gnus/gnus-html.el
 
 (autoload 'gnus-article-html "gnus-html" "\
@@ -12303,8 +12315,8 @@ Pop up a frame and enter GROUP.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-kill" "gnus/gnus-kill.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gnus-kill" "gnus/gnus-kill.el" (22086 11929
+;;;;;;  790062 731000))
 ;;; Generated autoloads from gnus/gnus-kill.el
 
 (defalias 'gnus-batch-kill 'gnus-batch-score)
@@ -12317,8 +12329,8 @@ Usage: emacs -batch -l ~/.emacs -l gnus -f 
gnus-batch-score
 
 ;;;***
 
-;;;### (autoloads nil "gnus-ml" "gnus/gnus-ml.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "gnus-ml" "gnus/gnus-ml.el" (22086 11929 790062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/gnus-ml.el
 
 (autoload 'turn-on-gnus-mailing-list-mode "gnus-ml" "\
@@ -12341,8 +12353,8 @@ Minor mode for providing mailing-list commands.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-mlspl" "gnus/gnus-mlspl.el" (22011 58553
-;;;;;;  529858 469000))
+;;;### (autoloads nil "gnus-mlspl" "gnus/gnus-mlspl.el" (22092 27717
+;;;;;;  816268 464000))
 ;;; Generated autoloads from gnus/gnus-mlspl.el
 
 (autoload 'gnus-group-split-setup "gnus-mlspl" "\
@@ -12413,9 +12425,9 @@ clauses will be generated.
 If CATCH-ALL is nil, no catch-all handling is performed, regardless of
 catch-all marks in group parameters.  Otherwise, if there is no
 selected group whose SPLIT-REGEXP matches the empty string, nor is
-there a selected group whose SPLIT-SPEC is 'catch-all, this fancy
+there a selected group whose SPLIT-SPEC is `catch-all', this fancy
 split (say, a group name) will be appended to the returned SPLIT list,
-as the last element of a '| SPLIT.
+as the last element of a `|' SPLIT.
 
 For example, given the following group parameters:
 
@@ -12442,8 +12454,8 @@ Calling (gnus-group-split-fancy nil nil 
\"mail.others\") returns:
 
 ;;;***
 
-;;;### (autoloads nil "gnus-msg" "gnus/gnus-msg.el" (21725 56638
-;;;;;;  795320 63000))
+;;;### (autoloads nil "gnus-msg" "gnus/gnus-msg.el" (22086 11929
+;;;;;;  794062 731000))
 ;;; Generated autoloads from gnus/gnus-msg.el
 
 (autoload 'gnus-msg-mail "gnus-msg" "\
@@ -12470,7 +12482,7 @@ Like `message-reply'.
 ;;;***
 
 ;;;### (autoloads nil "gnus-notifications" "gnus/gnus-notifications.el"
-;;;;;;  (21757 29489 158925 687000))
+;;;;;;  (22086 11929 794062 731000))
 ;;; Generated autoloads from gnus/gnus-notifications.el
 
 (autoload 'gnus-notifications "gnus-notifications" "\
@@ -12486,8 +12498,8 @@ This is typically a function to add in
 
 ;;;***
 
-;;;### (autoloads nil "gnus-picon" "gnus/gnus-picon.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gnus-picon" "gnus/gnus-picon.el" (22086 11929
+;;;;;;  794062 731000))
 ;;; Generated autoloads from gnus/gnus-picon.el
 
 (autoload 'gnus-treat-from-picon "gnus-picon" "\
@@ -12510,8 +12522,8 @@ If picons are already displayed, remove them.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-range" "gnus/gnus-range.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gnus-range" "gnus/gnus-range.el" (22086 11929
+;;;;;;  794062 731000))
 ;;; Generated autoloads from gnus/gnus-range.el
 
 (autoload 'gnus-sorted-difference "gnus-range" "\
@@ -12578,8 +12590,8 @@ Add NUM into sorted LIST by side effect.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-registry" "gnus/gnus-registry.el" (22011
-;;;;;;  58553 541858 469000))
+;;;### (autoloads nil "gnus-registry" "gnus/gnus-registry.el" (22086
+;;;;;;  11929 794062 731000))
 ;;; Generated autoloads from gnus/gnus-registry.el
 
 (autoload 'gnus-registry-initialize "gnus-registry" "\
@@ -12594,8 +12606,8 @@ Install the registry hooks.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-sieve" "gnus/gnus-sieve.el" (22011 58553
-;;;;;;  541858 469000))
+;;;### (autoloads nil "gnus-sieve" "gnus/gnus-sieve.el" (22086 11929
+;;;;;;  794062 731000))
 ;;; Generated autoloads from gnus/gnus-sieve.el
 
 (autoload 'gnus-sieve-update "gnus-sieve" "\
@@ -12622,8 +12634,8 @@ See the documentation for these variables and functions 
for details.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-spec" "gnus/gnus-spec.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gnus-spec" "gnus/gnus-spec.el" (22086 11929
+;;;;;;  798062 731000))
 ;;; Generated autoloads from gnus/gnus-spec.el
 
 (autoload 'gnus-update-format "gnus-spec" "\
@@ -12633,8 +12645,8 @@ Update the format specification near point.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-start" "gnus/gnus-start.el" (21993 28596
-;;;;;;  102597 473000))
+;;;### (autoloads nil "gnus-start" "gnus/gnus-start.el" (22086 11929
+;;;;;;  798062 731000))
 ;;; Generated autoloads from gnus/gnus-start.el
 
 (autoload 'gnus-declare-backend "gnus-start" "\
@@ -12644,8 +12656,8 @@ Declare back end NAME with ABILITIES as a Gnus back end.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-sum" "gnus/gnus-sum.el" (22080 32958
-;;;;;;  2580 652000))
+;;;### (autoloads nil "gnus-sum" "gnus/gnus-sum.el" (22086 11929
+;;;;;;  802062 731000))
 ;;; Generated autoloads from gnus/gnus-sum.el
 
 (autoload 'gnus-summary-bookmark-jump "gnus-sum" "\
@@ -12656,8 +12668,8 @@ BOOKMARK is a bookmark name or a bookmark record.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-sync" "gnus/gnus-sync.el" (21832 3452
-;;;;;;  581913 198000))
+;;;### (autoloads nil "gnus-sync" "gnus/gnus-sync.el" (22086 11929
+;;;;;;  802062 731000))
 ;;; Generated autoloads from gnus/gnus-sync.el
 
 (autoload 'gnus-sync-initialize "gnus-sync" "\
@@ -12672,8 +12684,8 @@ Install the sync hooks.
 
 ;;;***
 
-;;;### (autoloads nil "gnus-win" "gnus/gnus-win.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gnus-win" "gnus/gnus-win.el" (22086 11929
+;;;;;;  806062 731000))
 ;;; Generated autoloads from gnus/gnus-win.el
 
 (autoload 'gnus-add-configuration "gnus-win" "\
@@ -12683,8 +12695,8 @@ Add the window configuration CONF to 
`gnus-buffer-configuration'.
 
 ;;;***
 
-;;;### (autoloads nil "gnutls" "net/gnutls.el" (22011 58553 761858
-;;;;;;  469000))
+;;;### (autoloads nil "gnutls" "net/gnutls.el" (22086 11929 994062
+;;;;;;  731000))
 ;;; Generated autoloads from net/gnutls.el
 
 (defvar gnutls-min-prime-bits 256 "\
@@ -12700,8 +12712,8 @@ A value of nil says to use the default GnuTLS value.")
 
 ;;;***
 
-;;;### (autoloads nil "gomoku" "play/gomoku.el" (21998 46517 190024
-;;;;;;  649000))
+;;;### (autoloads nil "gomoku" "play/gomoku.el" (22086 11930 126062
+;;;;;;  731000))
 ;;; Generated autoloads from play/gomoku.el
 
 (autoload 'gomoku "gomoku" "\
@@ -12727,8 +12739,8 @@ Use \\[describe-mode] for more info.
 
 ;;;***
 
-;;;### (autoloads nil "goto-addr" "net/goto-addr.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "goto-addr" "net/goto-addr.el" (22086 11929
+;;;;;;  994062 731000))
 ;;; Generated autoloads from net/goto-addr.el
 
 (define-obsolete-function-alias 'goto-address-at-mouse 'goto-address-at-point 
"22.1")
@@ -12769,8 +12781,8 @@ Like `goto-address-mode', but only for comments and 
strings.
 
 ;;;***
 
-;;;### (autoloads nil "gravatar" "gnus/gravatar.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "gravatar" "gnus/gravatar.el" (22086 11929
+;;;;;;  810062 731000))
 ;;; Generated autoloads from gnus/gravatar.el
 
 (autoload 'gravatar-retrieve "gravatar" "\
@@ -12786,8 +12798,8 @@ Retrieve MAIL-ADDRESS gravatar and returns it.
 
 ;;;***
 
-;;;### (autoloads nil "grep" "progmodes/grep.el" (22061 64938 520287
-;;;;;;  963000))
+;;;### (autoloads nil "grep" "progmodes/grep.el" (22086 11930 178062
+;;;;;;  731000))
 ;;; Generated autoloads from progmodes/grep.el
 
 (defvar grep-window-height nil "\
@@ -12954,7 +12966,7 @@ file name to `*.gz', and sets `grep-highlight-matches' 
to `always'.
 
 ;;;***
 
-;;;### (autoloads nil "gs" "gs.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "gs" "gs.el" (22086 11929 854062 731000))
 ;;; Generated autoloads from gs.el
 
 (autoload 'gs-load-image "gs" "\
@@ -12967,8 +12979,8 @@ the form \"WINDOW-ID PIXMAP-ID\".  Value is non-nil if 
successful.
 
 ;;;***
 
-;;;### (autoloads nil "gud" "progmodes/gud.el" (22018 31799 115263
-;;;;;;  120000))
+;;;### (autoloads nil "gud" "progmodes/gud.el" (22092 27718 188268
+;;;;;;  464000))
 ;;; Generated autoloads from progmodes/gud.el
 
 (autoload 'gud-gdb "gud" "\
@@ -13063,8 +13075,8 @@ it if ARG is omitted or nil.
 
 ;;;***
 
-;;;### (autoloads nil "gv" "emacs-lisp/gv.el" (22011 58553 409858
-;;;;;;  469000))
+;;;### (autoloads nil "gv" "emacs-lisp/gv.el" (22099 26170 382017
+;;;;;;  16000))
 ;;; Generated autoloads from emacs-lisp/gv.el
 
 (autoload 'gv-get "gv" "\
@@ -13159,15 +13171,15 @@ The return value is the last VAL in the list.
 Return a reference to PLACE.
 This is like the `&' operator of the C language.
 Note: this only works reliably with lexical binding mode, except for very
-simple PLACEs such as (function-symbol 'foo) which will also work in dynamic
+simple PLACEs such as (function-symbol \\='foo) which will also work in dynamic
 binding mode.
 
 \(fn PLACE)" nil t)
 
 ;;;***
 
-;;;### (autoloads nil "handwrite" "play/handwrite.el" (22026 25907
-;;;;;;  631502 692000))
+;;;### (autoloads nil "handwrite" "play/handwrite.el" (22086 11930
+;;;;;;  130062 731000))
 ;;; Generated autoloads from play/handwrite.el
 
 (autoload 'handwrite "handwrite" "\
@@ -13184,8 +13196,8 @@ Variables: `handwrite-linespace'     (default 12)
 
 ;;;***
 
-;;;### (autoloads nil "hanoi" "play/hanoi.el" (21799 41767 31221
-;;;;;;  635000))
+;;;### (autoloads nil "hanoi" "play/hanoi.el" (22086 11930 130062
+;;;;;;  731000))
 ;;; Generated autoloads from play/hanoi.el
 
 (autoload 'hanoi "hanoi" "\
@@ -13212,8 +13224,8 @@ to be updated.
 
 ;;;***
 
-;;;### (autoloads nil "hashcash" "mail/hashcash.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "hashcash" "mail/hashcash.el" (22092 27717
+;;;;;;  880268 464000))
 ;;; Generated autoloads from mail/hashcash.el
 
 (autoload 'hashcash-insert-payment "hashcash" "\
@@ -13255,8 +13267,8 @@ Prefix arg sets default accept amount temporarily.
 
 ;;;***
 
-;;;### (autoloads nil "help-at-pt" "help-at-pt.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "help-at-pt" "help-at-pt.el" (22086 11929 854062
+;;;;;;  731000))
 ;;; Generated autoloads from help-at-pt.el
 
 (autoload 'help-at-pt-string "help-at-pt" "\
@@ -13383,8 +13395,8 @@ different regions.  With numeric argument ARG, behaves 
like
 
 ;;;***
 
-;;;### (autoloads nil "help-fns" "help-fns.el" (22083 9150 144915
-;;;;;;  960000))
+;;;### (autoloads nil "help-fns" "help-fns.el" (22101 42694 89526
+;;;;;;  804000))
 ;;; Generated autoloads from help-fns.el
 
 (autoload 'describe-function "help-fns" "\
@@ -13438,6 +13450,9 @@ it is displayed along with the global value.
 (autoload 'describe-symbol "help-fns" "\
 Display the full documentation of SYMBOL.
 Will show the info of SYMBOL as a function, variable, and/or face.
+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)
 
@@ -13468,8 +13483,8 @@ Produce a texinfo buffer with sorted doc-strings from 
the DOC file.
 
 ;;;***
 
-;;;### (autoloads nil "help-macro" "help-macro.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "help-macro" "help-macro.el" (22086 11929 854062
+;;;;;;  731000))
 ;;; Generated autoloads from help-macro.el
 
 (defvar three-step-help nil "\
@@ -13483,8 +13498,8 @@ gives the window that lists the options.")
 
 ;;;***
 
-;;;### (autoloads nil "help-mode" "help-mode.el" (21972 22452 270264
-;;;;;;  357000))
+;;;### (autoloads nil "help-mode" "help-mode.el" (22086 11929 854062
+;;;;;;  731000))
 ;;; Generated autoloads from help-mode.el
 
 (autoload 'help-mode "help-mode" "\
@@ -13585,8 +13600,8 @@ BOOKMARK is a bookmark name or a bookmark record.
 
 ;;;***
 
-;;;### (autoloads nil "helper" "emacs-lisp/helper.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "helper" "emacs-lisp/helper.el" (22086 11929
+;;;;;;  678062 731000))
 ;;; Generated autoloads from emacs-lisp/helper.el
 
 (autoload 'Helper-describe-bindings "helper" "\
@@ -13601,7 +13616,7 @@ Provide help for current mode.
 
 ;;;***
 
-;;;### (autoloads nil "hexl" "hexl.el" (22079 12092 331174 267000))
+;;;### (autoloads nil "hexl" "hexl.el" (22086 11929 858062 731000))
 ;;; Generated autoloads from hexl.el
 
 (autoload 'hexl-mode "hexl" "\
@@ -13695,8 +13710,8 @@ This discards the buffer's undo information.
 
 ;;;***
 
-;;;### (autoloads nil "hi-lock" "hi-lock.el" (21993 28596 134597
-;;;;;;  473000))
+;;;### (autoloads nil "hi-lock" "hi-lock.el" (22092 27717 860268
+;;;;;;  464000))
 ;;; Generated autoloads from hi-lock.el
 
 (autoload 'hi-lock-mode "hi-lock" "\
@@ -13744,7 +13759,7 @@ which can be called interactively, are:
   (See `font-lock-keywords'.)  They may be edited and re-loaded with 
\\[hi-lock-find-patterns],
   any valid `font-lock-keywords' form is acceptable.  When a file is
   loaded the patterns are read if `hi-lock-file-patterns-policy' is
-  'ask and the user responds y to the prompt, or if
+  `ask' and the user responds y to the prompt, or if
   `hi-lock-file-patterns-policy' is bound to a function and that
   function returns t.
 
@@ -13863,8 +13878,8 @@ be found in variable `hi-lock-interactive-patterns'.
 
 ;;;***
 
-;;;### (autoloads nil "hideif" "progmodes/hideif.el" (21989 31537
-;;;;;;  939825 721000))
+;;;### (autoloads nil "hideif" "progmodes/hideif.el" (22092 27718
+;;;;;;  188268 464000))
 ;;; Generated autoloads from progmodes/hideif.el
 
 (autoload 'hide-ifdef-mode "hideif" "\
@@ -13911,8 +13926,8 @@ Several variables affect how the hiding is done:
 
 ;;;***
 
-;;;### (autoloads nil "hideshow" "progmodes/hideshow.el" (22026 25907
-;;;;;;  635502 692000))
+;;;### (autoloads nil "hideshow" "progmodes/hideshow.el" (22093 48588
+;;;;;;  580393 539000))
 ;;; 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))) "\
@@ -13951,7 +13966,7 @@ if ARG is omitted or nil.
 
 When hideshow minor mode is on, the menu bar is augmented with hideshow
 commands and the hideshow commands are enabled.
-The value '(hs . t) is added to `buffer-invisibility-spec'.
+The value (hs . t) is added to `buffer-invisibility-spec'.
 
 The main commands are: `hs-hide-all', `hs-show-all', `hs-hide-block',
 `hs-show-block', `hs-hide-level' and `hs-toggle-hiding'.  There is also
@@ -13974,8 +13989,8 @@ Unconditionally turn off `hs-minor-mode'.
 
 ;;;***
 
-;;;### (autoloads nil "hilit-chg" "hilit-chg.el" (21980 16567 693544
-;;;;;;  893000))
+;;;### (autoloads nil "hilit-chg" "hilit-chg.el" (22086 11929 858062
+;;;;;;  731000))
 ;;; Generated autoloads from hilit-chg.el
 
 (autoload 'highlight-changes-mode "hilit-chg" "\
@@ -14106,8 +14121,8 @@ See `highlight-changes-mode' for more information on 
Highlight-Changes mode.
 
 ;;;***
 
-;;;### (autoloads nil "hippie-exp" "hippie-exp.el" (21850 34968 457268
-;;;;;;  630000))
+;;;### (autoloads nil "hippie-exp" "hippie-exp.el" (22086 11929 858062
+;;;;;;  731000))
 ;;; Generated autoloads from hippie-exp.el
 (push (purecopy '(hippie-exp 1 6)) package--builtin-versions)
 
@@ -14139,8 +14154,8 @@ argument VERBOSE non-nil makes the function verbose.
 
 ;;;***
 
-;;;### (autoloads nil "hl-line" "hl-line.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "hl-line" "hl-line.el" (22086 11929 858062
+;;;;;;  731000))
 ;;; Generated autoloads from hl-line.el
 
 (autoload 'hl-line-mode "hl-line" "\
@@ -14189,8 +14204,8 @@ Global-Hl-Line mode uses the functions 
`global-hl-line-unhighlight' and
 
 ;;;***
 
-;;;### (autoloads nil "holidays" "calendar/holidays.el" (22026 25907
-;;;;;;  551502 692000))
+;;;### (autoloads nil "holidays" "calendar/holidays.el" (22086 11929
+;;;;;;  534062 731000))
 ;;; 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 [...]
@@ -14300,8 +14315,8 @@ The optional LABEL is used to label the buffer created.
 
 ;;;***
 
-;;;### (autoloads nil "html2text" "gnus/html2text.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "html2text" "gnus/html2text.el" (22086 11929
+;;;;;;  810062 731000))
 ;;; Generated autoloads from gnus/html2text.el
 
 (autoload 'html2text "html2text" "\
@@ -14311,8 +14326,8 @@ Convert HTML to plain text in the current buffer.
 
 ;;;***
 
-;;;### (autoloads nil "htmlfontify" "htmlfontify.el" (22026 25907
-;;;;;;  591502 692000))
+;;;### (autoloads nil "htmlfontify" "htmlfontify.el" (22092 27717
+;;;;;;  864268 464000))
 ;;; Generated autoloads from htmlfontify.el
 (push (purecopy '(htmlfontify 0 21)) package--builtin-versions)
 
@@ -14345,8 +14360,8 @@ You may also want to set `hfy-page-header' and 
`hfy-page-footer'.
 
 ;;;***
 
-;;;### (autoloads nil "ibuf-macs" "ibuf-macs.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "ibuf-macs" "ibuf-macs.el" (22086 11929 862062
+;;;;;;  731000))
 ;;; Generated autoloads from ibuf-macs.el
 
 (autoload 'define-ibuffer-column "ibuf-macs" "\
@@ -14448,8 +14463,8 @@ bound to the current value of the filter.
 
 ;;;***
 
-;;;### (autoloads nil "ibuffer" "ibuffer.el" (22032 64681 350838
-;;;;;;  183000))
+;;;### (autoloads nil "ibuffer" "ibuffer.el" (22092 27717 868268
+;;;;;;  464000))
 ;;; Generated autoloads from ibuffer.el
 
 (autoload 'ibuffer-list-buffers "ibuffer" "\
@@ -14488,8 +14503,8 @@ FORMATS is the value to use for `ibuffer-formats'.
 
 ;;;***
 
-;;;### (autoloads nil "icalendar" "calendar/icalendar.el" (22026
-;;;;;;  25907 551502 692000))
+;;;### (autoloads nil "icalendar" "calendar/icalendar.el" (22092
+;;;;;;  27717 556268 464000))
 ;;; Generated autoloads from calendar/icalendar.el
 (push (purecopy '(icalendar 0 19)) package--builtin-versions)
 
@@ -14542,8 +14557,8 @@ buffer `*icalendar-errors*'.
 
 ;;;***
 
-;;;### (autoloads nil "icomplete" "icomplete.el" (21980 16567 701544
-;;;;;;  893000))
+;;;### (autoloads nil "icomplete" "icomplete.el" (22086 11929 862062
+;;;;;;  731000))
 ;;; Generated autoloads from icomplete.el
 
 (defvar icomplete-mode nil "\
@@ -14582,8 +14597,8 @@ completions:
 
 ;;;***
 
-;;;### (autoloads nil "icon" "progmodes/icon.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "icon" "progmodes/icon.el" (22086 11930 186062
+;;;;;;  731000))
 ;;; Generated autoloads from progmodes/icon.el
 
 (autoload 'icon-mode "icon" "\
@@ -14623,8 +14638,8 @@ with no args, if that value is non-nil.
 
 ;;;***
 
-;;;### (autoloads nil "idlw-shell" "progmodes/idlw-shell.el" (22011
-;;;;;;  58553 905858 469000))
+;;;### (autoloads nil "idlw-shell" "progmodes/idlw-shell.el" (22086
+;;;;;;  11930 194062 731000))
 ;;; Generated autoloads from progmodes/idlw-shell.el
 
 (autoload 'idlwave-shell "idlw-shell" "\
@@ -14649,8 +14664,8 @@ See also the variable `idlwave-shell-prompt-pattern'.
 
 ;;;***
 
-;;;### (autoloads nil "idlwave" "progmodes/idlwave.el" (22011 58553
-;;;;;;  909858 469000))
+;;;### (autoloads nil "idlwave" "progmodes/idlwave.el" (22092 27718
+;;;;;;  216268 464000))
 ;;; Generated autoloads from progmodes/idlwave.el
 (push (purecopy '(idlwave 6 1 22)) package--builtin-versions)
 
@@ -14779,7 +14794,7 @@ The main features of this mode are
 
 ;;;***
 
-;;;### (autoloads nil "ido" "ido.el" (22011 58553 641858 469000))
+;;;### (autoloads nil "ido" "ido.el" (22093 48588 548393 539000))
 ;;; Generated autoloads from ido.el
 
 (defvar ido-mode nil "\
@@ -14802,8 +14817,8 @@ With ARG, turn Ido mode on if arg is positive, off 
otherwise.
 Turning on Ido mode will remap (via a minor-mode keymap) the default
 keybindings for the `find-file' and `switch-to-buffer' families of
 commands to the Ido versions of these functions.
-However, if ARG arg equals 'files, remap only commands for files, or
-if it equals 'buffers, remap only commands for buffer switching.
+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)
@@ -15041,7 +15056,7 @@ DEF, if non-nil, is the default value.
 
 ;;;***
 
-;;;### (autoloads nil "ielm" "ielm.el" (22067 17342 170157 143000))
+;;;### (autoloads nil "ielm" "ielm.el" (22086 11929 866062 731000))
 ;;; Generated autoloads from ielm.el
 
 (autoload 'ielm "ielm" "\
@@ -15053,7 +15068,7 @@ See `inferior-emacs-lisp-mode' for details.
 
 ;;;***
 
-;;;### (autoloads nil "iimage" "iimage.el" (21990 52406 604500 385000))
+;;;### (autoloads nil "iimage" "iimage.el" (22086 11929 866062 731000))
 ;;; Generated autoloads from iimage.el
 
 (define-obsolete-function-alias 'turn-on-iimage-mode 'iimage-mode "24.1")
@@ -15069,7 +15084,7 @@ the mode if ARG is omitted or nil, and toggle it if ARG 
is `toggle'.
 
 ;;;***
 
-;;;### (autoloads nil "image" "image.el" (22048 52907 35535 316000))
+;;;### (autoloads nil "image" "image.el" (22092 27717 872268 464000))
 ;;; Generated autoloads from image.el
 
 (autoload 'image-type-from-data "image" "\
@@ -15262,8 +15277,8 @@ If Emacs is compiled without ImageMagick support, this 
does nothing.
 
 ;;;***
 
-;;;### (autoloads nil "image-dired" "image-dired.el" (22011 58553
-;;;;;;  641858 469000))
+;;;### (autoloads nil "image-dired" "image-dired.el" (22092 27717
+;;;;;;  872268 464000))
 ;;; Generated autoloads from image-dired.el
 (push (purecopy '(image-dired 0 4 11)) package--builtin-versions)
 
@@ -15400,8 +15415,8 @@ easy-to-use form.
 
 ;;;***
 
-;;;### (autoloads nil "image-file" "image-file.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "image-file" "image-file.el" (22086 11929 866062
+;;;;;;  731000))
 ;;; 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")) "\
@@ -15463,8 +15478,8 @@ An image file is one whose name has an extension in
 
 ;;;***
 
-;;;### (autoloads nil "image-mode" "image-mode.el" (22091 3267 895306
-;;;;;;  892000))
+;;;### (autoloads nil "image-mode" "image-mode.el" (22091 6875 287217
+;;;;;;  891000))
 ;;; Generated autoloads from image-mode.el
 
 (autoload 'image-mode "image-mode" "\
@@ -15511,7 +15526,7 @@ on these modes.
 
 ;;;***
 
-;;;### (autoloads nil "imenu" "imenu.el" (21986 55346 284512 613000))
+;;;### (autoloads nil "imenu" "imenu.el" (22092 27717 872268 464000))
 ;;; Generated autoloads from imenu.el
 
 (defvar imenu-sort-function nil "\
@@ -15649,8 +15664,8 @@ for more information.
 
 ;;;***
 
-;;;### (autoloads nil "ind-util" "language/ind-util.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "ind-util" "language/ind-util.el" (22086 11929
+;;;;;;  898062 731000))
 ;;; Generated autoloads from language/ind-util.el
 
 (autoload 'indian-compose-region "ind-util" "\
@@ -15680,8 +15695,8 @@ Convert old Emacs Devanagari characters to UCS.
 
 ;;;***
 
-;;;### (autoloads nil "inf-lisp" "progmodes/inf-lisp.el" (22011 58553
-;;;;;;  909858 469000))
+;;;### (autoloads nil "inf-lisp" "progmodes/inf-lisp.el" (22086 11930
+;;;;;;  206062 731000))
 ;;; Generated autoloads from progmodes/inf-lisp.el
 
 (autoload 'inferior-lisp "inf-lisp" "\
@@ -15699,7 +15714,7 @@ of `inferior-lisp-program').  Runs the hooks from
 
 ;;;***
 
-;;;### (autoloads nil "info" "info.el" (22056 47028 727798 795000))
+;;;### (autoloads nil "info" "info.el" (22086 11929 874062 731000))
 ;;; Generated autoloads from info.el
 
 (defcustom Info-default-directory-list (let* ((config-dir 
(file-name-as-directory (or (and (featurep 'ns) (let ((dir (expand-file-name 
"../info" data-directory))) (if (file-directory-p dir) dir))) 
configure-info-directory))) (prefixes (prune-directory-list '("/usr/local/" 
"/usr/" "/opt/" "/"))) (suffixes '("share/" "" "gnu/" "gnu/lib/" 
"gnu/lib/emacs/" "emacs/" "lib/" "lib/emacs/")) (standard-info-dirs (apply 
#'nconc (mapcar (lambda (pfx) (let ((dirs (mapcar (lambda (sfx) (concat pfx sfx 
[...]
@@ -15911,8 +15926,8 @@ completion alternatives to currently visited manuals.
 
 ;;;***
 
-;;;### (autoloads nil "info-look" "info-look.el" (22011 58553 641858
-;;;;;;  469000))
+;;;### (autoloads nil "info-look" "info-look.el" (22086 11929 870062
+;;;;;;  731000))
 ;;; Generated autoloads from info-look.el
 
 (autoload 'info-lookup-reset "info-look" "\
@@ -15959,8 +15974,8 @@ Perform completion on file preceding point.
 
 ;;;***
 
-;;;### (autoloads nil "info-xref" "info-xref.el" (22030 22952 929158
-;;;;;;  467000))
+;;;### (autoloads nil "info-xref" "info-xref.el" (22086 11929 870062
+;;;;;;  731000))
 ;;; Generated autoloads from info-xref.el
 (push (purecopy '(info-xref 3)) package--builtin-versions)
 
@@ -16043,8 +16058,8 @@ the sources handy.
 
 ;;;***
 
-;;;### (autoloads nil "informat" "informat.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "informat" "informat.el" (22086 11929 874062
+;;;;;;  731000))
 ;;; Generated autoloads from informat.el
 
 (autoload 'Info-tagify "informat" "\
@@ -16089,8 +16104,8 @@ For example, invoke \"emacs -batch -f 
batch-info-validate $info/ ~/*.info\"
 
 ;;;***
 
-;;;### (autoloads nil "inline" "emacs-lisp/inline.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "inline" "emacs-lisp/inline.el" (22086 11929
+;;;;;;  678062 731000))
 ;;; Generated autoloads from emacs-lisp/inline.el
 
 (autoload 'define-inline "inline" "\
@@ -16104,8 +16119,8 @@ For example, invoke \"emacs -batch -f 
batch-info-validate $info/ ~/*.info\"
 
 ;;;***
 
-;;;### (autoloads nil "inversion" "cedet/inversion.el" (21993 28595
-;;;;;;  998597 473000))
+;;;### (autoloads nil "inversion" "cedet/inversion.el" (22086 11929
+;;;;;;  550062 731000))
 ;;; Generated autoloads from cedet/inversion.el
 (push (purecopy '(inversion 1 3)) package--builtin-versions)
 
@@ -16117,8 +16132,8 @@ Only checks one based on which kind of Emacs is being 
run.
 
 ;;;***
 
-;;;### (autoloads nil "isearch-x" "international/isearch-x.el" (22003
-;;;;;;  64432 624146 533000))
+;;;### (autoloads nil "isearch-x" "international/isearch-x.el" (22086
+;;;;;;  11929 874062 731000))
 ;;; Generated autoloads from international/isearch-x.el
 
 (autoload 'isearch-toggle-specified-input-method "isearch-x" "\
@@ -16138,8 +16153,8 @@ Toggle input method in interactive search.
 
 ;;;***
 
-;;;### (autoloads nil "isearchb" "isearchb.el" (21767 65327 504606
-;;;;;;  256000))
+;;;### (autoloads nil "isearchb" "isearchb.el" (22086 11929 886062
+;;;;;;  731000))
 ;;; Generated autoloads from isearchb.el
 (push (purecopy '(isearchb 1 5)) package--builtin-versions)
 
@@ -16153,8 +16168,8 @@ accessed via isearchb.
 
 ;;;***
 
-;;;### (autoloads nil "iso-cvt" "international/iso-cvt.el" (22011
-;;;;;;  58553 645858 469000))
+;;;### (autoloads nil "iso-cvt" "international/iso-cvt.el" (22086
+;;;;;;  11929 874062 731000))
 ;;; Generated autoloads from international/iso-cvt.el
 
 (autoload 'iso-spanish "iso-cvt" "\
@@ -16245,15 +16260,15 @@ Add submenus to the File menu, to convert to and from 
various formats.
 ;;;***
 
 ;;;### (autoloads nil "iso-transl" "international/iso-transl.el"
-;;;;;;  (21840 19142 552627 956000))
+;;;;;;  (22086 11929 874062 731000))
 ;;; Generated autoloads from international/iso-transl.el
  (define-key key-translation-map "\C-x8" 'iso-transl-ctl-x-8-map)
  (autoload 'iso-transl-ctl-x-8-map "iso-transl" "Keymap for C-x 8 prefix." t 
'keymap)
 
 ;;;***
 
-;;;### (autoloads nil "ispell" "textmodes/ispell.el" (22011 58554
-;;;;;;  45858 469000))
+;;;### (autoloads nil "ispell" "textmodes/ispell.el" (22086 11930
+;;;;;;  318062 731000))
 ;;; Generated autoloads from textmodes/ispell.el
 
 (put 'ispell-check-comments 'safe-local-variable (lambda (a) (memq a '(nil t 
exclusive))))
@@ -16486,8 +16501,8 @@ You can bind this to the key C-c i in GNUS or mail by 
adding to
 
 ;;;***
 
-;;;### (autoloads nil "japan-util" "language/japan-util.el" (22011
-;;;;;;  58553 673858 469000))
+;;;### (autoloads nil "japan-util" "language/japan-util.el" (22086
+;;;;;;  11929 898062 731000))
 ;;; Generated autoloads from language/japan-util.el
 
 (autoload 'setup-japanese-environment-internal "japan-util" "\
@@ -16564,8 +16579,8 @@ If non-nil, second arg INITIAL-INPUT is a string to 
insert before reading.
 
 ;;;***
 
-;;;### (autoloads nil "jka-compr" "jka-compr.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "jka-compr" "jka-compr.el" (22086 11929 890062
+;;;;;;  731000))
 ;;; Generated autoloads from jka-compr.el
 
 (defvar jka-compr-inhibit nil "\
@@ -16588,8 +16603,8 @@ by `jka-compr-installed'.
 
 ;;;***
 
-;;;### (autoloads nil "js" "progmodes/js.el" (22069 62806 682804
-;;;;;;  836000))
+;;;### (autoloads nil "js" "progmodes/js.el" (22109 36809 299889
+;;;;;;  179000))
 ;;; Generated autoloads from progmodes/js.el
 (push (purecopy '(js 9)) package--builtin-versions)
 
@@ -16602,12 +16617,12 @@ Major mode for editing JavaScript.
 Major mode for editing JSX.
 
 To customize the indentation for this mode, set the SGML offset
-variables (`sgml-basic-offset', `sgml-attribute-offset' et al)
+variables (`sgml-basic-offset', `sgml-attribute-offset' et al.)
 locally, like so:
 
   (defun set-jsx-indentation ()
     (setq-local sgml-basic-offset js-indent-level))
-  (add-hook 'js-jsx-mode-hook #'set-jsx-indentation)
+  (add-hook \\='js-jsx-mode-hook #\\='set-jsx-indentation)
 
 \(fn)" t nil)
  (defalias 'javascript-mode 'js-mode)
@@ -16616,14 +16631,14 @@ locally, like so:
 
 ;;;***
 
-;;;### (autoloads nil "json" "json.el" (22085 50883 185731 271000))
+;;;### (autoloads nil "json" "json.el" (22101 42694 105526 804000))
 ;;; Generated autoloads from json.el
 (push (purecopy '(json 1 4)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "keypad" "emulation/keypad.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "keypad" "emulation/keypad.el" (22092 27717
+;;;;;;  636268 464000))
 ;;; Generated autoloads from emulation/keypad.el
 
 (defvar keypad-setup nil "\
@@ -16663,23 +16678,23 @@ keys are bound.
 
  Setup      Binding
  -------------------------------------------------------------
- 'prefix   Command prefix argument, i.e.  M-0 .. M-9 and M--
- 'S-cursor Bind shifted keypad keys to the shifted cursor movement keys.
- 'cursor   Bind keypad keys to the cursor movement keys.
- 'numeric  Plain numeric keypad, i.e. 0 .. 9 and .  (or DECIMAL arg)
- 'none     Removes all bindings for keypad keys in function-key-map;
-           this enables any user-defined bindings for the keypad keys
-           in the global and local keymaps.
-
-If SETUP is 'numeric and the optional fourth argument DECIMAL is non-nil,
+ `prefix'   Command prefix argument, i.e.  M-0 .. M-9 and M--
+ `S-cursor' Bind shifted keypad keys to the shifted cursor movement keys.
+ `cursor'   Bind keypad keys to the cursor movement keys.
+ `numeric'  Plain numeric keypad, i.e. 0 .. 9 and .  (or DECIMAL arg)
+ `none'     Removes all bindings for keypad keys in function-key-map;
+            this enables any user-defined bindings for the keypad keys
+            in the global and local keymaps.
+
+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)
 
 ;;;***
 
-;;;### (autoloads nil "kinsoku" "international/kinsoku.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "kinsoku" "international/kinsoku.el" (22086
+;;;;;;  11929 878062 731000))
 ;;; Generated autoloads from international/kinsoku.el
 
 (autoload 'kinsoku "kinsoku" "\
@@ -16700,8 +16715,8 @@ the context of text formatting.
 
 ;;;***
 
-;;;### (autoloads nil "kkc" "international/kkc.el" (21978 61237 570488
-;;;;;;  269000))
+;;;### (autoloads nil "kkc" "international/kkc.el" (22086 11929 878062
+;;;;;;  731000))
 ;;; Generated autoloads from international/kkc.el
 
 (defvar kkc-after-update-conversion-functions nil "\
@@ -16723,7 +16738,7 @@ and the return value is the length of the conversion.
 
 ;;;***
 
-;;;### (autoloads nil "kmacro" "kmacro.el" (21990 52406 604500 385000))
+;;;### (autoloads nil "kmacro" "kmacro.el" (22086 11929 890062 731000))
 ;;; Generated autoloads from kmacro.el
  (global-set-key "\C-x(" 'kmacro-start-macro)
  (global-set-key "\C-x)" 'kmacro-end-macro)
@@ -16835,8 +16850,8 @@ If kbd macro currently being defined end it before 
activating it.
 
 ;;;***
 
-;;;### (autoloads nil "korea-util" "language/korea-util.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "korea-util" "language/korea-util.el" (22086
+;;;;;;  11929 902062 731000))
 ;;; Generated autoloads from language/korea-util.el
 
 (defvar default-korean-keyboard (purecopy (if (string-match "3" (or (getenv 
"HANGUL_KEYBOARD_TYPE") "")) "3" "")) "\
@@ -16850,8 +16865,8 @@ The kind of Korean keyboard for Korean input method.
 
 ;;;***
 
-;;;### (autoloads nil "lao-util" "language/lao-util.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "lao-util" "language/lao-util.el" (22086 11929
+;;;;;;  902062 731000))
 ;;; Generated autoloads from language/lao-util.el
 
 (autoload 'lao-compose-string "lao-util" "\
@@ -16888,8 +16903,8 @@ Transcribe Romanized Lao string STR to Lao character 
string.
 
 ;;;***
 
-;;;### (autoloads nil "latexenc" "international/latexenc.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "latexenc" "international/latexenc.el" (22086
+;;;;;;  11929 878062 731000))
 ;;; 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-5) ("latin9" . iso-8859-15) 
("next" . next) ("utf8" . utf-8) ("utf8x" .  [...]
@@ -16921,7 +16936,7 @@ coding system names is determined from 
`latex-inputenc-coding-alist'.
 ;;;***
 
 ;;;### (autoloads nil "latin1-disp" "international/latin1-disp.el"
-;;;;;;  (22011 58553 645858 469000))
+;;;;;;  (22086 11929 878062 731000))
 ;;; Generated autoloads from international/latin1-disp.el
 
 (defvar latin1-display nil "\
@@ -16962,8 +16977,8 @@ use either \\[customize] or the function 
`latin1-display'.")
 
 ;;;***
 
-;;;### (autoloads nil "ld-script" "progmodes/ld-script.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "ld-script" "progmodes/ld-script.el" (22086
+;;;;;;  11930 210062 731000))
 ;;; Generated autoloads from progmodes/ld-script.el
 
 (autoload 'ld-script-mode "ld-script" "\
@@ -16973,8 +16988,8 @@ A major mode to edit GNU ld script files
 
 ;;;***
 
-;;;### (autoloads nil "let-alist" "emacs-lisp/let-alist.el" (21890
-;;;;;;  39605 402073 663000))
+;;;### (autoloads nil "let-alist" "emacs-lisp/let-alist.el" (22092
+;;;;;;  27717 632268 464000))
 ;;; Generated autoloads from emacs-lisp/let-alist.el
 (push (purecopy '(let-alist 1 0 4)) package--builtin-versions)
 
@@ -16993,10 +17008,10 @@ For instance, the following code
 
 essentially expands to
 
-  (let ((.title (cdr (assq 'title alist)))
-        (.body  (cdr (assq 'body alist)))
-        (.site  (cdr (assq 'site alist)))
-        (.site.contents (cdr (assq 'contents (cdr (assq 'site alist))))))
+  (let ((.title (cdr (assq \\='title alist)))
+        (.body  (cdr (assq \\='body alist)))
+        (.site  (cdr (assq \\='site alist)))
+        (.site.contents (cdr (assq \\='contents (cdr (assq \\='site alist))))))
     (if (and .title .body)
         .body
       .site
@@ -17013,7 +17028,7 @@ displayed in the example above.
 
 ;;;***
 
-;;;### (autoloads nil "life" "play/life.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "life" "play/life.el" (22086 11930 130062 731000))
 ;;; Generated autoloads from play/life.el
 
 (autoload 'life "life" "\
@@ -17026,7 +17041,7 @@ generations (this defaults to 1).
 
 ;;;***
 
-;;;### (autoloads nil "linum" "linum.el" (22092 24132 128832 464000))
+;;;### (autoloads nil "linum" "linum.el" (22086 11929 930062 731000))
 ;;; Generated autoloads from linum.el
 (push (purecopy '(linum 0 9 24)) package--builtin-versions)
 
@@ -17063,8 +17078,8 @@ See `linum-mode' for more information on Linum mode.
 
 ;;;***
 
-;;;### (autoloads nil "loadhist" "loadhist.el" (22011 58553 673858
-;;;;;;  469000))
+;;;### (autoloads nil "loadhist" "loadhist.el" (22086 11929 930062
+;;;;;;  731000))
 ;;; Generated autoloads from loadhist.el
 
 (autoload 'unload-feature "loadhist" "\
@@ -17095,7 +17110,7 @@ something strange, such as redefining an Emacs function.
 
 ;;;***
 
-;;;### (autoloads nil "locate" "locate.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "locate" "locate.el" (22086 11929 930062 731000))
 ;;; Generated autoloads from locate.el
 
 (defvar locate-ls-subdir-switches (purecopy "-al") "\
@@ -17147,8 +17162,8 @@ except that FILTER is not optional.
 
 ;;;***
 
-;;;### (autoloads nil "log-edit" "vc/log-edit.el" (22011 58554 93858
-;;;;;;  469000))
+;;;### (autoloads nil "log-edit" "vc/log-edit.el" (22092 27718 544268
+;;;;;;  464000))
 ;;; Generated autoloads from vc/log-edit.el
 
 (autoload 'log-edit "log-edit" "\
@@ -17179,8 +17194,8 @@ done.  Otherwise, it uses the current buffer.
 
 ;;;***
 
-;;;### (autoloads nil "log-view" "vc/log-view.el" (21947 19252 637252
-;;;;;;  749000))
+;;;### (autoloads nil "log-view" "vc/log-view.el" (22086 11930 378062
+;;;;;;  731000))
 ;;; Generated autoloads from vc/log-view.el
 
 (autoload 'log-view-mode "log-view" "\
@@ -17190,7 +17205,7 @@ Major mode for browsing CVS log output.
 
 ;;;***
 
-;;;### (autoloads nil "lpr" "lpr.el" (22011 58553 673858 469000))
+;;;### (autoloads nil "lpr" "lpr.el" (22086 11929 930062 731000))
 ;;; Generated autoloads from lpr.el
 
 (defvar lpr-windows-system (memq system-type '(ms-dos windows-nt)) "\
@@ -17285,8 +17300,8 @@ for further customization of the printer command.
 
 ;;;***
 
-;;;### (autoloads nil "ls-lisp" "ls-lisp.el" (21993 28596 150597
-;;;;;;  473000))
+;;;### (autoloads nil "ls-lisp" "ls-lisp.el" (22086 11929 930062
+;;;;;;  731000))
 ;;; Generated autoloads from ls-lisp.el
 
 (defvar ls-lisp-support-shell-wildcards t "\
@@ -17297,8 +17312,8 @@ Otherwise they are treated as Emacs regexps (for 
backward compatibility).")
 
 ;;;***
 
-;;;### (autoloads nil "lunar" "calendar/lunar.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "lunar" "calendar/lunar.el" (22086 11929 534062
+;;;;;;  731000))
 ;;; Generated autoloads from calendar/lunar.el
 
 (autoload 'lunar-phases "lunar" "\
@@ -17310,8 +17325,8 @@ This function is suitable for execution in an init file.
 
 ;;;***
 
-;;;### (autoloads nil "m4-mode" "progmodes/m4-mode.el" (22015 55603
-;;;;;;  805705 321000))
+;;;### (autoloads nil "m4-mode" "progmodes/m4-mode.el" (22086 11930
+;;;;;;  210062 731000))
 ;;; Generated autoloads from progmodes/m4-mode.el
 
 (autoload 'm4-mode "m4-mode" "\
@@ -17321,7 +17336,7 @@ A major mode to edit m4 macro files.
 
 ;;;***
 
-;;;### (autoloads nil "macros" "macros.el" (21887 28847 979667 16000))
+;;;### (autoloads nil "macros" "macros.el" (22086 11929 930062 731000))
 ;;; Generated autoloads from macros.el
 
 (autoload 'name-last-kbd-macro "macros" "\
@@ -17410,8 +17425,8 @@ and then select the region of un-tablified names and use
 
 ;;;***
 
-;;;### (autoloads nil "mail-extr" "mail/mail-extr.el" (22026 25907
-;;;;;;  599502 692000))
+;;;### (autoloads nil "mail-extr" "mail/mail-extr.el" (22086 11929
+;;;;;;  934062 731000))
 ;;; Generated autoloads from mail/mail-extr.el
 
 (autoload 'mail-extract-address-components "mail-extr" "\
@@ -17441,8 +17456,8 @@ Convert mail domain DOMAIN to the country it 
corresponds to.
 
 ;;;***
 
-;;;### (autoloads nil "mail-hist" "mail/mail-hist.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "mail-hist" "mail/mail-hist.el" (22086 11929
+;;;;;;  934062 731000))
 ;;; Generated autoloads from mail/mail-hist.el
 
 (autoload 'mail-hist-define-keys "mail-hist" "\
@@ -17471,8 +17486,8 @@ This function normally would be called when the message 
is sent.
 
 ;;;***
 
-;;;### (autoloads nil "mail-utils" "mail/mail-utils.el" (21964 28338
-;;;;;;  125695 749000))
+;;;### (autoloads nil "mail-utils" "mail/mail-utils.el" (22086 11929
+;;;;;;  934062 731000))
 ;;; Generated autoloads from mail/mail-utils.el
 
 (defvar mail-use-rfc822 nil "\
@@ -17546,8 +17561,8 @@ matches may be returned from the message body.
 
 ;;;***
 
-;;;### (autoloads nil "mailabbrev" "mail/mailabbrev.el" (21850 35149
-;;;;;;  497265 880000))
+;;;### (autoloads nil "mailabbrev" "mail/mailabbrev.el" (22086 11929
+;;;;;;  938062 731000))
 ;;; Generated autoloads from mail/mailabbrev.el
 
 (defvar mail-abbrevs-mode nil "\
@@ -17596,8 +17611,8 @@ double-quotes.
 
 ;;;***
 
-;;;### (autoloads nil "mailalias" "mail/mailalias.el" (21993 28596
-;;;;;;  166597 473000))
+;;;### (autoloads nil "mailalias" "mail/mailalias.el" (22086 11929
+;;;;;;  938062 731000))
 ;;; Generated autoloads from mail/mailalias.el
 
 (defvar mail-complete-style 'angles "\
@@ -17650,8 +17665,8 @@ current header, calls `mail-complete-function' and 
passes prefix ARG if any.
 
 ;;;***
 
-;;;### (autoloads nil "mailclient" "mail/mailclient.el" (22011 58553
-;;;;;;  693858 469000))
+;;;### (autoloads nil "mailclient" "mail/mailclient.el" (22086 11929
+;;;;;;  938062 731000))
 ;;; Generated autoloads from mail/mailclient.el
 
 (autoload 'mailclient-send-it "mailclient" "\
@@ -17663,8 +17678,8 @@ The mail client is taken to be the handler of mailto 
URLs.
 
 ;;;***
 
-;;;### (autoloads nil "make-mode" "progmodes/make-mode.el" (22011
-;;;;;;  58553 913858 469000))
+;;;### (autoloads nil "make-mode" "progmodes/make-mode.el" (22086
+;;;;;;  11930 210062 731000))
 ;;; Generated autoloads from progmodes/make-mode.el
 
 (autoload 'makefile-mode "make-mode" "\
@@ -17781,8 +17796,8 @@ An adapted `makefile-mode' that knows about imake.
 
 ;;;***
 
-;;;### (autoloads nil "makesum" "makesum.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "makesum" "makesum.el" (22086 11929 954062
+;;;;;;  731000))
 ;;; Generated autoloads from makesum.el
 
 (autoload 'make-command-summary "makesum" "\
@@ -17793,7 +17808,7 @@ Previous contents of that buffer are killed first.
 
 ;;;***
 
-;;;### (autoloads nil "man" "man.el" (22026 25907 603502 692000))
+;;;### (autoloads nil "man" "man.el" (22086 11929 954062 731000))
 ;;; Generated autoloads from man.el
 
 (defalias 'manual-entry 'man)
@@ -17849,14 +17864,14 @@ Default bookmark handler for Man buffers.
 
 ;;;***
 
-;;;### (autoloads nil "map" "emacs-lisp/map.el" (22084 30014 55762
-;;;;;;  3000))
+;;;### (autoloads nil "map" "emacs-lisp/map.el" (22086 11929 678062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lisp/map.el
 (push (purecopy '(map 1 0)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "master" "master.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "master" "master.el" (22086 11929 954062 731000))
 ;;; Generated autoloads from master.el
 (push (purecopy '(master 1 0 2)) package--builtin-versions)
 
@@ -17879,8 +17894,8 @@ yourself the value of `master-of' by calling 
`master-show-slave'.
 
 ;;;***
 
-;;;### (autoloads nil "mb-depth" "mb-depth.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "mb-depth" "mb-depth.el" (22086 11929 958062
+;;;;;;  731000))
 ;;; Generated autoloads from mb-depth.el
 
 (defvar minibuffer-depth-indicate-mode nil "\
@@ -17907,14 +17922,14 @@ recursion depth in the minibuffer prompt.  This is 
only useful if
 
 ;;;***
 
-;;;### (autoloads nil "md4" "md4.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "md4" "md4.el" (22086 11929 958062 731000))
 ;;; Generated autoloads from md4.el
 (push (purecopy '(md4 1 0)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "message" "gnus/message.el" (22011 58553 581858
-;;;;;;  469000))
+;;;### (autoloads nil "message" "gnus/message.el" (22092 27717 852268
+;;;;;;  464000))
 ;;; 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)
@@ -18079,8 +18094,8 @@ which specify the range to operate on.
 
 ;;;***
 
-;;;### (autoloads nil "meta-mode" "progmodes/meta-mode.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "meta-mode" "progmodes/meta-mode.el" (22086
+;;;;;;  11930 210062 731000))
 ;;; Generated autoloads from progmodes/meta-mode.el
 (push (purecopy '(meta-mode 1 0)) package--builtin-versions)
 
@@ -18096,8 +18111,8 @@ Major mode for editing MetaPost sources.
 
 ;;;***
 
-;;;### (autoloads nil "metamail" "mail/metamail.el" (21980 16567
-;;;;;;  769544 893000))
+;;;### (autoloads nil "metamail" "mail/metamail.el" (22086 11929
+;;;;;;  938062 731000))
 ;;; Generated autoloads from mail/metamail.el
 
 (autoload 'metamail-interpret-header "metamail" "\
@@ -18140,8 +18155,8 @@ redisplayed as output is inserted.
 
 ;;;***
 
-;;;### (autoloads nil "mh-comp" "mh-e/mh-comp.el" (22011 58553 729858
-;;;;;;  469000))
+;;;### (autoloads nil "mh-comp" "mh-e/mh-comp.el" (22086 11929 970062
+;;;;;;  731000))
 ;;; Generated autoloads from mh-e/mh-comp.el
 
 (autoload 'mh-smail "mh-comp" "\
@@ -18231,7 +18246,7 @@ delete the draft message.
 
 ;;;***
 
-;;;### (autoloads nil "mh-e" "mh-e/mh-e.el" (22030 22952 945158 467000))
+;;;### (autoloads nil "mh-e" "mh-e/mh-e.el" (22092 27717 888268 464000))
 ;;; Generated autoloads from mh-e/mh-e.el
 (push (purecopy '(mh-e 8 6)) package--builtin-versions)
 
@@ -18248,8 +18263,8 @@ Display version information about MH-E and the MH mail 
handling system.
 
 ;;;***
 
-;;;### (autoloads nil "mh-folder" "mh-e/mh-folder.el" (22011 58553
-;;;;;;  749858 469000))
+;;;### (autoloads nil "mh-folder" "mh-e/mh-folder.el" (22086 11929
+;;;;;;  970062 731000))
 ;;; Generated autoloads from mh-e/mh-folder.el
 
 (autoload 'mh-rmail "mh-folder" "\
@@ -18330,8 +18345,8 @@ perform the operation on all messages in that region.
 
 ;;;***
 
-;;;### (autoloads nil "midnight" "midnight.el" (21822 58098 20521
-;;;;;;  61000))
+;;;### (autoloads nil "midnight" "midnight.el" (22086 11929 978062
+;;;;;;  731000))
 ;;; Generated autoloads from midnight.el
 
 (defvar midnight-mode nil "\
@@ -18371,8 +18386,8 @@ to its second argument TM.
 
 ;;;***
 
-;;;### (autoloads nil "minibuf-eldef" "minibuf-eldef.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "minibuf-eldef" "minibuf-eldef.el" (22086 11929
+;;;;;;  978062 731000))
 ;;; Generated autoloads from minibuf-eldef.el
 
 (defvar minibuffer-electric-default-mode nil "\
@@ -18401,7 +18416,7 @@ is modified to remove the default indication.
 
 ;;;***
 
-;;;### (autoloads nil "misc" "misc.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "misc" "misc.el" (22086 11929 982062 731000))
 ;;; Generated autoloads from misc.el
 
 (autoload 'butterfly "misc" "\
@@ -18429,7 +18444,8 @@ The return value is always nil.
 
 ;;;***
 
-;;;### (autoloads nil "misearch" "misearch.el" (21797 36 720489 297000))
+;;;### (autoloads nil "misearch" "misearch.el" (22086 11929 982062
+;;;;;;  731000))
 ;;; Generated autoloads from misearch.el
  (add-hook 'isearch-mode-hook 'multi-isearch-setup)
 
@@ -18517,8 +18533,8 @@ whose file names match the specified wildcard.
 
 ;;;***
 
-;;;### (autoloads nil "mixal-mode" "progmodes/mixal-mode.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "mixal-mode" "progmodes/mixal-mode.el" (22086
+;;;;;;  11930 210062 731000))
 ;;; Generated autoloads from progmodes/mixal-mode.el
 (push (purecopy '(mixal-mode 0 1)) package--builtin-versions)
 
@@ -18529,8 +18545,8 @@ Major mode for the mixal asm language.
 
 ;;;***
 
-;;;### (autoloads nil "mm-encode" "gnus/mm-encode.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "mm-encode" "gnus/mm-encode.el" (22086 11929
+;;;;;;  818062 731000))
 ;;; Generated autoloads from gnus/mm-encode.el
 
 (autoload 'mm-default-file-encoding "mm-encode" "\
@@ -18540,8 +18556,8 @@ Return a default encoding for FILE.
 
 ;;;***
 
-;;;### (autoloads nil "mm-extern" "gnus/mm-extern.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "mm-extern" "gnus/mm-extern.el" (22086 11929
+;;;;;;  818062 731000))
 ;;; Generated autoloads from gnus/mm-extern.el
 
 (autoload 'mm-extern-cache-contents "mm-extern" "\
@@ -18559,8 +18575,8 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing 
after replacing.
 
 ;;;***
 
-;;;### (autoloads nil "mm-partial" "gnus/mm-partial.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "mm-partial" "gnus/mm-partial.el" (22086 11929
+;;;;;;  818062 731000))
 ;;; Generated autoloads from gnus/mm-partial.el
 
 (autoload 'mm-inline-partial "mm-partial" "\
@@ -18573,8 +18589,8 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing 
after replacing.
 
 ;;;***
 
-;;;### (autoloads nil "mm-url" "gnus/mm-url.el" (22084 30014 55762
-;;;;;;  3000))
+;;;### (autoloads nil "mm-url" "gnus/mm-url.el" (22086 11929 818062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/mm-url.el
 
 (autoload 'mm-url-insert-file-contents "mm-url" "\
@@ -18590,8 +18606,8 @@ Insert file contents of URL using `mm-url-program'.
 
 ;;;***
 
-;;;### (autoloads nil "mm-uu" "gnus/mm-uu.el" (22010 37685 116774
-;;;;;;  305000))
+;;;### (autoloads nil "mm-uu" "gnus/mm-uu.el" (22086 11929 818062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/mm-uu.el
 
 (autoload 'mm-uu-dissect "mm-uu" "\
@@ -18610,7 +18626,7 @@ Assume text has been decoded if DECODED is non-nil.
 
 ;;;***
 
-;;;### (autoloads nil "mml" "gnus/mml.el" (21826 49866 790514 606000))
+;;;### (autoloads nil "mml" "gnus/mml.el" (22086 11929 822062 731000))
 ;;; Generated autoloads from gnus/mml.el
 
 (autoload 'mml-to-mime "mml" "\
@@ -18635,8 +18651,8 @@ body) or \"attachment\" (separate from the body).
 
 ;;;***
 
-;;;### (autoloads nil "mml1991" "gnus/mml1991.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "mml1991" "gnus/mml1991.el" (22086 11929 822062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/mml1991.el
 
 (autoload 'mml1991-encrypt "mml1991" "\
@@ -18651,8 +18667,8 @@ body) or \"attachment\" (separate from the body).
 
 ;;;***
 
-;;;### (autoloads nil "mml2015" "gnus/mml2015.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "mml2015" "gnus/mml2015.el" (22086 11929 822062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/mml2015.el
 
 (autoload 'mml2015-decrypt "mml2015" "\
@@ -18692,16 +18708,16 @@ body) or \"attachment\" (separate from the body).
 
 ;;;***
 
-;;;### (autoloads nil "mode-local" "cedet/mode-local.el" (22030 22952
-;;;;;;  905158 467000))
+;;;### (autoloads nil "mode-local" "cedet/mode-local.el" (22096 24780
+;;;;;;  204094 47000))
 ;;; Generated autoloads from cedet/mode-local.el
 
 (put 'define-overloadable-function 'doc-string-elt 3)
 
 ;;;***
 
-;;;### (autoloads nil "modula2" "progmodes/modula2.el" (21607 54478
-;;;;;;  800121 42000))
+;;;### (autoloads nil "modula2" "progmodes/modula2.el" (22086 11930
+;;;;;;  214062 731000))
 ;;; Generated autoloads from progmodes/modula2.el
 
 (defalias 'modula-2-mode 'm2-mode)
@@ -18734,8 +18750,8 @@ followed by the first character of the construct.
 
 ;;;***
 
-;;;### (autoloads nil "morse" "play/morse.el" (22026 25907 631502
-;;;;;;  692000))
+;;;### (autoloads nil "morse" "play/morse.el" (22086 11930 130062
+;;;;;;  731000))
 ;;; Generated autoloads from play/morse.el
 
 (autoload 'morse-region "morse" "\
@@ -18760,8 +18776,8 @@ Convert NATO phonetic alphabet in region to ordinary 
ASCII text.
 
 ;;;***
 
-;;;### (autoloads nil "mouse-drag" "mouse-drag.el" (21993 28596 194597
-;;;;;;  473000))
+;;;### (autoloads nil "mouse-drag" "mouse-drag.el" (22086 11929 982062
+;;;;;;  731000))
 ;;; Generated autoloads from mouse-drag.el
 
 (autoload 'mouse-drag-throw "mouse-drag" "\
@@ -18808,7 +18824,7 @@ To test this function, evaluate:
 
 ;;;***
 
-;;;### (autoloads nil "mpc" "mpc.el" (22093 44991 770016 539000))
+;;;### (autoloads nil "mpc" "mpc.el" (22105 39773 859886 896000))
 ;;; Generated autoloads from mpc.el
 
 (autoload 'mpc "mpc" "\
@@ -18818,7 +18834,7 @@ Main entry point for MPC.
 
 ;;;***
 
-;;;### (autoloads nil "mpuz" "play/mpuz.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "mpuz" "play/mpuz.el" (22086 11930 130062 731000))
 ;;; Generated autoloads from play/mpuz.el
 
 (autoload 'mpuz "mpuz" "\
@@ -18828,7 +18844,7 @@ Multiplication puzzle with GNU Emacs.
 
 ;;;***
 
-;;;### (autoloads nil "msb" "msb.el" (22011 58553 757858 469000))
+;;;### (autoloads nil "msb" "msb.el" (22086 11929 986062 731000))
 ;;; Generated autoloads from msb.el
 
 (defvar msb-mode nil "\
@@ -18853,8 +18869,8 @@ different buffer menu using the function `msb'.
 
 ;;;***
 
-;;;### (autoloads nil "mule-diag" "international/mule-diag.el" (21998
-;;;;;;  46517 78024 649000))
+;;;### (autoloads nil "mule-diag" "international/mule-diag.el" (22086
+;;;;;;  11929 882062 731000))
 ;;; Generated autoloads from international/mule-diag.el
 
 (autoload 'list-character-sets "mule-diag" "\
@@ -18986,8 +19002,8 @@ The default is 20.  If LIMIT is negative, do not limit 
the listing.
 
 ;;;***
 
-;;;### (autoloads nil "mule-util" "international/mule-util.el" (22002
-;;;;;;  43570 532887 749000))
+;;;### (autoloads nil "mule-util" "international/mule-util.el" (22108
+;;;;;;  15942 546032 987000))
 ;;; Generated autoloads from international/mule-util.el
 
 (defsubst string-to-list (string) "\
@@ -19146,8 +19162,8 @@ QUALITY can be:
 
 ;;;***
 
-;;;### (autoloads nil "net-utils" "net/net-utils.el" (22011 58553
-;;;;;;  761858 469000))
+;;;### (autoloads nil "net-utils" "net/net-utils.el" (22086 11929
+;;;;;;  998062 731000))
 ;;; Generated autoloads from net/net-utils.el
 
 (autoload 'ifconfig "net-utils" "\
@@ -19241,8 +19257,8 @@ Open a network connection to HOST on PORT.
 
 ;;;***
 
-;;;### (autoloads nil "netrc" "net/netrc.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "netrc" "net/netrc.el" (22086 11929 998062
+;;;;;;  731000))
 ;;; Generated autoloads from net/netrc.el
 
 (autoload 'netrc-credentials "netrc" "\
@@ -19254,8 +19270,8 @@ listed in the PORTS list.
 
 ;;;***
 
-;;;### (autoloads nil "network-stream" "net/network-stream.el" (21855
-;;;;;;  577 147947 107000))
+;;;### (autoloads nil "network-stream" "net/network-stream.el" (22086
+;;;;;;  11929 998062 731000))
 ;;; Generated autoloads from net/network-stream.el
 
 (autoload 'open-network-stream "network-stream" "\
@@ -19351,8 +19367,8 @@ asynchronously, if possible.
 
 ;;;***
 
-;;;### (autoloads nil "newst-backend" "net/newst-backend.el" (22011
-;;;;;;  58553 765858 469000))
+;;;### (autoloads nil "newst-backend" "net/newst-backend.el" (22092
+;;;;;;  27717 964268 464000))
 ;;; Generated autoloads from net/newst-backend.el
 
 (autoload 'newsticker-running-p "newst-backend" "\
@@ -19374,7 +19390,7 @@ Run `newsticker-start-hook' if newsticker was not 
running already.
 ;;;***
 
 ;;;### (autoloads nil "newst-plainview" "net/newst-plainview.el"
-;;;;;;  (21980 16567 809544 893000))
+;;;;;;  (22092 27717 980268 464000))
 ;;; Generated autoloads from net/newst-plainview.el
 
 (autoload 'newsticker-plainview "newst-plainview" "\
@@ -19384,8 +19400,8 @@ Start newsticker plainview.
 
 ;;;***
 
-;;;### (autoloads nil "newst-reader" "net/newst-reader.el" (22011
-;;;;;;  58553 765858 469000))
+;;;### (autoloads nil "newst-reader" "net/newst-reader.el" (22086
+;;;;;;  11929 998062 731000))
 ;;; Generated autoloads from net/newst-reader.el
 
 (autoload 'newsticker-show-news "newst-reader" "\
@@ -19395,8 +19411,8 @@ Start reading news.  You may want to bind this to a key.
 
 ;;;***
 
-;;;### (autoloads nil "newst-ticker" "net/newst-ticker.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "newst-ticker" "net/newst-ticker.el" (22086
+;;;;;;  11929 998062 731000))
 ;;; Generated autoloads from net/newst-ticker.el
 
 (autoload 'newsticker-ticker-running-p "newst-ticker" "\
@@ -19416,8 +19432,8 @@ running already.
 
 ;;;***
 
-;;;### (autoloads nil "newst-treeview" "net/newst-treeview.el" (22030
-;;;;;;  22952 973158 467000))
+;;;### (autoloads nil "newst-treeview" "net/newst-treeview.el" (22109
+;;;;;;  36809 263889 179000))
 ;;; Generated autoloads from net/newst-treeview.el
 
 (autoload 'newsticker-treeview "newst-treeview" "\
@@ -19427,8 +19443,8 @@ Start newsticker treeview.
 
 ;;;***
 
-;;;### (autoloads nil "nndiary" "gnus/nndiary.el" (21990 52406 596500
-;;;;;;  385000))
+;;;### (autoloads nil "nndiary" "gnus/nndiary.el" (22086 11929 822062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/nndiary.el
 
 (autoload 'nndiary-generate-nov-databases "nndiary" "\
@@ -19438,8 +19454,8 @@ Generate NOV databases in all nndiary directories.
 
 ;;;***
 
-;;;### (autoloads nil "nndoc" "gnus/nndoc.el" (22011 58553 585858
-;;;;;;  469000))
+;;;### (autoloads nil "nndoc" "gnus/nndoc.el" (22086 11929 822062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/nndoc.el
 
 (autoload 'nndoc-add-type "nndoc" "\
@@ -19453,8 +19469,8 @@ symbol in the alist.
 
 ;;;***
 
-;;;### (autoloads nil "nnfolder" "gnus/nnfolder.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "nnfolder" "gnus/nnfolder.el" (22086 11929
+;;;;;;  826062 731000))
 ;;; Generated autoloads from gnus/nnfolder.el
 
 (autoload 'nnfolder-generate-active-file "nnfolder" "\
@@ -19465,7 +19481,7 @@ This command does not work if you use short group names.
 
 ;;;***
 
-;;;### (autoloads nil "nnml" "gnus/nnml.el" (22054 5291 911134 163000))
+;;;### (autoloads nil "nnml" "gnus/nnml.el" (22102 63557 304509 103000))
 ;;; Generated autoloads from gnus/nnml.el
 
 (autoload 'nnml-generate-nov-databases "nnml" "\
@@ -19475,7 +19491,7 @@ Generate NOV databases in all nnml directories.
 
 ;;;***
 
-;;;### (autoloads nil "novice" "novice.el" (21985 34484 234705 925000))
+;;;### (autoloads nil "novice" "novice.el" (22086 11930 22062 731000))
 ;;; Generated autoloads from novice.el
 
 (define-obsolete-variable-alias 'disabled-command-hook 
'disabled-command-function "22.1")
@@ -19507,8 +19523,8 @@ future sessions.
 
 ;;;***
 
-;;;### (autoloads nil "nroff-mode" "textmodes/nroff-mode.el" (21670
-;;;;;;  32331 885635 586000))
+;;;### (autoloads nil "nroff-mode" "textmodes/nroff-mode.el" (22086
+;;;;;;  11930 318062 731000))
 ;;; Generated autoloads from textmodes/nroff-mode.el
 
 (autoload 'nroff-mode "nroff-mode" "\
@@ -19522,14 +19538,14 @@ closing requests for requests that are used in 
matched pairs.
 
 ;;;***
 
-;;;### (autoloads nil "ntlm" "net/ntlm.el" (22069 62806 678804 836000))
+;;;### (autoloads nil "ntlm" "net/ntlm.el" (22086 11930 2062 731000))
 ;;; Generated autoloads from net/ntlm.el
 (push (purecopy '(ntlm 2 0 0)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "nxml-glyph" "nxml/nxml-glyph.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "nxml-glyph" "nxml/nxml-glyph.el" (22086 11930
+;;;;;;  26062 731000))
 ;;; Generated autoloads from nxml/nxml-glyph.el
 
 (autoload 'nxml-glyph-display-string "nxml-glyph" "\
@@ -19541,8 +19557,8 @@ Return nil if the face cannot display a glyph for N.
 
 ;;;***
 
-;;;### (autoloads nil "nxml-mode" "nxml/nxml-mode.el" (22021 7991
-;;;;;;  61719 83000))
+;;;### (autoloads nil "nxml-mode" "nxml/nxml-mode.el" (22086 11930
+;;;;;;  26062 731000))
 ;;; Generated autoloads from nxml/nxml-mode.el
 
 (autoload 'nxml-mode "nxml-mode" "\
@@ -19602,8 +19618,8 @@ Many aspects this mode can be customized using
 
 ;;;***
 
-;;;### (autoloads nil "nxml-uchnm" "nxml/nxml-uchnm.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "nxml-uchnm" "nxml/nxml-uchnm.el" (22086 11930
+;;;;;;  26062 731000))
 ;;; Generated autoloads from nxml/nxml-uchnm.el
 
 (autoload 'nxml-enable-unicode-char-name-sets "nxml-uchnm" "\
@@ -19615,8 +19631,8 @@ the variable `nxml-enabled-unicode-blocks'.
 
 ;;;***
 
-;;;### (autoloads nil "octave" "progmodes/octave.el" (22027 46774
-;;;;;;  680310 591000))
+;;;### (autoloads nil "octave" "progmodes/octave.el" (22086 11930
+;;;;;;  214062 731000))
 ;;; Generated autoloads from progmodes/octave.el
 
 (autoload 'octave-mode "octave" "\
@@ -19653,8 +19669,8 @@ startup file, `~/.emacs-octave'.
 
 ;;;***
 
-;;;### (autoloads nil "opascal" "progmodes/opascal.el" (21948 40114
-;;;;;;  450686 453000))
+;;;### (autoloads nil "opascal" "progmodes/opascal.el" (22086 11930
+;;;;;;  214062 731000))
 ;;; Generated autoloads from progmodes/opascal.el
 
 (define-obsolete-function-alias 'delphi-mode 'opascal-mode "24.4")
@@ -19689,7 +19705,7 @@ Coloring:
 
 ;;;***
 
-;;;### (autoloads nil "org" "org/org.el" (22011 58553 849858 469000))
+;;;### (autoloads nil "org" "org/org.el" (22092 27718 88268 464000))
 ;;; Generated autoloads from org/org.el
 
 (autoload 'org-babel-do-load-languages "org" "\
@@ -19910,8 +19926,8 @@ Call the customize function with org as argument.
 
 ;;;***
 
-;;;### (autoloads nil "org-agenda" "org/org-agenda.el" (22011 58553
-;;;;;;  805858 469000))
+;;;### (autoloads nil "org-agenda" "org/org-agenda.el" (22092 27718
+;;;;;;  24268 464000))
 ;;; Generated autoloads from org/org-agenda.el
 
 (autoload 'org-toggle-sticky-agenda "org-agenda" "\
@@ -20135,8 +20151,8 @@ Do we have a reason to ignore this TODO entry because 
it has a time stamp?
 
 (autoload 'org-agenda-set-restriction-lock "org-agenda" "\
 Set restriction lock for agenda, to current subtree or file.
-Restriction will be the file if TYPE is `file', or if type is the
-universal prefix '(4), or if the cursor is before the first headline
+Restriction will be the file if TYPE is `file', or if TYPE is the
+universal prefix `(4)', or if the cursor is before the first headline
 in the file.  Otherwise, restriction will be to the current subtree.
 
 \(fn &optional TYPE)" t nil)
@@ -20184,8 +20200,8 @@ to override `appt-message-warning-time'.
 
 ;;;***
 
-;;;### (autoloads nil "org-capture" "org/org-capture.el" (21993 28596
-;;;;;;  242597 473000))
+;;;### (autoloads nil "org-capture" "org/org-capture.el" (22086 11930
+;;;;;;  82062 731000))
 ;;; Generated autoloads from org/org-capture.el
 
 (autoload 'org-capture-string "org-capture" "\
@@ -20227,8 +20243,8 @@ Set `org-capture-templates' to be similar to 
`org-remember-templates'.
 
 ;;;***
 
-;;;### (autoloads nil "org-colview" "org/org-colview.el" (22011 58553
-;;;;;;  809858 469000))
+;;;### (autoloads nil "org-colview" "org/org-colview.el" (22086 11930
+;;;;;;  82062 731000))
 ;;; Generated autoloads from org/org-colview.el
 
 (autoload 'org-columns-remove-overlays "org-colview" "\
@@ -20291,8 +20307,8 @@ Turn on or update column view in the agenda.
 
 ;;;***
 
-;;;### (autoloads nil "org-compat" "org/org-compat.el" (21988 10681
-;;;;;;  989624 461000))
+;;;### (autoloads nil "org-compat" "org/org-compat.el" (22086 11930
+;;;;;;  82062 731000))
 ;;; Generated autoloads from org/org-compat.el
 
 (autoload 'org-check-version "org-compat" "\
@@ -20302,8 +20318,8 @@ Try very hard to provide sensible version strings.
 
 ;;;***
 
-;;;### (autoloads nil "org-macs" "org/org-macs.el" (21855 577 287944
-;;;;;;  835000))
+;;;### (autoloads nil "org-macs" "org/org-macs.el" (22092 27718 44268
+;;;;;;  464000))
 ;;; Generated autoloads from org/org-macs.el
 
 (autoload 'org-load-noerror-mustsuffix "org-macs" "\
@@ -20313,8 +20329,8 @@ Load FILE with optional arguments NOERROR and 
MUSTSUFFIX.  Drop the MUSTSUFFIX a
 
 ;;;***
 
-;;;### (autoloads nil "org-version" "org/org-version.el" (21607 54478
-;;;;;;  800121 42000))
+;;;### (autoloads nil "org-version" "org/org-version.el" (22086 11930
+;;;;;;  98062 731000))
 ;;; Generated autoloads from org/org-version.el
 
 (autoload 'org-release "org-version" "\
@@ -20331,8 +20347,8 @@ The Git version of org-mode.
 
 ;;;***
 
-;;;### (autoloads nil "outline" "outline.el" (21990 52406 672500
-;;;;;;  385000))
+;;;### (autoloads nil "outline" "outline.el" (22086 11930 118062
+;;;;;;  731000))
 ;;; Generated autoloads from outline.el
 (put 'outline-regexp 'safe-local-variable 'stringp)
 (put 'outline-heading-end-regexp 'safe-local-variable 'stringp)
@@ -20375,8 +20391,8 @@ See the command `outline-mode' for more information on 
this mode.
 
 ;;;***
 
-;;;### (autoloads nil "package" "emacs-lisp/package.el" (22104 15298
-;;;;;;  466671 488000))
+;;;### (autoloads nil "package" "emacs-lisp/package.el" (22092 27717
+;;;;;;  636268 464000))
 ;;; Generated autoloads from emacs-lisp/package.el
 (push (purecopy '(package 1 0 1)) package--builtin-versions)
 
@@ -20491,7 +20507,7 @@ The list is displayed in a buffer named `*Packages*'.
 
 ;;;***
 
-;;;### (autoloads nil "paren" "paren.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "paren" "paren.el" (22086 11930 122062 731000))
 ;;; Generated autoloads from paren.el
 
 (defvar show-paren-mode nil "\
@@ -20517,8 +20533,8 @@ matching parenthesis is highlighted in 
`show-paren-style' after
 
 ;;;***
 
-;;;### (autoloads nil "parse-time" "calendar/parse-time.el" (21670
-;;;;;;  32330 885624 725000))
+;;;### (autoloads nil "parse-time" "calendar/parse-time.el" (22086
+;;;;;;  11929 534062 731000))
 ;;; Generated autoloads from calendar/parse-time.el
 (put 'parse-time-rules 'risky-local-variable t)
 
@@ -20531,8 +20547,8 @@ unknown are returned as nil.
 
 ;;;***
 
-;;;### (autoloads nil "pascal" "progmodes/pascal.el" (21974 64192
-;;;;;;  644009 993000))
+;;;### (autoloads nil "pascal" "progmodes/pascal.el" (22092 27718
+;;;;;;  228268 464000))
 ;;; Generated autoloads from progmodes/pascal.el
 
 (autoload 'pascal-mode "pascal" "\
@@ -20581,8 +20597,8 @@ See also the user variables `pascal-type-keywords', 
`pascal-start-keywords' and
 
 ;;;***
 
-;;;### (autoloads nil "password-cache" "password-cache.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "password-cache" "password-cache.el" (22086
+;;;;;;  11930 122062 731000))
 ;;; Generated autoloads from password-cache.el
 
 (defvar password-cache t "\
@@ -20603,8 +20619,8 @@ Check if KEY is in the cache.
 
 ;;;***
 
-;;;### (autoloads nil "pcase" "emacs-lisp/pcase.el" (22073 59712
-;;;;;;  774803 451000))
+;;;### (autoloads nil "pcase" "emacs-lisp/pcase.el" (22091 6875 247217
+;;;;;;  891000))
 ;;; Generated autoloads from emacs-lisp/pcase.el
 
 (autoload 'pcase "pcase" "\
@@ -20705,8 +20721,8 @@ to this macro.
 
 ;;;***
 
-;;;### (autoloads nil "pcmpl-cvs" "pcmpl-cvs.el" (21998 46517 178024
-;;;;;;  649000))
+;;;### (autoloads nil "pcmpl-cvs" "pcmpl-cvs.el" (22086 11930 122062
+;;;;;;  731000))
 ;;; Generated autoloads from pcmpl-cvs.el
 
 (autoload 'pcomplete/cvs "pcmpl-cvs" "\
@@ -20716,8 +20732,8 @@ Completion rules for the `cvs' command.
 
 ;;;***
 
-;;;### (autoloads nil "pcmpl-gnu" "pcmpl-gnu.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "pcmpl-gnu" "pcmpl-gnu.el" (22086 11930 122062
+;;;;;;  731000))
 ;;; Generated autoloads from pcmpl-gnu.el
 
 (autoload 'pcomplete/gzip "pcmpl-gnu" "\
@@ -20744,8 +20760,8 @@ Completion for the GNU tar utility.
 
 ;;;***
 
-;;;### (autoloads nil "pcmpl-linux" "pcmpl-linux.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "pcmpl-linux" "pcmpl-linux.el" (22086 11930
+;;;;;;  122062 731000))
 ;;; Generated autoloads from pcmpl-linux.el
 
 (autoload 'pcomplete/kill "pcmpl-linux" "\
@@ -20765,8 +20781,8 @@ Completion for GNU/Linux `mount'.
 
 ;;;***
 
-;;;### (autoloads nil "pcmpl-rpm" "pcmpl-rpm.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "pcmpl-rpm" "pcmpl-rpm.el" (22086 11930 122062
+;;;;;;  731000))
 ;;; Generated autoloads from pcmpl-rpm.el
 
 (autoload 'pcomplete/rpm "pcmpl-rpm" "\
@@ -20776,8 +20792,8 @@ Completion for the `rpm' command.
 
 ;;;***
 
-;;;### (autoloads nil "pcmpl-unix" "pcmpl-unix.el" (21791 47660 796747
-;;;;;;  422000))
+;;;### (autoloads nil "pcmpl-unix" "pcmpl-unix.el" (22086 11930 122062
+;;;;;;  731000))
 ;;; Generated autoloads from pcmpl-unix.el
 
 (autoload 'pcomplete/cd "pcmpl-unix" "\
@@ -20832,8 +20848,8 @@ Includes files as well as host names followed by a 
colon.
 
 ;;;***
 
-;;;### (autoloads nil "pcmpl-x" "pcmpl-x.el" (21980 16567 953544
-;;;;;;  893000))
+;;;### (autoloads nil "pcmpl-x" "pcmpl-x.el" (22086 11930 122062
+;;;;;;  731000))
 ;;; Generated autoloads from pcmpl-x.el
 
 (autoload 'pcomplete/tlmgr "pcmpl-x" "\
@@ -20857,8 +20873,8 @@ Completion for the `ag' command.
 
 ;;;***
 
-;;;### (autoloads nil "pcomplete" "pcomplete.el" (21980 16567 953544
-;;;;;;  893000))
+;;;### (autoloads nil "pcomplete" "pcomplete.el" (22086 11930 122062
+;;;;;;  731000))
 ;;; Generated autoloads from pcomplete.el
 
 (autoload 'pcomplete "pcomplete" "\
@@ -20915,7 +20931,7 @@ Setup `shell-mode' to use pcomplete.
 
 ;;;***
 
-;;;### (autoloads nil "pcvs" "vc/pcvs.el" (22065 61995 886407 852000))
+;;;### (autoloads nil "pcvs" "vc/pcvs.el" (22092 27718 548268 464000))
 ;;; Generated autoloads from vc/pcvs.el
 
 (autoload 'cvs-checkout "pcvs" "\
@@ -20990,8 +21006,8 @@ The exact behavior is determined also by 
`cvs-dired-use-hook'." (when (stringp d
 
 ;;;***
 
-;;;### (autoloads nil "pcvs-defs" "vc/pcvs-defs.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "pcvs-defs" "vc/pcvs-defs.el" (22086 11930
+;;;;;;  378062 731000))
 ;;; 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 [...]
@@ -20999,8 +21015,8 @@ Global menu used by PCL-CVS.")
 
 ;;;***
 
-;;;### (autoloads nil "perl-mode" "progmodes/perl-mode.el" (22011
-;;;;;;  58553 921858 469000))
+;;;### (autoloads nil "perl-mode" "progmodes/perl-mode.el" (22086
+;;;;;;  11930 214062 731000))
 ;;; Generated autoloads from progmodes/perl-mode.el
 (put 'perl-indent-level 'safe-local-variable 'integerp)
 (put 'perl-continued-statement-offset 'safe-local-variable 'integerp)
@@ -21061,8 +21077,8 @@ Turning on Perl mode runs the normal hook 
`perl-mode-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "picture" "textmodes/picture.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "picture" "textmodes/picture.el" (22086 11930
+;;;;;;  318062 731000))
 ;;; Generated autoloads from textmodes/picture.el
 
 (autoload 'picture-mode "picture" "\
@@ -21142,8 +21158,8 @@ they are not by default assigned to keys.
 
 ;;;***
 
-;;;### (autoloads nil "pinentry" "net/pinentry.el" (22076 35900 90633
-;;;;;;  595000))
+;;;### (autoloads nil "pinentry" "net/pinentry.el" (22086 11930 2062
+;;;;;;  731000))
 ;;; Generated autoloads from net/pinentry.el
 (push (purecopy '(pinentry 0 1)) package--builtin-versions)
 
@@ -21160,8 +21176,8 @@ will not be shown.
 
 ;;;***
 
-;;;### (autoloads nil "plstore" "gnus/plstore.el" (21786 29744 368212
-;;;;;;  633000))
+;;;### (autoloads nil "plstore" "gnus/plstore.el" (22086 11929 842062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/plstore.el
 
 (autoload 'plstore-open "plstore" "\
@@ -21176,8 +21192,8 @@ Major mode for editing PLSTORE files.
 
 ;;;***
 
-;;;### (autoloads nil "po" "textmodes/po.el" (22026 25907 651502
-;;;;;;  692000))
+;;;### (autoloads nil "po" "textmodes/po.el" (22086 11930 322062
+;;;;;;  731000))
 ;;; Generated autoloads from textmodes/po.el
 
 (autoload 'po-find-file-coding-system "po" "\
@@ -21188,7 +21204,7 @@ Called through `file-coding-system-alist', before the 
file is visited for real.
 
 ;;;***
 
-;;;### (autoloads nil "pong" "play/pong.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "pong" "play/pong.el" (22086 11930 130062 731000))
 ;;; Generated autoloads from play/pong.el
 
 (autoload 'pong "pong" "\
@@ -21204,7 +21220,7 @@ pong-mode keybindings:\\<pong-mode-map>
 
 ;;;***
 
-;;;### (autoloads nil "pop3" "gnus/pop3.el" (21974 64192 580009 993000))
+;;;### (autoloads nil "pop3" "gnus/pop3.el" (22086 11929 846062 731000))
 ;;; Generated autoloads from gnus/pop3.el
 
 (autoload 'pop3-movemail "pop3" "\
@@ -21215,8 +21231,8 @@ Use streaming commands.
 
 ;;;***
 
-;;;### (autoloads nil "pp" "emacs-lisp/pp.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "pp" "emacs-lisp/pp.el" (22086 11929 682062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lisp/pp.el
 
 (autoload 'pp-to-string "pp" "\
@@ -21266,8 +21282,8 @@ Ignores leading comment characters.
 
 ;;;***
 
-;;;### (autoloads nil "printing" "printing.el" (21990 52406 680500
-;;;;;;  385000))
+;;;### (autoloads nil "printing" "printing.el" (22092 27718 128268
+;;;;;;  464000))
 ;;; Generated autoloads from printing.el
 (push (purecopy '(printing 6 9 3)) package--builtin-versions)
 
@@ -21855,7 +21871,7 @@ are both set to t.
 
 ;;;***
 
-;;;### (autoloads nil "proced" "proced.el" (22085 50883 209731 271000))
+;;;### (autoloads nil "proced" "proced.el" (22092 27718 128268 464000))
 ;;; Generated autoloads from proced.el
 
 (autoload 'proced "proced" "\
@@ -21873,8 +21889,8 @@ Proced buffers.
 
 ;;;***
 
-;;;### (autoloads nil "profiler" "profiler.el" (21948 40114 402686
-;;;;;;  453000))
+;;;### (autoloads nil "profiler" "profiler.el" (22086 11930 134062
+;;;;;;  731000))
 ;;; Generated autoloads from profiler.el
 
 (autoload 'profiler-start "profiler" "\
@@ -21902,8 +21918,8 @@ Open profile FILENAME.
 
 ;;;***
 
-;;;### (autoloads nil "project" "progmodes/project.el" (22083 9150
-;;;;;;  180915 960000))
+;;;### (autoloads nil "project" "progmodes/project.el" (22088 30660
+;;;;;;  79412 927000))
 ;;; Generated autoloads from progmodes/project.el
 
 (autoload 'project-current "project" "\
@@ -21929,8 +21945,8 @@ pattern to search for.
 
 ;;;***
 
-;;;### (autoloads nil "prolog" "progmodes/prolog.el" (22040 58794
-;;;;;;  692259 771000))
+;;;### (autoloads nil "prolog" "progmodes/prolog.el" (22086 11930
+;;;;;;  218062 731000))
 ;;; Generated autoloads from progmodes/prolog.el
 
 (autoload 'prolog-mode "prolog" "\
@@ -21963,19 +21979,19 @@ With prefix argument ARG, restart the Prolog process 
if running before.
 
 ;;;***
 
-;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (21670 32331 885635 586000))
+;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (22092 27718 404268 464000))
 ;;; 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\").")
+The default value is (\"/usr/local/share/emacs/fonts/bdf\").")
 
 (custom-autoload 'bdf-directory-list "ps-bdf" t)
 
 ;;;***
 
-;;;### (autoloads nil "ps-mode" "progmodes/ps-mode.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "ps-mode" "progmodes/ps-mode.el" (22086 11930
+;;;;;;  218062 731000))
 ;;; Generated autoloads from progmodes/ps-mode.el
 (push (purecopy '(ps-mode 1 1 9)) package--builtin-versions)
 
@@ -22021,8 +22037,8 @@ Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when 
the cursor is at the number
 
 ;;;***
 
-;;;### (autoloads nil "ps-print" "ps-print.el" (22011 58553 993858
-;;;;;;  469000))
+;;;### (autoloads nil "ps-print" "ps-print.el" (22092 27718 412268
+;;;;;;  464000))
 ;;; Generated autoloads from ps-print.el
 (push (purecopy '(ps-print 7 3 5)) package--builtin-versions)
 
@@ -22148,8 +22164,8 @@ image in a file with that name.
 (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
+Try: pr -t file | awk \\='{printf \"%3d %s
+\", length($0), $0}\\=' | sort -r | head
 
 \(fn)" t nil)
 
@@ -22219,8 +22235,8 @@ If EXTENSION is any other symbol, it is ignored.
 
 ;;;***
 
-;;;### (autoloads nil "pulse" "cedet/pulse.el" (21968 25395 287570
-;;;;;;  741000))
+;;;### (autoloads nil "pulse" "cedet/pulse.el" (22086 11929 550062
+;;;;;;  731000))
 ;;; Generated autoloads from cedet/pulse.el
 (push (purecopy '(pulse 1 0)) package--builtin-versions)
 
@@ -22238,12 +22254,12 @@ Optional argument FACE specifies the face to do the 
highlighting.
 
 ;;;***
 
-;;;### (autoloads nil "python" "progmodes/python.el" (22069 62806
-;;;;;;  686804 836000))
+;;;### (autoloads nil "python" "progmodes/python.el" (22092 27718
+;;;;;;  244268 464000))
 ;;; Generated autoloads from progmodes/python.el
 (push (purecopy '(python 0 25 1)) package--builtin-versions)
 
-(add-to-list 'auto-mode-alist (cons (purecopy "\\.py\\'") 'python-mode))
+(add-to-list 'auto-mode-alist (cons (purecopy "\\.pyw?\\'") 'python-mode))
 
 (add-to-list 'interpreter-mode-alist (cons (purecopy "python[0-9.]*") 
'python-mode))
 
@@ -22276,7 +22292,7 @@ Major mode for editing Python files.
 
 ;;;***
 
-;;;### (autoloads nil "qp" "gnus/qp.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "qp" "gnus/qp.el" (22086 11929 846062 731000))
 ;;; Generated autoloads from gnus/qp.el
 
 (autoload 'quoted-printable-decode-region "qp" "\
@@ -22295,8 +22311,8 @@ them into characters should be done separately.
 
 ;;;***
 
-;;;### (autoloads nil "quail" "international/quail.el" (21988 10681
-;;;;;;  981624 461000))
+;;;### (autoloads nil "quail" "international/quail.el" (22086 11929
+;;;;;;  882062 731000))
 ;;; Generated autoloads from international/quail.el
 
 (autoload 'quail-title "quail" "\
@@ -22526,8 +22542,8 @@ of each directory.
 
 ;;;***
 
-;;;### (autoloads nil "quail/hangul" "leim/quail/hangul.el" (21953
-;;;;;;  58033 331058 929000))
+;;;### (autoloads nil "quail/hangul" "leim/quail/hangul.el" (22086
+;;;;;;  11929 922062 731000))
 ;;; Generated autoloads from leim/quail/hangul.el
 
 (autoload 'hangul-input-method-activate "quail/hangul" "\
@@ -22540,7 +22556,7 @@ HELP-TEXT is a text set in 
`hangul-input-method-help-text'.
 ;;;***
 
 ;;;### (autoloads nil "quail/uni-input" "leim/quail/uni-input.el"
-;;;;;;  (21670 32331 385639 720000))
+;;;;;;  (22086 11929 930062 731000))
 ;;; Generated autoloads from leim/quail/uni-input.el
 
 (autoload 'ucs-input-activate "quail/uni-input" "\
@@ -22554,8 +22570,8 @@ While this input method is active, the variable
 
 ;;;***
 
-;;;### (autoloads nil "quickurl" "net/quickurl.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "quickurl" "net/quickurl.el" (22086 11930 2062
+;;;;;;  731000))
 ;;; Generated autoloads from net/quickurl.el
 
 (defconst quickurl-reread-hook-postfix "\n;; Local Variables:\n;; eval: (progn 
(require 'quickurl) (add-hook 'local-write-file-hooks (lambda () 
(quickurl-read) nil)))\n;; End:\n" "\
@@ -22626,8 +22642,8 @@ Display `quickurl-list' as a formatted list using 
`quickurl-list-mode'.
 
 ;;;***
 
-;;;### (autoloads nil "rcirc" "net/rcirc.el" (22011 58553 765858
-;;;;;;  469000))
+;;;### (autoloads nil "rcirc" "net/rcirc.el" (22092 27717 984268
+;;;;;;  464000))
 ;;; Generated autoloads from net/rcirc.el
 
 (autoload 'rcirc "rcirc" "\
@@ -22665,8 +22681,8 @@ if ARG is omitted or nil.
 
 ;;;***
 
-;;;### (autoloads nil "re-builder" "emacs-lisp/re-builder.el" (21998
-;;;;;;  46517 18024 649000))
+;;;### (autoloads nil "re-builder" "emacs-lisp/re-builder.el" (22086
+;;;;;;  11929 682062 731000))
 ;;; Generated autoloads from emacs-lisp/re-builder.el
 
 (defalias 'regexp-builder 're-builder)
@@ -22684,8 +22700,8 @@ matching parts of the target buffer will be highlighted.
 
 ;;;***
 
-;;;### (autoloads nil "recentf" "recentf.el" (21998 46517 266024
-;;;;;;  649000))
+;;;### (autoloads nil "recentf" "recentf.el" (22086 11930 254062
+;;;;;;  731000))
 ;;; Generated autoloads from recentf.el
 
 (defvar recentf-mode nil "\
@@ -22711,7 +22727,7 @@ were operated on recently.
 
 ;;;***
 
-;;;### (autoloads nil "rect" "rect.el" (22087 6213 796351 952000))
+;;;### (autoloads nil "rect" "rect.el" (22087 9807 394279 951000))
 ;;; Generated autoloads from rect.el
 
 (autoload 'delete-rectangle "rect" "\
@@ -22851,8 +22867,8 @@ Activates the region if needed.  Only lasts until the 
region is deactivated.
 
 ;;;***
 
-;;;### (autoloads nil "refill" "textmodes/refill.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "refill" "textmodes/refill.el" (22086 11930
+;;;;;;  322062 731000))
 ;;; Generated autoloads from textmodes/refill.el
 
 (autoload 'refill-mode "refill" "\
@@ -22872,8 +22888,8 @@ For true \"word wrap\" behavior, use `visual-line-mode' 
instead.
 
 ;;;***
 
-;;;### (autoloads nil "reftex" "textmodes/reftex.el" (22056 47028
-;;;;;;  787798 795000))
+;;;### (autoloads nil "reftex" "textmodes/reftex.el" (22086 11930
+;;;;;;  330062 731000))
 ;;; Generated autoloads from textmodes/reftex.el
 (autoload 'reftex-citation "reftex-cite" nil t)
 (autoload 'reftex-all-document-files "reftex-parse")
@@ -22926,8 +22942,8 @@ This enforces rescanning the buffer on next use.
 
 ;;;***
 
-;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (22025
-;;;;;;  5040 882195 139000))
+;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (22092
+;;;;;;  27718 512268 464000))
 ;;; 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))))
@@ -22936,8 +22952,8 @@ This enforces rescanning the buffer on next use.
 
 ;;;***
 
-;;;### (autoloads nil "regexp-opt" "emacs-lisp/regexp-opt.el" (22011
-;;;;;;  58553 413858 469000))
+;;;### (autoloads nil "regexp-opt" "emacs-lisp/regexp-opt.el" (22086
+;;;;;;  11929 682062 731000))
 ;;; Generated autoloads from emacs-lisp/regexp-opt.el
 
 (autoload 'regexp-opt "regexp-opt" "\
@@ -22966,15 +22982,15 @@ This means the number of non-shy regexp grouping 
constructs
 
 ;;;***
 
-;;;### (autoloads nil "regi" "emacs-lisp/regi.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "regi" "emacs-lisp/regi.el" (22086 11929 682062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lisp/regi.el
 (push (purecopy '(regi 1 8)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "remember" "textmodes/remember.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "remember" "textmodes/remember.el" (22086 11930
+;;;;;;  334062 731000))
 ;;; Generated autoloads from textmodes/remember.el
 (push (purecopy '(remember 2 0)) package--builtin-versions)
 
@@ -23028,7 +23044,7 @@ to turn the *scratch* buffer into your notes buffer.
 
 ;;;***
 
-;;;### (autoloads nil "repeat" "repeat.el" (21670 32331 885635 586000))
+;;;### (autoloads nil "repeat" "repeat.el" (22086 11930 258062 731000))
 ;;; Generated autoloads from repeat.el
 (push (purecopy '(repeat 0 51)) package--builtin-versions)
 
@@ -23051,8 +23067,8 @@ recently executed command not bound to an input event\".
 
 ;;;***
 
-;;;### (autoloads nil "reporter" "mail/reporter.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "reporter" "mail/reporter.el" (22086 11929
+;;;;;;  938062 731000))
 ;;; Generated autoloads from mail/reporter.el
 
 (autoload 'reporter-submit-bug-report "reporter" "\
@@ -23083,8 +23099,8 @@ mail-sending package is used for editing and sending 
the message.
 
 ;;;***
 
-;;;### (autoloads nil "reposition" "reposition.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "reposition" "reposition.el" (22086 11930 262062
+;;;;;;  731000))
 ;;; Generated autoloads from reposition.el
 
 (autoload 'reposition-window "reposition" "\
@@ -23110,7 +23126,7 @@ first comment line visible (if point is in a comment).
 
 ;;;***
 
-;;;### (autoloads nil "reveal" "reveal.el" (21670 32331 885635 586000))
+;;;### (autoloads nil "reveal" "reveal.el" (22086 11930 262062 731000))
 ;;; Generated autoloads from reveal.el
 
 (autoload 'reveal-mode "reveal" "\
@@ -23145,8 +23161,8 @@ the mode if ARG is omitted or nil.
 
 ;;;***
 
-;;;### (autoloads nil "ring" "emacs-lisp/ring.el" (21998 46517 18024
-;;;;;;  649000))
+;;;### (autoloads nil "ring" "emacs-lisp/ring.el" (22086 11929 682062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lisp/ring.el
 
 (autoload 'ring-p "ring" "\
@@ -23161,8 +23177,8 @@ Make a ring that can contain SIZE elements.
 
 ;;;***
 
-;;;### (autoloads nil "rlogin" "net/rlogin.el" (22011 58553 765858
-;;;;;;  469000))
+;;;### (autoloads nil "rlogin" "net/rlogin.el" (22086 11930 6062
+;;;;;;  731000))
 ;;; Generated autoloads from net/rlogin.el
 
 (autoload 'rlogin "rlogin" "\
@@ -23206,8 +23222,8 @@ variable.
 
 ;;;***
 
-;;;### (autoloads nil "rmail" "mail/rmail.el" (22011 58553 725858
-;;;;;;  469000))
+;;;### (autoloads nil "rmail" "mail/rmail.el" (22092 27717 884268
+;;;;;;  464000))
 ;;; Generated autoloads from mail/rmail.el
 
 (defvar rmail-file-name (purecopy "~/RMAIL") "\
@@ -23226,7 +23242,7 @@ Its name should end with a slash.")
 
 (autoload 'rmail-movemail-variant-p "rmail" "\
 Return t if the current movemail variant is any of VARIANTS.
-Currently known variants are 'emacs and 'mailutils.
+Currently known variants are `emacs' and `mailutils'.
 
 \(fn &rest VARIANTS)" nil nil)
 
@@ -23404,8 +23420,8 @@ Set PASSWORD to be used for retrieving mail from a POP 
or IMAP server.
 
 ;;;***
 
-;;;### (autoloads nil "rmailout" "mail/rmailout.el" (21989 31537
-;;;;;;  907825 721000))
+;;;### (autoloads nil "rmailout" "mail/rmailout.el" (22086 11929
+;;;;;;  942062 731000))
 ;;; Generated autoloads from mail/rmailout.el
 (put 'rmail-output-file-alist 'risky-local-variable t)
 
@@ -23469,8 +23485,8 @@ than appending to it.  Deletes the message after 
writing if
 
 ;;;***
 
-;;;### (autoloads nil "rng-cmpct" "nxml/rng-cmpct.el" (21978 61237
-;;;;;;  666488 269000))
+;;;### (autoloads nil "rng-cmpct" "nxml/rng-cmpct.el" (22086 11930
+;;;;;;  26062 731000))
 ;;; Generated autoloads from nxml/rng-cmpct.el
 
 (autoload 'rng-c-load-schema "rng-cmpct" "\
@@ -23481,8 +23497,8 @@ Return a pattern.
 
 ;;;***
 
-;;;### (autoloads nil "rng-nxml" "nxml/rng-nxml.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "rng-nxml" "nxml/rng-nxml.el" (22086 11930
+;;;;;;  30062 731000))
 ;;; Generated autoloads from nxml/rng-nxml.el
 
 (autoload 'rng-nxml-mode-init "rng-nxml" "\
@@ -23494,8 +23510,8 @@ Validation will be enabled if 
`rng-nxml-auto-validate-flag' is non-nil.
 
 ;;;***
 
-;;;### (autoloads nil "rng-valid" "nxml/rng-valid.el" (21948 40114
-;;;;;;  322686 453000))
+;;;### (autoloads nil "rng-valid" "nxml/rng-valid.el" (22086 11930
+;;;;;;  30062 731000))
 ;;; Generated autoloads from nxml/rng-valid.el
 
 (autoload 'rng-validate-mode "rng-valid" "\
@@ -23525,8 +23541,8 @@ to use for finding the schema.
 
 ;;;***
 
-;;;### (autoloads nil "rng-xsd" "nxml/rng-xsd.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "rng-xsd" "nxml/rng-xsd.el" (22086 11930 30062
+;;;;;;  731000))
 ;;; Generated autoloads from nxml/rng-xsd.el
 
 (put 'http://www\.w3\.org/2001/XMLSchema-datatypes 'rng-dt-compile 
'rng-xsd-compile)
@@ -23553,8 +23569,8 @@ must be equal.
 
 ;;;***
 
-;;;### (autoloads nil "robin" "international/robin.el" (21953 58033
-;;;;;;  303058 929000))
+;;;### (autoloads nil "robin" "international/robin.el" (22086 11929
+;;;;;;  882062 731000))
 ;;; Generated autoloads from international/robin.el
 
 (autoload 'robin-define-package "robin" "\
@@ -23586,7 +23602,7 @@ Start using robin package NAME, which is a string.
 
 ;;;***
 
-;;;### (autoloads nil "rot13" "rot13.el" (21670 32331 885635 586000))
+;;;### (autoloads nil "rot13" "rot13.el" (22086 11930 266062 731000))
 ;;; Generated autoloads from rot13.el
 
 (autoload 'rot13 "rot13" "\
@@ -23623,8 +23639,8 @@ Toggle the use of ROT13 encoding for the current window.
 
 ;;;***
 
-;;;### (autoloads nil "rst" "textmodes/rst.el" (22034 20008 325500
-;;;;;;  287000))
+;;;### (autoloads nil "rst" "textmodes/rst.el" (22086 11930 338062
+;;;;;;  731000))
 ;;; Generated autoloads from textmodes/rst.el
  (add-to-list 'auto-mode-alist (purecopy '("\\.re?st\\'" . rst-mode)))
 
@@ -23654,8 +23670,8 @@ for modes derived from Text mode, like Mail mode.
 
 ;;;***
 
-;;;### (autoloads nil "ruby-mode" "progmodes/ruby-mode.el" (22015
-;;;;;;  55603 817705 321000))
+;;;### (autoloads nil "ruby-mode" "progmodes/ruby-mode.el" (22089
+;;;;;;  51528 360929 316000))
 ;;; Generated autoloads from progmodes/ruby-mode.el
 (push (purecopy '(ruby-mode 1 2)) package--builtin-versions)
 
@@ -23666,14 +23682,14 @@ Major mode for editing Ruby code.
 
 \(fn)" t nil)
 
-(add-to-list 'auto-mode-alist (cons (purecopy (concat "\\(?:\\." 
"rb\\|ru\\|rake\\|thor" "\\|jbuilder\\|rabl\\|gemspec\\|podspec" "\\|/" 
"\\(?:Gem\\|Rake\\|Cap\\|Thor" "\\|Puppet\\|Berks" 
"\\|Vagrant\\|Guard\\|Pod\\)file" "\\)\\'")) 'ruby-mode))
+(add-to-list 'auto-mode-alist (cons (purecopy (concat "\\(?:\\.\\(?:" 
"rbw?\\|ru\\|rake\\|thor" "\\|jbuilder\\|rabl\\|gemspec\\|podspec" "\\)" "\\|/" 
"\\(?:Gem\\|Rake\\|Cap\\|Thor" "\\|Puppet\\|Berks" 
"\\|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)))
 
 ;;;***
 
-;;;### (autoloads nil "ruler-mode" "ruler-mode.el" (22026 25907 643502
-;;;;;;  692000))
+;;;### (autoloads nil "ruler-mode" "ruler-mode.el" (22086 11930 266062
+;;;;;;  731000))
 ;;; Generated autoloads from ruler-mode.el
 (push (purecopy '(ruler-mode 1 6)) package--builtin-versions)
 
@@ -23691,8 +23707,8 @@ if ARG is omitted or nil.
 
 ;;;***
 
-;;;### (autoloads nil "rx" "emacs-lisp/rx.el" (22011 58553 441858
-;;;;;;  469000))
+;;;### (autoloads nil "rx" "emacs-lisp/rx.el" (22086 11929 686062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lisp/rx.el
 
 (autoload 'rx-to-string "rx" "\
@@ -24003,15 +24019,15 @@ enclosed in `(and ...)'.
 
 ;;;***
 
-;;;### (autoloads nil "sasl-ntlm" "net/sasl-ntlm.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "sasl-ntlm" "net/sasl-ntlm.el" (22086 11930
+;;;;;;  6062 731000))
 ;;; Generated autoloads from net/sasl-ntlm.el
 (push (purecopy '(sasl 1 0)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "savehist" "savehist.el" (21981 37426 703399
-;;;;;;  97000))
+;;;### (autoloads nil "savehist" "savehist.el" (22086 11930 266062
+;;;;;;  731000))
 ;;; Generated autoloads from savehist.el
 (push (purecopy '(savehist 24)) package--builtin-versions)
 
@@ -24043,8 +24059,8 @@ histories, which is probably undesirable.
 
 ;;;***
 
-;;;### (autoloads nil "saveplace" "saveplace.el" (21822 58098 20521
-;;;;;;  61000))
+;;;### (autoloads nil "saveplace" "saveplace.el" (22086 11930 266062
+;;;;;;  731000))
 ;;; Generated autoloads from saveplace.el
 
 (defvar save-place-mode nil "\
@@ -24065,8 +24081,8 @@ where it was when you previously visited the same file.
 
 ;;;***
 
-;;;### (autoloads nil "scheme" "progmodes/scheme.el" (22011 58553
-;;;;;;  925858 469000))
+;;;### (autoloads nil "scheme" "progmodes/scheme.el" (22086 11930
+;;;;;;  222062 731000))
 ;;; Generated autoloads from progmodes/scheme.el
 
 (autoload 'scheme-mode "scheme" "\
@@ -24105,8 +24121,8 @@ that variable's value is a string.
 
 ;;;***
 
-;;;### (autoloads nil "score-mode" "gnus/score-mode.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "score-mode" "gnus/score-mode.el" (22086 11929
+;;;;;;  850062 731000))
 ;;; Generated autoloads from gnus/score-mode.el
 
 (autoload 'gnus-score-mode "score-mode" "\
@@ -24119,8 +24135,8 @@ This mode is an extended emacs-lisp mode.
 
 ;;;***
 
-;;;### (autoloads nil "scroll-all" "scroll-all.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "scroll-all" "scroll-all.el" (22089 51528 372929
+;;;;;;  316000))
 ;;; Generated autoloads from scroll-all.el
 
 (defvar scroll-all-mode nil "\
@@ -24145,8 +24161,8 @@ one window apply to all visible windows in the same 
frame.
 
 ;;;***
 
-;;;### (autoloads nil "scroll-lock" "scroll-lock.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "scroll-lock" "scroll-lock.el" (22086 11930
+;;;;;;  270062 731000))
 ;;; Generated autoloads from scroll-lock.el
 
 (autoload 'scroll-lock-mode "scroll-lock" "\
@@ -24162,16 +24178,16 @@ vertically fixed relative to window boundaries during 
scrolling.
 
 ;;;***
 
-;;;### (autoloads nil "secrets" "net/secrets.el" (22011 58553 765858
-;;;;;;  469000))
+;;;### (autoloads nil "secrets" "net/secrets.el" (22086 11930 6062
+;;;;;;  731000))
 ;;; Generated autoloads from net/secrets.el
 (when (featurep 'dbusbind)
  (autoload 'secrets-show-secrets "secrets" nil t))
 
 ;;;***
 
-;;;### (autoloads nil "semantic" "cedet/semantic.el" (21948 40114
-;;;;;;  186686 453000))
+;;;### (autoloads nil "semantic" "cedet/semantic.el" (22092 27717
+;;;;;;  568268 464000))
 ;;; Generated autoloads from cedet/semantic.el
 (push (purecopy '(semantic 2 2)) package--builtin-versions)
 
@@ -24229,7 +24245,7 @@ Semantic mode.
 ;;;***
 
 ;;;### (autoloads nil "semantic/bovine/grammar" 
"cedet/semantic/bovine/grammar.el"
-;;;;;;  (21670 32330 885624 725000))
+;;;;;;  (22086 11929 554062 731000))
 ;;; Generated autoloads from cedet/semantic/bovine/grammar.el
 
 (autoload 'bovine-grammar-mode "semantic/bovine/grammar" "\
@@ -24240,7 +24256,7 @@ Major mode for editing Bovine grammars.
 ;;;***
 
 ;;;### (autoloads nil "semantic/wisent/grammar" 
"cedet/semantic/wisent/grammar.el"
-;;;;;;  (21670 32330 885624 725000))
+;;;;;;  (22086 11929 578062 731000))
 ;;; Generated autoloads from cedet/semantic/wisent/grammar.el
 
 (autoload 'wisent-grammar-mode "semantic/wisent/grammar" "\
@@ -24250,8 +24266,8 @@ Major mode for editing Wisent grammars.
 
 ;;;***
 
-;;;### (autoloads nil "sendmail" "mail/sendmail.el" (22026 25907
-;;;;;;  603502 692000))
+;;;### (autoloads nil "sendmail" "mail/sendmail.el" (22086 11929
+;;;;;;  946062 731000))
 ;;; Generated autoloads from mail/sendmail.el
 
 (defvar mail-from-style 'default "\
@@ -24532,14 +24548,14 @@ Like `mail' command, but display mail buffer in 
another frame.
 
 ;;;***
 
-;;;### (autoloads nil "seq" "emacs-lisp/seq.el" (22084 30014 55762
-;;;;;;  3000))
+;;;### (autoloads nil "seq" "emacs-lisp/seq.el" (22086 11929 686062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lisp/seq.el
 (push (purecopy '(seq 2 3)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "server" "server.el" (22056 47028 775798 795000))
+;;;### (autoloads nil "server" "server.el" (22093 48588 588393 539000))
 ;;; Generated autoloads from server.el
 
 (put 'server-host 'risky-local-variable t)
@@ -24606,7 +24622,7 @@ only these files will be asked to be saved.
 
 ;;;***
 
-;;;### (autoloads nil "ses" "ses.el" (21990 52406 736500 385000))
+;;;### (autoloads nil "ses" "ses.el" (22092 27718 416268 464000))
 ;;; Generated autoloads from ses.el
 
 (autoload 'ses-mode "ses" "\
@@ -24650,8 +24666,8 @@ formula:
 
 ;;;***
 
-;;;### (autoloads nil "sgml-mode" "textmodes/sgml-mode.el" (22011
-;;;;;;  58554 69858 469000))
+;;;### (autoloads nil "sgml-mode" "textmodes/sgml-mode.el" (22092
+;;;;;;  27718 512268 464000))
 ;;; Generated autoloads from textmodes/sgml-mode.el
 
 (autoload 'sgml-mode "sgml-mode" "\
@@ -24716,8 +24732,8 @@ To work around that, do:
 
 ;;;***
 
-;;;### (autoloads nil "sh-script" "progmodes/sh-script.el" (22061
-;;;;;;  64938 532287 963000))
+;;;### (autoloads nil "sh-script" "progmodes/sh-script.el" (22092
+;;;;;;  27718 260268 464000))
 ;;; Generated autoloads from progmodes/sh-script.el
 (push (purecopy '(sh-script 2 0 6)) package--builtin-versions)
 (put 'sh-shell 'safe-local-variable 'symbolp)
@@ -24780,8 +24796,8 @@ with your script for an edit-interpret-debug cycle.
 
 ;;;***
 
-;;;### (autoloads nil "shadow" "emacs-lisp/shadow.el" (22026 25907
-;;;;;;  583502 692000))
+;;;### (autoloads nil "shadow" "emacs-lisp/shadow.el" (22086 11929
+;;;;;;  686062 731000))
 ;;; Generated autoloads from emacs-lisp/shadow.el
 
 (autoload 'list-load-path-shadows "shadow" "\
@@ -24830,8 +24846,8 @@ function, `load-path-shadows-find'.
 
 ;;;***
 
-;;;### (autoloads nil "shadowfile" "shadowfile.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "shadowfile" "shadowfile.el" (22086 11930 278062
+;;;;;;  731000))
 ;;; Generated autoloads from shadowfile.el
 
 (autoload 'shadow-define-cluster "shadowfile" "\
@@ -24869,7 +24885,7 @@ Set up file shadowing.
 
 ;;;***
 
-;;;### (autoloads nil "shell" "shell.el" (21896 48221 754207 816000))
+;;;### (autoloads nil "shell" "shell.el" (22086 11930 278062 731000))
 ;;; Generated autoloads from shell.el
 
 (defvar shell-dumb-shell-regexp (purecopy "cmd\\(proxy\\)?\\.exe") "\
@@ -24917,7 +24933,7 @@ Otherwise, one argument `-i' is passed to the shell.
 
 ;;;***
 
-;;;### (autoloads nil "shr" "net/shr.el" (22085 50883 205731 271000))
+;;;### (autoloads nil "shr" "net/shr.el" (22087 9807 382279 951000))
 ;;; Generated autoloads from net/shr.el
 
 (autoload 'shr-render-region "shr" "\
@@ -24934,8 +24950,8 @@ DOM should be a parse tree as generated by
 
 ;;;***
 
-;;;### (autoloads nil "sieve" "gnus/sieve.el" (21972 22452 270264
-;;;;;;  357000))
+;;;### (autoloads nil "sieve" "gnus/sieve.el" (22086 11929 850062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/sieve.el
 
 (autoload 'sieve-manage "sieve" "\
@@ -24960,8 +24976,8 @@ DOM should be a parse tree as generated by
 
 ;;;***
 
-;;;### (autoloads nil "sieve-mode" "gnus/sieve-mode.el" (21931 31023
-;;;;;;  733164 572000))
+;;;### (autoloads nil "sieve-mode" "gnus/sieve-mode.el" (22086 11929
+;;;;;;  850062 731000))
 ;;; Generated autoloads from gnus/sieve-mode.el
 
 (autoload 'sieve-mode "sieve-mode" "\
@@ -24976,8 +24992,8 @@ Turning on Sieve mode runs `sieve-mode-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "simula" "progmodes/simula.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "simula" "progmodes/simula.el" (22092 27718
+;;;;;;  288268 464000))
 ;;; Generated autoloads from progmodes/simula.el
 
 (autoload 'simula-mode "simula" "\
@@ -24998,22 +25014,22 @@ Variables controlling indentation style:
     with respect to the previous line of the statement.
  `simula-label-offset' -4711
     Offset of SIMULA label lines relative to usual indentation.
- `simula-if-indent' '(0 . 0)
+ `simula-if-indent' (0 . 0)
     Extra indentation of THEN and ELSE with respect to the starting IF.
     Value is a cons cell, the car is extra THEN indentation and the cdr
     extra ELSE indentation.  IF after ELSE is indented as the starting IF.
- `simula-inspect-indent' '(0 . 0)
+ `simula-inspect-indent' (0 . 0)
     Extra indentation of WHEN and OTHERWISE with respect to the
     corresponding INSPECT.  Value is a cons cell, the car is
     extra WHEN indentation and the cdr extra OTHERWISE indentation.
  `simula-electric-indent' nil
     If this variable is non-nil, `simula-indent-line'
     will check the previous line to see if it has to be reindented.
- `simula-abbrev-keyword' 'upcase
+ `simula-abbrev-keyword' `upcase'
     Determine how SIMULA keywords will be expanded.  Value is one of
     the symbols `upcase', `downcase', `capitalize', (as in) `abbrev-table',
     or nil if they should not be changed.
- `simula-abbrev-stdproc' 'abbrev-table
+ `simula-abbrev-stdproc' `abbrev-table'
     Determine how standard SIMULA procedure and class names will be
     expanded.  Value is one of the symbols `upcase', `downcase', `capitalize',
     (as in) `abbrev-table', or nil if they should not be changed.
@@ -25025,8 +25041,8 @@ with no arguments, if that value is non-nil.
 
 ;;;***
 
-;;;### (autoloads nil "skeleton" "skeleton.el" (22026 25907 643502
-;;;;;;  692000))
+;;;### (autoloads nil "skeleton" "skeleton.el" (22086 11930 290062
+;;;;;;  731000))
 ;;; Generated autoloads from skeleton.el
 
 (defvar skeleton-filter-function 'identity "\
@@ -25145,8 +25161,8 @@ twice for the others.
 
 ;;;***
 
-;;;### (autoloads nil "smerge-mode" "vc/smerge-mode.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "smerge-mode" "vc/smerge-mode.el" (22092 27718
+;;;;;;  548268 464000))
 ;;; Generated autoloads from vc/smerge-mode.el
 
 (autoload 'smerge-ediff "smerge-mode" "\
@@ -25173,8 +25189,8 @@ If no conflict maker is found, turn off `smerge-mode'.
 
 ;;;***
 
-;;;### (autoloads nil "smiley" "gnus/smiley.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "smiley" "gnus/smiley.el" (22086 11929 850062
+;;;;;;  731000))
 ;;; Generated autoloads from gnus/smiley.el
 
 (autoload 'smiley-region "smiley" "\
@@ -25191,8 +25207,8 @@ interactively.  If there's no argument, do it at the 
current buffer.
 
 ;;;***
 
-;;;### (autoloads nil "smtpmail" "mail/smtpmail.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "smtpmail" "mail/smtpmail.el" (22086 11929
+;;;;;;  950062 731000))
 ;;; Generated autoloads from mail/smtpmail.el
 
 (autoload 'smtpmail-send-it "smtpmail" "\
@@ -25207,8 +25223,8 @@ Send mail that was queued as a result of setting 
`smtpmail-queue-mail'.
 
 ;;;***
 
-;;;### (autoloads nil "snake" "play/snake.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "snake" "play/snake.el" (22086 11930 130062
+;;;;;;  731000))
 ;;; Generated autoloads from play/snake.el
 
 (autoload 'snake "snake" "\
@@ -25231,8 +25247,8 @@ Snake mode keybindings:
 
 ;;;***
 
-;;;### (autoloads nil "snmp-mode" "net/snmp-mode.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "snmp-mode" "net/snmp-mode.el" (22086 11930
+;;;;;;  10062 731000))
 ;;; Generated autoloads from net/snmp-mode.el
 
 (autoload 'snmp-mode "snmp-mode" "\
@@ -25261,15 +25277,15 @@ then `snmpv2-mode-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "soap-client" "net/soap-client.el" (22084 30014
-;;;;;;  59762 3000))
+;;;### (autoloads nil "soap-client" "net/soap-client.el" (22092 27717
+;;;;;;  988268 464000))
 ;;; Generated autoloads from net/soap-client.el
 (push (purecopy '(soap-client 3 0 2)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "solar" "calendar/solar.el" (21849 48176 337264
-;;;;;;  443000))
+;;;### (autoloads nil "solar" "calendar/solar.el" (22086 11929 534062
+;;;;;;  731000))
 ;;; Generated autoloads from calendar/solar.el
 
 (autoload 'sunrise-sunset "solar" "\
@@ -25284,8 +25300,8 @@ This function is suitable for execution in an init file.
 
 ;;;***
 
-;;;### (autoloads nil "solitaire" "play/solitaire.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "solitaire" "play/solitaire.el" (22086 11930
+;;;;;;  130062 731000))
 ;;; Generated autoloads from play/solitaire.el
 
 (autoload 'solitaire "solitaire" "\
@@ -25360,7 +25376,7 @@ Pick your favorite shortcuts:
 
 ;;;***
 
-;;;### (autoloads nil "sort" "sort.el" (22011 58553 993858 469000))
+;;;### (autoloads nil "sort" "sort.el" (22086 11930 290062 731000))
 ;;; Generated autoloads from sort.el
 (put 'sort-fold-case 'safe-local-variable 'booleanp)
 
@@ -25535,7 +25551,7 @@ is non-nil, it also prints a message describing the 
number of deletions.
 
 ;;;***
 
-;;;### (autoloads nil "spam" "gnus/spam.el" (21981 37426 607399 97000))
+;;;### (autoloads nil "spam" "gnus/spam.el" (22086 11929 854062 731000))
 ;;; Generated autoloads from gnus/spam.el
 
 (autoload 'spam-initialize "spam" "\
@@ -25549,8 +25565,8 @@ installed through `spam-necessary-extra-headers'.
 
 ;;;***
 
-;;;### (autoloads nil "spam-report" "gnus/spam-report.el" (22011
-;;;;;;  58553 601858 469000))
+;;;### (autoloads nil "spam-report" "gnus/spam-report.el" (22086
+;;;;;;  11929 850062 731000))
 ;;; Generated autoloads from gnus/spam-report.el
 
 (autoload 'spam-report-process-queue "spam-report" "\
@@ -25592,8 +25608,8 @@ Spam reports will be queued with the method used when
 
 ;;;***
 
-;;;### (autoloads nil "speedbar" "speedbar.el" (22011 58553 993858
-;;;;;;  469000))
+;;;### (autoloads nil "speedbar" "speedbar.el" (22092 27718 452268
+;;;;;;  464000))
 ;;; Generated autoloads from speedbar.el
 
 (defalias 'speedbar 'speedbar-frame-mode)
@@ -25617,8 +25633,8 @@ selected.  If the speedbar frame is active, then select 
the attached frame.
 
 ;;;***
 
-;;;### (autoloads nil "spook" "play/spook.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "spook" "play/spook.el" (22086 11930 130062
+;;;;;;  731000))
 ;;; Generated autoloads from play/spook.el
 
 (autoload 'spook "spook" "\
@@ -25633,8 +25649,8 @@ Return a vector containing the lines from 
`spook-phrases-file'.
 
 ;;;***
 
-;;;### (autoloads nil "sql" "progmodes/sql.el" (22011 58553 929858
-;;;;;;  469000))
+;;;### (autoloads nil "sql" "progmodes/sql.el" (22092 27718 320268
+;;;;;;  464000))
 ;;; Generated autoloads from progmodes/sql.el
 (push (purecopy '(sql 3 5)) package--builtin-versions)
 
@@ -25992,7 +26008,7 @@ your might try undecided-dos as a coding system.  If 
this doesn't help,
 Try to set `comint-output-filter-functions' like this:
 
 \(setq comint-output-filter-functions (append comint-output-filter-functions
-                                            '(comint-strip-ctrl-m)))
+                                            \\='(comint-strip-ctrl-m)))
 
 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)
 
@@ -26100,15 +26116,15 @@ Run vsql as an inferior process.
 
 ;;;***
 
-;;;### (autoloads nil "srecode" "cedet/srecode.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "srecode" "cedet/srecode.el" (22086 11929 578062
+;;;;;;  731000))
 ;;; Generated autoloads from cedet/srecode.el
 (push (purecopy '(srecode 1 2)) package--builtin-versions)
 
 ;;;***
 
 ;;;### (autoloads nil "srecode/srt-mode" "cedet/srecode/srt-mode.el"
-;;;;;;  (21998 46516 910024 649000))
+;;;;;;  (22086 11929 582062 731000))
 ;;; Generated autoloads from cedet/srecode/srt-mode.el
 
 (autoload 'srecode-template-mode "srecode/srt-mode" "\
@@ -26120,8 +26136,8 @@ Major-mode for writing SRecode macros.
 
 ;;;***
 
-;;;### (autoloads nil "starttls" "gnus/starttls.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "starttls" "gnus/starttls.el" (22086 11929
+;;;;;;  854062 731000))
 ;;; Generated autoloads from gnus/starttls.el
 
 (autoload 'starttls-open-stream "starttls" "\
@@ -26144,8 +26160,8 @@ GnuTLS requires a port number.
 
 ;;;***
 
-;;;### (autoloads nil "strokes" "strokes.el" (21981 37426 735399
-;;;;;;  97000))
+;;;### (autoloads nil "strokes" "strokes.el" (22086 11930 294062
+;;;;;;  731000))
 ;;; Generated autoloads from strokes.el
 
 (autoload 'strokes-global-set-stroke "strokes" "\
@@ -26258,8 +26274,8 @@ Read a complex stroke and insert its glyph into the 
current buffer.
 
 ;;;***
 
-;;;### (autoloads nil "studly" "play/studly.el" (21607 54478 800121
-;;;;;;  42000))
+;;;### (autoloads nil "studly" "play/studly.el" (22086 11930 130062
+;;;;;;  731000))
 ;;; Generated autoloads from play/studly.el
 
 (autoload 'studlify-region "studly" "\
@@ -26279,8 +26295,8 @@ Studlify-case the current buffer.
 
 ;;;***
 
-;;;### (autoloads nil "subword" "progmodes/subword.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "subword" "progmodes/subword.el" (22086 11930
+;;;;;;  226062 731000))
 ;;; Generated autoloads from progmodes/subword.el
 
 (define-obsolete-function-alias 'capitalized-words-mode 'subword-mode "25.1")
@@ -26372,8 +26388,8 @@ See `superword-mode' for more information on Superword 
mode.
 
 ;;;***
 
-;;;### (autoloads nil "supercite" "mail/supercite.el" (21852 24381
-;;;;;;  697240 10000))
+;;;### (autoloads nil "supercite" "mail/supercite.el" (22086 11929
+;;;;;;  950062 731000))
 ;;; Generated autoloads from mail/supercite.el
 
 (autoload 'sc-cite-original "supercite" "\
@@ -26405,8 +26421,8 @@ and `sc-post-hook' is run after the guts of this 
function.
 
 ;;;***
 
-;;;### (autoloads nil "t-mouse" "t-mouse.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "t-mouse" "t-mouse.el" (22086 11930 298062
+;;;;;;  731000))
 ;;; Generated autoloads from t-mouse.el
 
 (define-obsolete-function-alias 't-mouse-mode 'gpm-mouse-mode "23.1")
@@ -26434,7 +26450,7 @@ It relies on the `gpm' daemon being activated.
 
 ;;;***
 
-;;;### (autoloads nil "tabify" "tabify.el" (21670 32331 885635 586000))
+;;;### (autoloads nil "tabify" "tabify.el" (22086 11930 298062 731000))
 ;;; Generated autoloads from tabify.el
 
 (autoload 'untabify "tabify" "\
@@ -26463,8 +26479,8 @@ The variable `tab-width' controls the spacing of tab 
stops.
 
 ;;;***
 
-;;;### (autoloads nil "table" "textmodes/table.el" (21998 46517 298024
-;;;;;;  649000))
+;;;### (autoloads nil "table" "textmodes/table.el" (22092 27718 520268
+;;;;;;  464000))
 ;;; Generated autoloads from textmodes/table.el
 
 (autoload 'table-insert "table" "\
@@ -26834,7 +26850,7 @@ WHERE is provided the cell and table at that location 
is reported.
 (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
-structure of the table.  It must be either 'html, 'latex or 'cals.
+structure of the table.  It must be either `html', `latex' or `cals'.
 The resulted source text is inserted into DEST-BUFFER and the buffer
 object is returned.  When DEST-BUFFER is omitted or nil the default
 buffer specified in `table-dest-buffer-name' is used.  In this case
@@ -26923,7 +26939,7 @@ delimiter regular expressions.  This parsing determines 
the number of
 columns and rows of the table automatically.  If COL-DELIM-REGEXP and
 ROW-DELIM-REGEXP are omitted the result table has only one cell and
 the entire region contents is placed in that cell.  Optional JUSTIFY
-is one of 'left, 'center or 'right, which specifies the cell
+is one of `left', `center' or `right', which specifies the cell
 justification.  Optional MIN-CELL-WIDTH specifies the minimum cell
 width.  Optional COLUMNS specify the number of columns when
 ROW-DELIM-REGEXP is not specified.
@@ -27035,7 +27051,7 @@ converts a table into plain text without frames.  It is 
a companion to
 
 ;;;***
 
-;;;### (autoloads nil "talk" "talk.el" (21670 32331 885635 586000))
+;;;### (autoloads nil "talk" "talk.el" (22086 11930 298062 731000))
 ;;; Generated autoloads from talk.el
 
 (autoload 'talk-connect "talk" "\
@@ -27050,8 +27066,8 @@ Connect to the Emacs talk group from the current X 
display or tty frame.
 
 ;;;***
 
-;;;### (autoloads nil "tar-mode" "tar-mode.el" (21704 50495 455324
-;;;;;;  752000))
+;;;### (autoloads nil "tar-mode" "tar-mode.el" (22086 11930 298062
+;;;;;;  731000))
 ;;; Generated autoloads from tar-mode.el
 
 (autoload 'tar-mode "tar-mode" "\
@@ -27074,8 +27090,8 @@ See also: variables `tar-update-datestamp' and 
`tar-anal-blocksize'.
 
 ;;;***
 
-;;;### (autoloads nil "tcl" "progmodes/tcl.el" (21842 42581 539414
-;;;;;;  570000))
+;;;### (autoloads nil "tcl" "progmodes/tcl.el" (22086 11930 230062
+;;;;;;  731000))
 ;;; Generated autoloads from progmodes/tcl.el
 
 (autoload 'tcl-mode "tcl" "\
@@ -27123,8 +27139,8 @@ Prefix argument means invert sense of 
`tcl-use-smart-word-finder'.
 
 ;;;***
 
-;;;### (autoloads nil "telnet" "net/telnet.el" (21852 24381 767239
-;;;;;;  782000))
+;;;### (autoloads nil "telnet" "net/telnet.el" (22086 11930 14062
+;;;;;;  731000))
 ;;; Generated autoloads from net/telnet.el
 
 (autoload 'telnet "telnet" "\
@@ -27149,7 +27165,7 @@ Normally input is edited in Emacs and sent a line at a 
time.
 
 ;;;***
 
-;;;### (autoloads nil "term" "term.el" (22042 14122 209169 136000))
+;;;### (autoloads nil "term" "term.el" (22102 63557 312509 103000))
 ;;; Generated autoloads from term.el
 
 (autoload 'make-term "term" "\
@@ -27191,8 +27207,8 @@ use in that buffer.
 
 ;;;***
 
-;;;### (autoloads nil "testcover" "emacs-lisp/testcover.el" (21998
-;;;;;;  46517 22024 649000))
+;;;### (autoloads nil "testcover" "emacs-lisp/testcover.el" (22086
+;;;;;;  11929 686062 731000))
 ;;; Generated autoloads from emacs-lisp/testcover.el
 
 (autoload 'testcover-this-defun "testcover" "\
@@ -27202,8 +27218,8 @@ Start coverage on function under point.
 
 ;;;***
 
-;;;### (autoloads nil "tetris" "play/tetris.el" (22000 1842 148539
-;;;;;;  693000))
+;;;### (autoloads nil "tetris" "play/tetris.el" (22086 11930 130062
+;;;;;;  731000))
 ;;; Generated autoloads from play/tetris.el
 (push (purecopy '(tetris 2 1)) package--builtin-versions)
 
@@ -27228,8 +27244,8 @@ tetris-mode keybindings:
 
 ;;;***
 
-;;;### (autoloads nil "tex-mode" "textmodes/tex-mode.el" (22076 35900
-;;;;;;  118633 595000))
+;;;### (autoloads nil "tex-mode" "textmodes/tex-mode.el" (22092 27718
+;;;;;;  524268 464000))
 ;;; Generated autoloads from textmodes/tex-mode.el
 
 (defvar tex-shell-file-name nil "\
@@ -27331,7 +27347,7 @@ If two printers are not enough of a choice, you can set 
the variable
 for example,
 
     (setq tex-alt-dvi-print-command
-         '(format \"lpr -P%s\" (read-string \"Use printer: \")))
+         \\='(format \"lpr -P%s\" (read-string \"Use printer: \")))
 
 would tell \\[tex-print] with a prefix argument to ask you which printer to
 use.")
@@ -27530,8 +27546,8 @@ Major mode to edit DocTeX files.
 
 ;;;***
 
-;;;### (autoloads nil "texinfmt" "textmodes/texinfmt.el" (22011 58554
-;;;;;;  81858 469000))
+;;;### (autoloads nil "texinfmt" "textmodes/texinfmt.el" (22086 11930
+;;;;;;  350062 731000))
 ;;; Generated autoloads from textmodes/texinfmt.el
 
 (autoload 'texinfo-format-buffer "texinfmt" "\
@@ -27570,8 +27586,8 @@ if large.  You can use `Info-split' to do this manually.
 
 ;;;***
 
-;;;### (autoloads nil "texinfo" "textmodes/texinfo.el" (22026 25907
-;;;;;;  667502 692000))
+;;;### (autoloads nil "texinfo" "textmodes/texinfo.el" (22086 11930
+;;;;;;  350062 731000))
 ;;; Generated autoloads from textmodes/texinfo.el
 
 (defvar texinfo-open-quote (purecopy "``") "\
@@ -27655,8 +27671,8 @@ value of `texinfo-mode-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "thai-util" "language/thai-util.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "thai-util" "language/thai-util.el" (22086
+;;;;;;  11929 902062 731000))
 ;;; Generated autoloads from language/thai-util.el
 
 (autoload 'thai-compose-region "thai-util" "\
@@ -27683,8 +27699,8 @@ Compose Thai characters in the current buffer.
 
 ;;;***
 
-;;;### (autoloads nil "thingatpt" "thingatpt.el" (22011 58554 85858
-;;;;;;  469000))
+;;;### (autoloads nil "thingatpt" "thingatpt.el" (22086 11930 354062
+;;;;;;  731000))
 ;;; Generated autoloads from thingatpt.el
 
 (autoload 'forward-thing "thingatpt" "\
@@ -27748,7 +27764,7 @@ Return the Lisp list at point, or nil if none is found.
 
 ;;;***
 
-;;;### (autoloads nil "thumbs" "thumbs.el" (21993 28596 414597 473000))
+;;;### (autoloads nil "thumbs" "thumbs.el" (22086 11930 354062 731000))
 ;;; Generated autoloads from thumbs.el
 
 (autoload 'thumbs-find-thumb "thumbs" "\
@@ -27782,15 +27798,15 @@ In dired, call the setroot program on the image at 
point.
 
 ;;;***
 
-;;;### (autoloads nil "thunk" "emacs-lisp/thunk.el" (22064 41137
-;;;;;;  961468 395000))
+;;;### (autoloads nil "thunk" "emacs-lisp/thunk.el" (22086 11929
+;;;;;;  690062 731000))
 ;;; Generated autoloads from emacs-lisp/thunk.el
 (push (purecopy '(thunk 1 0)) package--builtin-versions)
 
 ;;;***
 
-;;;### (autoloads nil "tibet-util" "language/tibet-util.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "tibet-util" "language/tibet-util.el" (22086
+;;;;;;  11929 906062 731000))
 ;;; Generated autoloads from language/tibet-util.el
 
 (autoload 'tibetan-char-p "tibet-util" "\
@@ -27863,8 +27879,8 @@ See also docstring of the function 
tibetan-compose-region.
 
 ;;;***
 
-;;;### (autoloads nil "tildify" "textmodes/tildify.el" (22026 25907
-;;;;;;  667502 692000))
+;;;### (autoloads nil "tildify" "textmodes/tildify.el" (22086 11930
+;;;;;;  354062 731000))
 ;;; Generated autoloads from textmodes/tildify.el
 (push (purecopy '(tildify 4 6 1)) package--builtin-versions)
 
@@ -27930,7 +27946,7 @@ variable will be set to the representation.
 
 ;;;***
 
-;;;### (autoloads nil "time" "time.el" (22026 25907 667502 692000))
+;;;### (autoloads nil "time" "time.el" (22086 11930 354062 731000))
 ;;; Generated autoloads from time.el
 
 (defvar display-time-day-and-date nil "\
@@ -27992,8 +28008,8 @@ Return a string giving the duration of the Emacs 
initialization.
 
 ;;;***
 
-;;;### (autoloads nil "time-date" "calendar/time-date.el" (22000
-;;;;;;  55581 510930 477000))
+;;;### (autoloads nil "time-date" "calendar/time-date.el" (22086
+;;;;;;  11929 538062 731000))
 ;;; Generated autoloads from calendar/time-date.el
 
 (autoload 'date-to-time "time-date" "\
@@ -28096,8 +28112,8 @@ Convert the time interval in seconds to a short string.
 
 ;;;***
 
-;;;### (autoloads nil "time-stamp" "time-stamp.el" (21980 16568 89544
-;;;;;;  893000))
+;;;### (autoloads nil "time-stamp" "time-stamp.el" (22092 27718 528268
+;;;;;;  464000))
 ;;; Generated autoloads from time-stamp.el
 (put 'time-stamp-format 'safe-local-variable 'stringp)
 (put 'time-stamp-time-zone 'safe-local-variable 'string-or-null-p)
@@ -28137,8 +28153,8 @@ With ARG, turn time stamping on if and only if arg is 
positive.
 
 ;;;***
 
-;;;### (autoloads nil "timeclock" "calendar/timeclock.el" (21998
-;;;;;;  46516 882024 649000))
+;;;### (autoloads nil "timeclock" "calendar/timeclock.el" (22086
+;;;;;;  11929 538062 731000))
 ;;; Generated autoloads from calendar/timeclock.el
 (push (purecopy '(timeclock 2 6 1)) package--builtin-versions)
 
@@ -28248,7 +28264,7 @@ relative only to the time worked today, and not to past 
time.
 ;;;***
 
 ;;;### (autoloads nil "titdic-cnv" "international/titdic-cnv.el"
-;;;;;;  (22011 58553 673858 469000))
+;;;;;;  (22086 11929 886062 731000))
 ;;; Generated autoloads from international/titdic-cnv.el
 
 (autoload 'titdic-convert "titdic-cnv" "\
@@ -28270,7 +28286,7 @@ To get complete usage, invoke \"emacs -batch -f 
batch-titdic-convert -h\".
 
 ;;;***
 
-;;;### (autoloads nil "tmm" "tmm.el" (21907 48688 873360 195000))
+;;;### (autoloads nil "tmm" "tmm.el" (22086 11930 354062 731000))
 ;;; Generated autoloads from tmm.el
  (define-key global-map "\M-`" 'tmm-menubar)
  (define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse)
@@ -28312,8 +28328,8 @@ Its value should be an event that has a binding in MENU.
 
 ;;;***
 
-;;;### (autoloads nil "todo-mode" "calendar/todo-mode.el" (22015
-;;;;;;  55603 665705 321000))
+;;;### (autoloads nil "todo-mode" "calendar/todo-mode.el" (22086
+;;;;;;  11929 538062 731000))
 ;;; Generated autoloads from calendar/todo-mode.el
 
 (autoload 'todo-show "todo-mode" "\
@@ -28380,8 +28396,8 @@ Mode for displaying and reprioritizing top priority 
Todo.
 
 ;;;***
 
-;;;### (autoloads nil "tool-bar" "tool-bar.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "tool-bar" "tool-bar.el" (22086 11930 358062
+;;;;;;  731000))
 ;;; Generated autoloads from tool-bar.el
 
 (autoload 'toggle-tool-bar-mode-from-frame "tool-bar" "\
@@ -28451,8 +28467,8 @@ holds a keymap.
 
 ;;;***
 
-;;;### (autoloads nil "tq" "emacs-lisp/tq.el" (21670 32330 885624
-;;;;;;  725000))
+;;;### (autoloads nil "tq" "emacs-lisp/tq.el" (22086 11929 690062
+;;;;;;  731000))
 ;;; Generated autoloads from emacs-lisp/tq.el
 
 (autoload 'tq-create "tq" "\
@@ -28465,8 +28481,8 @@ to a tcp server on another machine.
 
 ;;;***
 
-;;;### (autoloads nil "trace" "emacs-lisp/trace.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "trace" "emacs-lisp/trace.el" (22086 11929
+;;;;;;  690062 731000))
 ;;; Generated autoloads from emacs-lisp/trace.el
 
 (defvar trace-buffer "*trace-output*" "\
@@ -28511,7 +28527,7 @@ the output buffer or changing the window configuration.
 
 ;;;***
 
-;;;### (autoloads nil "tramp" "net/tramp.el" (22083 9150 180915 960000))
+;;;### (autoloads nil "tramp" "net/tramp.el" (22092 27718 8268 464000))
 ;;; Generated autoloads from net/tramp.el
 
 (defvar tramp-mode t "\
@@ -28525,8 +28541,8 @@ Tramp filename syntax to be used.
 
 It can have the following values:
 
-  'ftp -- Ange-FTP respective EFS like syntax (GNU Emacs default)
-  'sep -- Syntax as defined for XEmacs.")
+  `ftp' -- Ange-FTP respective EFS like syntax (GNU Emacs default)
+  `sep' -- Syntax as defined for XEmacs.")
 
 (custom-autoload 'tramp-syntax "tramp" t)
 
@@ -28626,8 +28642,8 @@ Discard Tramp from loading remote files.
 
 ;;;***
 
-;;;### (autoloads nil "tramp-ftp" "net/tramp-ftp.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "tramp-ftp" "net/tramp-ftp.el" (22086 11930
+;;;;;;  14062 731000))
 ;;; Generated autoloads from net/tramp-ftp.el
 
 (autoload 'tramp-ftp-enable-ange-ftp "tramp-ftp" "\
@@ -28637,8 +28653,8 @@ Discard Tramp from loading remote files.
 
 ;;;***
 
-;;;### (autoloads nil "tutorial" "tutorial.el" (22011 58554 85858
-;;;;;;  469000))
+;;;### (autoloads nil "tutorial" "tutorial.el" (22086 11930 358062
+;;;;;;  731000))
 ;;; Generated autoloads from tutorial.el
 
 (autoload 'help-with-tutorial "tutorial" "\
@@ -28662,8 +28678,8 @@ resumed later.
 
 ;;;***
 
-;;;### (autoloads nil "tv-util" "language/tv-util.el" (21855 577
-;;;;;;  57945 485000))
+;;;### (autoloads nil "tv-util" "language/tv-util.el" (22086 11929
+;;;;;;  906062 731000))
 ;;; Generated autoloads from language/tv-util.el
 
 (autoload 'tai-viet-composition-function "tv-util" "\
@@ -28673,8 +28689,8 @@ resumed later.
 
 ;;;***
 
-;;;### (autoloads nil "two-column" "textmodes/two-column.el" (21998
-;;;;;;  46517 298024 649000))
+;;;### (autoloads nil "two-column" "textmodes/two-column.el" (22086
+;;;;;;  11930 354062 731000))
 ;;; Generated autoloads from textmodes/two-column.el
  (autoload '2C-command "two-column" () t 'keymap)
  (global-set-key "\C-x6" '2C-command)
@@ -28721,8 +28737,8 @@ First column's text    sSs  Second column's text
 
 ;;;***
 
-;;;### (autoloads nil "type-break" "type-break.el" (22011 58554 85858
-;;;;;;  469000))
+;;;### (autoloads nil "type-break" "type-break.el" (22086 11930 358062
+;;;;;;  731000))
 ;;; Generated autoloads from type-break.el
 
 (defvar type-break-mode nil "\
@@ -28854,7 +28870,7 @@ FRAC should be the inverse of the fractional value; for 
example, a value of
 
 ;;;***
 
-;;;### (autoloads nil "uce" "mail/uce.el" (22026 25907 603502 692000))
+;;;### (autoloads nil "uce" "mail/uce.el" (22086 11929 950062 731000))
 ;;; Generated autoloads from mail/uce.el
 
 (autoload 'uce-reply-to-uce "uce" "\
@@ -28868,7 +28884,7 @@ You might need to set `uce-mail-reader' before using 
this.
 ;;;***
 
 ;;;### (autoloads nil "ucs-normalize" "international/ucs-normalize.el"
-;;;;;;  (21670 32331 385639 720000))
+;;;;;;  (22086 11929 886062 731000))
 ;;; Generated autoloads from international/ucs-normalize.el
 
 (autoload 'ucs-normalize-NFD-region "ucs-normalize" "\
@@ -28933,8 +28949,8 @@ Normalize the string STR by the Unicode NFC and Mac 
OS's HFS Plus.
 
 ;;;***
 
-;;;### (autoloads nil "underline" "textmodes/underline.el" (21670
-;;;;;;  32331 885635 586000))
+;;;### (autoloads nil "underline" "textmodes/underline.el" (22086
+;;;;;;  11930 354062 731000))
 ;;; Generated autoloads from textmodes/underline.el
 
 (autoload 'underline-region "underline" "\
@@ -28954,8 +28970,8 @@ which specify the range to operate on.
 
 ;;;***
 
-;;;### (autoloads nil "unrmail" "mail/unrmail.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "unrmail" "mail/unrmail.el" (22086 11929 950062
+;;;;;;  731000))
 ;;; Generated autoloads from mail/unrmail.el
 
 (autoload 'batch-unrmail "unrmail" "\
@@ -28975,8 +28991,8 @@ The variable `unrmail-mbox-format' controls which mbox 
format to use.
 
 ;;;***
 
-;;;### (autoloads nil "unsafep" "emacs-lisp/unsafep.el" (21670 32330
-;;;;;;  885624 725000))
+;;;### (autoloads nil "unsafep" "emacs-lisp/unsafep.el" (22086 11929
+;;;;;;  690062 731000))
 ;;; Generated autoloads from emacs-lisp/unsafep.el
 
 (autoload 'unsafep "unsafep" "\
@@ -28988,7 +29004,7 @@ UNSAFEP-VARS is a list of symbols with local bindings.
 
 ;;;***
 
-;;;### (autoloads nil "url" "url/url.el" (21670 32331 885635 586000))
+;;;### (autoloads nil "url" "url/url.el" (22086 11930 366062 731000))
 ;;; Generated autoloads from url/url.el
 
 (autoload 'url-retrieve "url" "\
@@ -29035,8 +29051,8 @@ no further processing).  URL is either a string or a 
parsed URL.
 
 ;;;***
 
-;;;### (autoloads nil "url-auth" "url/url-auth.el" (21989 31537 943825
-;;;;;;  721000))
+;;;### (autoloads nil "url-auth" "url/url-auth.el" (22092 27718 528268
+;;;;;;  464000))
 ;;; Generated autoloads from url/url-auth.el
 
 (autoload 'url-get-authentication "url-auth" "\
@@ -29077,8 +29093,8 @@ RATING   a rating between 1 and 10 of the strength of 
the authentication.
 
 ;;;***
 
-;;;### (autoloads nil "url-cache" "url/url-cache.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "url-cache" "url/url-cache.el" (22086 11930
+;;;;;;  362062 731000))
 ;;; Generated autoloads from url/url-cache.el
 
 (autoload 'url-store-in-cache "url-cache" "\
@@ -29099,8 +29115,8 @@ Extract FNAM from the local disk cache.
 
 ;;;***
 
-;;;### (autoloads nil "url-cid" "url/url-cid.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "url-cid" "url/url-cid.el" (22086 11930 362062
+;;;;;;  731000))
 ;;; Generated autoloads from url/url-cid.el
 
 (autoload 'url-cid "url-cid" "\
@@ -29110,8 +29126,8 @@ Extract FNAM from the local disk cache.
 
 ;;;***
 
-;;;### (autoloads nil "url-dav" "url/url-dav.el" (22011 58554 85858
-;;;;;;  469000))
+;;;### (autoloads nil "url-dav" "url/url-dav.el" (22086 11930 362062
+;;;;;;  731000))
 ;;; Generated autoloads from url/url-dav.el
 
 (autoload 'url-dav-supported-p "url-dav" "\
@@ -29145,8 +29161,8 @@ added to this list, so most requests can just pass in 
nil.
 
 ;;;***
 
-;;;### (autoloads nil "url-file" "url/url-file.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "url-file" "url/url-file.el" (22086 11930 362062
+;;;;;;  731000))
 ;;; Generated autoloads from url/url-file.el
 
 (autoload 'url-file "url-file" "\
@@ -29156,8 +29172,8 @@ Handle file: and ftp: URLs.
 
 ;;;***
 
-;;;### (autoloads nil "url-gw" "url/url-gw.el" (22011 58554 85858
-;;;;;;  469000))
+;;;### (autoloads nil "url-gw" "url/url-gw.el" (22086 11930 362062
+;;;;;;  731000))
 ;;; Generated autoloads from url/url-gw.el
 
 (autoload 'url-gateway-nslookup-host "url-gw" "\
@@ -29179,7 +29195,7 @@ overriding the value of `url-gateway-method'.
 ;;;***
 
 ;;;### (autoloads nil "url-handlers" "url/url-handlers.el" (22089
-;;;;;;  47939 367694 315000))
+;;;;;;  51528 372929 316000))
 ;;; Generated autoloads from url/url-handlers.el
 
 (defvar url-handler-mode nil "\
@@ -29226,6 +29242,13 @@ accessible.
 
 \(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)
+
 (autoload 'url-insert-file-contents "url-handlers" "\
 
 
@@ -29233,8 +29256,8 @@ accessible.
 
 ;;;***
 
-;;;### (autoloads nil "url-http" "url/url-http.el" (22018 31799 119263
-;;;;;;  120000))
+;;;### (autoloads nil "url-http" "url/url-http.el" (22092 27718 532268
+;;;;;;  464000))
 ;;; Generated autoloads from url/url-http.el
  (autoload 'url-default-expander "url-expand")
 
@@ -29246,8 +29269,8 @@ accessible.
 
 ;;;***
 
-;;;### (autoloads nil "url-irc" "url/url-irc.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "url-irc" "url/url-irc.el" (22086 11930 366062
+;;;;;;  731000))
 ;;; Generated autoloads from url/url-irc.el
 
 (autoload 'url-irc "url-irc" "\
@@ -29257,8 +29280,8 @@ accessible.
 
 ;;;***
 
-;;;### (autoloads nil "url-ldap" "url/url-ldap.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "url-ldap" "url/url-ldap.el" (22086 11930 366062
+;;;;;;  731000))
 ;;; Generated autoloads from url/url-ldap.el
 
 (autoload 'url-ldap "url-ldap" "\
@@ -29271,8 +29294,8 @@ URL can be a URL string, or a URL vector of the type 
returned by
 
 ;;;***
 
-;;;### (autoloads nil "url-mailto" "url/url-mailto.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "url-mailto" "url/url-mailto.el" (22086 11930
+;;;;;;  366062 731000))
 ;;; Generated autoloads from url/url-mailto.el
 
 (autoload 'url-mail "url-mailto" "\
@@ -29287,8 +29310,8 @@ Handle the mailto: URL syntax.
 
 ;;;***
 
-;;;### (autoloads nil "url-misc" "url/url-misc.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "url-misc" "url/url-misc.el" (22086 11930 366062
+;;;;;;  731000))
 ;;; Generated autoloads from url/url-misc.el
 
 (autoload 'url-man "url-misc" "\
@@ -29319,8 +29342,8 @@ Fetch a data URL (RFC 2397).
 
 ;;;***
 
-;;;### (autoloads nil "url-news" "url/url-news.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "url-news" "url/url-news.el" (22086 11930 366062
+;;;;;;  731000))
 ;;; Generated autoloads from url/url-news.el
 
 (autoload 'url-news "url-news" "\
@@ -29335,8 +29358,8 @@ Fetch a data URL (RFC 2397).
 
 ;;;***
 
-;;;### (autoloads nil "url-ns" "url/url-ns.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "url-ns" "url/url-ns.el" (22086 11930 366062
+;;;;;;  731000))
 ;;; Generated autoloads from url/url-ns.el
 
 (autoload 'isPlainHostName "url-ns" "\
@@ -29376,8 +29399,8 @@ Fetch a data URL (RFC 2397).
 
 ;;;***
 
-;;;### (autoloads nil "url-parse" "url/url-parse.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "url-parse" "url/url-parse.el" (22086 11930
+;;;;;;  366062 731000))
 ;;; Generated autoloads from url/url-parse.el
 
 (autoload 'url-recreate-url "url-parse" "\
@@ -29428,8 +29451,8 @@ parses to
 
 ;;;***
 
-;;;### (autoloads nil "url-privacy" "url/url-privacy.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "url-privacy" "url/url-privacy.el" (22086 11930
+;;;;;;  366062 731000))
 ;;; Generated autoloads from url/url-privacy.el
 
 (autoload 'url-setup-privacy-info "url-privacy" "\
@@ -29439,8 +29462,8 @@ Setup variables that expose info about you and your 
system.
 
 ;;;***
 
-;;;### (autoloads nil "url-queue" "url/url-queue.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "url-queue" "url/url-queue.el" (22086 11930
+;;;;;;  366062 731000))
 ;;; Generated autoloads from url/url-queue.el
 
 (autoload 'url-queue-retrieve "url-queue" "\
@@ -29454,8 +29477,8 @@ The variable `url-queue-timeout' sets a timeout.
 
 ;;;***
 
-;;;### (autoloads nil "url-tramp" "url/url-tramp.el" (21670 32331
-;;;;;;  885635 586000))
+;;;### (autoloads nil "url-tramp" "url/url-tramp.el" (22086 11930
+;;;;;;  366062 731000))
 ;;; Generated autoloads from url/url-tramp.el
 
 (defvar url-tramp-protocols '("ftp" "ssh" "scp" "rsync" "telnet") "\
@@ -29473,8 +29496,8 @@ would have been passed to OPERATION.
 
 ;;;***
 
-;;;### (autoloads nil "url-util" "url/url-util.el" (21993 28596 418597
-;;;;;;  473000))
+;;;### (autoloads nil "url-util" "url/url-util.el" (22092 27718 532268
+;;;;;;  464000))
 ;;; Generated autoloads from url/url-util.el
 
 (defvar url-debug nil "\
@@ -29510,7 +29533,7 @@ conversion.  Replaces these characters as follows:
 \(fn STRING)" nil nil)
 
 (autoload 'url-normalize-url "url-util" "\
-Return a 'normalized' version of URL.
+Return a \"normalized\" version of URL.
 Strips out default port numbers, etc.
 
 \(fn URL)" nil nil)
@@ -29522,7 +29545,7 @@ Will not do anything if `url-show-status' is nil.
 \(fn &rest ARGS)" nil nil)
 
 (autoload 'url-get-normalized-date "url-util" "\
-Return a 'real' date string that most HTTP servers can understand.
+Return a date string that most HTTP servers can understand.
 
 \(fn &optional SPECIFIED-TIME)" nil nil)
 
@@ -29642,14 +29665,14 @@ This uses `url-current-object', set locally to the 
buffer.
 
 ;;;***
 
-;;;### (autoloads nil "userlock" "userlock.el" (21976 19510 152430
-;;;;;;  241000))
+;;;### (autoloads nil "userlock" "userlock.el" (22092 27718 532268
+;;;;;;  464000))
 ;;; Generated autoloads from userlock.el
 
 (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:
-  do (signal 'file-locked (list FILE OPPONENT))
+  do (signal \\='file-locked (list FILE OPPONENT))
     to refrain from editing the file
   return t (grab the lock on the file)
   return nil (edit the file even though it is locked).
@@ -29661,7 +29684,7 @@ in any way you like.
 (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
-of the buffer will proceed, or it can (signal 'file-supersession (file)),
+of the buffer will proceed, or it can (signal \\='file-supersession (file)),
 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.
@@ -29671,8 +29694,8 @@ The buffer in question is current when this function is 
called.
 
 ;;;***
 
-;;;### (autoloads nil "utf-7" "international/utf-7.el" (21670 32331
-;;;;;;  385639 720000))
+;;;### (autoloads nil "utf-7" "international/utf-7.el" (22086 11929
+;;;;;;  886062 731000))
 ;;; Generated autoloads from international/utf-7.el
 
 (autoload 'utf-7-post-read-conversion "utf-7" "\
@@ -29697,7 +29720,7 @@ The buffer in question is current when this function is 
called.
 
 ;;;***
 
-;;;### (autoloads nil "utf7" "gnus/utf7.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "utf7" "gnus/utf7.el" (22086 11929 854062 731000))
 ;;; Generated autoloads from gnus/utf7.el
 
 (autoload 'utf7-encode "utf7" "\
@@ -29707,8 +29730,8 @@ Encode UTF-7 STRING.  Use IMAP modification if FOR-IMAP 
is non-nil.
 
 ;;;***
 
-;;;### (autoloads nil "uudecode" "mail/uudecode.el" (21855 577 67944
-;;;;;;  554000))
+;;;### (autoloads nil "uudecode" "mail/uudecode.el" (22086 11929
+;;;;;;  954062 731000))
 ;;; Generated autoloads from mail/uudecode.el
 
 (autoload 'uudecode-decode-region-external "uudecode" "\
@@ -29732,7 +29755,7 @@ If FILE-NAME is non-nil, save the result to FILE-NAME.
 
 ;;;***
 
-;;;### (autoloads nil "vc" "vc/vc.el" (22083 9150 184915 960000))
+;;;### (autoloads nil "vc" "vc/vc.el" (22093 48588 592393 539000))
 ;;; Generated autoloads from vc/vc.el
 
 (defvar vc-checkout-hook nil "\
@@ -30044,8 +30067,8 @@ Return the branch part of a revision number REV.
 
 ;;;***
 
-;;;### (autoloads nil "vc-annotate" "vc/vc-annotate.el" (22011 58554
-;;;;;;  93858 469000))
+;;;### (autoloads nil "vc-annotate" "vc/vc-annotate.el" (22086 11930
+;;;;;;  382062 731000))
 ;;; Generated autoloads from vc/vc-annotate.el
 
 (autoload 'vc-annotate "vc-annotate" "\
@@ -30084,8 +30107,8 @@ should be applied to the background or to the 
foreground.
 
 ;;;***
 
-;;;### (autoloads nil "vc-bzr" "vc/vc-bzr.el" (22081 53819 655137
-;;;;;;  351000))
+;;;### (autoloads nil "vc-bzr" "vc/vc-bzr.el" (22086 11930 382062
+;;;;;;  731000))
 ;;; Generated autoloads from vc/vc-bzr.el
 
 (defconst vc-bzr-admin-dirname ".bzr" "\
@@ -30101,8 +30124,8 @@ Name of the format file in a .bzr directory.")
 
 ;;;***
 
-;;;### (autoloads nil "vc-cvs" "vc/vc-cvs.el" (22064 41138 17468
-;;;;;;  395000))
+;;;### (autoloads nil "vc-cvs" "vc/vc-cvs.el" (22099 26170 434017
+;;;;;;  16000))
 ;;; Generated autoloads from vc/vc-cvs.el
 (defun vc-cvs-registered (f)
   "Return non-nil if file F is registered with CVS."
@@ -30113,8 +30136,8 @@ Name of the format file in a .bzr directory.")
 
 ;;;***
 
-;;;### (autoloads nil "vc-dir" "vc/vc-dir.el" (22085 50883 245731
-;;;;;;  271000))
+;;;### (autoloads nil "vc-dir" "vc/vc-dir.el" (22086 11930 386062
+;;;;;;  731000))
 ;;; Generated autoloads from vc/vc-dir.el
 
 (autoload 'vc-dir "vc-dir" "\
@@ -30138,8 +30161,8 @@ These are the commands available for use in the file 
status buffer:
 
 ;;;***
 
-;;;### (autoloads nil "vc-dispatcher" "vc/vc-dispatcher.el" (21862
-;;;;;;  60209 928657 362000))
+;;;### (autoloads nil "vc-dispatcher" "vc/vc-dispatcher.el" (22104
+;;;;;;  18893 237441 487000))
 ;;; Generated autoloads from vc/vc-dispatcher.el
 
 (autoload 'vc-do-command "vc-dispatcher" "\
@@ -30162,8 +30185,8 @@ case, and the process object in the asynchronous case.
 
 ;;;***
 
-;;;### (autoloads nil "vc-git" "vc/vc-git.el" (22081 53819 659137
-;;;;;;  351000))
+;;;### (autoloads nil "vc-git" "vc/vc-git.el" (22097 45637 495432
+;;;;;;  455000))
 ;;; Generated autoloads from vc/vc-git.el
  (defun vc-git-registered (file)
   "Return non-nil if FILE is registered with git."
@@ -30174,7 +30197,7 @@ case, and the process object in the asynchronous case.
 
 ;;;***
 
-;;;### (autoloads nil "vc-hg" "vc/vc-hg.el" (22081 53819 659137 351000))
+;;;### (autoloads nil "vc-hg" "vc/vc-hg.el" (22097 45637 503432 455000))
 ;;; Generated autoloads from vc/vc-hg.el
  (defun vc-hg-registered (file)
   "Return non-nil if FILE is registered with hg."
@@ -30185,8 +30208,8 @@ case, and the process object in the asynchronous case.
 
 ;;;***
 
-;;;### (autoloads nil "vc-mtn" "vc/vc-mtn.el" (22064 41138 21468
-;;;;;;  395000))
+;;;### (autoloads nil "vc-mtn" "vc/vc-mtn.el" (22097 45637 515432
+;;;;;;  455000))
 ;;; Generated autoloads from vc/vc-mtn.el
 
 (defconst vc-mtn-admin-dir "_MTN" "\
@@ -30202,8 +30225,8 @@ Name of the monotone directory's format file.")
 
 ;;;***
 
-;;;### (autoloads nil "vc-rcs" "vc/vc-rcs.el" (22014 34736 851840
-;;;;;;  613000))
+;;;### (autoloads nil "vc-rcs" "vc/vc-rcs.el" (22097 45637 527432
+;;;;;;  455000))
 ;;; Generated autoloads from vc/vc-rcs.el
 
 (defvar vc-rcs-master-templates (purecopy '("%sRCS/%s,v" "%s%s,v" "%sRCS/%s")) 
"\
@@ -30216,8 +30239,8 @@ For a description of possible values, see 
`vc-check-master-templates'.")
 
 ;;;***
 
-;;;### (autoloads nil "vc-sccs" "vc/vc-sccs.el" (22014 34736 863840
-;;;;;;  613000))
+;;;### (autoloads nil "vc-sccs" "vc/vc-sccs.el" (22086 11930 386062
+;;;;;;  731000))
 ;;; Generated autoloads from vc/vc-sccs.el
 
 (defvar vc-sccs-master-templates (purecopy '("%sSCCS/s.%s" "%ss.%s" 
vc-sccs-search-project-dir)) "\
@@ -30235,8 +30258,8 @@ find any project directory." (let ((project-dir (getenv 
"PROJECTDIR")) dirs dir)
 
 ;;;***
 
-;;;### (autoloads nil "vc-src" "vc/vc-src.el" (22014 34736 863840
-;;;;;;  613000))
+;;;### (autoloads nil "vc-src" "vc/vc-src.el" (22086 11930 386062
+;;;;;;  731000))
 ;;; Generated autoloads from vc/vc-src.el
 
 (defvar vc-src-master-templates (purecopy '("%s.src/%s,v")) "\
@@ -30249,8 +30272,8 @@ For a description of possible values, see 
`vc-check-master-templates'.")
 
 ;;;***
 
-;;;### (autoloads nil "vc-svn" "vc/vc-svn.el" (22081 53819 663137
-;;;;;;  351000))
+;;;### (autoloads nil "vc-svn" "vc/vc-svn.el" (22101 42694 157526
+;;;;;;  804000))
 ;;; Generated autoloads from vc/vc-svn.el
  (defun vc-svn-registered (f)
   (let ((admin-dir (cond ((and (eq system-type 'windows-nt)
@@ -30263,8 +30286,8 @@ For a description of possible values, see 
`vc-check-master-templates'.")
 
 ;;;***
 
-;;;### (autoloads nil "vera-mode" "progmodes/vera-mode.el" (22011
-;;;;;;  58553 929858 469000))
+;;;### (autoloads nil "vera-mode" "progmodes/vera-mode.el" (22092
+;;;;;;  27718 320268 464000))
 ;;; 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))
@@ -30323,7 +30346,7 @@ Key bindings:
 ;;;***
 
 ;;;### (autoloads nil "verilog-mode" "progmodes/verilog-mode.el"
-;;;;;;  (22097 42046 455599 456000))
+;;;;;;  (22092 27718 348268 464000))
 ;;; Generated autoloads from progmodes/verilog-mode.el
 
 (autoload 'verilog-mode "verilog-mode" "\
@@ -30391,12 +30414,12 @@ Variables controlling indentation/edit style:
    will be inserted.  Setting this variable to zero results in every
    end acquiring a comment; the default avoids too many redundant
    comments in tight quarters.
- `verilog-auto-lineup'              (default 'declarations)
+ `verilog-auto-lineup'              (default `declarations')
    List of contexts where auto lineup of code should be done.
 
 Variables controlling other actions:
 
- `verilog-linter'                   (default surelint)
+ `verilog-linter'                   (default `surelint')
    Unix program to call to run the lint checker.  This is the default
    command for \\[compile-command] and \\[verilog-auto-save-compile].
 
@@ -30462,8 +30485,8 @@ Key bindings specific to `verilog-mode-map' are:
 
 ;;;***
 
-;;;### (autoloads nil "vhdl-mode" "progmodes/vhdl-mode.el" (22011
-;;;;;;  58553 969858 469000))
+;;;### (autoloads nil "vhdl-mode" "progmodes/vhdl-mode.el" (22092
+;;;;;;  27718 400268 464000))
 ;;; Generated autoloads from progmodes/vhdl-mode.el
 
 (autoload 'vhdl-mode "vhdl-mode" "\
@@ -31017,8 +31040,8 @@ Key bindings:
 
 ;;;***
 
-;;;### (autoloads nil "viet-util" "language/viet-util.el" (21670
-;;;;;;  32331 385639 720000))
+;;;### (autoloads nil "viet-util" "language/viet-util.el" (22086
+;;;;;;  11929 906062 731000))
 ;;; Generated autoloads from language/viet-util.el
 
 (autoload 'viet-encode-viscii-char "viet-util" "\
@@ -31062,7 +31085,7 @@ Convert Vietnamese characters of the current buffer to 
`VIQR' mnemonics.
 
 ;;;***
 
-;;;### (autoloads nil "view" "view.el" (21670 32331 885635 586000))
+;;;### (autoloads nil "view" "view.el" (22086 11930 390062 731000))
 ;;; Generated autoloads from view.el
 
 (defvar view-remove-frame-by-deleting t "\
@@ -31318,8 +31341,8 @@ Exit View mode and make the current buffer editable.
 
 ;;;***
 
-;;;### (autoloads nil "viper" "emulation/viper.el" (22011 58553 461858
-;;;;;;  469000))
+;;;### (autoloads nil "viper" "emulation/viper.el" (22086 11929 698062
+;;;;;;  731000))
 ;;; Generated autoloads from emulation/viper.el
 (push (purecopy '(viper 3 14 1)) package--builtin-versions)
 
@@ -31336,8 +31359,8 @@ Turn on Viper emulation of Vi in Emacs. See Info node 
`(viper)Top'.
 
 ;;;***
 
-;;;### (autoloads nil "warnings" "emacs-lisp/warnings.el" (21986
-;;;;;;  55346 260512 613000))
+;;;### (autoloads nil "warnings" "emacs-lisp/warnings.el" (22086
+;;;;;;  11929 690062 731000))
 ;;; Generated autoloads from emacs-lisp/warnings.el
 
 (defvar warning-prefix-function nil "\
@@ -31427,7 +31450,7 @@ this is equivalent to `display-warning', using
 
 ;;;***
 
-;;;### (autoloads nil "wdired" "wdired.el" (22026 25907 675502 692000))
+;;;### (autoloads nil "wdired" "wdired.el" (22086 11930 394062 731000))
 ;;; Generated autoloads from wdired.el
 (push (purecopy '(wdired 2 0)) package--builtin-versions)
 
@@ -31445,8 +31468,8 @@ See `wdired-mode'.
 
 ;;;***
 
-;;;### (autoloads nil "webjump" "net/webjump.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "webjump" "net/webjump.el" (22086 11930 22062
+;;;;;;  731000))
 ;;; Generated autoloads from net/webjump.el
 
 (autoload 'webjump "webjump" "\
@@ -31462,8 +31485,8 @@ Please submit bug reports and other feedback to the 
author, Neil W. Van Dyke
 
 ;;;***
 
-;;;### (autoloads nil "which-func" "progmodes/which-func.el" (22109
-;;;;;;  33223 420655 811000))
+;;;### (autoloads nil "which-func" "progmodes/which-func.el" (22086
+;;;;;;  11930 242062 731000))
 ;;; Generated autoloads from progmodes/which-func.el
  (put 'which-func-format 'risky-local-variable t)
  (put 'which-func-current 'risky-local-variable t)
@@ -31493,8 +31516,8 @@ in certain major modes.
 
 ;;;***
 
-;;;### (autoloads nil "whitespace" "whitespace.el" (22026 25907 675502
-;;;;;;  692000))
+;;;### (autoloads nil "whitespace" "whitespace.el" (22086 11930 394062
+;;;;;;  731000))
 ;;; Generated autoloads from whitespace.el
 (push (purecopy '(whitespace 13 2 2)) package--builtin-versions)
 
@@ -31862,8 +31885,8 @@ cleaning up these problems.
 
 ;;;***
 
-;;;### (autoloads nil "wid-browse" "wid-browse.el" (21670 32331 885635
-;;;;;;  586000))
+;;;### (autoloads nil "wid-browse" "wid-browse.el" (22086 11930 394062
+;;;;;;  731000))
 ;;; Generated autoloads from wid-browse.el
 
 (autoload 'widget-browse-at "wid-browse" "\
@@ -31891,8 +31914,8 @@ if ARG is omitted or nil.
 
 ;;;***
 
-;;;### (autoloads nil "wid-edit" "wid-edit.el" (22003 64432 668146
-;;;;;;  533000))
+;;;### (autoloads nil "wid-edit" "wid-edit.el" (22092 27718 580268
+;;;;;;  464000))
 ;;; Generated autoloads from wid-edit.el
 
 (autoload 'widgetp "wid-edit" "\
@@ -31934,8 +31957,8 @@ Setup current buffer so editing string widgets works.
 
 ;;;***
 
-;;;### (autoloads nil "windmove" "windmove.el" (21852 24382 97237
-;;;;;;  703000))
+;;;### (autoloads nil "windmove" "windmove.el" (22092 27718 580268
+;;;;;;  464000))
 ;;; Generated autoloads from windmove.el
 
 (autoload 'windmove-left "windmove" "\
@@ -31981,13 +32004,13 @@ If no window is at the desired location, an error is 
signaled.
 (autoload 'windmove-default-keybindings "windmove" "\
 Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIER-{left,right,up,down}.
-Default MODIFIER is 'shift.
+Default MODIFIER is `shift'.
 
 \(fn &optional MODIFIER)" t nil)
 
 ;;;***
 
-;;;### (autoloads nil "winner" "winner.el" (22030 22953 17158 467000))
+;;;### (autoloads nil "winner" "winner.el" (22086 11930 398062 731000))
 ;;; Generated autoloads from winner.el
 
 (defvar winner-mode nil "\
@@ -32010,7 +32033,7 @@ the mode if ARG is omitted or nil, and toggle it if ARG 
is `toggle'.
 
 ;;;***
 
-;;;### (autoloads nil "woman" "woman.el" (22026 25907 679502 692000))
+;;;### (autoloads nil "woman" "woman.el" (22092 27718 620268 464000))
 ;;; Generated autoloads from woman.el
 (push (purecopy '(woman 0 551)) package--builtin-versions)
 
@@ -32059,7 +32082,7 @@ Default bookmark handler for Woman buffers.
 
 ;;;***
 
-;;;### (autoloads nil "xml" "xml.el" (21974 64192 720009 993000))
+;;;### (autoloads nil "xml" "xml.el" (22092 27718 620268 464000))
 ;;; Generated autoloads from xml.el
 
 (autoload 'xml-parse-file "xml" "\
@@ -32115,8 +32138,8 @@ Both features can be combined by providing a cons cell
 
 ;;;***
 
-;;;### (autoloads nil "xmltok" "nxml/xmltok.el" (21670 32331 385639
-;;;;;;  720000))
+;;;### (autoloads nil "xmltok" "nxml/xmltok.el" (22086 11930 30062
+;;;;;;  731000))
 ;;; Generated autoloads from nxml/xmltok.el
 
 (autoload 'xmltok-get-declared-encoding-position "xmltok" "\
@@ -32134,10 +32157,15 @@ If LIMIT is non-nil, then do not consider characters 
beyond LIMIT.
 
 ;;;***
 
-;;;### (autoloads nil "xref" "progmodes/xref.el" (22087 6213 784351
-;;;;;;  952000))
+;;;### (autoloads nil "xref" "progmodes/xref.el" (22105 39773 959886
+;;;;;;  896000))
 ;;; Generated autoloads from progmodes/xref.el
 
+(autoload 'xref-find-backend "xref" "\
+
+
+\(fn)" nil nil)
+
 (autoload 'xref-pop-marker-stack "xref" "\
 Pop back to where \\[xref-find-definitions] was last invoked.
 
@@ -32192,8 +32220,8 @@ The argument has the same meaning as in `apropos'.
 
 ;;;***
 
-;;;### (autoloads nil "xt-mouse" "xt-mouse.el" (21852 24382 117243
-;;;;;;  951000))
+;;;### (autoloads nil "xt-mouse" "xt-mouse.el" (22086 11930 402062
+;;;;;;  731000))
 ;;; Generated autoloads from xt-mouse.el
 
 (defvar xterm-mouse-mode nil "\
@@ -32222,7 +32250,7 @@ down the SHIFT key while pressing the mouse button.
 
 ;;;***
 
-;;;### (autoloads nil "yenc" "gnus/yenc.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "yenc" "gnus/yenc.el" (22086 11929 854062 731000))
 ;;; Generated autoloads from gnus/yenc.el
 
 (autoload 'yenc-decode-region "yenc" "\
@@ -32237,7 +32265,7 @@ Extract file name from an yenc header.
 
 ;;;***
 
-;;;### (autoloads nil "zone" "play/zone.el" (21670 32331 385639 720000))
+;;;### (autoloads nil "zone" "play/zone.el" (22086 11930 130062 731000))
 ;;; Generated autoloads from play/zone.el
 
 (autoload 'zone "zone" "\
@@ -32317,12 +32345,13 @@ Zone out, completely.
 ;;;;;;  "cedet/srecode/loaddefs.el" "cedet/srecode/map.el" 
"cedet/srecode/mode.el"
 ;;;;;;  "cedet/srecode/semantic.el" "cedet/srecode/srt.el" 
"cedet/srecode/table.el"
 ;;;;;;  "cedet/srecode/template.el" "cedet/srecode/texi.el" "cus-dep.el"
-;;;;;;  "dframe.el" "dired-aux.el" "dired-x.el" "dom.el" "dos-fns.el"
-;;;;;;  "dos-vars.el" "dos-w32.el" "dynamic-setting.el" 
"emacs-lisp/avl-tree.el"
-;;;;;;  "emacs-lisp/bindat.el" "emacs-lisp/byte-opt.el" 
"emacs-lisp/cl-extra.el"
-;;;;;;  "emacs-lisp/cl-loaddefs.el" "emacs-lisp/cl-macs.el" 
"emacs-lisp/cl-seq.el"
-;;;;;;  "emacs-lisp/cl.el" "emacs-lisp/eieio-base.el" 
"emacs-lisp/eieio-compat.el"
-;;;;;;  "emacs-lisp/eieio-custom.el" "emacs-lisp/eieio-datadebug.el"
+;;;;;;  "dframe.el" "dired-aux.el" "dired-loaddefs.el" "dired-x.el"
+;;;;;;  "dom.el" "dos-fns.el" "dos-vars.el" "dos-w32.el" "dynamic-setting.el"
+;;;;;;  "emacs-lisp/avl-tree.el" "emacs-lisp/bindat.el" 
"emacs-lisp/byte-opt.el"
+;;;;;;  "emacs-lisp/cl-extra.el" "emacs-lisp/cl-loaddefs.el" 
"emacs-lisp/cl-macs.el"
+;;;;;;  "emacs-lisp/cl-seq.el" "emacs-lisp/cl.el" "emacs-lisp/eieio-base.el"
+;;;;;;  "emacs-lisp/eieio-compat.el" "emacs-lisp/eieio-custom.el"
+;;;;;;  "emacs-lisp/eieio-datadebug.el" "emacs-lisp/eieio-loaddefs.el"
 ;;;;;;  "emacs-lisp/eieio-opt.el" "emacs-lisp/eieio-speedbar.el"
 ;;;;;;  "emacs-lisp/generator.el" "emacs-lisp/lisp-mnt.el" 
"emacs-lisp/package-x.el"
 ;;;;;;  "emacs-lisp/smie.el" "emacs-lisp/subr-x.el" "emacs-lisp/tcover-ses.el"
@@ -32364,35 +32393,28 @@ Zone out, completely.
 ;;;;;;  "gnus/spam-wash.el" "hex-util.el" "hfy-cmap.el" "ibuf-ext.el"
 ;;;;;;  "international/charscript.el" "international/fontset.el"
 ;;;;;;  "international/iso-ascii.el" "international/ja-dic-cnv.el"
-;;;;;;  "international/ja-dic-utl.el" "international/ogonek.el" 
"international/uni-bidi.el"
-;;;;;;  "international/uni-brackets.el" "international/uni-category.el"
-;;;;;;  "international/uni-combining.el" "international/uni-comment.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-titlecase.el" "international/uni-uppercase.el"
-;;;;;;  "kermit.el" "language/hanja-util.el" "language/thai-word.el"
-;;;;;;  "ldefs-boot.el" "leim/quail/arabic.el" "leim/quail/croatian.el"
-;;;;;;  "leim/quail/cyril-jis.el" "leim/quail/cyrillic.el" 
"leim/quail/czech.el"
-;;;;;;  "leim/quail/ethiopic.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/indian.el" "leim/quail/ipa-praat.el"
-;;;;;;  "leim/quail/ipa.el" "leim/quail/japanese.el" "leim/quail/lao.el"
-;;;;;;  "leim/quail/latin-alt.el" "leim/quail/latin-ltx.el" 
"leim/quail/latin-post.el"
-;;;;;;  "leim/quail/latin-pre.el" "leim/quail/lrt.el" "leim/quail/persian.el"
-;;;;;;  "leim/quail/py-punct.el" "leim/quail/pypunct-b5.el" 
"leim/quail/rfc1345.el"
-;;;;;;  "leim/quail/sgml-input.el" "leim/quail/sisheng.el" 
"leim/quail/slovak.el"
-;;;;;;  "leim/quail/symbol-ksc.el" "leim/quail/thai.el" "leim/quail/tibetan.el"
+;;;;;;  "international/ja-dic-utl.el" "international/ogonek.el" "kermit.el"
+;;;;;;  "language/hanja-util.el" "language/thai-word.el" "ldefs-boot.el"
+;;;;;;  "leim/quail/arabic.el" "leim/quail/croatian.el" 
"leim/quail/cyril-jis.el"
+;;;;;;  "leim/quail/cyrillic.el" "leim/quail/czech.el" "leim/quail/ethiopic.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/indian.el" "leim/quail/ipa-praat.el" "leim/quail/ipa.el"
+;;;;;;  "leim/quail/japanese.el" "leim/quail/lao.el" "leim/quail/latin-alt.el"
+;;;;;;  "leim/quail/latin-ltx.el" "leim/quail/latin-post.el" 
"leim/quail/latin-pre.el"
+;;;;;;  "leim/quail/lrt.el" "leim/quail/persian.el" "leim/quail/py-punct.el"
+;;;;;;  "leim/quail/pypunct-b5.el" "leim/quail/rfc1345.el" 
"leim/quail/sgml-input.el"
+;;;;;;  "leim/quail/sisheng.el" "leim/quail/slovak.el" 
"leim/quail/symbol-ksc.el"
+;;;;;;  "leim/quail/tamil-dvorak.el" "leim/quail/thai.el" 
"leim/quail/tibetan.el"
 ;;;;;;  "leim/quail/viqr.el" "leim/quail/vntelex.el" "leim/quail/vnvni.el"
 ;;;;;;  "leim/quail/welsh.el" "loadup.el" "mail/blessmail.el" 
"mail/mailheader.el"
-;;;;;;  "mail/mspools.el" "mail/rfc2368.el" "mail/rfc822.el" 
"mail/rmail-spam-filter.el"
-;;;;;;  "mail/rmailedit.el" "mail/rmailkwd.el" "mail/rmailmm.el"
-;;;;;;  "mail/rmailmsc.el" "mail/rmailsort.el" "mail/rmailsum.el"
-;;;;;;  "mail/undigest.el" "mh-e/mh-acros.el" "mh-e/mh-alias.el"
-;;;;;;  "mh-e/mh-buffers.el" "mh-e/mh-compat.el" "mh-e/mh-funcs.el"
-;;;;;;  "mh-e/mh-gnus.el" "mh-e/mh-identity.el" "mh-e/mh-inc.el"
-;;;;;;  "mh-e/mh-junk.el" "mh-e/mh-letter.el" "mh-e/mh-limit.el"
+;;;;;;  "mail/mspools.el" "mail/rfc2368.el" "mail/rfc822.el" 
"mail/rmail-loaddefs.el"
+;;;;;;  "mail/rmail-spam-filter.el" "mail/rmailedit.el" "mail/rmailkwd.el"
+;;;;;;  "mail/rmailmm.el" "mail/rmailmsc.el" "mail/rmailsort.el"
+;;;;;;  "mail/rmailsum.el" "mail/undigest.el" "mh-e/mh-acros.el"
+;;;;;;  "mh-e/mh-alias.el" "mh-e/mh-buffers.el" "mh-e/mh-compat.el"
+;;;;;;  "mh-e/mh-funcs.el" "mh-e/mh-gnus.el" "mh-e/mh-identity.el"
+;;;;;;  "mh-e/mh-inc.el" "mh-e/mh-junk.el" "mh-e/mh-letter.el" 
"mh-e/mh-limit.el"
 ;;;;;;  "mh-e/mh-loaddefs.el" "mh-e/mh-mime.el" "mh-e/mh-print.el"
 ;;;;;;  "mh-e/mh-scan.el" "mh-e/mh-search.el" "mh-e/mh-seq.el" 
"mh-e/mh-show.el"
 ;;;;;;  "mh-e/mh-speed.el" "mh-e/mh-thread.el" "mh-e/mh-tool-bar.el"
@@ -32411,27 +32433,27 @@ Zone out, completely.
 ;;;;;;  "nxml/nxml-rap.el" "nxml/nxml-util.el" "nxml/rng-dt.el" 
"nxml/rng-loc.el"
 ;;;;;;  "nxml/rng-maint.el" "nxml/rng-match.el" "nxml/rng-parse.el"
 ;;;;;;  "nxml/rng-pttrn.el" "nxml/rng-uri.el" "nxml/rng-util.el"
-;;;;;;  "nxml/xsd-regexp.el" "org/ob-C.el" "org/ob-R.el" "org/ob-asymptote.el"
-;;;;;;  "org/ob-awk.el" "org/ob-calc.el" "org/ob-clojure.el" "org/ob-comint.el"
-;;;;;;  "org/ob-core.el" "org/ob-css.el" "org/ob-ditaa.el" "org/ob-dot.el"
-;;;;;;  "org/ob-emacs-lisp.el" "org/ob-eval.el" "org/ob-exp.el" 
"org/ob-fortran.el"
-;;;;;;  "org/ob-gnuplot.el" "org/ob-haskell.el" "org/ob-io.el" "org/ob-java.el"
-;;;;;;  "org/ob-js.el" "org/ob-keys.el" "org/ob-latex.el" "org/ob-ledger.el"
-;;;;;;  "org/ob-lilypond.el" "org/ob-lisp.el" "org/ob-lob.el" 
"org/ob-makefile.el"
-;;;;;;  "org/ob-matlab.el" "org/ob-maxima.el" "org/ob-mscgen.el"
-;;;;;;  "org/ob-ocaml.el" "org/ob-octave.el" "org/ob-org.el" "org/ob-perl.el"
-;;;;;;  "org/ob-picolisp.el" "org/ob-plantuml.el" "org/ob-python.el"
-;;;;;;  "org/ob-ref.el" "org/ob-ruby.el" "org/ob-sass.el" "org/ob-scala.el"
-;;;;;;  "org/ob-scheme.el" "org/ob-screen.el" "org/ob-sh.el" "org/ob-shen.el"
-;;;;;;  "org/ob-sql.el" "org/ob-sqlite.el" "org/ob-table.el" "org/ob-tangle.el"
-;;;;;;  "org/ob.el" "org/org-archive.el" "org/org-attach.el" "org/org-bbdb.el"
-;;;;;;  "org/org-bibtex.el" "org/org-clock.el" "org/org-crypt.el"
-;;;;;;  "org/org-ctags.el" "org/org-datetree.el" "org/org-docview.el"
-;;;;;;  "org/org-element.el" "org/org-entities.el" "org/org-eshell.el"
-;;;;;;  "org/org-faces.el" "org/org-feed.el" "org/org-footnote.el"
-;;;;;;  "org/org-gnus.el" "org/org-habit.el" "org/org-id.el" 
"org/org-indent.el"
-;;;;;;  "org/org-info.el" "org/org-inlinetask.el" "org/org-install.el"
-;;;;;;  "org/org-irc.el" "org/org-list.el" "org/org-loaddefs.el"
+;;;;;;  "nxml/xsd-regexp.el" "obarray.el" "org/ob-C.el" "org/ob-R.el"
+;;;;;;  "org/ob-asymptote.el" "org/ob-awk.el" "org/ob-calc.el" 
"org/ob-clojure.el"
+;;;;;;  "org/ob-comint.el" "org/ob-core.el" "org/ob-css.el" "org/ob-ditaa.el"
+;;;;;;  "org/ob-dot.el" "org/ob-emacs-lisp.el" "org/ob-eval.el" "org/ob-exp.el"
+;;;;;;  "org/ob-fortran.el" "org/ob-gnuplot.el" "org/ob-haskell.el"
+;;;;;;  "org/ob-io.el" "org/ob-java.el" "org/ob-js.el" "org/ob-keys.el"
+;;;;;;  "org/ob-latex.el" "org/ob-ledger.el" "org/ob-lilypond.el"
+;;;;;;  "org/ob-lisp.el" "org/ob-lob.el" "org/ob-makefile.el" 
"org/ob-matlab.el"
+;;;;;;  "org/ob-maxima.el" "org/ob-mscgen.el" "org/ob-ocaml.el" 
"org/ob-octave.el"
+;;;;;;  "org/ob-org.el" "org/ob-perl.el" "org/ob-picolisp.el" 
"org/ob-plantuml.el"
+;;;;;;  "org/ob-python.el" "org/ob-ref.el" "org/ob-ruby.el" "org/ob-sass.el"
+;;;;;;  "org/ob-scala.el" "org/ob-scheme.el" "org/ob-screen.el" "org/ob-sh.el"
+;;;;;;  "org/ob-shen.el" "org/ob-sql.el" "org/ob-sqlite.el" "org/ob-table.el"
+;;;;;;  "org/ob-tangle.el" "org/ob.el" "org/org-archive.el" "org/org-attach.el"
+;;;;;;  "org/org-bbdb.el" "org/org-bibtex.el" "org/org-clock.el"
+;;;;;;  "org/org-crypt.el" "org/org-ctags.el" "org/org-datetree.el"
+;;;;;;  "org/org-docview.el" "org/org-element.el" "org/org-entities.el"
+;;;;;;  "org/org-eshell.el" "org/org-faces.el" "org/org-feed.el"
+;;;;;;  "org/org-footnote.el" "org/org-gnus.el" "org/org-habit.el"
+;;;;;;  "org/org-id.el" "org/org-indent.el" "org/org-info.el" 
"org/org-inlinetask.el"
+;;;;;;  "org/org-install.el" "org/org-irc.el" "org/org-list.el" 
"org/org-loaddefs.el"
 ;;;;;;  "org/org-macro.el" "org/org-mhe.el" "org/org-mobile.el" 
"org/org-mouse.el"
 ;;;;;;  "org/org-pcomplete.el" "org/org-plot.el" "org/org-protocol.el"
 ;;;;;;  "org/org-rmail.el" "org/org-src.el" "org/org-table.el" 
"org/org-timer.el"
@@ -32461,7 +32483,7 @@ Zone out, completely.
 ;;;;;;  "vc/ediff-vers.el" "vc/ediff-wind.el" "vc/pcvs-info.el" 
"vc/pcvs-parse.el"
 ;;;;;;  "vc/pcvs-util.el" "vc/vc-dav.el" "vc/vc-filewise.el" "vcursor.el"
 ;;;;;;  "vt-control.el" "vt100-led.el" "w32-fns.el" "w32-vars.el"
-;;;;;;  "x-dnd.el") (22106 57434 227149 199000))
+;;;;;;  "x-dnd.el") (22108 15942 558032 987000))
 
 ;;;***
 
diff --git a/lisp/leim/quail/tamil-dvorak.el b/lisp/leim/quail/tamil-dvorak.el
new file mode 100644
index 0000000..d829925
--- /dev/null
+++ b/lisp/leim/quail/tamil-dvorak.el
@@ -0,0 +1,151 @@
+;;; tamil-dvorak.el --- Quail package for Tamil input with Dvorak keyboard
+
+;; Copyright (C) 2015 Free Software Foundation, Inc.
+
+;; Author: Shakthi Kannan <address@hidden>
+
+;; Keywords: multilingual, input method, Indian, Tamil, Dvorak
+
+;; This file is released under the terms 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; After loading this file in GNU Emacs, you can select this input
+;;; layout using "C-x Return C-\" followed by "tamil-dvorak" (without
+;;; the quotes). Available keys: Z
+
+;;; TODO: Add Tamil numbers, calendar from Unicode
+
+;;; Code:
+
+(require 'quail)
+
+(quail-define-package
+ "tamil-dvorak" "Tamil" "யளனக" nil
+ "யளனக Tamil keyboard layout for use with Unicode (UTF-8 encoding)
+  and Dvorak keyboard layout."
+ nil t t t t nil nil nil nil nil t)
+
+
+;; US Dvorak
+;; 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) [{ ]}
+;;  '" ,< .> pP yY fF gG cC rR lL /? =+ \|
+;;   aA oO eE uU iI dD hH tT nN sS -_
+;;     ;: qQ jJ kK xX bB mM wW vV zZ
+
+;; தமிழ்
+;; 1! 2@ 3# 4௹ 5% 6^ 7& 8* 9( 0) -_ {}
+;;  ஞஶ றஷ நஸ சஹ வஜ லல ரர ைஐ   ொ ோ ிீ ுூ =+ \|
+;;    ய' ள, ன. க" ப? ாழ த[ ம] ட< ்ஃ ங>
+;;      ண$ ஒஓ உஊ எஏ ெே ஔ ௌ அஆ இஈ ;: zZ
+
+(quail-define-rules
+ ("1" ?1)
+ ("2" ?2)
+ ("3" ?3)
+ ("4" ?4)
+ ("5" ?5)
+ ("6" ?6)
+ ("7" ?7)
+ ("8" ?8)
+ ("9" ?9)
+ ("0" ?0)
+ ("[" ?-)
+ ("]" ?{)
+ ("`" ?`)
+ ("'" ?ஞ)
+ ("," ?ற)
+ ("." ?ந)
+ ("p" ?ச)
+ ("y" ?வ)
+ ("f" ?ல)
+ ("g" ?ர)
+ ("c" ?ை)
+ ("r" ?ொ)
+ ("l" ?ி)
+ ("/" ?ு)
+ ("=" ?=)
+ ("a" ?ய)
+ ("o" ?ள)
+ ("e" ?ன)
+ ("u" ?க)
+ ("i" ?ப)
+ ("d" ?ா)
+ ("h" ?த)
+ ("t" ?ம)
+ ("n" ?ட)
+ ("s" ?்)
+ ("-" ?ங)
+ ("\\" ?\\)
+ (";" ?ண)
+ ("q" ?ஒ)
+ ("j" ?உ)
+ ("k" ?எ)
+ ("x" ?ெ)
+ ("b" ?ஔ)
+ ("m" ?அ)
+ ("w" ?இ)
+ ("v" ?\;)
+ ("z" ?/)
+ ("!" ?!)
+ ("@" ?@)
+ ("#" ?#)
+ ("$" ?௹)
+ ("%" ?%)
+ ("^" ?^)
+ ("&" ?&)
+ ("*" ?*)
+ ("(" ?\()
+ (")" ?\))
+ ("{" ?_)
+ ("}" ?})
+ ("~" ?~)
+ ("\"" ?ஶ)
+ ("<" ?ஷ)
+ (">" ?ஸ)
+ ("P" ?ஹ)
+ ("Y" ?ஜ)
+ ("F" ?ல)
+ ("G" ?ர)
+ ("C" ?ஐ)
+ ("R" ?ோ)
+ ("L" ?ீ)
+ ("?" ?ூ)
+ ("+" ?+)
+ ("A" ?')
+ ("O" ?,)
+ ("E" ?.)
+ ("U" ?\")
+ ("I" ??)
+ ("D" ?ழ)
+ ("H" ?\[)
+ ("T" ?\])
+ ("N" ?<)
+ ("S" ?ஃ)
+ ("_" ?>)
+ ("|" ?|)
+ (":" ?$)
+ ("Q" ?ஓ)
+ ("J" ?ஊ)
+ ("K" ?ஏ)
+ ("X" ?ே)
+ ("B" ?ௌ)
+ ("M" ?ஆ)
+ ("W" ?ஈ)
+ ("V" ?:)
+ ("Z" ?Z))
+
+;;; tamil-dvorak.el ends here
diff --git a/lisp/loadup.el b/lisp/loadup.el
index 782622c..e3e0eb7 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -281,7 +281,12 @@
 (if (featurep 'ns)
     (progn
       (load "term/common-win")
-      (load "term/ns-win")))
+      ;; Don't load ucs-normalize.el unless uni-*.el files were
+      ;; already produced, because it needs uni-*.el files that might
+      ;; not be built early enough during bootstrap.
+      (when (load-history-filename-element "charprop\\.el")
+        (load "international/ucs-normalize")
+        (load "term/ns-win"))))
 (if (fboundp 'x-create-frame)
     ;; Do it after loading term/foo-win.el since the value of the
     ;; mouse-wheel-*-event vars depends on those files being loaded or not.
diff --git a/lisp/mail/emacsbug.el b/lisp/mail/emacsbug.el
index 8e28973..ef5e86a 100644
--- a/lisp/mail/emacsbug.el
+++ b/lisp/mail/emacsbug.el
@@ -162,6 +162,14 @@ Prompts for bug subject.  Leaves you in a mail buffer."
     (setq message-end-point
          (with-current-buffer (messages-buffer)
            (point-max-marker)))
+    (condition-case nil
+        ;; For the novice user make sure there's always enough space for
+        ;; the mail and the warnings buffer on this frame (Bug#10873).
+        (unless report-emacs-bug-no-explanations
+          (delete-other-windows)
+          (set-window-dedicated-p nil nil)
+          (set-frame-parameter nil 'unsplittable nil))
+      (error nil))
     (compose-mail report-emacs-bug-address topic)
     ;; The rest of this does not execute if the user was asked to
     ;; confirm and said no.
@@ -234,7 +242,11 @@ usually do not have translators for other 
languages.\n\n")))
     (let ((txt (delete-and-extract-region (1+ user-point) (point))))
       (insert (propertize "\n" 'display txt)))
 
-    (insert "\n\nIn " (emacs-version) "\n")
+    (insert "\n\nIn " (emacs-version))
+    (if emacs-build-system
+        (insert " built on " emacs-build-system))
+    (insert "\n")
+
     (if (stringp emacs-repository-version)
        (insert "Repository revision: " emacs-repository-version "\n"))
     (if (fboundp 'x-server-vendor)
diff --git a/lisp/mail/feedmail.el b/lisp/mail/feedmail.el
index aec93db..bb93cff9 100644
--- a/lisp/mail/feedmail.el
+++ b/lisp/mail/feedmail.el
@@ -606,7 +606,7 @@ variables or other means, this option has no effect."
 May be t, in which case a default is computed (and you probably won't
 be happy with it).  May be nil, in which case nothing in particular is
 done with respect to From: lines.  By design, will not replace an
-existing From: line, but you can achieve that with a fiddle-plex 'replace
+existing From: line, but you can achieve that with a fiddle-plex `replace'
 action.
 
 If neither nil nor t, it may be a string, a fiddle-plex, or a function
@@ -870,11 +870,11 @@ headers for specific addresses.
 
 May be t, in which case a \"To:\" header is added to the message with
 the stripped address as the header contents.  The fiddle-plex operator
-is 'supplement.
+is `supplement'.
 
 May be a string, in which case the string is assumed to be the name of
 a message header field with the stripped address serving as the value.
-The fiddle-plex operator is 'supplement.
+The fiddle-plex operator is `supplement'.
 
 May be a function, in which case it is called with no arguments and is
 expected to return nil, t, a string, another function, or a fiddle-plex.
@@ -891,7 +891,7 @@ If a list, each item is acted on in turn as described above.
 
 For example,
 
-  (setq feedmail-spray-address-fiddle-plex-list 'feedmail-spray-via-bbdb)
+  (setq feedmail-spray-address-fiddle-plex-list \\='feedmail-spray-via-bbdb)
 
 The idea of the example is that, during spray mode, as each message is
 about to be transmitted to an individual address, the function will be
@@ -1383,7 +1383,7 @@ See documentation of `feedmail-mail-send-hook-splitter' 
for details."
 (defun feedmail-confirm-addresses-hook-example ()
   "An example of a `feedmail-last-chance-hook'.
 It shows the simple addresses and gets a confirmation.  Use as:
- (setq feedmail-last-chance-hook 'feedmail-confirm-addresses-hook-example)."
+ (setq feedmail-last-chance-hook \\='feedmail-confirm-addresses-hook-example)."
   (save-window-excursion
     (display-buffer (set-buffer (get-buffer-create " F-C-A-H-E")))
     (erase-buffer)
@@ -2080,7 +2080,7 @@ backup file names and the like)."
 (defun feedmail-queue-reminder (&optional what-event)
   "Perform some kind of reminder activity about queued and draft messages.
 Called with an optional symbol argument which says what kind of event
-is triggering the reminder activity.  The default is 'on-demand, which
+is triggering the reminder activity.  The default is `on-demand', which
 is what you typically would use if you were putting this in your Emacs start-up
 or mail hook code.  Other recognized values for WHAT-EVENT (these are passed
 internally by feedmail):
diff --git a/lisp/mail/hashcash.el b/lisp/mail/hashcash.el
index 7017065..1e57119 100644
--- a/lisp/mail/hashcash.el
+++ b/lisp/mail/hashcash.el
@@ -97,7 +97,7 @@ If this is not in your PATH, specify an absolute file name."
 
 (defcustom hashcash-extra-generate-parameters nil
   "A list of parameter strings passed to `hashcash-program' when minting.
-For example, you may want to set this to '(\"-Z2\") to reduce header length."
+For example, you may want to set this to (\"-Z2\") to reduce header length."
   :type '(repeat string)
   :group 'hashcash)
 
diff --git a/lisp/mail/rfc2368.el b/lisp/mail/rfc2368.el
index 50ff2cf..3cea39e 100644
--- a/lisp/mail/rfc2368.el
+++ b/lisp/mail/rfc2368.el
@@ -87,7 +87,7 @@
 MAILTO-URL should be a RFC 2368 (mailto) compliant url.  A cons cell w/ a
 key of `Body' is a special case and is considered a header for this purpose.
 The returned alist is intended for use w/ the `compose-mail' interface.
-Note: make sure MAILTO-URL has been 'unhtmlized' (e.g. &amp; -> &), before
+Note: make sure MAILTO-URL has been \"unhtmlized\" (e.g., &amp; -> &), before
 calling this function."
   (let ((case-fold-search t)
        prequery query headers-alist)
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 1ed4cc7..fe3375e 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -100,7 +100,7 @@ its character representation and its display 
representation.")
 
 (defvar rmail-header-style 'normal
   "The current header display style choice, one of
-'normal (selected headers) or 'full (all headers).")
+`normal' (selected headers) or `full' (all headers).")
 
 (defvar rmail-mime-decoded nil
   "Non-nil if message has been processed by `rmail-show-mime-function'.")
@@ -300,7 +300,7 @@ mail URLs as the source mailbox.")
 ;;;###autoload
 (defun rmail-movemail-variant-p (&rest variants)
   "Return t if the current movemail variant is any of VARIANTS.
-Currently known variants are 'emacs and 'mailutils."
+Currently known variants are `emacs' and `mailutils'."
   (when (not rmail-movemail-variant-in-use)
     ;; Autodetect
     (setq rmail-movemail-variant-in-use (rmail-autodetect)))
diff --git a/lisp/mail/rmailout.el b/lisp/mail/rmailout.el
index 1e770e6..587d75f 100644
--- a/lisp/mail/rmailout.el
+++ b/lisp/mail/rmailout.el
@@ -84,13 +84,14 @@ This uses `rmail-output-file-alist'."
                                        (eval (cdar tail))
                                      (error
                                       (display-warning
-                                       :error
+                                       'rmail-output
                                        (format-message "\
 Error evaluating `rmail-output-file-alist' element:
 regexp: %s
 action: %s
 error: %S\n"
-                                               (caar tail) (cdar tail) err))
+                                               (caar tail) (cdar tail) err)
+                                        :error)
                                       nil))))
                          (setq tail (cdr tail)))
                        answer))))))
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index b22c1ea..1ca783a 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -218,7 +218,7 @@
   (cond
    ((and (eq menu-bar-last-search-type 'string)
         search-ring)
-    (search-forward (car search-ring)))
+    (nonincremental-search-forward))
    ((and (eq menu-bar-last-search-type 'regexp)
         regexp-search-ring)
     (re-search-forward (car regexp-search-ring)))
@@ -231,30 +231,30 @@
   (cond
    ((and (eq menu-bar-last-search-type 'string)
         search-ring)
-    (search-backward (car search-ring)))
+    (nonincremental-search-backward))
    ((and (eq menu-bar-last-search-type 'regexp)
         regexp-search-ring)
     (re-search-backward (car regexp-search-ring)))
    (t
     (error "No previous search"))))
 
-(defun nonincremental-search-forward (string)
+(defun nonincremental-search-forward (&optional string backward)
   "Read a string and search for it nonincrementally."
   (interactive "sSearch for string: ")
   (setq menu-bar-last-search-type 'string)
-  (if (equal string "")
-      (search-forward (car search-ring))
-    (isearch-update-ring string nil)
-    (search-forward string)))
-
-(defun nonincremental-search-backward (string)
+  ;; Ideally, this whole command would be equivalent to `C-s RET'.
+  (let ((isearch-forward (not backward))
+        (isearch-regexp-function search-default-regexp-mode)
+        (isearch-regexp nil))
+    (if (or (equal string "") (not string))
+        (funcall (isearch-search-fun-default) (car search-ring))
+      (isearch-update-ring string nil)
+      (funcall (isearch-search-fun-default) string))))
+
+(defun nonincremental-search-backward (&optional string)
   "Read a string and search backward for it nonincrementally."
-  (interactive "sSearch for string: ")
-  (setq menu-bar-last-search-type 'string)
-  (if (equal string "")
-      (search-backward (car search-ring))
-    (isearch-update-ring string nil)
-    (search-backward string)))
+  (interactive "sSearch backwards for string: ")
+  (nonincremental-search-forward string 'backward))
 
 (defun nonincremental-re-search-forward (string)
   "Read a regular expression and search for it nonincrementally."
@@ -413,8 +413,8 @@
     menu))
 
 (defun menu-bar-goto-uses-etags-p ()
-  (or (not (boundp 'xref-find-function))
-      (eq xref-find-function 'etags-xref-find)))
+  (or (not (boundp 'xref-backend-functions))
+      (eq (car xref-backend-functions) 'etags--xref-backend)))
 
 (defvar yank-menu (cons (purecopy "Select Yank") nil))
 (fset 'yank-menu (cons 'keymap yank-menu))
diff --git a/lisp/mh-e/mh-e.el b/lisp/mh-e/mh-e.el
index c757920..85e6418 100644
--- a/lisp/mh-e/mh-e.el
+++ b/lisp/mh-e/mh-e.el
@@ -872,7 +872,7 @@ variant."
 
 (defun mh-variant-p (&rest variants)
   "Return t if variant is any of VARIANTS.
-Currently known variants are 'MH, 'nmh, and 'gnu-mh."
+Currently known variants are `MH', `nmh', and `gnu-mh'."
   (let ((variant-in-use
          (cadr (assoc 'variant (assoc mh-variant-in-use (mh-variants))))))
     (not (null (member variant-in-use variants)))))
@@ -1435,7 +1435,7 @@ the \"Value Menu\".
 You can specify an alternate \"From:\" header field using the \"From
 Field\" menu item. You must include a valid email address. A standard
 format is \"First Last <login@@host.domain>\". If you use an initial
-with a period, then you must quote your name as in '\"First I. Last\"
+with a period, then you must quote your name as in `\"First I. Last\"
 <login@@host.domain>'. People usually list the name of the company
 where they work using the \"Organization Field\" menu item. Set any
 arbitrary header field and value in the \"Other Field\" menu item.
@@ -1599,8 +1599,8 @@ other field matches.
 
 The handler functions are passed two or three arguments: the
 FIELD itself (for example, \"From\"), or one of the special
-fields (for example, \":signature\"), and the ACTION 'remove or
-'add. If the action is 'add, an additional argument
+fields (for example, \":signature\"), and the ACTION `remove' or
+`add'. If the action is `add', an additional argument
 containing the VALUE for the field is given."
   :type '(repeat (cons (string :tag "Field") function))
   :group 'mh-identity
diff --git a/lisp/mh-e/mh-identity.el b/lisp/mh-e/mh-identity.el
index cdd92fe..2da3fa2 100644
--- a/lisp/mh-e/mh-identity.el
+++ b/lisp/mh-e/mh-identity.el
@@ -180,9 +180,9 @@ See `mh-identity-list'."
 ;;;###mh-autoload
 (defun mh-identity-handler-gpg-identity (field action &optional value)
   "Process header FIELD \":pgg-default-user-id\".
-The ACTION is one of 'remove or 'add. If 'add, the VALUE is added.
+The ACTION is one of `remove' or `add'. If `add', the VALUE is added.
 The buffer-local variable `mh-identity-pgg-default-user-id' is set to
-VALUE when action 'add is selected."
+VALUE when action `add' is selected."
   (cond
    ((or (equal action 'remove)
         (not value)
@@ -194,7 +194,7 @@ VALUE when action 'add is selected."
 ;;;###mh-autoload
 (defun mh-identity-handler-signature (field action &optional value)
   "Process header FIELD \":signature\".
-The ACTION is one of 'remove or 'add. If 'add, the VALUE is
+The ACTION is one of `remove' or `add'. If `add', the VALUE is
 added."
   (cond
    ((equal action 'remove)
@@ -225,7 +225,7 @@ added."
 ;;;###mh-autoload
 (defun mh-identity-handler-attribution-verb (field action &optional value)
   "Process header FIELD \":attribution-verb\".
-The ACTION is one of 'remove or 'add. If 'add, the VALUE is
+The ACTION is one of `remove' or `add'.  If `add', the VALUE is
 added."
   (when (and (markerp mh-identity-attribution-verb-start)
              (markerp mh-identity-attribution-verb-end))
@@ -283,7 +283,7 @@ bottom of the header. If action is 'add, the VALUE is 
added."
 ;;;###mh-autoload
 (defun mh-identity-handler-top (field action &optional value)
   "Process header FIELD.
-The ACTION is one of 'remove or 'add. If 'add, the VALUE is
+The ACTION is one of `remove' or `add'. If `add', the VALUE is
 added. If the field wasn't present, it is added to the top of the
 header."
   (mh-identity-handler-default field action t value))
@@ -291,7 +291,7 @@ header."
 ;;;###mh-autoload
 (defun mh-identity-handler-bottom (field action &optional value)
   "Process header FIELD.
-The ACTION is one of 'remove or 'add. If 'add, the VALUE is
+The ACTION is one of `remove' or `add'. If `add', the VALUE is
 added. If the field wasn't present, it is added to the bottom of
 the header."
   (mh-identity-handler-default field action nil value))
diff --git a/lisp/mh-e/mh-seq.el b/lisp/mh-e/mh-seq.el
index 259f60d..13cf71f 100644
--- a/lisp/mh-e/mh-seq.el
+++ b/lisp/mh-e/mh-seq.el
@@ -555,7 +555,7 @@ change."
 ;;;###mh-autoload
 (defun mh-valid-view-change-operation-p (op)
   "Check if the view change operation can be performed.
-OP is one of 'widen and 'unthread."
+OP is one of `widen' and `unthread'."
   (cond ((eq (car mh-view-ops) op)
          (pop mh-view-ops))
         (t nil)))
diff --git a/lisp/net/ange-ftp.el b/lisp/net/ange-ftp.el
index 4f7fa3b..7fbf7f3 100644
--- a/lisp/net/ange-ftp.el
+++ b/lisp/net/ange-ftp.el
@@ -3863,7 +3863,7 @@ If VERBOSE-P is non-nil, print progress report in the 
echo area.
 FILES is a list of files to copy in the form
   (from-file to-file ok-if-already-exists keep-date)
 E.g.,
-  (ange-ftp-copy-files-async t nil t '((\"a\" \"b\" t t) (\"c\" \"d\" t t)))"
+  (ange-ftp-copy-files-async t nil t \\='((\"a\" \"b\" t t) (\"c\" \"d\" t 
t)))"
   (unless okay-p (error "%s: %s" 'ange-ftp-copy-files-async line))
   (if files
       (let* ((ff (car files))
diff --git a/lisp/net/browse-url.el b/lisp/net/browse-url.el
index 757e368..d232c8a 100644
--- a/lisp/net/browse-url.el
+++ b/lisp/net/browse-url.el
@@ -419,11 +419,11 @@ commands reverses the effect of this variable."
   :group 'browse-url)
 
 (defcustom browse-url-filename-alist
-  `(("^/\\(address@hidden|address@hidden)?\\([^:]+\\):/*" . "ftp://\\2/";)
+  `(("^/\\(address@hidden|address@hidden)?\\([^:/]+\\):/*" . "ftp://\\2/";)
     ;; The above loses the username to avoid the browser prompting for
     ;; it in anonymous cases.  If it's not anonymous the next regexp
     ;; applies.
-    ("^/\\([^:@address@hidden)?\\([^:]+\\):/*" . "ftp://\\1\\2/";)
+    ("^/\\([^:@/address@hidden)?\\([^:/]+\\):/*" . "ftp://\\1\\2/";)
     ,@(if (memq system-type '(windows-nt ms-dos))
           '(("^\\([a-zA-Z]:\\)[\\/]" . "file:///\\1/")
             ("^[\\/][\\/]+" . "file://")))
@@ -441,13 +441,13 @@ address to an HTTP URL:
     (setq browse-url-filename-alist
          \\='((\"/address@hidden:/home/www/html/\" .
             \"http://www.acme.co.uk/\";)
-            (\"^/\\(address@hidden|address@hidden)?\\([^:]+\\):/*\" . 
\"ftp://\\2/\";)
-            (\"^/\\([^:@address@hidden)?\\([^:]+\\):/*\" . \"ftp://\\1\\2/\";)
+            (\"^/\\(address@hidden|address@hidden)?\\([^:/]+\\):/*\" . 
\"ftp://\\2/\";)
+            (\"^/\\([^:@/address@hidden)?\\([^:/]+\\):/*\" . \"ftp://\\1\\2/\";)
            (\"^/+\" . \"file:/\")))"
   :type '(repeat (cons :format "%v"
                        (regexp :tag "Regexp")
                        (string :tag "Replacement")))
-  :version "23.1"
+  :version "25.1"
   :group 'browse-url)
 
 (defcustom browse-url-save-file nil
@@ -762,12 +762,17 @@ narrowed."
 (defun browse-url (url &rest args)
   "Ask a WWW browser to load URL.
 Prompt for a URL, defaulting to the URL at or before point.
-The variable `browse-url-browser-function' says which browser to use.
-If the URL is a mailto: URL, consult `browse-url-mailto-function'
+Invokes a suitable browser function which does the actual job.
+The variable `browse-url-browser-function' says which browser function to
+use.  If the URL is a mailto: URL, consult `browse-url-mailto-function'
 first, if that exists.
 
-Passes any ARGS to the browser function.
-The default is to pass `browse-url-new-window-flag'."
+The additional ARGS are passed to the browser function.  See the doc
+strings of the actual functions, starting with `browse-url-browser-function',
+for information about the 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."
   (interactive (browse-url-interactive-arg "URL: "))
   (unless (called-interactively-p 'interactive)
     (setq args (or args (list browse-url-new-window-flag))))
@@ -836,6 +841,8 @@ says which browser to use."
 (declare-function w32-shell-execute "w32fns.c")    ;; Defined in C.
 
 (defun browse-url-default-windows-browser (url &optional _new-window)
+  "Invoke the MS-Windows system's default Web browser.
+The optional NEW-WINDOW argument is not used."
   (interactive (browse-url-interactive-arg "URL: "))
   (cond ((eq system-type 'ms-dos)
         (if dos-windows-version
@@ -846,6 +853,8 @@ says which browser to use."
        (t (w32-shell-execute "open" url))))
 
 (defun browse-url-default-macosx-browser (url &optional _new-window)
+  "Invoke the MacOS X system's default Web browser.
+The optional NEW-WINDOW argument is not used"
   (interactive (browse-url-interactive-arg "URL: "))
   (start-process (concat "open " url) nil "open" url))
 
@@ -880,8 +889,8 @@ non-nil, load the document in a new window, if possible, 
otherwise use
 a random existing one.  A non-nil interactive 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'."
+When called non-interactively, optional second argument ARGS is used
+instead of `browse-url-new-window-flag'."
   (apply
    (cond
     ((memq system-type '(windows-nt ms-dos cygwin))
@@ -1103,7 +1112,8 @@ instead of `browse-url-new-window-flag'."
   "Ask the Chromium WWW browser to load URL.
 Default to the URL around or before point.  The strings in
 variable `browse-url-chromium-arguments' are also passed to
-Chromium."
+Chromium.
+The optional argument NEW-WINDOW is not used."
   (interactive (browse-url-interactive-arg "URL: "))
   (setq url (browse-url-encode-url url))
   (let* ((process-environment (browse-url-process-environment)))
@@ -1412,7 +1422,8 @@ The `browse-url-gnudoit-program' program is used with 
options given by
 URL defaults to the URL around or before point.
 This runs the text browser specified by `browse-url-text-browser'.
 in an Xterm window using the Xterm program named by `browse-url-xterm-program'
-with possible additional arguments `browse-url-xterm-args'."
+with possible additional arguments `browse-url-xterm-args'.
+The optional argument NEW-WINDOW is not used."
   (interactive (browse-url-interactive-arg "Text browser URL: "))
   (apply #'start-process `(,(concat browse-url-text-browser url)
                           nil ,browse-url-xterm-program
@@ -1560,7 +1571,8 @@ don't offer a form of remote control."
 ;;;###autoload
 (defun browse-url-kde (url &optional _new-window)
   "Ask the KDE WWW browser to load URL.
-Default to the URL around or before point."
+Default to the URL around or before point.
+The optional argument NEW-WINDOW is not used."
   (interactive (browse-url-interactive-arg "KDE URL: "))
   (message "Sending URL to KDE...")
   (apply #'start-process (concat "KDE " url) nil browse-url-kde-program
diff --git a/lisp/net/eudc-export.el b/lisp/net/eudc-export.el
index c60911f..a9fac51 100644
--- a/lisp/net/eudc-export.el
+++ b/lisp/net/eudc-export.el
@@ -86,12 +86,19 @@ If SILENT is non-nil then the created BBDB record is not 
displayed."
                                              (cons (car mapping) value))))
                                       conversion-alist)))
       (setq bbdb-notes (delq nil bbdb-notes))
-      (setq bbdb-record (bbdb-create-internal bbdb-name
-                                             bbdb-company
-                                             bbdb-net
-                                             bbdb-address
-                                             bbdb-phones
-                                             bbdb-notes))
+      (setq bbdb-record (bbdb-create-internal
+                        bbdb-name
+                        ,@(when (eudc--using-bbdb-3-or-newer-p)
+                            '(nil
+                              nil))
+                        bbdb-company
+                        bbdb-net
+                        ,@(if (eudc--using-bbdb-3-or-newer-p)
+                              '(bbdb-phones
+                                bbdb-address)
+                            '(bbdb-address
+                              bbdb-phones))
+                        bbdb-notes))
       (or silent
          (bbdb-display-records (list bbdb-record))))))
 
@@ -160,8 +167,13 @@ LOCATION is used as the address location for bbdb."
 ;; External.
 (declare-function bbdb-parse-phone-number "ext:bbdb-com"
                   (string &optional number-type))
+(declare-function bbdb-parse-phone "ext:bbdb-com" (string &optional style))
 (declare-function bbdb-string-trim "ext:bbdb" (string))
 
+(defun eudc-bbdbify-company (&rest organizations)
+  "Return ORGANIZATIONS as a list compatible with BBDB."
+  organizations)
+
 (defun eudc-bbdbify-phone (phone location)
   "Parse PHONE into a vector compatible with BBDB.
 PHONE is either a string supposedly containing a phone number or
@@ -172,7 +184,9 @@ LOCATION is used as the phone location for BBDB."
    ((stringp phone)
     (let (phone-list)
       (condition-case err
-         (setq phone-list (bbdb-parse-phone-number phone))
+         (setq phone-list (if (eudc--using-bbdb-3-or-newer-p)
+                              (bbdb-parse-phone phone)
+                            (bbdb-parse-phone-number phone)))
        (error
         (if (string= "phone number unparsable." (cadr err))
             (if (not (y-or-n-p (format "BBDB claims %S to be 
unparsable--insert anyway? " phone)))
diff --git a/lisp/net/eudc-vars.el b/lisp/net/eudc-vars.el
index 8cffa8e..de7e25a 100644
--- a/lisp/net/eudc-vars.el
+++ b/lisp/net/eudc-vars.el
@@ -50,7 +50,7 @@ instead."
 
 ;; Known protocols (used in completion)
 ;; Not to be mistaken with `eudc-supported-protocols'
-(defvar eudc-known-protocols '(bbdb ph ldap))
+(defvar eudc-known-protocols '(bbdb ldap))
 
 (defcustom eudc-server-hotlist nil
   "Directory servers to query.
@@ -357,6 +357,10 @@ BBDB fields.  SPECs are sexps which are evaluated:
                       (symbol :tag "BBDB Field")
                       (sexp :tag "Conversion Spec"))))
 
+(make-obsolete-variable 'eudc-ph-bbdb-conversion-alist
+                        "the EUDC PH/QI backend is obsolete."
+                        "25.1")
+
 ;;}}}
 
 ;;{{{ LDAP Custom Group
@@ -369,7 +373,8 @@ BBDB fields.  SPECs are sexps which are evaluated:
   '((name . cn)
     (net . mail)
     (address . (eudc-bbdbify-address postaladdress "Address"))
-    (phone . ((eudc-bbdbify-phone telephonenumber "Phone"))))
+    (phone . (eudc-bbdbify-phone telephonenumber "Phone"))
+    (company . (eudc-bbdbify-company o)))
   "A mapping from BBDB to LDAP attributes.
 This is a list of cons cells (BBDB-FIELD . SPEC-OR-LIST) where
 BBDB-FIELD is the name of a field that must be defined in your BBDB
diff --git a/lisp/net/eudc.el b/lisp/net/eudc.el
index 7280d9d..25a26bd 100644
--- a/lisp/net/eudc.el
+++ b/lisp/net/eudc.el
@@ -107,6 +107,18 @@
 ;; attribute name
 (defvar eudc-protocol-has-default-query-attributes nil)
 
+(defvar bbdb-version)
+
+(defun eudc--using-bbdb-3-or-newer-p ()
+  "Return non-nil if BBDB version is 3 or greater."
+  (or
+   ;; MELPA versions of BBDB may have a bad package version, but
+   ;; they're all version 3 or later.
+   (equal bbdb-version "@PACKAGE_VERSION@")
+   ;; Development versions of BBDB can have the format "X.YZ devo".
+   ;; Split the string just in case.
+   (version<= "3" (car (split-string bbdb-version)))))
+
 (defun eudc-plist-member (plist prop)
   "Return t if PROP has a value specified in PLIST."
   (if (not (= 0 (% (length plist) 2)))
diff --git a/lisp/net/eudcb-bbdb.el b/lisp/net/eudcb-bbdb.el
index 0545304..1972fc1 100644
--- a/lisp/net/eudcb-bbdb.el
+++ b/lisp/net/eudcb-bbdb.el
@@ -42,21 +42,13 @@
 (defvar eudc-bbdb-current-query nil)
 (defvar eudc-bbdb-current-return-attributes nil)
 
-(defvar bbdb-version)
-
 (defun eudc-bbdb-field (field-symbol)
   "Convert FIELD-SYMBOL so that it is recognized by the current BBDB version.
 BBDB < 3 used `net'; BBDB >= 3 uses `mail'."
   ;; This just-in-time translation permits upgrading from BBDB 2 to
   ;; BBDB 3 without restarting Emacs.
   (if (and (eq field-symbol 'net)
-          (or
-           ;; MELPA versions of BBDB may have a bad package version,
-           ;; but they're all version 3 or later.
-           (equal bbdb-version "@PACKAGE_VERSION@")
-           ;; Development versions of BBDB can have the format "X.YZ
-           ;; devo".  Split the string just in case.
-           (version<= "3" (car (split-string bbdb-version)))))
+          (eudc--using-bbdb-3-or-newer-p))
       'mail
     field-symbol))
 
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index babfdef..fabf36b 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -31,6 +31,7 @@
 (require 'url-queue)
 (require 'url-util)                    ; for url-get-url-at-point
 (require 'mm-url)
+(require 'puny)
 (eval-when-compile (require 'subr-x)) ;; for string-trim
 
 (defgroup eww nil
@@ -93,7 +94,7 @@ desktop.  Otherwise, such entries will be retained."
 
 (defcustom eww-restore-desktop nil
   "How to restore EWW buffers on `desktop-restore'.
-If t or 'auto, the buffers will be reloaded automatically.
+If t or `auto', the buffers will be reloaded automatically.
 If nil, buffers will require manual reload, and will contain the text
 specified in `eww-restore-reload-prompt' instead of the actual Web
 page contents."
@@ -275,6 +276,13 @@ word(s) will be searched for via `eww-search-prefix'."
            (setq url (concat eww-search-prefix
                              (replace-regexp-in-string " " "+" url))))))
   (eww-setup-buffer)
+  ;; Check whether the domain only uses "Highly Restricted" Unicode
+  ;; IDNA characters.  If not, transform to punycode to indicate that
+  ;; there may be funny business going on.
+  (let ((parsed (url-generic-parse-url url)))
+    (unless (puny-highly-restrictive-domain-p (url-host parsed))
+      (setf (url-host parsed) (puny-encode-domain (url-host parsed)))
+      (setq url (url-recreate-url parsed))))
   (plist-put eww-data :url url)
   (plist-put eww-data :title "")
   (eww-update-header-line-format)
@@ -322,7 +330,8 @@ Currently this means either text/html or 
application/xhtml+xml."
                    (or (cdr (assq 'charset (cdr content-type)))
                        (eww-detect-charset (eww-html-p (car content-type)))
                        "utf-8"))))
-        (data-buffer (current-buffer)))
+        (data-buffer (current-buffer))
+        last-coding-system-used)
     ;; Save the https peer status.
     (with-current-buffer buffer
       (plist-put eww-data :peer (plist-get status :peer)))
@@ -340,11 +349,13 @@ Currently this means either text/html or 
application/xhtml+xml."
           ((string-match-p "\\`image/" (car content-type))
            (eww-display-image buffer))
           (t
-           (eww-display-raw buffer encode)))
+           (eww-display-raw buffer (or encode charset 'utf-8))))
          (with-current-buffer buffer
            (plist-put eww-data :url url)
            (eww-update-header-line-format)
            (setq eww-history-position 0)
+           (and last-coding-system-used
+                (set-buffer-file-coding-system last-coding-system-used))
            (run-hooks 'eww-after-render-hook)))
       (kill-buffer data-buffer))))
 
@@ -390,17 +401,15 @@ Currently this means either text/html or 
application/xhtml+xml."
             (list
              'base (list (cons 'href url))
              (progn
-               (when (or (and encode
-                              (not (eq charset encode)))
-                         (not (eq charset 'utf-8)))
-                 (condition-case nil
-                     (decode-coding-region (point) (point-max)
-                                           (or encode charset))
-                   (coding-system-error nil)))
+               (setq encode (or encode charset 'utf-8))
+               (condition-case nil
+                   (decode-coding-region (point) (point-max) encode)
+                 (coding-system-error nil))
                (libxml-parse-html-region (point) (point-max))))))
        (source (and (null document)
                     (buffer-substring (point) (point-max)))))
     (with-current-buffer buffer
+      (setq bidi-paragraph-direction 'left-to-right)
       (plist-put eww-data :source source)
       (plist-put eww-data :dom document)
       (let ((inhibit-read-only t)
@@ -529,11 +538,9 @@ Currently this means either text/html or 
application/xhtml+xml."
       (let ((inhibit-read-only t))
        (erase-buffer)
        (insert data)
-       (unless (eq encode 'utf-8)
-         (encode-coding-region (point-min) (1+ (length data)) 'utf-8)
-         (condition-case nil
-             (decode-coding-region (point-min) (1+ (length data)) encode)
-           (coding-system-error nil))))
+       (condition-case nil
+           (decode-coding-region (point-min) (1+ (length data)) encode)
+         (coding-system-error nil)))
       (goto-char (point-min)))))
 
 (defun eww-display-image (buffer)
@@ -565,6 +572,7 @@ Currently this means either text/html or 
application/xhtml+xml."
   (let ((inhibit-read-only t))
     (remove-overlays)
     (erase-buffer))
+  (setq bidi-paragraph-direction 'left-to-right)
   (unless (eq major-mode 'eww-mode)
     (eww-mode)))
 
@@ -742,8 +750,7 @@ the like."
   (setq-local desktop-save-buffer #'eww-desktop-misc-data)
   ;; multi-page isearch support
   (setq-local multi-isearch-next-buffer-function #'eww-isearch-next-buffer)
-  (setq truncate-lines t
-        bidi-paragraph-direction 'left-to-right)
+  (setq truncate-lines t)
   (buffer-disable-undo)
   (setq buffer-read-only t))
 
@@ -1935,7 +1942,7 @@ Generally, the list should not include the (usually 
overly large)
 
 (defun eww-restore-desktop (file-name buffer-name misc-data)
   "Restore an eww buffer from its desktop file record.
-If `eww-restore-desktop' is t or 'auto, this function will also
+If `eww-restore-desktop' is t or `auto', this function will also
 initiate the retrieval of the respective URI in the background.
 Otherwise, the restored buffer will contain a prompt to do so by using
 \\[eww-reload]."
diff --git a/lisp/net/gnutls.el b/lisp/net/gnutls.el
index ccaef8a..a7321da 100644
--- a/lisp/net/gnutls.el
+++ b/lisp/net/gnutls.el
@@ -193,12 +193,7 @@ defaults to GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT."
         ;; The gnutls library doesn't understand files delivered via
         ;; the special handlers, so ignore all files found via those.
         (file-name-handler-alist nil)
-         (trustfiles (or trustfiles
-                         (delq nil
-                               (mapcar (lambda (f) (and f (file-exists-p f) f))
-                                       (if (functionp gnutls-trustfiles)
-                                           (funcall gnutls-trustfiles)
-                                         gnutls-trustfiles)))))
+         (trustfiles (or trustfiles (gnutls-trustfiles)))
          (priority-string (or priority-string
                               (cond
                                ((eq type 'gnutls-anon)
@@ -251,6 +246,14 @@ defaults to GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT."
 
     process))
 
+(defun gnutls-trustfiles ()
+  "Return a list of usable trustfiles."
+  (delq nil
+        (mapcar (lambda (f) (and f (file-exists-p f) f))
+                (if (functionp gnutls-trustfiles)
+                    (funcall gnutls-trustfiles)
+                  gnutls-trustfiles))))
+
 (declare-function gnutls-error-string "gnutls.c" (error))
 
 (defun gnutls-message-maybe (doit format &rest params)
diff --git a/lisp/net/imap.el b/lisp/net/imap.el
index b559ff6..cc89f47 100644
--- a/lisp/net/imap.el
+++ b/lisp/net/imap.el
@@ -74,8 +74,7 @@
 ;; imap.el supports RFC1730/2060/RFC3501 (IMAP4/IMAP4rev1).  The implemented
 ;; IMAP extensions are RFC2195 (CRAM-MD5), RFC2086 (ACL), RFC2342
 ;; (NAMESPACE), RFC2359 (UIDPLUS), the IMAP-part of RFC2595 (STARTTLS,
-;; LOGINDISABLED) (with use of external library starttls.el and
-;; program starttls), and the GSSAPI / Kerberos V4 sections of RFC1731
+;; LOGINDISABLED), and the GSSAPI / Kerberos V4 sections of RFC1731
 ;; (with use of external program `imtest'), and RFC2971 (ID).  It also
 ;; takes advantage of the UNSELECT extension in Cyrus IMAPD.
 ;;
@@ -140,8 +139,6 @@
 (eval-and-compile
   ;; For Emacs <22.2 and XEmacs.
   (unless (fboundp 'declare-function) (defmacro declare-function (&rest _r)))
-  (autoload 'starttls-open-stream "starttls")
-  (autoload 'starttls-negotiate "starttls")
   (autoload 'sasl-find-mechanism "sasl")
   (autoload 'digest-md5-parse-digest-challenge "digest-md5")
   (autoload 'digest-md5-digest-response "digest-md5")
@@ -151,8 +148,7 @@
   (autoload 'utf7-encode "utf7")
   (autoload 'utf7-decode "utf7")
   (autoload 'format-spec "format-spec")
-  (autoload 'format-spec-make "format-spec")
-  (autoload 'open-tls-stream "tls"))
+  (autoload 'format-spec-make "format-spec"))
 
 ;; User variables.
 
@@ -184,19 +180,6 @@ the list is tried until a successful connection is made."
   :group 'imap
   :type '(repeat string))
 
-(defcustom imap-ssl-program '("openssl s_client -quiet -ssl3 -connect %s:%p"
-                             "openssl s_client -quiet -ssl2 -connect %s:%p"
-                             "s_client -quiet -ssl3 -connect %s:%p"
-                             "s_client -quiet -ssl2 -connect %s:%p")
-  "A string, or list of strings, containing commands for SSL connections.
-Within a string, %s is replaced with the server address and %p with
-port number on server.  The program should accept IMAP commands on
-stdin and return responses to stdout.  Each entry in the list is tried
-until a successful connection is made."
-  :group 'imap
-  :type '(choice string
-                (repeat string)))
-
 (defcustom imap-shell-program '("ssh %s imapd"
                                "rsh %s imapd"
                                "ssh %g ssh %s imapd"
@@ -293,7 +276,7 @@ Shorter values mean quicker response, but is more CPU 
intensive."
   '((gssapi    imap-gssapi-stream-p    imap-gssapi-open)
     (kerberos4 imap-kerberos4-stream-p imap-kerberos4-open)
     (tls       imap-tls-p              imap-tls-open)
-    (ssl       imap-ssl-p              imap-ssl-open)
+    (ssl       imap-tls-p              imap-tls-open)
     (network   imap-network-p          imap-network-open)
     (shell     imap-shell-p            imap-shell-open)
     (starttls  imap-starttls-p         imap-starttls-open))
@@ -453,7 +436,7 @@ second the status (OK, NO, BAD etc) of the command.")
 
 When non-nil, use an alternative UIDS form.  Enabling appears to
 be required for some servers (e.g., Microsoft Exchange 2007)
-which otherwise would trigger a response 'BAD The specified
+which otherwise would trigger a response `BAD The specified
 message set is invalid.'.  We don't unconditionally use this
 form, since this is said to be significantly inefficient.
 
@@ -661,56 +644,6 @@ sure of changing the value of `foo'."
              nil)))))
     done))
 
-(defun imap-ssl-p (_buffer)
-  nil)
-
-(defun imap-ssl-open (name buffer server port)
-  "Open an SSL connection to SERVER."
-  (let ((cmds (if (listp imap-ssl-program) imap-ssl-program
-               (list imap-ssl-program)))
-       cmd done)
-    (while (and (not done) (setq cmd (pop cmds)))
-      (message "imap: Opening SSL connection with `%s'..." cmd)
-      (erase-buffer)
-      (let* ((port (or port imap-default-ssl-port))
-            (coding-system-for-read imap-coding-system-for-read)
-            (coding-system-for-write imap-coding-system-for-write)
-            (process-connection-type imap-process-connection-type)
-            (set-process-query-on-exit-flag
-             (if (fboundp 'set-process-query-on-exit-flag)
-                 'set-process-query-on-exit-flag
-               'process-kill-without-query))
-            process)
-       (when (progn
-               (setq process (start-process
-                              name buffer shell-file-name
-                              shell-command-switch
-                              (format-spec cmd
-                                           (format-spec-make
-                                            ?s server
-                                            ?p (number-to-string port)))))
-               (funcall set-process-query-on-exit-flag process nil)
-               process)
-         (with-current-buffer buffer
-           (goto-char (point-min))
-           (while (and (memq (process-status process) '(open run))
-                       (set-buffer buffer) ;; XXX "blue moon" nntp.el bug
-                       (goto-char (point-max))
-                       (forward-line -1)
-                       (not (imap-parse-greeting)))
-             (accept-process-output process 1)
-             (sit-for 1))
-           (imap-log buffer)
-           (erase-buffer)
-           (when (memq (process-status process) '(open run))
-             (setq done process))))))
-    (if done
-       (progn
-         (message "imap: Opening SSL connection with `%s'...done" cmd)
-         done)
-      (message "imap: Opening SSL connection with `%s'...failed" cmd)
-      nil)))
-
 (defun imap-tls-p (_buffer)
   nil)
 
@@ -718,7 +651,8 @@ sure of changing the value of `foo'."
   (let* ((port (or port imap-default-tls-port))
         (coding-system-for-read imap-coding-system-for-read)
         (coding-system-for-write imap-coding-system-for-write)
-        (process (open-tls-stream name buffer server port)))
+        (process (open-network-stream name buffer server port
+                                       :type 'tls)))
     (when process
       (while (and (memq (process-status process) '(open run))
                  ;; FIXME: Per the "blue moon" comment, the process/buffer
@@ -803,34 +737,23 @@ sure of changing the value of `foo'."
   (imap-capability 'STARTTLS buffer))
 
 (defun imap-starttls-open (name buffer server port)
+  (message "imap: Connecting with STARTTLS...")
   (let* ((port (or port imap-default-port))
         (coding-system-for-read imap-coding-system-for-read)
         (coding-system-for-write imap-coding-system-for-write)
-        (process (starttls-open-stream name buffer server port))
-        done tls-info)
-    (message "imap: Connecting with STARTTLS...")
-    (when process
-      (while (and (memq (process-status process) '(open run))
-                 (set-buffer buffer) ;; XXX "blue moon" nntp.el bug
-                 (goto-char (point-max))
-                 (forward-line -1)
-                 (not (imap-parse-greeting)))
-       (accept-process-output process 1)
-       (sit-for 1))
-      (imap-send-command "STARTTLS")
-      (while (and (memq (process-status process) '(open run))
-                 (set-buffer buffer) ;; XXX "blue moon" nntp.el bug
-                 (goto-char (point-max))
-                 (forward-line -1)
-                 (not (re-search-forward "[0-9]+ OK.*\r?\n" nil t)))
-       (accept-process-output process 1)
-       (sit-for 1))
-      (imap-log buffer)
-      (when (and (setq tls-info (starttls-negotiate process))
-                (memq (process-status process) '(open run)))
-       (setq done process)))
-    (if (stringp tls-info)
-       (message "imap: STARTTLS info: %s" tls-info))
+        (process (open-network-stream
+                   name buffer server port
+                   :type 'starttls
+                   :capability-command "1 CAPABILITY\r\n"
+                   :always-query-capabilities t
+                   :end-of-command "\r\n"
+                   :success " OK "
+                   :starttls-function
+                   (lambda (capabilities)
+                     (when (string-match-p "STARTTLS" capabilities)
+                       "1 STARTTLS\r\n"))))
+         (done (and process
+                    (memq (process-status process) '(open run)))))
     (message "imap: Connecting with STARTTLS...%s" (if done "done" "failed"))
     done))
 
@@ -1564,8 +1487,8 @@ returned, if ITEMS is a symbol only its value is 
returned."
 (defun imap-mailbox-status-asynch (mailbox items &optional buffer)
   "Send status item requests ITEMS on MAILBOX to server in BUFFER.
 ITEMS can be a symbol or a list of symbols, valid symbols are one of
-the STATUS data items -- i.e. 'messages, 'recent, 'uidnext, 'uidvalidity
-or 'unseen.  The IMAP command tag is returned."
+the STATUS data items -- i.e., `messages', `recent', `uidnext', `uidvalidity'
+or `unseen'.  The IMAP command tag is returned."
   (with-current-buffer (or buffer (current-buffer))
     (imap-send-command (list "STATUS \""
                             (imap-utf7-encode mailbox)
@@ -2966,8 +2889,6 @@ Return nil if no complete line has arrived."
          imap-error-text
          imap-kerberos4s-p
          imap-kerberos4-open
-         imap-ssl-p
-         imap-ssl-open
          imap-network-p
          imap-network-open
          imap-interactive-login
diff --git a/lisp/net/mairix.el b/lisp/net/mairix.el
index a73b4df..997e47b 100644
--- a/lisp/net/mairix.el
+++ b/lisp/net/mairix.el
@@ -211,7 +211,7 @@ nil for disabling this).")
 (defvar mairix-widget-other
   '(threads flags)
   "Other editable mairix commands when using customization widgets.
-Currently there are 'threads and 'flags.")
+Currently there are `threads' and `flags'.")
 
 ;;;; Internal variables
 
diff --git a/lisp/net/net-utils.el b/lisp/net/net-utils.el
index c6d40b6..643d312 100644
--- a/lisp/net/net-utils.el
+++ b/lisp/net/net-utils.el
@@ -35,15 +35,19 @@
 ;; * Support connections to HOST/PORT, generally for debugging and the like.
 ;; In other words, for doing much the same thing as "telnet HOST PORT", and
 ;; then typing commands.
-;;
-;; PATHS
-;;
-;; On some systems, some of these programs are not in normal user path,
-;; but rather in /sbin, /usr/sbin, and so on.
-
 
 ;;; Code:
 
+;; On some systems, programs like ifconfig are not in normal user
+;; path, but rather in /sbin, /usr/sbin, etc (but non-root users can
+;; still use them for queries).  Actually the trend these
+;; days is for /sbin to be a symlink to /usr/sbin, but we still need to
+;; search both for older systems.
+(defun net-utils--executable-find-sbin (command)
+  "Return absolute name of COMMAND if found in an sbin directory."
+  (let ((exec-path '("/sbin" "/usr/sbin" "/usr/local/sbin")))
+    (executable-find command)))
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Customization Variables
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -85,10 +89,13 @@ These options can be used to limit how many ICMP packets 
are emitted."
 (define-obsolete-variable-alias 'ipconfig-program 'ifconfig-program "22.2")
 
 (defcustom ifconfig-program
-  (if (eq system-type 'windows-nt)
-      "ipconfig"
-    "ifconfig")
+  (cond ((eq system-type 'windows-nt) "ipconfig")
+        ((executable-find "ifconfig") "ifconfig")
+        ((net-utils--executable-find-sbin "ifconfig"))
+        ((net-utils--executable-find-sbin "ip"))
+        (t "ip"))
   "Program to print network configuration information."
+  :version "25.1"                       ; add ip
   :group 'net-utils
   :type  'string)
 
@@ -96,10 +103,12 @@ These options can be used to limit how many ICMP packets 
are emitted."
   'ifconfig-program-options "22.2")
 
 (defcustom ifconfig-program-options
-  (list
-   (if (eq system-type 'windows-nt)
-       "/all" "-a"))
+  (cond ((string-match "ipconfig\\'" ifconfig-program) '("/all"))
+        ((string-match "ifconfig\\'" ifconfig-program) '("-a"))
+        ((string-match "ip\\'" ifconfig-program) '("addr")))
   "Options for the ifconfig program."
+  :version "25.1"
+  :set-after '(ifconfig-program)
   :group 'net-utils
   :type  '(repeat string))
 
@@ -126,7 +135,7 @@ These options can be used to limit how many ICMP packets 
are emitted."
   :group 'net-utils
   :type  '(repeat string))
 
-(defcustom arp-program "arp"
+(defcustom arp-program (or (net-utils--executable-find-sbin "arp") "arp")
   "Program to print IP to address translation tables."
   :group 'net-utils
   :type  'string)
diff --git a/lisp/net/network-stream.el b/lisp/net/network-stream.el
index 1eb5342..8e1ad63 100644
--- a/lisp/net/network-stream.el
+++ b/lisp/net/network-stream.el
@@ -46,6 +46,7 @@
 (require 'starttls)
 (require 'auth-source)
 (require 'nsm)
+(require 'puny)
 
 (autoload 'gnutls-negotiate "gnutls")
 (autoload 'open-gnutls-stream "gnutls")
@@ -148,7 +149,7 @@ asynchronously, if possible."
                                (plist-get parameters :capability-command))))))
        ;; The simplest case: wrapper around `make-network-process'.
        (make-network-process :name name :buffer buffer
-                             :host host :service service
+                             :host (puny-encode-domain host) :service service
                              :nowait (plist-get parameters :nowait))
       (let ((work-buffer (or buffer
                             (generate-new-buffer " *stream buffer*")))
@@ -198,7 +199,8 @@ asynchronously, if possible."
 (defun network-stream-open-plain (name buffer host service parameters)
   (let ((start (with-current-buffer buffer (point)))
        (stream (make-network-process :name name :buffer buffer
-                                     :host host :service service
+                                     :host (puny-encode-domain host)
+                                      :service service
                                      :nowait (plist-get parameters :nowait))))
     (when (plist-get parameters :warn-unless-encrypted)
       (setq stream (nsm-verify-connection stream host service nil t)))
@@ -219,7 +221,8 @@ asynchronously, if possible."
                                 eoc))
         ;; Return (STREAM GREETING CAPABILITIES RESULTING-TYPE)
         (stream (make-network-process :name name :buffer buffer
-                                      :host host :service service))
+                                      :host (puny-encode-domain host)
+                                       :service service))
         (greeting (and (not (plist-get parameters :nogreeting))
                        (network-stream-get-response stream start eoc)))
         (capabilities (network-stream-command stream capability-command
@@ -296,7 +299,8 @@ asynchronously, if possible."
          (unless require-tls
            (setq stream
                  (make-network-process :name name :buffer buffer
-                                       :host host :service service))
+                                       :host (puny-encode-domain host)
+                                        :service service))
            (network-stream-get-response stream start eoc)))
        ;; Re-get the capabilities, which may have now changed.
        (setq capabilities
diff --git a/lisp/net/newst-backend.el b/lisp/net/newst-backend.el
index 072fd01..2bec11e 100644
--- a/lisp/net/newst-backend.el
+++ b/lisp/net/newst-backend.el
@@ -502,8 +502,8 @@ This is a list of the form
 
 where LABEL is a symbol.  TITLE, DESCRIPTION, and LINK are
 strings.  TIME is a time value as returned by `current-time'.
-AGE is a symbol: 'new, 'old, 'immortal, and 'obsolete denote
-ordinary news items, whereas 'feed denotes an item which is not a
+AGE is a symbol: `new', `old', `immortal', and `obsolete' denote
+ordinary news items, whereas `feed' denotes an item which is not a
 headline but describes the feed itself.  INDEX denotes the
 original position of the item -- used for restoring the original
 order.  PREFORMATTED-CONTENTS and PREFORMATTED-TITLE hold the
@@ -1987,7 +1987,7 @@ Renders the HTML code in the region POS1 to POS2 using 
htmlr."
 
 (defun newsticker--cache-replace-age (data feed old-age new-age)
   "Mark all items in DATA in FEED which carry age OLD-AGE with NEW-AGE.
-If FEED is 'any it applies to all feeds.  If OLD-AGE is 'any,
+If FEED is `any' it applies to all feeds.  If OLD-AGE is `any',
 all marks are replaced by NEW-AGE.  Removes all pre-formatted contents."
   (mapc (lambda (a-feed)
           (when (or (eq feed 'any)
@@ -2038,7 +2038,7 @@ The properties which are checked are TITLE, DESC, LINK, 
AGE, and
 GUID.  In general all properties must match in order to return a
 certain item, except for the following cases.
 
-If AGE equals 'feed the TITLE, DESCription and LINK do not
+If AGE equals `feed' the TITLE, DESCription and LINK do not
 matter.  If DESC is nil it is ignored as well.  If
 `newsticker-desc-comp-max' is non-nil, only the first
 `newsticker-desc-comp-max' characters of DESC are taken into
@@ -2143,7 +2143,7 @@ which the item got."
 
 (defun newsticker--cache-remove (data feed-symbol age)
   "Remove all entries from DATA in the feed FEED-SYMBOL with AGE.
-FEED-SYMBOL may be 'any.  Entries from old feeds, which are no longer in
+FEED-SYMBOL may be `any'.  Entries from old feeds, which are no longer in
 `newsticker-url-list' or `newsticker-url-list-defaults', are removed as
 well."
   (let* ((pos data)
diff --git a/lisp/net/newst-plainview.el b/lisp/net/newst-plainview.el
index 0cb5d8c..b4e5690 100644
--- a/lisp/net/newst-plainview.el
+++ b/lisp/net/newst-plainview.el
@@ -228,7 +228,7 @@ Each function is called after one of `newsticker-next-item',
 `newsticker-next-new-item', `newsticker-previous-item',
 `newsticker-previous-new-item' has been called.
 
-The default value 'newsticker--buffer-make-item-completely-visible
+The default value `newsticker--buffer-make-item-completely-visible'
 assures that the current item is always completely visible."
   :type 'hook
   :options '(newsticker--buffer-make-item-completely-visible)
@@ -240,7 +240,7 @@ assures that the current item is always completely visible."
 Each function is called after one of `newsticker-next-feed', and
 `newsticker-previous-feed' has been called.
 
-The default value 'newsticker--buffer-make-item-completely-visible
+The default value `newsticker--buffer-make-item-completely-visible'
 assures that the current feed is completely visible."
   :type 'hook
   :options '(newsticker--buffer-make-item-completely-visible)
@@ -251,7 +251,7 @@ assures that the current feed is completely visible."
   "List of functions run after the newsticker buffer has been updated.
 Each function is called after `newsticker-buffer-update' has been called.
 
-The default value `\\='newsticker-w3m-show-inline-images' loads inline
+The default value `newsticker-w3m-show-inline-images' loads inline
 images."
   :type 'hook
   :group 'newsticker-plainview-hooks)
@@ -263,7 +263,7 @@ Each function is called after
 `newsticker-toggle-auto-narrow-to-feed' or
 `newsticker-toggle-auto-narrow-to-item' has been called.
 
-The default value `\\='newsticker-w3m-show-inline-images' loads inline
+The default value `newsticker-w3m-show-inline-images' loads inline
 images."
   :type 'hook
   :group 'newsticker-plainview-hooks)
@@ -1524,8 +1524,8 @@ Scans the buffer between START and END."
 
 (defun newsticker--buffer-set-invisibility (start end)
   "Add invisibility properties according to nt-type property.
-Scans the buffer between START and END.  Sets the 'invisible
-property to '(<nt-type>-<nt-age> <nt-type> <nt-age>)."
+Scans the buffer between START and END.  Sets the `invisible'
+property to (<nt-type>-<nt-age> <nt-type> <nt-age>)."
   (save-excursion
     ;; reset invisibility settings
     (put-text-property start end 'invisible nil)
diff --git a/lisp/net/newst-treeview.el b/lisp/net/newst-treeview.el
index 0c2df88..4f81b86 100644
--- a/lisp/net/newst-treeview.el
+++ b/lisp/net/newst-treeview.el
@@ -267,28 +267,34 @@ their id stays constant."
   "Render text between markers START and END."
   (if newsticker-html-renderer
       (condition-case error-data
-          (save-excursion
-            (set-marker-insertion-type end t)
-            ;; check whether it is necessary to call html renderer
-            ;; (regexp inspired by htmlr.el)
-            (goto-char start)
-            (when (re-search-forward
-                   "</?[A-Za-z1-6]*\\|&#?[A-Za-z0-9]+;" end t)
-              ;; (message "%s" (newsticker--title item))
-              (let ((w3m-fill-column (if newsticker-use-full-width
-                                         -1 fill-column))
-                    (w3-maximum-line-length
-                     (if newsticker-use-full-width nil fill-column)))
-                (save-excursion
-                  (funcall newsticker-html-renderer start end)))
-              ;;(cond ((eq newsticker-html-renderer 'w3m-region)
-              ;;     (add-text-properties start end (list 'keymap
-              ;;                                        w3m-minor-mode-map)))
-              ;;((eq newsticker-html-renderer 'w3-region)
-              ;;(add-text-properties start end (list 'keymap w3-mode-map))))
-              (if (eq newsticker-html-renderer 'w3m-region)
-                  (w3m-toggle-inline-images t))
-              t))
+          ;; Need to save selected window in order to prevent mixing
+          ;; up contents of the item buffer.  This happens with shr
+          ;; which does some smart optimizations that apparently
+          ;; interfere with our own, maybe not-so-smart, optimizations.
+          (save-selected-window
+            (save-excursion
+              (set-marker-insertion-type end t)
+              ;; check whether it is necessary to call html renderer
+              ;; (regexp inspired by htmlr.el)
+              (goto-char start)
+              (when (re-search-forward
+                     "</?[A-Za-z1-6]*\\|&#?[A-Za-z0-9]+;" end t)
+                ;; (message "%s" (newsticker--title item))
+                (let ((w3m-fill-column (if newsticker-use-full-width
+                                           -1 fill-column))
+                      (w3-maximum-line-length
+                       (if newsticker-use-full-width nil fill-column)))
+                  (select-window (newsticker--treeview-item-window))
+                  (save-excursion
+                    (funcall newsticker-html-renderer start end)))
+                ;;(cond ((eq newsticker-html-renderer 'w3m-region)
+                ;;     (add-text-properties start end (list 'keymap
+                ;;                                        w3m-minor-mode-map)))
+                ;;((eq newsticker-html-renderer 'w3-region)
+                ;;(add-text-properties start end (list 'keymap w3-mode-map))))
+                (if (eq newsticker-html-renderer 'w3m-region)
+                    (w3m-toggle-inline-images t))
+                t)))
         (error
          (message "Error: HTML rendering failed: %s, %s"
                   (car error-data) (cdr error-data))
diff --git a/lisp/net/puny.el b/lisp/net/puny.el
new file mode 100644
index 0000000..f2fa346
--- /dev/null
+++ b/lisp/net/puny.el
@@ -0,0 +1,248 @@
+;;; puny.el --- translate non-ASCII domain names to ASCII
+
+;; Copyright (C) 2015 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <address@hidden>
+;; Keywords: mail, net
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Written by looking at
+;; 
http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion
+
+;;; Code:
+
+(require 'seq)
+
+(defun puny-encode-domain (domain)
+  "Encode DOMAIN according to the IDNA/punycode algorith.
+For instance, \"fśf.org\" => \"xn--ff-2sa.org\"."
+  ;; The vast majority of domain names are not IDNA domain names, so
+  ;; add a check first to avoid doing unnecessary work.
+  (if (string-match "\\'[[:ascii:]]+\\'" domain)
+      domain
+    (mapconcat 'puny-encode-string (split-string domain "[.]") ".")))
+
+(defun puny-encode-string (string)
+  "Encode STRING according to the IDNA/punycode algorithm.
+This is used to encode non-ASCII domain names.
+For instance, \"bücher\" => \"xn--bcher-kva\"."
+  (let ((ascii (seq-filter (lambda (char)
+                             (< char 128))
+                           string)))
+    (if (= (length ascii) (length string))
+        string
+      (concat "xn--"
+              (if (null ascii)
+                  ""
+                (concat ascii "-"))
+              (puny-encode-complex (length ascii) string)))))
+
+(defun puny-decode-domain (domain)
+  "Decode DOMAIN according to the IDNA/punycode algorith.
+For instance, \"xn--ff-2sa.org\" => \"fśf.org\"."
+  (mapconcat 'puny-decode-string (split-string domain "[.]") "."))
+
+(defun puny-decode-string (string)
+  "Decode an IDNA/punycode-encoded string.
+For instance \"xn--bcher-kva\" => \"bücher\"."
+  (if (string-match "\\`xn--" string)
+      (puny-decode-string-internal (substring string 4))
+    string))
+
+(defconst puny-initial-n 128)
+(defconst puny-initial-bias 72)
+(defconst puny-base 36)
+(defconst puny-damp 700)
+(defconst puny-tmin 1)
+(defconst puny-tmax 26)
+(defconst puny-skew 28)
+
+;; 0-25  a-z
+;; 26-36 0-9
+(defun puny-encode-digit (d)
+  (if (< d 26)
+      (+ ?a d)
+    (+ ?0 (- d 26))))
+
+(defun puny-adapt (delta num-points first-time)
+  (let ((delta (if first-time
+                   (/ delta puny-damp)
+                 (/ delta 2)))
+        (k 0))
+    (setq delta (+ delta (/ delta num-points)))
+    (while (> delta (/ (* (- puny-base puny-tmin)
+                          puny-tmax)
+                       2))
+      (setq delta (/ delta (- puny-base puny-tmin))
+            k (+ k puny-base)))
+    (+ k (/ (* (1+ (- puny-base puny-tmin)) delta)
+            (+ delta puny-skew)))))
+
+(defun puny-encode-complex (insertion-points string)
+  (let ((n puny-initial-n)
+        (delta 0)
+        (bias puny-initial-bias)
+        (h insertion-points)
+        result m ijv q)
+    (while (< h (length string))
+      (setq ijv (cl-loop for char across string
+                         when (>= char n)
+                         minimize char))
+      (setq m ijv)
+      (setq delta (+ delta (* (- m n) (+ h 1)))
+            n m)
+      (cl-loop for char across string
+               when (< char n)
+               do (cl-incf delta)
+               when (= char ijv)
+               do (progn
+                    (setq q delta)
+                    (cl-loop with k = puny-base
+                             for t1 = (cond
+                                       ((<= k bias)
+                                        puny-tmin)
+                                       ((>= k (+ bias puny-tmax))
+                                        puny-tmax)
+                                       (t
+                                        (- k bias)))
+                             while (>= q t1)
+                             do (push (puny-encode-digit
+                                       (+ t1 (mod (- q t1)
+                                                  (- puny-base t1))))
+                                      result)
+                             do (setq q (/ (- q t1) (- puny-base t1))
+                                      k (+ k puny-base)))
+                    (push (puny-encode-digit q) result)
+                    (setq bias (puny-adapt delta (+ h 1) (= h 
insertion-points))
+                          delta 0
+                          h (1+ h))))
+      (cl-incf delta)
+      (cl-incf n))
+    (nreverse result)))
+
+(defun puny-decode-digit (cp)
+  (cond
+   ((<= cp ?9)
+    (+ (- cp ?0) 26))
+   ((<= cp ?Z)
+    (- cp ?A))
+   ((<= cp ?z)
+    (- cp ?a))
+   (t
+    puny-base)))
+
+(defun puny-decode-string-internal (string)
+  (with-temp-buffer
+    (insert string)
+    (goto-char (point-max))
+    (search-backward "-" nil (point-min))
+    ;; The encoded chars are after the final dash.
+    (let ((encoded (buffer-substring (1+ (point)) (point-max)))
+          (ic 0)
+          (i 0)
+          (bias puny-initial-bias)
+          (n puny-initial-n)
+          out)
+      (delete-region (point) (point-max))
+      (while (< ic (length encoded))
+        (let ((old-i i)
+              (w 1)
+              (k puny-base)
+              digit t1)
+          (cl-loop do (progn
+                        (setq digit (puny-decode-digit (aref encoded ic)))
+                        (cl-incf ic)
+                        (cl-incf i (* digit w))
+                        (setq t1 (cond
+                                  ((<= k bias)
+                                   puny-tmin)
+                                  ((>= k (+ bias puny-tmax))
+                                   puny-tmax)
+                                  (t
+                                   (- k bias)))))
+                   while (>= digit t1)
+                   do (setq w (* w (- puny-base t1))
+                            k (+ k puny-base)))
+          (setq out (1+ (buffer-size)))
+          (setq bias (puny-adapt (- i old-i) out (= old-i 0))))
+
+        (setq n (+ n (/ i out))
+              i (mod i out))
+        (goto-char (point-min))
+        (forward-char i)
+        (insert (format "%c" n))
+        (cl-incf i)))
+    (buffer-string)))
+
+;; http://www.unicode.org/reports/tr39/#Restriction_Level_Detection
+;; 
http://www.unicode.org/reports/tr31/#Table_Candidate_Characters_for_Inclusion_in_Identifiers
+
+(defun puny-highly-restrictive-string-p (string)
+  "Say whether STRING is \"highly restrictive\" in the Unicode IDNA sense.
+See http://www.unicode.org/reports/tr39/#Restriction_Level_Detection
+for details.  The main idea is that if you're mixing
+scripts (like latin and cyrillic), you may confuse the user by
+using homographs."
+  (let ((scripts
+         (delq
+          t
+          (seq-uniq
+           (seq-map (lambda (char)
+                      (if (memq char
+                                ;; These characters are always allowed
+                                ;; in any string.
+                                '(#x0027 ; APOSTROPHE
+                                  #x002D ; HYPHEN-MINUS
+                                  #x002E ; FULL STOP
+                                  #x003A ; COLON
+                                  #x00B7 ; MIDDLE DOT
+                                  #x058A ; ARMENIAN HYPHEN
+                                  #x05F3 ; HEBREW PUNCTUATION GERESH
+                                  #x05F4 ; HEBREW PUNCTUATION GERSHAYIM
+                                  #x0F0B ; IBETAN MARK INTERSYLLABIC TSHEG
+                                  #x200C ; ERO WIDTH NON-JOINER*
+                                  #x200D ; ERO WIDTH JOINER*
+                                  #x2010 ; YPHEN
+                                  #x2019 ; IGHT SINGLE QUOTATION MARK
+                                  #x2027 ; YPHENATION POINT
+                                  #x30A0 ; KATAKANA-HIRAGANA DOUBLE HYPHEN
+                                  #x30FB)) ; KATAKANA MIDDLE DOT
+                          t
+                        (aref char-script-table char)))
+                    string)))))
+    (or
+     ;; Every character uses the same script.
+     (= (length scripts) 1)
+     (seq-some 'identity
+               (mapcar (lambda (list)
+                         (seq-every-p (lambda (script)
+                                        (memq script list))
+                                      scripts))
+                       '((latin han hiragana kana)
+                         (latin han bopomofo)
+                         (latin han hangul)))))))
+
+(defun puny-highly-restrictive-domain-p (domain)
+  "Say whether DOMAIN is \"highly restrictive\" in the Unicode IDNA sense.
+See `puny-highly-restrictive-string-p' for further details."
+  (seq-every-p 'puny-highly-restrictive-string-p (split-string domain "[.]")))
+
+(provide 'puny)
+
+;;; puny.el ends here
diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index d58f3eb..3539dcf 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -320,7 +320,7 @@ Called with 5 arguments, PROCESS, SENDER, RESPONSE, TARGET 
and TEXT."
 
 (defcustom rcirc-decode-coding-system 'utf-8
   "Coding system used to decode incoming irc messages.
-Set to 'undecided if you want the encoding of the incoming
+Set to `undecided' if you want the encoding of the incoming
 messages autodetected."
   :type 'coding-system
   :group 'rcirc)
diff --git a/lisp/net/sasl-scram-rfc.el b/lisp/net/sasl-scram-rfc.el
index 18d7a6b..34d6ddb 100644
--- a/lisp/net/sasl-scram-rfc.el
+++ b/lisp/net/sasl-scram-rfc.el
@@ -3,6 +3,7 @@
 ;; Copyright (C) 2014-2015 Free Software Foundation, Inc.
 
 ;; Author: Magnus Henoch <address@hidden>
+;; Package: sasl
 
 ;; This file is part of GNU Emacs.
 
diff --git a/lisp/net/shr.el b/lisp/net/shr.el
index 469ef4e..0effa93 100644
--- a/lisp/net/shr.el
+++ b/lisp/net/shr.el
@@ -257,7 +257,8 @@ DOM should be a parse tree as generated by
                                      (if (and (null shr-width)
                                               (not (shr--have-one-fringe-p)))
                                          (* (frame-char-width) 2)
-                                       0))))))
+                                       0)))))
+        bidi-display-reordering)
     (shr-descend dom)
     (shr-fill-lines start (point))
     (shr-remove-trailing-whitespace start (point))
@@ -316,13 +317,25 @@ redirects somewhere else."
 (defun shr-next-link ()
   "Skip to the next link."
   (interactive)
-  (let ((skip (text-property-any (point) (point-max) 'help-echo nil)))
-    (if (or (eobp)
-           (not (setq skip (text-property-not-all skip (point-max)
-                                                  'help-echo nil))))
-       (message "No next link")
+  (let ((current (get-text-property (point) 'shr-url))
+        (start (point))
+        skip)
+    (while (and (not (eobp))
+                (equal (get-text-property (point) 'shr-url) current))
+      (forward-char 1))
+    (cond
+     ((and (not (eobp))
+           (get-text-property (point) 'shr-url))
+      ;; The next link is adjacent.
+      (message "%s" (get-text-property (point) 'help-echo)))
+     ((or (eobp)
+          (not (setq skip (text-property-not-all (point) (point-max)
+                                                 'shr-url nil))))
+      (goto-char start)
+      (message "No next link"))
+     (t
       (goto-char skip)
-      (message "%s" (get-text-property (point) 'help-echo)))))
+      (message "%s" (get-text-property (point) 'help-echo))))))
 
 (defun shr-previous-link ()
   "Skip to the previous link."
diff --git a/lisp/net/soap-client.el b/lisp/net/soap-client.el
index 71d4245..790084a 100644
--- a/lisp/net/soap-client.el
+++ b/lisp/net/soap-client.el
@@ -58,7 +58,7 @@
 (require 'mm-decode)
 
 (defsubst soap-warning (message &rest args)
-  "Display a warning MESSAGE with ARGS, using the 'soap-client warning type."
+  "Display a warning MESSAGE with ARGS, using the `soap-client' warning type."
   ;; Do not use #'format-message, to support older Emacs versions.
   (display-warning 'soap-client (apply #'format message args) :warning))
 
@@ -562,7 +562,7 @@ fractional seconds, and the DST (daylight savings time) 
field is
 replaced with DATATYPE, a symbol representing the XSD primitive
 datatype.  This symbol can be used to determine which fields
 apply and which don't when it's not already clear from context.
-For example a datatype of 'time means the year, month and day
+For example a datatype of `time' means the year, month and day
 fields should be ignored.
 
 This function will throw an error if DATE-TIME-STRING represents
diff --git a/lisp/net/tls.el b/lisp/net/tls.el
index 48e6a42..72fb50e 100644
--- a/lisp/net/tls.el
+++ b/lisp/net/tls.el
@@ -44,6 +44,8 @@
 
 ;;; Code:
 
+(require 'gnutls)
+
 (autoload 'format-spec "format-spec")
 (autoload 'format-spec-make "format-spec")
 
@@ -74,9 +76,10 @@ and `gnutls-cli' (version 2.0.1) output."
   :type 'regexp
   :group 'tls)
 
-(defcustom tls-program '("gnutls-cli --insecure -p %p %h"
-                        "gnutls-cli --insecure -p %p %h --protocols ssl3"
-                        "openssl s_client -connect %h:%p -no_ssl2 -ign_eof")
+(defcustom tls-program
+  '("gnutls-cli --x509cafile %t -p %p %h"
+    "gnutls-cli --x509cafile %t -p %p %h --protocols ssl3"
+    "openssl s_client -connect %h:%p -no_ssl2 -ign_eof")
   "List of strings containing commands to start TLS stream to a host.
 Each entry in the list is tried until a connection is successful.
 %h is replaced with server hostname, %p with port to connect to.
@@ -89,21 +92,17 @@ successful negotiation."
   :type
   '(choice
     (const :tag "Default list of commands"
-          ("gnutls-cli --insecure -p %p %h"
-           "gnutls-cli --insecure -p %p %h --protocols ssl3"
-           "openssl s_client -connect %h:%p -no_ssl2 -ign_eof"))
+          ("gnutls-cli --x509cafile %t -p %p %h"
+           "gnutls-cli --x509cafile %t -p %p %h --protocols ssl3"
+           "openssl s_client -CAfile %t -connect %h:%p -no_ssl2 -ign_eof"))
     (list :tag "Choose commands"
          :value
-         ("gnutls-cli --insecure -p %p %h"
-          "gnutls-cli --insecure -p %p %h --protocols ssl3"
+         ("gnutls-cli --x509cafile %t -p %p %h"
+          "gnutls-cli --x509cafile %t -p %p %h --protocols ssl3"
           "openssl s_client -connect %h:%p -no_ssl2 -ign_eof")
          (set :inline t
               ;; FIXME: add brief `:tag "..."' descriptions.
               ;; (repeat :inline t :tag "Other" (string))
-              ;; See `tls-checktrust':
-              (const "gnutls-cli --x509cafile 
/etc/ssl/certs/ca-certificates.crt -p %p %h")
-              (const "gnutls-cli --x509cafile 
/etc/ssl/certs/ca-certificates.crt -p %p %h --protocols ssl3")
-              (const "openssl s_client -connect %h:%p -CAfile 
/etc/ssl/certs/ca-certificates.crt -no_ssl2 -ign_eof")
               ;; No trust check:
               (const "gnutls-cli --insecure -p %p %h")
               (const "gnutls-cli --insecure -p %p %h --protocols ssl3")
@@ -232,6 +231,7 @@ Fourth arg PORT is an integer specifying a port to connect 
to."
               (format-spec
                cmd
                (format-spec-make
+                 ?t (car (gnutls-trustfiles))
                 ?h host
                 ?p (if (integerp port)
                        (int-to-string port)
diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index c571028..b6d6796 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -600,7 +600,8 @@ and replace a sub-expression, e.g.
 Store the result in LIST and return it.  LIST must be a proper list.
 Of several `equal' occurrences of an element in LIST, the first
 one is kept."
-  (cl-delete-duplicates list '(:test equal :from-end) nil)))
+  (tramp-compat-funcall
+   'cl-delete-duplicates list '(:test equal :from-end) nil)))
 
 (add-hook 'tramp-unload-hook
          (lambda ()
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index c5a6075..549d3b1 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -1740,20 +1740,25 @@ be used."
        (list user host)))
    (zeroconf-list-services service)))
 
+;; We use the TRIM argument of `split-string', which exist since Emacs
+;; 24.4.  I mask this for older Emacs versions, there is no harm.
 (defun tramp-gvfs-parse-device-names (service)
   "Return a list of (user host) tuples allowed to access.
 This uses \"avahi-browse\" in case D-Bus is not enabled in Avahi."
   (let ((result
-        (split-string
-         (shell-command-to-string (format "avahi-browse -trkp %s" service))
-         "[\n\r]+" 'omit "^\\+;.*$")))
+        (ignore-errors
+          (tramp-compat-funcall
+           'split-string
+           (shell-command-to-string (format "avahi-browse -trkp %s" service))
+           "[\n\r]+" 'omit "^\\+;.*$"))))
     (tramp-compat-delete-dups
      (mapcar
       (lambda (x)
        (let* ((list (split-string x ";"))
               (host (nth 6 list))
               (port (nth 8 list))
-              (text (split-string (nth 9 list) "\" \"" 'omit "\""))
+              (text (tramp-compat-funcall
+                     'split-string (nth 9 list) "\" \"" 'omit "\""))
               user)
 ;        (when (and port (not (string-equal port "0")))
 ;          (setq host (format "%s%s%s" host tramp-prefix-port-regexp port)))
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index f5ff6a7..0dd2440 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -486,6 +486,7 @@ The string is used in `tramp-methods'.")
 ;; Solaris: /usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin
 ;; GNU/Linux (Debian, Suse): /bin:/usr/bin
 ;; FreeBSD: /usr/bin:/bin:/usr/sbin:/sbin: - beware trailing ":"!
+;; Darwin: /usr/bin:/bin:/usr/sbin:/sbin
 ;; IRIX64: /usr/bin
 ;;;###tramp-autoload
 (defcustom tramp-remote-path
@@ -597,9 +598,14 @@ we have this shell function.")
 use File::Spec;
 use Cwd \"realpath\";
 
+sub myrealpath {
+    my ($file) = @_;
+    return realpath($file) if -e $file;
+}
+
 sub recursive {
     my ($volume, @dirs) = @_;
-    my $real = realpath(File::Spec->catpath(
+    my $real = myrealpath(File::Spec->catpath(
                    $volume, File::Spec->catdir(@dirs), \"\"));
     if ($real) {
         my ($vol, $dir) = File::Spec->splitpath($real, 1);
@@ -613,7 +619,7 @@ sub recursive {
     }
 }
 
-$result = realpath($ARGV[0]);
+$result = myrealpath($ARGV[0]);
 if (!$result) {
     my ($vol, $dir) = File::Spec->splitpath($ARGV[0], 1);
     ($vol, @dirs) = recursive($vol, File::Spec->splitdir($dir));
@@ -621,10 +627,7 @@ if (!$result) {
     $result = File::Spec->catpath($vol, File::Spec->catdir(@dirs), \"\");
 }
 
-if ($ARGV[0] =~ /\\/$/) {
-    $result = $result . \"/\";
-}
-
+$result =~ s/\"/\\\\\"/g;
 print \"\\\"$result\\\"\\n\";
 ' \"$1\" 2>/dev/null"
   "Perl script to produce output suitable for use with `file-truename'
@@ -1143,20 +1146,17 @@ target of the symlink differ."
 
           ;; Do it yourself.  We bind `directory-sep-char' here for
           ;; XEmacs on Windows, which would otherwise use backslash.
-          (t (let* ((directory-sep-char ?/)
-                    (steps (tramp-compat-split-string localname "/"))
-                    (localnamedir (tramp-run-real-handler
-                                   'file-name-as-directory (list localname)))
-                    (is-dir (string= localname localnamedir))
-                    (thisstep nil)
-                    (numchase 0)
-                    ;; Don't make the following value larger than
-                    ;; necessary.  People expect an error message in
-                    ;; a timely fashion when something is wrong;
-                    ;; otherwise they might think that Emacs is hung.
-                    ;; Of course, correctness has to come first.
-                    (numchase-limit 20)
-                    symlink-target)
+          (t (let ((directory-sep-char ?/)
+                   (steps (tramp-compat-split-string localname "/"))
+                   (thisstep nil)
+                   (numchase 0)
+                   ;; Don't make the following value larger than
+                   ;; necessary.  People expect an error message in a
+                   ;; timely fashion when something is wrong;
+                   ;; otherwise they might think that Emacs is hung.
+                   ;; Of course, correctness has to come first.
+                   (numchase-limit 20)
+                   symlink-target)
                (while (and steps (< numchase numchase-limit))
                  (setq thisstep (pop steps))
                  (tramp-message
@@ -1212,10 +1212,8 @@ target of the symlink differ."
                      (if result
                          (mapconcat 'identity (cons "" result) "/")
                        "/"))
-               (when (and is-dir
-                          (or (string= "" result)
-                              (not (string= (substring result -1) "/"))))
-                 (setq result (concat result "/"))))))
+               (when (string= "" result)
+                 (setq result "/")))))
 
          (tramp-message v 4 "True name of `%s' is `%s'" localname result)
          result))))
@@ -1276,11 +1274,15 @@ target of the symlink differ."
             (tramp-get-test-command vec)
             (tramp-shell-quote-argument localname)
             (tramp-get-ls-command vec)
+            (if (eq id-format 'integer) "-ildn" "-ild")
             ;; On systems which have no quoting style, file names
             ;; with special characters could fail.
-            (if (tramp-get-ls-command-with-quoting-style vec)
-                "--quoting-style=c" "")
-            (if (eq id-format 'integer) "-ildn" "-ild")
+            (cond
+             ((tramp-get-ls-command-with-quoting-style vec)
+              "--quoting-style=c")
+             ((tramp-get-ls-command-with-w-option vec)
+              "-w")
+             (t ""))
             (tramp-shell-quote-argument localname)))
     ;; Parse `ls -l' output ...
     (with-current-buffer (tramp-get-buffer vec)
@@ -1837,10 +1839,14 @@ be non-negative integers."
      "-- 2>/dev/null | sed -e 's/\"/\\\\\"/g' -e 's/%s/\"/g'); echo \")\"")
     (tramp-shell-quote-argument localname)
     (tramp-get-ls-command vec)
-    ;; On systems which have no quoting style, file names with
-    ;; special characters could fail.
-    (if (tramp-get-ls-command-with-quoting-style vec)
-       "--quoting-style=shell" "")
+    ;; On systems which have no quoting style, file names with special
+    ;; characters could fail.
+    (cond
+     ((tramp-get-ls-command-with-quoting-style vec)
+      "--quoting-style=shell")
+     ((tramp-get-ls-command-with-w-option vec)
+      "-w")
+     (t ""))
     (tramp-get-remote-stat vec)
     tramp-stat-marker tramp-stat-marker
     tramp-stat-marker tramp-stat-marker
@@ -4149,7 +4155,8 @@ seconds.  If not, it produces an error message with the 
given ERROR-ARGS."
   "Set up an interactive shell.
 Mainly sets the prompt and the echo correctly.  PROC is the shell
 process to set up.  VEC specifies the connection."
-  (let ((tramp-end-of-output tramp-initial-end-of-output))
+  (let ((tramp-end-of-output tramp-initial-end-of-output)
+       (case-fold-search t))
     (tramp-open-shell vec (tramp-get-method-parameter vec 'tramp-remote-shell))
 
     ;; Disable tab and echo expansion.
@@ -4174,6 +4181,25 @@ process to set up.  VEC specifies the connection."
    vec (format "PS1=%s PS2='' PS3='' PROMPT_COMMAND=''"
               (tramp-shell-quote-argument tramp-end-of-output)) t)
 
+  ;; Check whether the output of "uname -sr" has been changed.  If
+  ;; yes, this is a strong indication that we must expire all
+  ;; connection properties.  We start again with
+  ;; `tramp-maybe-open-connection', it will be caught there.
+  (tramp-message vec 5 "Checking system information")
+  (let ((old-uname (tramp-get-connection-property vec "uname" nil))
+       (new-uname
+        (tramp-set-connection-property
+         vec "uname"
+         (tramp-send-command-and-read vec "echo \\\"`uname -sr`\\\""))))
+    (when (and (stringp old-uname) (not (string-equal old-uname new-uname)))
+      (tramp-message
+       vec 3
+       "Connection reset, because remote host changed from `%s' to `%s'"
+       old-uname new-uname)
+      ;; We want to keep the password.
+      (tramp-cleanup-connection vec t t)
+      (throw 'uname-changed (tramp-maybe-open-connection vec))))
+
   ;; Try to set up the coding system correctly.
   ;; CCC this can't be the right way to do it.  Hm.
   (tramp-message vec 5 "Determining coding system")
@@ -4182,7 +4208,7 @@ process to set up.  VEC specifies the connection."
        ;; Use MULE to select the right EOL convention for communicating
        ;; with the process.
        (let ((cs (or (and (memq 'utf-8 (coding-system-list))
-                          (string-match "utf8" (tramp-get-remote-locale vec))
+                          (string-match "utf-?8" (tramp-get-remote-locale vec))
                           (cons 'utf-8 'utf-8))
                      (tramp-compat-funcall 'process-coding-system proc)
                      (cons 'undecided 'undecided)))
@@ -4192,8 +4218,12 @@ process to set up.  VEC specifies the connection."
          (setq cs-encode (cdr cs))
          (unless cs-decode (setq cs-decode 'undecided))
          (unless cs-encode (setq cs-encode 'undecided))
-         (setq cs-encode (tramp-compat-coding-system-change-eol-conversion
-                          cs-encode 'unix))
+         (setq cs-encode
+               (tramp-compat-coding-system-change-eol-conversion
+                cs-encode
+                (if (string-match
+                     "^Darwin" (tramp-get-connection-property vec "uname" ""))
+                    'mac 'unix)))
          (tramp-send-command vec "echo foo ; echo bar" t)
          (goto-char (point-min))
          (when (search-forward "\r" nil t)
@@ -4212,25 +4242,6 @@ process to set up.  VEC specifies the connection."
 
   (tramp-send-command vec "set +o vi +o emacs" t)
 
-  ;; Check whether the output of "uname -sr" has been changed.  If
-  ;; yes, this is a strong indication that we must expire all
-  ;; connection properties.  We start again with
-  ;; `tramp-maybe-open-connection', it will be caught there.
-  (tramp-message vec 5 "Checking system information")
-  (let ((old-uname (tramp-get-connection-property vec "uname" nil))
-       (new-uname
-        (tramp-set-connection-property
-         vec "uname"
-         (tramp-send-command-and-read vec "echo \\\"`uname -sr`\\\""))))
-    (when (and (stringp old-uname) (not (string-equal old-uname new-uname)))
-      (tramp-message
-       vec 3
-       "Connection reset, because remote host changed from `%s' to `%s'"
-       old-uname new-uname)
-      ;; We want to keep the password.
-      (tramp-cleanup-connection vec t t)
-      (throw 'uname-changed (tramp-maybe-open-connection vec))))
-
   ;; Check whether the remote host suffers from buggy
   ;; `send-process-string'.  This is known for FreeBSD (see comment in
   ;; `send_process', file process.c).  I've tested sending 624 bytes
@@ -4264,7 +4275,7 @@ process to set up.  VEC specifies the connection."
   (tramp-find-shell vec)
 
   ;; Disable unexpected output.
-  (tramp-send-command vec "mesg n; biff n" t)
+  (tramp-send-command vec "mesg n 2>/dev/null; biff n 2>/dev/null" t)
 
   ;; IRIX64 bash expands "!" even when in single quotes.  This
   ;; destroys our shell functions, we must disable it.  See
@@ -4277,6 +4288,10 @@ process to set up.  VEC specifies the connection."
                      (tramp-get-connection-property vec "uname" ""))
     (tramp-send-command vec "stty -oxtabs" t))
 
+  ;; Set utf8 encoding.  Needed for Mac OS X, for example.  This is
+  ;; non-POSIX, so we must expect errors on some systems.
+  (tramp-send-command vec "stty iutf8 2>/dev/null" t)
+
   ;; Set `remote-tty' process property.
   (let ((tty (tramp-send-command-and-read vec "echo \\\"`tty`\\\"" 'noerror)))
     (unless (zerop (length tty))
@@ -5295,21 +5310,26 @@ Return ATTR."
            ;; The login shell could return more than just the $PATH
            ;; string.  So we use `tramp-end-of-heredoc' as marker.
            (when elt2
-             (tramp-send-command-and-read
-              vec
-              (format
-               "%s %s %s 'echo %s \\\"$PATH\\\"'"
-               (tramp-get-method-parameter vec 'tramp-remote-shell)
-               (mapconcat
-                'identity
-                (tramp-get-method-parameter vec 'tramp-remote-shell-login)
-                " ")
-               (mapconcat
-                'identity
-                (tramp-get-method-parameter vec 'tramp-remote-shell-args)
-                " ")
-               (tramp-shell-quote-argument tramp-end-of-heredoc))
-              nil (regexp-quote tramp-end-of-heredoc)))))
+             (or
+              (tramp-send-command-and-read
+               vec
+               (format
+                "%s %s %s 'echo %s \\\"$PATH\\\"'"
+                (tramp-get-method-parameter vec 'tramp-remote-shell)
+                (mapconcat
+                 'identity
+                 (tramp-get-method-parameter vec 'tramp-remote-shell-login)
+                 " ")
+                (mapconcat
+                 'identity
+                 (tramp-get-method-parameter vec 'tramp-remote-shell-args)
+                 " ")
+                (tramp-shell-quote-argument tramp-end-of-heredoc))
+               'noerror (regexp-quote tramp-end-of-heredoc))
+              (progn
+                (tramp-message
+                 vec 2 "Could not retrieve `tramp-own-remote-path'")
+                nil)))))
 
       ;; Replace place holder `tramp-default-remote-path'.
       (when elt1
@@ -5353,7 +5373,7 @@ Return ATTR."
 (defun tramp-get-remote-locale (vec)
   (with-tramp-connection-property vec "locale"
     (tramp-send-command vec "locale -a")
-    (let ((candidates '("en_US.utf8" "C.utf8"))
+    (let ((candidates '("en_US.utf8" "C.utf8" "en_US.UTF-8"))
          locale)
       (with-current-buffer (tramp-get-connection-buffer vec)
        (while candidates
@@ -5405,13 +5425,20 @@ Return ATTR."
   (save-match-data
     (with-tramp-connection-property vec "ls-quoting-style"
       (tramp-message vec 5 "Checking, whether `ls --quoting-style=shell' 
works")
-      ;; Some "ls" versions are sensible wrt the order of arguments,
-      ;; they fail when "-al" is after the "--dired" argument (for
-      ;; example on FreeBSD).
       (tramp-send-command-and-check
        vec (format "%s --quoting-style=shell -al /dev/null"
                   (tramp-get-ls-command vec))))))
 
+(defun tramp-get-ls-command-with-w-option (vec)
+  (save-match-data
+    (with-tramp-connection-property vec "ls-w-option"
+      (tramp-message vec 5 "Checking, whether `ls -w' works")
+      ;; Option "-w" is available on BSD systems.  No argument is
+      ;; given, because this could return wrong results in case "ls"
+      ;; supports the "-w NUM" argument, as for busyboxes.
+      (tramp-send-command-and-check
+       vec (format "%s -alw" (tramp-get-ls-command vec))))))
+
 (defun tramp-get-test-command (vec)
   (with-tramp-connection-property vec "test"
     (tramp-message vec 5 "Finding a suitable `test' command")
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 42a9e3d..b7f5309 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -694,8 +694,8 @@ Useful for \"rsync\" like methods.")
 
 It can have the following values:
 
-  'ftp -- Ange-FTP respective EFS like syntax (GNU Emacs default)
-  'sep -- Syntax as defined for XEmacs."
+  `ftp' -- Ange-FTP respective EFS like syntax (GNU Emacs default)
+  `sep' -- Syntax as defined for XEmacs."
   :group 'tramp
   :version "24.4"
   :type `(choice (const :tag  ,(if (featurep 'xemacs) "EFS" "Ange-FTP") ftp)
@@ -1291,8 +1291,8 @@ This is HOST, if non-nil. Otherwise, it is 
`tramp-default-host'."
 
 (defun tramp-dissect-file-name (name &optional nodefault)
   "Return a `tramp-file-name' structure.
-The structure consists of remote method, remote user, remote host
-and localname (file name on remote host).  If NODEFAULT is
+The structure consists of remote method, remote user, remote host,
+localname (file name on remote host) and hop.  If NODEFAULT is
 non-nil, the file name parts are not expanded to their default
 values."
   (save-match-data
diff --git a/lisp/net/trampver.el b/lisp/net/trampver.el
index 5c42f3a..f93cfc4 100644
--- a/lisp/net/trampver.el
+++ b/lisp/net/trampver.el
@@ -6,6 +6,7 @@
 ;; Author: Kai Großjohann <address@hidden>
 ;; Keywords: comm, processes
 ;; Package: tramp
+;; Version: 2.2.13.25.1
 
 ;; This file is part of GNU Emacs.
 
@@ -31,7 +32,7 @@
 ;; should be changed only there.
 
 ;;;###tramp-autoload
-(defconst tramp-version "2.2.13-pre"
+(defconst tramp-version "2.2.13.25.1"
   "This version of Tramp.")
 
 ;;;###tramp-autoload
@@ -62,7 +63,7 @@
                      (= emacs-major-version 21)
                      (>= emacs-minor-version 4)))
             "ok"
-          (format "Tramp 2.2.13-pre is not fit for %s"
+          (format "Tramp 2.2.13.25.1 is not fit for %s"
                   (when (string-match "^.*$" (emacs-version))
                     (match-string 0 (emacs-version)))))))
   (unless (string-match "\\`ok\\'" x) (error "%s" x)))
diff --git a/lisp/obsolete/complete.el b/lisp/obsolete/complete.el
index 87dedac..e67ae5e 100644
--- a/lisp/obsolete/complete.el
+++ b/lisp/obsolete/complete.el
@@ -1074,7 +1074,7 @@ absolute rather than relative to some directory on the 
SEARCH-PATH."
          (setq search-path
                (mapcar (lambda (dir) (concat dir subdir))
                        search-path)
-               file ))
+               file nil))
       ;; Make list of completions in each directory on search-path
       (while search-path
        (let* ((dir (car search-path))
diff --git a/lisp/net/eudcb-ph.el b/lisp/obsolete/eudcb-ph.el
similarity index 99%
rename from lisp/net/eudcb-ph.el
rename to lisp/obsolete/eudcb-ph.el
index f144bf6..c847c2a 100644
--- a/lisp/net/eudcb-ph.el
+++ b/lisp/obsolete/eudcb-ph.el
@@ -7,6 +7,7 @@
 ;; Maintainer: Thomas Fitzsimmons <address@hidden>
 ;; Keywords: comm
 ;; Package: eudc
+;; Obsolete-since: 25.1
 
 ;; This file is part of GNU Emacs.
 
diff --git a/lisp/org/ob-core.el b/lisp/org/ob-core.el
index 11cd253..271a015 100644
--- a/lisp/org/ob-core.el
+++ b/lisp/org/ob-core.el
@@ -1402,7 +1402,7 @@ specified in the properties of the current outline entry."
 ALTS is a cons of two character options where each option may be
 either the numeric code of a single character or a list of
 character alternatives.  For example to split on balanced
-instances of \"[ \t]:\" set ALTS to '((32 9) . 58)."
+instances of \"[ \t]:\" set ALTS to ((32 9) . 58)."
   (let* ((matches (lambda (ch spec) (if (listp spec) (member ch spec) (equal 
spec ch))))
         (matched (lambda (ch last)
                    (if (consp alts)
@@ -1511,7 +1511,7 @@ shown below.
 
 ;; row and column names
 (defun org-babel-del-hlines (table)
-  "Remove all 'hlines from TABLE."
+  "Remove all `hline's from TABLE."
   (remove 'hline table))
 
 (defun org-babel-get-colnames (table)
diff --git a/lisp/org/ob-exp.el b/lisp/org/ob-exp.el
index 92006f8..58bd1ec 100644
--- a/lisp/org/ob-exp.el
+++ b/lisp/org/ob-exp.el
@@ -53,7 +53,7 @@
 (defcustom org-export-babel-evaluate t
   "Switch controlling code evaluation during export.
 When set to nil no code will be evaluated as part of the export
-process.  When set to 'inline-only, only inline code blocks will
+process.  When set to `inline-only', only inline code blocks will
 be executed."
   :group 'org-babel
   :version "24.1"
diff --git a/lisp/org/ob-table.el b/lisp/org/ob-table.el
index 1f381db..47a538c 100644
--- a/lisp/org/ob-table.el
+++ b/lisp/org/ob-table.el
@@ -67,7 +67,7 @@ element list, whose first element is the name of the variable 
and
 second element is a string of its value.  The following call to
 `org-sbe' would be equivalent to the following source code block.
 
- (org-sbe 'source-block (n $2) (m 3))
+ (org-sbe \\='source-block (n $2) (m 3))
 
 #+begin_src emacs-lisp :var results=source-block(n=val_at_col_2, m=3) :results 
silent
 results
@@ -84,7 +84,7 @@ the header argument which can then be passed before all 
variables
 as shown in the example below.
 
 | 1 | 2 | :file nothing.png | nothing.png |
-#+TBLFM: @1$4='(org-sbe test-sbe $3 (x $1) (y $2))"
+#+TBLFM: @1$4=\\='(org-sbe test-sbe $3 (x $1) (y $2))"
   (declare (debug (form form)))
   (let* ((header-args (if (stringp (car variables)) (car variables) ""))
         (variables (if (stringp (car variables)) (cdr variables) variables)))
diff --git a/lisp/org/org-agenda.el b/lisp/org/org-agenda.el
index 0b3be56..4e42004 100644
--- a/lisp/org/org-agenda.el
+++ b/lisp/org/org-agenda.el
@@ -7085,8 +7085,8 @@ their type."
 ;;;###autoload
 (defun org-agenda-set-restriction-lock (&optional type)
   "Set restriction lock for agenda, to current subtree or file.
-Restriction will be the file if TYPE is `file', or if type is the
-universal prefix '(4), or if the cursor is before the first headline
+Restriction will be the file if TYPE is `file', or if TYPE is the
+universal prefix `(4)', or if the cursor is before the first headline
 in the file.  Otherwise, restriction will be to the current subtree."
   (interactive "P")
   (and (equal type '(4)) (setq type 'file))
diff --git a/lisp/org/org-faces.el b/lisp/org/org-faces.el
index 46936f4..1b46b80 100644
--- a/lisp/org/org-faces.el
+++ b/lisp/org/org-faces.el
@@ -666,7 +666,7 @@ belong to the weekend."
     (0.0 . default))
   "Faces for showing deadlines in the agenda.
 This is a list of cons cells.  The cdr of each cell is a face to be used,
-and it can also just be like '(:foreground \"yellow\").
+and it can also just be like (:foreground \"yellow\").
 Each car is a fraction of the head-warning time that must have passed for
 this the face in the cdr to be used for display.  The numbers must be
 given in descending order.  The head-warning time is normally taken
diff --git a/lisp/org/org-list.el b/lisp/org/org-list.el
index c826650..12d4db3 100644
--- a/lisp/org/org-list.el
+++ b/lisp/org/org-list.el
@@ -174,7 +174,7 @@ to the bullet that should be used when this item is demoted.
 For example,
 
  (setq org-list-demote-modify-bullet
-       '((\"+\" . \"-\") (\"-\" . \"+\") (\"*\" . \"+\")))
+       \\='((\"+\" . \"-\") (\"-\" . \"+\") (\"*\" . \"+\")))
 
 will make
 
diff --git a/lisp/org/org-macs.el b/lisp/org/org-macs.el
index ea8e7b5..0b10f55 100644
--- a/lisp/org/org-macs.el
+++ b/lisp/org/org-macs.el
@@ -137,7 +137,7 @@ Otherwise return nil."
 
 ;; FIXME: Slated for removal.  Current Org mode does not support Emacs < 22
 (defmacro org-maybe-intangible (props)
-  "Add '(intangible t) to PROPS if Emacs version is earlier than Emacs 22.
+  "Add (intangible t) to PROPS if Emacs version is earlier than Emacs 22.
 In Emacs 21, invisible text is not avoided by the command loop, so the
 intangible property is needed to make sure point skips this text.
 In Emacs 22, this is not necessary.  The intangible text property has
diff --git a/lisp/org/org.el b/lisp/org/org.el
index 7a6d6cc..957a7d0 100644
--- a/lisp/org/org.el
+++ b/lisp/org/org.el
@@ -7094,7 +7094,7 @@ open and agenda-wise Org files."
          (org-flag-drawer t))))))
 
 (defun org-cycle-hide-inline-tasks (state)
-  "Re-hide inline tasks when switching to 'contents or 'children
+  "Re-hide inline tasks when switching to `contents' or `children'
 visibility state."
   (case state
     (contents
@@ -7323,8 +7323,8 @@ returns to the original buffer in which the visibility is 
still
 unchanged.  After RET it will also jump to the location selected
 in the indirect buffer and expose the headline hierarchy above.
 
-With a prefix argument, use the alternative interface: e.g. if
-`org-goto-interface' is 'outline use 'outline-path-completion."
+With a prefix argument, use the alternative interface: e.g., if
+`org-goto-interface' is `outline' use `outline-path-completion'."
   (interactive "P")
   (org-goto-map)
   (let* ((org-refile-targets `((nil . (:maxlevel . ,org-goto-max-level))))
diff --git a/lisp/paren.el b/lisp/paren.el
index 30314c2..5825d6a 100644
--- a/lisp/paren.el
+++ b/lisp/paren.el
@@ -87,7 +87,10 @@ whitespace there."
   'show-paren-mismatch "22.1")
 
 (defcustom show-paren-highlight-openparen t
-  "Non-nil turns on openparen highlighting when matching forward."
+  "Non-nil turns on openparen highlighting when matching forward.
+When nil, and point stands just before an open paren, the paren
+is not highlighted, the cursor being regarded as adequate to mark
+its position."
   :type 'boolean)
 
 (defvar show-paren--idle-timer nil)
diff --git a/lisp/play/dunnet.el b/lisp/play/dunnet.el
index ba137f5..8aba50b 100644
--- a/lisp/play/dunnet.el
+++ b/lisp/play/dunnet.el
@@ -1321,29 +1321,8 @@ for a moment, then straighten yourself up.
          (setq new-inven (append new-inven (list x)))))
     (setq dun-inventory new-inven)))
 
-
-(let ((i 0) (lower "abcdefghijklmnopqrstuvwxyz") upper)
-  (setq dun-translate-table (make-vector 256 0))
-  (while (< i 256)
-    (aset dun-translate-table i i)
-    (setq i (1+ i)))
-  (setq lower (concat lower lower))
-  (setq upper (upcase lower))
-  (setq i 0)
-  (while (< i 26)
-    (aset dun-translate-table (+ ?a i) (aref lower (+ i 13)))
-    (aset dun-translate-table (+ ?A i) (aref upper (+ i 13)))
-      (setq i (1+ i))))
-
 (defun dun-rot13 ()
-  (let (str len (i 0))
-    (setq str (buffer-substring (point-min) (point-max)))
-    (setq len (length str))
-    (while (< i len)
-      (aset str i (aref dun-translate-table (aref str i)))
-      (setq i (1+ i)))
-    (erase-buffer)
-    (insert str)))
+  (rot13-region (point-min) (point-max)))
 
 ;;;;
 ;;;; This section defines the globals that are used in dunnet.
diff --git a/lisp/printing.el b/lisp/printing.el
index ae0f3fd..b02b10a 100644
--- a/lisp/printing.el
+++ b/lisp/printing.el
@@ -2929,7 +2929,7 @@ INHERITS  Specify the inheritance for SYMBOL group.  It's 
a symbol name
                Let's see an example to illustrate the inheritance mechanism:
 
                (setq pr-setting-database
-                     '((no-duplex      ; setting symbol name
+                     \\='((no-duplex   ; setting symbol name
                         nil            ; inherits
                         nil nil        ; local  kill-local
                         (pr-file-duplex . nil) ; settings
@@ -2979,9 +2979,9 @@ SETTING           It's a cons like:
                This setting is ignored if VARIABLE is equal to keyword
                `inherits-from:'.
                Examples:
-                       '(ps-landscape-mode . nil)
-                       '(ps-spool-duplex . t)
-                       '(pr-gs-device . (my-gs-device t))"
+                       (ps-landscape-mode . nil)
+                       (ps-spool-duplex . t)
+                       (pr-gs-device . (my-gs-device t))"
   :type '(repeat
          (list
           :tag ""
diff --git a/lisp/proced.el b/lisp/proced.el
index 502a90e..5bd53e4 100644
--- a/lisp/proced.el
+++ b/lisp/proced.el
@@ -159,15 +159,15 @@ argument, the value of the attribute.  The value nil 
means take as is.
 
 If JUSTIFY is an integer, its modulus gives the width of the attribute
 values formatted with FORMAT.  If JUSTIFY is positive, NAME appears
-right-justified, otherwise it appears left-justified.  If JUSTIFY is 'left
-or 'right, the field width is calculated from all field values in the listing.
-If JUSTIFY is 'left, the field values are formatted left-justified and
+right-justified, otherwise it appears left-justified.  If JUSTIFY is `left'
+or `right', the field width is calculated from all field values in the listing.
+If JUSTIFY is `left', the field values are formatted left-justified and
 right-justified otherwise.
 
 PREDICATE is the predicate for sorting and filtering the process listing
 based on attribute KEY.  PREDICATE takes two arguments P1 and P2,
 the corresponding attribute values of two processes.  PREDICATE should
-return 'equal if P1 has same rank like P2.  Any other non-nil value says
+return `equal' if P1 has same rank like P2.  Any other non-nil value says
 that P1 is \"less than\" P2, or nil if not.
 If PREDICATE is nil the attribute cannot be sorted.
 
@@ -178,7 +178,7 @@ SORT-SCHEME is a list (KEY1 KEY2 ...) defining a hierarchy 
of rules
 for sorting the process listing.  KEY1, KEY2, ... are KEYs appearing as cars
 of `proced-grammar-alist'.  First the PREDICATE of KEY1 is evaluated.
 If it yields non-equal, it defines the sort order for the corresponding
-processes.  If it evaluates to 'equal the PREDICATE of KEY2 is evaluated, etc.
+processes.  If it evaluates to `equal' the PREDICATE of KEY2 is evaluated, etc.
 
 REFINER can be a list of flags (LESS-B EQUAL-B LARGER-B) used by the command
 `proced-refine' (see there) to refine the listing based on attribute KEY.
@@ -186,7 +186,7 @@ This command compares the value of attribute KEY of every 
process with
 the value of attribute KEY of the process at the position of point
 using PREDICATE.
 If PREDICATE yields non-nil, the process is accepted if LESS-B is non-nil.
-If PREDICATE yields 'equal, the process is accepted if EQUAL-B is non-nil.
+If PREDICATE yields `equal', the process is accepted if EQUAL-B is non-nil.
 If PREDICATE yields nil, the process is accepted if LARGER-B is non-nil.
 
 REFINER can also be a list (FUNCTION HELP-ECHO).
@@ -1251,9 +1251,9 @@ When called interactively, an empty string means nil, 
i.e., no sorting.
 
 Prefix ARG controls sort order:
 - If prefix ARG is positive (negative), sort in ascending (descending) order.
-- If ARG is nil or 'no-arg and SCHEME is equal to the previous sorting scheme,
+- If ARG is nil or `no-arg' and SCHEME is equal to the previous sorting scheme,
   reverse the sorting order.
-- If ARG is nil or 'no-arg and SCHEME differs from the previous sorting scheme,
+- If ARG is nil or `no-arg' and SCHEME differs from the previous sorting 
scheme,
   adopt the sorting order defined for SCHEME in `proced-grammar-alist'.
 
 Set variable `proced-sort' to SCHEME.  The current sort scheme is displayed
diff --git a/lisp/progmodes/bug-reference.el b/lisp/progmodes/bug-reference.el
index a78c57c..921a904 100644
--- a/lisp/progmodes/bug-reference.el
+++ b/lisp/progmodes/bug-reference.el
@@ -69,7 +69,7 @@ so that it is considered safe, see `enable-local-variables'.")
                 (get s 'bug-reference-url-format)))))
 
 (defcustom bug-reference-bug-regexp
-  "\\([Bb]ug ?#\\|[Pp]atch ?#\\|RFE ?#\\|PR 
[a-z-+]+/\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)"
+  "\\([Bb]ug ?#?\\|[Pp]atch ?#\\|RFE ?#\\|PR 
[a-z-+]+/\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)"
   "Regular expression matching bug references.
 The second subexpression should match the bug reference (usually a number)."
   :type 'string
diff --git a/lisp/progmodes/cc-awk.el b/lisp/progmodes/cc-awk.el
index 077a18c..19a95aa 100644
--- a/lisp/progmodes/cc-awk.el
+++ b/lisp/progmodes/cc-awk.el
@@ -72,7 +72,7 @@
     (modify-syntax-entry ?\# "<   " st)
     ;; / can delimit regexes or be a division operator.  By default we assume
     ;; that it is a division sign, and fix the regexp operator cases with
-    ;; `font-lock-syntactic-keywords'.
+    ;; `c-awk-set-syntax-table-properties'.
     (modify-syntax-entry ?/ "." st)     ; ACM 2002/4/27.
     (modify-syntax-entry ?* "." st)
     (modify-syntax-entry ?+ "." st)
@@ -785,13 +785,16 @@
 ;;     Scan the buffer text between point and LIM, setting (and clearing) the
 ;; syntax-table property where necessary.
 ;;
-;; This function is designed to be called as the FUNCTION in a MATCHER in
-;; font-lock-syntactic-keywords, and it always returns NIL (to inhibit
-;; repeated calls from font-lock: See elisp info page "Search-based
-;; Fontification").  It also gets called, with a bit of glue, from
-;; after-change-functions when font-lock isn't active.  Point is left
-;; "undefined" after this function exits.  THE BUFFER SHOULD HAVE BEEN
-;; WIDENED, AND ANY PRECIOUS MATCH-DATA SAVED BEFORE CALLING THIS ROUTINE.
+;; This function is designed to be called as the FUNCTION in a MATCHER
+;; in font-lock-syntactic-keywords, and it always returns NIL (to
+;; inhibit repeated calls from font-lock: See elisp info page
+;; "Search-based Fontification").  (2015-11-24: CC Mode doesn't use
+;; `font-lock-syntactic-keywords' and hasn't done for a very long
+;; time, if ever.  ACM.)  This function gets called, with a bit of
+;; glue, from after-change-functions whether or not font-lock is
+;; active.  Point is left "undefined" after this function exits.  THE
+;; BUFFER SHOULD HAVE BEEN WIDENED, AND ANY PRECIOUS MATCH-DATA SAVED
+;; BEFORE CALLING THIS ROUTINE.
 ;;
 ;; We need to set/clear the syntax-table property on:
 ;; (i) / - It is set to "string" on a / which is the opening or closing
diff --git a/lisp/progmodes/cc-bytecomp.el b/lisp/progmodes/cc-bytecomp.el
index 81b7a82..d3b4db7 100644
--- a/lisp/progmodes/cc-bytecomp.el
+++ b/lisp/progmodes/cc-bytecomp.el
@@ -252,6 +252,11 @@ perhaps a `cc-bytecomp-restore-environment' is forgotten 
somewhere"))
        (cc-bytecomp-debug-msg
         "cc-bytecomp-restore-environment: Done"))))
 
+(defun cc-bytecomp-load (cc-part)
+  ;; A dummy function which will immediately be overwritten by the
+  ;; following at load time.  This should suppress the byte compiler
+  ;; error that the function is "not known to be defined".
+)
 (eval
  ;; This eval is to avoid byte compilation of the function below.
  ;; There's some bug in XEmacs 21.4.6 that can cause it to dump core
@@ -284,9 +289,6 @@ perhaps a `cc-bytecomp-restore-environment' is forgotten 
somewhere"))
          (cc-bytecomp-setup-environment)
          t))))
 
-(defvar cc-bytecomp-noruntime-functions nil
-  "Saved value of `byte-compile-noruntime-functions'.")
-
 (defmacro cc-require (cc-part)
   "Force loading of the corresponding .el file in the current directory
 during compilation, but compile in a `require'.  Don't use within
@@ -296,19 +298,37 @@ Having cyclic cc-require's will result in infinite 
recursion.  That's
 somewhat intentional."
   `(progn
      (eval-when-compile
-       (if (boundp 'byte-compile-noruntime-functions) ; in case load uncompiled
-          (setq cc-bytecomp-noruntime-functions
-                byte-compile-noruntime-functions))
        (cc-bytecomp-load (symbol-name ,cc-part)))
-     ;; Hack to suppress spurious "might not be defined at runtime" warnings.
-     ;; The basic issue is that
-     ;;   (eval-when-compile (require 'foo))
-     ;;   (require 'foo)
-     ;; produces bogus noruntime warnings about functions from foo.
-     (eval-when-compile
-       (setq byte-compile-noruntime-functions cc-bytecomp-noruntime-functions))
      (require ,cc-part)))
 
+(defmacro cc-conditional-require (cc-part condition)
+  "If the CONDITION is satisfied at compile time, (i) force the
+file CC-PART.el in the current directory to be loaded at compile
+time, (ii) generate code to load the file at load time.
+
+CC-PART will normally be a quoted name such as 'cc-fix.
+CONDITION should not be quoted."
+  (if (eval condition)
+      (progn
+       (cc-bytecomp-load (symbol-name (eval cc-part)))
+       `(require ,cc-part))
+    '(progn)))
+
+(defmacro cc-conditional-require-after-load (cc-part file condition)
+  "If the CONDITION is satisfied at compile time, (i) force the
+file CC-PART.el in the current directory to be loaded at compile
+time, (ii) generate an `eval-after-load' form to load CC-PART.el
+after the loading of FILE.
+
+CC-PART will normally be a quoted name such as 'cc-fix.  FILE
+should be a string.  CONDITION should not be quoted."
+  (if (eval condition)
+      (progn
+       (cc-bytecomp-load (symbol-name (eval cc-part)))
+       `(eval-after-load ,file
+          '(require ,cc-part)))
+    '(progn)))
+
 (defmacro cc-provide (feature)
   "A replacement for the `provide' form that restores the environment
 after the compilation.  Don't use within `eval-when-compile'."
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el
index 1b6108e..8eed4b1 100644
--- a/lisp/progmodes/cc-defs.el
+++ b/lisp/progmodes/cc-defs.el
@@ -75,37 +75,22 @@
 
 ;; cc-fix.el contains compatibility macros that should be used if
 ;; needed.
-(eval-and-compile
-  (if (or (/= (regexp-opt-depth "\\(\\(\\)\\)") 2)
-         (not (fboundp 'push)))
-      (cc-load "cc-fix")))
-
-(when (featurep 'xemacs) ; There is now (2005/12) code in GNU Emacs CVS
-                        ; to make the call to f-l-c-k throw an error.
-  (eval-after-load "font-lock"
-    '(if (and (not (featurep 'cc-fix)) ; only load the file once.
-             (let (font-lock-keywords)
-               (font-lock-compile-keywords '("\\<\\>"))
-               font-lock-keywords)) ; did the previous call foul this up?
-         (load "cc-fix"))))
-
-;; The above takes care of the delayed loading, but this is necessary
-;; to ensure correct byte compilation.
-(eval-when-compile
-  (if (and (featurep 'xemacs)
-          (not (featurep 'cc-fix))
-          (progn
-            (require 'font-lock)
-            (let (font-lock-keywords)
-              (font-lock-compile-keywords '("\\<\\>"))
-              font-lock-keywords)))
-      (cc-load "cc-fix")))
-
-;; XEmacs 21.4 doesn't have `delete-dups'.
-(eval-and-compile
-  (if (and (not (fboundp 'delete-dups))
-          (not (featurep 'cc-fix)))
-      (cc-load "cc-fix")))
+(cc-conditional-require
+ 'cc-fix (or (/= (regexp-opt-depth "\\(\\(\\)\\)") 2)
+            (not (fboundp 'push))
+            ;; XEmacs 21.4 doesn't have `delete-dups'.
+            (not (fboundp 'delete-dups))))
+
+(cc-conditional-require-after-load
+ 'cc-fix "font-lock"
+ (and
+  (featurep 'xemacs)
+  (progn
+    (require 'font-lock)
+    (let (font-lock-keywords)
+      (font-lock-compile-keywords '("\\<\\>"))
+      font-lock-keywords))))
+
 
 ;;; Variables also used at compile time.
 
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 6572cee..dbc55f5 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -5964,7 +5964,7 @@ comment at the start of cc-engine.el for more info."
   ;; Recursive part of `c-forward-<>-arglist'.
   ;;
   ;; This function might do hidden buffer changes.
-  (let ((start (point)) res pos tmp
+  (let ((start (point)) res pos
        ;; Cover this so that any recorded found type ranges are
        ;; automatically lost if it turns out to not be an angle
        ;; bracket arglist.  It's propagated through the return value
@@ -6059,15 +6059,13 @@ comment at the start of cc-engine.el for more info."
                  ;; Either an operator starting with '<' or a nested arglist.
                  (setq pos (point))
                  (let (id-start id-end subres keyword-match)
-                  (cond
+                   (cond
                     ;; The '<' begins a multi-char operator.
                     ((looking-at c-<-op-cont-regexp)
-                     (setq tmp (match-end 0))
                      (goto-char (match-end 0)))
                     ;; We're at a nested <.....>
                     ((progn
-                       (setq tmp pos)
-                       (backward-char) ; to the '<'
+                       (backward-char) ; to the '<'
                        (and
                         (save-excursion
                           ;; There's always an identifier before an angle
@@ -6087,7 +6085,9 @@ comment at the start of cc-engine.el for more info."
                                  (and keyword-match
                                       (c-keyword-member
                                        (c-keyword-sym (match-string 1))
-                                       'c-<>-type-kwds)))))))
+                                       'c-<>-type-kwds))))))
+                       (or subres (goto-char pos))
+                       subres)
                      ;; It was an angle bracket arglist.
                      (setq c-record-found-types subres)
 
@@ -6103,11 +6103,11 @@ comment at the start of cc-engine.el for more info."
                            (c-record-ref-id (cons id-start id-end))
                         (c-record-type-id (cons id-start id-end)))))
 
-                   ;; At a "less than" operator.
-                   (t
-                    (forward-char)
-                    )))
-                t)                    ; carry on looping.
+                    ;; At a "less than" operator.
+                    (t
+                     ;; (forward-char) ; NO!  We've already gone over the <.
+                     )))
+                 t)                    ; carry on looping.
 
                 ((and (not c-restricted-<>-arglists)
                       (or (and (eq (char-before) ?&)
@@ -6666,49 +6666,65 @@ comment at the start of cc-engine.el for more info."
     (or res (goto-char here))
     res))
 
+(defmacro c-back-over-list-of-member-inits ()
+  ;; Go back over a list of elements, each looking like:
+  ;; <symbol> (<expression>) ,
+  ;; or <symbol> {<expression>} ,
+  ;; when we are putatively immediately after a comma.  Stop when we don't see
+  ;; a comma.  If either of <symbol> or bracketed <expression> is missing,
+  ;; throw nil to 'level.  If the terminating } or ) is unmatched, throw nil
+  ;; to 'done.  This is not a general purpose macro!
+  `(while (eq (char-before) ?,)
+     (backward-char)
+     (c-backward-syntactic-ws)
+     (when (not (memq (char-before) '(?\) ?})))
+       (throw 'level nil))
+     (when (not (c-go-list-backward))
+       (throw 'done nil))
+     (c-backward-syntactic-ws)
+     (when (not (c-simple-skip-symbol-backward))
+       (throw 'level nil))
+     (c-backward-syntactic-ws)))
+
 (defun c-back-over-member-initializers ()
   ;; Test whether we are in a C++ member initializer list, and if so, go back
   ;; to the introducing ":", returning the position of the opening paren of
   ;; the function's arglist.  Otherwise return nil, leaving point unchanged.
   (let ((here (point))
        (paren-state (c-parse-state))
-       res)
-
+       pos level-plausible at-top-level res)
+    ;; Assume tentatively that we're at the top level.  Try to go back to the
+    ;; colon we seek.
     (setq res
          (catch 'done
-           (if (not (c-at-toplevel-p))
-               (progn
-                 (while (not (c-at-toplevel-p))
-                   (goto-char (c-pull-open-brace paren-state)))
-                 (c-backward-syntactic-ws)
-                 (when (not (c-simple-skip-symbol-backward))
-                   (throw 'done nil))
-                 (c-backward-syntactic-ws))
-             (c-backward-syntactic-ws)
-             (when (memq (char-before) '(?\) ?}))
-               (when (not (c-go-list-backward))
-                 (throw 'done nil))
-               (c-backward-syntactic-ws))
-             (when (c-simple-skip-symbol-backward)
-               (c-backward-syntactic-ws)))
-
-           (while (eq (char-before) ?,)
-             (backward-char)
-             (c-backward-syntactic-ws)
-
-             (when (not (memq (char-before) '(?\) ?})))
-               (throw 'done nil))
-             (when (not (c-go-list-backward))
-               (throw 'done nil))
-             (c-backward-syntactic-ws)
-             (when (not (c-simple-skip-symbol-backward))
-               (throw 'done nil))
-             (c-backward-syntactic-ws))
-
-           (and
-            (eq (char-before) ?:)
-            (c-just-after-func-arglist-p))))
+           (setq level-plausible
+                 (catch 'level
+                   (c-backward-syntactic-ws)
+                   (when (memq (char-before) '(?\) ?}))
+                     (when (not (c-go-list-backward))
+                       (throw 'done nil))
+                     (c-backward-syntactic-ws))
+                   (when (c-simple-skip-symbol-backward)
+                     (c-backward-syntactic-ws))
+                   (c-back-over-list-of-member-inits)
+                   (and (eq (char-before) ?:)
+                        (c-just-after-func-arglist-p))))
+
+           (while (and (not (and level-plausible
+                                 (setq at-top-level (c-at-toplevel-p))))
+                       (setq pos (c-pull-open-brace paren-state))) ; might be 
a paren.
+             (setq level-plausible
+                   (catch 'level
+                     (goto-char pos)
+                     (c-backward-syntactic-ws)
+                     (when (not (c-simple-skip-symbol-backward))
+                       (throw 'level nil))
+                     (c-backward-syntactic-ws)
+                     (c-back-over-list-of-member-inits)
+                     (and (eq (char-before) ?:)
+                          (c-just-after-func-arglist-p)))))
 
+           (and at-top-level level-plausible)))
     (or res (goto-char here))
     res))
 
@@ -8048,6 +8064,8 @@ brace.
 
 Note that this function might do hidden buffer changes.  See the
 comment at the start of cc-engine.el for more info."
+  ;; Note to maintainers: this function consumes a great mass of CPU cycles.
+  ;; Its use should thus be minimized as far as possible.
   (let ((paren-state (c-parse-state)))
     (or (not (c-most-enclosing-brace paren-state))
        (c-search-uplist-for-classkey paren-state))))
@@ -10052,7 +10070,8 @@ comment at the start of cc-engine.el for more info."
         ;; Note there is no limit on the backward search here, since member
         ;; init lists can, in practice, be very large.
         ((save-excursion
-           (when (setq placeholder (c-back-over-member-initializers))
+           (when (and (c-major-mode-is 'c++-mode)
+                      (setq placeholder (c-back-over-member-initializers)))
              (setq tmp-pos (point))))
          (if (= (c-point 'bosws) (1+ tmp-pos))
                (progn
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index 7cda5ce..1a07c4c 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -403,7 +403,9 @@ The syntax tables aren't stored directly since they're 
quite large."
           table)))
 (c-lang-defvar c++-template-syntax-table
   (and (c-lang-const c++-make-template-syntax-table)
-       (funcall (c-lang-const c++-make-template-syntax-table))))
+       ;; The next eval remove a superfluous ' from '(lambda.  This
+       ;; gets rid of compilation warnings.
+       (funcall (eval (c-lang-const c++-make-template-syntax-table)))))
 
 (c-lang-defconst c-make-no-parens-syntax-table
   ;; A variant of the standard syntax table which is used to find matching
@@ -426,7 +428,8 @@ The syntax tables aren't stored directly since they're 
quite large."
          table))))
 (c-lang-defvar c-no-parens-syntax-table
   (and (c-lang-const c-make-no-parens-syntax-table)
-       (funcall (c-lang-const c-make-no-parens-syntax-table))))
+       ;; See comment in `c++template-syntax-table' about the next `eval'.
+       (funcall (eval (c-lang-const c-make-no-parens-syntax-table)))))
 
 (c-lang-defconst c-identifier-syntax-modifications
   "A list that describes the modifications that should be done to the
@@ -1430,6 +1433,14 @@ properly."
            "\\)\\s *"))
 (c-lang-setvar comment-start-skip (c-lang-const comment-start-skip))
 
+(c-lang-defconst comment-end-can-be-escaped
+  "When non-nil, escaped EOLs inside comments are valid.
+This works in Emacs >= 25.1."
+  t nil
+  (c c++ objc) t)
+(c-lang-setvar comment-end-can-be-escaped
+              (c-lang-const comment-end-can-be-escaped))
+
 (c-lang-defconst c-syntactic-ws-start
   ;; Regexp matching any sequence that can start syntactic whitespace.
   ;; The only uncertain case is '#' when there are cpp directives.
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index a46ee15..5d8af23 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -99,10 +99,9 @@
 (cc-bytecomp-defvar adaptive-fill-first-line-regexp) ; Emacs
 (cc-bytecomp-defun run-mode-hooks)     ; Emacs 21.1
 
-;; We set these variables during mode init, yet we don't require
+;; We set this variable during mode init, yet we don't require
 ;; font-lock.
 (cc-bytecomp-defvar font-lock-defaults)
-(cc-bytecomp-defvar font-lock-syntactic-keywords)
 
 ;; Menu support for both XEmacs and Emacs.  If you don't have easymenu
 ;; with your version of Emacs, you are incompatible!
@@ -479,7 +478,7 @@ preferably use the `c-mode-menu' language constant 
directly."
 and the line breaking/filling code.  Intended to be used by other
 packages that embed CC Mode.
 
-MODE is the CC Mode flavor to set up, e.g. 'c-mode or 'java-mode.
+MODE is the CC Mode flavor to set up, e.g. `c-mode' or `java-mode'.
 DEFAULT-STYLE tells which indentation style to install.  It has the
 same format as `c-default-style'.
 
@@ -647,7 +646,7 @@ In addition to the work done by `c-basic-common-init' and
 customary in CC Mode modes but which aren't strictly necessary for CC
 Mode to operate correctly.
 
-MODE is the symbol for the mode to initialize, like 'c-mode.  See
+MODE is the symbol for the mode to initialize, like `c-mode'.  See
 `c-basic-common-init' for details.  It's only optional to be
 compatible with old code; callers should always specify it."
 
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 9e2d625..f139066 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -951,7 +951,7 @@ from a different message."
 (defvar compilation--previous-directory-cache nil
   "A pair (POS . RES) caching the result of previous directory search.
 Basically, this pair says that calling
-   (previous-single-property-change POS 'compilation-directory)
+   (previous-single-property-change POS \\='compilation-directory)
 returned RES, i.e. there is no change of `compilation-directory' between
 POS and RES.")
 (make-variable-buffer-local 'compilation--previous-directory-cache)
@@ -967,7 +967,7 @@ POS and RES.")
    (t (setq compilation--previous-directory-cache nil))))
 
 (defun compilation--previous-directory (pos)
-  "Like (previous-single-property-change POS 'compilation-directory), but 
faster."
+  "Like (previous-single-property-change POS \\='compilation-directory), but 
faster."
   ;; This avoids an N² behavior when there's no/few compilation-directory
   ;; entries, in which case each call to previous-single-property-change
   ;; ends up having to walk very far back to find the last change.
@@ -2594,7 +2594,7 @@ and overlay is highlighted between MK and END-MK."
        (goto-char mk)))
     (if end-mk
         (push-mark end-mk t)
-      (if mark-active (setq mark-active)))
+      (if mark-active (setq mark-active nil)))
     ;; If hideshow got in the way of
     ;; seeing the right place, open permanently.
     (dolist (ov (overlays-at (point)))
diff --git a/lisp/progmodes/cpp.el b/lisp/progmodes/cpp.el
index 3cf17f4..faa917a 100644
--- a/lisp/progmodes/cpp.el
+++ b/lisp/progmodes/cpp.el
@@ -664,7 +664,7 @@ otherwise make them unwritable."
 
 (defun cpp-edit-write (symbol branch)
   "Set which branches of SYMBOL should be writable to BRANCH.
-BRANCH should be either nil (false branch), t (true branch) or 'both."
+BRANCH should be either nil (false branch), t (true branch) or `both'."
   (interactive (list (cpp-choose-symbol) (cpp-choose-branch)))
   (setcar (nthcdr 3 (cpp-edit-list-entry-get-or-create symbol)) branch)
   (cpp-edit-reset))
diff --git a/lisp/progmodes/cwarn.el b/lisp/progmodes/cwarn.el
index 2f501f2..eae96f0 100644
--- a/lisp/progmodes/cwarn.el
+++ b/lisp/progmodes/cwarn.el
@@ -2,9 +2,8 @@
 
 ;; Copyright (C) 1999-2015 Free Software Foundation, Inc.
 
-;; Author: Anders Lindgren <address@hidden>
+;; Author: Anders Lindgren
 ;; Keywords: c, languages, faces
-;; X-Url: http://www.andersl.com/emacs
 ;; Version: 1.3.1
 
 ;; This file is part of GNU Emacs.
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index 2c22483..4cc2aee 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -228,8 +228,7 @@ Blank lines separate paragraphs.  Semicolons start comments.
 
 \\{emacs-lisp-mode-map}"
   :group 'lisp
-  (defvar xref-backend-functions)
-  (defvar project-library-roots-function)
+  (defvar project-vc-external-roots-function)
   (lisp-mode-variables nil nil 'elisp)
   (add-hook 'after-load-functions #'elisp--font-lock-flush-elisp-buffers)
   (setq-local electric-pair-text-pairs
@@ -239,7 +238,7 @@ Blank lines separate paragraphs.  Semicolons start comments.
   (add-function :before-until (local 'eldoc-documentation-function)
                 #'elisp-eldoc-documentation-function)
   (add-hook 'xref-backend-functions #'elisp--xref-backend nil t)
-  (setq-local project-library-roots-function #'elisp-library-roots)
+  (setq-local project-vc-external-roots-function #'elisp-load-path-roots)
   (add-hook 'completion-at-point-functions
             #'elisp-completion-at-point nil 'local))
 
@@ -576,8 +575,9 @@ It can be quoted, or be inside a quoted form."
                                        " " (cadr table-etc)))
                     (cddr table-etc)))))))))
 
-(define-obsolete-function-alias
-  'lisp-completion-at-point 'elisp-completion-at-point "25.1")
+(defun lisp-completion-at-point (_predicate)
+  (declare (obsolete elisp-completion-at-point "25.1"))
+  (elisp-completion-at-point))
 
 ;;; Xref backend
 
@@ -645,6 +645,7 @@ non-nil result supercedes the xrefs produced by
       ;; alphabetical by result type symbol
 
       ;; FIXME: advised function; list of advice functions
+      ;; FIXME: aliased variable
 
       ;; Coding system symbols do not appear in ‘load-history’,
       ;; so we can’t get a location for them.
@@ -794,19 +795,7 @@ non-nil result supercedes the xrefs produced by
 
     xrefs))
 
-(declare-function project-library-roots "project")
-(declare-function project-roots "project")
-(declare-function project-current "project")
-
-(cl-defmethod xref-backend-references ((_backend (eql elisp)) symbol)
-  "Find all references to SYMBOL (a string) in the current project."
-  (cl-mapcan
-   (lambda (dir)
-     (xref-collect-references symbol dir))
-   (let ((pr (project-current t)))
-     (append
-      (project-roots pr)
-      (project-library-roots pr)))))
+(declare-function project-external-roots "project")
 
 (cl-defmethod xref-backend-apropos ((_backend (eql elisp)) regexp)
   (apply #'nconc
@@ -843,9 +832,10 @@ non-nil result supercedes the xrefs produced by
 (cl-defmethod xref-location-group ((l xref-elisp-location))
   (xref-elisp-location-file l))
 
-(defun elisp-library-roots ()
-  (defvar package-user-dir)
-  (cons package-user-dir load-path))
+(defun elisp-load-path-roots ()
+  (if (boundp 'package-user-dir)
+      (cons package-user-dir load-path)
+    load-path))
 
 ;;; Elisp Interaction mode
 
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index ae1aa11..dbb46a3 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -799,13 +799,12 @@ If no tags table is loaded, do nothing and return nil."
     (let ((completion-ignore-case (if (memq tags-case-fold-search '(t nil))
                                      tags-case-fold-search
                                    case-fold-search))
-         (pattern (funcall (or find-tag-default-function
-                               (get major-mode 'find-tag-default-function)
-                               #'find-tag-default)))
+         (pattern (find-tag--default))
          beg)
       (when pattern
        (save-excursion
-          (forward-char (1- (length pattern)))
+          ;; Avoid end-of-buffer error.
+          (goto-char (+ (point) (length pattern) -1))
           ;; The find-tag function might be overly optimistic.
           (when (search-backward pattern nil t)
             (setq beg (point))
@@ -817,9 +816,7 @@ If no tags table is loaded, do nothing and return nil."
   (let* ((completion-ignore-case (if (memq tags-case-fold-search '(t nil))
                                     tags-case-fold-search
                                   case-fold-search))
-        (default (funcall (or find-tag-default-function
-                              (get major-mode 'find-tag-default-function)
-                              'find-tag-default)))
+        (default (find-tag--default))
         (spec (completing-read (if default
                                    (format "%s (default %s): "
                                            (substring string 0 (string-match 
"[ :]+\\'" string))
@@ -831,6 +828,11 @@ If no tags table is loaded, do nothing and return nil."
        (or default (user-error "There is no default tag"))
       spec)))
 
+(defun find-tag--default ()
+  (funcall (or find-tag-default-function
+               (get major-mode 'find-tag-default-function)
+               'find-tag-default)))
+
 (defvar last-tag nil
   "Last tag found by \\[find-tag].")
 
@@ -1259,24 +1261,21 @@ buffer-local values of tags table format variables."
          (point-min) (point-max))))
     (save-excursion
       (goto-char (point-min))
-      ;; This monster regexp matches an etags tag line.
-      ;;   \1 is the string to match;
-      ;;   \2 is not interesting;
-      ;;   \3 is the guessed tag name; XXX guess should be better eg DEFUN
-      ;;   \4 is not interesting;
-      ;;   \5 is the explicitly-specified tag name.
-      ;;   \6 is the line to start searching at;
-      ;;   \7 is the char to start searching at.
+      ;; This regexp matches an explicit tag name or the place where
+      ;; it would start.
       (while (re-search-forward
-             "^\\(\\([^\177]*[^-a-zA-Z0-9_+*$:\177]+\\)?\
-\\([-a-zA-Z0-9_+*$?:]+\\)[^-a-zA-Z0-9_+*$?:\177]*\\)\177\
-\\(\\([^\n\001]+\\)\001\\)?\\([0-9]+\\)?,\\([0-9]+\\)?\n"
+              "[\f\t\n\r()=,; ]?\177\\\(?:\\([^\n\001]+\\)\001\\)?"
              nil t)
-       (push   (prog1 (if (match-beginning 5)
+       (push   (prog1 (if (match-beginning 1)
                           ;; There is an explicit tag name.
-                          (buffer-substring (match-beginning 5) (match-end 5))
-                        ;; No explicit tag name.  Best guess.
-                        (buffer-substring (match-beginning 3) (match-end 3)))
+                          (buffer-substring (match-beginning 1) (match-end 1))
+                        ;; No explicit tag name.  Backtrack a little,
+                         ;; and look for the implicit one.
+                         (goto-char (match-beginning 0))
+                         (skip-chars-backward "^\f\t\n\r()=,; ")
+                         (prog1
+                             (buffer-substring (point) (match-beginning 0))
+                           (goto-char (match-end 0))))
                  (progress-reporter-update progress-reporter (point)))
                table)))
     table))
@@ -2086,18 +2085,15 @@ for \\[find-tag] (which see)."
                                                 tag-implicit-name-match-p)
   "Tag order used in `xref-backend-definitions' to look for definitions.")
 
+;;;###autoload
+(defun etags--xref-backend () 'etags)
+
+(cl-defmethod xref-backend-identifier-at-point ((_backend (eql etags)))
+  (find-tag--default))
+
 (cl-defmethod xref-backend-identifier-completion-table ((_backend (eql etags)))
   (tags-lazy-completion-table))
 
-(cl-defmethod xref-backend-references ((_backend (eql etags)) symbol)
-  (cl-mapcan
-   (lambda (dir)
-     (xref-collect-references symbol dir))
-   (let ((pr (project-current t)))
-     (append
-      (project-roots pr)
-      (project-library-roots pr)))))
-
 (cl-defmethod xref-backend-definitions ((_backend (eql etags)) symbol)
   (etags--xref-find-definitions symbol))
 
@@ -2158,9 +2154,6 @@ for \\[find-tag] (which see)."
   (with-slots (tag-info) l
     (nth 1 tag-info)))
 
-(defun etags-library-roots ()
-  (mapcar #'file-name-directory tags-table-list))
-
 
 (provide 'etags)
 
diff --git a/lisp/progmodes/f90.el b/lisp/progmodes/f90.el
index 0e333f1..324efb0 100644
--- a/lisp/progmodes/f90.el
+++ b/lisp/progmodes/f90.el
@@ -295,7 +295,7 @@ the constant `f90-no-break-re' ensures that such tokens are 
not split."
 
 (defcustom f90-auto-keyword-case nil
   "Automatic case conversion of keywords.
-The options are 'downcase-word, 'upcase-word, 'capitalize-word and nil."
+The options are `downcase-word', `upcase-word', `capitalize-word' and nil."
   :type  '(choice (const downcase-word) (const upcase-word)
                   (const capitalize-word) (const nil))
   :safe (lambda (value) (memq value '(downcase-word
@@ -2330,7 +2330,7 @@ Any other key combination is executed normally."
 ;; Change the keywords according to argument.
 (defun f90-change-keywords (change-word &optional beg end)
   "Change the case of F90 keywords in the region (if specified) or buffer.
-CHANGE-WORD should be one of 'upcase-word, 'downcase-word, 'capitalize-word."
+CHANGE-WORD should be one of `upcase-word', `downcase-word', 
`capitalize-word'."
   (save-excursion
     (setq beg (or beg (point-min))
           end (or end (point-max)))
diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index 3adadd1..882ac06 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -989,7 +989,7 @@ For the format of LINE-ERR-INFO, see 
`flymake-ler-make-ler'."
   (funcall flymake-get-project-include-dirs-function basedir))
 
 (defun flymake-get-system-include-dirs ()
-  "System include dirs - from the 'INCLUDE' env setting."
+  "System include dirs - from the `INCLUDE' env setting."
   (let* ((includes (getenv "INCLUDE")))
     (if includes (split-string includes path-separator t) nil)))
 
diff --git a/lisp/progmodes/fortran.el b/lisp/progmodes/fortran.el
index ef47005..33fe4b3 100644
--- a/lisp/progmodes/fortran.el
+++ b/lisp/progmodes/fortran.el
@@ -1258,7 +1258,7 @@ Auto-indent does not happen if a numeric ARG is used."
 
 (defun fortran-previous-statement ()
   "Move point to beginning of the previous Fortran statement.
-Returns 'first-statement if that statement is the first
+Returns `first-statement' if that statement is the first
 non-comment Fortran statement in the file, and nil otherwise.
 Directive lines are treated as comments."
   (interactive)
@@ -1290,7 +1290,7 @@ Directive lines are treated as comments."
 
 (defun fortran-next-statement ()
   "Move point to beginning of the next Fortran statement.
-Returns 'last-statement if that statement is the last
+Returns `last-statement' if that statement is the last
 non-comment Fortran statement in the file, and nil otherwise.
 Directive lines are treated as comments."
   (interactive)
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 4bee7c1..bde030e 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -1630,7 +1630,7 @@ this trigger is subscribed to `gdb-buf-publisher' and 
called with
   (make-comint-in-buffer "gdb-inferior" (current-buffer) nil))
 
 (defcustom gdb-display-io-nopopup nil
-  "When non-nil, and the 'gdb-inferior-io buffer is buried, don't pop it up."
+  "When non-nil, and the `gdb-inferior-io' buffer is buried, don't pop it up."
   :type 'boolean
   :group 'gdb
   :version "25.1")
@@ -1766,7 +1766,8 @@ static char *magick[] = {
 (defvar gdb-control-commands-regexp
   (concat
    "^\\("
-   "commands\\|if\\|while\\|define\\|document\\|python\\|"
+   "commands\\|if\\|while\\|define\\|document\\|"
+   "python\\|python-interactive\\|pi\\|guile\\|guile-repl\\|gr\\|"
    "while-stepping\\|stepping\\|ws\\|actions"
    "\\)\\([[:blank:]]+.*\\)?$")
   "Regexp matching GDB commands that enter a recursive reading loop.
@@ -1782,21 +1783,27 @@ commands to be prefixed by \"-interpreter-exec 
console\".")
     (let ((inhibit-read-only t))
       (remove-text-properties (point-min) (point-max) '(face))))
   ;; mimic <RET> key to repeat previous command in GDB
-  (if (not (string= "" string))
-      (if gdb-continuation
-         (setq gdb-last-command (concat gdb-continuation
-                                        (gdb-strip-string-backslash string)
-                                        " "))
-       (setq gdb-last-command (gdb-strip-string-backslash string)))
-    (if gdb-last-command (setq string gdb-last-command))
-    (setq gdb-continuation nil))
-  (if (and (not gdb-continuation) (or (string-match "^-" string)
-         (> gdb-control-level 0)))
+  (when (= gdb-control-level 0)
+    (if (not (string= "" string))
+        (if gdb-continuation
+            (setq gdb-last-command (concat gdb-continuation
+                                           (gdb-strip-string-backslash string)
+                                           " "))
+          (setq gdb-last-command (gdb-strip-string-backslash string)))
+      (if gdb-last-command (setq string gdb-last-command))
+      (setq gdb-continuation nil)))
+  (if (and (not gdb-continuation)
+           (or (string-match "^-" string)
+               (> gdb-control-level 0)))
       ;; Either MI command or we are feeding GDB's recursive reading loop.
       (progn
        (setq gdb-first-done-or-error t)
        (process-send-string proc (concat string "\n"))
-       (if (and (string-match "^end$" string)
+       (if (and (string-match
+                  (concat "^\\("
+                          (if (eq system-type 'windows-nt) "\026" "\004")
+                          "\\|,q\\|,quit\\|end\\)$")
+                  string)
                 (> gdb-control-level 0))
            (setq gdb-control-level (1- gdb-control-level))))
     ;; CLI command
@@ -1812,7 +1819,11 @@ commands to be prefixed by \"-interpreter-exec 
console\".")
         (if gdb-enable-debug
             (push (cons 'mi-send to-send) gdb-debug-log))
         (process-send-string proc to-send))
-      (if (and (string-match "^end$" string)
+      (if (and (string-match
+                  (concat "^\\("
+                          (if (eq system-type 'windows-nt) "\026" "\004")
+                          "\\|,q\\|,quit\\|end\\)$")
+                  string)
               (> gdb-control-level 0))
          (setq gdb-control-level (1- gdb-control-level)))
       (setq gdb-continuation nil)))
@@ -2788,7 +2799,7 @@ buffer with `gdb-bind-function-to-buffer'.
 If SIGNAL-LIST is non-nil, GDB-COMMAND is sent only when the
 defined trigger is called with an argument from SIGNAL-LIST.  It's
 not recommended to define triggers with empty SIGNAL-LIST.
-Normally triggers should respond at least to 'update signal.
+Normally triggers should respond at least to the `update' signal.
 
 Normally the trigger defined by this command must be called from
 the buffer where HANDLER-NAME must work.  This should be done so
@@ -3252,7 +3263,7 @@ corresponding to the mode line clicked."
   "Define a NAME command which will act upon thread on the current line.
 
 CUSTOM-DEFUN may use locally bound `thread' variable, which will
-be the value of 'gdb-thread property of the current line.
+be the value of `gdb-thread' property of the current line.
 If `gdb-thread' is nil, error is signaled."
   `(defun ,name (&optional event)
      ,(when doc doc)
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index 1284ef2..024547c 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -3080,7 +3080,7 @@ the character after the end of the expr."
   "Scan from SPAN-START to SPAN-END for punctuation characters.
 If `->' is found, return `?.'.  If `.' is found, return `?.'.
 If any other punctuation is found, return `??'.
-If no punctuation is found, return `? '."
+If no punctuation is found, return `?\\s'."
   (let ((result ?\s)
        (syntax))
     (while (< span-start span-end)
diff --git a/lisp/progmodes/hideif.el b/lisp/progmodes/hideif.el
index e0d25c4..71646d3 100644
--- a/lisp/progmodes/hideif.el
+++ b/lisp/progmodes/hideif.el
@@ -653,7 +653,7 @@ that form should be displayed.")
            (stringp id))))
 
 (defun hif-define-operator (tokens)
-  "`Upgrade' hif-define xxx to '(hif-define xxx)' so it won't be substituted."
+  "\"Upgrade\" hif-define XXX to `(hif-define XXX)' so it won't be 
substituted."
   (let ((result nil)
         (tok nil))
     (while (setq tok (pop tokens))
@@ -766,7 +766,7 @@ macros to prevent self-reference."
           (error "Error: unexpected token: %s" hif-token)))))
 
 (defun hif-exprlist ()
-  "Parse an exprlist: expr { ',' expr}."
+  "Parse an exprlist: expr { `,' expr}."
   (let ((result (hif-expr)))
     (if (eq hif-token 'hif-comma)
         (let ((temp (list result)))
@@ -780,7 +780,7 @@ macros to prevent self-reference."
 
 (defun hif-expr ()
   "Parse an expression as found in #if.
-expr : or-expr | or-expr '?' expr ':' expr."
+expr : or-expr | or-expr `?' expr `:' expr."
   (let ((result (hif-or-expr))
         middle)
     (while (eq hif-token 'hif-conditional)
@@ -794,7 +794,7 @@ expr : or-expr | or-expr '?' expr ':' expr."
     result))
 
 (defun hif-or-expr ()
-  "Parse an or-expr : and-expr | or-expr '||' and-expr."
+  "Parse an or-expr : and-expr | or-expr `||' and-expr."
   (let ((result (hif-and-expr)))
     (while (eq hif-token 'hif-or)
       (hif-nexttoken)
@@ -802,7 +802,7 @@ expr : or-expr | or-expr '?' expr ':' expr."
   result))
 
 (defun hif-and-expr ()
-  "Parse an and-expr : logior-expr | and-expr '&&' logior-expr."
+  "Parse an and-expr : logior-expr | and-expr `&&' logior-expr."
   (let ((result (hif-logior-expr)))
     (while (eq hif-token 'hif-and)
       (hif-nexttoken)
@@ -810,7 +810,7 @@ expr : or-expr | or-expr '?' expr ':' expr."
     result))
 
 (defun hif-logior-expr ()
-  "Parse a logor-expr : logxor-expr | logor-expr '|' logxor-expr."
+  "Parse a logor-expr : logxor-expr | logor-expr `|' logxor-expr."
   (let ((result (hif-logxor-expr)))
     (while (eq hif-token 'hif-logior)
       (hif-nexttoken)
@@ -818,7 +818,7 @@ expr : or-expr | or-expr '?' expr ':' expr."
     result))
 
 (defun hif-logxor-expr ()
-  "Parse a logxor-expr : logand-expr | logxor-expr '^' logand-expr."
+  "Parse a logxor-expr : logand-expr | logxor-expr `^' logand-expr."
   (let ((result (hif-logand-expr)))
     (while (eq hif-token 'hif-logxor)
       (hif-nexttoken)
@@ -826,7 +826,7 @@ expr : or-expr | or-expr '?' expr ':' expr."
     result))
 
 (defun hif-logand-expr ()
-  "Parse a logand-expr : eq-expr | logand-expr '&' eq-expr."
+  "Parse a logand-expr : eq-expr | logand-expr `&' eq-expr."
   (let ((result (hif-eq-expr)))
     (while (eq hif-token 'hif-logand)
       (hif-nexttoken)
@@ -866,7 +866,7 @@ expr : or-expr | or-expr '?' expr ':' expr."
 
 (defun hif-math ()
   "Parse an expression with + or -.
-       math : muldiv | math '+|-' muldiv."
+       math : muldiv | math `+'|`-' muldiv."
   (let ((result (hif-muldiv-expr))
         (math-op nil))
     (while (memq hif-token '(hif-plus hif-minus))
@@ -877,7 +877,7 @@ expr : or-expr | or-expr '?' expr ':' expr."
 
 (defun hif-muldiv-expr ()
   "Parse an expression with *,/,%.
-       muldiv : factor | muldiv '*|/|%' factor."
+       muldiv : factor | muldiv `*'|`/'|`%' factor."
   (let ((result (hif-factor))
         (math-op nil))
     (while (memq hif-token '(hif-multiply hif-divide hif-modulo))
@@ -888,8 +888,8 @@ expr : or-expr | or-expr '?' expr ':' expr."
 
 (defun hif-factor ()
   "Parse a factor.
-factor : '!' factor | '~' factor | '(' expr ')' | 'defined(' id ')' |
-         'id(parmlist)' | strings | id."
+factor : `!' factor | `~' factor | `(' expr `)' | `defined(' id `)' |
+         id `(' parmlist `)' | strings | id."
   (cond
    ((eq hif-token 'hif-not)
     (hif-nexttoken)
@@ -999,9 +999,9 @@ This macro cannot be evaluated alone without parameters 
input."
 (defun hif-token-concat (a b)
   "Concatenate two tokens into a longer token.
 Currently support only simple token concatenation.  Also support weird (but
-valid) token concatenation like '>' ## '>' becomes '>>'.  Here we take care 
only
+valid) token concatenation like `>' ## `>' becomes `>>'.  Here we take care 
only
 those that can be evaluated during preprocessing time and ignore all those that
-can only be evaluated at C(++) runtime (like '++', '--' and '+='...)."
+can only be evaluated at C(++) runtime (like `++', `--' and `+='...)."
   (if (or (memq a hif-valid-token-list)
           (memq b hif-valid-token-list))
       (let* ((ra (car (rassq a hif-token-alist)))
@@ -1632,8 +1632,8 @@ not be expanded."
         result))))
 
 (defun hif-parse-macro-arglist (str)
-  "Parse argument list formatted as '( arg1 [ , argn] [...] )'.
-The '...' is also included.  Return a list of the arguments, if '...' exists 
the
+  "Parse argument list formatted as `( arg1 [ , argn] [...] )'.
+The `...' is also included.  Return a list of the arguments, if `...' exists 
the
 first arg will be `hif-etc'."
   (let* ((hif-simple-token-only nil) ; Dynamic binding var for `hif-tokenize'
          (tokenlist
diff --git a/lisp/progmodes/hideshow.el b/lisp/progmodes/hideshow.el
index dba497b..7dfef5f 100644
--- a/lisp/progmodes/hideshow.el
+++ b/lisp/progmodes/hideshow.el
@@ -439,9 +439,9 @@ See `hs-c-like-adjust-block-beginning' for an example of 
using this.")
 You can display this in the mode line by adding the symbol `hs-headline'
 to the variable `mode-line-format'.  For example,
 
-  (unless (memq 'hs-headline mode-line-format)
+  (unless (memq \\='hs-headline mode-line-format)
     (setq mode-line-format
-          (append '(\"-\" hs-headline) mode-line-format)))
+          (append \\='(\"-\" hs-headline) mode-line-format)))
 
 Note that `mode-line-format' is buffer-local.")
 
@@ -469,9 +469,9 @@ KIND is either `code' or `comment'.  Optional fourth arg 
B-OFFSET
 when added to B specifies the actual buffer position where the block
 begins.  Likewise for optional fifth arg E-OFFSET.  If unspecified
 they are taken to be 0 (zero).  The following properties are set
-in the overlay: 'invisible 'hs 'hs-b-offset 'hs-e-offset.  Also,
+in the overlay: `invisible' `hs' `hs-b-offset' `hs-e-offset'.  Also,
 depending on variable `hs-isearch-open', the following properties may
-be present: 'isearch-open-invisible 'isearch-open-invisible-temporary.
+be present: `isearch-open-invisible' `isearch-open-invisible-temporary'.
 If variable `hs-set-up-overlay' is non-nil it should specify a function
 to call with the newly initialized overlay."
   (unless b-offset (setq b-offset 0))
@@ -934,7 +934,7 @@ if ARG is omitted or nil.
 
 When hideshow minor mode is on, the menu bar is augmented with hideshow
 commands and the hideshow commands are enabled.
-The value '(hs . t) is added to `buffer-invisibility-spec'.
+The value (hs . t) is added to `buffer-invisibility-spec'.
 
 The main commands are: `hs-hide-all', `hs-show-all', `hs-hide-block',
 `hs-show-block', `hs-hide-level' and `hs-toggle-hiding'.  There is also
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index ac2259d..1546e9a 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -808,7 +808,7 @@ See `idlwave-check-abbrev'."
 (defcustom idlwave-abbrev-change-case nil
   "Non-nil means all abbrevs will be forced to either upper or lower case.
 If the value t, all expanded abbrevs will be upper case.
-If the value is 'down then abbrevs will be forced to lower case.
+If the value is `down' then abbrevs will be forced to lower case.
 If nil, the case will not change.
 If `idlwave-reserved-word-upcase' is non-nil, reserved words will always be
 upper case, regardless of this variable."
@@ -963,7 +963,7 @@ a file."
 
 (defcustom idlwave-doc-modifications-keyword "HISTORY"
   "The modifications keyword to use with the log documentation commands.
-A ':' is added to the keyword end.
+A `:' is added to the keyword end.
 Inserted by doc-header and used to position logs by doc-modification.
 If nil it will not be inserted."
   :group 'idlwave-documentation
@@ -999,7 +999,7 @@ it without compromising backwards-compatibility."
 (defcustom idlwave-shell-command-line-options nil
   "A list of command line options for calling the IDL program.
 Since IDL is executed directly without going through a shell like /bin/sh,
-this should be a list of strings like '(\"-rt=file\" \"-nw\") with a separate
+this should be a list of strings like (\"-rt=file\" \"-nw\") with a separate
 string for each argument.  But you may also give a single string which
 contains the options whitespace-separated.  Emacs will be kind enough to
 split it for you."
@@ -1021,7 +1021,7 @@ Obsolete, if the IDL Assistant is being used for help."
 Will be used to bind debugging commands in the shell buffer and in all
 source buffers.  These are additional convenience bindings, the debugging
 commands are always available with the `C-c C-d' prefix.
-If you set this to '(control shift), this means setting a breakpoint will
+If you set this to (control shift), this means setting a breakpoint will
 be on `C-S-b', compiling a source file on `C-S-c' etc.  Possible modifiers
 are `control', `meta', `super', `hyper', `alt', and `shift'."
   :group 'idlwave-shell-general-setup
@@ -1557,15 +1557,15 @@ KEY is a string - same as for the `define-key' 
function.  CMD is a
 function of no arguments or a list to be evaluated.  CMD is bound to
 KEY in `idlwave-mode-map' by defining an anonymous function calling
 `self-insert-command' followed by CMD.  If KEY contains more than one
-character a binding will only be set if SELECT is 'both.
+character a binding will only be set if SELECT is `both'.
 
 \(KEY . CMD) is also placed in the `idlwave-indent-expand-table',
 replacing any previous value for KEY.  If a binding is not set then it
 will instead be placed in `idlwave-indent-action-table'.
 
 If the optional argument SELECT is nil then an action and binding are
-created.  If SELECT is 'noaction, then a binding is always set and no
-action is created.  If SELECT is 'both then an action and binding
+created.  If SELECT is `noaction', then a binding is always set and no
+action is created.  If SELECT is `both' then an action and binding
 will both be created even if KEY contains more than one character.
 Otherwise, if SELECT is non-nil then only an action is created.
 
@@ -2690,7 +2690,7 @@ statement."
           (append st (match-end 0))))))
 
 (defun idlwave-expand-equal (&optional before after is-action)
-  "Pad '=' with spaces.
+  "Pad `=' with spaces.
 Two cases: Assignment statement, and keyword assignment.
 Which case is determined using `idlwave-start-of-substatement' and
 `idlwave-statement-type'.  The equal sign will be surrounded by BEFORE
@@ -2835,7 +2835,7 @@ ACTION is a list (REG . FUNC).  REG is a regular 
expression.  FUNC is
 either a function name to be called with `funcall' or a list to be
 evaluated with `eval'.  The action performed by FUNC should leave
 point after the match for REG - otherwise an infinite loop may be
-entered.  FUNC is always passed a final argument of 'is-action, so it
+entered.  FUNC is always passed a final argument of `is-action', so it
 can discriminate between being run as an action, or a key binding."
   (let ((action-key (car action))
         (action-routine (cdr action)))
@@ -6240,7 +6240,7 @@ If yes, return the index (>=1)."
 
 (defun idlwave-all-method-classes (method &optional type)
   "Return all classes which have a method METHOD.
-TYPE is 'fun or 'pro.
+TYPE is `fun' or `pro'.
 When TYPE is not specified, both procedures and functions will be considered."
   (if (null method)
       (mapcar 'car (idlwave-class-alist))
@@ -6255,7 +6255,7 @@ When TYPE is not specified, both procedures and functions 
will be considered."
 
 (defun idlwave-all-method-keyword-classes (method keyword &optional type)
   "Return all classes which have a method METHOD with keyword KEYWORD.
-TYPE is 'fun or 'pro.
+TYPE is `fun' or `pro'.
 When TYPE is not specified, both procedures and functions will be considered."
   (if (or (null method)
          (null keyword))
@@ -6644,8 +6644,8 @@ This function is not general, can only be used for 
completion stuff."
                                        special-selector)
   "Perform TYPE completion of word before point against LIST.
 SELECTOR is the PREDICATE argument for the completion function.  Show
-PROMPT in echo area.  TYPE is one of the intern types, e.g. 'function,
-'procedure, 'class-tag, 'keyword, 'sysvar, etc.  SPECIAL-SELECTOR is
+PROMPT in echo area.  TYPE is one of the intern types, e.g., `function',
+`procedure', `class-tag', `keyword', `sysvar'.  SPECIAL-SELECTOR is
 used only once, for `all-completions', and can be used to, e.g.,
 accumulate information on matching completions."
   (let* ((completion-ignore-case t)
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 3ce1c17..310b7ba 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -97,7 +97,7 @@ name.")
           "\\.\\(" js--name-re "\\)\\s-*?=\\s-*?\\(function\\)\\_>")
   "Regexp matching an explicit JavaScript prototype \"method\" declaration.
 Group 1 is a (possibly-dotted) class name, group 2 is a method name,
-and group 3 is the 'function' keyword.")
+and group 3 is the `function' keyword.")
 
 (defconst js--plain-class-re
   (concat "^\\s-*\\(" js--dotted-name-re "\\)\\.prototype"
@@ -831,7 +831,7 @@ lines."
 
 (defun js--forward-function-decl ()
   "Move forward over a JavaScript function declaration.
-This puts point at the 'function' keyword.
+This puts point at the `function' keyword.
 
 If this is a syntactically-correct non-expression function,
 return the name of the function, or t if the name could not be
@@ -1823,6 +1823,7 @@ nil."
                    (skip-syntax-backward " ")
                    (skip-syntax-backward "w_")
                    (looking-at js--possibly-braceless-keyword-re))
+                 (memq (char-before) '(?\s ?\t ?\n ?\}))
                  (not (js--end-of-do-while-loop-p))))
       (save-excursion
         (goto-char (match-beginning 0))
@@ -3366,8 +3367,8 @@ left-to-right."
 
 (defun js--read-tab (prompt)
   "Read a Mozilla tab with prompt PROMPT.
-Return a cons of (TYPE . OBJECT).  TYPE is either 'window or
-'tab, and OBJECT is a JavaScript handle to a ChromeWindow or a
+Return a cons of (TYPE . OBJECT).  TYPE is either `window' or
+`tab', and OBJECT is a JavaScript handle to a ChromeWindow or a
 browser, respectively."
 
   ;; Prime IDO
@@ -3778,12 +3779,12 @@ If one hasn't been set, or if it's stale, prompt for a 
new one."
   "Major mode for editing JSX.
 
 To customize the indentation for this mode, set the SGML offset
-variables (`sgml-basic-offset', `sgml-attribute-offset' et al)
+variables (`sgml-basic-offset', `sgml-attribute-offset' et al.)
 locally, like so:
 
   (defun set-jsx-indentation ()
     (setq-local sgml-basic-offset js-indent-level))
-  (add-hook 'js-jsx-mode-hook #'set-jsx-indentation)"
+  (add-hook \\='js-jsx-mode-hook #\\='set-jsx-indentation)"
   :group 'js
   (setq-local indent-line-function #'js-jsx-indent-line))
 
diff --git a/lisp/progmodes/mantemp.el b/lisp/progmodes/mantemp.el
index a0f50fc..79a6040 100644
--- a/lisp/progmodes/mantemp.el
+++ b/lisp/progmodes/mantemp.el
@@ -128,7 +128,7 @@
 
 (defun mantemp-insert-cxx-syntax ()
   "Insert C++ syntax around each template class and function.
-Insert 'template class' for classes, 'template' for
+Insert `template class' for classes, `template' for
 functions and add the statement delimiter `;' at the end of
 the lines."
   (save-excursion
diff --git a/lisp/progmodes/pascal.el b/lisp/progmodes/pascal.el
index 454367c..904001d 100644
--- a/lisp/progmodes/pascal.el
+++ b/lisp/progmodes/pascal.el
@@ -236,8 +236,8 @@ The name of the function or case is included between the 
braces."
   "List of contexts where auto lineup of :'s or ='s should be done.
 Elements can be of type: `paramlist', `declaration' or `case', which will
 do auto lineup in parameterlist, declarations or case-statements
-respectively.  The word `all' will do all lineups.  '(case paramlist) for
-instance will do lineup in case-statements and parameterlist, while '(all)
+respectively.  The word `all' will do all lineups.  (case paramlist) for
+instance will do lineup in case-statements and parameterlist, while (all)
 will do all lineups."
   :type '(set :extra-offset 8
              (const :tag "Everything" all)
diff --git a/lisp/progmodes/prog-mode.el b/lisp/progmodes/prog-mode.el
index b459cbf..9702880 100644
--- a/lisp/progmodes/prog-mode.el
+++ b/lisp/progmodes/prog-mode.el
@@ -50,49 +50,51 @@
   "Keymap used for programming modes.")
 
 (defvar prog-indentation-context nil
-  "Non-nil while indenting embedded code chunks.
+  "When non-nil, provides context for indenting embedded code chunks.
+
 There are languages where part of the code is actually written in
 a sub language, e.g., a Yacc/Bison or ANTLR grammar also consists
 of plain C code.  This variable enables the major mode of the
-main language to use the indentation engine of the sub mode for
-lines in code chunks written in the sub language.
+main language to use the indentation engine of the sub-mode for
+lines in code chunks written in the sub-mode's language.
 
 When a major mode of such a main language decides to delegate the
 indentation of a line/region to the indentation engine of the sub
-mode, it is supposed to bind this variable to non-nil around the call.
+mode, it should bind this variable to non-nil around the call.
+
+The non-nil value should be a list of the form:
 
-The non-nil value looks as follows
    (FIRST-COLUMN (START . END) PREVIOUS-CHUNKS)
 
-FIRST-COLUMN is the column the indentation engine of the sub mode
-should usually choose for top-level language constructs inside
-the code chunk (instead of 0).
+FIRST-COLUMN is the column the indentation engine of the sub-mode
+should use for top-level language constructs inside the code
+chunk (instead of 0).
 
-START to END is the region of the code chunk.  See function
-`prog-widen' for additional info.
+START and END specify the region of the code chunk.  END can be
+nil, which stands for the value of `point-max'.  The function
+`prog-widen' uses this to restore restrictions imposed by the
+sub-mode's indentation engine.
 
 PREVIOUS-CHUNKS, if non-nil, provides the indentation engine of
-the sub mode with the virtual context of the code chunk.  Valid
+the sub-mode with the virtual context of the code chunk.  Valid
 values are:
 
- - A string containing code which the indentation engine can
+ - A string containing text which the indentation engine can
    consider as standing in front of the code chunk.  To cache the
    string's calculated syntactic information for repeated calls
-   with the same string, it is valid and expected for the inner
-   mode to add text-properties to the string.
+   with the same string, the sub-mode can add text-properties to
+   the string.
 
    A typical use case is for grammars with code chunks which are
-   to be indented like function bodies - the string would contain
-   a corresponding function header.
+   to be indented like function bodies -- the string would contain
+   the corresponding function preamble.
 
- - A function called with the start position of the current
-   chunk.  It will return either the region of the previous chunk
-   as (PREV-START . PREV-END) or nil if there is no further
-   previous chunk.
+ - A function, to be called with the start position of the current
+   chunk.  It should return either the region of the previous chunk
+   as (PREV-START . PREV-END), or nil if there is no previous chunk.
 
-   A typical use case are literate programming sources - the
-   function would successively return the code chunks of the
-   previous macro definitions for the same name.")
+   A typical use case are literate programming sources -- the
+   function would successively return the previous code chunks.")
 
 (defun prog-indent-sexp (&optional defun)
   "Indent the expression after point.
@@ -113,8 +115,8 @@ instead."
 
 (defun prog-widen ()
   "Remove restrictions (narrowing) from current code chunk or buffer.
-This function can be used instead of `widen' in any function used
-by the indentation engine to make it respect the value
+This function should be used instead of `widen' in any function used
+by the indentation engine to make it respect the value of
 `prog-indentation-context'.
 
 This function (like `widen') is useful inside a
@@ -122,8 +124,8 @@ This function (like `widen') is useful inside a
 narrowing is in effect."
   (let ((chunk (cadr prog-indentation-context)))
     (if chunk
-        ;; no widen necessary here, as narrow-to-region changes (not
-        ;; just narrows) existing restrictions
+        ;; No call to `widen' is necessary here, as narrow-to-region
+        ;; changes (not just narrows) the existing restrictions
         (narrow-to-region (car chunk) (or (cdr chunk) (point-max)))
       (widen))))
 
@@ -134,15 +136,15 @@ Each element looks like (SYMBOL . CHARACTER), where the 
symbol
 matching SYMBOL (a string, not a regexp) will be shown as
 CHARACTER instead.
 
-CHARACTER can be a character or it can be a list or vector, in
+CHARACTER can be a character, or it can be a list or vector, in
 which case it will be used to compose the new symbol as per the
 third argument of `compose-region'.")
 
 (defun prettify-symbols-default-compose-p (start end _match)
   "Return true iff the symbol MATCH should be composed.
 The symbol starts at position START and ends at position END.
-This is default `prettify-symbols-compose-predicate' which is
-suitable for most programming languages such as C or Lisp."
+This is the default for `prettify-symbols-compose-predicate'
+which is suitable for most programming languages such as C or Lisp."
   ;; Check that the chars should really be composed into a symbol.
   (let* ((syntaxes-beg (if (memq (char-syntax (char-after start)) '(?w ?_))
                            '(?w ?_) '(?. ?\\)))
@@ -154,14 +156,14 @@ suitable for most programming languages such as C or 
Lisp."
 
 (defvar-local prettify-symbols-compose-predicate
   #'prettify-symbols-default-compose-p
-  "A predicate deciding if the currently matched symbol is to be composed.
+  "A predicate for deciding if the currently matched symbol is to be composed.
 The matched symbol is the car of one entry in `prettify-symbols-alist'.
-The predicate receives the match's start and end position as well
+The predicate receives the match's start and end positions as well
 as the match-string as arguments.")
 
 (defun prettify-symbols--compose-symbol (alist)
   "Compose a sequence of characters into a symbol.
-Regexp match data 0 points to the chars."
+Regexp match data 0 specifies the characters to be composed."
   ;; Check that the chars should really be composed into a symbol.
   (let ((start (match-beginning 0))
         (end (match-end 0))
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 398339e..c8e48e2 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -20,13 +20,65 @@
 ;;; Commentary:
 
 ;; This file contains generic infrastructure for dealing with
-;; projects, and a number of public functions: finding the current
-;; root, related project directories, and library directories.  This
-;; list is to be extended in future versions.
+;; projects, some utility functions, and commands using that
+;; infrastructure.
 ;;
 ;; The goal is to make it easier for Lisp programs to operate on the
 ;; current project, without having to know which package handles
 ;; detection of that project type, parsing its config files, etc.
+;;
+;; Infrastructure:
+;;
+;; Function `project-current', to determine the current project
+;; instance, and 3 (at the moment) generic functions that act on it.
+;; This list is to be extended in future versions.
+;;
+;; Utils:
+;;
+;; `project-combine-directories' and `project-subtract-directories',
+;; mainly for use in the abovementioned generics' implementations.
+;;
+;; Commands:
+;;
+;; `project-find-regexp' and `project-or-external-find-regexp' use the
+;; current API, and thus will work in any project that has an adapter.
+
+;;; TODO:
+
+;; * Commands `project-find-file' and `project-or-external-find-file'.
+;;   Currently blocked on adding a new completion style that would let
+;;   the user enter just the base file name (or a part of it), and get
+;;   it expanded to the absolute file name.
+;;
+;; * Build tool related functionality.  Start with a `project-build'
+;;   command, which should provide completions on tasks to run, and
+;;   maybe allow entering some additional arguments.  This might
+;;   be handled better with a separate API, though.  Then we won't
+;;   force every project backend to be aware of the build tool(s) the
+;;   project is using.
+;;
+;; * Command to (re)build the tag files in all project roots.  To that
+;;   end, we might need to add a way to provide file whitelist
+;;   wildcards for each root to limit etags to certain files (in
+;;   addition to the blacklist provided by ignores), and/or allow
+;;   specifying additional tag regexps.
+;;
+;; * UI for the user to be able to pick the current project for the
+;;   whole Emacs session, independent of the current directory.  Or,
+;;   in the more advanced case, open a set of projects, and have some
+;;   project-related commands to use them all.  E.g., have a command
+;;   to search for a regexp across all open projects.  Provide a
+;;   history of projects that were opened in the past (storing it as a
+;;   list of directories should suffice).
+;;
+;; * Support for project-local variables: a UI to edit them, and a
+;;   utility function to retrieve a value.  Probably useless without
+;;   support in various built-in commands.  In the API, we might get
+;;   away with only adding a `project-configuration-directory' method,
+;;   defaulting to the project root the current file/buffer is in.
+;;   And prompting otherwise.  How to best mix that with backends that
+;;   want to set/provide certain variables themselves, is up for
+;;   discussion.
 
 ;;; Code:
 
@@ -38,35 +90,6 @@ Each functions on this hook is called in turn with one
 argument (the directory) and should return either nil to mean
 that it is not applicable, or a project instance.")
 
-;; 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 "library roots" of language A from buffers of language B, which
-;; seems desirable in multi-language projects, at least for some
-;; potential uses, like "jump to a file in project or library".
-;;
-;; We can add a second argument to this function: a file extension, or
-;; a language name.  Some projects will know the set of languages used
-;; in them; for others, like VC-based projects, we'll need
-;; auto-detection.  I see two options:
-;;
-;; - That could be implemented as a separate second hook, with a
-;;   list of functions that return file extensions.
-;;
-;; - This variable will be turned into a hook with "append" semantics,
-;;   and each function in it will perform auto-detection when passed
-;;   nil instead of an actual file extension.  Then this hook will, in
-;;   general, be modified globally, and not from major mode functions.
-(defvar project-library-roots-function 'etags-library-roots
-  "Function that returns a list of library roots.
-
-It should return a list of directories that contain source files
-related to the current buffer.  Depending on the language, it
-should include the headers search path, load path, class path,
-and so on.
-
-The directory names should be absolute.  Used in the default
-implementation of `project-library-roots'.")
-
 ;;;###autoload
 (defun project-current (&optional maybe-prompt dir)
   "Return the project instance in DIR or `default-directory'.
@@ -86,40 +109,35 @@ the user for a different directory to look in."
 (defun project--find-in-directory (dir)
   (run-hook-with-args-until-success 'project-find-functions dir))
 
-;; FIXME: Add MODE argument, like in `ede-source-paths'?
-(cl-defgeneric project-library-roots (project)
-  "Return the list of library roots for PROJECT.
+(cl-defgeneric project-roots (project)
+  "Return the list of directory roots of the current project.
 
-It's the list of directories outside of the project that contain
-related source files.
+Most often it's just one directory which contains the project
+build file and everything else in the project.  But in more
+advanced configurations, a project can span multiple directories.
 
-Project-specific version of `project-library-roots-function',
-which see.  Unless it knows better, a specialized implementation
-should use the value returned by that function."
-  (project-subtract-directories
-   (project-combine-directories
-    (funcall project-library-roots-function))
-   (project-roots project)))
-
-(cl-defgeneric project-roots (project)
-  "Return the list of directory roots belonging to the current project.
+The directory names should be absolute.")
 
-Most often it's just one directory, which contains the project
-file and everything else in the project.  But in more advanced
-configurations, a project can span multiple directories.
+;; FIXME: Add MODE argument, like in `ede-source-paths'?
+(cl-defgeneric project-external-roots (_project)
+  "Return the list of external roots for PROJECT.
 
-The rule of thumb for whether to include a directory here, and not
-in `project-library-roots', is whether its contents are meant to
-be edited together with the rest of the project.
+It's the list of directories outside of the project that are
+still related to it.  If the project deals with source code then,
+depending on the languages used, this list should include the
+headers search path, load path, class path, and so on.
 
-The directory names should be absolute.")
+The rule of thumb for whether to include a directory here, and
+not in `project-roots', is whether its contents are meant to be
+edited together with the rest of the project."
+  nil)
 
 (cl-defgeneric project-ignores (_project _dir)
   "Return the list of glob patterns to ignore inside DIR.
 Patterns can match both regular files and directories.
 To root an entry, start it with `./'.  To match directories only,
 end it with `/'.  DIR must be one of `project-roots' or
-`project-library-roots'."
+`project-external-roots'."
   (require 'grep)
   (defvar grep-find-ignored-files)
   (nconc
@@ -133,17 +151,46 @@ end it with `/'.  DIR must be one of `project-roots' or
   "Project implementation using the VC package."
   :group 'tools)
 
-(defcustom project-vc-library-roots nil
-  "List ot directories to include in `project-library-roots'.
-The file names can be absolute, or relative to the project root."
-  :type '(repeat file)
-  :safe 'listp)
-
 (defcustom project-vc-ignores nil
   "List ot patterns to include in `project-ignores'."
   :type '(repeat string)
   :safe 'listp)
 
+;; 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
+;; seems desirable in multi-language projects, at least for some
+;; potential uses, like "jump to a file in project or external dirs".
+;;
+;; We could add a second argument to this function: a file extension,
+;; or a language name.  Some projects will know the set of languages
+;; used in them; for others, like VC-based projects, we'll need
+;; auto-detection.  I see two options:
+;;
+;; - That could be implemented as a separate second hook, with a
+;;   list of functions that return file extensions.
+;;
+;; - This variable will be turned into a hook with "append" semantics,
+;;   and each function in it will perform auto-detection when passed
+;;   nil instead of an actual file extension.  Then this hook will, in
+;;   general, be modified globally, and not from major mode functions.
+;;
+;; The second option seems simpler, but the first one has the
+;; advantage that the user could override the list of languages used
+;; in a project via a directory-local variable, thus skipping
+;; languages they're not working on personally (in a big project), or
+;; working around problems in language detection (the detection logic
+;; might be imperfect for the project in question, or it might work
+;; too slowly for the user's taste).
+(defvar project-vc-external-roots-function (lambda () tags-table-list)
+  "Function that returns a list of external roots.
+
+It should return a list of directory roots that contain source
+files related to the current buffer.
+
+The directory names should be absolute.  Used in the VC project
+backend implementation of `project-external-roots'.")
+
 (defun project-try-vc (dir)
   (let* ((backend (ignore-errors (vc-responsible-backend dir)))
          (root (and backend (ignore-errors
@@ -153,15 +200,12 @@ The file names can be absolute, or relative to the 
project root."
 (cl-defmethod project-roots ((project (head vc)))
   (list (cdr project)))
 
-(cl-defmethod project-library-roots ((project (head vc)))
+(cl-defmethod project-external-roots ((project (head vc)))
   (project-subtract-directories
    (project-combine-directories
-    (append
-     (let ((root (cdr project)))
-       (mapcar
-        (lambda (dir) (file-name-as-directory (expand-file-name dir root)))
-        (project--value-in-dir 'project-vc-library-roots root)))
-     (funcall project-library-roots-function)))
+    (mapcar
+     #'file-name-as-directory
+     (funcall project-vc-external-roots-function)))
    (project-roots project)))
 
 (cl-defmethod project-ignores ((project (head vc)) dir)
@@ -213,10 +257,11 @@ DIRS must contain directory names."
 (declare-function grep-read-files "grep")
 (declare-function xref-collect-matches "xref")
 (declare-function xref--show-xrefs "xref")
+(declare-function xref-backend-identifier-at-point "xref")
 
 ;;;###autoload
 (defun project-find-regexp (regexp)
-  "Find all matches for REGEXP in the current project.
+  "Find all matches for REGEXP in the current project's roots.
 With \\[universal-argument] prefix, you can specify the directory
 to search in, and the file name pattern to search for."
   (interactive (list (project--read-regexp)))
@@ -228,22 +273,20 @@ to search in, and the file name pattern to search for."
     (project--find-regexp-in dirs regexp pr)))
 
 ;;;###autoload
-(defun project-or-libraries-find-regexp (regexp)
-  "Find all matches for REGEXP in the current project or libraries.
+(defun project-or-external-find-regexp (regexp)
+  "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."
   (interactive (list (project--read-regexp)))
   (let* ((pr (project-current t))
          (dirs (append
                 (project-roots pr)
-                (project-library-roots pr))))
+                (project-external-roots pr))))
     (project--find-regexp-in dirs regexp pr)))
 
 (defun project--read-regexp ()
-  (defvar xref-identifier-at-point-function)
-  (require 'xref)
   (read-regexp "Find regexp"
-               (funcall xref-identifier-at-point-function)))
+               (xref-backend-identifier-at-point (xref-find-backend))))
 
 (defun project--find-regexp-in (dirs regexp project)
   (require 'grep)
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index b6f7da6..04542cd 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -273,7 +273,7 @@
 (autoload 'help-function-arglist "help-fns")
 
 ;;;###autoload
-(add-to-list 'auto-mode-alist (cons (purecopy "\\.py\\'")  'python-mode))
+(add-to-list 'auto-mode-alist (cons (purecopy "\\.pyw?\\'")  'python-mode))
 ;;;###autoload
 (add-to-list 'interpreter-mode-alist (cons (purecopy "python[0-9.]*") 
'python-mode))
 
@@ -485,7 +485,7 @@ The type returned can be `comment', `string' or `paren'."
      ((nth 1 ppss) 'paren))))
 
 (defsubst python-syntax-comment-or-string-p (&optional ppss)
-  "Return non-nil if PPSS is inside 'comment or 'string."
+  "Return non-nil if PPSS is inside comment or string."
   (nth 8 (or ppss (syntax-ppss))))
 
 (defsubst python-syntax-closing-paren-p ()
@@ -1842,7 +1842,7 @@ This command assumes point is not in a string or comment."
 
 (defun python-nav-if-name-main ()
   "Move point at the beginning the __main__ block.
-When \"if __name__ == '__main__':\" is found returns its
+When \"if __name__ == \\='__main__\\=':\" is found returns its
 position, else returns nil."
   (interactive)
   (let ((point (point))
@@ -3051,7 +3051,7 @@ the python shell:
 (defun python-shell-send-region (start end &optional send-main msg)
   "Send the region delimited by START and END to inferior Python process.
 When optional argument SEND-MAIN is non-nil, allow execution of
-code inside blocks delimited by \"if __name__== '__main__':\".
+code inside blocks delimited by \"if __name__== \\='__main__\\=':\".
 When called interactively SEND-MAIN defaults to nil, unless it's
 called with prefix argument.  When optional argument MSG is
 non-nil, forces display of a user-friendly message if there's no
@@ -3068,7 +3068,7 @@ process running; defaults to t when called interactively."
 (defun python-shell-send-buffer (&optional send-main msg)
   "Send the entire buffer to inferior Python process.
 When optional argument SEND-MAIN is non-nil, allow execution of
-code inside blocks delimited by \"if __name__== '__main__':\".
+code inside blocks delimited by \"if __name__== \\='__main__\\=':\".
 When called interactively SEND-MAIN defaults to nil, unless it's
 called with prefix argument.  When optional argument MSG is
 non-nil, forces display of a user-friendly message if there's no
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 0933886..df07083 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -2193,8 +2193,9 @@ See `font-lock-syntax-table'.")
     ;; Constants.
     ("\\(?:\\_<\\|::\\)\\([A-Z]+\\(\\w\\|_\\)*\\)"
      1 (unless (eq ?\( (char-after)) font-lock-type-face))
-    ("\\(^\\s *\\|[[{(,]\\s *\\|\\sw\\s +\\)\\(\\(\\sw\\|_\\)+\\):[^:]"
-     (2 font-lock-constant-face))
+    ;; Ruby 1.9-style symbol hash keys.
+    ("\\(?:^\\s *\\|[[{(,]\\s *\\|\\sw\\s +\\)\\(\\(\\sw\\|_\\)+:\\)[^:]"
+     (1 (progn (forward-char -1) font-lock-constant-face)))
     ;; Conversion methods on Kernel.
     (,(concat ruby-font-lock-keyword-beg-re
               (regexp-opt '("Array" "Complex" "Float" "Hash"
@@ -2257,9 +2258,10 @@ See `font-lock-syntax-table'.")
 
 ;;;###autoload
 (add-to-list 'auto-mode-alist
-             (cons (purecopy (concat "\\(?:\\."
-                                     "rb\\|ru\\|rake\\|thor"
+             (cons (purecopy (concat "\\(?:\\.\\(?:"
+                                     "rbw?\\|ru\\|rake\\|thor"
                                      "\\|jbuilder\\|rabl\\|gemspec\\|podspec"
+                                     "\\)"
                                      "\\|/"
                                      "\\(?:Gem\\|Rake\\|Cap\\|Thor"
                                      "\\|Puppet\\|Berks"
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index baed27b..394e9ca 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -204,6 +204,7 @@
 
 (autoload 'comint-completion-at-point "comint")
 (autoload 'comint-filename-completion "comint")
+(autoload 'comint-send-string "comint")
 (autoload 'shell-command-completion "shell")
 (autoload 'shell-environment-variable-completion "shell")
 
@@ -1450,7 +1451,7 @@ This is for the rc shell."
 (defun sh-mkword-regexpr (word)
   "Make a regexp which matches WORD as a word.
 This specifically excludes an occurrence of WORD followed by
-punctuation characters like '-'."
+punctuation characters like `-'."
   (concat word "\\([^-[:alnum:]_]\\|$\\)"))
 
 (defconst sh-re-done (sh-mkword-regexpr "done"))
@@ -1580,7 +1581,8 @@ assumed.  Since filenames rarely give a clue, they are 
not further analyzed.
 This mode adapts to the variations between shells (see `sh-set-shell') by
 means of an inheritance based feature lookup (see `sh-feature').  This
 mechanism applies to all variables (including skeletons) that pertain to
-shell-specific features.
+shell-specific features.  Shell script files can use the `sh-shell' local
+variable to indicate the shell variant to be used for the file.
 
 The default style of this mode is that of Rosenblatt's Korn shell book.
 The syntax of the statements varies with the shell being used.  The
@@ -2364,7 +2366,11 @@ argument) controls whether to insert a #!-line and think 
about making
 the visited file executable, and NO-QUERY-FLAG (the second argument)
 controls whether to query about making the visited file executable.
 
-Calls the value of `sh-set-shell-hook' if set."
+Calls the value of `sh-set-shell-hook' if set.
+
+Shell script files can cause this function be called automatically
+when the file is visited by having a `sh-shell' file-local variable
+whose value is the shell name (don't quote it)."
   (interactive (list (completing-read
                       (format "Shell (default %s): "
                               sh-shell-file)
diff --git a/lisp/progmodes/simula.el b/lisp/progmodes/simula.el
index bc01338..d3ee9b5 100644
--- a/lisp/progmodes/simula.el
+++ b/lisp/progmodes/simula.el
@@ -344,22 +344,22 @@ Variables controlling indentation style:
     with respect to the previous line of the statement.
  `simula-label-offset' -4711
     Offset of SIMULA label lines relative to usual indentation.
- `simula-if-indent' '(0 . 0)
+ `simula-if-indent' (0 . 0)
     Extra indentation of THEN and ELSE with respect to the starting IF.
     Value is a cons cell, the car is extra THEN indentation and the cdr
     extra ELSE indentation.  IF after ELSE is indented as the starting IF.
- `simula-inspect-indent' '(0 . 0)
+ `simula-inspect-indent' (0 . 0)
     Extra indentation of WHEN and OTHERWISE with respect to the
     corresponding INSPECT.  Value is a cons cell, the car is
     extra WHEN indentation and the cdr extra OTHERWISE indentation.
  `simula-electric-indent' nil
     If this variable is non-nil, `simula-indent-line'
     will check the previous line to see if it has to be reindented.
- `simula-abbrev-keyword' 'upcase
+ `simula-abbrev-keyword' `upcase'
     Determine how SIMULA keywords will be expanded.  Value is one of
     the symbols `upcase', `downcase', `capitalize', (as in) `abbrev-table',
     or nil if they should not be changed.
- `simula-abbrev-stdproc' 'abbrev-table
+ `simula-abbrev-stdproc' `abbrev-table'
     Determine how standard SIMULA procedure and class names will be
     expanded.  Value is one of the symbols `upcase', `downcase', `capitalize',
     (as in) `abbrev-table', or nil if they should not be changed.
diff --git a/lisp/progmodes/sql.el b/lisp/progmodes/sql.el
index abc99ee..4059674 100644
--- a/lisp/progmodes/sql.el
+++ b/lisp/progmodes/sql.el
@@ -2987,7 +2987,7 @@ supported:
     :number t
 
 In order to ask the user for username, password and database, call the
-function like this: (sql-get-login 'user 'password 'database)."
+function like this: (sql-get-login \\='user \\='password \\='database)."
   (dolist (w what)
     (let ((plist (cdr-safe w)))
       (pcase (or (car-safe w) w)
@@ -4891,7 +4891,7 @@ your might try undecided-dos as a coding system.  If this 
doesn't help,
 Try to set `comint-output-filter-functions' like this:
 
 \(setq comint-output-filter-functions (append comint-output-filter-functions
-                                            '(comint-strip-ctrl-m)))
+                                            \\='(comint-strip-ctrl-m)))
 
 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
   (interactive "P")
diff --git a/lisp/progmodes/vera-mode.el b/lisp/progmodes/vera-mode.el
index bce56a4..354002d 100644
--- a/lisp/progmodes/vera-mode.el
+++ b/lisp/progmodes/vera-mode.el
@@ -870,7 +870,7 @@ This function does not modify point or mark."
            (beginning-of-line)))))))
 
 (defmacro vera-prepare-search (&rest body)
-  "Execute BODY with a syntax table that includes '_'."
+  "Execute BODY with a syntax table that includes `_'."
   `(with-syntax-table vera-mode-ext-syntax-table ,@body))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el
index 4095d47..90145dd 100644
--- a/lisp/progmodes/verilog-mode.el
+++ b/lisp/progmodes/verilog-mode.el
@@ -757,7 +757,7 @@ Set this to \"logic\" for SystemVerilog code, or use 
`verilog-auto-logic'."
 (put 'verilog-auto-wire-type 'safe-local-variable `stringp)
 
 (defcustom verilog-auto-endcomments t
-  "Non-nil means insert a comment /* ... */ after 'end's.
+  "Non-nil means insert a comment /* ... */ after `end's.
 The name of the function or case will be set between the braces."
   :group 'verilog-mode-actions
   :type 'boolean)
@@ -797,7 +797,7 @@ needed on every save.  A value of `detect' will do 
\\[verilog-auto]
 automatically when it thinks necessary.  A value of `ask' will query the
 user when it thinks updating is needed.
 
-You should not rely on the 'ask or 'detect policies, they are safeguards
+You should not rely on the `ask' or `detect' policies, they are safeguards
 only.  They do not detect when AUTOINSTs need to be updated because a
 sub-module's port list has changed."
   :group 'verilog-mode-actions
@@ -3733,12 +3733,12 @@ Variables controlling indentation/edit style:
    will be inserted.  Setting this variable to zero results in every
    end acquiring a comment; the default avoids too many redundant
    comments in tight quarters.
- `verilog-auto-lineup'              (default 'declarations)
+ `verilog-auto-lineup'              (default `declarations')
    List of contexts where auto lineup of code should be done.
 
 Variables controlling other actions:
 
- `verilog-linter'                   (default surelint)
+ `verilog-linter'                   (default `surelint')
    Unix program to call to run the lint checker.  This is the default
    command for \\[compile-command] and \\[verilog-auto-save-compile].
 
@@ -4089,7 +4089,7 @@ The upper left corner is defined by point.  Indices begin 
with 0
 and extend to the MAX - 1.  If no prefix arg is given, the user
 is prompted for a value.  The indices are surrounded by square
 brackets [].  For example, the following code with the point
-located after the first 'a' gives:
+located after the first `a' gives:
 
     a = b                           a[  0] = b
     a = b                           a[  1] = b
@@ -12949,7 +12949,7 @@ used on the right hand side of assignments.
 By default, AUTORESET will include the width of the signal in the
 autos, SystemVerilog designs may want to change this.  To control
 this behavior, see `verilog-auto-reset-widths'.  In some cases
-AUTORESET must use a '0 assignment and it will print NOWIDTH; use
+AUTORESET must use a \\='0 assignment and it will print NOWIDTH; use
 `verilog-auto-reset-widths' unbased to prevent this.
 
 AUTORESET ties signals to deasserted, which is presumed to be zero.
diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el
index 9ee4ab5..09330d7 100644
--- a/lisp/progmodes/vhdl-mode.el
+++ b/lisp/progmodes/vhdl-mode.el
@@ -585,7 +585,7 @@ option `vhdl-file-header').
 
 The default directory must have an absolute path (use `M-TAB' for completion).
 All other paths can be absolute or relative to the default directory.  All
-paths must end with '/'.
+paths must end with `/'.
 
 The design units found in the sources (files and directories) are shown in the
 hierarchy browser.  Path and file name can contain wildcards `*' and `?' as
@@ -945,7 +945,7 @@ If nil, only a list of actual parameters is entered."
   :group 'vhdl-template)
 
 (defcustom vhdl-sensitivity-list-all t
-  "Non-nil means use 'all' keyword in sensitivity list."
+  "Non-nil means use `all' keyword in sensitivity list."
   :version "25.1"
   :type 'boolean
   :group 'vhdl-template)
@@ -1103,7 +1103,7 @@ Otherwise, falling edge triggers."
 
 (defcustom vhdl-clock-edge-condition 'standard
   "Syntax of the clock edge condition.
-  Standard: \"clk'event and clk = '1'\"
+  Standard: \"clk\\='event and clk = \\='1\\='\"
   Function: \"rising_edge(clk)\""
   :type '(choice (const :tag "Standard" standard)
                 (const :tag "Function" function))
@@ -2477,7 +2477,7 @@ current buffer if no project is defined."
     default-directory))
 
 (defmacro vhdl-prepare-search-1 (&rest body)
-  "Enable case insensitive search and switch to syntax table that includes '_',
+  "Enable case insensitive search and switch to syntax table that includes `_',
 then execute BODY, and finally restore the old environment.  Used for
 consistent searching."
   `(let ((case-fold-search t))         ; case insensitive search
@@ -2486,7 +2486,7 @@ consistent searching."
        ,@body)))
 
 (defmacro vhdl-prepare-search-2 (&rest body)
-  "Enable case insensitive search, switch to syntax table that includes '_',
+  "Enable case insensitive search, switch to syntax table that includes `_',
 arrange to ignore `intangible' overlays, then execute BODY, and finally restore
 the old environment.  Used for consistent searching."
   `(let ((case-fold-search t)          ; case insensitive search
@@ -2759,7 +2759,7 @@ elements > `vhdl-menu-max-size'."
 
 (defun vhdl-function-name (prefix string &optional postfix)
   "Generate a Lisp function name.
-PREFIX, STRING and optional POSTFIX are concatenated by '-' and spaces in
+PREFIX, STRING and optional POSTFIX are concatenated by `-' and spaces in
 STRING are replaced by `-' and substrings are converted to lower case."
   (let ((name prefix))
     (while (string-match "\\(\\w+\\)\\s-*\\(.*\\)" string)
@@ -8189,8 +8189,8 @@ options 
vhdl-upper-case-{keywords,types,attributes,enum-values}."
 
 (defun vhdl-fix-statement-region (beg end &optional arg)
   "Force statements in region on separate line except when on same line
-with 'end' keyword (necessary for correct indentation).
-Currently supported keywords: 'begin', 'if'."
+with `end' keyword (necessary for correct indentation).
+Currently supported keywords: `begin', `if'."
   (interactive "r\nP")
   (vhdl-prepare-search-2
    (let (point)
@@ -8236,7 +8236,7 @@ Currently supported keywords: 'begin', 'if'."
 
 (defun vhdl-fix-statement-buffer ()
   "Force statements in buffer on separate line except when on same line
-with 'end' keyword (necessary for correct indentation)."
+with `end' keyword (necessary for correct indentation)."
   (interactive)
   (vhdl-fix-statement-region (point-min) (point-max)))
 
@@ -10578,22 +10578,22 @@ specification, if not already there."
   (insert "-- pragma " directive))
 
 (defun vhdl-template-directive-translate-on ()
-  "Insert directive 'translate_on'."
+  "Insert directive `translate_on'."
   (interactive)
   (vhdl-template-directive "translate_on"))
 
 (defun vhdl-template-directive-translate-off ()
-  "Insert directive 'translate_off'."
+  "Insert directive `translate_off'."
   (interactive)
   (vhdl-template-directive "translate_off"))
 
 (defun vhdl-template-directive-synthesis-on ()
-  "Insert directive 'synthesis_on'."
+  "Insert directive `synthesis_on'."
   (interactive)
   (vhdl-template-directive "synthesis_on"))
 
 (defun vhdl-template-directive-synthesis-off ()
-  "Insert directive 'synthesis_off'."
+  "Insert directive `synthesis_off'."
   (interactive)
   (vhdl-template-directive "synthesis_off"))
 
@@ -13307,7 +13307,7 @@ File statistics: \"%s\"\n\
 
 (defconst vhdl-font-lock-syntactic-keywords
   '(("\\('\\).\\('\\)" (1 (7 . ?\')) (2 (7 . ?\'))))
-  "Mark single quotes as having string quote syntax in 'c' instances.")
+  "Mark single quotes as having string quote syntax in `c' instances.")
 
 (defvar vhdl-font-lock-keywords nil
   "Regular expressions to highlight in VHDL Mode.")
@@ -17760,7 +17760,7 @@ Release Notes for VHDL Mode 3.37
   - Context declaration
   - Block comments
   - Directives
-  - 'all' keyword in sensitivity list
+  - `all' keyword in sensitivity list
 
 
 Release Notes for VHDL Mode 3.34
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 6a3b42f..abb9cc6 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -201,20 +201,22 @@ LENGTH is the match length, in characters."
 
 ;;; API
 
-;; We make the etags backend the default for now, until something
-;; better comes along.
-(defvar xref-backend-functions (list #'xref--etags-backend)
+(defvar xref-backend-functions nil
   "Special hook to find the xref backend for the current context.
 Each functions on this hook is called in turn with no arguments
 and should return either nil to mean that it is not applicable,
 or an xref backend, which is a value to be used to dispatch the
 generic functions.")
 
+;; We make the etags backend the default for now, until something
+;; better comes along.  Use APPEND so that any `add-hook' calls made
+;; before this package is loaded put new items before this one.
+(add-hook 'xref-backend-functions #'etags--xref-backend t)
+
+;;;###autoload
 (defun xref-find-backend ()
   (run-hook-with-args-until-success 'xref-backend-functions))
 
-(defun xref--etags-backend () 'etags)
-
 (cl-defgeneric xref-backend-definitions (backend identifier)
   "Find definitions of IDENTIFIER.
 
@@ -230,10 +232,21 @@ IDENTIFIER can be any string returned by
 
 To create an xref object, call `xref-make'.")
 
-(cl-defgeneric xref-backend-references (backend identifier)
+(cl-defgeneric xref-backend-references (_backend identifier)
   "Find references of IDENTIFIER.
 The result must be a list of xref objects.  If no references can
-be found, return nil.")
+be found, return nil.
+
+The default implementation uses `semantic-symref-tool-alist' to
+find a search tool; by default, this uses \"find | grep\" in the
+`project-current' roots."
+  (cl-mapcan
+   (lambda (dir)
+     (xref-collect-references identifier dir))
+   (let ((pr (project-current t)))
+     (append
+      (project-roots pr)
+      (project-external-roots pr)))))
 
 (cl-defgeneric xref-backend-apropos (backend pattern)
   "Find all symbols that match PATTERN.
@@ -345,10 +358,10 @@ elements is negated."
   (interactive)
   (let ((ring xref--marker-ring))
     (when (ring-empty-p ring)
-      (error "Marker stack is empty"))
+      (user-error "Marker stack is empty"))
     (let ((marker (ring-remove ring 0)))
       (switch-to-buffer (or (marker-buffer marker)
-                            (error "The marked buffer has been deleted")))
+                            (user-error "The marked buffer has been deleted")))
       (goto-char (marker-position marker))
       (set-marker marker nil nil)
       (run-hooks 'xref-after-return-hook))))
@@ -498,7 +511,9 @@ WINDOW controls how the buffer is displayed:
                 (save-excursion
                   (let* ((loc (xref-item-location item))
                          (beg (xref-location-marker loc))
-                         (len (xref-match-length item)))
+                         (end (move-marker (make-marker)
+                                           (+ beg (xref-match-length item))
+                                           (marker-buffer beg))))
                     ;; Perform sanity check first.
                     (xref--goto-location loc)
                     ;; FIXME: The check should probably be a generic
@@ -510,17 +525,18 @@ WINDOW controls how the buffer is displayed:
                                     (line-end-position))
                                    (xref-item-summary item))
                       (user-error "Search results out of date"))
-                    (push (cons beg len) pairs)))))
+                    (push (cons beg end) pairs)))))
             (setq pairs (nreverse pairs)))
           (unless pairs (user-error "No suitable matches here"))
           (xref--query-replace-1 from to pairs))
       (dolist (pair pairs)
-        (move-marker (car pair) nil)))))
+        (move-marker (car pair) nil)
+        (move-marker (cdr pair) nil)))))
 
 ;; FIXME: Write a nicer UI.
 (defun xref--query-replace-1 (from to pairs)
   (let* ((query-replace-lazy-highlight nil)
-         current-beg current-len current-buf
+         current-beg current-end current-buf
          ;; Counteract the "do the next match now" hack in
          ;; `perform-replace'.  And still, it'll report that those
          ;; matches were "filtered out" at the end.
@@ -529,18 +545,18 @@ WINDOW controls how the buffer is displayed:
             (and current-beg
                  (eq (current-buffer) current-buf)
                  (>= beg current-beg)
-                 (<= end (+ current-beg current-len)))))
+                 (<= end current-end))))
          (replace-re-search-function
           (lambda (from &optional _bound noerror)
             (let (found pair)
               (while (and (not found) pairs)
                 (setq pair (pop pairs)
                       current-beg (car pair)
-                      current-len (cdr pair)
+                      current-end (cdr pair)
                       current-buf (marker-buffer current-beg))
                 (pop-to-buffer current-buf)
                 (goto-char current-beg)
-                (when (re-search-forward from (+ current-beg current-len) 
noerror)
+                (when (re-search-forward from current-end noerror)
                   (setq found t)))
               found))))
     ;; FIXME: Despite this being a multi-buffer replacement, `N'
@@ -870,7 +886,7 @@ IGNORES is a list of glob patterns."
               hits)))
     (unwind-protect
         (cl-mapcan (lambda (hit) (xref--collect-matches hit regexp))
-                   (nreverse hits))
+                   hits)
       ;; TODO: Same as above.
       (mapc #'kill-buffer
             (cl-set-difference (buffer-list) orig-buffers)))))
diff --git a/lisp/ps-bdf.el b/lisp/ps-bdf.el
index 8fd0dbb..e45d0f4 100644
--- a/lisp/ps-bdf.el
+++ b/lisp/ps-bdf.el
@@ -44,7 +44,7 @@
       (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\")."
+The default value is (\"/usr/local/share/emacs/fonts/bdf\")."
   :type '(repeat :tag "BDF font directory list"
                 (directory :tag "BDF font directory"))
   :group 'ps-print-miscellany)
diff --git a/lisp/ps-print.el b/lisp/ps-print.el
index b29894d..c0c3d5f 100644
--- a/lisp/ps-print.el
+++ b/lisp/ps-print.el
@@ -3234,7 +3234,7 @@ in the PostScript array HeaderLinesLeft.
 
 Strings are inserted unchanged into the array; those representing
 PostScript string literals should be delimited with PostScript string
-delimiters '(' and ')'.
+delimiters `(' and `)'.
 
 For symbols with bound functions, the function is called and should return a
 string to be inserted into the array.  For symbols with bound values, the value
@@ -3288,8 +3288,8 @@ The value should be a list of strings and symbols, each 
representing an entry
 in the PostScript array FooterLinesLeft.
 
 Strings are inserted unchanged into the array; those representing PostScript
-string literals should be delimited with PostScript string delimiters '(' and
-')'.
+string literals should be delimited with PostScript string delimiters `(' and
+`)'.
 
 For symbols with bound functions, the function is called and should return a
 string to be inserted into the array.  For symbols with bound values, the value
@@ -3603,7 +3603,7 @@ image in a file with that name."
 (defun ps-line-lengths ()
   "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\n\", length($0), $0}' | sort -r | head"
+Try: pr -t file | awk \\='{printf \"%3d %s\n\", length($0), $0}\\=' | sort -r 
| head"
   (interactive)
   (ps-line-lengths-internal))
 
@@ -4310,7 +4310,7 @@ which long lines wrap around."
 (defun ps-line-lengths-internal ()
   "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\n\", length($0), $0}' | sort -r | head"
+Try: pr -t file | awk \\='{printf \"%3d %s\n\", length($0), $0}\\=' | sort -r 
| head"
   (let* ((ps-font-size-internal
          (or ps-font-size-internal
              (ps-get-font-size 'ps-font-size)))
diff --git a/lisp/replace.el b/lisp/replace.el
index b6802ae..d48f4f3 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -34,9 +34,11 @@
   :group 'matching)
 
 (defcustom replace-character-fold nil
-  "Non-nil means `query-replace' should do character folding in matches.
+  "Non-nil means replacement commands should do character folding in matches.
 This means, for instance, that \\=' will match a large variety of
-unicode quotes."
+unicode quotes.
+This variable affects `query-replace' and `replace-string', but not
+`replace-regexp'."
   :type 'boolean
   :group 'matching
   :version "25.1")
@@ -111,7 +113,8 @@ strings or patterns."
   :version "22.1")
 
 (defcustom query-replace-show-replacement t
-  "Non-nil means to show what actual replacement text will be."
+  "Non-nil means show substituted replacement text in the minibuffer.
+This variable affects only `query-replace-regexp'."
   :type 'boolean
   :group 'matching
   :version "23.1")
@@ -314,6 +317,10 @@ If `replace-lax-whitespace' is non-nil, a space or spaces 
in the string
 to be replaced will match a sequence of whitespace chars defined by the
 regexp in `search-whitespace-regexp'.
 
+If `replace-character-fold' is non-nil, matching uses character folding,
+i.e. it ignores diacritics and other differences between equivalent
+character strings.
+
 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
 only matches surrounded by word boundaries.  A negative prefix arg means
 replace backward.
@@ -372,6 +379,8 @@ If `replace-regexp-lax-whitespace' is non-nil, a space or 
spaces in the regexp
 to be replaced will match a sequence of whitespace chars defined by the
 regexp in `search-whitespace-regexp'.
 
+This function is not affected by `replace-character-fold'.
+
 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
 only matches surrounded by word boundaries.  A negative prefix arg means
 replace backward.
@@ -460,6 +469,8 @@ If `replace-regexp-lax-whitespace' is non-nil, a space or 
spaces in the regexp
 to be replaced will match a sequence of whitespace chars defined by the
 regexp in `search-whitespace-regexp'.
 
+This function is not affected by `replace-character-fold'.
+
 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
 only matches that are surrounded by word boundaries.
 Fourth and fifth arg START and END specify the region to operate on."
@@ -551,6 +562,10 @@ If `replace-lax-whitespace' is non-nil, a space or spaces 
in the string
 to be replaced will match a sequence of whitespace chars defined by the
 regexp in `search-whitespace-regexp'.
 
+If `replace-character-fold' is non-nil, matching uses character folding,
+i.e. it ignores diacritics and other differences between equivalent
+character strings.
+
 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
 only matches surrounded by word boundaries.  A negative prefix arg means
 replace backward.
@@ -602,6 +617,8 @@ If `replace-regexp-lax-whitespace' is non-nil, a space or 
spaces in the regexp
 to be replaced will match a sequence of whitespace chars defined by the
 regexp in `search-whitespace-regexp'.
 
+This function is not affected by `replace-character-fold'
+
 In Transient Mark mode, if the mark is active, operate on the contents
 of the region.  Otherwise, operate from point to the end of the buffer.
 
@@ -1416,6 +1433,17 @@ See also `multi-occur'."
                               buf))
                           (buffer-list))))))
 
+(defun occur-regexp-descr (regexp)
+  (format " for %s\"%s\""
+          (or (get-text-property 0 'isearch-regexp-function-descr regexp)
+              "")
+          (if (get-text-property 0 'isearch-string regexp)
+              (propertize
+               (query-replace-descr
+                (get-text-property 0 'isearch-string regexp))
+               'help-echo regexp)
+            (query-replace-descr regexp))))
+
 (defun occur-1 (regexp nlines bufs &optional buf-name)
   (unless (and regexp (not (equal regexp "")))
     (error "Occur doesn't work with the empty regexp"))
@@ -1484,9 +1512,11 @@ See also `multi-occur'."
                     (if (= count 1) "" "es")
                     ;; Don't display regexp if with remaining text
                     ;; it is longer than window-width.
-                    (if (> (+ (length regexp) 42) (window-width))
-                        "" (format-message
-                             " for `%s'" (query-replace-descr regexp)))))
+                    (if (> (+ (length (or (get-text-property 0 'isearch-string 
regexp)
+                                          regexp))
+                              42)
+                           (window-width))
+                        "" (occur-regexp-descr regexp))))
          (setq occur-revert-arguments (list regexp nlines bufs))
           (if (= count 0)
               (kill-buffer occur-buf)
@@ -1547,6 +1577,9 @@ See also `multi-occur'."
                    ;; Highlight the matches
                    (let ((len (length curstring))
                          (start 0))
+                     ;; Count empty lines that don't use next loop (Bug#22062).
+                     (when (zerop len)
+                       (setq matches (1+ matches)))
                      (while (and (< start len)
                                  (string-match regexp curstring start))
                        (setq matches (1+ matches))
@@ -1647,8 +1680,7 @@ See also `multi-occur'."
                                                  lines (if (= lines 1) "" 
"s")))
                                   ;; Don't display regexp for multi-buffer.
                                   (if (> (length buffers) 1)
-                                      "" (format " for \"%s\""
-                                                 (query-replace-descr regexp)))
+                                      "" (occur-regexp-descr regexp))
                                   (buffer-name buf))
                           'read-only t))
                  (setq end (point))
@@ -1661,14 +1693,14 @@ See also `multi-occur'."
        (goto-char (point-min))
        (let ((beg (point))
              end)
-         (insert (format "%d match%s%s total for \"%s\":\n"
+         (insert (format "%d match%s%s total%s:\n"
                          global-matches (if (= global-matches 1) "" "es")
                          ;; Don't display the same number of lines
                          ;; and matches in case of 1 match per line.
                          (if (= global-lines global-matches)
                              "" (format " in %d line%s"
                                         global-lines (if (= global-lines 1) "" 
"s")))
-                         (query-replace-descr regexp)))
+                         (occur-regexp-descr regexp)))
          (setq end (point))
          (when title-face
            (add-face-text-property beg end title-face)))
@@ -1979,6 +2011,9 @@ passed in.  If LITERAL is set, no checking is done, 
anyway."
   (when backward (goto-char (nth 0 match-data)))
   noedit)
 
+(defvar replace-update-post-hook nil
+  "Function(s) to call after query-replace has found a match in the buffer.")
+
 (defvar replace-search-function nil
   "Function to use when searching for strings to replace.
 It is used by `query-replace' and `replace-string', and is called
@@ -2232,7 +2267,7 @@ It must return a string."
                (and nonempty-match
                     (or (not regexp-flag)
                         (and (if backward
-                                 (looking-back search-string)
+                                 (looking-back search-string nil)
                                (looking-at search-string))
                              (let ((match (match-data)))
                                (and (/= (nth 0 match) (nth 1 match))
@@ -2286,7 +2321,8 @@ It must return a string."
                ;; `real-match-data'.
                (while (not done)
                  (set-match-data real-match-data)
-                 (replace-highlight
+                  (run-hooks 'replace-update-post-hook) ; Before 
`replace-highlight'.
+                  (replace-highlight
                   (match-beginning 0) (match-end 0)
                   start end search-string
                   regexp-flag delimited-flag case-fold-search backward)
diff --git a/lisp/saveplace.el b/lisp/saveplace.el
index fe54743..5bbcd79 100644
--- a/lisp/saveplace.el
+++ b/lisp/saveplace.el
@@ -158,6 +158,8 @@ file:
 \(setq-default save-place t)"
   (interactive "P")
   (if (not (or buffer-file-name (and (derived-mode-p 'dired-mode)
+                                     (boundp 'dired-subdir-alist)
+                                    dired-subdir-alist
                                     (dired-current-directory))))
       (message "Buffer `%s' not visiting a file or directory" (buffer-name))
     (setq save-place (if parg
@@ -178,6 +180,8 @@ file:
   ;; will be saved again when Emacs is killed.
   (or save-place-loaded (load-save-place-alist-from-file))
   (let* ((directory (and (derived-mode-p 'dired-mode)
+                         (boundp 'dired-subdir-alist)
+                        dired-subdir-alist
                         (dired-current-directory)))
         (item (or buffer-file-name
                   (and directory
@@ -310,6 +314,8 @@ may have changed) back to `save-place-alist'."
        ;; save-place checks buffer-file-name too, but we can avoid
        ;; overhead of function call by checking here too.
        (and (or buffer-file-name (and (derived-mode-p 'dired-mode)
+                                       (boundp 'dired-subdir-alist)
+                                      dired-subdir-alist
                                       (dired-current-directory)))
             (save-place-to-alist))
        (setq buf-list (cdr buf-list))))))
@@ -331,6 +337,8 @@ may have changed) back to `save-place-alist'."
   "Position the point in a Dired buffer."
   (or save-place-loaded (load-save-place-alist-from-file))
   (let* ((directory (and (derived-mode-p 'dired-mode)
+                         (boundp 'dired-subdir-alist)
+                        dired-subdir-alist
                         (dired-current-directory)))
         (cell (assoc (and directory
                           (expand-file-name (if (consp directory)
diff --git a/lisp/scroll-all.el b/lisp/scroll-all.el
index 9c2d1fb..a8f75d3 100644
--- a/lisp/scroll-all.el
+++ b/lisp/scroll-all.el
@@ -33,7 +33,7 @@
 
 ;; Suggestions/ideas from:
 ;;    Rick Macdonald <address@hidden>
-;;    Anders Lindgren <address@hidden>
+;;    Anders Lindgren
 
 ;;; Code:
 
diff --git a/lisp/server.el b/lisp/server.el
index 59fd973..35243ae 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -1172,7 +1172,7 @@ The following commands are accepted by the client:
                    ;; Allow Cygwin's emacsclient to be used as a file
                    ;; handler on MS-Windows, in which case FILENAME
                    ;; might start with a drive letter.
-                   (when (and (eq system-type 'cygwin)
+                   (when (and (fboundp 'cygwin-convert-file-name-from-windows)
                               (string-match "\\`[A-Za-z]:" file))
                      (setq file (cygwin-convert-file-name-from-windows file)))
                    (setq file (expand-file-name file dir))
diff --git a/lisp/ses.el b/lisp/ses.el
index ec1359b..86b0ae6 100644
--- a/lisp/ses.el
+++ b/lisp/ses.el
@@ -336,7 +336,7 @@ default printer and then modify its output.")
   '(ses--col-widths  -5 ses--col-printers -4 ses--default-printer -3
     ses--header-row  -2 ses--file-format   1 ses--numrows          2
     ses--numcols      3 ses--numlocprn     4)
-  "Offsets from 'Global parameters' line to various parameter lines in the
+  "Offsets from \"Global parameters\" line to various parameter lines in the
 data area of a spreadsheet.")
 
 (defconst ses-paramfmt-plist
@@ -348,7 +348,7 @@ data area of a spreadsheet.")
     ses--numrows          " %S ;numrows"
     ses--numcols          " %S ;numcols"
     ses--numlocprn        " %S ;numlocprn")
-  "Formats of 'Global parameters' various parameters in the data
+  "Formats of \"Global parameters\" various parameters in the data
 area of a spreadsheet.")
 
 ;;
@@ -361,8 +361,8 @@ area of a spreadsheet.")
 
 (defvar ses-relocate-return nil
   "Set by `ses-relocate-formula' and `ses-relocate-range', read by
-`ses-relocate-all'.  Set to 'delete if a cell-reference was deleted from a
-formula--so the formula needs recalculation.  Set to 'range if the size of a
+`ses-relocate-all'.  Set to `delete' if a cell-reference was deleted from a
+formula--so the formula needs recalculation.  Set to `range' if the size of a
 `ses-range' was changed--so both the formula's value and list of dependents
 need to be recalculated.")
 
@@ -672,7 +672,7 @@ checking that it is a valid printer function."
       (add-to-list 'ses-read-printer-history (prin1-to-string printer))))
 
 (defun ses-formula-record (formula)
-  "If FORMULA is of the form 'symbol, add it to the list of symbolic formulas
+  "If FORMULA is of the form \\='SYMBOL, add it to the list of symbolic 
formulas
 for this spreadsheet."
   (when (and (eq (car-safe formula) 'quote)
             (symbolp (cadr formula)))
@@ -688,7 +688,7 @@ for this spreadsheet."
       (concat (ses-column-letter (1- (/ col 26))) units))))
 
 (defun ses-create-cell-symbol (row col)
-  "Produce a symbol that names the cell (ROW,COL).  (0,0) => 'A1."
+  "Produce a symbol that names the cell (ROW,COL).  (0,0) => A1."
   (intern (concat (ses-column-letter col) (number-to-string (1+ row)))))
 
 (defun ses-decode-cell-symbol (str)
@@ -1114,12 +1114,10 @@ region, or nil if cursor is not at a cell."
 
 (defun ses-check-curcell (&rest args)
   "Signal an error if `ses--curcell' is inappropriate.
-The end marker is appropriate if some argument is 'end.
-A range is appropriate if some argument is 'range.
-A single cell is appropriate unless some argument is 'needrange."
-  (if (eq ses--curcell t)
-      ;; curcell recalculation was postponed, but user typed ahead.
-      (ses-set-curcell))
+The end marker is appropriate if some argument is `end'.
+A range is appropriate if some argument is `range'.
+A single cell is appropriate unless some argument is `needrange'."
+  (ses-set-curcell); fix  bug#21054
   (cond
    ((not ses--curcell)
     (or (memq 'end args)
@@ -1285,7 +1283,7 @@ printer signaled one (and \"%s\" is used as the default 
printer), else nil."
                           (and locprn
                                (ses--locprn-compiled locprn))))
                    printer)
-               (or value "")))
+               value))
        (if (stringp value)
            value
          (or (stringp (car-safe value))
@@ -1497,7 +1495,7 @@ If ROWINCR or COLINCR is negative, references to cells 
being deleted are
 removed.  Example:
        (ses-relocate-formula \\='(+ A1 B2 D3) 0 1 0 -1)
        => (+ A1 C3)
-Sets `ses-relocate-return' to 'delete if cell-references were removed."
+Sets `ses-relocate-return' to `delete' if cell-references were removed."
   (let (rowcol result)
     (if (or (atom formula) (eq (car formula) 'quote))
        (if (and (setq rowcol (ses-sym-rowcol formula))
@@ -1533,7 +1531,7 @@ Sets `ses-relocate-return' to 'delete if cell-references 
were removed."
       (nreverse result))))
 
 (defun ses-relocate-range (range startrow startcol rowincr colincr)
-  "Relocate one RANGE, of the form '(ses-range min max).  Cells starting
+  "Relocate one RANGE, of the form (SES-RANGE MIN MAX).  Cells starting
 at (STARTROW,STARTCOL) are being shifted by (ROWINCR,COLINCR).  Result is the
 new range, or nil if the entire range is deleted.  If new rows are being added
 just beyond the end of a row range, or new columns just beyond a column range,
@@ -2861,7 +2859,7 @@ SES attributes recording the contents of the cell as of 
the time of copying."
 
 (defun ses-copy-region-helper (line)
   "Converts one line (of a rectangle being extracted from a spreadsheet) to
-external form by attaching to each print cell a 'ses attribute that records
+external form by attaching to each print cell a `ses' attribute that records
 the corresponding data cell."
   (or (> (length line) 1)
       (error "Empty range"))
@@ -2907,7 +2905,7 @@ We clear the killed cells instead of deleting them."
 (defun ses--advice-yank (yank-fun &optional arg &rest args)
   "In SES mode, the yanked text is inserted as cells.
 
-If the text contains 'ses attributes (meaning it went to the kill-ring from a
+If the text contains `ses' attributes (meaning it went to the kill-ring from a
 SES buffer), the formulas and print functions are restored for the cells.  If
 the text contains tabs, this is an insertion of tab-separated formulas.
 Otherwise the text is inserted as the formula for the current cell.
@@ -2919,7 +2917,7 @@ prefix to specify insertion without relocation, which is 
best when the
 formulas refer to cells outside the yanked text.
 
 When inserting formulas, the text is treated as a string constant if it doesn't
-make sense as a sexp or would otherwise be considered a symbol.  Use 'sym to
+make sense as a sexp or would otherwise be considered a symbol.  Use `sym' to
 explicitly insert a symbol, or use the C-u prefix to treat all unmarked words
 as symbols."
   (if (not (and (derived-mode-p 'ses-mode)
@@ -2962,7 +2960,7 @@ previous insertion."
   (setq this-command 'yank))
 
 (defun ses-yank-cells (text arg)
-  "If the TEXT has a proper set of 'ses attributes, insert the text as
+  "If the TEXT has a proper set of `ses' attributes, insert the text as
 cells, else return nil.  The cells are reprinted--the supplied text is
 ignored because the column widths, default printer, etc. at yank time might
 be different from those at kill-time.  ARG is a list to indicate that
@@ -3410,15 +3408,17 @@ highlighted range in the spreadsheet."
     (setf (ses-cell--symbol cell) new-name)
     (makunbound sym)
     (and curcell (setq ses--curcell new-name))
-    (let* ((pos (point))
-          (inhibit-read-only t)
-          (col (current-column))
-          (end (save-excursion
-                 (move-to-column (1+ col))
-                 (if (eolp)
-                     (+ pos (ses-col-width col) 1)
-                   (point)))))
-      (put-text-property pos end 'cursor-intangible new-name))
+    (save-excursion
+      (or curcell (ses-goto-print row col))
+      (let* ((pos (point))
+             (inhibit-read-only t)
+             (end (progn
+                    (move-to-column (+ (current-column) (ses-col-width col)))
+                    (if (eolp)
+                        (+ pos (ses-col-width col) 1)
+                      (forward-char)
+                      (point)))))
+        (put-text-property pos end 'cursor-intangible new-name)))
     ;; Update the cell name in the mode-line.
     (force-mode-line-update)))
 
@@ -3558,7 +3558,7 @@ is read and how it is formatted.
 In the sequel we assume that cells A1, B1, A2 B2 have respective values
 1 2 3 and 4.
 
-Readout direction is specified by a `>v', '`>^', `<v', `<^',
+Readout direction is specified by a `>v', `>^', `<v', `<^',
 `v>', `v<', `^>', `^<' flag.  For historical reasons, in absence
 of such a flag, a default direction of `^<' is assumed.  This
 way `(ses-range A1 B2 ^>)' will evaluate to `(1 3 2 4)',
diff --git a/lisp/simple.el b/lisp/simple.el
index deb5c88..a22fe03 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -458,27 +458,18 @@ A non-nil INTERACTIVE argument means to run the 
`post-self-insert-hook'."
        (put-text-property from (point) 'rear-nonsticky
                           (cons 'hard sticky)))))
 
-(declare-function electric-indent-just-newline "electric")
-(defun open-line (n &optional interactive)
+(defun open-line (n)
   "Insert a newline and leave point before it.
-If `electric-indent-mode' is enabled, indent the new line if it's
-not empty.
 If there is a fill prefix and/or a `left-margin', insert them on
-the new line.  If the old line would have been blank, insert them
-on the old line as well.
-
-With arg N, insert N newlines.
-A non-nil INTERACTIVE argument means to run the `post-self-insert-hook'."
-  (interactive "*p\np")
+the new line if the line would have been blank.
+With arg N, insert N newlines."
+  (interactive "*p")
   (let* ((do-fill-prefix (and fill-prefix (bolp)))
         (do-left-margin (and (bolp) (> (current-left-margin) 0)))
         (loc (point-marker))
          ;; Don't expand an abbrev before point.
         (abbrev-mode nil))
-    (if (and interactive
-             (looking-at-p "[[:space:]]*$"))
-        (electric-indent-just-newline n)
-      (newline n interactive))
+    (newline n)
     (goto-char loc)
     (while (> n 0)
       (cond ((bolp)
@@ -983,7 +974,8 @@ If DELETE is `delete-only', then only delete the region and 
the return value
 is undefined.  If DELETE is nil, just return the content as a string.
 If DELETE is `bounds', then don't delete, but just return the
 boundaries of the region as a list of (START . END) positions.
-If anything else, delete the region and return its content as a string.")
+If anything else, delete the region and return its content as a string,
+after filtering it with `filter-buffer-substring'.")
 
 (defvar region-insert-function
   (lambda (lines)
@@ -1008,6 +1000,10 @@ Optional second arg KILLFLAG, if non-nil, means to kill 
(save in
 kill ring) instead of delete.  Interactively, N is the prefix
 arg, and KILLFLAG is set if N is explicitly specified.
 
+When killing, the killed text is filtered by
+`filter-buffer-substring' before it is saved in the kill ring, so
+the actual saved text might be different from what was killed.
+
 In Overwrite mode, single character backward deletion may replace
 tabs with spaces so as to back over columns, unless point is at
 the end of the line."
@@ -1043,7 +1039,11 @@ To disable this, set variable `delete-active-region' to 
nil.
 
 Optional second arg KILLFLAG non-nil means to kill (save in kill
 ring) instead of delete.  Interactively, N is the prefix arg, and
-KILLFLAG is set if N was explicitly specified."
+KILLFLAG is set if N was explicitly specified.
+
+When killing, the killed text is filtered by
+`filter-buffer-substring' before it is saved in the kill ring, so
+the actual saved text might be different from what was killed."
   (declare (interactive-only delete-char))
   (interactive "p\nP")
   (unless (integerp n)
@@ -2811,7 +2811,7 @@ an amalgamating command.  The car of the list is the 
number of
 times an amalgamating command has been called, and the cdr are the
 buffers that were changed during the last command.")
 
-(defvar undo-auto--current-boundary-timer nil
+(defvar undo-auto-current-boundary-timer nil
   "Current timer which will run `undo-auto--boundary-timer' or nil.
 
 If set to non-nil, this will effectively disable the timer.")
@@ -2819,7 +2819,7 @@ If set to non-nil, this will effectively disable the 
timer.")
 (defvar undo-auto--this-command-amalgamating nil
   "Non-nil if `this-command' should be amalgamated.
 This variable is set to nil by `undo-auto--boundaries' and is set
-by `undo-auto--amalgamate'." )
+by `undo-auto-amalgamate'." )
 
 (defun undo-auto--needs-boundary-p ()
   "Return non-nil if `buffer-undo-list' needs a boundary at the start."
@@ -2829,7 +2829,7 @@ by `undo-auto--amalgamate'." )
   "Return the number of amalgamating last commands or nil.
 Amalgamating commands are, by default, either
 `self-insert-command' and `delete-char', but can be any command
-that calls `undo-auto--amalgamate'."
+that calls `undo-auto-amalgamate'."
   (car-safe undo-auto--last-boundary-cause))
 
 (defun undo-auto--ensure-boundary (cause)
@@ -2860,13 +2860,13 @@ REASON describes the reason that the boundary is being 
added; see
 
 (defun undo-auto--boundary-timer ()
   "Timer which will run `undo--auto-boundary-timer'."
-  (setq undo-auto--current-boundary-timer nil)
+  (setq undo-auto-current-boundary-timer nil)
   (undo-auto--boundaries 'timer))
 
 (defun undo-auto--boundary-ensure-timer ()
   "Ensure that the `undo-auto-boundary-timer' is set."
-  (unless undo-auto--current-boundary-timer
-    (setq undo-auto--current-boundary-timer
+  (unless undo-auto-current-boundary-timer
+    (setq undo-auto-current-boundary-timer
           (run-at-time 10 nil #'undo-auto--boundary-timer))))
 
 (defvar undo-auto--undoably-changed-buffers nil
@@ -2881,14 +2881,15 @@ See also `undo-auto--buffer-undoably-changed'.")
 (defun undo-auto--add-boundary ()
   "Add an `undo-boundary' in appropriate buffers."
   (undo-auto--boundaries
-   (if undo-auto--this-command-amalgamating
-       'amalgamate
-     'command))
-  (setq undo-auto--this-command-amalgamating nil))
+   (let ((amal undo-auto--this-command-amalgamating))
+       (setq undo-auto--this-command-amalgamating nil)
+       (if amal
+           'amalgamate
+         'command))))
 
-(defun undo-auto--amalgamate ()
+(defun undo-auto-amalgamate ()
   "Amalgamate undo if necessary.
-This function can be called after an amalgamating command.  It
+This function can be called before an amalgamating command.  It
 removes the previous `undo-boundary' if a series of such calls
 have been made.  By default `self-insert-command' and
 `delete-char' are the only amalgamating commands, although this
@@ -3359,13 +3360,12 @@ the use of a shell (with its need to quote arguments)."
            (shell-command-on-region (point) (point) command
                                     output-buffer nil error-buffer)))))))
 
-(defun display-message-or-buffer (message
-                                 &optional buffer-name not-this-window frame)
+(defun display-message-or-buffer (message &optional buffer-name action frame)
   "Display MESSAGE in the echo area if possible, otherwise in a pop-up buffer.
 MESSAGE may be either a string or a buffer.
 
-A buffer is displayed using `display-buffer' if MESSAGE is too long for
-the maximum height of the echo area, as defined by `max-mini-window-height'
+A pop-up buffer is displayed using `display-buffer' if MESSAGE is too long
+for maximum height of the echo area, as defined by `max-mini-window-height'
 if `resize-mini-windows' is non-nil.
 
 Returns either the string shown in the echo area, or when a pop-up
@@ -3377,8 +3377,8 @@ is used, defaulting to `*Message*'.  In the case where 
MESSAGE is a
 string and it is displayed in the echo area, it is not specified whether
 the contents are inserted into the buffer anyway.
 
-Optional arguments NOT-THIS-WINDOW and FRAME are as for `display-buffer',
-and only used if a buffer is displayed."
+Optional arguments ACTION and FRAME are as for `display-buffer',
+and are only used if a pop-up buffer is displayed."
   (cond ((and (stringp message) (not (string-match "\n" message)))
         ;; Trivial case where we can use the echo area
         (message "%s" message))
@@ -3424,8 +3424,7 @@ and only used if a buffer is displayed."
                   (t
                    ;; Buffer
                    (goto-char (point-min))
-                   (display-buffer (current-buffer)
-                                   not-this-window frame))))))))
+                   (display-buffer (current-buffer) action frame))))))))
 
 
 ;; We have a sentinel to prevent insertion of a termination message
@@ -3817,7 +3816,9 @@ see other processes running on the system, use 
`list-system-processes'."
 (setq prefix-command--last-echo nil)
 
 (defun internal-echo-keystrokes-prefix ()
-  ;; BEWARE: Called directly from the C code.
+  ;; BEWARE: Called directly from C code.
+  ;; If the return value is non-nil, it means we are in the middle of
+  ;; a command with prefix, such as a command invoked with prefix-arg.
   (if (not prefix-command--needs-update)
       prefix-command--last-echo
     (setq prefix-command--last-echo
@@ -4257,21 +4258,25 @@ The command \\[yank] can retrieve it from there.
 If you want to append the killed region to the last killed text,
 use \\[append-next-kill] before \\[kill-region].
 
+Any command that calls this function is a \"kill command\".
+If the previous command was also a kill command,
+the text killed this time appends to the text killed last time
+to make one entry in the kill ring.
+
+The killed text is filtered by `filter-buffer-substring' before it is
+saved in the kill ring, so the actual saved text might be different
+from what was killed.
+
 If the buffer is read-only, Emacs will beep and refrain from deleting
 the text, but put the text in the kill ring anyway.  This means that
 you can use the killing commands to copy text from a read-only buffer.
 
 Lisp programs should use this function for killing text.
  (To delete text, use `delete-region'.)
-Supply two arguments, character positions indicating the stretch of text
- to be killed.
-Any command that calls this function is a \"kill command\".
-If the previous command was also a kill command,
-the text killed this time appends to the text killed last time
-to make one entry in the kill ring.
-
-The optional argument REGION if non-nil, indicates that we're not just killing
-some text between BEG and END, but we're killing the region."
+Supply two arguments, character positions BEG and END indicating the
+ stretch of text to be killed.  If the optional argument REGION is
+ non-nil, the function ignores BEG and END, and kills the current
+ region instead."
   ;; Pass mark first, then point, because the order matters when
   ;; calling `kill-append'.
   (interactive (list (mark) (point) 'region))
@@ -4316,8 +4321,14 @@ In Transient Mark mode, deactivate the mark.
 If `interprogram-cut-function' is non-nil, also save the text for a window
 system cut and paste.
 
-The optional argument REGION if non-nil, indicates that we're not just copying
-some text between BEG and END, but we're copying the region.
+The copied text is filtered by `filter-buffer-substring' before it is
+saved in the kill ring, so the actual saved text might be different
+from what was in the buffer.
+
+When called from Lisp, save in the kill ring the stretch of text
+between BEG and END, unless the optional argument REGION is
+non-nil, in which case ignore BEG and END, and save the current
+region instead.
 
 This command's old key binding has been given to `kill-ring-save'."
   ;; Pass mark first, then point, because the order matters when
@@ -4342,8 +4353,14 @@ system cut and paste.
 If you want to append the killed line to the last killed text,
 use \\[append-next-kill] before \\[kill-ring-save].
 
-The optional argument REGION if non-nil, indicates that we're not just copying
-some text between BEG and END, but we're copying the region.
+The copied text is filtered by `filter-buffer-substring' before it is
+saved in the kill ring, so the actual saved text might be different
+from what was in the buffer.
+
+When called from Lisp, save in the kill ring the stretch of text
+between BEG and END, unless the optional argument REGION is
+non-nil, in which case ignore BEG and END, and save the current
+region instead.
 
 This command is similar to `copy-region-as-kill', except that it gives
 visual feedback indicating the extent of the region being copied."
@@ -8269,7 +8286,7 @@ backward.
 
 If set to nil, both Delete and Backspace keys delete backward.
 
-If set to 'maybe (which is the default), Emacs automatically
+If set to `maybe' (which is the default), Emacs automatically
 selects a behavior.  On window systems, the behavior depends on
 the keyboard used.  If the keyboard has both a Backspace key and
 a Delete key, and both are mapped to their usual meanings, the
diff --git a/lisp/speedbar.el b/lisp/speedbar.el
index 1743058..9d011e0 100644
--- a/lisp/speedbar.el
+++ b/lisp/speedbar.el
@@ -242,8 +242,8 @@ frame."
 
 (defcustom speedbar-query-confirmation-method 'all
   "Query control for file operations.
-The 'all flag means to always query before file operations.
-The 'none-but-delete flag means to not query before any file
+The `all' flag means to always query before file operations.
+The `none-but-delete' flag means to not query before any file
 operations, except before a file deletion."
   :group 'speedbar
   :type '(radio (const :tag "Always Query before some file operations."
@@ -392,8 +392,8 @@ display is used instead."
 
 (defcustom speedbar-default-position 'left-right
   "Default position of the speedbar frame.
-Possible values are 'left, 'right or 'left-right.
-If value is 'left-right, the most suitable location is
+Possible values are `left', `right' or `left-right'.
+If value is `left-right', the most suitable location is
 determined automatically."
   :group 'speedbar
   :type '(radio (const :tag "Automatic" left-right)
@@ -1989,7 +1989,7 @@ INDEX is not used, but is required by the caller."
 This is the button that expands or contracts a node (if applicable),
 and EXP-BUTTON-CHAR the character in it (+, -, ?, etc).  EXP-BUTTON-FUNCTION
 is the function to call if it's clicked on.  Button types are
-'bracket, 'angle, 'curly, 'expandtag, 'statictag, t, or nil.
+`bracket', `angle', `curly', `expandtag', `statictag', t, or nil.
 EXP-BUTTON-DATA is extra data attached to the text forming the expansion
 button.
 
@@ -2061,7 +2061,7 @@ position to insert a new item, and that the new item will 
end with a CR."
   "Insert list of FILES starting at point, and indenting all files to LEVEL.
 Tag expandable items with a +, otherwise a ?.  Don't highlight ? as we
 don't know how to manage them.  The input parameter FILES is a cons
-cell of the form ( 'DIRLIST . 'FILELIST )."
+cell of the form (DIRLIST . FILELIST)."
   ;; Start inserting all the directories
   (let ((dirs (car files)))
     (while dirs
@@ -2341,7 +2341,7 @@ Argument LST is the list of tags to trim."
       (append newlst trimlst))))
 
 (defun speedbar-simple-group-tag-hierarchy (lst)
-  "Create a simple 'Tags' group with orphaned tags.
+  "Create a simple `Tags' group with orphaned tags.
 Argument LST is the list of tags to sort into groups."
   (let ((newlst nil)
        (sublst nil))
@@ -3469,7 +3469,7 @@ TOKEN will be the list, and INDENT is the current 
indentation level."
 ;;
 (defcustom speedbar-select-frame-method 'attached
   "Specify how to select a frame for displaying a file.
-A value of 'attached means to use the attached frame (the frame
+A value of `attached' means to use the attached frame (the frame
 that speedbar was started from.)  A number such as 1 or -1 means to
 pass that number to `other-frame' while selecting a frame from speedbar."
   :group 'speedbar
diff --git a/lisp/startup.el b/lisp/startup.el
index 1346310..20f25a8 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -544,7 +544,11 @@ It is the default value of the variable `top-level'."
            (set-buffer elt)
            (if default-directory
                (setq default-directory
-                     (decode-coding-string default-directory coding t)))))
+                      (if (eq system-type 'windows-nt)
+                          ;; Convert backslashes to forward slashes.
+                          (expand-file-name
+                           (decode-coding-string default-directory coding t))
+                        (decode-coding-string default-directory coding t))))))
 
        ;; Decode all the important variables and directory lists, now
        ;; that we know the locale's encoding.  This is because the
@@ -1426,9 +1430,8 @@ settings will be marked as \"CHANGED outside of 
Customize\"."
       (put 'cursor 'face-modified t))))
 
 (defcustom initial-scratch-message (purecopy "\
-;; This buffer is for notes you don't want to save, and for Lisp evaluation.
-;; If you want to create a file, visit that file with \\[find-file],
-;; then enter the text in that file's own buffer.
+;; This buffer is for text that is not saved, and for Lisp evaluation.
+;; To create a file, visit it with \\[find-file] and enter text in its buffer.
 
 ")
   "Initial documentation displayed in *scratch* buffer at startup.
diff --git a/lisp/subr.el b/lisp/subr.el
index ea926ae..860c14c 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -3908,7 +3908,7 @@ If the feature is provided when evaluating code not 
associated with a
 file, FORM is evaluated immediately after the provide statement.
 
 Usually FILE is just a library name like \"font-lock\" or a feature name
-like 'font-lock.
+like `font-lock'.
 
 This function makes or adds to an entry on `after-load-alist'."
   (declare (compiler-macro
@@ -4686,14 +4686,14 @@ Usually the separator is \".\", but it can be any other 
string.")
 
 
 (defconst version-regexp-alist
-  '(("^[-_+ ]?snapshot$"                                 . -4)
+  '(("^[-._+ ]?snapshot$"                                 . -4)
     ;; treat "1.2.3-20050920" and "1.2-3" as snapshot releases
-    ("^[-_+]$"                                           . -4)
+    ("^[-._+]$"                                           . -4)
     ;; treat "1.2.3-CVS" as snapshot release
-    ("^[-_+ ]?\\(cvs\\|git\\|bzr\\|svn\\|hg\\|darcs\\)$" . -4)
-    ("^[-_+ ]?alpha$"                                    . -3)
-    ("^[-_+ ]?beta$"                                     . -2)
-    ("^[-_+ ]?\\(pre\\|rc\\)$"                           . -1))
+    ("^[-._+ ]?\\(cvs\\|git\\|bzr\\|svn\\|hg\\|darcs\\)$" . -4)
+    ("^[-._+ ]?alpha$"                                    . -3)
+    ("^[-._+ ]?beta$"                                     . -2)
+    ("^[-._+ ]?\\(pre\\|rc\\)$"                           . -1))
   "Specify association between non-numeric version and its priority.
 
 This association is used to handle version string like \"1.0pre2\",
@@ -4703,6 +4703,7 @@ non-numeric part of a version string to an integer.  For 
example:
    String Version    Integer List Version
    \"0.9snapshot\"     (0  9 -4)
    \"1.0-git\"         (1  0 -4)
+   \"1.0.cvs\"         (1  0 -4)
    \"1.0pre2\"         (1  0 -1 2)
    \"1.0PRE2\"         (1  0 -1 2)
    \"22.8beta3\"       (22 8 -2 3)
@@ -4742,41 +4743,47 @@ in `version-regexp-alist'.
 
 Examples of valid version syntax:
 
-   1.0pre2   1.0.7.5   22.8beta3   0.9alpha1   6.9.30Beta
+   1.0pre2   1.0.7.5   22.8beta3   0.9alpha1   6.9.30Beta   2.4.snapshot   .5
 
 Examples of invalid version syntax:
 
-   1.0prepre2   1.0..7.5   22.8X3   alpha3.2   .5
+   1.0prepre2   1.0..7.5   22.8X3   alpha3.2
 
 Examples of version conversion:
 
    Version String    Version as a List of Integers
-   \"1.0.7.5\"         (1  0  7 5)
-   \"1.0pre2\"         (1  0 -1 2)
-   \"1.0PRE2\"         (1  0 -1 2)
-   \"22.8beta3\"       (22 8 -2 3)
-   \"22.8Beta3\"       (22 8 -2 3)
-   \"0.9alpha1\"       (0  9 -3 1)
+   \".5\"              (0 5)
+   \"0.9 alpha\"       (0  9 -3)
    \"0.9AlphA1\"       (0  9 -3 1)
-   \"0.9alpha\"        (0  9 -3)
    \"0.9snapshot\"     (0  9 -4)
    \"1.0-git\"         (1  0 -4)
+   \"1.0.7.5\"         (1  0  7 5)
+   \"1.0.cvs\"         (1  0 -4)
+   \"1.0PRE2\"         (1  0 -1 2)
+   \"1.0pre2\"         (1  0 -1 2)
+   \"22.8 Beta3\"      (22 8 -2 3)
+   \"22.8beta3\"       (22 8 -2 3)
 
 See documentation for `version-separator' and `version-regexp-alist'."
-  (or (and (stringp ver) (> (length ver) 0))
-      (error "Invalid version string: `%s'" ver))
+  (unless (stringp ver)
+    (error "Version must be a string"))
   ;; Change .x.y to 0.x.y
   (if (and (>= (length ver) (length version-separator))
           (string-equal (substring ver 0 (length version-separator))
                         version-separator))
       (setq ver (concat "0" ver)))
+  (unless (string-match-p "^[0-9]" ver)
+    (error "Invalid version syntax: `%s' (must start with a number)" ver))
+
   (save-match-data
     (let ((i 0)
          (case-fold-search t)          ; ignore case in matching
          lst s al)
+      ;; Parse the version-string up to a separator until there are none left
       (while (and (setq s (string-match "[0-9]+" ver i))
                  (= s i))
-       ;; handle numeric part
+        ;; Add the numeric part to the beginning of the version list;
+        ;; lst gets reversed at the end
        (setq lst (cons (string-to-number (substring ver i (match-end 0)))
                        lst)
              i   (match-end 0))
@@ -4792,15 +4799,15 @@ See documentation for `version-separator' and 
`version-regexp-alist'."
              (setq al (cdr al)))
            (cond (al
                   (push (cdar al) lst))
-                 ;; Convert 22.3a to 22.3.1, 22.3b to 22.3.2, etc.
-                 ((string-match "^[-_+ ]?\\([a-zA-Z]\\)$" s)
+        ;; Convert 22.3a to 22.3.1, 22.3b to 22.3.2, etc., but only if
+        ;; the letter is the end of the version-string, to avoid
+        ;; 22.8X3 being valid
+        ((and (string-match "^[-._+ ]?\\([a-zA-Z]\\)$" s)
+           (= i (length ver)))
                   (push (- (aref (downcase (match-string 1 s)) 0) ?a -1)
                         lst))
                  (t (error "Invalid version syntax: `%s'" ver))))))
-      (if (null lst)
-         (error "Invalid version syntax: `%s'" ver)
-       (nreverse lst)))))
-
+    (nreverse lst))))
 
 (defun version-list-< (l1 l2)
   "Return t if L1, a list specification of a version, is lower than L2.
diff --git a/lisp/tempo.el b/lisp/tempo.el
index 93df15a..2fe76ab 100644
--- a/lisp/tempo.el
+++ b/lisp/tempo.el
@@ -147,7 +147,7 @@ disappears at the next keypress; otherwise, it remains 
forever."
   "List of functions to run when inserting a string.
 Each function is called with a single arg, STRING and should return
 another string.  This could be used for making all strings upcase by
-setting it to '(upcase), for example.")
+setting it to (upcase), for example.")
 
 (defvar tempo-tags nil
   "An association list with tags and corresponding templates.")
diff --git a/lisp/term.el b/lisp/term.el
index 41577c9..5dd965d 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -110,19 +110,6 @@
 ;;
 ;;             ----------------------------------------
 ;;
-;;  If you'd like to check out my complete configuration, you can download
-;; it from http://www.polito.it/~s64912/things.html, it's ~500k in size and
-;; contains my .cshrc, .emacs and my whole site-lisp subdirectory.  (notice
-;; that this term.el may be newer/older than the one in there, please
-;; check!)
-;;
-;;  This complete configuration contains, among other things, a complete
-;; rectangular marking solution (based on rect-mark.el and
-;; pc-bindings.el) and should be a good example of how extensively Emacs
-;; can be configured on a ppp-connected ws.
-;;
-;;             ----------------------------------------
-;;
 ;;  TODO:
 ;;
 ;;  - Add hooks to allow raw-mode keys to be configurable
@@ -1445,7 +1432,7 @@ Using \"emacs\" loses, because bash disables editing if 
$TERM == emacs.")
 :UP=\\E[%%dA:DO=\\E[%%dB:LE=\\E[%%dD:RI=\\E[%%dC\
 :kl=\\EOD:kd=\\EOB:kr=\\EOC:ku=\\EOA:kN=\\E[6~:kP=\\E[5~:@7=\\E[4~:kh=\\E[1~\
 :mk=\\E[8m:cb=\\E[1K:op=\\E[39;49m:Co#8:pa#64:AB=\\E[4%%dm:AF=\\E[3%%dm:cr=^M\
-:bl=^G:do=^J:le=^H:ta=^I:se=\\E[27m:ue=\\E24m\
+:bl=^G:do=^J:le=^H:ta=^I:se=\\E[27m:ue=\\E[24m\
 :kb=^?:kD=^[[3~:sc=\\E7:rc=\\E8:r1=\\Ec:"
   ;; : -undefine ic
   ;; don't define :te=\\E[2J\\E[?47l\\E8:ti=\\E7\\E[?47h\
@@ -2140,7 +2127,7 @@ The prompt skip is done by skipping text matching the 
regular expression
 (defun term-read-noecho (prompt &optional stars)
   "Read a single line of text from user without echoing, and return it.
 Prompt with argument PROMPT, a string.  Optional argument STARS causes
-input to be echoed with '*' characters on the prompt line.  Input ends with
+input to be echoed with `*' characters on the prompt line.  Input ends with
 RET, LFD, or ESC.  DEL or C-h rubs out.  C-u kills line.  C-g aborts (if
 `inhibit-quit' is set because e.g. this function was called from a process
 filter and C-g is pressed, this function returns nil rather than a string).
diff --git a/lisp/term/ns-win.el b/lisp/term/ns-win.el
index 0b3e3bd..9bd59fc 100644
--- a/lisp/term/ns-win.el
+++ b/lisp/term/ns-win.el
@@ -51,6 +51,7 @@
 (require 'menu-bar)
 (require 'fontset)
 (require 'dnd)
+(require 'ucs-normalize)
 
 (defgroup ns nil
   "GNUstep/Mac OS X specific features."
@@ -337,29 +338,12 @@ See `ns-insert-working-text'."
   (setq ns-working-overlay nil))
 
 
-(declare-function ns-convert-utf8-nfd-to-nfc "nsfns.m" (str))
-
-;;;; OS X file system Unicode UTF-8 NFD (decomposed form) support
-;; Lisp code based on utf-8m.el, by Seiji Zenitani, Eiji Honjoh, and
-;; Carsten Bormann.
+;; OS X file system Unicode UTF-8 NFD (decomposed form) support.
 (when (eq system-type 'darwin)
-  (defun ns-utf8-nfd-post-read-conversion (length)
-    "Calls `ns-convert-utf8-nfd-to-nfc' to compose char sequences."
-    (save-excursion
-      (save-restriction
-        (narrow-to-region (point) (+ (point) length))
-        (let ((str (buffer-string)))
-          (delete-region (point-min) (point-max))
-          (insert (ns-convert-utf8-nfd-to-nfc str))
-          (- (point-max) (point-min))))))
-
-  (define-coding-system 'utf-8-nfd
-    "UTF-8 NFD (decomposed) encoding."
-    :coding-type 'utf-8
-    :mnemonic ?U
-    :charset-list '(unicode)
-    :post-read-conversion 'ns-utf8-nfd-post-read-conversion)
-  (set-file-name-coding-system 'utf-8-nfd))
+  ;; Used prior to Emacs 25.
+  (define-coding-system-alias 'utf-8-nfd 'utf-8-hfs)
+
+  (set-file-name-coding-system 'utf-8-hfs))
 
 ;;;; Inter-app communications support.
 
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
index 690401e..b8fbaf7 100644
--- a/lisp/term/x-win.el
+++ b/lisp/term/x-win.el
@@ -1387,7 +1387,7 @@ This returns an error if any Emacs frames are X frames."
     ("etc/images/connect" . "gtk-connect")
     ("etc/images/contact" . "gtk-contact")
     ("etc/images/delete" . ("edit-delete" "gtk-delete"))
-    ("etc/images/describe" . ("ocument-properties" "gtk-properties"))
+    ("etc/images/describe" . ("document-properties" "gtk-properties"))
     ("etc/images/disconnect" . "gtk-disconnect")
     ;; ("etc/images/exit" . "gtk-exit")
     ("etc/images/lock-broken" . "gtk-lock_broken")
diff --git a/lisp/textmodes/artist.el b/lisp/textmodes/artist.el
index a29418e..373ab14 100644
--- a/lisp/textmodes/artist.el
+++ b/lisp/textmodes/artist.el
@@ -2873,10 +2873,36 @@ Returns a list of strings."
        (error "Failed to read available fonts: %s (%d)" stderr exit-code))
     (artist-string-split stdout ".flf\n")))
 
+(defun artist-figlet-get-font-list-windows ()
+  "Read in fonts on MS-Windows by collecting output of the `figlet' program.
+Returns a list of strings."
+  (let* ((ls-cmd          "figlet -I2")
+        (result          (artist-system shell-file-name nil
+                                         (list shell-command-switch ls-cmd)))
+        (exit-code       (elt result 0))
+        (stdout          (elt result 1))
+        (stderr          (elt result 2)))
+    (if (not (= exit-code 0))
+       (error "Failed to read available fonts: %s (%d)" stderr exit-code))
+    (let ((dir-list (artist-string-split stdout "\n"))
+          result)
+      (mapc
+       (lambda (dir)
+         (let ((default-directory dir))
+           (setq result (append (file-expand-wildcards "*.flf") result))))
+       dir-list)
+      (mapcar
+       (lambda (file)
+         (replace-regexp-in-string "\.flf\\'" "" file))
+       result))))
+
 (defun artist-figlet-choose-font ()
   "Read any extra arguments for figlet."
   (interactive)
-  (let* ((avail-fonts  (artist-figlet-get-font-list))
+  (let* ((avail-fonts
+          (if (memq system-type '(windows-nt ms-dos))
+              (artist-figlet-get-font-list-windows)
+            (artist-figlet-get-font-list)))
         (font (completing-read (concat "Select font (default "
                                        artist-figlet-default-font
                                        "): ")
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
index df8066e..deb39d9 100644
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -1503,7 +1503,7 @@ At most `bibtex-entry-kill-ring-max' items are kept 
here.")
   "The tail of `bibtex-entry-kill-ring' whose car is the last item yanked.")
 
 (defvar bibtex-last-kill-command nil
-  "Type of the last kill command (either 'field or 'entry).")
+  "Type of the last kill command (either `field' or `entry').")
 
 (defvar bibtex-strings
   (lazy-completion-table bibtex-strings
@@ -2573,7 +2573,7 @@ Formats current entry according to variable 
`bibtex-entry-format'."
 
 (defun bibtex-field-re-init (regexp-alist type)
   "Calculate optimized value for bibtex-regexp-TYPE-opt.
-This value is based on bibtex-regexp-TYPE-alist.  TYPE is 'braces or 'strings.
+This value is based on bibtex-regexp-TYPE-alist.  TYPE is `braces' or 
`strings'.
 Return optimized value to be used by `bibtex-format-entry'."
   (setq regexp-alist
         (mapcar (lambda (e)
diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el
index 3e84b43..a8a2067 100644
--- a/lisp/textmodes/css-mode.el
+++ b/lisp/textmodes/css-mode.el
@@ -308,7 +308,8 @@
 (defcustom css-indent-offset 4
   "Basic size of one indentation step."
   :version "22.2"
-  :type 'integer)
+  :type 'integer
+  :safe 'integerp)
 
 (require 'smie)
 
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index fe27f0f..05a5da5 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -1782,6 +1782,51 @@ Extended character mode can be changed for this buffer 
by placing
 a `~' followed by an extended-character mode -- such as `~.tex'.
 The last occurring definition in the buffer will be used.")
 
+(defun ispell--\\w-filter (char)
+  "Return CHAR in a string when CHAR doesn't have \"word\" syntax,
+nil otherwise.  CHAR must be a character."
+  (let ((str (string char)))
+    (and
+     (not (string-match "\\w" str))
+     str)))
+
+(defun ispell--make-\\w-expression (chars)
+  "Make a regular expression like \"\\(\\w\\|[-_]\\)\".
+This (parenthesized) expression matches either a character of
+\"word\" syntax or one in CHARS.
+
+CHARS is a string of characters.  A member of CHARS is omitted
+from the expression if it already has word syntax.  (Be careful
+about special characters such as ?\\, ?^, ?], and ?- in CHARS.)
+If after this filtering there are no chars left, or only one, a
+special form of the expression is generated."
+  (let ((filtered
+        (mapconcat #'ispell--\\w-filter chars "")))
+    (concat
+     "\\(\\w"
+     (cond
+      ((equal filtered "")
+       "\\)")
+      ((eq (length filtered) 1)
+       (concat "\\|" filtered "\\)"))
+      (t
+       (concat "\\|[" filtered "]\\)"))))))
+
+(defun ispell--make-filename-or-URL-re ()
+  "Construct a regexp to match some file names or URLs or email addresses.
+The expression is crafted to match as great a variety of these
+objects as practicable, without too many false matches happening."
+  (concat ;"\\(--+\\|_+\\|"
+          "\\(/\\w\\|\\("
+          (ispell--make-\\w-expression "-_")
+          "+[.:@]\\)\\)"
+          (ispell--make-\\w-expression "-_")
+          "*\\([.:/@]+"
+          (ispell--make-\\w-expression "-_~=?&")
+          "+\\)+"
+          ;"\\)"
+          ))
+
 ;;;###autoload
 (defvar ispell-skip-region-alist
   `((ispell-words-keyword         forward-line)
@@ -1798,7 +1843,7 @@ The last occurring definition in the buffer will be 
used.")
     ;; Matches e-mail addresses, file names, http addresses, etc.  The
     ;; `-+' `_+' patterns are necessary for performance reasons when
     ;; `-' or `_' part of word syntax.
-    (,(purecopy 
"\\(--+\\|_+\\|\\(/\\w\\|\\(\\(\\w\\|[-_]\\)+[.:@]\\)\\)\\(\\w\\|[-_]\\)*\\([.:/@]+\\(\\w\\|[-_~=?&]\\)+\\)+\\)"))
+;    (,(purecopy 
"\\(--+\\|_+\\|\\(/\\w\\|\\(\\(\\w\\|[-_]\\)+[.:@]\\)\\)\\(\\w\\|[-_]\\)*\\([.:/@]+\\(\\w\\|[-_~=?&]\\)+\\)+\\)"))
     ;; above checks /.\w sequences
     
;;("\\(--+\\|\\(/\\|\\(\\(\\w\\|[-_]\\)+[.:@]\\)\\)\\(\\w\\|[-_]\\)*\\([.:/@]+\\(\\w\\|[-_~=?&]\\)+\\)+\\)")
     ;; This is a pretty complex regexp.  It can be simplified to the following:
@@ -2248,6 +2293,11 @@ If so, ask if it needs to be saved."
   (setq ispell-pdict-modified-p nil))
 
 
+(defvar ispell-update-post-hook nil
+  "A normal hook invoked from the ispell command loop.
+It is called once per iteration, before displaying a prompt to
+the user.")
+
 (defun ispell-command-loop (miss guess word start end)
   "Display possible corrections from list MISS.
 GUESS lists possibly valid affix construction of WORD.
@@ -2315,8 +2365,10 @@ Global `ispell-quit' set to start location to continue 
spell session."
              count (ispell-int-char (1+ count))))
       (setq count (ispell-int-char (- count ?0 skipped))))
 
+    (run-hooks 'ispell-update-post-hook)
+
     ;; ensure word is visible
-    (if (not (pos-visible-in-window-p end))
+    (if (not (pos-visible-in-window-group-p end))
        (sit-for 0))
 
     ;; Display choices for misspelled word.
@@ -2809,6 +2861,7 @@ The variable `ispell-highlight-face' selects the face to 
use for highlighting."
                  (regexp-quote (buffer-substring-no-properties start end))
                  "\\b"))
                (isearch-regexp t)
+               (isearch-regexp-function nil)
                (isearch-case-fold-search nil)
                (isearch-forward t)
                (isearch-other-end start)
@@ -2844,13 +2897,20 @@ Also position fit window to BUFFER and select it."
                     (prog1
                         (condition-case nil
                             (split-window
-                             nil (- ispell-choices-win-default-height) 'above)
+                              ;; Chose the last of a window group, since
+                              ;; otherwise, the lowering of another window's
+                              ;; TL corner would cause the logical order of
+                              ;; the windows to be changed.
+                             (car (last (selected-window-group)))
+                              (- ispell-choices-win-default-height) 'above)
                           (error nil))
                       (modify-frame-parameters frame '((unsplittable . t))))))
              (and (not unsplittable)
                   (condition-case nil
                       (split-window
-                       nil (- ispell-choices-win-default-height) 'above)
+                        ;; See comment above.
+                       (car (last (selected-window-group)))
+                        (- ispell-choices-win-default-height) 'above)
                     (error nil)))
              (display-buffer buffer))))
     (if (not window)
@@ -3373,7 +3433,8 @@ Must be called after `ispell-buffer-local-parsing' due to 
dependence on mode."
               (if (string= "" comment-end) "^" (regexp-quote comment-end)))
           (if (and (null ispell-check-comments) comment-start)
               (regexp-quote comment-start))
-          (ispell-begin-skip-region ispell-skip-region-alist)))
+          (ispell-begin-skip-region ispell-skip-region-alist)
+          (ispell--make-filename-or-URL-re)))
    "\\|"))
 
 
@@ -3412,6 +3473,8 @@ Manual checking must include comments and tib references.
 The list is of the form described by variable `ispell-skip-region-alist'.
 Must be called after `ispell-buffer-local-parsing' due to dependence on mode."
   (let ((skip-alist ispell-skip-region-alist))
+    (setq skip-alist (append (list (list (ispell--make-filename-or-URL-re)))
+                             skip-alist))
     ;; only additional explicit region definition is tex.
     (if (eq ispell-parser 'tex)
        (setq case-fold-search nil
@@ -4105,9 +4168,10 @@ You can bind this to the key C-c i in GNUS or mail by 
adding to
                      (ispell-non-empty-string vm-included-text-prefix)))
             (t default-prefix)))
           (ispell-skip-region-alist
-           (cons (list (concat "^\\(" cite-regexp "\\)")
-                       (function forward-line))
-                 ispell-skip-region-alist))
+           (cons (list (ispell--make-filename-or-URL-re))
+                  (cons (list (concat "^\\(" cite-regexp "\\)")
+                              (function forward-line))
+                        ispell-skip-region-alist)))
           (old-case-fold-search case-fold-search)
           (dictionary-alist ispell-message-dictionary-alist)
           (ispell-checking-message t))
diff --git a/lisp/textmodes/page-ext.el b/lisp/textmodes/page-ext.el
index 99962c7..c7a2f25 100644
--- a/lisp/textmodes/page-ext.el
+++ b/lisp/textmodes/page-ext.el
@@ -351,7 +351,7 @@ Else insert at exact location of point.
 Narrow to new page if `pages-directory-for-adding-page-narrowing-p' is
 non-nil.
 
-Page begins with a '^L' as the default `page-delimiter'.
+Page begins with a `^L' as the default `page-delimiter'.
 Use \\[set-page-delimiter] to change the page-delimiter.
 Point is left in the body of page."
   (interactive "sHeader line: ")
diff --git a/lisp/textmodes/refbib.el b/lisp/textmodes/refbib.el
index 424b6d0..e5b89a2 100644
--- a/lisp/textmodes/refbib.el
+++ b/lisp/textmodes/refbib.el
@@ -79,7 +79,7 @@ may be eliminated if is exactly the same as the car.
   Because titles are capitalized before matching, the abbreviation
 for the journal name should be listed as beginning with a capital
 letter, even if it really doesn't.
-  For example, a value of '((\"Aij\" \"{Artificial Intelligence}\")
+  For example, a value of ((\"Aij\" \"{Artificial Intelligence}\")
 \(\"Ijcai81\" \"ijcai7\")) would expand Aij to the text string
 \"Artificial Intelligence\", but would replace Ijcai81 with the
 BibTeX macro \"ijcai7\"."
@@ -97,7 +97,7 @@ abbreviation.  The cadr may be eliminated if is exactly the 
same as
 the car.
   Because titles are capitalized before matching, the abbreviated title
 should be listed as beginning with a capital letter, even if it doesn't.
-  For example, a value of '((\"Aij\" \"{Artificial Intelligence}\")
+  For example, a value of ((\"Aij\" \"{Artificial Intelligence}\")
 \(\"Ijcai81\" \"ijcai7\")) would expand Aij to the text string
 \"Artificial Intelligence\", but would replace Ijcai81 with the
 BibTeX macro \"ijcai7\"."
@@ -115,7 +115,7 @@ The entry must match the given data exactly.
 should begin with a capital letter.
   For example, suppose the title \"Ijcai81\" is used for the proceedings of
 a conference, and its expansion is the BibTeX macro \"ijcai7\".  Then
-`r2b-proceedings-list' should be '((\"Ijcai81\") ...).  If instead its
+`r2b-proceedings-list' should be ((\"Ijcai81\") ...).  If instead its
 expansion were \"Proceedings of the Seventh International Conference
 on Artificial Intelligence\", then you would NOT need to include Ijcai81
 in `r2b-proceedings-list' (although it wouldn't cause an error)."
diff --git a/lisp/textmodes/refer.el b/lisp/textmodes/refer.el
index 22dc7dc..dfdda8a 100644
--- a/lisp/textmodes/refer.el
+++ b/lisp/textmodes/refer.el
@@ -77,13 +77,13 @@
 
 (defcustom refer-bib-directory nil
   "Directory, or list of directories, to search for \\.bib files.
-Can be set to 'bibinputs or 'texinputs, in which case the environment
+Can be set to `bibinputs' or `texinputs', in which case the environment
 variable BIBINPUTS or TEXINPUTS, respectively, is used to obtain a
-list of directories.  Useful only if `refer-bib-files' is set to 'dir or
+list of directories.  Useful only if `refer-bib-files' is set to `dir' or
 a list of file names (without directory).  A value of nil indicates the
 current working directory.
 
-If `refer-bib-directory' is 'bibinputs or 'texinputs, it is setq'd to
+If `refer-bib-directory' is `bibinputs' or `texinputs', it is setq'd to
 the appropriate list of directories when it is first used.
 
 Note that an empty directory is interpreted by BibTeX as indicating
diff --git a/lisp/textmodes/reftex-auc.el b/lisp/textmodes/reftex-auc.el
index b2629a5..8316fe5 100644
--- a/lisp/textmodes/reftex-auc.el
+++ b/lisp/textmodes/reftex-auc.el
@@ -137,7 +137,7 @@ argument identify one of multiple indices."
        ((stringp tag) tag)
        ((integerp tag)
         (save-excursion
-          (goto-char (match-end 1))
+          (goto-char (match-end 0))
           (or (reftex-nth-arg tag (nth 6 entry)) "idx")))
        (t "idx")))))
 
diff --git a/lisp/textmodes/reftex-vars.el b/lisp/textmodes/reftex-vars.el
index 97c8af3..fcab136 100644
--- a/lisp/textmodes/reftex-vars.el
+++ b/lisp/textmodes/reftex-vars.el
@@ -335,7 +335,7 @@ more than `reftex-idle-time' seconds.
 Value t means, turn on immediately when RefTeX gets started.  Then,
 recentering will work for any TOC window created during the session.
 
-Value 'frame (the default) means, turn automatic recentering on only while the
+Value `frame' (the default) means, turn automatic recentering on only while the
 dedicated TOC frame does exist, and do the recentering only in that frame.  So
 when creating that frame (with `d' key in an ordinary TOC window), the
 automatic recentering is turned on.  When the frame gets destroyed, automatic
@@ -739,7 +739,7 @@ And here is the setup for RefTeX:
    \\end.  Here we use \"linguex\" as this name.
 
    (setq reftex-label-alist
-         '((\"linguex\" ?x \"ex:\" \"~\\\\ref{%s}\" nil (\"Example\" 
\"Ex.\"))))
+         \\='((\"linguex\" ?x \"ex:\" \"~\\\\ref{%s}\" nil (\"Example\" 
\"Ex.\"))))
 
 2. Write a function to detect the list macros and the determinators as well.
 
@@ -762,7 +762,7 @@ And here is the setup for RefTeX:
 
 3. Tell RefTeX to use this function
 
-   (setq reftex-special-environment-functions '(my-detect-linguex-list))"
+   (setq reftex-special-environment-functions \\='(my-detect-linguex-list))"
   :group 'reftex-defining-label-environments
   :type 'hook)
 
@@ -877,7 +877,7 @@ DOWNCASE    t:   Downcase words before using them."
       "\\\\label{\\(?1:[^}]*\\)}"
       ;; keyvals [..., label = {foo}, ...] forms used by ctable,
       ;; listings, minted, ...
-      "\\[[^[]]*\\<label[[:space:]]*=[[:space:]]*{?\\(?1:[^],}]+\\)}?")
+      
"\\[[^][]\\{0,2000\\}\\<label[[:space:]]*=[[:space:]]*{?\\(?1:[^],}]+\\)}?")
     "List of regexps matching \\label definitions.
 The default value matches usual \\label{...} definitions and
 keyval style [..., label = {...}, ...] label definitions.  It is
@@ -1206,7 +1206,7 @@ strings.
 `reftex-cite-format' directly yourself or set it to the SYMBOL of one of
 the predefined styles.  The predefined symbols are those which have an
 association in the constant `reftex-cite-format-builtin'.
-E.g.: (setq reftex-cite-format 'natbib)"
+E.g.: (setq reftex-cite-format \\='natbib)"
   :group 'reftex-citation-support
   :type
   `(choice
diff --git a/lisp/textmodes/sgml-mode.el b/lisp/textmodes/sgml-mode.el
index 55a1e6d..239112b 100644
--- a/lisp/textmodes/sgml-mode.el
+++ b/lisp/textmodes/sgml-mode.el
@@ -697,7 +697,7 @@ This only works for Latin-1 input."
   "Prompt for a tag and insert it, optionally with attributes.
 Completion and configuration are done according to `sgml-tag-alist'.
 If you like tags and attributes in uppercase, customize
-`sgml-transformation-function' to 'upcase."
+`sgml-transformation-function' to `upcase'."
   (funcall (or skeleton-transformation-function 'identity)
            (setq sgml-tag-last
                 (completing-read
diff --git a/lisp/textmodes/table.el b/lisp/textmodes/table.el
index 151d648..97da437 100644
--- a/lisp/textmodes/table.el
+++ b/lisp/textmodes/table.el
@@ -2938,7 +2938,7 @@ WHERE is provided the cell and table at that location is 
reported."
 (defun table-generate-source (language &optional dest-buffer caption)
   "Generate source of the current table in the specified language.
 LANGUAGE is a symbol that specifies the language to describe the
-structure of the table.  It must be either 'html, 'latex or 'cals.
+structure of the table.  It must be either `html', `latex' or `cals'.
 The resulted source text is inserted into DEST-BUFFER and the buffer
 object is returned.  When DEST-BUFFER is omitted or nil the default
 buffer specified in `table-dest-buffer-name' is used.  In this case
@@ -3561,7 +3561,7 @@ delimiter regular expressions.  This parsing determines 
the number of
 columns and rows of the table automatically.  If COL-DELIM-REGEXP and
 ROW-DELIM-REGEXP are omitted the result table has only one cell and
 the entire region contents is placed in that cell.  Optional JUSTIFY
-is one of 'left, 'center or 'right, which specifies the cell
+is one of `left', `center' or `right', which specifies the cell
 justification.  Optional MIN-CELL-WIDTH specifies the minimum cell
 width.  Optional COLUMNS specify the number of columns when
 ROW-DELIM-REGEXP is not specified.
diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el
index c9d347d..22bb8ca 100644
--- a/lisp/textmodes/tex-mode.el
+++ b/lisp/textmodes/tex-mode.el
@@ -188,7 +188,7 @@ If two printers are not enough of a choice, you can set the 
variable
 for example,
 
     (setq tex-alt-dvi-print-command
-         '(format \"lpr -P%s\" (read-string \"Use printer: \")))
+         \\='(format \"lpr -P%s\" (read-string \"Use printer: \")))
 
 would tell \\[tex-print] with a prefix argument to ask you which printer to
 use."
diff --git a/lisp/textmodes/text-mode.el b/lisp/textmodes/text-mode.el
index 1466556..1e0a949 100644
--- a/lisp/textmodes/text-mode.el
+++ b/lisp/textmodes/text-mode.el
@@ -39,7 +39,7 @@
 
 (defvar text-mode-variant nil
   "Non-nil if this buffer's major mode is a variant of Text mode.
-Use (derived-mode-p 'text-mode) instead.")
+Use (derived-mode-p \\='text-mode) instead.")
 
 (defvar text-mode-syntax-table
   (let ((st (make-syntax-table)))
diff --git a/lisp/time-stamp.el b/lisp/time-stamp.el
index b6a7340..c148a57 100644
--- a/lisp/time-stamp.el
+++ b/lisp/time-stamp.el
@@ -677,7 +677,7 @@ otherwise the value of the function `system-name'."
 ;;; the rest of this file is for version 1 compatibility
 
 (defun time-stamp-fconcat (list sep)
-  "Similar to (mapconcat 'funcall LIST SEP) but LIST allows literals.
+  "Similar to (mapconcat \\='funcall LIST SEP) but LIST allows literals.
 If an element of LIST is a symbol, it is funcalled to get the string to use;
 the separator SEP is used between two strings obtained by funcalling a
 symbol.  Otherwise the element itself is inserted; no separator is used
diff --git a/lisp/url/url-auth.el b/lisp/url/url-auth.el
index b419db5..75a9e38 100644
--- a/lisp/url/url-auth.el
+++ b/lisp/url/url-auth.el
@@ -50,7 +50,7 @@
 Must be a symbol pointing to another variable that will actually store
 the information.  The value of this variable is an assoc list of assoc
 lists.  The first assoc list is keyed by the server name.  The cdr of
-this is an assoc list based on the 'directory' specified by the URL we
+this is an assoc list based on the \"directory\" specified by the URL we
 are looking up.")
 
 (defun url-basic-auth (url &optional prompt overwrite realm args)
@@ -141,7 +141,7 @@ instead of the filename inheritance method."
   "Where usernames and passwords are stored.
 Its value is an assoc list of assoc lists.  The first assoc list is
 keyed by the server name.  The cdr of this is an assoc list based
-on the 'directory' specified by the url we are looking up.")
+on the \"directory\" specified by the url we are looking up.")
 
 (defun url-digest-auth-create-key (username password realm method uri)
   "Create a key for digest authentication method"
diff --git a/lisp/url/url-handlers.el b/lisp/url/url-handlers.el
index 6d2a5c2..9c27276 100644
--- a/lisp/url/url-handlers.el
+++ b/lisp/url/url-handlers.el
@@ -342,8 +342,15 @@ if it had been inserted from a file named URL."
       ;; XXX: This is HTTP/S specific and should be moved to url-http
       ;; instead.  See http://debbugs.gnu.org/17549.
       (when (bound-and-true-p url-http-response-status)
-        (unless (and (>= url-http-response-status 200)
-                     (< url-http-response-status 300))
+        ;; Don't signal an error if VISIT is non-nil, because
+        ;; 'insert-file-contents' doesn't.  This is required to
+        ;; support, e.g., 'browse-url-emacs', which is a fancy way of
+        ;; visiting the HTML source of a URL: in that case, we want to
+        ;; display a file buffer even if the URL does not exist and
+        ;; 'url-retrieve-synchronously' returns 404 or whatever.
+        (unless (or visit
+                    (and (>= url-http-response-status 200)
+                         (< url-http-response-status 300)))
           (let ((desc (nth 2 (assq url-http-response-status url-http-codes))))
             (kill-buffer buffer)
             ;; Signal file-error per http://debbugs.gnu.org/16733.
diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el
index 916f263..36cc2f3 100644
--- a/lisp/url/url-http.el
+++ b/lisp/url/url-http.el
@@ -26,6 +26,7 @@
 ;;; Code:
 
 (require 'cl-lib)
+(require 'puny)
 (eval-when-compile
   (require 'subr-x))
 
@@ -135,17 +136,6 @@ request.")
     (507 insufficient-storage            "Insufficient storage"))
   "The HTTP return codes and their text.")
 
-(defcustom url-user-agent (format "User-Agent: %sURL/%s\r\n"
-                                 (if url-package-name
-                                     (concat url-package-name "/"
-                                             url-package-version " ")
-                                   "") url-version)
-  "User Agent used by the URL package."
-  :type '(choice (string :tag "A static User-Agent string")
-                 (function :tag "Call a function to get the User-Agent 
string"))
-  :version "25.1"
-  :group 'url)
-
 ;(eval-when-compile
 ;; These are all macros so that they are hidden from external sight
 ;; when the file is byte-compiled.
@@ -318,8 +308,9 @@ request.")
                      (url-scheme-get-property
                       (url-type url-http-target-url) 'default-port))
                  (format
-                  "Host: %s:%d\r\n" host (url-port url-http-target-url))
-               (format "Host: %s\r\n" host))
+                  "Host: %s:%d\r\n" (puny-encode-domain host)
+                  (url-port url-http-target-url))
+               (format "Host: %s\r\n" (puny-encode-domain host)))
              ;; Who its from
              (if url-personal-mail-address
                  (concat
@@ -431,7 +422,7 @@ Return the number of characters removed."
        (progn
          (widen)
          (goto-char (point-max))
-         (insert "<hr>Sorry, but I do not know how to handle " type
+         (insert "<hr>Sorry, but I do not know how to handle " (or type auth 
url "")
                  " authentication.  If you'd like to write it,"
                  " please use M-x report-emacs-bug RET.<hr>")
           ;; We used to set a `status' var (declared "special") but I can't
@@ -986,7 +977,7 @@ the callback to be triggered."
            (url-http-activate-callback)))))
 
 (defun url-http-chunked-encoding-after-change-function (st nd length)
-  "Function used when dealing with 'chunked' encoding.
+  "Function used when dealing with chunked encoding.
 Cannot give a sophisticated percentage, but we need a different
 function to look for the special 0-length chunk that signifies
 the end of the document."
@@ -1067,7 +1058,7 @@ the end of the document."
                  (when (looking-at "\r?\n")
                    (url-http-debug "Removing terminator of last chunk")
                    (delete-region (match-beginning 0) (match-end 0)))
-                 (if (re-search-forward "^\r*$" nil t)
+                 (if (re-search-forward "^\r?\n" nil t)
                      (url-http-debug "Saw end of trailers..."))
                  (if (url-http-parse-headers)
                      (url-http-activate-callback))))))))))
diff --git a/lisp/url/url-util.el b/lisp/url/url-util.el
index e011b96..65a24a5 100644
--- a/lisp/url/url-util.el
+++ b/lisp/url/url-util.el
@@ -160,7 +160,7 @@ conversion.  Replaces these characters as follows:
 
 ;;;###autoload
 (defun url-normalize-url (url)
-  "Return a 'normalized' version of URL.
+  "Return a \"normalized\" version of URL.
 Strips out default port numbers, etc."
   (let (type data retval)
     (setq data (url-generic-parse-url url)
@@ -188,7 +188,7 @@ Will not do anything if `url-show-status' is nil."
 
 ;;;###autoload
 (defun url-get-normalized-date (&optional specified-time)
- "Return a 'real' date string that most HTTP servers can understand."
+ "Return a date string that most HTTP servers can understand."
  (let ((system-time-locale "C"))
   (format-time-string "%a, %d %b %Y %T GMT" specified-time t)))
 
@@ -468,7 +468,7 @@ should return it unchanged."
     (and host
         (not (string-match "\\`\\[.*\\]\\'" host))
         (setf (url-host obj)
-              (url-hexify-string host url-host-allowed-chars)))
+               (decode-coding-string (url-host obj) 'utf-8)))
 
     (if path
        (setq path (url-hexify-string path url-path-allowed-chars)))
diff --git a/lisp/url/url-vars.el b/lisp/url/url-vars.el
index 46c2ec3..fa6f182 100644
--- a/lisp/url/url-vars.el
+++ b/lisp/url/url-vars.el
@@ -357,6 +357,18 @@ Currently supported methods:
                (const :tag "Direct connection" :value native))
   :group 'url-hairy)
 
+(defcustom url-user-agent (format "User-Agent: %sURL/%s\r\n"
+                                 (if url-package-name
+                                     (concat url-package-name "/"
+                                             url-package-version " ")
+                                   "") url-version)
+  "User Agent used by the URL package for HTTP/HTTPS requests
+Should be a string or a function of no arguments returning a string."
+  :type '(choice (string :tag "A static User-Agent string")
+                 (function :tag "Call a function to get the User-Agent 
string"))
+  :version "25.1"
+  :group 'url)
+
 (defvar url-setup-done nil "Has setup configuration been done?")
 
 (defconst url-weekday-alist
diff --git a/lisp/userlock.el b/lisp/userlock.el
index 781023c..52a3eb1 100644
--- a/lisp/userlock.el
+++ b/lisp/userlock.el
@@ -38,7 +38,7 @@
 (defun ask-user-about-lock (file opponent)
   "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:
-  do (signal 'file-locked (list FILE OPPONENT))
+  do (signal \\='file-locked (list FILE OPPONENT))
     to refrain from editing the file
   return t (grab the lock on the file)
   return nil (edit the file even though it is locked).
@@ -101,7 +101,7 @@ You can <q>uit; don't modify this file.")
 (defun ask-user-about-supersession-threat (fn)
   "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
-of the buffer will proceed, or it can (signal 'file-supersession (file)),
+of the buffer will proceed, or it can (signal \\='file-supersession (file)),
 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.
diff --git a/lisp/vc/compare-w.el b/lisp/vc/compare-w.el
index cec1644..d6e3240 100644
--- a/lisp/vc/compare-w.el
+++ b/lisp/vc/compare-w.el
@@ -132,13 +132,13 @@ out all highlighting later with the command 
`compare-windows-dehighlight'."
 
 (defface compare-windows-removed
   '((t :inherit diff-removed))
-  "Face for highlighting of compare-windows removed regions."
+  "Face for highlighting `compare-windows' differing regions in the other 
window."
   :group 'compare-windows
   :version "25.1")
 
 (defface compare-windows-added
   '((t :inherit diff-added))
-  "Face for highlighting of compare-windows added regions."
+  "Face for highlighting `compare-windows' differing regions in current 
window."
   :group 'compare-windows
   :version "25.1")
 
diff --git a/lisp/vc/ediff-init.el b/lisp/vc/ediff-init.el
index bf21159..a1d405a 100644
--- a/lisp/vc/ediff-init.el
+++ b/lisp/vc/ediff-init.el
@@ -718,9 +718,9 @@ appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if 
you so desire."
 (defcustom ediff-coding-system-for-read 'raw-text
   "The coding system for read to use when running the diff program as a 
subprocess.
 In most cases, the default will do.  However, under certain circumstances in
-MS-Windows you might need to use something like 'raw-text-dos here.
+MS-Windows you might need to use something like `raw-text-dos' here.
 So, if the output that your diff program sends to Emacs contains extra ^M's,
-you might need to experiment here, if the default or 'raw-text-dos doesn't
+you might need to experiment here, if the default or `raw-text-dos' doesn't
 work."
   :type 'symbol
   :group 'ediff)
@@ -750,7 +750,7 @@ to temp files in buffer jobs and when Ediff needs to find 
fine differences."
 (defun ediff-check-version (op major minor &optional type-of-emacs)
   "Check the current version against MAJOR and MINOR version numbers.
 The comparison uses operator OP, which may be any of: =, >, >=, <, <=.
-TYPE-OF-EMACS is either 'xemacs or 'emacs."
+TYPE-OF-EMACS is either `emacs' or `xemacs'."
   (declare (obsolete version< "23.1"))
   (and (cond ((eq type-of-emacs 'xemacs) (featurep 'xemacs))
             ((eq type-of-emacs 'emacs) (featurep 'emacs))
diff --git a/lisp/vc/ediff-wind.el b/lisp/vc/ediff-wind.el
index e0887f0..8da752a 100644
--- a/lisp/vc/ediff-wind.el
+++ b/lisp/vc/ediff-wind.el
@@ -201,7 +201,7 @@ Used internally---not a user option.")
 
 (defcustom ediff-grab-mouse t
   "If t, Ediff will always grab the mouse and put it in the control frame.
-If 'maybe, Ediff will do it sometimes, but not after operations that require
+If `maybe', Ediff will do it sometimes, but not after operations that require
 relatively long time.  If nil, the mouse will be entirely user's
 responsibility."
   :type 'boolean
diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el
index 9857116..2bdd7a5 100644
--- a/lisp/vc/log-edit.el
+++ b/lisp/vc/log-edit.el
@@ -97,7 +97,7 @@
 
 (defcustom log-edit-confirm 'changed
   "If non-nil, `log-edit-done' will request confirmation.
-If 'changed, only request confirmation if the list of files has
+If `changed', only request confirmation if the list of files has
   changed since the beginning of the log-edit session."
   :group 'log-edit
   :type '(choice (const changed) (const t) (const nil)))
@@ -115,7 +115,7 @@ Enforce it silently if t, query if non-nil and don't do 
anything if nil."
 
 (defcustom log-edit-setup-invert nil
   "Non-nil means `log-edit' should invert the meaning of its SETUP arg.
-If SETUP is 'force, this variable has no effect."
+If SETUP is `force', this variable has no effect."
   :group 'log-edit
   :type 'boolean)
 
diff --git a/lisp/vc/pcvs.el b/lisp/vc/pcvs.el
index 3fdee10..ba84258 100644
--- a/lisp/vc/pcvs.el
+++ b/lisp/vc/pcvs.el
@@ -2209,7 +2209,7 @@ With prefix argument, prompt for cvs flags."
 ;; Byte compile files.
 
 (defun-cvs-mode cvs-mode-byte-compile-files ()
-  "Run byte-compile-file on all selected files with '.el' extension."
+  "Run byte-compile-file on all selected files with `.el' extension."
   (interactive)
   (let ((marked (cvs-get-marked (cvs-ignore-marks-p "byte-compile"))))
     (dolist (fi marked)
diff --git a/lisp/vc/smerge-mode.el b/lisp/vc/smerge-mode.el
index 9f9224c..e9bfffd 100644
--- a/lisp/vc/smerge-mode.el
+++ b/lisp/vc/smerge-mode.el
@@ -735,17 +735,17 @@ major modes.  Uses `smerge-resolve-function' to do the 
actual work."
          (smerge-auto-leave))))))
 
 (defun smerge-diff-base-mine ()
-  "Diff 'base' and 'mine' version in current conflict region."
+  "Diff `base' and `mine' version in current conflict region."
   (interactive)
   (smerge-diff 2 1))
 
 (defun smerge-diff-base-other ()
-  "Diff 'base' and 'other' version in current conflict region."
+  "Diff `base' and `other' version in current conflict region."
   (interactive)
   (smerge-diff 2 3))
 
 (defun smerge-diff-mine-other ()
-  "Diff 'mine' and 'other' version in current conflict region."
+  "Diff `mine' and `other' version in current conflict region."
   (interactive)
   (smerge-diff 1 3))
 
diff --git a/lisp/vc/vc-cvs.el b/lisp/vc/vc-cvs.el
index 5f5807f..e21aece 100644
--- a/lisp/vc/vc-cvs.el
+++ b/lisp/vc/vc-cvs.el
@@ -161,7 +161,7 @@ Format is according to `format-time-string'.  Only used if
   "Specify the mode-line display of sticky tags.
 Value t means default display, nil means no display at all.  If the
 value is a function or macro, it is called with the sticky tag and
-its' type as parameters, in that order.  TYPE can have three different
+its type as parameters, in that order.  TYPE can have three different
 values: `symbolic-name' (TAG is a string), `revision-number' (TAG is a
 string) and `date' (TAG is a date as returned by `encode-time').  The
 return value of the function or macro will be displayed as a string.
@@ -170,10 +170,10 @@ Here's an example that will display the formatted date 
for sticky
 dates and the word \"Sticky\" for sticky tag names and revisions.
 
   (lambda (tag type)
-    (cond ((eq type 'date) (format-time-string
+    (cond ((eq type \\='date) (format-time-string
                               vc-cvs-sticky-date-format-string tag))
-          ((eq type 'revision-number) \"Sticky\")
-          ((eq type 'symbolic-name) \"Sticky\")))
+          ((eq type \\='revision-number) \"Sticky\")
+          ((eq type \\='symbolic-name) \"Sticky\")))
 
 Here's an example that will abbreviate to the first character only,
 any text before the first occurrence of `-' for sticky symbolic tags.
@@ -181,9 +181,9 @@ If the sticky tag is a revision number, the word \"Sticky\" 
is
 displayed.  Date and time is displayed for sticky dates.
 
    (lambda (tag type)
-     (cond ((eq type 'date) (format-time-string \"%Y%m%d %H:%M\" tag))
-           ((eq type 'revision-number) \"Sticky\")
-           ((eq type 'symbolic-name)
+     (cond ((eq type \\='date) (format-time-string \"%Y%m%d %H:%M\" tag))
+           ((eq type \\='revision-number) \"Sticky\")
+           ((eq type \\='symbolic-name)
             (condition-case nil
                 (progn
                   (string-match \"\\\\([^-]*\\\\)\\\\(.*\\\\)\" tag)
@@ -882,11 +882,11 @@ For an empty string, nil is returned (invalid CVS root)."
             (setq host uhost))
           ;; Remove empty HOST
           (and (equal host "")
-               (setq host))
+               (setq host nil))
           ;; Fix windows style CVS root `:local:C:\\project\\cvs\\some\\dir'
           (and host
                (equal method "local")
-               (setq root (concat host ":" root) host))
+               (setq root (concat host ":" root) host nil))
           ;; Normalize CVS root record
           (list method user host root)))))
 
@@ -899,7 +899,7 @@ For an empty string, nil is returned (invalid CVS root)."
 (defun vc-cvs-parse-status (&optional full)
   "Parse output of \"cvs status\" command in the current buffer.
 Set file properties accordingly.  Unless FULL is t, parse only
-essential information. Note that this can never set the 'ignored
+essential information. Note that this can never set the `ignored'
 state."
   (let (file status missing)
     (goto-char (point-min))
diff --git a/lisp/vc/vc-dispatcher.el b/lisp/vc/vc-dispatcher.el
index ec55867..b8593e3 100644
--- a/lisp/vc/vc-dispatcher.el
+++ b/lisp/vc/vc-dispatcher.el
@@ -580,12 +580,20 @@ editing!"
 (defun vc-buffer-sync (&optional not-urgent)
   "Make sure the current buffer and its working file are in sync.
 NOT-URGENT means it is ok to continue if the user says not to save."
-  (when (buffer-modified-p)
-    (if (or vc-suppress-confirm
-           (y-or-n-p (format "Buffer %s modified; save it? " (buffer-name))))
-       (save-buffer)
-      (unless not-urgent
-       (error "Aborted")))))
+  (let (missing)
+    (when (cond
+           ((buffer-modified-p))
+           ((not (file-exists-p buffer-file-name))
+            (setq missing t)))
+      (if (or vc-suppress-confirm
+              (y-or-n-p (format "Buffer %s %s; save it? "
+                                (buffer-name)
+                                (if missing
+                                    "is missing on disk"
+                                  "modified"))))
+          (save-buffer)
+        (unless not-urgent
+          (error "Aborted"))))))
 
 ;; Command closures
 
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index 8bf37f0..9908418 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -1050,7 +1050,7 @@ or BRANCH^ (where \"^\" can be repeated)."
 
 (autoload 'vc-switches "vc")
 
-(defun vc-git-diff (files &optional rev1 rev2 buffer async)
+(defun vc-git-diff (files &optional rev1 rev2 buffer _async)
   "Get a difference report using Git between two revisions of FILES."
   (let (process-file-side-effects
         (command "diff-tree"))
@@ -1061,7 +1061,7 @@ or BRANCH^ (where \"^\" can be repeated)."
       (unless rev1 (setq rev1 "HEAD")))
     (if vc-git-diff-switches
         (apply #'vc-git-command (or buffer "*vc-diff*")
-              (if async 'async 1)
+              1 ; bug#21969
               files
                command
                "--exit-code"
diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el
index 92b0c31..62fbfde 100644
--- a/lisp/vc/vc-hg.el
+++ b/lisp/vc/vc-hg.el
@@ -335,7 +335,7 @@ If LIMIT is non-nil, show no more than this many entries."
 
 (autoload 'vc-switches "vc")
 
-(defun vc-hg-diff (files &optional oldvers newvers buffer async)
+(defun vc-hg-diff (files &optional oldvers newvers buffer _async)
   "Get a difference report using hg between two revisions of FILES."
   (let* ((firstfile (car files))
          (working (and firstfile (vc-working-revision firstfile))))
@@ -345,8 +345,8 @@ If LIMIT is non-nil, show no more than this many entries."
       (setq oldvers working))
     (apply #'vc-hg-command
           (or buffer "*vc-diff*")
-          (if async 'async nil)
-          files "diff"
+           nil ; bug#21969
+           files "diff"
            (append
             (vc-switches 'hg 'diff)
             (when oldvers
@@ -430,9 +430,13 @@ Optional arg REVISION is a revision to annotate from."
 ;;; Miscellaneous
 
 (defun vc-hg-previous-revision (_file rev)
-  (let ((newrev (1- (string-to-number rev))))
-    (when (>= newrev 0)
-      (number-to-string newrev))))
+  ;; We can't simply decrement by 1, because that revision might be
+  ;; e.g. on a different branch (bug#22032).
+  (with-temp-buffer
+    (and (eq 0
+             (vc-hg-command t nil nil "id" "-n" "-r" (concat rev "^")))
+         ;; Trim the trailing newline.
+         (buffer-substring (point-min) (1- (point-max))))))
 
 (defun vc-hg-next-revision (_file rev)
   (let ((newrev (1+ (string-to-number rev)))
diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el
index 3e6d2a9..93d2dc0 100644
--- a/lisp/vc/vc-hooks.el
+++ b/lisp/vc/vc-hooks.el
@@ -243,12 +243,12 @@ if that doesn't exist either, return nil."
   "Call for BACKEND the implementation of FUNCTION-NAME with the given ARGS.
 Calls
 
-    (apply 'vc-BACKEND-FUN ARGS)
+    (apply \\='vc-BACKEND-FUN ARGS)
 
 if vc-BACKEND-FUN exists (after trying to find it in vc-BACKEND.el)
 and else calls
 
-    (apply 'vc-default-FUN BACKEND ARGS)
+    (apply \\='vc-default-FUN BACKEND ARGS)
 
 It is usually called via the `vc-call' macro."
   (let ((f (assoc function-name (get backend 'vc-functions))))
@@ -791,7 +791,11 @@ current, and kill the buffer that visits the link."
   nil)
 
 (defun vc-refresh-state ()
-  "Activate or deactivate VC mode as appropriate."
+  "Refresh the VC state of the current buffer's file.
+
+This command is more thorough than `vc-state-refresh', in that it
+also supports switching a back-end or removing the file from VC.
+In the latter case, VC mode is deactivated for this buffer."
   (interactive)
   ;; Recompute whether file is version controlled,
   ;; if user has killed the buffer and revisited.
diff --git a/lisp/vc/vc-mtn.el b/lisp/vc/vc-mtn.el
index b56a08f..3b59c61 100644
--- a/lisp/vc/vc-mtn.el
+++ b/lisp/vc/vc-mtn.el
@@ -253,10 +253,10 @@ If LIMIT is non-nil, show no more than this many entries."
 
 (autoload 'vc-switches "vc")
 
-(defun vc-mtn-diff (files &optional rev1 rev2 buffer async)
+(defun vc-mtn-diff (files &optional rev1 rev2 buffer _async)
   "Get a difference report using monotone between two revisions of FILES."
   (apply 'vc-mtn-command (or buffer "*vc-diff*")
-        (if async 'async 1)
+        1 ; bug#21969
         files "diff"
          (append
            (vc-switches 'mtn 'diff)
diff --git a/lisp/vc/vc-rcs.el b/lisp/vc/vc-rcs.el
index ba13364..3e43546 100644
--- a/lisp/vc/vc-rcs.el
+++ b/lisp/vc/vc-rcs.el
@@ -534,10 +534,11 @@ files beneath it."
     (vc-rcs-print-log-cleanup))
   (when limit 'limit-unsupported))
 
-(defun vc-rcs-diff (files &optional oldvers newvers buffer async)
+(defun vc-rcs-diff (files &optional oldvers newvers buffer _async)
   "Get a difference report using RCS between two sets of files."
   (apply #'vc-do-command (or buffer "*vc-diff*")
-        (if async 'async 1)
+        ;; The repo is local, so this is fast anyway.
+        1 ; bug#21969
         "rcsdiff" (vc-expand-dirs files 'RCS)
          (append (list "-q"
                        (and oldvers (concat "-r" oldvers))
diff --git a/lisp/vc/vc-svn.el b/lisp/vc/vc-svn.el
index de58fb9..a50befa 100644
--- a/lisp/vc/vc-svn.el
+++ b/lisp/vc/vc-svn.el
@@ -147,7 +147,8 @@ switches."
 (defun vc-svn-registered (file)
   "Check if FILE is SVN registered."
   (setq file (expand-file-name file))
-  (when (vc-svn-root file)
+  (when (and (vc-svn-root file)
+             (file-accessible-directory-p (file-name-directory file)))
     (with-temp-buffer
       (cd (file-name-directory file))
       (let* (process-file-side-effects
@@ -309,11 +310,14 @@ to the SVN command."
 
 (defalias 'vc-svn-responsible-p 'vc-svn-root)
 
+(declare-function log-edit-extract-headers "log-edit" (headers string))
+
 (defun vc-svn-checkin (files comment &optional _extra-args-ignored)
   "SVN-specific version of `vc-backend-checkin'."
   (let ((status (apply
                  'vc-svn-command nil 1 files "ci"
-                 (nconc (list "-m" comment) (vc-switches 'SVN 'checkin)))))
+                 (nconc (cons "-m" (log-edit-extract-headers nil comment))
+                        (vc-switches 'SVN 'checkin)))))
     (set-buffer "*vc*")
     (goto-char (point-min))
     (unless (equal status 0)
@@ -400,6 +404,8 @@ FILE is a file wildcard, relative to the root directory of 
DIRECTORY."
   (unless contents-done
     (vc-svn-command nil 0 file "revert")))
 
+(autoload 'vc-read-revision "vc")
+
 (defun vc-svn-merge-file (file)
   "Accept a file merge request, prompting for revisions."
   (let* ((first-revision
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index 178b5f0..f05d45c 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -1026,9 +1026,6 @@ BEWARE: this function may change the current buffer."
       (if observer
          (vc-dired-deduce-fileset)
        (error "State changing VC operations not supported in `dired-mode'")))
-     ((and (derived-mode-p 'log-view-mode)
-          (setq backend (vc-responsible-backend default-directory)))
-      (list backend default-directory))
      ((setq backend (vc-backend buffer-file-name))
       (if state-model-only-files
        (list backend (list buffer-file-name)
@@ -1044,6 +1041,9 @@ BEWARE: this function may change the current buffer."
       (progn                  ;FIXME: Why not `with-current-buffer'? --Stef.
        (set-buffer vc-parent-buffer)
        (vc-deduce-fileset observer allow-unregistered state-model-only-files)))
+     ((and (derived-mode-p 'log-view-mode)
+          (setq backend (vc-responsible-backend default-directory)))
+      (list backend nil))
      ((not buffer-file-name)
        (error "Buffer %s is not associated with a file" (buffer-name)))
      ((and allow-unregistered (not (vc-registered buffer-file-name)))
@@ -2200,7 +2200,7 @@ Not all VC backends support short logs!")
 In the new log, leave point at WORKING-REVISION (if non-nil).
 LIMIT is the number of entries currently shown.
 Does nothing if IS-START-REVISION is non-nil, or if LIMIT is nil,
-or if PL-RETURN is 'limit-unsupported."
+or if PL-RETURN is `limit-unsupported'."
   (when (and limit (not (eq 'limit-unsupported pl-return))
             (not is-start-revision))
     (goto-char (point-max))
@@ -2467,7 +2467,8 @@ to the working revision (except for keyword expansion)."
 You must be visiting a version controlled file, or in a `vc-dir' buffer.
 On a distributed version control system, this runs a \"pull\"
 operation to update the current branch, prompting for an argument
-list if required.  Optional prefix ARG forces a prompt.
+list if required.  Optional prefix ARG forces a prompt for the VCS
+command to run.
 
 On a non-distributed version control system, update the current
 fileset to the tip revisions.  For each unchanged and unlocked
@@ -2511,8 +2512,11 @@ tip revision are merged into the working file."
 You must be visiting a version controlled file, or in a `vc-dir' buffer.
 On a distributed version control system, this runs a \"push\"
 operation on the current branch, prompting for the precise command
-if required.  Optional prefix ARG non-nil forces a prompt.
-On a non-distributed version control system, this signals an error."
+if required.  Optional prefix ARG non-nil forces a prompt for the
+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."
   (interactive "P")
   (let* ((vc-fileset (vc-deduce-fileset t))
         (backend (car vc-fileset)))
diff --git a/lisp/version.el b/lisp/version.el
index 43103fd..4207cb4 100644
--- a/lisp/version.el
+++ b/lisp/version.el
@@ -113,17 +113,17 @@ or if we could not determine the revision.")
                  (looking-at "[0-9a-fA-F]\\{40\\}"))
           (match-string 0)))))
 
-(defun emacs-repository--version-git-1 (file)
+(defun emacs-repository--version-git-1 (file dir)
   "Internal subroutine of `emacs-repository-get-version'."
   (when (file-readable-p file)
-    (erase-buffer)
-    (insert-file-contents file)
-    (cond ((looking-at "[0-9a-fA-F]\\{40\\}")
-          (match-string 0))
-         ((looking-at "ref: \\(.*\\)")
-          (emacs-repository--version-git-1
-           (expand-file-name (match-string 1)
-                             (file-name-directory file)))))))
+    (with-temp-buffer
+      (insert-file-contents file)
+      (cond ((looking-at "[0-9a-fA-F]\\{40\\}")
+             (match-string 0))
+            ((looking-at "ref: \\(.*\\)")
+             (emacs-repository--version-git-1
+              (expand-file-name (match-string 1) dir)
+              dir))))))
 
 (defun emacs-repository-get-version (&optional dir external)
   "Try to return as a string the repository revision of the Emacs sources.
@@ -138,20 +138,38 @@ Optional argument EXTERNAL non-nil means to just ask the 
VCS itself,
 if the sources appear to be under version control.  Otherwise only ask
 the VCS if we cannot find any information ourselves."
   (or dir (setq dir source-directory))
-  (when (file-directory-p (expand-file-name ".git" dir))
-    (if external
-       (emacs-repository-version-git dir)
-      (or (let ((files '("HEAD" "refs/heads/master"))
-               file rev)
-           (with-temp-buffer
-             (while (and (not rev)
-                         (setq file (car files)))
-               (setq file (expand-file-name (format ".git/%s" file) dir)
-                     files (cdr files)
-                     rev (emacs-repository--version-git-1 file))))
-           rev)
-         ;; AFAICS this doesn't work during dumping (bug#20799).
-         (emacs-repository-version-git dir)))))
+  (let* ((base-dir (expand-file-name ".git" dir))
+         (in-main-worktree (file-directory-p base-dir))
+         (in-linked-worktree nil)
+         sub-dir)
+    ;; If the sources are in a linked worktree, .git is a file that points to
+    ;; the location of the main worktree and the repo's administrative files.
+    (when (and (not in-main-worktree)
+               (file-regular-p base-dir)
+               (file-readable-p base-dir))
+      (with-temp-buffer
+        (insert-file-contents base-dir)
+        (when (looking-at "gitdir: \\(.*\.git\\)\\(.*\\)$")
+          (setq base-dir (match-string 1)
+                sub-dir (concat base-dir (match-string 2))
+                in-linked-worktree t))))
+    ;; We've found a worktree, either main or linked.
+    (when (or in-main-worktree in-linked-worktree)
+      (if external
+          (emacs-repository-version-git dir)
+        (or (if in-linked-worktree
+                (emacs-repository--version-git-1
+                 (expand-file-name "HEAD" sub-dir) base-dir)
+              (let ((files '("HEAD" "refs/heads/master"))
+                    file rev)
+                (while (and (not rev)
+                            (setq file (car files)))
+                  (setq file (expand-file-name file base-dir)
+                        files (cdr files)
+                        rev (emacs-repository--version-git-1 file base-dir)))
+                rev))
+            ;; AFAICS this doesn't work during dumping (bug#20799).
+            (emacs-repository-version-git dir))))))
 
 ;; We put version info into the executable in the form that `ident' uses.
 (purecopy (concat "\n$Id: " (subst-char-in-string ?\n ?\s (emacs-version))
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index 0d9157a..d0410aa 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -1267,7 +1267,7 @@ When not inside a field, signal an error."
 
 (defun widget-field-find (pos)
   "Return the field at POS.
-Unlike (get-char-property POS 'field), this works with empty fields too."
+Unlike (get-char-property POS \\='field), this works with empty fields too."
   (let ((fields widget-field-list)
        field found)
     (while fields
diff --git a/lisp/windmove.el b/lisp/windmove.el
index 1df74a2..52297ec 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -546,7 +546,7 @@ If no window is at the desired location, an error is 
signaled."
 (defun windmove-default-keybindings (&optional modifier)
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIER-{left,right,up,down}.
-Default MODIFIER is 'shift."
+Default MODIFIER is `shift'."
   (interactive)
   (unless modifier (setq modifier 'shift))
   (global-set-key (vector (list modifier 'left))  'windmove-left)
diff --git a/lisp/window.el b/lisp/window.el
index 6d18905..74512ce 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -3707,7 +3707,7 @@ and no others."
 (defun window-deletable-p (&optional window)
   "Return t if WINDOW can be safely deleted from its frame.
 WINDOW must be a valid window and defaults to the selected one.
-Return 'frame if deleting WINDOW should also delete its frame."
+Return `frame' if deleting WINDOW should also delete its frame."
   (setq window (window-normalize-window window))
 
   (unless (or ignore-window-parameters
@@ -4851,8 +4851,9 @@ frame.  The selected window is not changed by this 
function."
              (set-window-parameter (window-parent new) 'window-atom t))
            (set-window-parameter new 'window-atom t)))
 
-         ;; Sanitize sizes.
-         (window--sanitize-window-sizes frame horizontal)
+         ;; Sanitize sizes unless SIZE was specified.
+         (unless size
+            (window--sanitize-window-sizes frame horizontal))
 
          (run-window-configuration-change-hook frame)
          (run-window-scroll-functions new)
@@ -6491,7 +6492,7 @@ action.  Its form is described below.
 Optional argument FRAME, if non-nil, acts like an additional
 ALIST entry (reusable-frames . FRAME) to the action list of ACTION,
 specifying the frame(s) to search for a window that is already
-displaying the buffer.  See `display-buffer-reuse-window'
+displaying the buffer.  See `display-buffer-reuse-window'.
 
 If ACTION is non-nil, it should have the form (FUNCTION . ALIST),
 where FUNCTION is either a function or a list of functions, and
@@ -6562,9 +6563,9 @@ Recognized alist entries include:
     of not displaying the buffer and FUNCTION can safely return
     a non-window value to suppress displaying.
 
- `preserve-size' -- Value should be either '(t . nil)' to
-    preserve the width of the window, '(nil . t)' to preserve its
-    height or '(t . t)' to preserve both.
+ `preserve-size' -- Value should be either (t . nil) to
+    preserve the width of the window, (nil . t) to preserve its
+    height or (t . t) to preserve both.
 
 The ACTION argument to `display-buffer' can also have a non-nil
 and non-list value.  This means to display the buffer in a window
@@ -6845,7 +6846,7 @@ selected frame."
     (or (and bottom-window-shows-buffer
             (window--display-buffer
              buffer bottom-window 'reuse alist display-buffer-mark-dedicated))
-     (and (not (frame-parameter nil 'unsplittable))
+       (and (not (frame-parameter nil 'unsplittable))
             (let (split-width-threshold)
               (setq window (window--try-to-split-window bottom-window alist)))
             (window--display-buffer
@@ -7869,6 +7870,152 @@ Return non-nil if the window was shrunk, nil otherwise."
         (remove-hook 'kill-buffer-hook delete-window-hook t))))))
 
 
+;;;
+;; Groups of windows (Follow Mode).
+;;
+;; This section of functions extends the functionality of some window
+;; manipulating commands to groups of windows cooperatively
+;; displaying a buffer, typically with Follow Mode.
+;;
+;; The xxx-function variables are permanent locals so that their local
+;; status is undone only when explicitly programmed, not when a buffer
+;; is reverted or a mode function is called.
+
+(defvar window-group-start-function nil)
+(make-variable-buffer-local 'window-group-start-function)
+(put 'window-group-start-function 'permanent-local t)
+(defun window-group-start (&optional window)
+  "Return position at which display currently starts in the group of
+windows containing WINDOW.  When a grouping mode (such as Follow Mode)
+is not active, this function is identical to `window-start'.
+
+WINDOW must be a live window and defaults to the selected one.
+This is updated by redisplay or by calling `set-window*-start'."
+  (if (functionp window-group-start-function)
+      (funcall window-group-start-function window)
+    (window-start window)))
+
+(defvar window-group-end-function nil)
+(make-variable-buffer-local 'window-group-end-function)
+(put 'window-group-end-function 'permanent-local t)
+(defun window-group-end (&optional window update)
+  "Return position at which display currently ends in the group of
+windows containing WINDOW.  When a grouping mode (such as Follow Mode)
+is not active, this function is identical to `window-end'.
+
+WINDOW must be a live window and defaults to the selected one.
+This is updated by redisplay, when it runs to completion.
+Simply changing the buffer text or setting `window-group-start'
+does not update this value.
+Return nil if there is no recorded value.  (This can happen if the
+last redisplay of WINDOW was preempted, and did not finish.)
+If UPDATE is non-nil, compute the up-to-date position
+if it isn't already recorded."
+  (if (functionp window-group-end-function)
+      (funcall window-group-end-function window update)
+    (window-end window update)))
+
+(defvar set-window-group-start-function nil)
+(make-variable-buffer-local 'set-window-group-start-function)
+(put 'set-window-group-start-function 'permanent-local t)
+(defun set-window-group-start (window pos &optional noforce)
+  "Make display in the group of windows containing WINDOW start at
+position POS in WINDOW's buffer.  When a grouping mode (such as Follow
+Mode) is not active, this function is identical to `set-window-start'.
+
+WINDOW must be a live window and defaults to the selected one.  Return
+POS.  Optional third arg NOFORCE non-nil inhibits next redisplay from
+overriding motion of point in order to display at this exact start."
+  (if (functionp set-window-group-start-function)
+      (funcall set-window-group-start-function window pos noforce)
+    (set-window-start window pos noforce)))
+
+(defvar recenter-window-group-function nil)
+(make-variable-buffer-local 'recenter-window-group-function)
+(put 'recenter-window-group-function 'permanent-local t)
+(defun recenter-window-group (&optional arg)
+  "Center point in the group of windows containing the selected window
+and maybe redisplay frame.  When a grouping mode (such as Follow Mode)
+is not active, this function is identical to `recenter'.
+
+With a numeric prefix argument ARG, recenter putting point on screen line ARG
+relative to the first window in the selected window group.  If ARG is
+negative, it counts up from the bottom of the last window in the
+group.  (ARG should be less than the total height of the window group.)
+
+If ARG is omitted or nil, then recenter with point on the middle line of
+the selected window group; if the variable `recenter-redisplay' is
+non-nil, also erase the entire frame and redraw it (when
+`auto-resize-tool-bars' is set to `grow-only', this resets the
+tool-bar's height to the minimum height needed); if
+`recenter-redisplay' has the special value `tty', then only tty frames
+are redrawn.
+
+Just C-u as prefix means put point in the center of the window
+and redisplay normally--don't erase and redraw the frame."
+  (if (functionp recenter-window-group-function)
+      (funcall recenter-window-group-function arg)
+    (recenter arg)))
+
+(defvar pos-visible-in-window-group-p-function nil)
+(make-variable-buffer-local 'pos-visible-in-window-group-p-function)
+(put 'pos-visible-in-window-group-p-function 'permanent-local t)
+(defun pos-visible-in-window-group-p (&optional pos window partially)
+  "Return non-nil if position POS is currently on the frame in the
+window group containing WINDOW.  When a grouping mode (such as Follow
+Mode) is not active, this function is identical to
+`pos-visible-in-window-p'.
+
+WINDOW must be a live window and defaults to the selected one.
+
+Return nil if that position is scrolled vertically out of view.  If a
+character is only partially visible, nil is returned, unless the
+optional argument PARTIALLY is non-nil.  If POS is only out of view
+because of horizontal scrolling, return non-nil.  If POS is t, it
+specifies the position of the last visible glyph in the window group.
+POS defaults to point in WINDOW; WINDOW defaults to the selected
+window.
+
+If POS is visible, return t if PARTIALLY is nil; if PARTIALLY is non-nil,
+the return value is a list of 2 or 6 elements (X Y [RTOP RBOT ROWH VPOS]),
+where X and Y are the pixel coordinates relative to the top left corner
+of the window.  The remaining elements are omitted if the character after
+POS is fully visible; otherwise, RTOP and RBOT are the number of pixels
+off-window at the top and bottom of the screen line (\"row\") containing
+POS, ROWH is the visible height of that row, and VPOS is the row number
+\(zero-based)."
+  (if (functionp pos-visible-in-window-group-p-function)
+      (funcall pos-visible-in-window-group-p-function pos window partially)
+    (pos-visible-in-window-p pos window partially)))
+
+(defvar selected-window-group-function nil)
+(make-variable-buffer-local 'selected-window-group-function)
+(put 'selected-window-group-function 'permanent-local t)
+(defun selected-window-group ()
+  "Return the list of windows in the group containing the selected window.
+When a grouping mode (such as Follow Mode) is not active, the
+result is a list containing only the selected window."
+  (if (functionp selected-window-group-function)
+      (funcall selected-window-group-function)
+    (list (selected-window))))
+
+(defvar move-to-window-group-line-function nil)
+(make-variable-buffer-local 'move-to-window-group-line-function)
+(put 'move-to-window-group-line-function 'permanent-local t)
+(defun move-to-window-group-line (arg)
+  "Position point relative to the the current group of windows.
+When a grouping mode (such as Follow Mode) is not active, this
+function is identical to `move-to-window-line'.
+
+ARG nil means position point at center of the window group.
+Else, ARG specifies the vertical position within the window
+group; zero means top of first window in the group, negative
+means relative to the bottom of the last window in the group."
+  (if (functionp move-to-window-group-line-function)
+      (funcall move-to-window-group-line-function arg)
+    (move-to-window-line arg)))
+
+
 (defvar recenter-last-op nil
   "Indicates the last recenter operation performed.
 Possible values: `top', `middle', `bottom', integer or float numbers.
diff --git a/lisp/woman.el b/lisp/woman.el
index 81319fa..d4174d4 100644
--- a/lisp/woman.el
+++ b/lisp/woman.el
@@ -738,7 +738,7 @@ the `woman' command to update and re-write the cache."
 
 (defcustom woman-dired-keys t
   "List of `dired' mode keys to define to run WoMan on current file.
-E.g. '(\"w\" \"W\"), or any non-null atom to automatically define
+E.g. (\"w\" \"W\"), or any non-null atom to automatically define
 \"w\" and \"W\" if they are unbound, or nil to do nothing.
 Default is t."
   :type '(choice (const :tag "None" nil)
@@ -1102,7 +1102,7 @@ The ordinal numbers start from 0.")
 (defvar woman-if-conditions-true '(?n ?e ?o)
   "List of one-character built-in condition names that are true.
 Should include ?e, ?o (page even/odd) and either ?n (nroff) or ?t (troff).
-Default is '(?n ?e ?o).  Set via `woman-emulation'.")
+Default is (?n ?e ?o).  Set via `woman-emulation'.")
 
 
 ;;; Specialized utility functions:
@@ -1749,7 +1749,7 @@ Leave point at end of new text.  Return length of 
inserted text."
   ;; start in 19.34!
   (save-excursion
     (let ((case-fold-search t))
-      ;; Co-operate with auto-compression mode:
+      ;; Cooperate with auto-compression mode:
       (if (and compressed
               (or (eq compressed t)
                   (string-match-p woman-file-compression-regexp filename))
@@ -2218,7 +2218,7 @@ To be called on original buffer and any .so insertions."
 (defvar woman-emulate-tbl nil
   "True if WoMan should emulate the tbl preprocessor.
 This applies to text between .TE and .TS directives.
-Currently set only from '\" t in the first line of the source file.")
+Currently set only from \\='\\\" t in the first line of the source file.")
 
 (defun woman-decode-region (from _to)
   "Decode the region between FROM and TO in UN*X man-page source format."
diff --git a/lisp/xml.el b/lisp/xml.el
index f5a9a3f..7a853d9 100644
--- a/lisp/xml.el
+++ b/lisp/xml.el
@@ -126,9 +126,9 @@ tag.  For example,
 
 would be represented by
 
-    '(\"\" . \"foo\").
+    (\"\" . \"foo\").
 
-If you'd just like a plain symbol instead, use 'symbol-qnames in
+If you'd just like a plain symbol instead, use `symbol-qnames' in
 the PARSE-NS argument."
 
   (car node))
@@ -1010,12 +1010,12 @@ The first line is indented with the optional 
INDENT-STRING."
 
 (defun xml-escape-string (string)
   "Convert STRING into a string containing valid XML character data.
-Replace occurrences of &<>'\" in STRING with their default XML
-entity references (e.g. replace each & with &amp;).
+Replace occurrences of &<>\\='\" in STRING with their default XML
+entity references (e.g., replace each & with &amp;).
 
 XML character data must not contain & or < characters, nor the >
 character under some circumstances.  The XML spec does not impose
-restriction on \" or ', but we just substitute for these too
+restriction on \" or \\=', but we just substitute for these too
 \(as is permitted by the spec)."
   (with-temp-buffer
     (insert string)
diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c
index 61f175b..7e766bb 100644
--- a/lwlib/xlwmenu.c
+++ b/lwlib/xlwmenu.c
@@ -28,13 +28,7 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 #include <stdio.h>
 
 #include <sys/types.h>
-#if (defined __sun) && !(defined SUNOS41)
-#define SUNOS41
 #include <X11/Xos.h>
-#undef SUNOS41
-#else
-#include <X11/Xos.h>
-#endif
 #include <X11/IntrinsicP.h>
 #include <X11/ObjectP.h>
 #include <X11/StringDefs.h>
diff --git a/m4/ax_gcc_var_attribute.m4 b/m4/ax_gcc_var_attribute.m4
new file mode 100644
index 0000000..d12fce8
--- /dev/null
+++ b/m4/ax_gcc_var_attribute.m4
@@ -0,0 +1,141 @@
+# ===========================================================================
+#   http://www.gnu.org/software/autoconf-archive/ax_gcc_var_attribute.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_GCC_VAR_ATTRIBUTE(ATTRIBUTE)
+#
+# DESCRIPTION
+#
+#   This macro checks if the compiler supports one of GCC's variable
+#   attributes; many other compilers also provide variable attributes with
+#   the same syntax. Compiler warnings are used to detect supported
+#   attributes as unsupported ones are ignored by default so quieting
+#   warnings when using this macro will yield false positives.
+#
+#   The ATTRIBUTE parameter holds the name of the attribute to be checked.
+#
+#   If ATTRIBUTE is supported define HAVE_VAR_ATTRIBUTE_<ATTRIBUTE>.
+#
+#   The macro caches its result in the ax_cv_have_var_attribute_<attribute>
+#   variable.
+#
+#   The macro currently supports the following variable attributes:
+#
+#    aligned
+#    cleanup
+#    common
+#    nocommon
+#    deprecated
+#    mode
+#    packed
+#    tls_model
+#    unused
+#    used
+#    vector_size
+#    weak
+#    dllimport
+#    dllexport
+#    init_priority
+#
+#   Unsupported variable attributes will be tested against a global integer
+#   variable and without any arguments given to the attribute itself; the
+#   result of this check might be wrong or meaningless so use with care.
+#
+# LICENSE
+#
+#   Copyright (c) 2013 Gabriele Svelto <address@hidden>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved.  This file is offered as-is, without any
+#   warranty.
+
+#serial 3
+
+AC_DEFUN([AX_GCC_VAR_ATTRIBUTE], [
+    AS_VAR_PUSHDEF([ac_var], [ax_cv_have_var_attribute_$1])
+
+    AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [
+        AC_LINK_IFELSE([AC_LANG_PROGRAM([
+            m4_case([$1],
+                [aligned], [
+                    int foo __attribute__(($1(32)));
+                ],
+                [cleanup], [
+                    int bar(int *t) { return *t; };
+                ],
+                [common], [
+                    int foo __attribute__(($1));
+                ],
+                [nocommon], [
+                    int foo __attribute__(($1));
+                ],
+                [deprecated], [
+                    int foo __attribute__(($1)) = 0;
+                ],
+                [mode], [
+                    long foo __attribute__(($1(word)));
+                ],
+                [packed], [
+                    struct bar {
+                        int baz __attribute__(($1));
+                    };
+                ],
+                [tls_model], [
+                    __thread int bar1 __attribute__(($1("global-dynamic")));
+                    __thread int bar2 __attribute__(($1("local-dynamic")));
+                    __thread int bar3 __attribute__(($1("initial-exec")));
+                    __thread int bar4 __attribute__(($1("local-exec")));
+                ],
+                [unused], [
+                    int foo __attribute__(($1));
+                ],
+                [used], [
+                    int foo __attribute__(($1));
+                ],
+                [vector_size], [
+                    int foo __attribute__(($1(16)));
+                ],
+                [weak], [
+                    int foo __attribute__(($1));
+                ],
+                [dllimport], [
+                    int foo __attribute__(($1));
+                ],
+                [dllexport], [
+                    int foo __attribute__(($1));
+                ],
+                [init_priority], [
+                    struct bar { bar() {} ~bar() {} };
+                    bar b __attribute__(($1(65535/2)));
+                ],
+                [
+                 m4_warn([syntax], [Unsupported attribute $1, the test may 
fail])
+                 int foo __attribute__(($1));
+                ]
+            )], [
+            m4_case([$1],
+                [cleanup], [
+                    int foo __attribute__(($1(bar))) = 0;
+                    foo = foo + 1;
+                ],
+                []
+            )])
+            ],
+            dnl GCC doesn't exit with an error if an unknown attribute is
+            dnl provided but only outputs a warning, so accept the attribute
+            dnl only if no warning were issued.
+            [AS_IF([test -s conftest.err],
+                [AS_VAR_SET([ac_var], [no])],
+                [AS_VAR_SET([ac_var], [yes])])],
+            [AS_VAR_SET([ac_var], [no])])
+    ])
+
+    AS_IF([test yes = AS_VAR_GET([ac_var])],
+        [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_VAR_ATTRIBUTE_$1), 1,
+            [Define to 1 if the system has the `$1' variable attribute])], [])
+
+    AS_VAR_POPDEF([ac_var])
+])
diff --git a/modules/mod-test/Makefile b/modules/mod-test/Makefile
new file mode 100644
index 0000000..04529db
--- /dev/null
+++ b/modules/mod-test/Makefile
@@ -0,0 +1,45 @@
+# Test GNU Emacs modules.
+
+# Copyright 2015 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 <http://www.gnu.org/licenses/>.
+
+ROOT = ../..
+EMACS = $(ROOT)/src/emacs
+
+CC      = gcc
+LD      = gcc
+LDFLAGS =
+
+# On MS-Windows, say "make SO=dll" to build the module
+SO      = so
+# -fPIC is a no-op on Windows, but causes a compiler warning
+ifeq ($(SO),dll)
+CFLAGS  = -std=gnu99 -ggdb3 -Wall
+else
+CFLAGS  = -std=gnu99 -ggdb3 -Wall -fPIC
+endif
+
+all: mod-test.$(SO)
+
+%.$(SO): %.o
+       $(LD) -shared $(LDFLAGS) -o $@ $<
+
+%.o: %.c
+       $(CC) $(CFLAGS) -I$(ROOT)/src -c $<
+
+check:
+       $(EMACS) -batch -l ert -l test.el -f ert-run-tests-batch-and-exit
diff --git a/modules/mod-test/mod-test.c b/modules/mod-test/mod-test.c
new file mode 100644
index 0000000..862bb81
--- /dev/null
+++ b/modules/mod-test/mod-test.c
@@ -0,0 +1,268 @@
+/* Test GNU Emacs modules.
+
+Copyright 2015 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 <http://www.gnu.org/licenses/>.  */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <emacs-module.h>
+
+int plugin_is_GPL_compatible;
+
+/* Always return symbol 't'.  */
+static emacs_value
+Fmod_test_return_t (emacs_env *env, ptrdiff_t nargs, emacs_value args[],
+                   void *data)
+{
+  return env->intern (env, "t");
+}
+
+/* Expose simple sum function.  */
+static intmax_t
+sum (intmax_t a, intmax_t b)
+{
+  return a + b;
+}
+
+static emacs_value
+Fmod_test_sum (emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data)
+{
+  assert (nargs == 2);
+
+  intmax_t a = env->extract_integer (env, args[0]);
+  intmax_t b = env->extract_integer (env, args[1]);
+
+  intmax_t r = sum (a, b);
+
+  return env->make_integer (env, r);
+}
+
+
+/* Signal '(error 56).  */
+static emacs_value
+Fmod_test_signal (emacs_env *env, ptrdiff_t nargs, emacs_value args[],
+                 void *data)
+{
+  assert (env->non_local_exit_check (env) == emacs_funcall_exit_return);
+  env->non_local_exit_signal (env, env->intern (env, "error"),
+                             env->make_integer (env, 56));
+  return env->intern (env, "nil");
+}
+
+
+/* Throw '(tag 65).  */
+static emacs_value
+Fmod_test_throw (emacs_env *env, ptrdiff_t nargs, emacs_value args[],
+                void *data)
+{
+  assert (env->non_local_exit_check (env) == emacs_funcall_exit_return);
+  env->non_local_exit_throw (env, env->intern (env, "tag"),
+                            env->make_integer (env, 65));
+  return env->intern (env, "nil");
+}
+
+
+/* Call argument function, catch all non-local exists and return
+   either normal result or a list describing the non-local exit.  */
+static emacs_value
+Fmod_test_non_local_exit_funcall (emacs_env *env, ptrdiff_t nargs,
+                                 emacs_value args[], void *data)
+{
+  assert (nargs == 1);
+  emacs_value result = env->funcall (env, args[0], 0, NULL);
+  emacs_value non_local_exit_symbol, non_local_exit_data;
+  enum emacs_funcall_exit code
+    = env->non_local_exit_get (env, &non_local_exit_symbol,
+                              &non_local_exit_data);
+  switch (code)
+    {
+    case emacs_funcall_exit_return:
+      return result;
+    case emacs_funcall_exit_signal:
+      {
+        env->non_local_exit_clear (env);
+        emacs_value Flist = env->intern (env, "list");
+        emacs_value list_args[] = {env->intern (env, "signal"),
+                                  non_local_exit_symbol, non_local_exit_data};
+        return env->funcall (env, Flist, 3, list_args);
+      }
+    case emacs_funcall_exit_throw:
+      {
+        env->non_local_exit_clear (env);
+        emacs_value Flist = env->intern (env, "list");
+        emacs_value list_args[] = {env->intern (env, "throw"),
+                                  non_local_exit_symbol, non_local_exit_data};
+        return env->funcall (env, Flist, 3, list_args);
+      }
+    }
+
+  /* Never reached.  */
+  return env->intern (env, "nil");;
+}
+
+
+/* Return a global reference.  */
+static emacs_value
+Fmod_test_globref_make (emacs_env *env, ptrdiff_t nargs, emacs_value args[],
+                       void *data)
+{
+  /* Make a big string and make it global.  */
+  char str[26 * 100];
+  for (int i = 0; i < sizeof str; i++)
+    str[i] = 'a' + (i % 26);
+
+  /* We don't need to null-terminate str.  */
+  emacs_value lisp_str = env->make_string (env, str, sizeof str);
+  return env->make_global_ref (env, lisp_str);
+}
+
+
+/* Return a copy of the argument string where every 'a' is replaced
+   with 'b'.  */
+static emacs_value
+Fmod_test_string_a_to_b (emacs_env *env, ptrdiff_t nargs, emacs_value args[],
+                        void *data)
+{
+  emacs_value lisp_str = args[0];
+  ptrdiff_t size = 0;
+  char * buf = NULL;
+
+  env->copy_string_contents (env, lisp_str, buf, &size);
+  buf = malloc (size);
+  env->copy_string_contents (env, lisp_str, buf, &size);
+
+  for (ptrdiff_t i = 0; i + 1 < size; i++)
+    if (buf[i] == 'a')
+      buf[i] = 'b';
+
+  return env->make_string (env, buf, size - 1);
+}
+
+
+/* Embedded pointers in lisp objects.  */
+
+/* C struct (pointer to) that will be embedded.  */
+struct super_struct
+{
+  int amazing_int;
+  char large_unused_buffer[512];
+};
+
+/* Return a new user-pointer to a super_struct, with amazing_int set
+   to the passed parameter.  */
+static emacs_value
+Fmod_test_userptr_make (emacs_env *env, ptrdiff_t nargs, emacs_value args[],
+                       void *data)
+{
+  struct super_struct *p = calloc (1, sizeof *p);
+  p->amazing_int = env->extract_integer (env, args[0]);
+  return env->make_user_ptr (env, free, p);
+}
+
+/* Return the amazing_int of a passed 'user-pointer to a super_struct'.  */
+static emacs_value
+Fmod_test_userptr_get (emacs_env *env, ptrdiff_t nargs, emacs_value args[],
+                      void *data)
+{
+  struct super_struct *p = env->get_user_ptr (env, args[0]);
+  return env->make_integer (env, p->amazing_int);
+}
+
+
+/* Fill vector in args[0] with value in args[1].  */
+static emacs_value
+Fmod_test_vector_fill (emacs_env *env, ptrdiff_t nargs, emacs_value args[],
+                      void *data)
+{
+  emacs_value vec = args[0];
+  emacs_value val = args[1];
+  ptrdiff_t size = env->vec_size (env, vec);
+  for (ptrdiff_t i = 0; i < size; i++)
+    env->vec_set (env, vec, i, val);
+  return env->intern (env, "t");
+}
+
+
+/* Return whether all elements of vector in args[0] are 'eq' to value
+   in args[1].  */
+static emacs_value
+Fmod_test_vector_eq (emacs_env *env, ptrdiff_t nargs, emacs_value args[],
+                    void *data)
+{
+  emacs_value vec = args[0];
+  emacs_value val = args[1];
+  ptrdiff_t size = env->vec_size (env, vec);
+  for (ptrdiff_t i = 0; i < size; i++)
+    if (!env->eq (env, env->vec_get (env, vec, i), val))
+        return env->intern (env, "nil");
+  return env->intern (env, "t");
+}
+
+
+/* Lisp utilities for easier readability (simple wrappers).  */
+
+/* Provide FEATURE to Emacs.  */
+static void
+provide (emacs_env *env, const char *feature)
+{
+  emacs_value Qfeat = env->intern (env, feature);
+  emacs_value Qprovide = env->intern (env, "provide");
+  emacs_value args[] = { Qfeat };
+
+  env->funcall (env, Qprovide, 1, args);
+}
+
+/* Bind NAME to FUN.  */
+static void
+bind_function (emacs_env *env, const char *name, emacs_value Sfun)
+{
+  emacs_value Qfset = env->intern (env, "fset");
+  emacs_value Qsym = env->intern (env, name);
+  emacs_value args[] = { Qsym, Sfun };
+
+  env->funcall (env, Qfset, 2, args);
+}
+
+/* Module init function.  */
+int
+emacs_module_init (struct emacs_runtime *ert)
+{
+  emacs_env *env = ert->get_environment (ert);
+
+#define DEFUN(lsym, csym, amin, amax, doc, data) \
+  bind_function (env, lsym, \
+                env->make_function (env, amin, amax, csym, doc, data))
+
+  DEFUN ("mod-test-return-t", Fmod_test_return_t, 1, 1, NULL, NULL);
+  DEFUN ("mod-test-sum", Fmod_test_sum, 2, 2, "Return A + B", NULL);
+  DEFUN ("mod-test-signal", Fmod_test_signal, 0, 0, NULL, NULL);
+  DEFUN ("mod-test-throw", Fmod_test_throw, 0, 0, NULL, NULL);
+  DEFUN ("mod-test-non-local-exit-funcall", Fmod_test_non_local_exit_funcall,
+        1, 1, NULL, NULL);
+  DEFUN ("mod-test-globref-make", Fmod_test_globref_make, 0, 0, NULL, NULL);
+  DEFUN ("mod-test-string-a-to-b", Fmod_test_string_a_to_b, 1, 1, NULL, NULL);
+  DEFUN ("mod-test-userptr-make", Fmod_test_userptr_make, 1, 1, NULL, NULL);
+  DEFUN ("mod-test-userptr-get", Fmod_test_userptr_get, 1, 1, NULL, NULL);
+  DEFUN ("mod-test-vector-fill", Fmod_test_vector_fill, 2, 2, NULL, NULL);
+  DEFUN ("mod-test-vector-eq", Fmod_test_vector_eq, 2, 2, NULL, NULL);
+
+#undef DEFUN
+
+  provide (env, "mod-test");
+  return 0;
+}
diff --git a/modules/mod-test/test.el b/modules/mod-test/test.el
new file mode 100644
index 0000000..69bf933
--- /dev/null
+++ b/modules/mod-test/test.el
@@ -0,0 +1,134 @@
+;;; Test GNU Emacs modules.
+
+;; Copyright 2015 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 <http://www.gnu.org/licenses/>.  */
+
+(require 'ert)
+
+(add-to-list 'load-path
+             (file-name-directory (or #$ (expand-file-name 
(buffer-file-name)))))
+(require 'mod-test)
+
+;;
+;; Basic tests.
+;;
+
+(ert-deftest mod-test-sum-test ()
+  (should (= (mod-test-sum 1 2) 3))
+  (let ((descr (should-error (mod-test-sum 1 2 3))))
+    (should (eq (car descr) 'wrong-number-of-arguments))
+    (should (stringp (nth 1 descr)))
+    (should (eq 0
+                (string-match
+                 (concat "#<module function "
+                         "\\(at \\(0x\\)?[0-9a-fA-F]+\\( from .*\\)?"
+                         "\\|Fmod_test_sum from .*\\)>")
+                 (nth 1 descr))))
+    (should (= (nth 2 descr) 3)))
+  (should-error (mod-test-sum "1" 2) :type 'wrong-type-argument)
+  (should-error (mod-test-sum 1 "2") :type 'wrong-type-argument)
+  ;; The following tests are for 32-bit build --with-wide-int.
+  (should (= (mod-test-sum -1 most-positive-fixnum)
+             (1- most-positive-fixnum)))
+  (should (= (mod-test-sum 1 most-negative-fixnum)
+             (1+ most-negative-fixnum)))
+  (when (< #x1fffffff most-positive-fixnum)
+    (should (= (mod-test-sum 1 #x1fffffff)
+               (1+ #x1fffffff)))
+    (should (= (mod-test-sum -1 #x20000000)
+               #x1fffffff)))
+  (should-error (mod-test-sum 1 most-positive-fixnum)
+                :type 'overflow-error)
+  (should-error (mod-test-sum -1 most-negative-fixnum)
+                :type 'overflow-error))
+
+(ert-deftest mod-test-sum-docstring ()
+  (should (string= (documentation 'mod-test-sum) "Return A + B")))
+
+;;
+;; Non-local exists (throw, signal).
+;;
+
+(ert-deftest mod-test-non-local-exit-signal-test ()
+  (should-error (mod-test-signal)))
+
+(ert-deftest mod-test-non-local-exit-throw-test ()
+  (should (equal
+           (catch 'tag
+             (mod-test-throw)
+             (ert-fail "expected throw"))
+           65)))
+
+(ert-deftest mod-test-non-local-exit-funcall-normal ()
+  (should (equal (mod-test-non-local-exit-funcall (lambda () 23))
+                 23)))
+
+(ert-deftest mod-test-non-local-exit-funcall-signal ()
+  (should (equal (mod-test-non-local-exit-funcall
+                  (lambda () (signal 'error '(32))))
+                 '(signal error (32)))))
+
+(ert-deftest mod-test-non-local-exit-funcall-throw ()
+  (should (equal (mod-test-non-local-exit-funcall (lambda () (throw 'tag 32)))
+                 '(throw tag 32))))
+
+;;
+;; String tests.
+;;
+
+(defun multiply-string (s n)
+  (let ((res ""))
+    (dotimes (i n res)
+      (setq res (concat res s)))))
+
+(ert-deftest mod-test-globref-make-test ()
+  (let ((mod-str (mod-test-globref-make))
+        (ref-str (multiply-string "abcdefghijklmnopqrstuvwxyz" 100)))
+    (garbage-collect) ;; XXX: not enough to really test but it's something..
+    (should (string= ref-str mod-str))))
+
+(ert-deftest mod-test-string-a-to-b-test ()
+  (should (string= (mod-test-string-a-to-b "aaa") "bbb")))
+
+;;
+;; User-pointer tests.
+;;
+
+(ert-deftest mod-test-userptr-fun-test ()
+  (let* ((n 42)
+         (v (mod-test-userptr-make n))
+         (r (mod-test-userptr-get v)))
+
+    (should (eq (type-of v) 'user-ptr))
+    (should (integerp r))
+    (should (= r n))))
+
+;; TODO: try to test finalizer
+
+;;
+;; Vector tests.
+;;
+
+(ert-deftest mod-test-vector-test ()
+  (dolist (s '(2 10 100 1000))
+    (dolist (e '(42 foo "foo"))
+      (let* ((v-ref (make-vector 2 e))
+             (eq-ref (eq (aref v-ref 0) (aref v-ref 1)))
+             (v-test (make-vector s nil)))
+
+        (should (eq (mod-test-vector-fill v-test e) t))
+        (should (eq (mod-test-vector-eq v-test e) eq-ref))))))
diff --git a/modules/modhelp.py b/modules/modhelp.py
new file mode 100755
index 0000000..7c96f27
--- /dev/null
+++ b/modules/modhelp.py
@@ -0,0 +1,207 @@
+#!/usr/bin/env python
+
+# Module helper script.
+
+# Copyright 2015 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 <http://www.gnu.org/licenses/>.
+
+import os
+import string
+import subprocess as sp
+import argparse
+import re
+
+EMACS = os.path.join('..', 'src', 'emacs')
+
+def find_modules():
+    modpaths = []
+    for (dirname, dirs, files) in os.walk('.'):
+        if 'Makefile' in files:
+            modpaths.append(dirname)
+    return modpaths
+
+def cmd_test(args):
+    mods = args.module
+    if not mods:
+        mods = find_modules()
+
+    make_cmd = ['make']
+    if args.force:
+        make_cmd.append('-B')
+
+    failed = []
+    for m in mods:
+        print '[*] %s: ------- start -------' % m
+        print '[*] %s: running make' % m
+        r = sp.call(make_cmd, cwd=m)
+        if r != 0:
+            print '[E] %s: make failed' % m
+            failed += [m]
+            continue
+
+        print '[*] %s: running test' % m
+        testpath = os.path.join(m, 'test.el')
+        if os.path.isfile(testpath):
+            emacs_cmd = [EMACS, '-batch', '-L', '.', '-l', 'ert',
+                         '-l', testpath, '-f', 'ert-run-tests-batch-and-exit']
+            print ' '.join(emacs_cmd)
+            r = sp.call(emacs_cmd)
+            if r != 0:
+                print '[E] %s: test failed' % m
+                failed += [m]
+                continue
+        else:
+            print '[W] %s: no test to run' % m
+
+    print '\n[*] %d/%d MODULES OK' % (len(mods)-len(failed), len(mods))
+    for m in failed:
+        print '\tfailed: %s' % m
+
+def to_lisp_sym(sym):
+    sym = re.sub('[_ ]', '-', sym)
+    return sym
+
+def to_c_sym(sym):
+    sym = re.sub('[- ]', '_', sym)
+    return sym
+
+def cmd_init(args):
+    if os.path.exists(args.module):
+        print "%s: file/dir '%s' already exists" % (__file__, args.module)
+        return
+
+    os.mkdir(args.module)
+
+    template_vars = {
+        'module': args.module,
+        'func': args.fun,
+        'c_file': '%s.c' % args.module,
+        'c_func': 'F%s_%s' % (to_c_sym(args.module), to_c_sym(args.fun)),
+        'lisp_func': '%s-%s' % (args.module,  to_lisp_sym(args.fun)),
+    }
+
+    for path, t in TEMPLATES.items():
+        if isinstance(path, string.Template):
+            path = path.substitute(template_vars)
+        path = os.path.join(args.module, path)
+        print "writing %s..." % path
+        with open(path, "w+") as f:
+            f.write(t.substitute(template_vars))
+    print "done! you can run %s test %s" % (__file__, args.module)
+
+
+def main():
+    # path always written relative to this file
+    os.chdir(os.path.dirname(os.path.realpath(__file__)))
+
+    mainp = argparse.ArgumentParser()
+    subp = mainp.add_subparsers()
+
+    testp = subp.add_parser('test', help='run tests')
+    testp.add_argument('-f', '--force', action='store_true',
+                       help='force regeneration (make -B)')
+    testp.add_argument('module', nargs='*',
+                       help='path to module to test (default all)')
+    testp.set_defaults(func=cmd_test)
+
+    initp = subp.add_parser('init', help='create a test module from a 
template')
+    initp.add_argument('module', help='name of the new module')
+    initp.add_argument('-f', '--fun', default='fun',
+                       help='override name of the default function')
+    initp.set_defaults(func=cmd_init)
+
+    args = mainp.parse_args()
+    args.func(args)
+
+
+# double the $ to escape python template syntax
+TEMPLATES = {
+    'Makefile': string.Template('''
+ROOT = ../..
+
+CC      = gcc
+LD      = gcc
+CFLAGS  = -ggdb3 -Wall
+LDFLAGS =
+
+all: ${module}.so ${module}.doc
+
+%.so: %.o
+       $$(LD) -shared $$(LDFLAGS) -o $$@ $$<
+
+%.o: %.c
+       $$(CC) $$(CFLAGS) -I$$(ROOT)/src -fPIC -c $$<
+
+'''),
+
+    string.Template('${c_file}'): string.Template('''
+#include <emacs-module.h>
+
+int plugin_is_GPL_compatible;
+
+static emacs_value
+${c_func} (emacs_env *env, int nargs, emacs_value args[], void *data)
+{
+  return env->intern (env, "t");
+}
+
+/* Bind NAME to FUN.  */
+static void
+bind_function (emacs_env *env, const char *name, emacs_value Sfun)
+{
+  emacs_value Qfset = env->intern (env, "fset");
+  emacs_value Qsym = env->intern (env, name);
+  emacs_value args[] = { Qsym, Sfun };
+
+  env->funcall (env, Qfset, 2, args);
+}
+
+/* Provide FEATURE to Emacs.  */
+static void
+provide (emacs_env *env, const char *feature)
+{
+  emacs_value Qfeat = env->intern (env, feature);
+  emacs_value Qprovide = env->intern (env, "provide");
+  emacs_value args[] = { Qfeat };
+
+  env->funcall (env, Qprovide, 1, args);
+}
+
+int
+emacs_module_init (struct emacs_runtime *ert)
+{
+  emacs_env *env = ert->get_environment (ert);
+  bind_function (env, "${lisp_func}",
+                 env->make_function (env, 1, 1, ${c_func}, "doc", NULL));
+  provide (env, "${module}");
+  return 0;
+}
+'''),
+    'test.el': string.Template('''
+(require 'ert)
+(require 'module-test-common)
+
+;; #$$ works when loading, buffer-file-name when evaluating from emacs
+(module-load (module-path (or #$$ (expand-file-name (buffer-file-name)))))
+
+(ert-deftest ${lisp_func}-test ()
+  (should (eq (${lisp_func} 42) t)))
+''')
+}
+
+if __name__ == '__main__':
+    main()
diff --git a/nextstep/templates/Info.plist.in b/nextstep/templates/Info.plist.in
index 09e953c..a0357b2 100644
--- a/nextstep/templates/Info.plist.in
+++ b/nextstep/templates/Info.plist.in
@@ -673,5 +673,7 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.
                        </array>
                </dict>
        </array>
+       <key>NSAppleScriptEnabled</key>
+       <string>YES</string>
 </dict>
 </plist>
diff --git a/src/ChangeLog.13 b/src/ChangeLog.13
index ac21628..fd68f53 100644
--- a/src/ChangeLog.13
+++ b/src/ChangeLog.13
@@ -8339,7 +8339,7 @@
        * emacs.c (main): Initialize daemon_pipe[1] here ...
        (syms_of_emacs): ... instead of here.
 
-2014-02-16  Anders Lindgern  <address@hidden>
+2014-02-16  Anders Lindgren  <address@hidden>
 
        * nsterm.m (keyDown:): Check for normal key even if NSNumericPadKeyMask
        is set (Bug#16505).
@@ -16566,7 +16566,7 @@
        (ns_draw_fringe_bitmap): Remove unused rowY.
        Change #if to COCOA && >= 10_6.
        (ns_draw_window_cursor): Remove unused overspill.
-       (ns_draw_underwave): width and x are EamcsCGFloat.
+       (ns_draw_underwave): width and x are EmacsCGFloat.
        (ns_draw_box): thickness is CGFloat.
        (ns_dumpglyphs_image): Change #if to COCOA && >= 10_6.
        (ns_send_appdefined): When NS_IMPL_GNUSTEP, redirect to main thread
diff --git a/src/Makefile.in b/src/Makefile.in
index 8a523bb..200cf76 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -239,6 +239,11 @@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
 
 LIBZ = @LIBZ@
 
+## system-specific libs for dynamic modules, else empty
+LIBMODULES = @LIBMODULES@
+## dynlib.o emacs-module.o if modules enabled, else empty
+MODULES_OBJ = @MODULES_OBJ@
+
 XRANDR_LIBS = @XRANDR_LIBS@
 XRANDR_CFLAGS = @XRANDR_CFLAGS@
 
@@ -387,7 +392,7 @@ base_obj = dispnew.o frame.o scroll.o xdisp.o menu.o 
$(XMENU_OBJ) window.o \
        minibuf.o fileio.o dired.o \
        cmds.o casetab.o casefiddle.o indent.o search.o regex.o undo.o \
        alloc.o data.o doc.o editfns.o callint.o \
-       eval.o floatfns.o fns.o font.o print.o lread.o \
+       eval.o floatfns.o fns.o font.o print.o lread.o $(MODULES_OBJ) \
        syntax.o $(UNEXEC_OBJ) bytecode.o \
        process.o gnutls.o callproc.o \
        region-cache.o sound.o atimer.o \
@@ -480,7 +485,7 @@ LIBES = $(LIBS) $(W32_LIBS) $(LIBS_GNUSTEP) $(LIBX_BASE) 
$(LIBIMAGE) \
    $(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \
    $(FREETYPE_LIBS) $(FONTCONFIG_LIBS) $(LIBOTF_LIBS) $(M17N_FLT_LIBS) \
    $(LIBGNUTLS_LIBS) $(LIB_PTHREAD) \
-   $(NOTIFY_LIBS) $(LIB_MATH) $(LIBZ)
+   $(NOTIFY_LIBS) $(LIB_MATH) $(LIBZ) $(LIBMODULES)
 
 $(leimdir)/leim-list.el: bootstrap-emacs$(EXEEXT)
        $(MAKE) -C ../leim leim-list.el EMACS="$(bootstrap_exe)"
@@ -493,6 +498,11 @@ $(srcdir)/macuvs.h 
$(lispsource)/international/charprop.el: \
   bootstrap-emacs$(EXEEXT) FORCE
        $(MAKE) -C ../admin/unidata all EMACS="../$(bootstrap_exe)"
 
+## We require charprop.el to exist before ucs-normalize.el is
+## byte-compiled, because ucs-normalize.el needs to load 2 uni-*.el files.
+$(lispsource)/international/ucs-normalize.elc: | \
+  $(lispsource)/international/charprop.el
+
 lispintdir = ${lispsource}/international
 ${lispintdir}/cp51932.el ${lispintdir}/eucjp-ms.el: FORCE
        ${MAKE} -C ../admin/charsets $(notdir $@)
diff --git a/src/alloc.c b/src/alloc.c
index bee7cd1..fe55cde 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -406,24 +406,37 @@ ALIGN (void *ptr, int alignment)
    If A is a symbol, extract the hidden pointer's offset from lispsym,
    converted to void *.  */
 
-static void *
-XPNTR_OR_SYMBOL_OFFSET (Lisp_Object a)
-{
-  intptr_t i = USE_LSB_TAG ? XLI (a) - XTYPE (a) : XLI (a) & VALMASK;
-  return (void *) i;
-}
+#define macro_XPNTR_OR_SYMBOL_OFFSET(a) \
+  ((void *) (intptr_t) (USE_LSB_TAG ? XLI (a) - XTYPE (a) : XLI (a) & VALMASK))
 
 /* Extract the pointer hidden within A.  */
 
-static void *
+#define macro_XPNTR(a) \
+  ((void *) ((intptr_t) XPNTR_OR_SYMBOL_OFFSET (a) \
+            + (SYMBOLP (a) ? (char *) lispsym : NULL)))
+
+/* For pointer access, define XPNTR and XPNTR_OR_SYMBOL_OFFSET as
+   functions, as functions are cleaner and can be used in debuggers.
+   Also, define them as macros if being compiled with GCC without
+   optimization, for performance in that case.  The macro_* names are
+   private to this section of code.  */
+
+static ATTRIBUTE_UNUSED void *
+XPNTR_OR_SYMBOL_OFFSET (Lisp_Object a)
+{
+  return macro_XPNTR_OR_SYMBOL_OFFSET (a);
+}
+static ATTRIBUTE_UNUSED void *
 XPNTR (Lisp_Object a)
 {
-  void *p = XPNTR_OR_SYMBOL_OFFSET (a);
-  if (SYMBOLP (a))
-    p = (intptr_t) p + (char *) lispsym;
-  return p;
+  return macro_XPNTR (a);
 }
 
+#if DEFINE_KEY_OPS_AS_MACROS
+# define XPNTR_OR_SYMBOL_OFFSET(a) macro_XPNTR_OR_SYMBOL_OFFSET (a)
+# define XPNTR(a) macro_XPNTR (a)
+#endif
+
 static void
 XFLOAT_INIT (Lisp_Object f, double n)
 {
@@ -3711,6 +3724,23 @@ make_event_array (ptrdiff_t nargs, Lisp_Object *args)
   }
 }
 
+#ifdef HAVE_MODULES
+/* Create a new module user ptr object.  */
+Lisp_Object
+make_user_ptr (void (*finalizer) (void*), void *p)
+{
+  Lisp_Object obj;
+  struct Lisp_User_Ptr *uptr;
+
+  obj = allocate_misc (Lisp_Misc_User_Ptr);
+  uptr = XUSER_PTR (obj);
+  uptr->finalizer = finalizer;
+  uptr->p = p;
+  return obj;
+}
+
+#endif
+
 static void
 init_finalizer_list (struct Lisp_Finalizer *head)
 {
@@ -5300,10 +5330,6 @@ total_bytes_of_live_objects (void)
 
 #ifdef HAVE_WINDOW_SYSTEM
 
-/* This code has a few issues on MS-Windows, see Bug#15876 and Bug#16140.  */
-
-#if !defined (HAVE_NTGUI)
-
 /* Remove unmarked font-spec and font-entity objects from ENTRY, which is
    (DRIVER-TYPE NUM-FRAMES FONT-CACHE-DATA ...), and return changed entry.  */
 
@@ -5318,11 +5344,15 @@ compact_font_cache_entry (Lisp_Object entry)
       Lisp_Object obj = XCAR (tail);
 
       /* Consider OBJ if it is (font-spec . [font-entity font-entity ...]).  */
-      if (CONSP (obj) && FONT_SPEC_P (XCAR (obj))
-         && !VECTOR_MARKED_P (XFONT_SPEC (XCAR (obj)))
-         && VECTORP (XCDR (obj)))
+      if (CONSP (obj) && GC_FONT_SPEC_P (XCAR (obj))
+         && !VECTOR_MARKED_P (GC_XFONT_SPEC (XCAR (obj)))
+         /* Don't use VECTORP here, as that calls ASIZE, which could
+            hit assertion violation during GC.  */
+         && (VECTORLIKEP (XCDR (obj))
+             && ! (gc_asize (XCDR (obj)) & PSEUDOVECTOR_FLAG)))
        {
-         ptrdiff_t i, size = ASIZE (XCDR (obj)) & ~ARRAY_MARK_FLAG;
+         ptrdiff_t i, size = gc_asize (XCDR (obj));
+         Lisp_Object obj_cdr = XCDR (obj);
 
          /* If font-spec is not marked, most likely all font-entities
             are not marked too.  But we must be sure that nothing is
@@ -5331,14 +5361,14 @@ compact_font_cache_entry (Lisp_Object entry)
             {
               Lisp_Object objlist;
 
-              if (VECTOR_MARKED_P (XFONT_ENTITY (AREF (XCDR (obj), i))))
+              if (VECTOR_MARKED_P (GC_XFONT_ENTITY (AREF (obj_cdr, i))))
                 break;
 
-              objlist = AREF (AREF (XCDR (obj), i), FONT_OBJLIST_INDEX);
+              objlist = AREF (AREF (obj_cdr, i), FONT_OBJLIST_INDEX);
               for (; CONSP (objlist); objlist = XCDR (objlist))
                 {
                   Lisp_Object val = XCAR (objlist);
-                  struct font *font = XFONT_OBJECT (val);
+                  struct font *font = GC_XFONT_OBJECT (val);
 
                   if (!NILP (AREF (val, FONT_TYPE_INDEX))
                       && VECTOR_MARKED_P(font))
@@ -5366,8 +5396,6 @@ compact_font_cache_entry (Lisp_Object entry)
   return entry;
 }
 
-#endif /* not HAVE_NTGUI */
-
 /* Compact font caches on all terminals and mark
    everything which is still here after compaction.  */
 
@@ -5379,7 +5407,6 @@ compact_font_caches (void)
   for (t = terminal_list; t; t = t->next_terminal)
     {
       Lisp_Object cache = TERMINAL_FONT_CACHE (t);
-#if !defined (HAVE_NTGUI)
       if (CONSP (cache))
        {
          Lisp_Object entry;
@@ -5387,7 +5414,6 @@ compact_font_caches (void)
          for (entry = XCDR (cache); CONSP (entry); entry = XCDR (entry))
            XSETCAR (entry, compact_font_cache_entry (XCAR (entry)));
        }
-#endif /* not HAVE_NTGUI */
       mark_object (cache);
     }
 }
@@ -6301,6 +6327,12 @@ mark_object (Lisp_Object arg)
           mark_object (XFINALIZER (obj)->function);
           break;
 
+#ifdef HAVE_MODULES
+       case Lisp_Misc_User_Ptr:
+         XMISCANY (obj)->gcmarkbit = true;
+         break;
+#endif
+
        default:
          emacs_abort ();
        }
@@ -6677,8 +6709,15 @@ sweep_misc (void)
             {
               if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker)
                 unchain_marker (&mblk->markers[i].m.u_marker);
-              if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer)
+              else if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer)
                 unchain_finalizer (&mblk->markers[i].m.u_finalizer);
+#ifdef HAVE_MODULES
+             else if (mblk->markers[i].m.u_any.type == Lisp_Misc_User_Ptr)
+               {
+                 struct Lisp_User_Ptr *uptr = &mblk->markers[i].m.u_user_ptr;
+                 uptr->finalizer (uptr->p);
+               }
+#endif
               /* Set the type of the freed object to Lisp_Misc_Free.
                  We could leave the type alone, since nobody checks it,
                  but this might catch bugs faster.  */
diff --git a/src/bytecode.c b/src/bytecode.c
index 864db1a..464adc6 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -1067,17 +1067,13 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object 
vector, Lisp_Object maxdepth,
          type = CATCHER;
          goto pushhandler;
        CASE (Bpushconditioncase): /* New in 24.4.  */
+         type = CONDITION_CASE;
+       pushhandler:
          {
-           struct handler *c;
-           Lisp_Object tag;
-           int dest;
+           Lisp_Object tag = POP;
+           int dest = FETCH2;
 
-           type = CONDITION_CASE;
-         pushhandler:
-           tag = POP;
-           dest = FETCH2;
-
-           PUSH_HANDLER (c, tag, type);
+           struct handler *c = push_handler (tag, type);
            c->bytecode_dest = dest;
            c->bytecode_top = top;
 
diff --git a/src/cmds.c b/src/cmds.c
index 167ebb7..650b462 100644
--- a/src/cmds.c
+++ b/src/cmds.c
@@ -233,7 +233,7 @@ because it respects values of `delete-active-region' and 
`overwrite-mode'.  */)
   CHECK_NUMBER (n);
 
   if (eabs (XINT (n)) < 2)
-    call0 (Qundo_auto__amalgamate);
+    call0 (Qundo_auto_amalgamate);
 
   pos = PT + XINT (n);
   if (NILP (killflag))
@@ -279,7 +279,7 @@ At the end, it runs `post-self-insert-hook'.  */)
     error ("Negative repetition argument %"pI"d", XINT (n));
 
   if (XFASTINT (n) < 2)
-    call0 (Qundo_auto__amalgamate);
+    call0 (Qundo_auto_amalgamate);
 
   /* Barf if the key that invoked this was not a character.  */
   if (!CHARACTERP (last_command_event))
@@ -494,7 +494,7 @@ internal_self_insert (int c, EMACS_INT n)
 void
 syms_of_cmds (void)
 {
-  DEFSYM (Qundo_auto__amalgamate, "undo-auto--amalgamate");
+  DEFSYM (Qundo_auto_amalgamate, "undo-auto-amalgamate");
   DEFSYM (Qundo_auto__this_command_amalgamating,
           "undo-auto--this-command-amalgamating");
 
diff --git a/src/conf_post.h b/src/conf_post.h
index 2c3eee5..b629e8d 100644
--- a/src/conf_post.h
+++ b/src/conf_post.h
@@ -245,6 +245,7 @@ extern int emacs_setenv_TZ (char const *);
 #endif
 
 #define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
+#define ATTRIBUTE_UNUSED _GL_UNUSED
 
 #if 3 <= __GNUC__
 # define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
diff --git a/src/data.c b/src/data.c
index 5154604..1e9cc81 100644
--- a/src/data.c
+++ b/src/data.c
@@ -223,6 +223,10 @@ for example, (type-of 1) returns `integer'.  */)
           return Qfloat;
         case Lisp_Misc_Finalizer:
           return Qfinalizer;
+#ifdef HAVE_MODULES
+       case Lisp_Misc_User_Ptr:
+         return Quser_ptr;
+#endif
        default:
          emacs_abort ();
        }
@@ -424,6 +428,17 @@ DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0,
   return Qnil;
 }
 
+#ifdef HAVE_MODULES
+DEFUN ("user-ptrp", Fuser_ptrp, Suser_ptrp, 1, 1, 0,
+       doc: /* Return t if OBJECT is a module user pointer.  */)
+     (Lisp_Object object)
+{
+  if (USER_PTRP (object))
+    return Qt;
+  return Qnil;
+}
+#endif
+
 DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0,
        doc: /* Return t if OBJECT is a built-in function.  */)
   (Lisp_Object object)
@@ -3478,6 +3493,9 @@ syms_of_data (void)
   DEFSYM (Qbool_vector_p, "bool-vector-p");
   DEFSYM (Qchar_or_string_p, "char-or-string-p");
   DEFSYM (Qmarkerp, "markerp");
+#ifdef HAVE_MODULES
+  DEFSYM (Quser_ptrp, "user-ptrp");
+#endif
   DEFSYM (Qbuffer_or_string_p, "buffer-or-string-p");
   DEFSYM (Qinteger_or_marker_p, "integer-or-marker-p");
   DEFSYM (Qfboundp, "fboundp");
@@ -3569,6 +3587,9 @@ syms_of_data (void)
   DEFSYM (Qmarker, "marker");
   DEFSYM (Qoverlay, "overlay");
   DEFSYM (Qfinalizer, "finalizer");
+#ifdef HAVE_MODULES
+  DEFSYM (Quser_ptr, "user-ptr");
+#endif
   DEFSYM (Qfloat, "float");
   DEFSYM (Qwindow_configuration, "window-configuration");
   DEFSYM (Qprocess, "process");
@@ -3683,6 +3704,9 @@ syms_of_data (void)
   defsubr (&Sbyteorder);
   defsubr (&Ssubr_arity);
   defsubr (&Ssubr_name);
+#ifdef HAVE_MODULES
+  defsubr (&Suser_ptrp);
+#endif
 
   defsubr (&Sbool_vector_exclusive_or);
   defsubr (&Sbool_vector_union);
diff --git a/src/dired.c b/src/dired.c
index 84bf247..6c34dfd 100644
--- a/src/dired.c
+++ b/src/dired.c
@@ -467,6 +467,7 @@ file_name_completion (Lisp_Object file, Lisp_Object 
dirname, bool all_flag,
      well as "." and "..".  Until shown otherwise, assume we can't exclude
      anything.  */
   bool includeall = 1;
+  bool check_decoded = false;
   ptrdiff_t count = SPECPDL_INDEX ();
 
   elt = Qnil;
@@ -485,6 +486,28 @@ file_name_completion (Lisp_Object file, Lisp_Object 
dirname, bool all_flag,
      on the encoded file name.  */
   encoded_file = ENCODE_FILE (file);
   encoded_dir = ENCODE_FILE (Fdirectory_file_name (dirname));
+
+  Lisp_Object file_encoding = Vfile_name_coding_system;
+  if (NILP (Vfile_name_coding_system))
+    file_encoding = Vdefault_file_name_coding_system;
+  /* If the file-name encoding decomposes characters, as we do for
+     HFS+ filesystems, we need to make an additional comparison of
+     decoded names in order to filter false positives, such as "a"
+     falsely matching "a-ring".  */
+  if (!NILP (file_encoding)
+      && !NILP (Fplist_get (Fcoding_system_plist (file_encoding),
+                           Qdecomposed_characters)))
+    {
+      check_decoded = true;
+      if (STRING_MULTIBYTE (file))
+       {
+         /* Recompute FILE to make sure any decomposed characters in
+            it are re-composed by the post-read-conversion.
+            Otherwise, any decomposed characters will be rejected by
+            the additional check below.  */
+         file = DECODE_FILE (encoded_file);
+       }
+    }
   int fd;
   DIR *d = open_directory (encoded_dir, &fd);
   record_unwind_protect_ptr (directory_files_internal_unwind, d);
@@ -637,6 +660,23 @@ file_name_completion (Lisp_Object file, Lisp_Object 
dirname, bool all_flag,
       if (!NILP (predicate) && NILP (call1 (predicate, name)))
        continue;
 
+      /* Reject entries where the encoded strings match, but the
+         decoded don't.  For example, "a" should not match "a-ring" on
+         file systems that store decomposed characters. */
+      Lisp_Object zero = make_number (0);
+
+      if (check_decoded && SCHARS (file) <= SCHARS (name))
+       {
+         /* FIXME: This is a copy of the code below.  */
+         ptrdiff_t compare = SCHARS (file);
+         Lisp_Object cmp
+           = Fcompare_strings (name, zero, make_number (compare),
+                               file, zero, make_number (compare),
+                               completion_ignore_case ? Qt : Qnil);
+         if (!EQ (cmp, Qt))
+           continue;
+       }
+
       /* Suitably record this match.  */
 
       matchcount += matchcount <= 1;
@@ -650,14 +690,11 @@ file_name_completion (Lisp_Object file, Lisp_Object 
dirname, bool all_flag,
        }
       else
        {
-         Lisp_Object zero = make_number (0);
          /* FIXME: This is a copy of the code in Ftry_completion.  */
          ptrdiff_t compare = min (bestmatchsize, SCHARS (name));
          Lisp_Object cmp
-           = Fcompare_strings (bestmatch, zero,
-                               make_number (compare),
-                               name, zero,
-                               make_number (compare),
+           = Fcompare_strings (bestmatch, zero, make_number (compare),
+                               name, zero, make_number (compare),
                                completion_ignore_case ? Qt : Qnil);
          ptrdiff_t matchsize = EQ (cmp, Qt) ? compare : eabs (XINT (cmp)) - 1;
 
@@ -1007,6 +1044,7 @@ syms_of_dired (void)
   DEFSYM (Qfile_attributes, "file-attributes");
   DEFSYM (Qfile_attributes_lessp, "file-attributes-lessp");
   DEFSYM (Qdefault_directory, "default-directory");
+  DEFSYM (Qdecomposed_characters, "decomposed-characters");
 
   defsubr (&Sdirectory_files);
   defsubr (&Sdirectory_files_and_attributes);
diff --git a/src/dispnew.c b/src/dispnew.c
index 6fcc9c7..6c23336 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -6218,10 +6218,10 @@ It is up to you to set this variable if your terminal 
can do that.  */);
               doc: /* Name of the window system that Emacs uses for the first 
frame.
 The value is a symbol:
  nil for a termcap frame (a character-only terminal),
- 'x' for an Emacs frame that is really an X window,
- 'w32' for an Emacs frame that is a window on MS-Windows display,
- 'ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
- 'pc' for a direct-write MS-DOS frame.
+ `x' for an Emacs frame that is really an X window,
+ `w32' for an Emacs frame that is a window on MS-Windows display,
+ `ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
+ `pc' for a direct-write MS-DOS frame.
 
 Use of this variable as a boolean is deprecated.  Instead,
 use `display-graphic-p' or any of the other `display-*-p'
@@ -6231,10 +6231,10 @@ predicates which report frame's specific UI-related 
capabilities.  */);
                 doc: /* Name of window system through which the selected frame 
is displayed.
 The value is a symbol:
  nil for a termcap frame (a character-only terminal),
- 'x' for an Emacs frame that is really an X window,
- 'w32' for an Emacs frame that is a window on MS-Windows display,
- 'ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
- 'pc' for a direct-write MS-DOS frame.
+ `x' for an Emacs frame that is really an X window,
+ `w32' for an Emacs frame that is a window on MS-Windows display,
+ `ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
+ `pc' for a direct-write MS-DOS frame.
 
 Use of this variable as a boolean is deprecated.  Instead,
 use `display-graphic-p' or any of the other `display-*-p'
diff --git a/src/doc.c b/src/doc.c
index 694c159..6c2a3e5 100644
--- a/src/doc.c
+++ b/src/doc.c
@@ -1023,7 +1023,8 @@ syms_of_doc (void)
   Vbuild_files = Qnil;
 
   DEFVAR_LISP ("text-quoting-style", Vtext_quoting_style,
-               doc: /* Style to use for single quotes when generating text.
+               doc: /* Style to use for single quotes in help and messages.
+Its value should be a symbol.
 `curve' means quote with curved single quotes \\=‘like this\\=’.
 `straight' means quote with straight apostrophes \\='like this\\='.
 `grave' means quote with grave accent and apostrophe \\=`like this\\='.
diff --git a/src/doprnt.c b/src/doprnt.c
index 51f8fd7..55f249f 100644
--- a/src/doprnt.c
+++ b/src/doprnt.c
@@ -500,7 +500,7 @@ esprintf (char *buf, char const *format, ...)
   return nbytes;
 }
 
-#if defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT
+#if HAVE_MODULES || (defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT)
 
 /* Format to buffer *BUF of positive size *BUFSIZE, reallocating *BUF
    and updating *BUFSIZE if the buffer is too small, and otherwise
diff --git a/src/dynlib.c b/src/dynlib.c
new file mode 100644
index 0000000..190f183
--- /dev/null
+++ b/src/dynlib.c
@@ -0,0 +1,330 @@
+/* Portable API for dynamic loading.
+
+Copyright 2015 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 <http://www.gnu.org/licenses/>.  */
+
+
+/* Assume modules are enabled on modern systems...  *Yes*, the
+   preprocessor macro checks could be more precise.  I don't care.
+
+   If you think the abstraction is too leaky use libltdl (libtool),
+   don't reinvent the wheel by fixing this one.  */
+
+#include <config.h>
+
+#include "dynlib.h"
+
+#ifdef WINDOWSNT
+
+/* MS-Windows systems.  */
+
+#include <errno.h>
+#include "lisp.h"
+#include "w32common.h" /* for os_subtype */
+#include "w32.h"
+
+static BOOL g_b_init_get_module_handle_ex;
+static DWORD dynlib_last_err;
+
+/* Some versions of w32api headers only expose the following when
+   _WIN32_WINNT is set to higher values that we use.  */
+typedef BOOL (WINAPI *GetModuleHandleExA_Proc) (DWORD,LPCSTR,HMODULE*);
+#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
+# define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4
+#endif
+#ifndef GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT
+# define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2
+#endif
+
+/* This needs to be called at startup to countermand any non-zero
+   values recorded by temacs.  */
+void
+dynlib_reset_last_error (void)
+{
+  g_b_init_get_module_handle_ex = 0;
+  dynlib_last_err = 0;
+}
+
+dynlib_handle_ptr
+dynlib_open (const char *dll_fname)
+{
+  HMODULE hdll;
+  char dll_fname_local[MAX_UTF8_PATH];
+
+  if (!dll_fname)
+    {
+      errno = ENOTSUP;
+      return NULL;
+    }
+
+  if (!dll_fname)
+    hdll = GetModuleHandle (NULL);
+  else
+    {
+      /* LoadLibrary wants backslashes.  */
+      strcpy (dll_fname_local, dll_fname);
+      unixtodos_filename (dll_fname_local);
+
+      if (w32_unicode_filenames)
+       {
+         wchar_t dll_fname_w[MAX_PATH];
+
+         filename_to_utf16 (dll_fname_local, dll_fname_w);
+         hdll = LoadLibraryW (dll_fname_w);
+       }
+      else
+       {
+         char dll_fname_a[MAX_PATH];
+
+         filename_to_ansi (dll_fname_local, dll_fname_a);
+         hdll = LoadLibraryA (dll_fname_a);
+       }
+    }
+
+  if (!hdll)
+    dynlib_last_err = GetLastError ();
+
+  return (dynlib_handle_ptr) hdll;
+}
+
+void *
+dynlib_sym (dynlib_handle_ptr h, const char *sym)
+{
+  FARPROC sym_addr = NULL;
+
+  if (!h || h == INVALID_HANDLE_VALUE || !sym)
+    {
+      dynlib_last_err = ERROR_INVALID_PARAMETER;
+      return NULL;
+    }
+
+  sym_addr = GetProcAddress ((HMODULE) h, sym);
+  if (!sym_addr)
+    dynlib_last_err = GetLastError ();
+
+  return (void *)sym_addr;
+}
+
+bool
+dynlib_addr (void *addr, const char **fname, const char **symname)
+{
+  static char dll_filename[MAX_UTF8_PATH];
+  static char addr_str[22];
+  static GetModuleHandleExA_Proc s_pfn_Get_Module_HandleExA = NULL;
+  char *dll_fn = NULL;
+  HMODULE hm_kernel32 = NULL;
+  bool result = false;
+  HMODULE hm_dll = NULL;
+  wchar_t mfn_w[MAX_PATH];
+  char mfn_a[MAX_PATH];
+
+  /* Step 1: Find the handle of the module where ADDR lives.  */
+  if (os_subtype == OS_9X
+      /* Windows NT family version before XP (v5.1).  */
+      || ((w32_major_version + (w32_minor_version > 0)) < 6))
+    {
+      MEMORY_BASIC_INFORMATION mbi;
+
+      /* According to Matt Pietrek, the module handle is just the base
+        address where it's loaded in memory.  */
+      if (VirtualQuery (addr, &mbi, sizeof(mbi)))
+       hm_dll = (HMODULE)mbi.AllocationBase;
+    }
+  else
+    {
+      /* Use the documented API when available (XP and later).  */
+      if (g_b_init_get_module_handle_ex == 0)
+       {
+         g_b_init_get_module_handle_ex = 1;
+         hm_kernel32 = LoadLibrary ("kernel32.dll");
+         /* We load the ANSI version of the function because the
+            address we pass to it is not an address of a string, but
+            an address of a function.  So we don't care about the
+            Unicode version.  */
+         s_pfn_Get_Module_HandleExA =
+           (GetModuleHandleExA_Proc) GetProcAddress (hm_kernel32,
+                                                     "GetModuleHandleExA");
+       }
+      if (s_pfn_Get_Module_HandleExA)
+       {
+         DWORD flags = (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
+                        /* We don't want to call FreeLibrary at the
+                           end, because then we'd need to remember
+                           whether we obtained the handle by this
+                           method or the above one.  */
+                        | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT);
+
+         if (!s_pfn_Get_Module_HandleExA (flags, addr, &hm_dll))
+           {
+             dynlib_last_err = GetLastError ();
+             hm_dll = NULL;
+           }
+       }
+    }
+
+  /* Step 2: Find the absolute file name of the module corresponding
+     to the hm_dll handle.  */
+  if (hm_dll)
+    {
+      DWORD retval;
+
+      if (w32_unicode_filenames)
+       {
+         retval = GetModuleFileNameW (hm_dll, mfn_w, MAX_PATH);
+         if (retval > 0 && retval < MAX_PATH
+             && filename_from_utf16 (mfn_w, dll_filename) == 0)
+           dll_fn = dll_filename;
+         else if (retval == MAX_PATH)
+           dynlib_last_err = ERROR_INSUFFICIENT_BUFFER;
+         else
+           dynlib_last_err = GetLastError ();
+       }
+      else
+       {
+         retval = GetModuleFileNameA (hm_dll, mfn_a, MAX_PATH);
+         if (retval > 0 && retval < MAX_PATH
+             && filename_from_ansi (mfn_a, dll_filename) == 0)
+           dll_fn = dll_filename;
+         else if (retval == MAX_PATH)
+           dynlib_last_err = ERROR_INSUFFICIENT_BUFFER;
+         else
+           dynlib_last_err = GetLastError ();
+       }
+      if (dll_fn)
+       {
+         dostounix_filename (dll_fn);
+         /* We cannot easily produce the function name, since
+            typically all of the module functions will be unexported,
+            and probably even static, which means the symbols can be
+            obtained only if we link against libbfd (and the DLL can
+            be stripped anyway).  So we just show the address and the
+            file name; they can use that with addr2line or GDB to
+            recover the symbolic name.  */
+         sprintf (addr_str, "at 0x%x", (DWORD_PTR)addr);
+         *symname = addr_str;
+         result = true;
+       }
+    }
+
+  *fname = dll_fn;
+  return result;
+}
+
+const char *
+dynlib_error (void)
+{
+  char *error_string = NULL;
+
+  if (dynlib_last_err)
+    {
+      error_string = w32_strerror (dynlib_last_err);
+      dynlib_last_err = 0;
+    }
+
+  return error_string;
+}
+
+int
+dynlib_close (dynlib_handle_ptr h)
+{
+  if (!h || h == INVALID_HANDLE_VALUE)
+    {
+      dynlib_last_err = ERROR_INVALID_PARAMETER;
+      return -1;
+    }
+  /* If the handle is for the main module (the .exe file), it
+     shouldn't be passed to FreeLibrary, because GetModuleHandle
+     doesn't increment the refcount, but FreeLibrary does decrement
+     it.  I don't think this should matter for the main module, but
+     just in case, we avoid the call here, relying on another call to
+     GetModuleHandle to return the same value.  */
+  if (h == GetModuleHandle (NULL))
+    return 0;
+
+  if (!FreeLibrary ((HMODULE) h))
+    {
+      dynlib_last_err = GetLastError ();
+      return -1;
+    }
+
+  return 0;
+}
+
+#elif defined HAVE_UNISTD_H
+
+/* POSIX systems.  */
+
+#include <dlfcn.h>
+
+dynlib_handle_ptr
+dynlib_open (const char *path)
+{
+  return dlopen (path, RTLD_LAZY);
+}
+
+void *
+dynlib_sym (dynlib_handle_ptr h, const char *sym)
+{
+  return dlsym (h, sym);
+}
+
+bool
+dynlib_addr (void *ptr, const char **path, const char **sym)
+{
+#ifdef HAVE_DLADDR
+  Dl_info info;
+  if (dladdr (ptr, &info) && info.dli_fname && info.dli_sname)
+    {
+      *path = info.dli_fname;
+      *sym = info.dli_sname;
+      return true;
+    }
+#endif
+  return false;
+}
+
+const char *
+dynlib_error (void)
+{
+  return dlerror ();
+}
+
+/* FIXME: Currently there is no way to unload a module, so this
+   function is never used.  */
+#if false
+int
+dynlib_close (dynlib_handle_ptr h)
+{
+  return dlclose (h) == 0;
+}
+#endif
+
+#else
+
+#error "No dynamic loading for this system"
+
+#endif
+
+#if !HAVE_DLFUNC
+# define dlfunc dynlib_sym
+#endif
+
+dynlib_function_ptr
+dynlib_func (dynlib_handle_ptr h, const char *sym)
+{
+  return (dynlib_function_ptr) dlfunc (h, sym);
+}
diff --git a/src/dynlib.h b/src/dynlib.h
new file mode 100644
index 0000000..1c19b5d
--- /dev/null
+++ b/src/dynlib.h
@@ -0,0 +1,34 @@
+/* Portable API for dynamic loading.
+
+Copyright 2015 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 <http://www.gnu.org/licenses/>.  */
+
+#ifndef DYNLIB_H
+#define DYNLIB_H
+
+#include <stdbool.h>
+
+typedef void *dynlib_handle_ptr;
+dynlib_handle_ptr dynlib_open (const char *path);
+void *dynlib_sym (dynlib_handle_ptr h, const char *sym);
+typedef struct dynlib_function_ptr_nonce *(*dynlib_function_ptr) (void);
+dynlib_function_ptr dynlib_func (dynlib_handle_ptr h, const char *sym);
+bool dynlib_addr (void *ptr, const char **path, const char **sym);
+const char *dynlib_error (void);
+int dynlib_close (dynlib_handle_ptr h);
+
+#endif /* DYNLIB_H */
diff --git a/src/emacs-module.c b/src/emacs-module.c
new file mode 100644
index 0000000..881ee31
--- /dev/null
+++ b/src/emacs-module.c
@@ -0,0 +1,1134 @@
+/* emacs-module.c - Module loading and runtime implementation
+
+Copyright (C) 2015 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 <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "emacs-module.h"
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "lisp.h"
+#include "dynlib.h"
+#include "coding.h"
+#include "verify.h"
+
+
+/* Feature tests.  */
+
+/* True if __attribute__ ((cleanup (...))) works, false otherwise.  */
+#ifdef HAVE_VAR_ATTRIBUTE_CLEANUP
+enum { module_has_cleanup = true };
+#else
+enum { module_has_cleanup = false };
+#endif
+
+/* Handle to the main thread.  Used to verify that modules call us in
+   the right thread.  */
+#ifdef HAVE_PTHREAD
+# include <pthread.h>
+static pthread_t main_thread;
+#elif defined WINDOWSNT
+#include <windows.h>
+#include "w32term.h"
+static DWORD main_thread;
+#endif
+
+/* True if Lisp_Object and emacs_value have the same representation.
+   This is typically true unless WIDE_EMACS_INT.  In practice, having
+   the same sizes and alignments and maximums should be a good enough
+   proxy for equality of representation.  */
+enum
+  {
+    plain_values
+      = (sizeof (Lisp_Object) == sizeof (emacs_value)
+        && alignof (Lisp_Object) == alignof (emacs_value)
+        && INTPTR_MAX == EMACS_INT_MAX)
+  };
+
+
+/* Private runtime and environment members.  */
+
+/* The private part of an environment stores the current non local exit state
+   and holds the `emacs_value' objects allocated during the lifetime
+   of the environment.  */
+struct emacs_env_private
+{
+  enum emacs_funcall_exit pending_non_local_exit;
+
+  /* Dedicated storage for non-local exit symbol and data so that
+     storage is always available for them, even in an out-of-memory
+     situation.  */
+  Lisp_Object non_local_exit_symbol, non_local_exit_data;
+};
+
+/* The private parts of an `emacs_runtime' object contain the initial
+   environment.  */
+struct emacs_runtime_private
+{
+  /* FIXME: Ideally, we would just define "struct emacs_runtime_private"
+     as a synonym of "emacs_env", but I don't know how to do that in C.  */
+  emacs_env pub;
+};
+
+
+/* Forward declarations.  */
+
+struct module_fun_env;
+
+static Lisp_Object module_format_fun_env (const struct module_fun_env *);
+static Lisp_Object value_to_lisp (emacs_value);
+static emacs_value lisp_to_value (Lisp_Object);
+static enum emacs_funcall_exit module_non_local_exit_check (emacs_env *);
+static void check_main_thread (void);
+static void finalize_environment (struct emacs_env_private *);
+static void initialize_environment (emacs_env *, struct emacs_env_private 
*priv);
+static void module_args_out_of_range (emacs_env *, Lisp_Object, Lisp_Object);
+static void module_handle_signal (emacs_env *, Lisp_Object);
+static void module_handle_throw (emacs_env *, Lisp_Object);
+static void module_non_local_exit_signal_1 (emacs_env *, Lisp_Object, 
Lisp_Object);
+static void module_non_local_exit_throw_1 (emacs_env *, Lisp_Object, 
Lisp_Object);
+static void module_out_of_memory (emacs_env *);
+static void module_reset_handlerlist (const int *);
+static void module_wrong_type (emacs_env *, Lisp_Object, Lisp_Object);
+
+/* We used to return NULL when emacs_value was a different type from
+   Lisp_Object, but nowadays we just use Qnil instead.  Although they
+   happen to be the same thing in the current implementation, module
+   code should not assume this.  */
+verify (NIL_IS_ZERO);
+static emacs_value const module_nil = 0;
+
+/* Convenience macros for non-local exit handling.  */
+
+/* FIXME: The following implementation for non-local exit handling
+   does not support recovery from stack overflow, see sysdep.c.  */
+
+/* Emacs uses setjmp and longjmp for non-local exits, but
+   module frames cannot be skipped because they are in general
+   not prepared for long jumps (e.g., the behavior in C++ is undefined
+   if objects with nontrivial destructors would be skipped).
+   Therefore, catch all non-local exits.  There are two kinds of
+   non-local exits: `signal' and `throw'.  The macros in this section
+   can be used to catch both.  Use macros to avoid additional variants
+   of `internal_condition_case' etc., and to avoid worrying about
+   passing information to the handler functions.  */
+
+/* Place this macro at the beginning of a function returning a number
+   or a pointer to handle non-local exits.  The function must have an
+   ENV parameter.  The function will return the specified value if a
+   signal or throw is caught.  */
+// TODO: Have Fsignal check for CATCHER_ALL so we only have to install
+// one handler.
+#define MODULE_HANDLE_NONLOCAL_EXIT(retval)                     \
+  MODULE_SETJMP (CONDITION_CASE, module_handle_signal, retval); \
+  MODULE_SETJMP (CATCHER_ALL, module_handle_throw, retval)
+
+#define MODULE_SETJMP(handlertype, handlerfunc, retval)                        
       \
+  MODULE_SETJMP_1 (handlertype, handlerfunc, retval,                          \
+                  internal_handler_##handlertype,                             \
+                  internal_cleanup_##handlertype)
+
+/* It is very important that pushing the handler doesn't itself raise
+   a signal.  Install the cleanup only after the handler has been
+   pushed.  Use __attribute__ ((cleanup)) to avoid
+   non-local-exit-prone manual cleanup.
+
+   The do-while forces uses of the macro to be followed by a semicolon.
+   This macro cannot enclose its entire body inside a do-while, as the
+   code after the macro may longjmp back into the macro, which means
+   its local variable C must stay live in later code.  */
+
+// TODO: Make backtraces work if this macros is used.
+
+#define MODULE_SETJMP_1(handlertype, handlerfunc, retval, c, dummy)    \
+  if (module_non_local_exit_check (env) != emacs_funcall_exit_return)  \
+    return retval;                                                     \
+  struct handler *c = push_handler_nosignal (Qt, handlertype);         \
+  if (!c)                                                              \
+    {                                                                  \
+      module_out_of_memory (env);                                      \
+      return retval;                                                   \
+    }                                                                  \
+  verify (module_has_cleanup);                                         \
+  int dummy __attribute__ ((cleanup (module_reset_handlerlist)));      \
+  if (sys_setjmp (c->jmp))                                             \
+    {                                                                  \
+      (handlerfunc) (env, c->val);                                     \
+      return retval;                                                   \
+    }                                                                  \
+  do { } while (false)
+
+
+/* Function environments.  */
+
+/* A function environment is an auxiliary structure used by
+   `module_make_function' to store information about a module
+   function.  It is stored in a save pointer and retrieved by
+   `internal--module-call'.  Its members correspond to the arguments
+   given to `module_make_function'.  */
+
+struct module_fun_env
+{
+  ptrdiff_t min_arity, max_arity;
+  emacs_subr subr;
+  void *data;
+};
+
+
+/* Implementation of runtime and environment functions.
+
+   These should abide by the following rules:
+
+   1. The first argument should always be a pointer to emacs_env.
+
+   2. Each function should first call check_main_thread.  Note that
+      this function is a no-op unless Emacs was built with
+      --enable-checking.
+
+   3. The very next thing each function should do is check that the
+      emacs_env object does not have a non-local exit indication set,
+      by calling module_non_local_exit_check.  If that returns
+      anything but emacs_funcall_exit_return, the function should do
+      nothing and return immediately with an error indication, without
+      clobbering the existing error indication in emacs_env.  This is
+      needed for correct reporting of Lisp errors to the Emacs Lisp
+      interpreter.
+
+   4. Any function that needs to call Emacs facilities, such as
+      encoding or decoding functions, or 'intern', or 'make_string',
+      should protect itself from signals and 'throw' in the called
+      Emacs functions, by placing the macro
+      MODULE_HANDLE_NONLOCAL_EXIT right after the above 2 tests.
+
+   5. Do NOT use 'eassert' for checking validity of user code in the
+      module.  Instead, make those checks part of the code, and if the
+      check fails, call 'module_non_local_exit_signal_1' or
+      'module_non_local_exit_throw_1' to report the error.  This is
+      because using 'eassert' in these situations will abort Emacs
+      instead of reporting the error back to Lisp, and also because
+      'eassert' is compiled to nothing in the release version.  */
+
+/* Use MODULE_FUNCTION_BEGIN to implement steps 2 through 4 for most
+   environment functions.  On error it will return its argument, which
+   should be a sentinel value.  */
+
+#define MODULE_FUNCTION_BEGIN(error_retval)                             \
+  check_main_thread ();                                                 \
+  if (module_non_local_exit_check (env) != emacs_funcall_exit_return)   \
+    return error_retval;                                                \
+  MODULE_HANDLE_NONLOCAL_EXIT (error_retval)
+
+/* Catch signals and throws only if the code can actually signal or
+   throw.  If checking is enabled, abort if the current thread is not
+   the Emacs main thread.  */
+
+static emacs_env *
+module_get_environment (struct emacs_runtime *ert)
+{
+  check_main_thread ();
+  return &ert->private_members->pub;
+}
+
+/* To make global refs (GC-protected global values) keep a hash that
+   maps global Lisp objects to reference counts.  */
+
+static emacs_value
+module_make_global_ref (emacs_env *env, emacs_value ref)
+{
+  MODULE_FUNCTION_BEGIN (module_nil);
+  struct Lisp_Hash_Table *h = XHASH_TABLE (Vmodule_refs_hash);
+  Lisp_Object new_obj = value_to_lisp (ref);
+  EMACS_UINT hashcode;
+  ptrdiff_t i = hash_lookup (h, new_obj, &hashcode);
+
+  if (i >= 0)
+    {
+      Lisp_Object value = HASH_VALUE (h, i);
+      EMACS_INT refcount = XFASTINT (value) + 1;
+      if (refcount > MOST_POSITIVE_FIXNUM)
+        {
+          module_non_local_exit_signal_1 (env, Qoverflow_error, Qnil);
+          return module_nil;
+        }
+      value = make_natnum (refcount);
+      set_hash_value_slot (h, i, value);
+    }
+  else
+    {
+      hash_put (h, new_obj, make_natnum (1), hashcode);
+    }
+
+  return lisp_to_value (new_obj);
+}
+
+static void
+module_free_global_ref (emacs_env *env, emacs_value ref)
+{
+  /* TODO: This probably never signals.  */
+  /* FIXME: Wait a minute.  Shouldn't this function report an error if
+     the hash lookup fails?  */
+  MODULE_FUNCTION_BEGIN ();
+  struct Lisp_Hash_Table *h = XHASH_TABLE (Vmodule_refs_hash);
+  Lisp_Object obj = value_to_lisp (ref);
+  EMACS_UINT hashcode;
+  ptrdiff_t i = hash_lookup (h, obj, &hashcode);
+
+  if (i >= 0)
+    {
+      Lisp_Object value = HASH_VALUE (h, i);
+      EMACS_INT refcount = XFASTINT (value) - 1;
+      if (refcount > 0)
+        {
+          value = make_natnum (refcount);
+          set_hash_value_slot (h, i, value);
+        }
+      else
+       hash_remove_from_table (h, value);
+    }
+}
+
+static enum emacs_funcall_exit
+module_non_local_exit_check (emacs_env *env)
+{
+  check_main_thread ();
+  return env->private_members->pending_non_local_exit;
+}
+
+static void
+module_non_local_exit_clear (emacs_env *env)
+{
+  check_main_thread ();
+  env->private_members->pending_non_local_exit = emacs_funcall_exit_return;
+}
+
+static enum emacs_funcall_exit
+module_non_local_exit_get (emacs_env *env, emacs_value *sym, emacs_value *data)
+{
+  check_main_thread ();
+  struct emacs_env_private *p = env->private_members;
+  if (p->pending_non_local_exit != emacs_funcall_exit_return)
+    {
+      /* FIXME: lisp_to_value can exit non-locally.  */
+      *sym = lisp_to_value (p->non_local_exit_symbol);
+      *data = lisp_to_value (p->non_local_exit_data);
+    }
+  return p->pending_non_local_exit;
+}
+
+/* Like for `signal', DATA must be a list.  */
+static void
+module_non_local_exit_signal (emacs_env *env, emacs_value sym, emacs_value 
data)
+{
+  check_main_thread ();
+  if (module_non_local_exit_check (env) == emacs_funcall_exit_return)
+    module_non_local_exit_signal_1 (env, value_to_lisp (sym),
+                                   value_to_lisp (data));
+}
+
+static void
+module_non_local_exit_throw (emacs_env *env, emacs_value tag, emacs_value 
value)
+{
+  check_main_thread ();
+  if (module_non_local_exit_check (env) == emacs_funcall_exit_return)
+    module_non_local_exit_throw_1 (env, value_to_lisp (tag),
+                                  value_to_lisp (value));
+}
+
+/* A module function is lambda function that calls
+   `internal--module-call', passing the function pointer of the module
+   function along with the module emacs_env pointer as arguments.
+
+       (function (lambda (&rest arglist)
+                   (internal--module-call envobj arglist)))  */
+
+static emacs_value
+module_make_function (emacs_env *env, ptrdiff_t min_arity, ptrdiff_t max_arity,
+                     emacs_subr subr, const char *documentation,
+                     void *data)
+{
+  MODULE_FUNCTION_BEGIN (module_nil);
+
+  if (! (0 <= min_arity
+        && (max_arity < 0
+            ? max_arity == emacs_variadic_function
+            : min_arity <= max_arity)))
+    xsignal2 (Qinvalid_arity, make_number (min_arity), make_number 
(max_arity));
+
+  /* FIXME: This should be freed when envobj is GC'd.  */
+  struct module_fun_env *envptr = xmalloc (sizeof *envptr);
+  envptr->min_arity = min_arity;
+  envptr->max_arity = max_arity;
+  envptr->subr = subr;
+  envptr->data = data;
+
+  Lisp_Object envobj = make_save_ptr (envptr);
+  Lisp_Object doc
+    = (documentation
+       ? code_convert_string_norecord (build_unibyte_string (documentation),
+                                      Qutf_8, false)
+       : Qnil);
+  /* FIXME: Use a bytecompiled object, or even better a subr.  */
+  Lisp_Object ret = list4 (Qlambda,
+                           list2 (Qand_rest, Qargs),
+                           doc,
+                           list4 (Qapply,
+                                  list2 (Qfunction, Qinternal_module_call),
+                                  envobj,
+                                  Qargs));
+
+  return lisp_to_value (ret);
+}
+
+static emacs_value
+module_funcall (emacs_env *env, emacs_value fun, ptrdiff_t nargs,
+               emacs_value args[])
+{
+  MODULE_FUNCTION_BEGIN (module_nil);
+
+  /* Make a new Lisp_Object array starting with the function as the
+     first arg, because that's what Ffuncall takes.  */
+  Lisp_Object *newargs;
+  USE_SAFE_ALLOCA;
+  SAFE_ALLOCA_LISP (newargs, nargs + 1);
+  newargs[0] = value_to_lisp (fun);
+  for (ptrdiff_t i = 0; i < nargs; i++)
+    newargs[1 + i] = value_to_lisp (args[i]);
+  emacs_value result = lisp_to_value (Ffuncall (nargs + 1, newargs));
+  SAFE_FREE ();
+  return result;
+}
+
+static emacs_value
+module_intern (emacs_env *env, const char *name)
+{
+  MODULE_FUNCTION_BEGIN (module_nil);
+  return lisp_to_value (intern (name));
+}
+
+static emacs_value
+module_type_of (emacs_env *env, emacs_value value)
+{
+  MODULE_FUNCTION_BEGIN (module_nil);
+  return lisp_to_value (Ftype_of (value_to_lisp (value)));
+}
+
+static bool
+module_is_not_nil (emacs_env *env, emacs_value value)
+{
+  check_main_thread ();
+  if (module_non_local_exit_check (env) != emacs_funcall_exit_return)
+    return false;
+  return ! NILP (value_to_lisp (value));
+}
+
+static bool
+module_eq (emacs_env *env, emacs_value a, emacs_value b)
+{
+  check_main_thread ();
+  if (module_non_local_exit_check (env) != emacs_funcall_exit_return)
+    return false;
+  return EQ (value_to_lisp (a), value_to_lisp (b));
+}
+
+static intmax_t
+module_extract_integer (emacs_env *env, emacs_value n)
+{
+  MODULE_FUNCTION_BEGIN (0);
+  Lisp_Object l = value_to_lisp (n);
+  if (! INTEGERP (l))
+    {
+      module_wrong_type (env, Qintegerp, l);
+      return 0;
+    }
+  return XINT (l);
+}
+
+static emacs_value
+module_make_integer (emacs_env *env, intmax_t n)
+{
+  MODULE_FUNCTION_BEGIN (module_nil);
+  if (! (MOST_NEGATIVE_FIXNUM <= n && n <= MOST_POSITIVE_FIXNUM))
+    {
+      module_non_local_exit_signal_1 (env, Qoverflow_error, Qnil);
+      return module_nil;
+    }
+  return lisp_to_value (make_number (n));
+}
+
+static double
+module_extract_float (emacs_env *env, emacs_value f)
+{
+  MODULE_FUNCTION_BEGIN (0);
+  Lisp_Object lisp = value_to_lisp (f);
+  if (! FLOATP (lisp))
+    {
+      module_wrong_type (env, Qfloatp, lisp);
+      return 0;
+    }
+  return XFLOAT_DATA (lisp);
+}
+
+static emacs_value
+module_make_float (emacs_env *env, double d)
+{
+  MODULE_FUNCTION_BEGIN (module_nil);
+  return lisp_to_value (make_float (d));
+}
+
+static bool
+module_copy_string_contents (emacs_env *env, emacs_value value, char *buffer,
+                            ptrdiff_t *length)
+{
+  MODULE_FUNCTION_BEGIN (false);
+  Lisp_Object lisp_str = value_to_lisp (value);
+  if (! STRINGP (lisp_str))
+    {
+      module_wrong_type (env, Qstringp, lisp_str);
+      return false;
+    }
+
+  Lisp_Object lisp_str_utf8 = ENCODE_UTF_8 (lisp_str);
+  ptrdiff_t raw_size = SBYTES (lisp_str_utf8);
+  if (raw_size == PTRDIFF_MAX)
+    {
+      module_non_local_exit_signal_1 (env, Qoverflow_error, Qnil);
+      return false;
+    }
+  ptrdiff_t required_buf_size = raw_size + 1;
+
+  eassert (length != NULL);
+
+  if (buffer == NULL)
+    {
+      *length = required_buf_size;
+      return true;
+    }
+
+  eassert (*length >= 0);
+
+  if (*length < required_buf_size)
+    {
+      *length = required_buf_size;
+      module_non_local_exit_signal_1 (env, Qargs_out_of_range, Qnil);
+      return false;
+    }
+
+  *length = required_buf_size;
+  memcpy (buffer, SDATA (lisp_str_utf8), raw_size + 1);
+
+  return true;
+}
+
+static emacs_value
+module_make_string (emacs_env *env, const char *str, ptrdiff_t length)
+{
+  MODULE_FUNCTION_BEGIN (module_nil);
+  if (length > STRING_BYTES_BOUND)
+    {
+      module_non_local_exit_signal_1 (env, Qoverflow_error, Qnil);
+      return module_nil;
+    }
+  Lisp_Object lstr = make_unibyte_string (str, length);
+  return lisp_to_value (code_convert_string_norecord (lstr, Qutf_8, false));
+}
+
+static emacs_value
+module_make_user_ptr (emacs_env *env, emacs_finalizer_function fin, void *ptr)
+{
+  MODULE_FUNCTION_BEGIN (module_nil);
+  return lisp_to_value (make_user_ptr (fin, ptr));
+}
+
+static void *
+module_get_user_ptr (emacs_env *env, emacs_value uptr)
+{
+  MODULE_FUNCTION_BEGIN (NULL);
+  Lisp_Object lisp = value_to_lisp (uptr);
+  if (! USER_PTRP (lisp))
+    {
+      module_wrong_type (env, Quser_ptr, lisp);
+      return NULL;
+    }
+  return XUSER_PTR (lisp)->p;
+}
+
+static void
+module_set_user_ptr (emacs_env *env, emacs_value uptr, void *ptr)
+{
+  /* FIXME: This function should return bool because it can fail.  */
+  MODULE_FUNCTION_BEGIN ();
+  check_main_thread ();
+  if (module_non_local_exit_check (env) != emacs_funcall_exit_return)
+    return;
+  Lisp_Object lisp = value_to_lisp (uptr);
+  if (! USER_PTRP (lisp))
+    module_wrong_type (env, Quser_ptr, lisp);
+  XUSER_PTR (lisp)->p = ptr;
+}
+
+static emacs_finalizer_function
+module_get_user_finalizer (emacs_env *env, emacs_value uptr)
+{
+  MODULE_FUNCTION_BEGIN (NULL);
+  Lisp_Object lisp = value_to_lisp (uptr);
+  if (! USER_PTRP (lisp))
+    {
+      module_wrong_type (env, Quser_ptr, lisp);
+      return NULL;
+    }
+  return XUSER_PTR (lisp)->finalizer;
+}
+
+static void
+module_set_user_finalizer (emacs_env *env, emacs_value uptr,
+                          emacs_finalizer_function fin)
+{
+  /* FIXME: This function should return bool because it can fail.  */
+  MODULE_FUNCTION_BEGIN ();
+  Lisp_Object lisp = value_to_lisp (uptr);
+  if (! USER_PTRP (lisp))
+    module_wrong_type (env, Quser_ptr, lisp);
+  XUSER_PTR (lisp)->finalizer = fin;
+}
+
+static void
+module_vec_set (emacs_env *env, emacs_value vec, ptrdiff_t i, emacs_value val)
+{
+  /* FIXME: This function should return bool because it can fail.  */
+  MODULE_FUNCTION_BEGIN ();
+  Lisp_Object lvec = value_to_lisp (vec);
+  if (! VECTORP (lvec))
+    {
+      module_wrong_type (env, Qvectorp, lvec);
+      return;
+    }
+  if (! (0 <= i && i < ASIZE (lvec)))
+    {
+      if (MOST_NEGATIVE_FIXNUM <= i && i <= MOST_POSITIVE_FIXNUM)
+       module_args_out_of_range (env, lvec, make_number (i));
+      else
+       module_non_local_exit_signal_1 (env, Qoverflow_error, Qnil);
+      return;
+    }
+  ASET (lvec, i, value_to_lisp (val));
+}
+
+static emacs_value
+module_vec_get (emacs_env *env, emacs_value vec, ptrdiff_t i)
+{
+  MODULE_FUNCTION_BEGIN (module_nil);
+  Lisp_Object lvec = value_to_lisp (vec);
+  if (! VECTORP (lvec))
+    {
+      module_wrong_type (env, Qvectorp, lvec);
+      return module_nil;
+    }
+  if (! (0 <= i && i < ASIZE (lvec)))
+    {
+      if (MOST_NEGATIVE_FIXNUM <= i && i <= MOST_POSITIVE_FIXNUM)
+       module_args_out_of_range (env, lvec, make_number (i));
+      else
+       module_non_local_exit_signal_1 (env, Qoverflow_error, Qnil);
+      return module_nil;
+    }
+  return lisp_to_value (AREF (lvec, i));
+}
+
+static ptrdiff_t
+module_vec_size (emacs_env *env, emacs_value vec)
+{
+  /* FIXME: Return a sentinel value (e.g., -1) on error.  */
+  MODULE_FUNCTION_BEGIN (0);
+  Lisp_Object lvec = value_to_lisp (vec);
+  if (! VECTORP (lvec))
+    {
+      module_wrong_type (env, Qvectorp, lvec);
+      return 0;
+    }
+  return ASIZE (lvec);
+}
+
+
+/* Subroutines.  */
+
+DEFUN ("module-load", Fmodule_load, Smodule_load, 1, 1, 0,
+       doc: /* Load module FILE.  */)
+  (Lisp_Object file)
+{
+  dynlib_handle_ptr handle;
+  emacs_init_function module_init;
+  void *gpl_sym;
+
+  CHECK_STRING (file);
+  handle = dynlib_open (SSDATA (file));
+  if (!handle)
+    error ("Cannot load file %s: %s", SDATA (file), dynlib_error ());
+
+  gpl_sym = dynlib_sym (handle, "plugin_is_GPL_compatible");
+  if (!gpl_sym)
+    error ("Module %s is not GPL compatible", SDATA (file));
+
+  module_init = (emacs_init_function) dynlib_func (handle, 
"emacs_module_init");
+  if (!module_init)
+    error ("Module %s does not have an init function.", SDATA (file));
+
+  struct emacs_runtime_private rt; /* Includes the public emacs_env.  */
+  struct emacs_env_private priv;
+  initialize_environment (&rt.pub, &priv);
+  struct emacs_runtime pub =
+    {
+      .size = sizeof pub,
+      .private_members = &rt,
+      .get_environment = module_get_environment
+    };
+  int r = module_init (&pub);
+  finalize_environment (&priv);
+
+  if (r != 0)
+    {
+      if (! (MOST_NEGATIVE_FIXNUM <= r && r <= MOST_POSITIVE_FIXNUM))
+        xsignal0 (Qoverflow_error);
+      xsignal2 (Qmodule_load_failed, file, make_number (r));
+    }
+
+  return Qt;
+}
+
+DEFUN ("internal--module-call", Finternal_module_call, Sinternal_module_call, 
1, MANY, 0,
+       doc: /* Internal function to call a module function.
+ENVOBJ is a save pointer to a module_fun_env structure.
+ARGLIST is a list of arguments passed to SUBRPTR.
+usage: (module-call ENVOBJ &rest ARGLIST)   */)
+  (ptrdiff_t nargs, Lisp_Object *arglist)
+{
+  Lisp_Object envobj = arglist[0];
+  /* FIXME: Rather than use a save_value, we should create a new object type.
+     Making save_value visible to Lisp is wrong.  */
+  CHECK_TYPE (SAVE_VALUEP (envobj), Qsave_value_p, envobj);
+  struct Lisp_Save_Value *save_value = XSAVE_VALUE (envobj);
+  CHECK_TYPE (save_type (save_value, 0) == SAVE_POINTER, Qsave_pointer_p, 
envobj);
+  /* FIXME: We have no reason to believe that XSAVE_POINTER (envobj, 0)
+     is a module_fun_env pointer.  If some other part of Emacs also
+     exports save_value objects to Elisp, than we may be getting here this
+     other kind of save_value which will likely hold something completely
+     different in this field.  */
+  struct module_fun_env *envptr = XSAVE_POINTER (envobj, 0);
+  EMACS_INT len = nargs - 1;
+  eassume (0 <= envptr->min_arity);
+  if (! (envptr->min_arity <= len
+        && len <= (envptr->max_arity < 0 ? PTRDIFF_MAX : envptr->max_arity)))
+    xsignal2 (Qwrong_number_of_arguments, module_format_fun_env (envptr),
+             make_number (len));
+
+  emacs_env pub;
+  struct emacs_env_private priv;
+  initialize_environment (&pub, &priv);
+
+  USE_SAFE_ALLOCA;
+  emacs_value *args;
+  if (plain_values)
+    args = (emacs_value *) arglist + 1;
+  else
+    {
+      args = SAFE_ALLOCA (len * sizeof *args);
+      for (ptrdiff_t i = 0; i < len; i++)
+       args[i] = lisp_to_value (arglist[i + 1]);
+    }
+
+  emacs_value ret = envptr->subr (&pub, len, args, envptr->data);
+  SAFE_FREE ();
+
+  eassert (&priv == pub.private_members);
+
+  switch (priv.pending_non_local_exit)
+    {
+    case emacs_funcall_exit_return:
+      finalize_environment (&priv);
+      return value_to_lisp (ret);
+    case emacs_funcall_exit_signal:
+      {
+        Lisp_Object symbol = priv.non_local_exit_symbol;
+        Lisp_Object data = priv.non_local_exit_data;
+        finalize_environment (&priv);
+        xsignal (symbol, data);
+      }
+    case emacs_funcall_exit_throw:
+      {
+        Lisp_Object tag = priv.non_local_exit_symbol;
+        Lisp_Object value = priv.non_local_exit_data;
+        finalize_environment (&priv);
+        Fthrow (tag, value);
+      }
+    default:
+      eassume (false);
+    }
+}
+
+
+/* Helper functions.  */
+
+static void
+check_main_thread (void)
+{
+#ifdef HAVE_PTHREAD
+  eassert (pthread_equal (pthread_self (), main_thread));
+#elif defined WINDOWSNT
+  eassert (GetCurrentThreadId () == main_thread);
+#endif
+}
+
+static void
+module_non_local_exit_signal_1 (emacs_env *env, Lisp_Object sym,
+                               Lisp_Object data)
+{
+  struct emacs_env_private *p = env->private_members;
+  if (p->pending_non_local_exit == emacs_funcall_exit_return)
+    {
+      p->pending_non_local_exit = emacs_funcall_exit_signal;
+      p->non_local_exit_symbol = sym;
+      p->non_local_exit_data = data;
+    }
+}
+
+static void
+module_non_local_exit_throw_1 (emacs_env *env, Lisp_Object tag,
+                              Lisp_Object value)
+{
+  struct emacs_env_private *p = env->private_members;
+  if (p->pending_non_local_exit == emacs_funcall_exit_return)
+    {
+      p->pending_non_local_exit = emacs_funcall_exit_throw;
+      p->non_local_exit_symbol = tag;
+      p->non_local_exit_data = value;
+    }
+}
+
+/* Module version of `wrong_type_argument'.  */
+static void
+module_wrong_type (emacs_env *env, Lisp_Object predicate, Lisp_Object value)
+{
+  module_non_local_exit_signal_1 (env, Qwrong_type_argument,
+                                 list2 (predicate, value));
+}
+
+/* Signal an out-of-memory condition to the caller.  */
+static void
+module_out_of_memory (emacs_env *env)
+{
+  /* TODO: Reimplement this so it works even if memory-signal-data has
+     been modified.  */
+  module_non_local_exit_signal_1 (env, XCAR (Vmemory_signal_data),
+                                 XCDR (Vmemory_signal_data));
+}
+
+/* Signal arguments are out of range.  */
+static void
+module_args_out_of_range (emacs_env *env, Lisp_Object a1, Lisp_Object a2)
+{
+  module_non_local_exit_signal_1 (env, Qargs_out_of_range, list2 (a1, a2));
+}
+
+
+/* Value conversion.  */
+
+/* Unique Lisp_Object used to mark those emacs_values which are really
+   just containers holding a Lisp_Object that does not fit as an emacs_value,
+   either because it is an integer out of range, or is not properly aligned.
+   Used only if !plain_values.  */
+static Lisp_Object ltv_mark;
+
+/* Convert V to the corresponding internal object O, such that
+   V == lisp_to_value_bits (O).  Never fails.  */
+static Lisp_Object
+value_to_lisp_bits (emacs_value v)
+{
+  intptr_t i = (intptr_t) v;
+  if (plain_values || USE_LSB_TAG)
+    return XIL (i);
+
+  /* With wide EMACS_INT and when tag bits are the most significant,
+     reassembling integers differs from reassembling pointers in two
+     ways.  First, save and restore the least-significant bits of the
+     integer, not the most-significant bits.  Second, sign-extend the
+     integer when restoring, but zero-extend pointers because that
+     makes TAG_PTR faster.  */
+
+  EMACS_UINT tag = i & (GCALIGNMENT - 1);
+  EMACS_UINT untagged = i - tag;
+  switch (tag)
+    {
+    case_Lisp_Int:
+      {
+       bool negative = tag & 1;
+       EMACS_UINT sign_extension
+         = negative ? VALMASK & ~(INTPTR_MAX >> INTTYPEBITS): 0;
+       uintptr_t u = i;
+       intptr_t all_but_sign = u >> GCTYPEBITS;
+       untagged = sign_extension + all_but_sign;
+       break;
+      }
+    }
+
+  return XIL ((tag << VALBITS) + untagged);
+}
+
+/* If V was computed from lisp_to_value (O), then return O.
+   Exits non-locally only if the stack overflows.  */
+static Lisp_Object
+value_to_lisp (emacs_value v)
+{
+  Lisp_Object o = value_to_lisp_bits (v);
+  if (! plain_values && CONSP (o) && EQ (XCDR (o), ltv_mark))
+    o = XCAR (o);
+  return o;
+}
+
+/* Attempt to convert O to an emacs_value.  Do not do any checking or
+   or allocate any storage; the caller should prevent or detect
+   any resulting bit pattern that is not a valid emacs_value.  */
+static emacs_value
+lisp_to_value_bits (Lisp_Object o)
+{
+  EMACS_UINT u = XLI (o);
+
+  /* Compress U into the space of a pointer, possibly losing information.  */
+  uintptr_t p = (plain_values || USE_LSB_TAG
+                ? u
+                : (INTEGERP (o) ? u << VALBITS : u & VALMASK) + XTYPE (o));
+  return (emacs_value) p;
+}
+
+#ifndef HAVE_STRUCT_ATTRIBUTE_ALIGNED
+enum { HAVE_STRUCT_ATTRIBUTE_ALIGNED = 0 };
+#endif
+
+/* Convert O to an emacs_value.  Allocate storage if needed; this can
+   signal if memory is exhausted.  Must be an injective function.  */
+static emacs_value
+lisp_to_value (Lisp_Object o)
+{
+  emacs_value v = lisp_to_value_bits (o);
+
+  if (! EQ (o, value_to_lisp_bits (v)))
+    {
+      /* Package the incompressible object pointer inside a pair
+        that is compressible.  */
+      Lisp_Object pair = Fcons (o, ltv_mark);
+
+      if (! HAVE_STRUCT_ATTRIBUTE_ALIGNED)
+       {
+         /* Keep calling Fcons until it returns a compressible pair.
+            This shouldn't take long.  */
+         while ((intptr_t) XCONS (pair) & (GCALIGNMENT - 1))
+           pair = Fcons (o, pair);
+
+         /* Plant the mark.  The garbage collector will eventually
+            reclaim any just-allocated incompressible pairs.  */
+         XSETCDR (pair, ltv_mark);
+       }
+
+      v = (emacs_value) ((intptr_t) XCONS (pair) + Lisp_Cons);
+    }
+
+  eassert (EQ (o, value_to_lisp (v)));
+  return v;
+}
+
+
+/* Environment lifetime management.  */
+
+/* Must be called before the environment can be used.  */
+static void
+initialize_environment (emacs_env *env, struct emacs_env_private *priv)
+{
+  priv->pending_non_local_exit = emacs_funcall_exit_return;
+  env->size = sizeof *env;
+  env->private_members = priv;
+  env->make_global_ref = module_make_global_ref;
+  env->free_global_ref = module_free_global_ref;
+  env->non_local_exit_check = module_non_local_exit_check;
+  env->non_local_exit_clear = module_non_local_exit_clear;
+  env->non_local_exit_get = module_non_local_exit_get;
+  env->non_local_exit_signal = module_non_local_exit_signal;
+  env->non_local_exit_throw = module_non_local_exit_throw;
+  env->make_function = module_make_function;
+  env->funcall = module_funcall;
+  env->intern = module_intern;
+  env->type_of = module_type_of;
+  env->is_not_nil = module_is_not_nil;
+  env->eq = module_eq;
+  env->extract_integer = module_extract_integer;
+  env->make_integer = module_make_integer;
+  env->extract_float = module_extract_float;
+  env->make_float = module_make_float;
+  env->copy_string_contents = module_copy_string_contents;
+  env->make_string = module_make_string;
+  env->make_user_ptr = module_make_user_ptr;
+  env->get_user_ptr = module_get_user_ptr;
+  env->set_user_ptr = module_set_user_ptr;
+  env->get_user_finalizer = module_get_user_finalizer;
+  env->set_user_finalizer = module_set_user_finalizer;
+  env->vec_set = module_vec_set;
+  env->vec_get = module_vec_get;
+  env->vec_size = module_vec_size;
+  Vmodule_environments = Fcons (make_save_ptr (env), Vmodule_environments);
+}
+
+/* Must be called before the lifetime of the environment object
+   ends.  */
+static void
+finalize_environment (struct emacs_env_private *env)
+{
+  Vmodule_environments = XCDR (Vmodule_environments);
+}
+
+
+/* Non-local exit handling.  */
+
+/* Must be called after setting up a handler immediately before
+   returning from the function.  See the comments in lisp.h and the
+   code in eval.c for details.  The macros below arrange for this
+   function to be called automatically.  DUMMY is ignored.  */
+static void
+module_reset_handlerlist (const int *dummy)
+{
+  handlerlist = handlerlist->next;
+}
+
+/* Called on `signal'.  ERR is a pair (SYMBOL . DATA), which gets
+   stored in the environment.  Set the pending non-local exit flag.  */
+static void
+module_handle_signal (emacs_env *env, Lisp_Object err)
+{
+  module_non_local_exit_signal_1 (env, XCAR (err), XCDR (err));
+}
+
+/* Called on `throw'.  TAG_VAL is a pair (TAG . VALUE), which gets
+   stored in the environment.  Set the pending non-local exit flag.  */
+static void
+module_handle_throw (emacs_env *env, Lisp_Object tag_val)
+{
+  module_non_local_exit_throw_1 (env, XCAR (tag_val), XCDR (tag_val));
+}
+
+
+/* Function environments.  */
+
+/* Return a string object that contains a user-friendly
+   representation of the function environment.  */
+static Lisp_Object
+module_format_fun_env (const struct module_fun_env *env)
+{
+  /* Try to print a function name if possible.  */
+  const char *path, *sym;
+  static char const noaddr_format[] = "#<module function at %p>";
+  char buffer[sizeof noaddr_format + INT_STRLEN_BOUND (intptr_t) + 256];
+  char *buf = buffer;
+  ptrdiff_t bufsize = sizeof buffer;
+  ptrdiff_t size
+    = (dynlib_addr (env->subr, &path, &sym)
+       ? exprintf (&buf, &bufsize, buffer, -1,
+                  "#<module function %s from %s>", sym, path)
+       : sprintf (buffer, noaddr_format, env->subr));
+  Lisp_Object unibyte_result = make_unibyte_string (buffer, size);
+  if (buf != buffer)
+    xfree (buf);
+  return code_convert_string_norecord (unibyte_result, Qutf_8, false);
+}
+
+
+/* Segment initializer.  */
+
+void
+syms_of_module (void)
+{
+  if (!plain_values)
+    ltv_mark = Fcons (Qnil, Qnil);
+  eassert (NILP (value_to_lisp (module_nil)));
+
+  DEFSYM (Qmodule_refs_hash, "module-refs-hash");
+  DEFVAR_LISP ("module-refs-hash", Vmodule_refs_hash,
+              doc: /* Module global reference table.  */);
+
+  Vmodule_refs_hash
+    = make_hash_table (hashtest_eq, make_number (DEFAULT_HASH_SIZE),
+                      make_float (DEFAULT_REHASH_SIZE),
+                      make_float (DEFAULT_REHASH_THRESHOLD),
+                      Qnil);
+  Funintern (Qmodule_refs_hash, Qnil);
+
+  DEFSYM (Qmodule_environments, "module-environments");
+  DEFVAR_LISP ("module-environments", Vmodule_environments,
+               doc: /* List of active module environments.  */);
+  Vmodule_environments = Qnil;
+  /* Unintern `module-environments' because it is only used
+     internally.  */
+  Funintern (Qmodule_environments, Qnil);
+
+  DEFSYM (Qmodule_load_failed, "module-load-failed");
+  Fput (Qmodule_load_failed, Qerror_conditions,
+        listn (CONSTYPE_PURE, 2, Qmodule_load_failed, Qerror));
+  Fput (Qmodule_load_failed, Qerror_message,
+        build_pure_c_string ("Module load failed"));
+
+  DEFSYM (Qinvalid_module_call, "invalid-module-call");
+  Fput (Qinvalid_module_call, Qerror_conditions,
+        listn (CONSTYPE_PURE, 2, Qinvalid_module_call, Qerror));
+  Fput (Qinvalid_module_call, Qerror_message,
+        build_pure_c_string ("Invalid module call"));
+
+  DEFSYM (Qinvalid_arity, "invalid-arity");
+  Fput (Qinvalid_arity, Qerror_conditions,
+        listn (CONSTYPE_PURE, 2, Qinvalid_arity, Qerror));
+  Fput (Qinvalid_arity, Qerror_message,
+        build_pure_c_string ("Invalid function arity"));
+
+  /* Unintern `module-refs-hash' because it is internal-only and Lisp
+     code or modules should not access it.  */
+  Funintern (Qmodule_refs_hash, Qnil);
+
+  DEFSYM (Qsave_value_p, "save-value-p");
+  DEFSYM (Qsave_pointer_p, "save-pointer-p");
+
+  defsubr (&Smodule_load);
+
+  DEFSYM (Qinternal_module_call, "internal--module-call");
+  defsubr (&Sinternal_module_call);
+}
+
+/* Unlike syms_of_module, this initializer is called even from an
+   initialized (dumped) Emacs.  */
+
+void
+module_init (void)
+{
+  /* It is not guaranteed that dynamic initializers run in the main thread,
+     therefore detect the main thread here.  */
+#ifdef HAVE_PTHREAD
+  main_thread = pthread_self ();
+#elif defined WINDOWSNT
+  /* The 'main' function already recorded the main thread's thread ID,
+     so we need just to use it . */
+  main_thread = dwMainThreadId;
+#endif
+}
diff --git a/src/emacs-module.h b/src/emacs-module.h
new file mode 100644
index 0000000..a3aa501
--- /dev/null
+++ b/src/emacs-module.h
@@ -0,0 +1,215 @@
+/* emacs-module.h - GNU Emacs module API.
+
+Copyright (C) 2015 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 <http://www.gnu.org/licenses/>.  */
+
+#ifndef EMACS_MODULE_H
+#define EMACS_MODULE_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+#if defined __cplusplus && __cplusplus >= 201103L
+# define EMACS_NOEXCEPT noexcept
+
+/* Function prototype for module user-pointer finalizers.
+
+   NOTE: C++11 15.4: An exception-specification shall not appear in a
+                     typedef declaration or alias-declaration.
+
+*/
+void emacs_dummy_finalizer_function (void *) noexcept;
+typedef decltype(emacs_dummy_finalizer_function) *emacs_finalizer_function;
+
+#else
+# define EMACS_NOEXCEPT
+typedef void (*emacs_finalizer_function) (void *);
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Current environment.  */
+typedef struct emacs_env_25 emacs_env;
+
+/* Opaque pointer representing an Emacs Lisp value.
+   BEWARE: Do not assume NULL is a valid value!  */
+typedef struct emacs_value_tag *emacs_value;
+
+enum emacs_arity { emacs_variadic_function = -2 };
+
+/* Struct passed to a module init function (emacs_module_init).  */
+struct emacs_runtime
+{
+  /* Structure size (for version checking).  */
+  ptrdiff_t size;
+
+  /* Private data; users should not touch this.  */
+  struct emacs_runtime_private *private_members;
+
+  /* Return an environment pointer.  */
+  emacs_env *(*get_environment) (struct emacs_runtime *ert);
+};
+
+
+/* Function prototype for the module init function.  */
+typedef int (*emacs_init_function) (struct emacs_runtime *ert);
+
+/* Function prototype for the module Lisp functions.  */
+typedef emacs_value (*emacs_subr) (emacs_env *env, ptrdiff_t nargs,
+                                  emacs_value args[], void *data);
+
+/* Possible Emacs function call outcomes.  */
+enum emacs_funcall_exit
+{
+  /* Function has returned normally.  */
+  emacs_funcall_exit_return = 0,
+
+  /* Function has signaled an error using `signal'.  */
+  emacs_funcall_exit_signal = 1,
+
+  /* Function has exit using `throw'.  */
+  emacs_funcall_exit_throw = 2,
+};
+
+struct emacs_env_25
+{
+  /* Structure size (for version checking).  */
+  ptrdiff_t size;
+
+  /* Private data; users should not touch this.  */
+  struct emacs_env_private *private_members;
+
+  /* Memory management.  */
+
+  emacs_value (*make_global_ref) (emacs_env *env,
+                                 emacs_value any_reference);
+
+  void (*free_global_ref) (emacs_env *env,
+                          emacs_value global_reference);
+
+  /* Non-local exit handling.  */
+
+  enum emacs_funcall_exit (*non_local_exit_check) (emacs_env *env);
+
+  void (*non_local_exit_clear) (emacs_env *env);
+
+  enum emacs_funcall_exit (*non_local_exit_get)
+    (emacs_env *env,
+     emacs_value *non_local_exit_symbol_out,
+     emacs_value *non_local_exit_data_out);
+
+  void (*non_local_exit_signal) (emacs_env *env,
+                                emacs_value non_local_exit_symbol,
+                                emacs_value non_local_exit_data);
+
+  void (*non_local_exit_throw) (emacs_env *env,
+                               emacs_value tag,
+                               emacs_value value);
+
+  /* Function registration.  */
+
+  emacs_value (*make_function) (emacs_env *env,
+                               ptrdiff_t min_arity,
+                               ptrdiff_t max_arity,
+                               emacs_value (*function) (emacs_env *env,
+                                                        ptrdiff_t nargs,
+                                                        emacs_value args[],
+                                                        void *)
+                                 EMACS_NOEXCEPT,
+                               const char *documentation,
+                               void *data);
+
+  emacs_value (*funcall) (emacs_env *env,
+                          emacs_value function,
+                          ptrdiff_t nargs,
+                          emacs_value args[]);
+
+  emacs_value (*intern) (emacs_env *env,
+                         const char *symbol_name);
+
+  /* Type conversion.  */
+
+  emacs_value (*type_of) (emacs_env *env,
+                         emacs_value value);
+
+  bool (*is_not_nil) (emacs_env *env, emacs_value value);
+
+  bool (*eq) (emacs_env *env, emacs_value a, emacs_value b);
+
+  intmax_t (*extract_integer) (emacs_env *env, emacs_value value);
+
+  emacs_value (*make_integer) (emacs_env *env, intmax_t value);
+
+  double (*extract_float) (emacs_env *env, emacs_value value);
+
+  emacs_value (*make_float) (emacs_env *env, double value);
+
+  /* Copy the content of the Lisp string VALUE to BUFFER as an utf8
+     null-terminated string.
+
+     SIZE must point to the total size of the buffer.  If BUFFER is
+     NULL or if SIZE is not big enough, write the required buffer size
+     to SIZE and return false.
+
+     Note that SIZE must include the last null byte (e.g. "abc" needs
+     a buffer of size 4).
+
+     Return true if the string was successfully copied.  */
+
+  bool (*copy_string_contents) (emacs_env *env,
+                                emacs_value value,
+                                char *buffer,
+                                ptrdiff_t *size_inout);
+
+  /* Create a Lisp string from a utf8 encoded string.  */
+  emacs_value (*make_string) (emacs_env *env,
+                             const char *contents, ptrdiff_t length);
+
+  /* Embedded pointer type.  */
+  emacs_value (*make_user_ptr) (emacs_env *env,
+                               emacs_finalizer_function fin,
+                               void *ptr);
+
+  void *(*get_user_ptr) (emacs_env *env, emacs_value uptr);
+  void (*set_user_ptr) (emacs_env *env, emacs_value uptr, void *ptr);
+
+  emacs_finalizer_function (*get_user_finalizer) (emacs_env *env,
+                                                 emacs_value uptr);
+  void (*set_user_finalizer) (emacs_env *env,
+                             emacs_value uptr,
+                             emacs_finalizer_function fin);
+
+  /* Vector functions.  */
+  emacs_value (*vec_get) (emacs_env *env, emacs_value vec, ptrdiff_t i);
+
+  void (*vec_set) (emacs_env *env, emacs_value vec, ptrdiff_t i,
+                  emacs_value val);
+
+  ptrdiff_t (*vec_size) (emacs_env *env, emacs_value vec);
+};
+
+/* Every module should define a function as follows.  */
+extern int emacs_module_init (struct emacs_runtime *ert);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* EMACS_MODULE_H */
diff --git a/src/emacs.c b/src/emacs.c
index d0b1eac..83fe873 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -764,6 +764,9 @@ main (int argc, char **argv)
      names between UTF-8 and the system's ANSI codepage.  */
   maybe_load_unicows_dll ();
 #endif
+  /* This has to be done before module_init is called below, so that
+     the latter could use the thread ID of the main thread.  */
+  w32_init_main_thread ();
 #endif
 
 #ifdef RUN_TIME_REMAP
@@ -779,6 +782,10 @@ main (int argc, char **argv)
 
   atexit (close_output_streams);
 
+#ifdef HAVE_MODULES
+  module_init ();
+#endif
+
   sort_args (argc, argv);
   argc = 0;
   while (argv[argc]) argc++;
@@ -1457,6 +1464,11 @@ Using an Emacs configured with --with-x-toolkit=lucid 
does not have this problem
       syms_of_terminal ();
       syms_of_term ();
       syms_of_undo ();
+
+#ifdef HAVE_MODULES
+      syms_of_module ();
+#endif
+
 #ifdef HAVE_SOUND
       syms_of_sound ();
 #endif
diff --git a/src/eval.c b/src/eval.c
index ac98ca1..bd0cf68 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -61,7 +61,7 @@ union specbinding *specpdl_ptr;
 
 /* Depth in Lisp evaluations and function calls.  */
 
-EMACS_INT lisp_eval_depth;
+static EMACS_INT lisp_eval_depth;
 
 /* The value of num_nonmacro_input_events as of the last time we
    started to enter the debugger.  If we decide to enter the debugger
@@ -226,9 +226,8 @@ init_eval (void)
   { /* Put a dummy catcher at top-level so that handlerlist is never NULL.
        This is important since handlerlist->nextfree holds the freelist
        which would otherwise leak every time we unwind back to top-level.   */
-    struct handler *c;
     handlerlist = handlerlist_sentinel.nextfree = &handlerlist_sentinel;
-    PUSH_HANDLER (c, Qunbound, CATCHER);
+    struct handler *c = push_handler (Qunbound, CATCHER);
     eassert (c == &handlerlist_sentinel);
     handlerlist_sentinel.nextfree = NULL;
     handlerlist_sentinel.next = NULL;
@@ -488,6 +487,10 @@ usage: (setq [SYM VAL]...)  */)
   if (CONSP (args))
     {
       Lisp_Object args_left = args;
+      Lisp_Object numargs = Flength (args);
+
+      if (XINT (numargs) & 1)
+        xsignal2 (Qwrong_number_of_arguments, Qsetq, numargs);
 
       do
        {
@@ -1059,18 +1062,16 @@ usage: (catch TAG BODY...)  */)
    This is how catches are done from within C code.  */
 
 Lisp_Object
-internal_catch (Lisp_Object tag, Lisp_Object (*func) (Lisp_Object), 
Lisp_Object arg)
+internal_catch (Lisp_Object tag,
+               Lisp_Object (*func) (Lisp_Object), Lisp_Object arg)
 {
   /* This structure is made part of the chain `catchlist'.  */
-  struct handler *c;
-
-  /* Fill in the components of c, and put it on the list.  */
-  PUSH_HANDLER (c, tag, CATCHER);
+  struct handler *c = push_handler (tag, CATCHER);
 
   /* Call FUNC.  */
   if (! sys_setjmp (c->jmp))
     {
-      Lisp_Object val = (*func) (arg);
+      Lisp_Object val = func (arg);
       clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
       return val;
@@ -1145,6 +1146,8 @@ Both TAG and VALUE are evalled.  */
   if (!NILP (tag))
     for (c = handlerlist; c; c = c->next)
       {
+       if (c->type == CATCHER_ALL)
+          unwind_to_catch (c, Fcons (tag, value));
        if (c->type == CATCHER && EQ (c->tag_or_ch, tag))
          unwind_to_catch (c, value);
       }
@@ -1211,7 +1214,6 @@ internal_lisp_condition_case (volatile Lisp_Object var, 
Lisp_Object bodyform,
                              Lisp_Object handlers)
 {
   Lisp_Object val;
-  struct handler *c;
   struct handler *oldhandlerlist = handlerlist;
   int clausenb = 0;
 
@@ -1246,7 +1248,7 @@ internal_lisp_condition_case (volatile Lisp_Object var, 
Lisp_Object bodyform,
        Lisp_Object condition = XCAR (clause);
        if (!CONSP (condition))
          condition = Fcons (condition, Qnil);
-       PUSH_HANDLER (c, condition, CONDITION_CASE);
+       struct handler *c = push_handler (condition, CONDITION_CASE);
        if (sys_setjmp (c->jmp))
          {
            ptrdiff_t count = SPECPDL_INDEX ();
@@ -1294,46 +1296,45 @@ Lisp_Object
 internal_condition_case (Lisp_Object (*bfun) (void), Lisp_Object handlers,
                         Lisp_Object (*hfun) (Lisp_Object))
 {
-  Lisp_Object val;
-  struct handler *c;
-
-  PUSH_HANDLER (c, handlers, CONDITION_CASE);
+  struct handler *c = push_handler (handlers, CONDITION_CASE);
   if (sys_setjmp (c->jmp))
     {
       Lisp_Object val = handlerlist->val;
       clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
-      return (*hfun) (val);
+      return hfun (val);
+    }
+  else
+    {
+      Lisp_Object val = bfun ();
+      clobbered_eassert (handlerlist == c);
+      handlerlist = handlerlist->next;
+      return val;
     }
-
-  val = (*bfun) ();
-  clobbered_eassert (handlerlist == c);
-  handlerlist = handlerlist->next;
-  return val;
 }
 
 /* Like internal_condition_case but call BFUN with ARG as its argument.  */
 
 Lisp_Object
 internal_condition_case_1 (Lisp_Object (*bfun) (Lisp_Object), Lisp_Object arg,
-                          Lisp_Object handlers, Lisp_Object (*hfun) 
(Lisp_Object))
+                          Lisp_Object handlers,
+                          Lisp_Object (*hfun) (Lisp_Object))
 {
-  Lisp_Object val;
-  struct handler *c;
-
-  PUSH_HANDLER (c, handlers, CONDITION_CASE);
+  struct handler *c = push_handler (handlers, CONDITION_CASE);
   if (sys_setjmp (c->jmp))
     {
       Lisp_Object val = handlerlist->val;
       clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
-      return (*hfun) (val);
+      return hfun (val);
+    }
+  else
+    {
+      Lisp_Object val = bfun (arg);
+      clobbered_eassert (handlerlist == c);
+      handlerlist = handlerlist->next;
+      return val;
     }
-
-  val = (*bfun) (arg);
-  clobbered_eassert (handlerlist == c);
-  handlerlist = handlerlist->next;
-  return val;
 }
 
 /* Like internal_condition_case_1 but call BFUN with ARG1 and ARG2 as
@@ -1346,22 +1347,21 @@ internal_condition_case_2 (Lisp_Object (*bfun) 
(Lisp_Object, Lisp_Object),
                           Lisp_Object handlers,
                           Lisp_Object (*hfun) (Lisp_Object))
 {
-  Lisp_Object val;
-  struct handler *c;
-
-  PUSH_HANDLER (c, handlers, CONDITION_CASE);
+  struct handler *c = push_handler (handlers, CONDITION_CASE);
   if (sys_setjmp (c->jmp))
     {
       Lisp_Object val = handlerlist->val;
       clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
-      return (*hfun) (val);
+      return hfun (val);
+    }
+  else
+    {
+      Lisp_Object val = bfun (arg1, arg2);
+      clobbered_eassert (handlerlist == c);
+      handlerlist = handlerlist->next;
+      return val;
     }
-
-  val = (*bfun) (arg1, arg2);
-  clobbered_eassert (handlerlist == c);
-  handlerlist = handlerlist->next;
-  return val;
 }
 
 /* Like internal_condition_case but call BFUN with NARGS as first,
@@ -1376,22 +1376,57 @@ internal_condition_case_n (Lisp_Object (*bfun) 
(ptrdiff_t, Lisp_Object *),
                                                ptrdiff_t nargs,
                                                Lisp_Object *args))
 {
-  Lisp_Object val;
-  struct handler *c;
-
-  PUSH_HANDLER (c, handlers, CONDITION_CASE);
+  struct handler *c = push_handler (handlers, CONDITION_CASE);
   if (sys_setjmp (c->jmp))
     {
       Lisp_Object val = handlerlist->val;
       clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
-      return (*hfun) (val, nargs, args);
+      return hfun (val, nargs, args);
+    }
+  else
+    {
+      Lisp_Object val = bfun (nargs, args);
+      clobbered_eassert (handlerlist == c);
+      handlerlist = handlerlist->next;
+      return val;
     }
+}
 
-  val = (*bfun) (nargs, args);
-  clobbered_eassert (handlerlist == c);
-  handlerlist = handlerlist->next;
-  return val;
+struct handler *
+push_handler (Lisp_Object tag_ch_val, enum handlertype handlertype)
+{
+  struct handler *c = push_handler_nosignal (tag_ch_val, handlertype);
+  if (!c)
+    memory_full (sizeof *c);
+  return c;
+}
+
+struct handler *
+push_handler_nosignal (Lisp_Object tag_ch_val, enum handlertype handlertype)
+{
+  struct handler *c = handlerlist->nextfree;
+  if (!c)
+    {
+      c = malloc (sizeof *c);
+      if (!c)
+       return c;
+      if (profiler_memory_running)
+       malloc_probe (sizeof *c);
+      c->nextfree = NULL;
+      handlerlist->nextfree = c;
+    }
+  c->type = handlertype;
+  c->tag_or_ch = tag_ch_val;
+  c->val = Qnil;
+  c->next = handlerlist;
+  c->lisp_eval_depth = lisp_eval_depth;
+  c->pdlcount = SPECPDL_INDEX ();
+  c->poll_suppress_count = poll_suppress_count;
+  c->interrupt_input_blocked = interrupt_input_blocked;
+  c->byte_stack = byte_stack_list;
+  handlerlist = c;
+  return c;
 }
 
 
@@ -2014,6 +2049,10 @@ eval_sub (Lisp_Object form)
   Lisp_Object funcar;
   ptrdiff_t count;
 
+  /* Declare here, as this array may be accessed by call_debugger near
+     the end of this function.  See Bug#21245.  */
+  Lisp_Object argvals[8];
+
   if (SYMBOLP (form))
     {
       /* Look up its binding in the lexical environment.
@@ -2066,13 +2105,8 @@ eval_sub (Lisp_Object form)
 
   if (SUBRP (fun))
     {
-      Lisp_Object numargs;
-      Lisp_Object argvals[8];
-      Lisp_Object args_left;
-      register int i, maxargs;
-
-      args_left = original_args;
-      numargs = Flength (args_left);
+      Lisp_Object args_left = original_args;
+      Lisp_Object numargs = Flength (args_left);
 
       check_cons_list ();
 
@@ -2101,11 +2135,20 @@ eval_sub (Lisp_Object form)
          set_backtrace_args (specpdl + count, vals, XINT (numargs));
 
          val = (XSUBR (fun)->function.aMANY) (XINT (numargs), vals);
+
+         check_cons_list ();
+         lisp_eval_depth--;
+         /* Do the debug-on-exit now, while VALS still exists.  */
+         if (backtrace_debug_on_exit (specpdl + count))
+           val = call_debugger (list2 (Qexit, val));
          SAFE_FREE ();
+         specpdl_ptr--;
+         return val;
        }
       else
        {
-         maxargs = XSUBR (fun)->max_args;
+         int i, maxargs = XSUBR (fun)->max_args;
+
          for (i = 0; i < maxargs; i++)
            {
              argvals[i] = eval_sub (Fcar (args_left));
@@ -2165,7 +2208,7 @@ eval_sub (Lisp_Object form)
        }
     }
   else if (COMPILEDP (fun))
-    val = apply_lambda (fun, original_args, count);
+    return apply_lambda (fun, original_args, count);
   else
     {
       if (NILP (fun))
@@ -2195,7 +2238,7 @@ eval_sub (Lisp_Object form)
        }
       else if (EQ (funcar, Qlambda)
               || EQ (funcar, Qclosure))
-       val = apply_lambda (fun, original_args, count);
+       return apply_lambda (fun, original_args, count);
       else
        xsignal1 (Qinvalid_function, original_fun);
     }
@@ -2750,14 +2793,13 @@ apply_lambda (Lisp_Object fun, Lisp_Object args, 
ptrdiff_t count)
   set_backtrace_args (specpdl + count, arg_vector, i);
   tem = funcall_lambda (fun, numargs, arg_vector);
 
+  check_cons_list ();
+  lisp_eval_depth--;
   /* Do the debug-on-exit now, while arg_vector still exists.  */
   if (backtrace_debug_on_exit (specpdl + count))
-    {
-      /* Don't do it again when we return to eval.  */
-      set_backtrace_debug_on_exit (specpdl + count, false);
-      tem = call_debugger (list2 (Qexit, tem));
-    }
+    tem = call_debugger (list2 (Qexit, tem));
   SAFE_FREE ();
+  specpdl_ptr--;
   return tem;
 }
 
@@ -2792,6 +2834,9 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs,
     }
   else if (COMPILEDP (fun))
     {
+      ptrdiff_t size = ASIZE (fun) & PSEUDOVECTOR_SIZE_MASK;
+      if (size <= COMPILED_STACK_DEPTH)
+       xsignal1 (Qinvalid_function, fun);
       syms_left = AREF (fun, COMPILED_ARGLIST);
       if (INTEGERP (syms_left))
        /* A byte-code object with a non-nil `push args' slot means we
@@ -2889,19 +2934,25 @@ DEFUN ("fetch-bytecode", Ffetch_bytecode, 
Sfetch_bytecode,
 {
   Lisp_Object tem;
 
-  if (COMPILEDP (object) && CONSP (AREF (object, COMPILED_BYTECODE)))
+  if (COMPILEDP (object))
     {
-      tem = read_doc_string (AREF (object, COMPILED_BYTECODE));
-      if (!CONSP (tem))
+      ptrdiff_t size = ASIZE (object) & PSEUDOVECTOR_SIZE_MASK;
+      if (size <= COMPILED_STACK_DEPTH)
+       xsignal1 (Qinvalid_function, object);
+      if (CONSP (AREF (object, COMPILED_BYTECODE)))
        {
-         tem = AREF (object, COMPILED_BYTECODE);
-         if (CONSP (tem) && STRINGP (XCAR (tem)))
-           error ("Invalid byte code in %s", SDATA (XCAR (tem)));
-         else
-           error ("Invalid byte code");
+         tem = read_doc_string (AREF (object, COMPILED_BYTECODE));
+         if (!CONSP (tem))
+           {
+             tem = AREF (object, COMPILED_BYTECODE);
+             if (CONSP (tem) && STRINGP (XCAR (tem)))
+               error ("Invalid byte code in %s", SDATA (XCAR (tem)));
+             else
+               error ("Invalid byte code");
+           }
+         ASET (object, COMPILED_BYTECODE, XCAR (tem));
+         ASET (object, COMPILED_CONSTANTS, XCDR (tem));
        }
-      ASET (object, COMPILED_BYTECODE, XCAR (tem));
-      ASET (object, COMPILED_CONSTANTS, XCDR (tem));
     }
   return object;
 }
@@ -3145,10 +3196,11 @@ unbind_to (ptrdiff_t count, Lisp_Object value)
          { /* If variable has a trivial value (no forwarding), we can
               just set it.  No need to check for constant symbols here,
               since that was already done by specbind.  */
-           struct Lisp_Symbol *sym = XSYMBOL (specpdl_symbol (specpdl_ptr));
-           if (sym->redirect == SYMBOL_PLAINVAL)
+           Lisp_Object sym = specpdl_symbol (specpdl_ptr);
+           if (SYMBOLP (sym) && XSYMBOL (sym)->redirect == SYMBOL_PLAINVAL)
              {
-               SET_SYMBOL_VAL (sym, specpdl_old_value (specpdl_ptr));
+               SET_SYMBOL_VAL (XSYMBOL (sym),
+                               specpdl_old_value (specpdl_ptr));
                break;
              }
            else
@@ -3357,12 +3409,12 @@ backtrace_eval_unrewind (int distance)
          { /* If variable has a trivial value (no forwarding), we can
               just set it.  No need to check for constant symbols here,
               since that was already done by specbind.  */
-           struct Lisp_Symbol *sym = XSYMBOL (specpdl_symbol (tmp));
-           if (sym->redirect == SYMBOL_PLAINVAL)
+           Lisp_Object sym = specpdl_symbol (tmp);
+           if (SYMBOLP (sym) && XSYMBOL (sym)->redirect == SYMBOL_PLAINVAL)
              {
                Lisp_Object old_value = specpdl_old_value (tmp);
-               set_specpdl_old_value (tmp, SYMBOL_VAL (sym));
-               SET_SYMBOL_VAL (sym, old_value);
+               set_specpdl_old_value (tmp, SYMBOL_VAL (XSYMBOL (sym)));
+               SET_SYMBOL_VAL (XSYMBOL (sym), old_value);
                break;
              }
            else
@@ -3607,6 +3659,7 @@ To prevent this happening, set `quit-flag' to nil
 before making `inhibit-quit' nil.  */);
   Vinhibit_quit = Qnil;
 
+  DEFSYM (Qsetq, "setq");
   DEFSYM (Qinhibit_quit, "inhibit-quit");
   DEFSYM (Qautoload, "autoload");
   DEFSYM (Qinhibit_debugger, "inhibit-debugger");
diff --git a/src/fileio.c b/src/fileio.c
index 6cda1e3..e18ddb1 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -4263,9 +4263,14 @@ by calling `format-decode', which see.  */)
       if (CODING_FOR_UNIBYTE (&coding)
          /* Can't do this if part of the buffer might be preserved.  */
          && NILP (replace))
-       /* Visiting a file with these coding system makes the buffer
-          unibyte.  */
-       bset_enable_multibyte_characters (current_buffer, Qnil);
+       {
+         /* Visiting a file with these coding system makes the buffer
+            unibyte.  */
+         if (inserted > 0)
+           bset_enable_multibyte_characters (current_buffer, Qnil);
+         else
+           Fset_buffer_multibyte (Qnil);
+       }
     }
 
   coding.dst_multibyte = ! NILP (BVAR (current_buffer, 
enable_multibyte_characters));
diff --git a/src/fns.c b/src/fns.c
index 4695666..4c13290 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -338,7 +338,7 @@ This function obeys the conventions for collation order in 
your
 locale settings.  For example, punctuation and whitespace characters
 might be considered less significant for sorting:
 
-(sort '("11" "12" "1 1" "1 2" "1.1" "1.2") \\='string-collate-lessp)
+(sort \\='("11" "12" "1 1" "1 2" "1.1" "1.2") \\='string-collate-lessp)
   => ("11" "1 1" "1.1" "12" "1 2" "1.2")
 
 The optional argument LOCALE, a string, overrides the setting of your
@@ -1580,7 +1580,8 @@ sublist by modifying its list structure, then returns the 
resulting
 list.
 
 Write `(setq foo (delq element foo))' to be sure of correctly changing
-the value of a list `foo'.  */)
+the value of a list `foo'.  See also `remq', which does not modify the
+argument.  */)
   (register Lisp_Object elt, Lisp_Object list)
 {
   Lisp_Object tail, tortoise, prev = Qnil;
@@ -2763,8 +2764,9 @@ DEFUN ("require", Frequire, Srequire, 1, 3, 0,
 If FEATURE is not a member of the list `features', then the feature
 is not loaded; so load the file FILENAME.
 If FILENAME is omitted, the printname of FEATURE is used as the file name,
-and `load' will try to load this name appended with the suffix `.elc' or
-`.el', in that order.  The name without appended suffix will not be used.
+and `load' will try to load this name appended with the suffix `.elc',
+`.el', or the system-dependent suffix for dynamic module files, in that
+order.  The name without appended suffix will not be used.
 See `get-load-suffixes' for the complete list of suffixes.
 If the optional third argument NOERROR is non-nil,
 then return nil if the file is not found instead of signaling an error.
@@ -3619,8 +3621,7 @@ larger_vector (Lisp_Object vec, ptrdiff_t incr_min, 
ptrdiff_t nitems_max)
                         Low-level Functions
  ***********************************************************************/
 
-static struct hash_table_test hashtest_eq;
-struct hash_table_test hashtest_eql, hashtest_equal;
+struct hash_table_test hashtest_eq, hashtest_eql, hashtest_equal;
 
 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
    HASH2 in hash table H using `eql'.  Value is true if KEY1 and
@@ -3991,7 +3992,7 @@ hash_put (struct Lisp_Hash_Table *h, Lisp_Object key, 
Lisp_Object value,
 
 /* Remove the entry matching KEY from hash table H, if there is one.  */
 
-static void
+void
 hash_remove_from_table (struct Lisp_Hash_Table *h, Lisp_Object key)
 {
   EMACS_UINT hash_code;
@@ -4078,13 +4079,10 @@ hash_clear (struct Lisp_Hash_Table *h)
 static bool
 sweep_weak_table (struct Lisp_Hash_Table *h, bool remove_entries_p)
 {
-  ptrdiff_t bucket, n;
-  bool marked;
-
-  n = ASIZE (h->index) & ~ARRAY_MARK_FLAG;
-  marked = 0;
+  ptrdiff_t n = gc_asize (h->index);
+  bool marked = false;
 
-  for (bucket = 0; bucket < n; ++bucket)
+  for (ptrdiff_t bucket = 0; bucket < n; ++bucket)
     {
       Lisp_Object idx, next, prev;
 
diff --git a/src/font.c b/src/font.c
index 016b7e0..6fa5995 100644
--- a/src/font.c
+++ b/src/font.c
@@ -4036,7 +4036,13 @@ The value of :otf is a cons (GSUB . GPOS) where GSUB and 
GPOS are lists
 representing the OpenType features supported by the font by this form:
   ((SCRIPT (LANGSYS FEATURE ...) ...) ...)
 SCRIPT, LANGSYS, and FEATURE are all symbols representing OpenType
-Layout tags.  */)
+Layout tags.
+
+In addition to the keys listed abobe, the following keys are reserved
+for the specific meanings as below:
+
+The value of :combining-capability is non-nil if the font-backend of
+FONT supports rendering of combining characters for non-OTF fonts.  */)
   (Lisp_Object font, Lisp_Object key)
 {
   int idx;
@@ -4051,14 +4057,22 @@ Layout tags.  */)
   if (idx >= 0 && idx < FONT_EXTRA_INDEX)
     return AREF (font, idx);
   val = Fassq (key, AREF (font, FONT_EXTRA_INDEX));
-  if (NILP (val) && EQ (key, QCotf) && FONT_OBJECT_P (font))
+  if (NILP (val) && FONT_OBJECT_P (font))
     {
       struct font *fontp = XFONT_OBJECT (font);
 
-      if (fontp->driver->otf_capability)
-       val = fontp->driver->otf_capability (fontp);
-      else
-       val = Fcons (Qnil, Qnil);
+      if (EQ (key, QCotf))
+       {
+         if (fontp->driver->otf_capability)
+           val = fontp->driver->otf_capability (fontp);
+         else
+           val = Fcons (Qnil, Qnil);
+       }
+      else if (EQ (key, QCcombining_capability))
+       {
+         if (fontp->driver->combining_capability)
+           val = fontp->driver->combining_capability (fontp);
+       }
     }
   else
     val = Fcdr (val);
@@ -5290,6 +5304,7 @@ syms_of_font (void)
   DEFSYM (QCscalable, ":scalable");
   DEFSYM (QCavgwidth, ":avgwidth");
   DEFSYM (QCfont_entity, ":font-entity");
+  DEFSYM (QCcombining_capability, ":combining-capability");
 
   /* Symbols representing values of font spacing property.  */
   DEFSYM (Qc, "c");
diff --git a/src/font.h b/src/font.h
index 1d13e1c..3f4ccb1 100644
--- a/src/font.h
+++ b/src/font.h
@@ -427,6 +427,13 @@ FONT_SPEC_P (Lisp_Object x)
   return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX;
 }
 
+/* Like FONT_SPEC_P, but can be used in the garbage collector.  */
+INLINE bool
+GC_FONT_SPEC_P (Lisp_Object x)
+{
+  return FONTP (x) && (gc_asize (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX;
+}
+
 /* True iff X is font-entity.  */
 INLINE bool
 FONT_ENTITY_P (Lisp_Object x)
@@ -434,6 +441,13 @@ FONT_ENTITY_P (Lisp_Object x)
   return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_ENTITY_MAX;
 }
 
+/* Like FONT_ENTITY_P, but can be used in the garbage collector.  */
+INLINE bool
+GC_FONT_ENTITY_P (Lisp_Object x)
+{
+  return FONTP (x) && (gc_asize (x) & PSEUDOVECTOR_SIZE_MASK) == 
FONT_ENTITY_MAX;
+}
+
 /* True iff X is font-object.  */
 INLINE bool
 FONT_OBJECT_P (Lisp_Object x)
@@ -441,6 +455,13 @@ FONT_OBJECT_P (Lisp_Object x)
   return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX;
 }
 
+/* Like FONT_OBJECT_P, but can be used in the garbage collector.  */
+INLINE bool
+GC_FONT_OBJECT_P (Lisp_Object x)
+{
+  return FONTP (x) && (gc_asize (x) & PSEUDOVECTOR_SIZE_MASK) == 
FONT_OBJECT_MAX;
+}
+
 /* Type checking functions for various font-related objects.  */
 
 INLINE void
@@ -476,6 +497,13 @@ XFONT_SPEC (Lisp_Object p)
   return XUNTAG (p, Lisp_Vectorlike);
 }
 
+INLINE struct font_spec *
+GC_XFONT_SPEC (Lisp_Object p)
+{
+  eassert (GC_FONT_SPEC_P (p));
+  return XUNTAG (p, Lisp_Vectorlike);
+}
+
 INLINE struct font_entity *
 XFONT_ENTITY (Lisp_Object p)
 {
@@ -483,6 +511,13 @@ XFONT_ENTITY (Lisp_Object p)
   return XUNTAG (p, Lisp_Vectorlike);
 }
 
+INLINE struct font_entity *
+GC_XFONT_ENTITY (Lisp_Object p)
+{
+  eassert (GC_FONT_ENTITY_P (p));
+  return XUNTAG (p, Lisp_Vectorlike);
+}
+
 INLINE struct font *
 XFONT_OBJECT (Lisp_Object p)
 {
@@ -490,6 +525,13 @@ XFONT_OBJECT (Lisp_Object p)
   return XUNTAG (p, Lisp_Vectorlike);
 }
 
+INLINE struct font *
+GC_XFONT_OBJECT (Lisp_Object p)
+{
+  eassert (GC_FONT_OBJECT_P (p));
+  return XUNTAG (p, Lisp_Vectorlike);
+}
+
 #define XSETFONT(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_FONT))
 
 INLINE struct font *
@@ -715,6 +757,12 @@ struct font_driver
   bool (*cached_font_ok) (struct frame *f,
                           Lisp_Object font_object,
                           Lisp_Object entity);
+
+  /* Optional
+
+     Return non-nil if the driver support rendering of combining
+     characters for FONT according to Unicode combining class.  */
+  Lisp_Object (*combining_capability) (struct font *font);
 };
 
 
diff --git a/src/frame.c b/src/frame.c
index 78f8ff7..4897052 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -239,10 +239,10 @@ DEFUN ("framep", Fframep, Sframep, 1, 1, 0,
        doc: /* Return non-nil if OBJECT is a frame.
 Value is:
   t for a termcap frame (a character-only terminal),
- 'x' for an Emacs frame that is really an X window,
- 'w32' for an Emacs frame that is a window on MS-Windows display,
- 'ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
- 'pc' for a direct-write MS-DOS frame.
+ `x' for an Emacs frame that is really an X window,
+ `w32' for an Emacs frame that is a window on MS-Windows display,
+ `ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
+ `pc' for a direct-write MS-DOS frame.
 See also `frame-live-p'.  */)
   (Lisp_Object object)
 {
@@ -284,10 +284,10 @@ DEFUN ("window-system", Fwindow_system, Swindow_system, 
0, 1, 0,
        doc: /* The name of the window system that FRAME is displaying through.
 The value is a symbol:
  nil for a termcap frame (a character-only terminal),
- 'x' for an Emacs frame that is really an X window,
- 'w32' for an Emacs frame that is a window on MS-Windows display,
- 'ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
- 'pc' for a direct-write MS-DOS frame.
+ `x' for an Emacs frame that is really an X window,
+ `w32' for an Emacs frame that is a window on MS-Windows display,
+ `ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
+ `pc' for a direct-write MS-DOS frame.
 
 FRAME defaults to the currently selected frame.
 
@@ -2641,13 +2641,16 @@ If FRAME is nil, describe the currently selected frame. 
 */)
 
 DEFUN ("modify-frame-parameters", Fmodify_frame_parameters,
        Smodify_frame_parameters, 2, 2, 0,
-       doc: /* Modify the parameters of frame FRAME according to ALIST.
+       doc: /* Modify FRAME according to new values of its parameters in ALIST.
 If FRAME is nil, it defaults to the selected frame.
 ALIST is an alist of parameters to change and their new values.
 Each element of ALIST has the form (PARM . VALUE), where PARM is a symbol.
-The meaningful PARMs depend on the kind of frame.
-Undefined PARMs are ignored, but stored in the frame's parameter list
-so that `frame-parameters' will return them.
+Which PARMs are meaningful depends on the kind of frame.
+The meaningful parameters are acted upon, i.e. the frame is changed
+according to their new values, and are also stored in the frame's
+parameter list so that `frame-parameters' will return them.
+PARMs that are not meaningful are still stored in the frame's parameter
+list, but are otherwise ignored.
 
 The value of frame parameter FOO can also be accessed
 as a frame-local binding for the variable FOO, if you have
diff --git a/src/ftfont.c b/src/ftfont.c
index 17e41a9..575bf53 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -30,6 +30,7 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 #include "dispextern.h"
 #include "character.h"
 #include "charset.h"
+#include "category.h"
 #include "composite.h"
 #include "font.h"
 #include "ftfont.h"
@@ -81,6 +82,8 @@ static Lisp_Object ftfont_lookup_cache (Lisp_Object,
 
 static void ftfont_filter_properties (Lisp_Object font, Lisp_Object alist);
 
+static Lisp_Object ftfont_combining_capability (struct font *);
+
 #define SYMBOL_FcChar8(SYM) (FcChar8 *) SDATA (SYMBOL_NAME (SYM))
 
 static struct
@@ -547,6 +550,10 @@ struct font_driver ftfont_driver =
 #endif
 
     ftfont_filter_properties, /* filter_properties */
+
+    NULL,                      /* cached_font_ok */
+
+    ftfont_combining_capability,
   };
 
 static Lisp_Object
@@ -2533,7 +2540,7 @@ ftfont_shape_by_flt (Lisp_Object lgstring, struct font 
*font,
 
   len = i;
 
-  if (with_variation_selector)
+  if (otf && with_variation_selector)
     {
       setup_otf_gstring (len);
       for (i = 0; i < len; i++)
@@ -2583,14 +2590,19 @@ ftfont_shape_by_flt (Lisp_Object lgstring, struct font 
*font,
   flt_font_ft.otf = otf;
   flt_font_ft.matrix = matrix->xx != 0 ? matrix : 0;
 
-  if (1 < len)
+  if (1 < len || ! otf)
     {
       /* A little bit ad hoc.  Perhaps, shaper must get script and
         language information, and select a proper flt for them
         here.  */
       int c1 = LGLYPH_CHAR (LGSTRING_GLYPH (lgstring, 1));
-      if (0x300 <= c1 && c1 <= 0x36F)
+      if (CHAR_HAS_CATEGORY (c1, '^'))
        flt = mflt_get (msymbol ("combining"));
+      else if (! otf)
+       flt = mflt_find (LGLYPH_CHAR (LGSTRING_GLYPH (lgstring, 0)),
+                        &flt_font_ft.flt_font);
+      if (! flt)
+       return make_number (0);
     }
 
   MFLTGlyphFT *glyphs = (MFLTGlyphFT *) gstring.glyphs;
@@ -2675,8 +2687,6 @@ ftfont_shape (Lisp_Object lgstring)
   struct ftfont_info *ftfont_info = (struct ftfont_info *) font;
   OTF *otf = ftfont_get_otf (ftfont_info);
 
-  if (! otf)
-    return make_number (0);
   return ftfont_shape_by_flt (lgstring, font, ftfont_info->ft_size->face, otf,
                              &ftfont_info->matrix);
 }
@@ -2750,6 +2760,16 @@ ftfont_filter_properties (Lisp_Object font, Lisp_Object 
alist)
 }
 
 
+static Lisp_Object
+ftfont_combining_capability (struct font *font)
+{
+#ifdef HAVE_M17N_FLT
+  return Qt;
+#else
+  return Qnil;
+#endif
+}
+
 void
 syms_of_ftfont (void)
 {
diff --git a/src/gmalloc.c b/src/gmalloc.c
index a88f4ab..90a52a1 100644
--- a/src/gmalloc.c
+++ b/src/gmalloc.c
@@ -60,7 +60,6 @@ extern void emacs_abort (void);
    which HYBRID_MACRO is defined.  Any other platform that wants to
    define it will have to define the macros DUMPED and
    ALLOCATED_BEFORE_DUMPING, defined below for Cygwin.  */
-#ifdef HYBRID_MALLOC
 #undef malloc
 #undef realloc
 #undef calloc
@@ -70,7 +69,6 @@ extern void emacs_abort (void);
 #define calloc gcalloc
 #define aligned_alloc galigned_alloc
 #define free gfree
-#endif  /* HYBRID_MALLOC */
 
 #ifdef CYGWIN
 extern void *bss_sbrk (ptrdiff_t size);
@@ -1711,13 +1709,13 @@ valloc (size_t size)
   return aligned_alloc (pagesize, size);
 }
 
-#ifdef HYBRID_MALLOC
 #undef malloc
 #undef realloc
 #undef calloc
 #undef aligned_alloc
 #undef free
 
+#ifdef HYBRID_MALLOC
 /* Declare system malloc and friends.  */
 extern void *malloc (size_t size);
 extern void *realloc (void *ptr, size_t size);
@@ -1816,6 +1814,38 @@ hybrid_get_current_dir_name (void)
 }
 #endif
 
+#else  /* ! HYBRID_MALLOC */
+
+void *
+malloc (size_t size)
+{
+  return gmalloc (size);
+}
+
+void *
+calloc (size_t nmemb, size_t size)
+{
+  return gcalloc (nmemb, size);
+}
+
+void
+free (void *ptr)
+{
+  gfree (ptr);
+}
+
+void *
+aligned_alloc (size_t alignment, size_t size)
+{
+  return galigned_alloc (alignment, size);
+}
+
+void *
+realloc (void *ptr, size_t size)
+{
+  return grealloc (ptr, size);
+}
+
 #endif /* HYBRID_MALLOC */
 
 #ifdef GC_MCHECK
diff --git a/src/indent.c b/src/indent.c
index 04837f8..33bf424 100644
--- a/src/indent.c
+++ b/src/indent.c
@@ -2080,11 +2080,7 @@ whether or not it is currently displayed in some window. 
 */)
        }
       else
        it_overshoot_count =
-         (!(it.method == GET_FROM_IMAGE
-            || it.method == GET_FROM_STRETCH)
-           /* We will overshoot if lines are truncated and PT lies
-              beyond the right margin of the window.  */
-           || it.line_wrap == TRUNCATE);
+         !(it.method == GET_FROM_IMAGE || it.method == GET_FROM_STRETCH);
 
       if (start_x_given)
        {
@@ -2142,6 +2138,11 @@ whether or not it is currently displayed in some window. 
 */)
                 screen lines we need to backtrack.  */
              it_overshoot_count = it.vpos;
            }
+         /* We will overshoot if lines are truncated and point lies
+            beyond the right margin of the window.  */
+         if (it.line_wrap == TRUNCATE && it.current_x >= it.last_visible_x
+             && it_overshoot_count == 0)
+           it_overshoot_count = 1;
          if (it_overshoot_count > 0)
            move_it_by_lines (&it, -it_overshoot_count);
 
diff --git a/src/insdel.c b/src/insdel.c
index 24807b1..bb3171b 100644
--- a/src/insdel.c
+++ b/src/insdel.c
@@ -1765,6 +1765,18 @@ modify_text (ptrdiff_t start, ptrdiff_t end)
   bset_point_before_scroll (current_buffer, Qnil);
 }
 
+/* Signal that we are about to make a change that may result in new
+   undo information.
+ */
+static void
+run_undoable_change (void)
+{
+  if (EQ (BVAR (current_buffer, undo_list), Qt))
+    return;
+
+  call0 (Qundo_auto__undoable_change);
+}
+
 /* Check that it is okay to modify the buffer between START and END,
    which are char positions.
 
@@ -1773,7 +1785,12 @@ modify_text (ptrdiff_t start, ptrdiff_t end)
    any modification properties the text may have.
 
    If PRESERVE_PTR is nonzero, we relocate *PRESERVE_PTR
-   by holding its value temporarily in a marker.  */
+   by holding its value temporarily in a marker.
+
+   This function runs Lisp, which means it can GC, which means it can
+   compact buffers, including the current buffer being worked on here.
+   So don't you dare calling this function while manipulating the gap,
+   or during some other similar "critical section".  */
 
 void
 prepare_to_modify_buffer_1 (ptrdiff_t start, ptrdiff_t end,
@@ -1786,6 +1803,8 @@ prepare_to_modify_buffer_1 (ptrdiff_t start, ptrdiff_t 
end,
   if (!NILP (BVAR (current_buffer, read_only)))
     Fbarf_if_buffer_read_only (temp);
 
+  run_undoable_change();
+
   bset_redisplay (current_buffer);
 
   if (buffer_intervals (current_buffer))
@@ -2187,6 +2206,8 @@ syms_of_insdel (void)
   combine_after_change_list = Qnil;
   combine_after_change_buffer = Qnil;
 
+  DEFSYM (Qundo_auto__undoable_change, "undo-auto--undoable-change");
+
   DEFVAR_LISP ("combine-after-change-calls", Vcombine_after_change_calls,
               doc: /* Used internally by the function 
`combine-after-change-calls' macro.  */);
   Vcombine_after_change_calls = Qnil;
diff --git a/src/keyboard.c b/src/keyboard.c
index ec9dcaf..db508c2 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -195,14 +195,15 @@ Lisp_Object unread_switch_frame;
 /* Last size recorded for a current buffer which is not a minibuffer.  */
 static ptrdiff_t last_non_minibuf_size;
 
-/* Total number of times read_char has returned, modulo UINTMAX_MAX + 1.  */
 uintmax_t num_input_events;
+ptrdiff_t point_before_last_command_or_undo;
+struct buffer *buffer_before_last_command_or_undo;
 
 /* Value of num_nonmacro_input_events as of last auto save.  */
 
 static EMACS_INT last_auto_save;
 
-/* The value of point when the last command was started.  */
+/* The value of point when the last command was started. */
 static ptrdiff_t last_point_position;
 
 /* The frame in which the last input event occurred, or Qmacro if the
@@ -1449,6 +1450,11 @@ command_loop_1 (void)
                result of changes from the last command. */
             call0 (Qundo_auto__add_boundary);
 
+            /* Record point and buffer, so we can put point into the undo
+               information if necessary. */
+            point_before_last_command_or_undo = PT;
+            buffer_before_last_command_or_undo = current_buffer;
+
             call1 (Qcommand_execute, Vthis_command);
 
 #ifdef HAVE_WINDOW_SYSTEM
@@ -3313,14 +3319,12 @@ readable_events (int flags)
 #endif
                   ))
         {
-          union buffered_input_event *event;
-
-          event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
-                   ? kbd_fetch_ptr
-                   : kbd_buffer);
+          union buffered_input_event *event = kbd_fetch_ptr;
 
          do
            {
+              if (event == kbd_buffer + KBD_BUFFER_SIZE)
+                event = kbd_buffer;
              if (!(
 #ifdef USE_TOOLKIT_SCROLL_BARS
                    (flags & READABLE_EVENTS_FILTER_EVENTS) &&
@@ -3337,8 +3341,6 @@ readable_events (int flags)
                       && event->kind == BUFFER_SWITCH_EVENT))
                return 1;
              event++;
-              if (event == kbd_buffer + KBD_BUFFER_SIZE)
-                event = kbd_buffer;
            }
          while (event != kbd_store_ptr);
         }
@@ -11391,7 +11393,7 @@ If an unhandled error happens in running this hook,
 the function in which the error occurred is unconditionally removed, since
 otherwise the error might happen repeatedly and make Emacs nonfunctional.
 
-See also `pre-command-hook'.  */);
+See also `post-command-hook'.  */);
   Vpre_command_hook = Qnil;
 
   DEFVAR_LISP ("post-command-hook", Vpost_command_hook,
diff --git a/src/keyboard.h b/src/keyboard.h
index 98bc86b..890d24e 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -245,6 +245,18 @@ extern KBOARD *current_kboard;
 /* Total number of times read_char has returned, modulo UINTMAX_MAX + 1.  */
 extern uintmax_t num_input_events;
 
+/* The location of point immediately before the last command was
+   executed, or the last time the undo-boundary command added a
+   boundary.*/
+extern ptrdiff_t point_before_last_command_or_undo;
+
+/* The value of current_buffer immediately before the last command was
+   executed, or the last time the undo-boundary command added a
+   boundary.*/
+extern struct buffer *buffer_before_last_command_or_undo;
+
+extern struct buffer *prev_buffer;
+
 /* Nonzero means polling for input is temporarily suppressed.  */
 extern int poll_suppress_count;
 
diff --git a/src/lisp.h b/src/lisp.h
index 0df76ba..26032d9 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -357,7 +357,7 @@ error !;
 # define lisp_h_XINT(a) (XLI (a) >> INTTYPEBITS)
 # define lisp_h_XSYMBOL(a) \
     (eassert (SYMBOLP (a)), \
-     (struct Lisp_Symbol *) ((uintptr_t) XLI (a) - Lisp_Symbol \
+     (struct Lisp_Symbol *) ((intptr_t) XLI (a) - Lisp_Symbol \
                             + (char *) lispsym))
 # define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK))
 # define lisp_h_XUNTAG(a, type) ((void *) (intptr_t) (XLI (a) - (type)))
@@ -369,6 +369,12 @@ error !;
 #if (defined __NO_INLINE__ \
      && ! defined __OPTIMIZE__ && ! defined __OPTIMIZE_SIZE__ \
      && ! (defined INLINING && ! INLINING))
+# define DEFINE_KEY_OPS_AS_MACROS true
+#else
+# define DEFINE_KEY_OPS_AS_MACROS false
+#endif
+
+#if DEFINE_KEY_OPS_AS_MACROS
 # define XLI(o) lisp_h_XLI (o)
 # define XIL(i) lisp_h_XIL (i)
 # define CHECK_LIST_CONS(x, y) lisp_h_CHECK_LIST_CONS (x, y)
@@ -468,6 +474,9 @@ enum Lisp_Misc_Type
     Lisp_Misc_Overlay,
     Lisp_Misc_Save_Value,
     Lisp_Misc_Finalizer,
+#ifdef HAVE_MODULES
+    Lisp_Misc_User_Ptr,
+#endif
     /* Currently floats are not a misc type,
        but let's define this in case we want to change that.  */
     Lisp_Misc_Float,
@@ -581,6 +590,12 @@ INLINE bool PROCESSP (Lisp_Object);
 INLINE bool PSEUDOVECTORP (Lisp_Object, int);
 INLINE bool SAVE_VALUEP (Lisp_Object);
 INLINE bool FINALIZERP (Lisp_Object);
+
+#ifdef HAVE_MODULES
+INLINE bool USER_PTRP (Lisp_Object);
+INLINE struct Lisp_User_Ptr *(XUSER_PTR) (Lisp_Object);
+#endif
+
 INLINE void set_sub_char_table_contents (Lisp_Object, ptrdiff_t,
                                              Lisp_Object);
 INLINE bool STRINGP (Lisp_Object);
@@ -704,9 +719,15 @@ struct Lisp_Symbol
 #define DEFUN_ARGS_8   (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
                         Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
 
-/* Yield an integer that contains TAG along with PTR.  */
+/* Yield a signed integer that contains TAG along with PTR.
+
+   Sign-extend pointers when USE_LSB_TAG (this simplifies emacs-module.c),
+   and zero-extend otherwise (that’s a bit faster here).
+   Sign extension matters only when EMACS_INT is wider than a pointer.  */
 #define TAG_PTR(tag, ptr) \
-  ((USE_LSB_TAG ? (tag) : (EMACS_UINT) (tag) << VALBITS) + (uintptr_t) (ptr))
+  (USE_LSB_TAG \
+   ? (intptr_t) (ptr) + (tag) \
+   : (EMACS_INT) (((EMACS_UINT) (tag) << VALBITS) + (uintptr_t) (ptr)))
 
 /* Yield an integer that contains a symbol tag along with OFFSET.
    OFFSET should be the offset in bytes from 'lispsym' to the symbol.  */
@@ -844,7 +865,9 @@ INLINE EMACS_INT
 INLINE EMACS_INT
 (XFASTINT) (Lisp_Object a)
 {
-  return lisp_h_XFASTINT (a);
+  EMACS_INT n = lisp_h_XFASTINT (a);
+  eassume (0 <= n);
+  return n;
 }
 
 INLINE struct Lisp_Symbol *
@@ -912,19 +935,10 @@ XFASTINT (Lisp_Object a)
 {
   EMACS_INT int0 = Lisp_Int0;
   EMACS_INT n = USE_LSB_TAG ? XINT (a) : XLI (a) - (int0 << VALBITS);
-  eassert (0 <= n);
+  eassume (0 <= n);
   return n;
 }
 
-/* Extract A's value as a symbol.  */
-INLINE struct Lisp_Symbol *
-XSYMBOL (Lisp_Object a)
-{
-  uintptr_t i = (uintptr_t) XUNTAG (a, Lisp_Symbol);
-  void *p = (char *) lispsym + i;
-  return p;
-}
-
 /* Extract A's type.  */
 INLINE enum Lisp_Type
 XTYPE (Lisp_Object a)
@@ -933,6 +947,16 @@ XTYPE (Lisp_Object a)
   return USE_LSB_TAG ? i & ~VALMASK : i >> VALBITS;
 }
 
+/* Extract A's value as a symbol.  */
+INLINE struct Lisp_Symbol *
+XSYMBOL (Lisp_Object a)
+{
+  eassert (SYMBOLP (a));
+  intptr_t i = (intptr_t) XUNTAG (a, Lisp_Symbol);
+  void *p = (char *) lispsym + i;
+  return p;
+}
+
 /* Extract A's pointer value, assuming A's type is TYPE.  */
 INLINE void *
 XUNTAG (Lisp_Object a, int type)
@@ -1533,7 +1557,16 @@ aref_addr (Lisp_Object array, ptrdiff_t idx)
 INLINE ptrdiff_t
 ASIZE (Lisp_Object array)
 {
-  return XVECTOR (array)->header.size;
+  ptrdiff_t size = XVECTOR (array)->header.size;
+  eassume (0 <= size);
+  return size;
+}
+
+INLINE ptrdiff_t
+gc_asize (Lisp_Object array)
+{
+  /* Like ASIZE, but also can be used in the garbage collector.  */
+  return XVECTOR (array)->header.size & ~ARRAY_MARK_FLAG;
 }
 
 INLINE void
@@ -1548,7 +1581,7 @@ gc_aset (Lisp_Object array, ptrdiff_t idx, Lisp_Object 
val)
 {
   /* Like ASET, but also can be used in the garbage collector:
      sweep_weak_table calls set_hash_key etc. while the table is marked.  */
-  eassert (0 <= idx && idx < (ASIZE (array) & ~ARRAY_MARK_FLAG));
+  eassert (0 <= idx && idx < gc_asize (array));
   XVECTOR (array)->contents[idx] = val;
 }
 
@@ -1930,21 +1963,22 @@ struct Lisp_Hash_Table
 };
 
 
+INLINE bool
+HASH_TABLE_P (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_HASH_TABLE);
+}
+
 INLINE struct Lisp_Hash_Table *
 XHASH_TABLE (Lisp_Object a)
 {
+  eassert (HASH_TABLE_P (a));
   return XUNTAG (a, Lisp_Vectorlike);
 }
 
 #define XSET_HASH_TABLE(VAR, PTR) \
      (XSETPSEUDOVECTOR (VAR, PTR, PVEC_HASH_TABLE))
 
-INLINE bool
-HASH_TABLE_P (Lisp_Object a)
-{
-  return PSEUDOVECTORP (a, PVEC_HASH_TABLE);
-}
-
 /* Value is the key part of entry IDX in hash table H.  */
 INLINE Lisp_Object
 HASH_KEY (struct Lisp_Hash_Table *h, ptrdiff_t idx)
@@ -2236,6 +2270,18 @@ XSAVE_OBJECT (Lisp_Object obj, int n)
   return XSAVE_VALUE (obj)->data[n].object;
 }
 
+#ifdef HAVE_MODULES
+struct Lisp_User_Ptr
+{
+  ENUM_BF (Lisp_Misc_Type) type : 16;       /* = Lisp_Misc_User_Ptr */
+  bool_bf gcmarkbit : 1;
+  unsigned spacer : 15;
+
+  void (*finalizer) (void *);
+  void *p;
+};
+#endif
+
 /* A finalizer sentinel.  */
 struct Lisp_Finalizer
   {
@@ -2271,6 +2317,9 @@ union Lisp_Misc
     struct Lisp_Overlay u_overlay;
     struct Lisp_Save_Value u_save_value;
     struct Lisp_Finalizer u_finalizer;
+#ifdef HAVE_MODULES
+    struct Lisp_User_Ptr u_user_ptr;
+#endif
   };
 
 INLINE union Lisp_Misc *
@@ -2320,6 +2369,15 @@ XFINALIZER (Lisp_Object a)
   return & XMISC (a)->u_finalizer;
 }
 
+#ifdef HAVE_MODULES
+INLINE struct Lisp_User_Ptr *
+XUSER_PTR (Lisp_Object a)
+{
+  eassert (USER_PTRP (a));
+  return & XMISC (a)->u_user_ptr;
+}
+#endif
+
 
 /* Forwarding pointer to an int variable.
    This is allowed only in the value cell of a symbol,
@@ -2604,6 +2662,14 @@ FINALIZERP (Lisp_Object x)
   return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Finalizer;
 }
 
+#ifdef HAVE_MODULES
+INLINE bool
+USER_PTRP (Lisp_Object x)
+{
+  return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_User_Ptr;
+}
+#endif
+
 INLINE bool
 AUTOLOADP (Lisp_Object x)
 {
@@ -3110,7 +3176,9 @@ SPECPDL_INDEX (void)
    A call like (throw TAG VAL) searches for a catchtag whose `tag_or_ch'
    member is TAG, and then unbinds to it.  The `val' member is used to
    hold VAL while the stack is unwound; `val' is returned as the value
-   of the catch form.
+   of the catch form.  If there is a handler of type CATCHER_ALL, it will
+   be treated as a handler for all invocations of `throw'; in this case
+   `val' will be set to (TAG . VAL).
 
    All the other members are concerned with restoring the interpreter
    state.
@@ -3118,7 +3186,7 @@ SPECPDL_INDEX (void)
    Members are volatile if their values need to survive _longjmp when
    a 'struct handler' is a local variable.  */
 
-enum handlertype { CATCHER, CONDITION_CASE };
+enum handlertype { CATCHER, CONDITION_CASE, CATCHER_ALL };
 
 struct handler
 {
@@ -3146,28 +3214,6 @@ struct handler
   struct byte_stack *byte_stack;
 };
 
-/* Fill in the components of c, and put it on the list.  */
-#define PUSH_HANDLER(c, tag_ch_val, handlertype)       \
-  if (handlerlist->nextfree)                           \
-    (c) = handlerlist->nextfree;                       \
-  else                                                 \
-    {                                                  \
-      (c) = xmalloc (sizeof (struct handler));         \
-      (c)->nextfree = NULL;                            \
-      handlerlist->nextfree = (c);                     \
-    }                                                  \
-  (c)->type = (handlertype);                           \
-  (c)->tag_or_ch = (tag_ch_val);                       \
-  (c)->val = Qnil;                                     \
-  (c)->next = handlerlist;                             \
-  (c)->lisp_eval_depth = lisp_eval_depth;              \
-  (c)->pdlcount = SPECPDL_INDEX ();                    \
-  (c)->poll_suppress_count = poll_suppress_count;      \
-  (c)->interrupt_input_blocked = interrupt_input_blocked;\
-  (c)->byte_stack = byte_stack_list;                   \
-  handlerlist = (c);
-
-
 extern Lisp_Object memory_signal_data;
 
 /* An address near the bottom of the stack.
@@ -3413,7 +3459,8 @@ Lisp_Object make_hash_table (struct hash_table_test, 
Lisp_Object, Lisp_Object,
 ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, EMACS_UINT *);
 ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object,
                    EMACS_UINT);
-extern struct hash_table_test hashtest_eql, hashtest_equal;
+void hash_remove_from_table (struct Lisp_Hash_Table *, Lisp_Object);
+extern struct hash_table_test hashtest_eq, hashtest_eql, hashtest_equal;
 extern void validate_subarray (Lisp_Object, Lisp_Object, Lisp_Object,
                               ptrdiff_t, ptrdiff_t *, ptrdiff_t *);
 extern Lisp_Object substring_both (Lisp_Object, ptrdiff_t, ptrdiff_t,
@@ -3809,7 +3856,6 @@ intern_c_string (const char *str)
 }
 
 /* Defined in eval.c.  */
-extern EMACS_INT lisp_eval_depth;
 extern Lisp_Object Vautoload_queue;
 extern Lisp_Object Vrun_hooks;
 extern Lisp_Object Vsignaling_function;
@@ -3853,6 +3899,8 @@ extern Lisp_Object internal_condition_case_2 (Lisp_Object 
(*) (Lisp_Object, Lisp
 extern Lisp_Object internal_condition_case_n
     (Lisp_Object (*) (ptrdiff_t, Lisp_Object *), ptrdiff_t, Lisp_Object *,
      Lisp_Object, Lisp_Object (*) (Lisp_Object, ptrdiff_t, Lisp_Object *));
+extern struct handler *push_handler (Lisp_Object, enum handlertype);
+extern struct handler *push_handler_nosignal (Lisp_Object, enum handlertype);
 extern void specbind (Lisp_Object, Lisp_Object);
 extern void record_unwind_protect (void (*) (Lisp_Object), Lisp_Object);
 extern void record_unwind_protect_ptr (void (*) (void *), void *);
@@ -3883,6 +3931,14 @@ Lisp_Object backtrace_top_function (void);
 extern bool let_shadows_buffer_binding_p (struct Lisp_Symbol *symbol);
 extern bool let_shadows_global_binding_p (Lisp_Object symbol);
 
+#ifdef HAVE_MODULES
+/* Defined in alloc.c.  */
+extern Lisp_Object make_user_ptr (void (*finalizer) (void*), void *p);
+
+/* Defined in emacs-module.c.  */
+extern void module_init (void);
+extern void syms_of_module (void);
+#endif
 
 /* Defined in editfns.c.  */
 extern void insert1 (Lisp_Object);
diff --git a/src/lread.c b/src/lread.c
index c4456f3..74a5fdf 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -975,9 +975,20 @@ This uses the variables `load-suffixes' and 
`load-file-rep-suffixes'.  */)
   return Fnreverse (lst);
 }
 
+/* Returns true if STRING ends with SUFFIX */
+static bool
+suffix_p (Lisp_Object string, const char *suffix)
+{
+  ptrdiff_t suffix_len = strlen (suffix);
+  ptrdiff_t string_len = SBYTES (string);
+
+  return string_len >= suffix_len && !strcmp (SSDATA (string) + string_len - 
suffix_len, suffix);
+}
+
 DEFUN ("load", Fload, Sload, 1, 5, 0,
        doc: /* Execute a file of Lisp code named FILE.
-First try FILE with `.elc' appended, then try with `.el',
+First try FILE with `.elc' appended, then try with `.el', then try
+with a system-dependent suffix of dynamic modules (see `load-suffixes'),
 then try FILE unmodified (the exact suffixes in the exact order are
 determined by `load-suffixes').  Environment variable references in
 FILE are replaced with their values by calling `substitute-in-file-name'.
@@ -989,10 +1000,10 @@ Print messages at start and end of loading unless
 optional third arg NOMESSAGE is non-nil (but `force-load-messages'
 overrides that).
 If optional fourth arg NOSUFFIX is non-nil, don't try adding
-suffixes `.elc' or `.el' to the specified name FILE.
+suffixes to the specified name FILE.
 If optional fifth arg MUST-SUFFIX is non-nil, insist on
-the suffix `.elc' or `.el'; don't accept just FILE unless
-it ends in one of those suffixes or includes a directory name.
+the suffix `.elc' or `.el' or the module suffix; don't accept just
+FILE unless it ends in one of those suffixes or includes a directory name.
 
 If NOSUFFIX is nil, then if a file could not be found, try looking for
 a different representation of the file by adding non-empty suffixes to
@@ -1074,12 +1085,12 @@ Return t if the file exists and loads successfully.  */)
       if (! NILP (must_suffix))
        {
          /* Don't insist on adding a suffix if FILE already ends with one.  */
-         ptrdiff_t size = SBYTES (file);
-         if (size > 3
-             && !strcmp (SSDATA (file) + size - 3, ".el"))
-           must_suffix = Qnil;
-         else if (size > 4
-                  && !strcmp (SSDATA (file) + size - 4, ".elc"))
+         if (suffix_p (file, ".el")
+             || suffix_p (file, ".elc")
+#ifdef HAVE_MODULES
+             || suffix_p (file, MODULES_SUFFIX)
+#endif
+             )
            must_suffix = Qnil;
          /* Don't insist on adding a suffix
             if the argument includes a directory name.  */
@@ -1151,6 +1162,11 @@ Return t if the file exists and loads successfully.  */)
       record_unwind_protect_int (close_file_unwind, fd);
     }
 
+#ifdef HAVE_MODULES
+  if (suffix_p (found, MODULES_SUFFIX))
+    return unbind_to (count, Fmodule_load (found));
+#endif
+
   /* Check if we're stuck in a recursive load cycle.
 
      2000-09-21: It's not possible to just check for the file loaded
@@ -1189,8 +1205,7 @@ Return t if the file exists and loads successfully.  */)
   specbind (Qold_style_backquotes, Qnil);
   record_unwind_protect (load_warn_old_style_backquotes, file);
 
-  if (!memcmp (SDATA (found) + SBYTES (found) - 4, ".elc", 4)
-      || (fd >= 0 && (version = safe_to_load_version (fd)) > 0))
+  if (suffix_p (found, ".elc") || (fd >= 0 && (version = safe_to_load_version 
(fd)) > 0))
     /* Load .elc files directly, but not when they are
        remote and have no handler!  */
     {
@@ -1926,17 +1941,22 @@ readevalloop (Lisp_Object readcharfun,
 }
 
 DEFUN ("eval-buffer", Feval_buffer, Seval_buffer, 0, 5, "",
-       doc: /* Execute the current buffer as Lisp code.
+       doc: /* Execute the accessible portion of current buffer as Lisp code.
+You can use \\[narrow-to-region] to limit the part of buffer to be evaluated.
 When called from a Lisp program (i.e., not interactively), this
 function accepts up to five optional arguments:
-BUFFER is the buffer to evaluate (nil means use current buffer).
-PRINTFLAG controls printing of output:
- A value of nil means discard it; anything else is stream for print.
+BUFFER is the buffer to evaluate (nil means use current buffer),
+ or a name of a buffer (a string).
+PRINTFLAG controls printing of output by any output functions in the
+ evaluated code, such as `print', `princ', and `prin1':
+  a value of nil means discard it; anything else is the stream to print to.
+  See Info node `(elisp)Output Streams' for details on streams.
 FILENAME specifies the file name to use for `load-history'.
 UNIBYTE, if non-nil, specifies `load-convert-to-unibyte' for this
  invocation.
-DO-ALLOW-PRINT, if non-nil, specifies that `print' and related
- functions should work normally even if PRINTFLAG is nil.
+DO-ALLOW-PRINT, if non-nil, specifies that output functions in the
+ evaluated code should work normally even if PRINTFLAG is nil, in
+ which case the output is displayed in the echo area.
 
 This function preserves the position of point.  */)
   (Lisp_Object buffer, Lisp_Object printflag, Lisp_Object filename, 
Lisp_Object unibyte, Lisp_Object do_allow_print)
@@ -1977,7 +1997,8 @@ When called from programs, expects two arguments,
 giving starting and ending indices in the current buffer
 of the text to be executed.
 Programs can pass third argument PRINTFLAG which controls output:
-A value of nil means discard it; anything else is stream for printing it.
+ a value of nil means discard it; anything else is stream for printing it.
+ See Info node `(elisp)Output Streams' for details on streams.
 Also the fourth argument READ-FUNCTION, if non-nil, is used
 instead of `read' to read each expression.  It gets one argument
 which is the input stream for reading characters.
@@ -3926,10 +3947,8 @@ oblookup (Lisp_Object obarray, register const char *ptr, 
ptrdiff_t size, ptrdiff
   Lisp_Object bucket, tem;
 
   obarray = check_obarray (obarray);
-  obsize = ASIZE (obarray);
-
   /* This is sometimes needed in the middle of GC.  */
-  obsize &= ~ARRAY_MARK_FLAG;
+  obsize = gc_asize (obarray);
   hash = hash_string (ptr, size_byte) % obsize;
   bucket = AREF (obarray, hash);
   oblookup_last_bucket_number = hash;
@@ -4334,7 +4353,7 @@ init_lread (void)
           load_path_check (default_lpath);
 
           /* Add the site-lisp directories to the front of the default.  */
-          if (!no_site_lisp)
+          if (!no_site_lisp && PATH_SITELOADSEARCH[0] != '\0')
             {
               Lisp_Object sitelisp;
               sitelisp = decode_env_path (0, PATH_SITELOADSEARCH, 0);
@@ -4365,7 +4384,7 @@ init_lread (void)
       load_path_check (Vload_path);
 
       /* Add the site-lisp directories at the front.  */
-      if (initialized && !no_site_lisp)
+      if (initialized && !no_site_lisp && PATH_SITELOADSEARCH[0] != '\0')
         {
           Lisp_Object sitelisp;
           sitelisp = decode_env_path (0, PATH_SITELOADSEARCH, 0);
@@ -4436,7 +4455,7 @@ to find all the symbols in an obarray, use `mapatoms'.  
*/);
 
   DEFVAR_LISP ("values", Vvalues,
               doc: /* List of values of all expressions which were read, 
evaluated and printed.
-                      Order is reverse chronological.  */);
+Order is reverse chronological.  */);
   XSYMBOL (intern ("values"))->declared_special = 0;
 
   DEFVAR_LISP ("standard-input", Vstandard_input,
@@ -4487,12 +4506,26 @@ programs that process this list should tolerate 
directories both with
 and without trailing slashes.  */);
 
   DEFVAR_LISP ("load-suffixes", Vload_suffixes,
-              doc: /* List of suffixes for (compiled or source) Emacs Lisp 
files.
+              doc: /* List of suffixes for Emacs Lisp files and dynamic 
modules.
+This list includes suffixes for both compiled and source Emacs Lisp files.
 This list should not include the empty string.
 `load' and related functions try to append these suffixes, in order,
-to the specified file name if a Lisp suffix is allowed or required.  */);
+to the specified file name if a suffix is allowed or required.  */);
+#ifdef HAVE_MODULES
+  Vload_suffixes = list3 (build_pure_c_string (".elc"),
+                         build_pure_c_string (".el"),
+                         build_pure_c_string (MODULES_SUFFIX));
+#else
   Vload_suffixes = list2 (build_pure_c_string (".elc"),
                          build_pure_c_string (".el"));
+#endif
+  DEFVAR_LISP ("module-file-suffix", Vmodule_file_suffix,
+              doc: /* Suffix of loadable module file, or nil of modules are 
not supported.  */);
+#ifdef HAVE_MODULES
+  Vmodule_file_suffix = build_pure_c_string (MODULES_SUFFIX);
+#else
+  Vmodule_file_suffix = Qnil;
+#endif
   DEFVAR_LISP ("load-file-rep-suffixes", Vload_file_rep_suffixes,
               doc: /* List of suffixes that indicate representations of \
 the same file.
diff --git a/src/macfont.m b/src/macfont.m
index fae284f..3023fbe 100644
--- a/src/macfont.m
+++ b/src/macfont.m
@@ -771,7 +771,7 @@ mac_font_descriptor_get_adjusted_weight 
(CTFontDescriptorRef desc, CGFloat val)
 {
   long percent_val = lround (val * 100);
 
-  if (percent_val == -40 || percent_val == 56)
+  if (percent_val == -40)
     {
       CTFontRef font = NULL;
       CFStringRef name =
@@ -786,19 +786,10 @@ mac_font_descriptor_get_adjusted_weight 
(CTFontDescriptorRef desc, CGFloat val)
        {
          CFIndex weight = mac_font_get_weight (font);
 
-         if (percent_val == -40)
-           {
-             /* Workaround for crash when displaying Oriya characters
-                with Arial Unicode MS on OS X 10.11.  */
-             if (weight == 5)
-               val = 0;
-           }
-         else                  /* percent_val == 56 */
-           {
-             if (weight == 9)
-               /* Adjustment for HiraginoSans-W7 on OS X 10.11.  */
-               val = 0.4;
-           }
+         /* Workaround for crash when displaying Oriya characters
+            with Arial Unicode MS on OS X 10.11.  */
+         if (weight == 5)
+           val = 0;
          CFRelease (font);
        }
     }
diff --git a/src/nsfns.m b/src/nsfns.m
index c243444..5fa68c0 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -405,10 +405,12 @@ ns_set_name_internal (struct frame *f, Lisp_Object name)
   NSString *str;
   NSView *view = FRAME_NS_VIEW (f);
 
+
   encoded_name = ENCODE_UTF_8 (name);
 
   str = [NSString stringWithUTF8String: SSDATA (encoded_name)];
 
+
   /* Don't change the name if it's already NAME.  */
   if (! [[[view window] title] isEqualToString: str])
     [[view window] setTitle: str];
@@ -483,9 +485,14 @@ x_implicitly_set_name (struct frame *f, Lisp_Object arg, 
Lisp_Object oldval)
 {
   NSTRACE ("x_implicitly_set_name");
 
+  Lisp_Object frame_title = buffer_local_value
+    (Qframe_title_format, XWINDOW (f->selected_window)->contents);
+  Lisp_Object icon_title = buffer_local_value
+    (Qicon_title_format, XWINDOW (f->selected_window)->contents);
+
   /* Deal with NS specific format t.  */
-  if (FRAME_NS_P (f) && ((FRAME_ICONIFIED_P (f) && EQ (Vicon_title_format, Qt))
-                         || EQ (Vframe_title_format, Qt)))
+  if (FRAME_NS_P (f) && ((FRAME_ICONIFIED_P (f) && EQ (icon_title, Qt))
+                         || EQ (frame_title, Qt)))
     ns_set_name_as_filename (f);
   else
     ns_set_name (f, arg, 0);
@@ -648,8 +655,15 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object value, 
Lisp_Object oldval)
 void
 x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
 {
+  /* Currently, when the tool bar change state, the frame is resized.
+
+     TODO: It would be better if this didn't occur when 1) the frame
+     is full height or maximized or 2) when specified by
+     `frame-inhibit-implied-resize'. */
   int nlines;
 
+  NSTRACE ("x_set_tool_bar_lines");
+
   if (FRAME_MINIBUF_ONLY_P (f))
     return;
 
@@ -669,7 +683,21 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, 
Lisp_Object oldval)
         {
           free_frame_tool_bar (f);
           FRAME_EXTERNAL_TOOL_BAR (f) = 0;
-        }
+
+          {
+            EmacsView *view = FRAME_NS_VIEW (f);
+            int fs_state = [view fullscreenState];
+
+            if (fs_state == FULLSCREEN_MAXIMIZED)
+              {
+                [view setFSValue:FULLSCREEN_WIDTH];
+              }
+            else if (fs_state == FULLSCREEN_HEIGHT)
+              {
+                [view setFSValue:FULLSCREEN_NONE];
+              }
+          }
+       }
     }
 
   {
@@ -680,12 +708,12 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, 
Lisp_Object oldval)
              || (CONSP (frame_inhibit_implied_resize)
                  && !NILP (Fmemq (Qtool_bar_lines,
                                   frame_inhibit_implied_resize))))
-         /* This will probably fail to DTRT in the
-            fullheight/-width cases.  */
          && NILP (get_frame_param (f, Qfullscreen)))
         ? 0
         : 2);
 
+    NSTRACE_MSG ("inhibit:%d", inhibit);
+
     frame_size_history_add (f, Qupdate_frame_tool_bar, 0, 0, Qnil);
     adjust_frame_size (f, -1, -1, inhibit, 0, Qtool_bar_lines);
   }
@@ -2071,39 +2099,6 @@ there was no result.  */)
 }
 
 
-DEFUN ("ns-convert-utf8-nfd-to-nfc", Fns_convert_utf8_nfd_to_nfc,
-       Sns_convert_utf8_nfd_to_nfc, 1, 1, 0,
-       doc: /* Return an NFC string that matches the UTF-8 NFD string STR.  */)
-     (Lisp_Object str)
-{
-/* TODO: If GNUstep ever implements precomposedStringWithCanonicalMapping,
-         remove this. */
-  NSString *utfStr;
-  Lisp_Object ret = Qnil;
-  NSAutoreleasePool *pool;
-
-  CHECK_STRING (str);
-  pool = [[NSAutoreleasePool alloc] init];
-  utfStr = [NSString stringWithUTF8String: SSDATA (str)];
-#ifdef NS_IMPL_COCOA
-  if (utfStr)
-    utfStr = [utfStr precomposedStringWithCanonicalMapping];
-#endif
-  if (utfStr)
-    {
-      const char *cstr = [utfStr UTF8String];
-      if (cstr)
-        ret = build_string (cstr);
-    }
-
-  [pool release];
-  if (NILP (ret))
-    error ("Invalid UTF-8");
-
-  return ret;
-}
-
-
 #ifdef NS_IMPL_COCOA
 
 /* Compile and execute the AppleScript SCRIPT and return the error
@@ -3113,6 +3108,8 @@ void
 syms_of_nsfns (void)
 {
   DEFSYM (Qfontsize, "fontsize");
+  DEFSYM (Qframe_title_format, "frame-title-format");
+  DEFSYM (Qicon_title_format, "icon-title-format");
 
   DEFVAR_LISP ("ns-icon-type-alist", Vns_icon_type_alist,
                doc: /* Alist of elements (REGEXP . IMAGE) for images of icons 
associated to frames.
@@ -3177,7 +3174,6 @@ be used as the image of the icon representing the frame.  
*/);
   defsubr (&Sns_emacs_info_panel);
   defsubr (&Sns_list_services);
   defsubr (&Sns_perform_service);
-  defsubr (&Sns_convert_utf8_nfd_to_nfc);
   defsubr (&Sns_popup_font_panel);
   defsubr (&Sns_popup_color_panel);
 
diff --git a/src/nsimage.m b/src/nsimage.m
index bdaf6a4..fad2538 100644
--- a/src/nsimage.m
+++ b/src/nsimage.m
@@ -66,7 +66,7 @@ ns_image_for_XPM (int width, int height, int depth)
 void *
 ns_image_from_file (Lisp_Object file)
 {
-  NSTRACE ("ns_image_from_bitmap_file");
+  NSTRACE ("ns_image_from_file");
   return [EmacsImage allocInitFromFile: file];
 }
 
diff --git a/src/nsmenu.m b/src/nsmenu.m
index ddc5dc2..3cb61e5 100644
--- a/src/nsmenu.m
+++ b/src/nsmenu.m
@@ -1293,6 +1293,14 @@ update_frame_tool_bar (struct frame *f)
   //return [identifierToItem allKeys];
 }
 
+- (void)setVisible:(BOOL)shown
+{
+  NSTRACE ("[EmacsToolbar setVisible:%d]", shown);
+
+  [super setVisible:shown];
+}
+
+
 /* optional and unneeded */
 /* - toolbarWillAddItem: (NSNotification *)notification { } */
 /* - toolbarDidRemoveItem: (NSNotification *)notification { } */
diff --git a/src/nsterm.h b/src/nsterm.h
index 1b330f0..7e6e8ef 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -67,12 +67,27 @@ typedef float EmacsCGFloat;
 
 /* Uncomment the following line to enable trace.
 
+   Uncomment suitable NSTRACE_GROUP_xxx lines to trace more.
+
    Hint: keep the trailing whitespace -- the version control system
    will reject accidental commits. */
 
 /* #define NSTRACE_ENABLED 1          */
 
 
+/* When non-zero, trace output is enabled for all parts, except those
+   explicitly disabled. */
+/* #define NSTRACE_ALL_GROUPS     1     */
+
+/* When non-zero, trace output is enabled in the corresponding part. */
+/* #define NSTRACE_GROUP_EVENTS  1     */
+/* #define NSTRACE_GROUP_UPDATES 1     */
+/* #define NSTRACE_GROUP_FRINGE  1     */
+/* #define NSTRACE_GROUP_COLOR   1     */
+/* #define NSTRACE_GROUP_GLYPHS  1     */
+/* #define NSTRACE_GROUP_FOCUS   1     */
+
+
 /* Print a call tree containing all annotated functions.
 
    The call structure of the functions is represented using
@@ -87,60 +102,94 @@ typedef float EmacsCGFloat;
    The first column contains the file name, the second the line
    number, and the third a number increasing for each trace line.
 
+   Note, when trace output from several threads are mixed, the output
+   can become misaligned, as all threads (currently) share one state.
+   This is post prominent when the EVENTS part is enabled.
+
    Note that the trace system, when enabled, use the GCC/Clang
-   "cleanup" extension.
-
-   For example (long lines manually split to reduce width):
-
-nsterm.m  : 1600: [ 4428]  ns_fullscreen_hook
-nsterm.m  : 7006: [ 4429]  | handleFS
-nsterm.m  : 7035: [ 4430]  | +--- FULLSCREEN_MAXIMIZED
-nsterm.m  : 7627: [ 4431]  | | performZoom
-nsterm.m  : 7636: [ 4432]  | | | zoom
-nsterm.m  :  874: [ 4433]  | | | | ns_update_auto_hide_menu_bar
-nsterm.m  : 6615: [ 4434]  | | | | [windowWillUseStandardFrame:
-                                       defaultFrame:(X:0 Y:0)/(W:1600 H:1177)]
-nsterm.m  :   99: [ 4435]  | | | | +--- fs_state: FULLSCREEN_NONE
-nsterm.m  :  119: [ 4436]  | | | | +--- fs_before_fs: -1
-nsterm.m  :  115: [ 4437]  | | | | +--- next_maximized: FULLSCREEN_MAXIMIZED
-nsterm.m  : 6619: [ 4438]  | | | | +--- ns_userRect: (X:0 Y:0)/(W:0 H:0)
-nsterm.m  : 6620: [ 4439]  | | | | +--- [sender frame]:
-                                                      (X:0 Y:626)/(W:595 H:551)
-nsterm.m  : 6644: [ 4440]  | | | | +--- ns_userRect (2):
-                                                      (X:0 Y:626)/(W:595 H:551)
-nsterm.m  : 6684: [ 4441]  | | | | +--- FULLSCREEN_MAXIMIZED
-nsterm.m  : 7057: [ 4442]  | | | | | setFSValue
-nsterm.m  :  115: [ 4443]  | | | | | +--- value: FULLSCREEN_MAXIMIZED
-nsterm.m  : 6711: [ 4444]  | | | | +--- Final ns_userRect:
-                                                      (X:0 Y:626)/(W:595 H:551)
-nsterm.m  : 6712: [ 4445]  | | | | +--- Final maximized_width: 1600
-nsterm.m  : 6713: [ 4446]  | | | | +--- Final maximized_height: 1177
-nsterm.m  :  119: [ 4447]  | | | | +--- Final next_maximized: -1
-nsterm.m  : 6209: [ 4448]  | | | | | windowWillResize: toSize: (W:1600 H:1177)
-nsterm.m  : 6210: [ 4449]  | | | | | +--- [sender frame]:
-                                                      (X:0 Y:626)/(W:595 H:551)
-nsterm.m  :  115: [ 4450]  | | | | | +--- fs_state: FULLSCREEN_MAXIMIZED
-nsterm.m  : 6274: [ 4451]  | | | | | +--- cols: 223  rows: 79
-nsterm.m  : 6299: [ 4452]  | | | | | +->> (W:1596 H:1167)
-nsterm.m  : 6718: [ 4453]  | | | | +->> (X:0 Y:0)/(W:1600 H:1177)
-
-   Here, "ns_fullscreen_hook" calls "handleFS", which is turn calls
-   "performZoom".  This function calls "[super performZoom]", which
-   isn't annotated (so it doesn't show up in the trace).  However, it
-   calls "zoom" which is annotated so it is part of the call trace.
-   Later, the method "windowWillUseStandardFrame" and the function
-   "setFSValue" are called.  The lines with "+---" contain extra
-   information and lines containing "->>" represent return values. */
+   "cleanup" extension. */
+
+/*   For example, the following is the output of `M-x
+     toggle-frame-maximized RET'.
+
+     (Long lines manually split to reduced width):
+
+nsterm.m  : 1608: [  354]  ns_fullscreen_hook
+nsterm.m  : 7180: [  355]  | [EmacsView handleFS]
+nsterm.m  : 7209: [  356]  | +--- FULLSCREEN_MAXIMIZED
+nsterm.m  : 7706: [  357]  | | [EmacsWindow performZoom:]
+nsterm.m  : 7715: [  358]  | | | [EmacsWindow zoom:]
+nsterm.m  :  882: [  359]  | | | | ns_update_auto_hide_menu_bar
+nsterm.m  : 6752: [  360]  | | | |
+  [EmacsView windowWillUseStandardFrame:defaultFrame:(X:0 Y:0)/(W:1600 H:1177)]
+nsterm.m  : 6753: [  361]  | | | | +--- fs_state: FULLSCREEN_NONE
+nsterm.m  : 6754: [  362]  | | | | +--- fs_before_fs: -1
+nsterm.m  : 6755: [  363]  | | | | +--- next_maximized: FULLSCREEN_MAXIMIZED
+nsterm.m  : 6756: [  364]  | | | | +--- ns_userRect: (X:0 Y:0)/(W:0 H:0)
+nsterm.m  : 6757: [  365]  | | | | +---
+                                      [sender frame]: (X:0 Y:626)/(W:595 H:551)
+nsterm.m  : 6781: [  366]  | | | | +---
+                                     ns_userRect (2): (X:0 Y:626)/(W:595 H:551)
+nsterm.m  : 6821: [  367]  | | | | +--- FULLSCREEN_MAXIMIZED
+nsterm.m  : 7232: [  368]  | | | | |
+                                    [EmacsView setFSValue:FULLSCREEN_MAXIMIZED]
+nsterm.m  : 6848: [  369]  | | | | +---
+                                   Final ns_userRect: (X:0 Y:626)/(W:595 H:551)
+nsterm.m  : 6849: [  370]  | | | | +--- Final maximized_width: 1600
+nsterm.m  : 6850: [  371]  | | | | +--- Final maximized_height: 1177
+nsterm.m  : 6851: [  372]  | | | | +--- Final next_maximized: -1
+nsterm.m  : 6322: [  373]  | | | | |
+                           [EmacsView windowWillResize:toSize: (W:1600 H:1177)]
+nsterm.m  : 6323: [  374]  | | | | | +---
+                                      [sender frame]: (X:0 Y:626)/(W:595 H:551)
+nsterm.m  : 6324: [  375]  | | | | | +--- fs_state: FULLSCREEN_MAXIMIZED
+nsterm.m  : 7027: [  376]  | | | | | | [EmacsView isFullscreen]
+nsterm.m  : 6387: [  377]  | | | | | +--- cols: 223  rows: 79
+nsterm.m  : 6412: [  378]  | | | | | +->> (W:1596 H:1167)
+nsterm.m  : 6855: [  379]  | | | | +->> (X:0 Y:0)/(W:1600 H:1177)
+*/
 
 #ifndef NSTRACE_ENABLED
 #define NSTRACE_ENABLED 0
 #endif
 
 #if NSTRACE_ENABLED
-extern int nstrace_num;
-extern int nstrace_depth;
+
+#ifndef NSTRACE_ALL_GROUPS
+#define NSTRACE_ALL_GROUPS 0
+#endif
+
+#ifndef NSTRACE_GROUP_EVENTS
+#define NSTRACE_GROUP_EVENTS NSTRACE_ALL_GROUPS
+#endif
+
+#ifndef NSTRACE_GROUP_UPDATES
+#define NSTRACE_GROUP_UPDATES NSTRACE_ALL_GROUPS
+#endif
+
+#ifndef NSTRACE_GROUP_FRINGE
+#define NSTRACE_GROUP_FRINGE NSTRACE_ALL_GROUPS
+#endif
+
+#ifndef NSTRACE_GROUP_COLOR
+#define NSTRACE_GROUP_COLOR NSTRACE_ALL_GROUPS
+#endif
+
+#ifndef NSTRACE_GROUP_GLYPHS
+#define NSTRACE_GROUP_GLYPHS NSTRACE_ALL_GROUPS
+#endif
+
+#ifndef NSTRACE_GROUP_FOCUS
+#define NSTRACE_GROUP_FOCUS NSTRACE_ALL_GROUPS
+#endif
+
+extern volatile int nstrace_num;
+extern volatile int nstrace_depth;
+extern volatile int nstrace_enabled_global;
 
 void nstrace_leave(int *);
+void nstrace_restore_global_trace_state(int *);
+char const * nstrace_fullscreen_type_name (int);
 
 /* printf-style trace output.  Output is aligned with contained heading. */
 #define NSTRACE_MSG_NO_DASHES(...)                                          \
@@ -149,7 +198,7 @@ void nstrace_leave(int *);
       if (nstrace_enabled)                                                  \
         {                                                                   \
           fprintf (stderr, "%-10s:%5d: [%5d]%.*s",                          \
-                   __FILE__, __LINE__, ++nstrace_num,                       \
+                   __FILE__, __LINE__, nstrace_num++,                       \
                    2*nstrace_depth, "  | | | | | | | | | | | | | | | ..");  \
           fprintf (stderr, __VA_ARGS__);                                    \
           fprintf (stderr, "\n");                                           \
@@ -176,6 +225,9 @@ void nstrace_leave(int *);
 #define NSTRACE_ARG_RECT(elt)   \
   NSTRACE_ARG_POINT((elt).origin), NSTRACE_ARG_SIZE((elt).size)
 
+#define NSTRACE_FMT_FSTYPE      "%s"
+#define NSTRACE_ARG_FSTYPE(elt) nstrace_fullscreen_type_name(elt)
+
 
 /* Macros for printing complex types as extra information. */
 
@@ -192,14 +244,8 @@ void nstrace_leave(int *);
                NSTRACE_ARG_RECT (rect));
 
 #define NSTRACE_FSTYPE(str,fs_type)                                     \
-  do                                                                    \
-    {                                                                   \
-      if (nstrace_enabled)                                              \
-        {                                                               \
-          ns_print_fullscreen_type_name(str, fs_type);                  \
-        }                                                               \
-    }                                                                   \
-  while(0)
+  NSTRACE_MSG (str ": " NSTRACE_FMT_FSTYPE,                             \
+               NSTRACE_ARG_FSTYPE (fs_type));
 
 
 /* Return value macros.
@@ -242,17 +288,25 @@ void nstrace_leave(int *);
 
 
 #define NSTRACE_WHEN(cond, ...)                                         \
+  __attribute__((cleanup(nstrace_restore_global_trace_state)))          \
+  int nstrace_saved_enabled_global = nstrace_enabled_global;            \
   __attribute__((cleanup(nstrace_leave)))                               \
-  int nstrace_enabled = (cond);                                         \
+  int nstrace_enabled = nstrace_enabled_global && (cond);               \
   if (nstrace_enabled) { ++nstrace_depth; }                             \
+  else { nstrace_enabled_global = 0; }                                  \
   NSTRACE_MSG_NO_DASHES(__VA_ARGS__);
 
+/* Unsilence called functions.
+
+   Concretely, this us used to allow "event" functions to be silenced
+   while trace output can be printed for functions they call. */
+#define NSTRACE_UNSILENCE() do { nstrace_enabled_global = 1; } while(0)
+
 #endif /* NSTRACE_ENABLED */
 
 #define NSTRACE(...)              NSTRACE_WHEN(1, __VA_ARGS__)
 #define NSTRACE_UNLESS(cond, ...) NSTRACE_WHEN(!(cond), __VA_ARGS__)
 
-
 /* Non-trace replacement versions. */
 #ifndef NSTRACE_WHEN
 #define NSTRACE_WHEN(...)
@@ -294,6 +348,9 @@ void nstrace_leave(int *);
 #define NSTRACE_RETURN_FSTYPE(fs_type)
 #endif
 
+#ifndef NSTRACE_UNSILENCE
+#define NSTRACE_UNSILENCE()
+#endif
 
 
 /* ==========================================================================
@@ -412,6 +469,13 @@ void nstrace_leave(int *);
 - (void)windowDidMove: (id)sender;
 #endif
 - (int)fullscreenState;
+
+/* Non-notification versions of NSView methods. Used for direct calls. */
+- (void)windowWillEnterFullScreen;
+- (void)windowDidEnterFullScreen;
+- (void)windowWillExitFullScreen;
+- (void)windowDidExitFullScreen;
+- (void)windowDidBecomeKey;
 @end
 
 
diff --git a/src/nsterm.m b/src/nsterm.m
index 5c39d5c..36e08c6 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -72,9 +72,26 @@ GNUstep port and post-20 update by Adrian Robert 
(address@hidden)
 extern NSString *NSMenuDidBeginTrackingNotification;
 
 
+/* ==========================================================================
+
+   NSTRACE, Trace support.
+
+   ========================================================================== 
*/
+
 #if NSTRACE_ENABLED
-int nstrace_num = 0;
-int nstrace_depth = 0;
+
+/* The following use "volatile" since they can be accessed from
+   parallel threads. */
+volatile int nstrace_num = 0;
+volatile int nstrace_depth = 0;
+
+/* When 0, no trace is emitted.  This is used by NSTRACE_WHEN and
+   NSTRACE_UNLESS to silence functions called.
+
+   TODO: This should really be a thread-local variable, to avoid that
+   a function with disabled trace thread silence trace output in
+   another.  However, in practice this seldom is a problem. */
+volatile int nstrace_enabled_global = 1;
 
 /* Called when nstrace_enabled goes out of scope. */
 void nstrace_leave(int * pointer_to_nstrace_enabled)
@@ -86,38 +103,24 @@ void nstrace_leave(int * pointer_to_nstrace_enabled)
 }
 
 
-void ns_print_fullscreen_type_name (char const * s, int fs_type)
+/* Called when nstrace_saved_enabled_global goes out of scope. */
+void nstrace_restore_global_trace_state(int * pointer_to_saved_enabled_global)
 {
-  // This is a support function for the NSTRACE system, don't add a
-  // NSTRACE () here.  However, a local `nstrace_enabled' variable is
-  // needed by the NSTRACE_MSG macros.
-  int nstrace_enabled = 1;
+  nstrace_enabled_global = *pointer_to_saved_enabled_global;
+}
+
 
+char const * nstrace_fullscreen_type_name (int fs_type)
+{
   switch (fs_type)
     {
-    case FULLSCREEN_NONE:
-      NSTRACE_MSG ("%s: FULLSCREEN_NONE", s);
-      break;
-
-    case FULLSCREEN_WIDTH:
-      NSTRACE_MSG ("%s: FULLSCREEN_WIDTH", s);
-      break;
-
-    case FULLSCREEN_HEIGHT:
-      NSTRACE_MSG ("%s: FULLSCREEN_HEIGHT", s);
-      break;
-
-    case FULLSCREEN_BOTH:
-      NSTRACE_MSG ("%s: FULLSCREEN_BOTH", s);
-      break;
-
-    case FULLSCREEN_MAXIMIZED:
-      NSTRACE_MSG ("%s: FULLSCREEN_MAXIMIZED", s);
-      break;
-
-    default:
-      NSTRACE_MSG ("%s: %d", s, fs_type);
-      break;
+    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
@@ -581,28 +584,6 @@ ns_load_path (void)
   return NULL;
 }
 
-static void
-ns_timeout (int usecs)
-/* --------------------------------------------------------------------------
-     Blocking timer utility used by ns_ring_bell
-   -------------------------------------------------------------------------- 
*/
-{
-  struct timespec wakeup = timespec_add (current_timespec (),
-                                        make_timespec (0, usecs * 1000));
-
-  /* Keep waiting until past the time wakeup.  */
-  while (1)
-    {
-      struct timespec timeout, now = current_timespec ();
-      if (timespec_cmp (wakeup, now) <= 0)
-       break;
-      timeout = timespec_sub (wakeup, now);
-
-      /* Try to wait that long--but we might wake up sooner.  */
-      pselect (0, NULL, NULL, NULL, &timeout, NULL);
-    }
-}
-
 
 void
 ns_release_object (void *obj)
@@ -919,7 +900,7 @@ ns_update_begin (struct frame *f)
    -------------------------------------------------------------------------- 
*/
 {
   EmacsView *view = FRAME_NS_VIEW (f);
-  NSTRACE ("ns_update_begin");
+  NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_update_begin");
 
   ns_update_auto_hide_menu_bar ();
 
@@ -976,7 +957,7 @@ ns_update_window_begin (struct window *w)
   struct frame *f = XFRAME (WINDOW_FRAME (w));
   Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
 
-  NSTRACE ("ns_update_window_begin");
+  NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_update_window_begin");
   w->output_cursor = w->cursor;
 
   block_input ();
@@ -1006,7 +987,7 @@ ns_update_window_end (struct window *w, bool cursor_on_p,
    external (RIF) call; for one window called before update_end
    -------------------------------------------------------------------------- 
*/
 {
-  NSTRACE ("update_window_end");
+  NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_update_window_end");
 
   /* note: this fn is nearly identical in all terms */
   if (!w->pseudo_window_p)
@@ -1045,7 +1026,7 @@ ns_update_end (struct frame *f)
 {
   EmacsView *view = FRAME_NS_VIEW (f);
 
-  NSTRACE ("ns_update_end");
+  NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_update_end");
 
 /*   if (f == MOUSE_HL_INFO (f)->mouse_face_mouse_frame) */
   MOUSE_HL_INFO (f)->mouse_face_defer = 0;
@@ -1070,11 +1051,11 @@ ns_focus (struct frame *f, NSRect *r, int n)
      the entire window.
    -------------------------------------------------------------------------- 
*/
 {
-//  NSTRACE ("ns_focus");
-/* static int c =0;
-   fprintf (stderr, "focus: %d", c++);
-   if (r) fprintf (stderr, " (%.0f, %.0f : %.0f x %.0f)", r->origin.x, 
r->origin.y, r->size.width, r->size.height);
-   fprintf (stderr, "\n"); */
+  NSTRACE_WHEN (NSTRACE_GROUP_FOCUS, "ns_focus");
+  if (r != NULL)
+    {
+      NSTRACE_RECT ("r", *r);
+    }
 
   if (f != ns_updating_frame)
     {
@@ -1114,7 +1095,7 @@ ns_unfocus (struct frame *f)
      Internal: Remove focus on given frame
    -------------------------------------------------------------------------- 
*/
 {
-//  NSTRACE ("ns_unfocus");
+  NSTRACE_WHEN (NSTRACE_GROUP_FOCUS, "ns_unfocus");
 
   if (gsaved)
     {
@@ -1158,6 +1139,77 @@ ns_clip_to_row (struct window *w, struct glyph_row *row,
 }
 
 
+/* ==========================================================================
+
+    Visible bell and beep.
+
+   ========================================================================== 
*/
+
+
address@hidden EmacsBell : NSImageView
+{
+  // Number of currently active bell:s.
+  unsigned int nestCount;
+}
+- (void)show:(NSView *)view;
+- (void)hide;
address@hidden
+
address@hidden EmacsBell
+
+- (id)init;
+{
+  if ((self = [super init]))
+    {
+      nestCount = 0;
+      self.image = [NSImage imageNamed:NSImageNameCaution];
+    }
+  return self;
+}
+
+- (void)show:(NSView *)view
+{
+  NSTRACE ("[EmacsBell show:]");
+  NSTRACE_MSG ("nestCount: %u", nestCount);
+
+  // Show the image, unless it's already shown.
+  if (nestCount == 0)
+    {
+      NSRect rect = [view bounds];
+      NSPoint pos;
+      pos.x = rect.origin.x + (rect.size.width  - self.image.size.width )/2;
+      pos.y = rect.origin.y + (rect.size.height - self.image.size.height)/2;
+
+      [self setFrameOrigin:pos];
+      [self setFrameSize:self.image.size];
+
+      [[[view window] contentView] addSubview:self
+                                   positioned:NSWindowAbove
+                                   relativeTo:nil];
+    }
+
+  ++nestCount;
+
+  [self performSelector:@selector(hide) withObject:self afterDelay:0.5];
+}
+
+
+- (void)hide
+{
+  // Note: Trace output from this method isn't shown, reason unknown.
+  // NSTRACE ("[EmacsBell hide]");
+
+  --nestCount;
+
+  // Remove the image once the last bell became inactive.
+  if (nestCount == 0)
+    {
+      [self removeFromSuperview];
+    }
+}
+
address@hidden
+
 static void
 ns_ring_bell (struct frame *f)
 /* --------------------------------------------------------------------------
@@ -1167,37 +1219,24 @@ ns_ring_bell (struct frame *f)
   NSTRACE ("ns_ring_bell");
   if (visible_bell)
     {
-      NSAutoreleasePool *pool;
       struct frame *frame = SELECTED_FRAME ();
       NSView *view;
 
+      static EmacsBell * bell_view = nil;
+      if (bell_view == nil)
+        {
+          bell_view = [[EmacsBell alloc] init];
+          [bell_view retain];
+        }
+
       block_input ();
-      pool = [[NSAutoreleasePool alloc] init];
 
       view = FRAME_NS_VIEW (frame);
       if (view != nil)
         {
-          NSRect r, surr;
-          NSPoint dim = NSMakePoint (128, 128);
-
-          r = [view bounds];
-          r.origin.x += (r.size.width - dim.x) / 2;
-          r.origin.y += (r.size.height - dim.y) / 2;
-          r.size.width = dim.x;
-          r.size.height = dim.y;
-          surr = NSInsetRect (r, -2, -2);
-          ns_focus (frame, &surr, 1);
-          [[view window] cacheImageInRect: [view convertRect: surr 
toView:nil]];
-          [ns_lookup_indexed_color (NS_FACE_FOREGROUND
-                                      (FRAME_DEFAULT_FACE (frame)), frame) 
set];
-          NSRectFill (r);
-          [[view window] flushWindow];
-          ns_timeout (150000);
-          [[view window] restoreCachedImage];
-          [[view window] flushWindow];
-          ns_unfocus (frame);
+          [bell_view show:view];
         }
-      [pool release];
+
       unblock_input ();
     }
   else
@@ -1206,6 +1245,7 @@ ns_ring_bell (struct frame *f)
     }
 }
 
+
 /* ==========================================================================
 
     Frame / window manager related functions
@@ -1220,6 +1260,7 @@ ns_raise_frame (struct frame *f)
    -------------------------------------------------------------------------- 
*/
 {
   NSView *view;
+
   check_window_system (f);
   view = FRAME_NS_VIEW (f);
   block_input ();
@@ -1236,6 +1277,7 @@ ns_lower_frame (struct frame *f)
    -------------------------------------------------------------------------- 
*/
 {
   NSView *view;
+
   check_window_system (f);
   view = FRAME_NS_VIEW (f);
   block_input ();
@@ -1510,8 +1552,8 @@ x_set_window_size (struct frame *f,
     return;
 
   NSTRACE_RECT ("current", wr);
-
-/*fprintf (stderr, "\tsetWindowSize: %d x %d, pixelwise %d, font size %d x 
%d\n", width, height, pixelwise, FRAME_COLUMN_WIDTH (f), FRAME_LINE_HEIGHT 
(f));*/
+  NSTRACE_MSG ("Width:%d Height:%d Pixelwise:%d", width, height, pixelwise);
+  NSTRACE_MSG ("Font %d x %d", FRAME_COLUMN_WIDTH (f), FRAME_LINE_HEIGHT (f));
 
   block_input ();
 
@@ -1571,7 +1613,6 @@ x_set_window_size (struct frame *f,
           make_number (FRAME_NS_TITLEBAR_HEIGHT (f)),
           make_number (FRAME_TOOLBAR_HEIGHT (f))));
 
-  NSTRACE_RECT ("setFrame", wr);
   [window setFrame: wr display: YES];
 
   /* This is a trick to compensate for Emacs' managing the scrollbar area
@@ -1586,7 +1627,7 @@ x_set_window_size (struct frame *f,
       ? NSMakePoint (FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f)
                      - NS_SCROLL_BAR_WIDTH (f), 0)
       : NSMakePoint (0, 0);
-    NSTRACE_RECT ("setFrame", wr);
+
     [view setFrame: NSMakeRect (0, 0, pixelwidth, pixelheight)];
     [view setBoundsOrigin: origin];
   }
@@ -1728,7 +1769,8 @@ ns_get_color (const char *name, NSColor **col)
   float r = -1.0, g, b;
   NSString *nsname = [NSString stringWithUTF8String: name];
 
-/*fprintf (stderr, "ns_get_color: '%s'\n", name); */
+  NSTRACE ("ns_get_color(%s, **)", name);
+
   block_input ();
 
   if ([nsname isEqualToString: @"ns_selection_bg_color"])
@@ -1935,7 +1977,7 @@ ns_defined_color (struct frame *f,
    -------------------------------------------------------------------------- 
*/
 {
   NSColor *col;
-  NSTRACE ("ns_defined_color");
+  NSTRACE_WHEN (NSTRACE_GROUP_COLOR, "ns_defined_color");
 
   block_input ();
   if (ns_get_color (name, &col) != 0) /* Color not found  */
@@ -1961,6 +2003,8 @@ x_set_frame_alpha (struct frame *f)
   double alpha = 1.0;
   double alpha_min = 1.0;
 
+  NSTRACE ("x_set_frame_alpha");
+
   if (dpyinfo->x_highlight_frame == f)
     alpha = f->alpha[0];
   else
@@ -2097,7 +2141,7 @@ ns_mouse_position (struct frame **fp, int insist, 
Lisp_Object *bar_window,
       position = [view convertPoint: position fromView: nil];
       remember_mouse_glyph (f, position.x, position.y,
                             &dpyinfo->last_mouse_glyph);
-/*fprintf (stderr, "ns_mouse_position: %.0f, %.0f\n", position.x, position.y); 
*/
+      NSTRACE_POINT ("position", position);
 
       if (bar_window) *bar_window = Qnil;
       if (part) *part = scroll_bar_above_handle;
@@ -2120,7 +2164,7 @@ ns_frame_up_to_date (struct frame *f)
     Can't use FRAME_MOUSE_UPDATE due to ns_frame_begin and ns_frame_end calls.
    -------------------------------------------------------------------------- 
*/
 {
-  NSTRACE ("ns_frame_up_to_date");
+  NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_frame_up_to_date");
 
   if (FRAME_NS_P (f))
     {
@@ -2231,7 +2275,7 @@ ns_clear_frame (struct frame *f)
   NSView *view = FRAME_NS_VIEW (f);
   NSRect r;
 
-  NSTRACE ("ns_clear_frame");
+  NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_clear_frame");
 
  /* comes on initial frame because we have
     after-make-frame-functions = select-frame */
@@ -2267,7 +2311,7 @@ ns_clear_frame_area (struct frame *f, int x, int y, int 
width, int height)
   if (!view || !face)
     return;
 
-  NSTRACE ("ns_clear_frame_area");
+  NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_clear_frame_area");
 
   r = NSIntersectionRect (r, [view frame]);
   ns_focus (f, &r, 1);
@@ -2360,7 +2404,7 @@ ns_after_update_window_line (struct window *w, struct 
glyph_row *desired_row)
   struct frame *f;
   int width, height;
 
-  NSTRACE ("ns_after_update_window_line");
+  NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_after_update_window_line");
 
   /* begin copy from other terms */
   eassert (w);
@@ -2485,7 +2529,7 @@ ns_draw_fringe_bitmap (struct window *w, struct glyph_row 
*row,
   static EmacsImage **bimgs = NULL;
   static int nBimgs = 0;
 
-  NSTRACE ("ns_draw_fringe_bitmap");
+  NSTRACE_WHEN (NSTRACE_GROUP_FRINGE, "ns_draw_fringe_bitmap");
   NSTRACE_MSG ("which:%d cursor:%d overlay:%d width:%d height:%d period:%d",
                p->which, p->cursor_p, p->overlay_p, p->wd, p->h, p->dh);
 
@@ -2602,7 +2646,7 @@ ns_draw_window_cursor (struct window *w, struct glyph_row 
*glyph_row,
      in mini-buffer windows when switching between echo area glyphs
      and mini-buffer.  */
 
-  NSTRACE ("dumpcursor");
+  NSTRACE ("ns_draw_window_cursor");
 
   if (!on_p)
     return;
@@ -3519,7 +3563,7 @@ ns_draw_glyph_string (struct glyph_string *s)
   struct font *font = s->face->font;
   if (! font) font = FRAME_FONT (s->f);
 
-  NSTRACE ("ns_draw_glyph_string");
+  NSTRACE_WHEN (NSTRACE_GROUP_GLYPHS, "ns_draw_glyph_string");
 
   if (s->next && s->right_overhang && !s->for_overlaps/*&&s->hl!=DRAW_CURSOR*/)
     {
@@ -3677,7 +3721,7 @@ ns_send_appdefined (int value)
               recognize and take as a command to halt the event loop.
    -------------------------------------------------------------------------- 
*/
 {
-  NSTRACE ("ns_send_appdefined");
+  NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "ns_send_appdefined(%d)", value);
 
 #ifdef NS_IMPL_GNUSTEP
   // GNUstep needs postEvent to happen on the main thread.
@@ -3851,7 +3895,7 @@ ns_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
   struct input_event ev;
   int nevents;
 
-/* NSTRACE ("ns_read_socket"); */
+  NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "ns_read_socket");
 
 #ifdef HAVE_NATIVE_FS
   check_native_fs ();
@@ -3935,7 +3979,7 @@ ns_select (int nfds, fd_set *readfds, fd_set *writefds,
   struct input_event event;
   char c;
 
-/*  NSTRACE ("ns_select"); */
+  NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "ns_select");
 
 #ifdef HAVE_NATIVE_FS
   check_native_fs ();
@@ -4905,7 +4949,7 @@ ns_term_shutdown (int sig)
 
 - (void)stop: (id)sender
 {
-  NSTRACE ("[EmacsApp stop]");
+  NSTRACE ("[EmacsApp stop:]");
 
     shouldKeepRunning = NO;
     // Stop possible dialog also.  Noop if no dialog present.
@@ -4916,7 +4960,7 @@ ns_term_shutdown (int sig)
 
 - (void)logNotification: (NSNotification *)notification
 {
-  NSTRACE ("[EmacsApp logNotification]");
+  NSTRACE ("[EmacsApp logNotification:]");
 
   const char *name = [[notification name] UTF8String];
   if (!strstr (name, "Update") && !strstr (name, "NSMenu")
@@ -4934,8 +4978,8 @@ ns_term_shutdown (int sig)
   int type = [theEvent type];
   NSWindow *window = [theEvent window];
 
-  NSTRACE ("[EmacsApp sendEvent]");
-/*fprintf (stderr, "received event of type %d\t%d\n", type);*/
+  NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "[EmacsApp sendEvent:]");
+  NSTRACE_MSG ("Type: %d", type);
 
 #ifdef NS_IMPL_GNUSTEP
   // Keyboard events aren't propagated to file dialogs for some reason.
@@ -5021,6 +5065,8 @@ ns_term_shutdown (int sig)
     }
 #endif
 
+  NSTRACE_UNSILENCE();
+
   [super sendEvent: theEvent];
 }
 
@@ -5041,7 +5087,7 @@ ns_term_shutdown (int sig)
 
 - (void)newFrame: (id)sender
 {
-  NSTRACE ("[EmacsApp newFrame]");
+  NSTRACE ("[EmacsApp newFrame:]");
 
   struct frame *emacsframe = SELECTED_FRAME ();
   NSEvent *theEvent = [NSApp currentEvent];
@@ -5058,7 +5104,7 @@ ns_term_shutdown (int sig)
 /* Open a file (used by below, after going into queue read by ns_read_socket) 
*/
 - (BOOL) openFile: (NSString *)fileName
 {
-  NSTRACE ("[EmacsApp openFile]");
+  NSTRACE ("[EmacsApp openFile:]");
 
   struct frame *emacsframe = SELECTED_FRAME ();
   NSEvent *theEvent = [NSApp currentEvent];
@@ -5088,7 +5134,7 @@ ns_term_shutdown (int sig)
      When application is loaded, terminate event loop in ns_term_init
    -------------------------------------------------------------------------- 
*/
 {
-  NSTRACE ("[EmacsApp applicationDidFinishLaunching]");
+  NSTRACE ("[EmacsApp applicationDidFinishLaunching:]");
 
 #ifdef NS_IMPL_GNUSTEP
   ((EmacsApp *)self)->applicationDidFinishLaunchingCalled = YES;
@@ -5138,7 +5184,7 @@ ns_term_shutdown (int sig)
 
 - (void) terminate: (id)sender
 {
-  NSTRACE ("[EmacsApp terminate]");
+  NSTRACE ("[EmacsApp terminate:]");
 
   struct frame *emacsframe = SELECTED_FRAME ();
 
@@ -5176,7 +5222,7 @@ runAlertPanel(NSString *title,
 
 - (NSApplicationTerminateReply)applicationShouldTerminate: (id)sender
 {
-  NSTRACE ("[EmacsApp applicationShouldTerminate]");
+  NSTRACE ("[EmacsApp applicationShouldTerminate:]");
 
   bool ret;
 
@@ -5257,13 +5303,13 @@ not_in_argv (NSString *arg)
 /* TODO: these may help w/IO switching btwn terminal and NSApp */
 - (void)applicationWillBecomeActive: (NSNotification *)notification
 {
-  NSTRACE ("[EmacsApp applicationWillBecomeActive]");
+  NSTRACE ("[EmacsApp applicationWillBecomeActive:]");
   //ns_app_active=YES;
 }
 
 - (void)applicationDidBecomeActive: (NSNotification *)notification
 {
-  NSTRACE ("[EmacsApp applicationDidBecomeActive]");
+  NSTRACE ("[EmacsApp applicationDidBecomeActive:]");
 
 #ifdef NS_IMPL_GNUSTEP
   if (! applicationDidFinishLaunchingCalled)
@@ -5277,7 +5323,7 @@ not_in_argv (NSString *arg)
 }
 - (void)applicationDidResignActive: (NSNotification *)notification
 {
-  NSTRACE ("[EmacsApp applicationDidResignActive]");
+  NSTRACE ("[EmacsApp applicationDidResignActive:]");
 
   //ns_app_active=NO;
   ns_send_appdefined (-1);
@@ -5422,6 +5468,8 @@ not_in_argv (NSString *arg)
   struct frame *emacsframe = SELECTED_FRAME ();
   NSEvent *theEvent = [NSApp currentEvent];
 
+  NSTRACE ("[EmacsApp fulfillService:withArg:]");
+
   if (!emacs_event)
     return NO;
 
@@ -5452,13 +5500,15 @@ not_in_argv (NSString *arg)
 /* needed to inform when window closed from LISP */
 - (void) setWindowClosing: (BOOL)closing
 {
+  NSTRACE ("[EmacsView setWindowClosing:%d]", closing);
+
   windowClosing = closing;
 }
 
 
 - (void)dealloc
 {
-  NSTRACE ("EmacsView_dealloc");
+  NSTRACE ("[EmacsView dealloc]");
   [toolbar release];
   if (fs_state == FULLSCREEN_BOTH)
     [nonfs_window release];
@@ -5476,7 +5526,7 @@ not_in_argv (NSString *arg)
   CGFloat size;
   NSFont *nsfont;
 
-  NSTRACE ("changeFont");
+  NSTRACE ("[EmacsView changeFont:]");
 
   if (!emacs_event)
     return;
@@ -5506,7 +5556,7 @@ not_in_argv (NSString *arg)
 
 - (BOOL)acceptsFirstResponder
 {
-  NSTRACE ("acceptsFirstResponder");
+  NSTRACE ("[EmacsView acceptsFirstResponder]");
   return YES;
 }
 
@@ -5515,7 +5565,7 @@ not_in_argv (NSString *arg)
 {
   NSRect visible = [self visibleRect];
   NSCursor *currentCursor = FRAME_POINTER_TYPE (emacsframe);
-  NSTRACE ("resetCursorRects");
+  NSTRACE ("[EmacsView resetCursorRects]");
 
   if (currentCursor == nil)
     currentCursor = [NSCursor arrowCursor];
@@ -5540,7 +5590,7 @@ not_in_argv (NSString *arg)
   int left_is_none;
   unsigned int flags = [theEvent modifierFlags];
 
-  NSTRACE ("keyDown");
+  NSTRACE ("[EmacsView keyDown:]");
 
   /* Rhapsody and OS X give up and down events for the arrow keys */
   if (ns_fake_keydown == YES)
@@ -5785,6 +5835,9 @@ not_in_argv (NSString *arg)
 {
   int flags = [theEvent modifierFlags];
   int code = [theEvent keyCode];
+
+  NSTRACE ("[EmacsView keyUp:]");
+
   if (floor (NSAppKitVersionNumber) <= 824 /*NSAppKitVersionNumber10_4*/ &&
       code == 0x30 && (flags & NSControlKeyMask) && !(flags & 
NSCommandKeyMask))
     {
@@ -5809,6 +5862,8 @@ not_in_argv (NSString *arg)
   int len = [(NSString *)aString length];
   int i;
 
+  NSTRACE ("[EmacsView insertText:]");
+
   if (NS_KEYLOG)
     NSLog (@"insertText '%@'\tlen = %d", aString, len);
   processingCompose = NO;
@@ -5842,6 +5897,9 @@ not_in_argv (NSString *arg)
 {
   NSString *str = [aString respondsToSelector: @selector (string)] ?
     [aString string] : aString;
+
+  NSTRACE ("[EmacsView setMarkedText:selectedRange:]");
+
   if (NS_KEYLOG)
     NSLog (@"setMarkedText '%@' len =%lu range %lu from %lu",
            str, (unsigned long)[str length],
@@ -5869,6 +5927,8 @@ not_in_argv (NSString *arg)
 /* delete display of composing characters [not in <NSTextInput>] */
 - (void)deleteWorkingText
 {
+  NSTRACE ("[EmacsView deleteWorkingText]");
+
   if (workingText == nil)
     return;
   if (NS_KEYLOG)
@@ -5888,12 +5948,16 @@ not_in_argv (NSString *arg)
 
 - (BOOL)hasMarkedText
 {
+  NSTRACE ("[EmacsView hasMarkedText]");
+
   return workingText != nil;
 }
 
 
 - (NSRange)markedRange
 {
+  NSTRACE ("[EmacsView markedRange]");
+
   NSRange rng = workingText != nil
     ? NSMakeRange (0, [workingText length]) : NSMakeRange (NSNotFound, 0);
   if (NS_KEYLOG)
@@ -5904,6 +5968,8 @@ not_in_argv (NSString *arg)
 
 - (void)unmarkText
 {
+  NSTRACE ("[EmacsView unmarkText]");
+
   if (NS_KEYLOG)
     NSLog (@"unmark (accept) text");
   [self deleteWorkingText];
@@ -5917,6 +5983,9 @@ not_in_argv (NSString *arg)
   NSRect rect;
   NSPoint pt;
   struct window *win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe));
+
+  NSTRACE ("[EmacsView firstRectForCharacterRange:]");
+
   if (NS_KEYLOG)
     NSLog (@"firstRectForCharRange request");
 
@@ -5941,6 +6010,8 @@ not_in_argv (NSString *arg)
 
 - (void)doCommandBySelector: (SEL)aSelector
 {
+  NSTRACE ("[EmacsView doCommandBySelector:]");
+
   if (NS_KEYLOG)
     NSLog (@"doCommandBySelector: %@", NSStringFromSelector (aSelector));
 
@@ -6003,7 +6074,7 @@ not_in_argv (NSString *arg)
   struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (emacsframe);
   NSPoint p = [self convertPoint: [theEvent locationInWindow] fromView: nil];
 
-  NSTRACE ("mouseDown");
+  NSTRACE ("[EmacsView mouseDown:]");
 
   [self deleteWorkingText];
 
@@ -6024,7 +6095,7 @@ not_in_argv (NSString *arg)
           delta = [theEvent deltaX];
           if (delta == 0)
             {
-              NSTRACE ("deltaIsZero");
+              NSTRACE_MSG ("deltaIsZero");
               return;
             }
           emacs_event->kind = HORIZ_WHEEL_EVENT;
@@ -6051,42 +6122,42 @@ not_in_argv (NSString *arg)
 
 - (void)rightMouseDown: (NSEvent *)theEvent
 {
-  NSTRACE ("rightMouseDown");
+  NSTRACE ("[EmacsView rightMouseDown:]");
   [self mouseDown: theEvent];
 }
 
 
 - (void)otherMouseDown: (NSEvent *)theEvent
 {
-  NSTRACE ("otherMouseDown");
+  NSTRACE ("[EmacsView otherMouseDown:]");
   [self mouseDown: theEvent];
 }
 
 
 - (void)mouseUp: (NSEvent *)theEvent
 {
-  NSTRACE ("mouseUp");
+  NSTRACE ("[EmacsView mouseUp:]");
   [self mouseDown: theEvent];
 }
 
 
 - (void)rightMouseUp: (NSEvent *)theEvent
 {
-  NSTRACE ("rightMouseUp");
+  NSTRACE ("[EmacsView rightMouseUp:]");
   [self mouseDown: theEvent];
 }
 
 
 - (void)otherMouseUp: (NSEvent *)theEvent
 {
-  NSTRACE ("otherMouseUp");
+  NSTRACE ("[EmacsView otherMouseUp:]");
   [self mouseDown: theEvent];
 }
 
 
 - (void) scrollWheel: (NSEvent *)theEvent
 {
-  NSTRACE ("scrollWheel");
+  NSTRACE ("[EmacsView scrollWheel:]");
   [self mouseDown: theEvent];
 }
 
@@ -6099,7 +6170,7 @@ not_in_argv (NSString *arg)
   Lisp_Object frame;
   NSPoint pt;
 
-//  NSTRACE ("mouseMoved");
+  NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "[EmacsView mouseMoved:]");
 
   dpyinfo->last_mouse_movement_time = EV_TIMESTAMP (e);
   pt = [self convertPoint: [e locationInWindow] fromView: nil];
@@ -6119,7 +6190,7 @@ not_in_argv (NSString *arg)
 
   if (!NILP (Vmouse_autoselect_window))
     {
-      NSTRACE ("mouse_autoselect_window");
+      NSTRACE_MSG ("mouse_autoselect_window");
       static Lisp_Object last_mouse_window;
       Lisp_Object window
        = window_from_coordinates (emacsframe, pt.x, pt.y, 0, 0);
@@ -6131,7 +6202,7 @@ not_in_argv (NSString *arg)
               || (EQ (XWINDOW (window)->frame,
                       XWINDOW (selected_window)->frame))))
         {
-          NSTRACE ("in_window");
+          NSTRACE_MSG ("in_window");
           emacs_event->kind = SELECT_WINDOW_EVENT;
           emacs_event->frame_or_window = window;
           EV_TRAILER2 (e);
@@ -6161,21 +6232,21 @@ not_in_argv (NSString *arg)
 
 - (void)mouseDragged: (NSEvent *)e
 {
-  NSTRACE ("mouseDragged");
+  NSTRACE ("[EmacsView mouseDragged:]");
   [self mouseMoved: e];
 }
 
 
 - (void)rightMouseDragged: (NSEvent *)e
 {
-  NSTRACE ("rightMouseDragged");
+  NSTRACE ("[EmacsView rightMouseDragged:]");
   [self mouseMoved: e];
 }
 
 
 - (void)otherMouseDragged: (NSEvent *)e
 {
-  NSTRACE ("otherMouseDragged");
+  NSTRACE ("[EmacsView otherMouseDragged:]");
   [self mouseMoved: e];
 }
 
@@ -6184,7 +6255,7 @@ not_in_argv (NSString *arg)
 {
   NSEvent *e =[[self window] currentEvent];
 
-  NSTRACE ("windowShouldClose");
+  NSTRACE ("[EmacsView windowShouldClose:]");
   windowClosing = YES;
   if (!emacs_event)
     return NO;
@@ -6206,7 +6277,7 @@ not_in_argv (NSString *arg)
   int oldh = FRAME_PIXEL_HEIGHT (emacsframe);
   int neww, newh;
 
-  NSTRACE ("updateFrameSize");
+  NSTRACE ("[EmacsView updateFrameSize:]");
   NSTRACE_SIZE ("Original size", NSMakeSize (oldw, oldh));
   NSTRACE_RECT ("Original frame", wr);
   NSTRACE_MSG  ("Original columns: %d", cols);
@@ -6249,8 +6320,8 @@ not_in_argv (NSString *arg)
   if (rows < MINHEIGHT)
     rows = MINHEIGHT;
 
-  NSTRACE_MSG  ("New columns: %d", cols);
-  NSTRACE_MSG  ("New rows: %d", rows);
+  NSTRACE_MSG ("New columns: %d", cols);
+  NSTRACE_MSG ("New rows: %d", rows);
 
   if (oldr != rows || oldc != cols || neww != oldw || newh != oldh)
     {
@@ -6265,8 +6336,9 @@ not_in_argv (NSString *arg)
       cancel_mouse_face (emacsframe);
 
       wr = NSMakeRect (0, 0, neww, newh);
-      NSTRACE_RECT ("setFrame", wr);
+
       [view setFrame: wr];
+
       // to do: consider using [NSNotificationCenter postNotificationName:].
       [self windowDidMove: // Update top/left.
              [NSNotification notificationWithName:NSWindowDidMoveNotification
@@ -6283,7 +6355,7 @@ not_in_argv (NSString *arg)
 {
   int extra = 0;
 
-  NSTRACE ("windowWillResize: toSize: " NSTRACE_FMT_SIZE,
+  NSTRACE ("[EmacsView windowWillResize:toSize: " NSTRACE_FMT_SIZE "]",
            NSTRACE_ARG_SIZE (frameSize));
   NSTRACE_RECT   ("[sender frame]", [sender frame]);
   NSTRACE_FSTYPE ("fs_state", fs_state);
@@ -6382,7 +6454,7 @@ not_in_argv (NSString *arg)
 
 - (void)windowDidResize: (NSNotification *)notification
 {
-  NSTRACE ("windowDidResize");
+  NSTRACE ("[EmacsView windowDidResize:]");
   if (!FRAME_LIVE_P (emacsframe))
     {
       NSTRACE_MSG ("Ignored (frame dead)");
@@ -6425,6 +6497,8 @@ not_in_argv (NSString *arg)
 #ifdef NS_IMPL_COCOA
 - (void)viewDidEndLiveResize
 {
+  NSTRACE ("[EmacsView viewDidEndLiveResize]");
+
   [super viewDidEndLiveResize];
   if (old_title != 0)
     {
@@ -6440,10 +6514,16 @@ not_in_argv (NSString *arg)
 - (void)windowDidBecomeKey: (NSNotification *)notification
 /* cf. x_detect_focus_change(), x_focus_changed(), x_new_focus_frame() */
 {
+  [self windowDidBecomeKey];
+}
+
+
+- (void)windowDidBecomeKey      /* for direct calls */
+{
   struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (emacsframe);
   struct frame *old_focus = dpyinfo->x_focus_frame;
 
-  NSTRACE ("windowDidBecomeKey");
+  NSTRACE ("[EmacsView windowDidBecomeKey]");
 
   if (emacsframe != old_focus)
     dpyinfo->x_focus_frame = emacsframe;
@@ -6463,7 +6543,7 @@ not_in_argv (NSString *arg)
 {
   struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (emacsframe);
   BOOL is_focus_frame = dpyinfo->x_focus_frame == emacsframe;
-  NSTRACE ("windowDidResignKey");
+  NSTRACE ("[EmacsView windowDidResignKey:]");
 
   if (is_focus_frame)
     dpyinfo->x_focus_frame = 0;
@@ -6498,7 +6578,16 @@ not_in_argv (NSString *arg)
 
 - (void)windowWillMiniaturize: sender
 {
-  NSTRACE ("windowWillMiniaturize");
+  NSTRACE ("[EmacsView windowWillMiniaturize:]");
+}
+
+
+- (void)setFrame:(NSRect)frameRect;
+{
+  NSTRACE ("[EmacsView setFrame:" NSTRACE_FMT_RECT "]",
+           NSTRACE_ARG_RECT (frameRect));
+
+  [super setFrame:(NSRect)frameRect];
 }
 
 
@@ -6522,7 +6611,8 @@ not_in_argv (NSString *arg)
   NSColor *col;
   NSString *name;
 
-  NSTRACE ("initFrameFromEmacs");
+  NSTRACE ("[EmacsView initFrameFromEmacs:]");
+  NSTRACE_MSG ("cols:%d lines:%d\n", f->text_cols, f->text_lines);
 
   windowClosing = NO;
   processingCompose = NO;
@@ -6537,8 +6627,6 @@ not_in_argv (NSString *arg)
   maximized_width = maximized_height = -1;
   nonfs_window = nil;
 
-/*fprintf (stderr,"init with %d, %d\n",f->text_cols, f->text_lines); */
-
   ns_userRect = NSMakeRect (0, 0, 0, 0);
   r = NSMakeRect (0, 0, FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, f->text_cols),
                  FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, f->text_lines));
@@ -6626,8 +6714,6 @@ not_in_argv (NSString *arg)
            IN_BOUND (-SCREENMAX,
                      [screen frame].size.height - NS_TOP_POS (f), SCREENMAX));
 
-        NSTRACE_POINT ("setFrameTopLeftPoint", pt);
-
         [win setFrameTopLeftPoint: pt];
 
         NSTRACE_RECT ("new frame", [win frame]);
@@ -6661,7 +6747,7 @@ not_in_argv (NSString *arg)
   NSArray *screens = [NSScreen screens];
   NSScreen *screen = [screens objectAtIndex: 0];
 
-  NSTRACE ("windowDidMove");
+  NSTRACE ("[EmacsView windowDidMove:]");
 
   if (!emacsframe->output_data.ns)
     return;
@@ -6679,7 +6765,7 @@ not_in_argv (NSString *arg)
    location so set_window_size moves the frame. */
 - (BOOL)windowShouldZoom: (NSWindow *)sender toFrame: (NSRect)newFrame
 {
-  NSTRACE (("[windowShouldZoom:win toFrame:" NSTRACE_FMT_RECT "]"
+  NSTRACE (("[EmacsView windowShouldZoom:toFrame:" NSTRACE_FMT_RECT "]"
             NSTRACE_FMT_RETURN "YES"),
            NSTRACE_ARG_RECT (newFrame));
 
@@ -6698,7 +6784,7 @@ not_in_argv (NSString *arg)
   // all paths.
   NSRect result = [sender frame];
 
-  NSTRACE (("[windowWillUseStandardFrame: defaultFrame:"
+  NSTRACE (("[EmacsView windowWillUseStandardFrame:defaultFrame:"
             NSTRACE_FMT_RECT "]"),
            NSTRACE_ARG_RECT (defaultFrame));
   NSTRACE_FSTYPE ("fs_state", fs_state);
@@ -6811,7 +6897,7 @@ not_in_argv (NSString *arg)
 
 - (void)windowDidDeminiaturize: sender
 {
-  NSTRACE ("windowDidDeminiaturize");
+  NSTRACE ("[EmacsView windowDidDeminiaturize:]");
   if (!emacsframe->output_data.ns)
     return;
 
@@ -6829,7 +6915,7 @@ not_in_argv (NSString *arg)
 
 - (void)windowDidExpose: sender
 {
-  NSTRACE ("windowDidExpose");
+  NSTRACE ("[EmacsView windowDidExpose:]");
   if (!emacsframe->output_data.ns)
     return;
 
@@ -6843,7 +6929,7 @@ not_in_argv (NSString *arg)
 
 - (void)windowDidMiniaturize: sender
 {
-  NSTRACE ("windowDidMiniaturize");
+  NSTRACE ("[EmacsView windowDidMiniaturize:]");
   if (!emacsframe->output_data.ns)
     return;
 
@@ -6866,33 +6952,30 @@ not_in_argv (NSString *arg)
 }
 #endif
 
-#if !defined (NS_IMPL_COCOA) || MAC_OS_X_VERSION_MAX_ALLOWED < 
MAC_OS_X_VERSION_10_7
-#define NSWindowDidEnterFullScreenNotification 
"NSWindowDidEnterFullScreenNotification"
-#endif
-
 - (void)windowWillEnterFullScreen:(NSNotification *)notification
 {
+  NSTRACE ("[EmacsView windowWillEnterFullScreen:]");
   [self windowWillEnterFullScreen];
 }
 - (void)windowWillEnterFullScreen /* provided for direct calls */
 {
-  NSTRACE ("windowWillEnterFullScreen");
+  NSTRACE ("[EmacsView windowWillEnterFullScreen]");
   fs_before_fs = fs_state;
 }
 
-- (void)windowDidEnterFullScreen /* provided for direct calls */
+- (void)windowDidEnterFullScreen:(NSNotification *)notification
 {
-  [self windowDidEnterFullScreen:
-             [NSNotification 
notificationWithName:NSWindowDidEnterFullScreenNotification
-                                           object:[self window]]];
+  NSTRACE ("[EmacsView windowDidEnterFullScreen:]");
+  [self windowDidEnterFullScreen];
 }
-- (void)windowDidEnterFullScreen:(NSNotification *)notification
+
+- (void)windowDidEnterFullScreen /* provided for direct calls */
 {
-  NSTRACE ("windowDidEnterFullScreen");
+  NSTRACE ("[EmacsView windowDidEnterFullScreen]");
   [self setFSValue: FULLSCREEN_BOTH];
   if (! [self fsIsNative])
     {
-      [self windowDidBecomeKey:notification];
+      [self windowDidBecomeKey];
       [nonfs_window orderOut:self];
     }
   else
@@ -6922,12 +7005,13 @@ not_in_argv (NSString *arg)
 
 - (void)windowWillExitFullScreen:(NSNotification *)notification
 {
+  NSTRACE ("[EmacsView windowWillExitFullScreen:]");
   [self windowWillExitFullScreen];
 }
 
 - (void)windowWillExitFullScreen /* provided for direct calls */
 {
-  NSTRACE ("windowWillExitFullScreen");
+  NSTRACE ("[EmacsView windowWillExitFullScreen]");
   if (!FRAME_LIVE_P (emacsframe))
     {
       NSTRACE_MSG ("Ignored (frame dead)");
@@ -6939,12 +7023,13 @@ not_in_argv (NSString *arg)
 
 - (void)windowDidExitFullScreen:(NSNotification *)notification
 {
+  NSTRACE ("[EmacsView windowDidExitFullScreen:]");
   [self windowDidExitFullScreen];
 }
 
 - (void)windowDidExitFullScreen /* provided for direct calls */
 {
-  NSTRACE ("windowDidExitFullScreen");
+  NSTRACE ("[EmacsView windowDidExitFullScreen]");
   if (!FRAME_LIVE_P (emacsframe))
     {
       NSTRACE_MSG ("Ignored (frame dead)");
@@ -6976,6 +7061,8 @@ not_in_argv (NSString *arg)
 
 - (BOOL)isFullscreen
 {
+  NSTRACE ("[EmacsView isFullscreen]");
+
   if (! fs_is_native) return nonfs_window != nil;
 #ifdef HAVE_NATIVE_FS
   return ([[self window] styleMask] & NSFullScreenWindowMask) != 0;
@@ -6987,6 +7074,8 @@ not_in_argv (NSString *arg)
 #ifdef HAVE_NATIVE_FS
 - (void)updateCollectionBehavior
 {
+  NSTRACE ("[EmacsView updateCollectionBehavior]");
+
   if (! [self isFullscreen])
     {
       NSWindow *win = [self window];
@@ -7010,7 +7099,7 @@ not_in_argv (NSString *arg)
   NSRect r, wr;
   NSColor *col;
 
-  NSTRACE ("toggleFullScreen");
+  NSTRACE ("[EmacsView toggleFullScreen:]");
 
   if (fs_is_native)
     {
@@ -7125,7 +7214,7 @@ not_in_argv (NSString *arg)
 
 - (void)handleFS
 {
-  NSTRACE ("handleFS");
+  NSTRACE ("[EmacsView handleFS]");
 
   if (fs_state != emacsframe->want_fullscreen)
     {
@@ -7176,8 +7265,8 @@ not_in_argv (NSString *arg)
 
 - (void) setFSValue: (int)value
 {
-  NSTRACE ("setFSValue");
-  NSTRACE_FSTYPE ("value", value);
+  NSTRACE ("[EmacsView setFSValue:" NSTRACE_FMT_FSTYPE "]",
+           NSTRACE_ARG_FSTYPE(value));
 
   Lisp_Object lval = Qnil;
   switch (value)
@@ -7201,7 +7290,7 @@ not_in_argv (NSString *arg)
 
 - (void)mouseEntered: (NSEvent *)theEvent
 {
-  NSTRACE ("mouseEntered");
+  NSTRACE ("[EmacsView mouseEntered:]");
   if (emacsframe)
     FRAME_DISPLAY_INFO (emacsframe)->last_mouse_movement_time
       = EV_TIMESTAMP (theEvent);
@@ -7212,7 +7301,7 @@ not_in_argv (NSString *arg)
 {
   Mouse_HLInfo *hlinfo = emacsframe ? MOUSE_HL_INFO (emacsframe) : NULL;
 
-  NSTRACE ("mouseExited");
+  NSTRACE ("[EmacsView mouseExited:]");
 
   if (!hlinfo)
     return;
@@ -7230,7 +7319,7 @@ not_in_argv (NSString *arg)
 
 - menuDown: sender
 {
-  NSTRACE ("menuDown");
+  NSTRACE ("[EmacsView menuDown:]");
   if (context_menu_value == -1)
     context_menu_value = [sender tag];
   else
@@ -7258,7 +7347,7 @@ not_in_argv (NSString *arg)
   NSEvent *theEvent;
   int idx = [item tag] * TOOL_BAR_ITEM_NSLOTS;
 
-  NSTRACE ("toolbarClicked");
+  NSTRACE ("[EmacsView toolbarClicked:]");
 
   if (!emacs_event)
     return self;
@@ -7281,6 +7370,8 @@ not_in_argv (NSString *arg)
 
 - toggleToolbar: (id)sender
 {
+  NSTRACE ("[EmacsView toggleToolbar:]");
+
   if (!emacs_event)
     return self;
 
@@ -7296,8 +7387,8 @@ not_in_argv (NSString *arg)
   int x = NSMinX (rect), y = NSMinY (rect);
   int width = NSWidth (rect), height = NSHeight (rect);
 
-  NSTRACE ("drawRect");
-  NSTRACE_RECT ("input", rect);
+  NSTRACE ("[EmacsView drawRect:" NSTRACE_FMT_RECT "]",
+           NSTRACE_ARG_RECT(rect));
 
   if (!emacsframe || !emacsframe->output_data.ns)
     return;
@@ -7323,7 +7414,7 @@ not_in_argv (NSString *arg)
 
 -(NSDragOperation) draggingEntered: (id <NSDraggingInfo>) sender
 {
-  NSTRACE ("draggingEntered");
+  NSTRACE ("[EmacsView draggingEntered:]");
   return NSDragOperationGeneric;
 }
 
@@ -7344,7 +7435,7 @@ not_in_argv (NSString *arg)
   NSDragOperation op = [sender draggingSourceOperationMask];
   int modifiers = 0;
 
-  NSTRACE ("performDragOperation");
+  NSTRACE ("[EmacsView performDragOperation:]");
 
   if (!emacs_event)
     return NO;
@@ -7444,7 +7535,7 @@ not_in_argv (NSString *arg)
 - (id) validRequestorForSendType: (NSString *)typeSent
                       returnType: (NSString *)typeReturned
 {
-  NSTRACE ("validRequestorForSendType");
+  NSTRACE ("[EmacsView validRequestorForSendType:returnType:]");
   if (typeSent != nil && [ns_send_types indexOfObject: typeSent] != NSNotFound
       && typeReturned == nil)
     {
@@ -7477,6 +7568,8 @@ not_in_argv (NSString *arg)
   NSArray *typesDeclared;
   Lisp_Object val;
 
+  NSTRACE ("[EmacsView writeSelectionToPasteboard:types:]");
+
   /* We only support NSStringPboardType */
   if ([types containsObject:NSStringPboardType] == NO) {
     return NO;
@@ -7506,7 +7599,7 @@ not_in_argv (NSString *arg)
 - setMiniwindowImage: (BOOL) setMini
 {
   id image = [[self window] miniwindowImage];
-  NSTRACE ("setMiniwindowImage");
+  NSTRACE ("[EmacsView setMiniwindowImage:%d]", setMini);
 
   /* NOTE: under Cocoa miniwindowImage always returns nil, documentation
      about "AppleDockIconEnabled" notwithstanding, however the set message
@@ -7554,6 +7647,8 @@ not_in_argv (NSString *arg)
   struct frame *f = SELECTED_FRAME ();
   struct buffer *curbuf = XBUFFER (XWINDOW (f->selected_window)->contents);
 
+  NSTRACE ("[EmacsWindow accessibilityAttributeValue:]");
+
   if ([attribute isEqualToString:NSAccessibilityRoleAttribute])
     return NSAccessibilityTextFieldRole;
 
@@ -7622,7 +7717,7 @@ not_in_argv (NSString *arg)
    large screen). */
 - (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen
 {
-  NSTRACE ("constrainFrameRect:" NSTRACE_FMT_RECT " toScreen:",
+  NSTRACE ("[EmacsWindow constrainFrameRect:" NSTRACE_FMT_RECT " toScreen:]",
              NSTRACE_ARG_RECT (frameRect));
 
 #ifdef NS_IMPL_COCOA
@@ -7645,7 +7740,7 @@ not_in_argv (NSString *arg)
 
 - (void)performZoom:(id)sender
 {
-  NSTRACE ("performZoom");
+  NSTRACE ("[EmacsWindow performZoom:]");
 
   return [super performZoom:sender];
 }
@@ -7654,7 +7749,7 @@ not_in_argv (NSString *arg)
 {
   struct frame * f = SELECTED_FRAME ();
 
-  NSTRACE ("zoom");
+  NSTRACE ("[EmacsWindow zoom:]");
 
   ns_update_auto_hide_menu_bar();
 
@@ -7713,7 +7808,7 @@ not_in_argv (NSString *arg)
           || newWr.origin.x    != wr.origin.x
           || newWr.origin.y    != wr.origin.y)
         {
-          NSTRACE_RECT ("Corrected rect", newWr);
+          NSTRACE_MSG ("New frame different");
           [self setFrame: newWr display: NO];
         }
     }
@@ -7733,6 +7828,33 @@ not_in_argv (NSString *arg)
 #endif
 }
 
+- (void)setFrame:(NSRect)windowFrame
+         display:(BOOL)displayViews
+{
+  NSTRACE ("[EmacsWindow setFrame:" NSTRACE_FMT_RECT " display:%d]",
+           NSTRACE_ARG_RECT (windowFrame), displayViews);
+
+  [super setFrame:windowFrame display:displayViews];
+}
+
+- (void)setFrame:(NSRect)windowFrame
+         display:(BOOL)displayViews
+         animate:(BOOL)performAnimation
+{
+  NSTRACE ("[EmacsWindow setFrame:" NSTRACE_FMT_RECT
+           " display:%d performAnimation:%d]",
+           NSTRACE_ARG_RECT (windowFrame), displayViews, performAnimation);
+
+  [super setFrame:windowFrame display:displayViews animate:performAnimation];
+}
+
+- (void)setFrameTopLeftPoint:(NSPoint)point
+{
+  NSTRACE ("[EmacsWindow setFrameTopLeftPoint:" NSTRACE_FMT_POINT "]",
+           NSTRACE_ARG_POINT (point));
+
+  [super setFrameTopLeftPoint:point];
+}
 @end /* EmacsWindow */
 
 
@@ -7781,7 +7903,7 @@ not_in_argv (NSString *arg)
 
 - initFrame: (NSRect )r window: (Lisp_Object)nwin
 {
-  NSTRACE ("EmacsScroller_initFrame");
+  NSTRACE ("[EmacsScroller initFrame: window:]");
 
   r.size.width = [EmacsScroller scrollerWidth];
   [super initWithFrame: r/*NSMakeRect (0, 0, 0, 0)*/];
@@ -7827,7 +7949,8 @@ not_in_argv (NSString *arg)
 
 - (void)setFrame: (NSRect)newRect
 {
-  NSTRACE ("EmacsScroller_setFrame");
+  NSTRACE ("[EmacsScroller setFrame:]");
+
 /*  block_input (); */
   pixel_height = NSHeight (newRect);
   if (pixel_height == 0) pixel_height = 1;
@@ -7839,7 +7962,7 @@ not_in_argv (NSString *arg)
 
 - (void)dealloc
 {
-  NSTRACE ("EmacsScroller_dealloc");
+  NSTRACE ("[EmacsScroller dealloc]");
   if (window)
     wset_vertical_scroll_bar (window, Qnil);
   window = 0;
@@ -7849,7 +7972,7 @@ not_in_argv (NSString *arg)
 
 - condemn
 {
-  NSTRACE ("condemn");
+  NSTRACE ("[EmacsScroller condemn]");
   condemned =YES;
   return self;
 }
@@ -7857,7 +7980,7 @@ not_in_argv (NSString *arg)
 
 - reprieve
 {
-  NSTRACE ("reprieve");
+  NSTRACE ("[EmacsScroller reprieve]");
   condemned =NO;
   return self;
 }
@@ -7865,7 +7988,7 @@ not_in_argv (NSString *arg)
 
 -(bool)judge
 {
-  NSTRACE ("judge");
+  NSTRACE ("[EmacsScroller judge]");
   bool ret = condemned;
   if (condemned)
     {
@@ -7889,7 +8012,7 @@ not_in_argv (NSString *arg)
 - (void)resetCursorRects
 {
   NSRect visible = [self visibleRect];
-  NSTRACE ("resetCursorRects");
+  NSTRACE ("[EmacsScroller resetCursorRects]");
 
   if (!NSIsEmptyRect (visible))
     [self addCursorRect: visible cursor: [NSCursor arrowCursor]];
@@ -7907,7 +8030,7 @@ not_in_argv (NSString *arg)
 
 - setPosition: (int)position portion: (int)portion whole: (int)whole
 {
-  NSTRACE ("setPosition");
+  NSTRACE ("[EmacsScroller setPosition:portion:whole:]");
 
   em_position = position;
   em_portion = portion;
@@ -7944,6 +8067,9 @@ not_in_argv (NSString *arg)
 - (void) sendScrollEventAtLoc: (float)loc fromEvent: (NSEvent *)e
 {
   Lisp_Object win;
+
+  NSTRACE ("[EmacsScroller sendScrollEventAtLoc:fromEvent:]");
+
   if (!emacs_event)
     return;
 
@@ -7977,6 +8103,8 @@ not_in_argv (NSString *arg)
   NSPoint p =  [[self window] mouseLocationOutsideOfEventStream];
   BOOL inKnob = [self testPart: p] == NSScrollerKnob;
 
+  NSTRACE ("[EmacsScroller repeatScroll:]");
+
   /* clear timer if need be */
   if (inKnob || [scroll_repeat_entry timeInterval] == SCROLL_BAR_FIRST_DELAY)
     {
@@ -8012,7 +8140,7 @@ not_in_argv (NSString *arg)
   CGFloat inc = 0.0, loc, kloc, pos;
   int edge = 0;
 
-  NSTRACE ("EmacsScroller_mouseDown");
+  NSTRACE ("[EmacsScroller mouseDown:]");
 
   switch (part)
     {
@@ -8109,7 +8237,7 @@ not_in_argv (NSString *arg)
     NSRect sr;
     double loc, pos;
 
-    NSTRACE ("EmacsScroller_mouseDragged");
+    NSTRACE ("[EmacsScroller mouseDragged:]");
 
       sr = [self convertRect: [self rectForPart: NSScrollerKnobSlot]
                       toView: nil];
@@ -8131,6 +8259,8 @@ not_in_argv (NSString *arg)
 
 - (void)mouseUp: (NSEvent *)e
 {
+  NSTRACE ("[EmacsScroller mouseUp:]");
+
   if (scroll_repeat_entry)
     {
       [scroll_repeat_entry invalidate];
@@ -8144,6 +8274,8 @@ not_in_argv (NSString *arg)
 /* treat scrollwheel events in the bar as though they were in the main window 
*/
 - (void) scrollWheel: (NSEvent *)theEvent
 {
+  NSTRACE ("[EmacsScroller scrollWheel:]");
+
   EmacsView *view = (EmacsView *)FRAME_NS_VIEW (frame);
   [view mouseDown: theEvent];
 }
diff --git a/src/print.c b/src/print.c
index 2443bba..724f7f7 100644
--- a/src/print.c
+++ b/src/print.c
@@ -2006,6 +2006,19 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, 
bool escapeflag)
          printchar ('>', printcharfun);
           break;
 
+#ifdef HAVE_MODULES
+       case Lisp_Misc_User_Ptr:
+         {
+           print_c_string ("#<user-ptr ", printcharfun);
+           int i = sprintf (buf, "ptr=%p finalizer=%p",
+                            XUSER_PTR (obj)->p,
+                            XUSER_PTR (obj)->finalizer);
+           strout (buf, i, i, printcharfun);
+           printchar ('>', printcharfun);
+           break;
+         }
+#endif
+
         case Lisp_Misc_Finalizer:
           print_c_string ("#<finalizer", printcharfun);
           if (NILP (XFINALIZER (obj)->function))
diff --git a/src/puresize.h b/src/puresize.h
index f075624..96ddcde 100644
--- a/src/puresize.h
+++ b/src/puresize.h
@@ -81,21 +81,35 @@ extern _Noreturn void pure_write_error (Lisp_Object);
 
 extern EMACS_INT pure[];
 
+/* The puresize_h_* macros are private to this include file.  */
+
 /* True if PTR is pure.  */
+
+#define puresize_h_PURE_P(ptr) \
+  ((uintptr_t) (ptr) - (uintptr_t) pure <= PURESIZE)
+
 INLINE bool
 PURE_P (void *ptr)
 {
-  return (uintptr_t) (ptr) - (uintptr_t) pure <= PURESIZE;
+  return puresize_h_PURE_P (ptr);
 }
 
 /* Signal an error if OBJ is pure.  PTR is OBJ untagged.  */
+
+#define puresize_h_CHECK_IMPURE(obj, ptr) \
+  (PURE_P (ptr) ? pure_write_error (obj) : (void) 0)
+
 INLINE void
 CHECK_IMPURE (Lisp_Object obj, void *ptr)
 {
-  if (PURE_P (ptr))
-    pure_write_error (obj);
+  puresize_h_CHECK_IMPURE (obj, ptr);
 }
 
+#if DEFINE_KEY_OPS_AS_MACROS
+# define PURE_P(ptr) puresize_h_PURE_P (ptr)
+# define CHECK_IMPURE(obj, ptr) puresize_h_CHECK_IMPURE (obj, ptr)
+#endif
+
 INLINE_HEADER_END
 
 #endif /* EMACS_PURESIZE_H */
diff --git a/src/regex.c b/src/regex.c
index dcf2864..4e00fd1 100644
--- a/src/regex.c
+++ b/src/regex.c
@@ -5945,12 +5945,12 @@ re_match_2_internal (struct re_pattern_buffer *bufp, 
const_re_char *string1,
 #ifdef emacs
                ssize_t offset = PTR_TO_OFFSET (d - 1);
                ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
-               UPDATE_SYNTAX_TABLE (charpos);
+               UPDATE_SYNTAX_TABLE_FAST (charpos);
 #endif
                GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
                s1 = SYNTAX (c1);
 #ifdef emacs
-               UPDATE_SYNTAX_TABLE_FORWARD (charpos + 1);
+               UPDATE_SYNTAX_TABLE_FORWARD_FAST (charpos + 1);
 #endif
                PREFETCH_NOLIMIT ();
                GET_CHAR_AFTER (c2, d, dummy);
@@ -5987,7 +5987,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, 
const_re_char *string1,
 #ifdef emacs
              ssize_t offset = PTR_TO_OFFSET (d);
              ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
-             UPDATE_SYNTAX_TABLE (charpos);
+             UPDATE_SYNTAX_TABLE_FAST (charpos);
 #endif
              PREFETCH ();
              GET_CHAR_AFTER (c2, d, dummy);
@@ -6032,7 +6032,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, 
const_re_char *string1,
 #ifdef emacs
              ssize_t offset = PTR_TO_OFFSET (d) - 1;
              ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
-             UPDATE_SYNTAX_TABLE (charpos);
+             UPDATE_SYNTAX_TABLE_FAST (charpos);
 #endif
              GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
              s1 = SYNTAX (c1);
@@ -6047,7 +6047,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, 
const_re_char *string1,
                  PREFETCH_NOLIMIT ();
                  GET_CHAR_AFTER (c2, d, dummy);
 #ifdef emacs
-                 UPDATE_SYNTAX_TABLE_FORWARD (charpos);
+                 UPDATE_SYNTAX_TABLE_FORWARD_FAST (charpos);
 #endif
                  s2 = SYNTAX (c2);
 
@@ -6076,7 +6076,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, 
const_re_char *string1,
 #ifdef emacs
              ssize_t offset = PTR_TO_OFFSET (d);
              ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
-             UPDATE_SYNTAX_TABLE (charpos);
+             UPDATE_SYNTAX_TABLE_FAST (charpos);
 #endif
              PREFETCH ();
              c2 = RE_STRING_CHAR (d, target_multibyte);
@@ -6119,7 +6119,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, 
const_re_char *string1,
 #ifdef emacs
              ssize_t offset = PTR_TO_OFFSET (d) - 1;
              ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
-             UPDATE_SYNTAX_TABLE (charpos);
+             UPDATE_SYNTAX_TABLE_FAST (charpos);
 #endif
              GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
              s1 = SYNTAX (c1);
@@ -6134,7 +6134,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, 
const_re_char *string1,
                  PREFETCH_NOLIMIT ();
                  c2 = RE_STRING_CHAR (d, target_multibyte);
 #ifdef emacs
-                 UPDATE_SYNTAX_TABLE_FORWARD (charpos + 1);
+                 UPDATE_SYNTAX_TABLE_FORWARD_FAST (charpos + 1);
 #endif
                  s2 = SYNTAX (c2);
 
@@ -6157,7 +6157,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, 
const_re_char *string1,
            {
              ssize_t offset = PTR_TO_OFFSET (d);
              ssize_t pos1 = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
-             UPDATE_SYNTAX_TABLE (pos1);
+             UPDATE_SYNTAX_TABLE_FAST (pos1);
            }
 #endif
            {
diff --git a/src/syntax.c b/src/syntax.c
index 1dcb3a5..2acbd41 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -519,8 +519,7 @@ update_syntax_table_forward (ptrdiff_t charpos, bool init,
   else
     {
       update_syntax_table (charpos, 1, init, object);
-      if (gl_state.e_property > syntax_propertize__done
-         && NILP (object))
+      if (NILP (object) && gl_state.e_property > syntax_propertize__done)
        parse_sexp_propertize (charpos);
     }
 }
@@ -791,8 +790,10 @@ back_comment (ptrdiff_t from, ptrdiff_t from_byte, 
ptrdiff_t stop,
                   || SYNTAX_FLAGS_COMMENT_NESTED (syntax) != comnested))
        continue;
 
-      /* Ignore escaped characters, except comment-enders.  */
-      if (code != Sendcomment && char_quoted (from, from_byte))
+      /* Ignore escaped characters, except comment-enders which cannot
+         be escaped.  */
+      if ((Vcomment_end_can_be_escaped || code != Sendcomment)
+          && char_quoted (from, from_byte))
        continue;
 
       switch (code)
@@ -2347,7 +2348,8 @@ forw_comment (ptrdiff_t from, ptrdiff_t from_byte, 
ptrdiff_t stop,
       if (code == Sendcomment
          && SYNTAX_FLAGS_COMMENT_STYLE (syntax, 0) == style
          && (SYNTAX_FLAGS_COMMENT_NESTED (syntax) ?
-             (nesting > 0 && --nesting == 0) : nesting < 0))
+             (nesting > 0 && --nesting == 0) : nesting < 0)
+          && !(Vcomment_end_can_be_escaped && char_quoted (from, from_byte)))
        /* We have encountered a comment end of the same style
           as the comment sequence which began this comment
           section.  */
@@ -3703,6 +3705,12 @@ character of that word.
 In both cases, LIMIT bounds the search. */);
   Vfind_word_boundary_function_table = Fmake_char_table (Qnil, Qnil);
 
+  DEFVAR_BOOL ("comment-end-can-be-escaped", Vcomment_end_can_be_escaped,
+               doc: /* Non-nil means an escaped ender inside a comment 
doesn'tend the comment.  */);
+  Vcomment_end_can_be_escaped = 0;
+  DEFSYM (Qcomment_end_can_be_escaped, "comment-end-can-be-escaped");
+  Fmake_variable_buffer_local (Qcomment_end_can_be_escaped);
+
   defsubr (&Ssyntax_table_p);
   defsubr (&Ssyntax_table);
   defsubr (&Sstandard_syntax_table);
diff --git a/src/syntax.h b/src/syntax.h
index 06ce0ec..eb154e0 100644
--- a/src/syntax.h
+++ b/src/syntax.h
@@ -186,6 +186,13 @@ UPDATE_SYNTAX_TABLE_FORWARD (ptrdiff_t charpos)
                                 false, gl_state.object);
 }
 
+INLINE void
+UPDATE_SYNTAX_TABLE_FORWARD_FAST (ptrdiff_t charpos)
+{
+  if (parse_sexp_lookup_properties && charpos >= gl_state.e_property)
+    update_syntax_table (charpos + gl_state.offset, 1, false, gl_state.object);
+}
+
 /* Make syntax table state (gl_state) good for CHARPOS, assuming it is
    currently good for a position after CHARPOS.  */
 
@@ -205,6 +212,13 @@ UPDATE_SYNTAX_TABLE (ptrdiff_t charpos)
   UPDATE_SYNTAX_TABLE_FORWARD (charpos);
 }
 
+INLINE void
+UPDATE_SYNTAX_TABLE_FAST (ptrdiff_t charpos)
+{
+  UPDATE_SYNTAX_TABLE_BACKWARD (charpos);
+  UPDATE_SYNTAX_TABLE_FORWARD_FAST (charpos);
+}
+
 /* Set up the buffer-global syntax table.  */
 
 INLINE void
diff --git a/src/undo.c b/src/undo.c
index 214beae..1cc6de4 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -22,10 +22,7 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 
 #include "lisp.h"
 #include "buffer.h"
-
-/* Position of point last time we inserted a boundary.  */
-static struct buffer *last_boundary_buffer;
-static ptrdiff_t last_boundary_position;
+#include "keyboard.h"
 
 /* The first time a command records something for undo.
    it also allocates the undo-boundary object
@@ -34,45 +31,42 @@ static ptrdiff_t last_boundary_position;
    an undo-boundary.  */
 static Lisp_Object pending_boundary;
 
+/* Record point as it was at beginning of this command (if necessary)
+   and prepare the undo info for recording a change.
+   Prepare the undo info for recording a change. */
 static void
-run_undoable_change (void)
+prepare_record (void)
 {
-  call0 (Qundo_auto__undoable_change);
+  /* Allocate a cons cell to be the undo boundary after this command.  */
+  if (NILP (pending_boundary))
+    pending_boundary = Fcons (Qnil, Qnil);
+
+  if (MODIFF <= SAVE_MODIFF)
+    record_first_change ();
 }
 
-/* Record point as it was at beginning of this command (if necessary)
-   and prepare the undo info for recording a change.
+/* Record point as it was at beginning of this command.
    PT is the position of point that will naturally occur as a result of the
    undo record that will be added just after this command terminates.  */
-
 static void
 record_point (ptrdiff_t pt)
 {
-  bool at_boundary;
-
   /* Don't record position of pt when undo_inhibit_record_point holds.  */
   if (undo_inhibit_record_point)
     return;
 
-  /* Allocate a cons cell to be the undo boundary after this command.  */
-  if (NILP (pending_boundary))
-    pending_boundary = Fcons (Qnil, Qnil);
-
-  run_undoable_change ();
+  bool at_boundary;
 
   at_boundary = ! CONSP (BVAR (current_buffer, undo_list))
                 || NILP (XCAR (BVAR (current_buffer, undo_list)));
 
-  if (MODIFF <= SAVE_MODIFF)
-    record_first_change ();
+  prepare_record ();
 
   /* If we are just after an undo boundary, and
      point wasn't at start of deleted range, record where it was.  */
-  if (at_boundary
-      && current_buffer == last_boundary_buffer
-      && last_boundary_position != pt)
+  if (at_boundary)
     bset_undo_list (current_buffer,
-                   Fcons (make_number (last_boundary_position),
+                   Fcons (make_number (pt),
                           BVAR (current_buffer, undo_list)));
 }
 
@@ -89,7 +83,7 @@ record_insert (ptrdiff_t beg, ptrdiff_t length)
   if (EQ (BVAR (current_buffer, undo_list), Qt))
     return;
 
-  record_point (beg);
+  prepare_record ();
 
   /* If this is following another insertion and consecutive with it
      in the buffer, combine the two.  */
@@ -130,8 +124,6 @@ record_marker_adjustments (ptrdiff_t from, ptrdiff_t to)
   if (NILP (pending_boundary))
     pending_boundary = Fcons (Qnil, Qnil);
 
-  run_undoable_change ();
-
   for (m = BUF_MARKERS (current_buffer); m; m = m->next)
     {
       charpos = m->charpos;
@@ -163,7 +155,6 @@ record_marker_adjustments (ptrdiff_t from, ptrdiff_t to)
 /* Record that a deletion is about to take place, of the characters in
    STRING, at location BEG.  Optionally record adjustments for markers
    in the region STRING occupies in the current buffer.  */
-
 void
 record_delete (ptrdiff_t beg, Lisp_Object string, bool record_markers)
 {
@@ -172,15 +163,19 @@ record_delete (ptrdiff_t beg, Lisp_Object string, bool 
record_markers)
   if (EQ (BVAR (current_buffer, undo_list), Qt))
     return;
 
+  if (point_before_last_command_or_undo != beg
+      && buffer_before_last_command_or_undo == current_buffer)
+    record_point (point_before_last_command_or_undo);
+
   if (PT == beg + SCHARS (string))
     {
       XSETINT (sbeg, -beg);
-      record_point (PT);
+      prepare_record ();
     }
   else
     {
       XSETFASTINT (sbeg, beg);
-      record_point (beg);
+      prepare_record ();
     }
 
   /* primitive-undo assumes marker adjustments are recorded
@@ -234,7 +229,7 @@ record_property_change (ptrdiff_t beg, ptrdiff_t length,
                        Lisp_Object buffer)
 {
   Lisp_Object lbeg, lend, entry;
-  struct buffer *obuf = current_buffer, *buf = XBUFFER (buffer);
+  struct buffer *buf = XBUFFER (buffer);
 
   if (EQ (BVAR (buf, undo_list), Qt))
     return;
@@ -243,11 +238,6 @@ record_property_change (ptrdiff_t beg, ptrdiff_t length,
   if (NILP (pending_boundary))
     pending_boundary = Fcons (Qnil, Qnil);
 
-  /* Switch temporarily to the buffer that was changed.  */
-  set_buffer_internal (buf);
-
-  run_undoable_change ();
-
   if (MODIFF <= SAVE_MODIFF)
     record_first_change ();
 
@@ -256,9 +246,6 @@ record_property_change (ptrdiff_t beg, ptrdiff_t length,
   entry = Fcons (Qnil, Fcons (prop, Fcons (value, Fcons (lbeg, lend))));
   bset_undo_list (current_buffer,
                  Fcons (entry, BVAR (current_buffer, undo_list)));
-
-  /* Reset the buffer */
-  set_buffer_internal (obuf);
 }
 
 DEFUN ("undo-boundary", Fundo_boundary, Sundo_boundary, 0, 0, 0,
@@ -286,10 +273,11 @@ but another undo command will undo to the previous 
boundary.  */)
        bset_undo_list (current_buffer,
                        Fcons (Qnil, BVAR (current_buffer, undo_list)));
     }
-  last_boundary_position = PT;
-  last_boundary_buffer = current_buffer;
 
   Fset (Qundo_auto__last_boundary_cause, Qexplicit);
+  point_before_last_command_or_undo = PT;
+  buffer_before_last_command_or_undo = current_buffer;
+
   return Qnil;
 }
 
@@ -432,7 +420,6 @@ void
 syms_of_undo (void)
 {
   DEFSYM (Qinhibit_read_only, "inhibit-read-only");
-  DEFSYM (Qundo_auto__undoable_change, "undo-auto--undoable-change");
   DEFSYM (Qundo_auto__last_boundary_cause, "undo-auto--last-boundary-cause");
   DEFSYM (Qexplicit, "explicit");
 
@@ -442,8 +429,6 @@ syms_of_undo (void)
   pending_boundary = Qnil;
   staticpro (&pending_boundary);
 
-  last_boundary_buffer = NULL;
-
   defsubr (&Sundo_boundary);
 
   DEFVAR_INT ("undo-limit", undo_limit,
diff --git a/src/unexelf.c b/src/unexelf.c
index c10c7f2..03e6daf 100644
--- a/src/unexelf.c
+++ b/src/unexelf.c
@@ -247,7 +247,7 @@ unexec (const char *new_name, const char *old_name)
 
   ElfW (Phdr) *old_bss_seg, *new_bss_seg;
   ElfW (Addr) old_bss_addr, new_bss_addr;
-  ElfW (Word) old_bss_size, new_data2_size;
+  ElfW (Word) old_bss_size, bss_size_growth, new_data2_size;
   ElfW (Off) old_bss_offset, new_data2_offset;
 
   ptrdiff_t n;
@@ -331,7 +331,11 @@ unexec (const char *new_name, const char *old_name)
 
   new_break = sbrk (0);
   new_bss_addr = (ElfW (Addr)) new_break;
-  new_data2_size = new_bss_addr - old_bss_addr;
+  bss_size_growth = new_bss_addr - old_bss_addr;
+  new_data2_size = bss_size_growth;
+  new_data2_size += alignof (ElfW (Shdr)) - 1;
+  new_data2_size -= new_data2_size % alignof (ElfW (Shdr));
+
   new_data2_offset = old_bss_offset;
 
 #ifdef UNEXELF_DEBUG
@@ -399,7 +403,8 @@ unexec (const char *new_name, const char *old_name)
   new_bss_seg->p_memsz = new_bss_seg->p_filesz;
 
   /* Copy over what we have in memory now for the bss area. */
-  memcpy (new_base + new_data2_offset, (caddr_t) old_bss_addr, new_data2_size);
+  memcpy (new_base + new_data2_offset, (caddr_t) old_bss_addr,
+         bss_size_growth);
 
   /* Walk through all section headers, copying data and updating.  */
   for (n = 1; n < old_file_h->e_shnum; n++)
diff --git a/src/w32.c b/src/w32.c
index 15cfd92..9b1d94d 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -7432,7 +7432,7 @@ sys_socket (int af, int type, int protocol)
   if (winsock_lib == NULL)
     {
       errno = ENETDOWN;
-      return INVALID_SOCKET;
+      return -1;
     }
 
   check_errno ();
@@ -9270,8 +9270,10 @@ maybe_load_unicows_dll (void)
             pointers, and assign the correct addresses to these
             pointers at program startup (see emacs.c, which calls
             this function early on).  */
-         pMultiByteToWideChar = GetProcAddress (ret, "MultiByteToWideChar");
-         pWideCharToMultiByte = GetProcAddress (ret, "WideCharToMultiByte");
+         pMultiByteToWideChar =
+           (MultiByteToWideChar_Proc)GetProcAddress (ret, 
"MultiByteToWideChar");
+         pWideCharToMultiByte =
+           (WideCharToMultiByte_Proc)GetProcAddress (ret, 
"WideCharToMultiByte");
          return ret;
        }
       else
@@ -9379,6 +9381,11 @@ globals_of_w32 (void)
     w32_unicode_filenames = 0;
   else
     w32_unicode_filenames = 1;
+
+#ifdef HAVE_MODULES
+  extern void dynlib_reset_last_error (void);
+  dynlib_reset_last_error ();
+#endif
 }
 
 /* For make-serial-process  */
diff --git a/src/w32.h b/src/w32.h
index 2c71150..1efd562 100644
--- a/src/w32.h
+++ b/src/w32.h
@@ -179,8 +179,10 @@ extern int _sys_wait_connect (int fd);
 
 extern HMODULE w32_delayed_load (Lisp_Object);
 
-extern int (WINAPI *pMultiByteToWideChar)(UINT,DWORD,LPCSTR,int,LPWSTR,int);
-extern int (WINAPI 
*pWideCharToMultiByte)(UINT,DWORD,LPCWSTR,int,LPSTR,int,LPCSTR,LPBOOL);
+typedef int (WINAPI 
*MultiByteToWideChar_Proc)(UINT,DWORD,LPCSTR,int,LPWSTR,int);
+typedef int (WINAPI 
*WideCharToMultiByte_Proc)(UINT,DWORD,LPCWSTR,int,LPSTR,int,LPCSTR,LPBOOL);
+extern MultiByteToWideChar_Proc pMultiByteToWideChar;
+extern WideCharToMultiByte_Proc pWideCharToMultiByte;
 
 extern void init_environment (char **);
 extern void check_windows_init_file (void);
diff --git a/src/w32console.c b/src/w32console.c
index ec54f83..7fffabf 100644
--- a/src/w32console.c
+++ b/src/w32console.c
@@ -757,13 +757,8 @@ initialize_w32_display (struct terminal *term, int *width, 
int *height)
   else
     w32_console_unicode_input = 0;
 
-  /* This is needed by w32notify.c:send_notifications.  */
-  dwMainThreadId = GetCurrentThreadId ();
-
   /* Setup w32_display_info structure for this frame. */
-
   w32_initialize_display_info (build_string ("Console"));
-
 }
 
 
diff --git a/src/w32fns.c b/src/w32fns.c
index f3391cb..c1d9bff 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -1666,10 +1666,7 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object 
value, Lisp_Object oldval)
   FRAME_MENU_BAR_LINES (f) = 0;
   FRAME_MENU_BAR_HEIGHT (f) = 0;
   if (nlines)
-    {
-      FRAME_EXTERNAL_MENU_BAR (f) = 1;
-      windows_or_buffers_changed = 23;
-    }
+    FRAME_EXTERNAL_MENU_BAR (f) = 1;
   else
     {
       if (FRAME_EXTERNAL_MENU_BAR (f) == 1)
@@ -4620,8 +4617,7 @@ my_create_tip_window (struct frame *f)
   rect.right = FRAME_PIXEL_WIDTH (f);
   rect.bottom = FRAME_PIXEL_HEIGHT (f);
 
-  AdjustWindowRect (&rect, f->output_data.w32->dwStyle,
-                   FRAME_EXTERNAL_MENU_BAR (f));
+  AdjustWindowRect (&rect, f->output_data.w32->dwStyle, false);
 
   tip_window = FRAME_W32_WINDOW (f)
     = CreateWindow (EMACS_CLASS,
@@ -6381,7 +6377,7 @@ compute_tip_xy (struct frame *f,
   if (INTEGERP (left))
     *root_x = XINT (left);
   else if (INTEGERP (right))
-    *root_y = XINT (right) - width;
+    *root_x = XINT (right) - width;
   else if (*root_x + XINT (dx) <= min_x)
     *root_x = 0; /* Can happen for negative dx */
   else if (*root_x + XINT (dx) + width <= max_x)
@@ -6681,8 +6677,7 @@ Text larger than the specified size is clipped.  */)
     rect.left = rect.top = 0;
     rect.right = width;
     rect.bottom = height;
-    AdjustWindowRect (&rect, f->output_data.w32->dwStyle,
-                     FRAME_EXTERNAL_MENU_BAR (f));
+    AdjustWindowRect (&rect, f->output_data.w32->dwStyle, false);
 
     /* Position and size tooltip, and put it in the topmost group.
        The add-on of FRAME_COLUMN_WIDTH to the 5th argument is a
@@ -8098,11 +8093,22 @@ The coordinates X and Y are interpreted in pixels 
relative to a position
 (0, 0) of the selected frame's display.  */)
   (Lisp_Object x, Lisp_Object y)
 {
+  UINT trail_num = 0;
+  BOOL ret = false;
+
   CHECK_TYPE_RANGED_INTEGER (int, x);
   CHECK_TYPE_RANGED_INTEGER (int, y);
 
   block_input ();
+  /* When "mouse trails" are in effect, moving the mouse cursor
+     sometimes leaves behind an annoying "ghost" of the pointer.
+     Avoid that by momentarily switching off mouse trails.  */
+  if (os_subtype == OS_NT
+      && w32_major_version + w32_minor_version >= 6)
+    ret = SystemParametersInfo (SPI_GETMOUSETRAILS, 0, &trail_num, 0);
   SetCursorPos (XINT (x), XINT (y));
+  if (ret)
+    SystemParametersInfo (SPI_SETMOUSETRAILS, trail_num, NULL, 0);
   unblock_input ();
 
   return Qnil;
@@ -9925,10 +9931,6 @@ globals_of_w32fns (void)
   InitCommonControls ();
 
   syms_of_w32uniscribe ();
-
-  /* Needed for recovery from C stack overflows in batch mode.  */
-  if (noninteractive)
-    dwMainThreadId = GetCurrentThreadId ();
 }
 
 #ifdef NTGUI_UNICODE
diff --git a/src/w32menu.c b/src/w32menu.c
index 6af69f4..964b965 100644
--- a/src/w32menu.c
+++ b/src/w32menu.c
@@ -494,7 +494,10 @@ set_frame_menubar (struct frame *f, bool first_time, bool 
deep_p)
     /* Force the window size to be recomputed so that the frame's text
        area remains the same, if menubar has just been created.  */
     if (old_widget == NULL)
-      adjust_frame_size (f, -1, -1, 2, false, Qmenu_bar_lines);
+      {
+       windows_or_buffers_changed = 23;
+       adjust_frame_size (f, -1, -1, 2, false, Qmenu_bar_lines);
+      }
   }
 
   unblock_input ();
diff --git a/src/w32term.c b/src/w32term.c
index f764e25..60d64f7 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -23,6 +23,7 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 #include "lisp.h"
 #include "blockinput.h"
 #include "w32term.h"
+#include "w32common.h" /* for OS version info */
 
 #include <ctype.h>
 #include <errno.h>
@@ -6115,9 +6116,22 @@ x_set_window_size (struct frame *f, bool change_gravity,
   int pixelwidth, pixelheight;
   Lisp_Object fullscreen = get_frame_param (f, Qfullscreen);
   RECT rect;
+  MENUBARINFO info;
+  int menu_bar_height;
 
   block_input ();
 
+  /* Get the height of the menu bar here.  It's used below to detect
+     whether the menu bar is wrapped.  It's also used to specify the
+     third argument for AdjustWindowRect.  FRAME_EXTERNAL_MENU_BAR which
+     has been used before for that reason is unreliable because it only
+     specifies whether we _want_ a menu bar for this frame and not
+     whether this frame _has_ a menu bar.  See bug#22105.  */
+  info.cbSize = sizeof (info);
+  info.rcBar.top = info.rcBar.bottom = 0;
+  GetMenuBarInfo (FRAME_W32_WINDOW (f), 0xFFFFFFFD, 0, &info);
+  menu_bar_height = info.rcBar.bottom - info.rcBar.top;
+
   if (pixelwise)
     {
       pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width);
@@ -6135,17 +6149,11 @@ x_set_window_size (struct frame *f, bool change_gravity,
         height of the frame then the wrapped menu bar lines are not
         accounted for (Bug#15174 and Bug#18720).  Here we add these
         extra lines to the frame height.  */
-      MENUBARINFO info;
       int default_menu_bar_height;
-      int menu_bar_height;
 
       /* Why is (apparently) SM_CYMENUSIZE needed here instead of
         SM_CYMENU ??  */
       default_menu_bar_height = GetSystemMetrics (SM_CYMENUSIZE);
-      info.cbSize = sizeof (info);
-      info.rcBar.top = info.rcBar.bottom = 0;
-      GetMenuBarInfo (FRAME_W32_WINDOW (f), 0xFFFFFFFD, 0, &info);
-      menu_bar_height = info.rcBar.bottom - info.rcBar.top;
 
       if ((default_menu_bar_height > 0)
          && (menu_bar_height > default_menu_bar_height)
@@ -6160,8 +6168,7 @@ x_set_window_size (struct frame *f, bool change_gravity,
   rect.right = pixelwidth;
   rect.bottom = pixelheight;
 
-  AdjustWindowRect (&rect, f->output_data.w32->dwStyle,
-                   FRAME_EXTERNAL_MENU_BAR (f));
+  AdjustWindowRect (&rect, f->output_data.w32->dwStyle, menu_bar_height > 0);
 
   if (!(f->after_make_frame)
       && !(f->want_fullscreen & FULLSCREEN_WAIT)
@@ -6231,6 +6238,8 @@ x_set_window_size (struct frame *f, bool change_gravity,
 void
 frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y)
 {
+  UINT trail_num = 0;
+  BOOL ret = false;
   RECT rect;
   POINT pt;
 
@@ -6241,7 +6250,15 @@ frame_set_mouse_pixel_position (struct frame *f, int 
pix_x, int pix_y)
   pt.y = rect.top + pix_y;
   ClientToScreen (FRAME_W32_WINDOW (f), &pt);
 
+  /* When "mouse trails" are in effect, moving the mouse cursor
+     sometimes leaves behind an annoying "ghost" of the pointer.
+     Avoid that by momentarily switching off mouse trails.  */
+  if (os_subtype == OS_NT
+      && w32_major_version + w32_minor_version >= 6)
+    ret = SystemParametersInfo (SPI_GETMOUSETRAILS, 0, &trail_num, 0);
   SetCursorPos (pt.x, pt.y);
+  if (ret)
+    SystemParametersInfo (SPI_SETMOUSETRAILS, trail_num, NULL, 0);
 
   unblock_input ();
 }
@@ -6925,6 +6942,15 @@ x_delete_display (struct w32_display_info *dpyinfo)
 
 /* Set up use of W32.  */
 
+void
+w32_init_main_thread (void)
+{
+  dwMainThreadId = GetCurrentThreadId ();
+  DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
+                  GetCurrentProcess (), &hMainThread, 0, TRUE,
+                  DUPLICATE_SAME_ACCESS);
+}
+
 DWORD WINAPI w32_msg_worker (void * arg);
 
 static void
@@ -6985,10 +7011,6 @@ w32_initialize (void)
      terminates */
   init_crit ();
 
-  dwMainThreadId = GetCurrentThreadId ();
-  DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
-                  GetCurrentProcess (), &hMainThread, 0, TRUE, 
DUPLICATE_SAME_ACCESS);
-
   /* Wait for thread to start */
   {
     MSG msg;
diff --git a/src/w32term.h b/src/w32term.h
index 467da10..3377b53 100644
--- a/src/w32term.h
+++ b/src/w32term.h
@@ -855,6 +855,8 @@ extern void globals_of_w32menu (void);
 extern void globals_of_w32fns (void);
 extern void globals_of_w32notify (void);
 
+extern void w32_init_main_thread (void);
+
 #ifdef CYGWIN
 extern int w32_message_fd;
 #endif /* CYGWIN */
diff --git a/src/window.c b/src/window.c
index bd71ca8..edbb69a 100644
--- a/src/window.c
+++ b/src/window.c
@@ -4067,37 +4067,6 @@ resize_frame_windows (struct frame *f, int size, bool 
horflag, bool pixelwise)
            {
              window_resize_apply (r, horflag);
              window_pixel_to_total (r->frame, horflag ? Qt : Qnil);
-#if false /* Let's try without safe sizes and/or killing other windows.  */
-           }
-         else
-           {
-             /* Finally, try with "safe" minimum sizes.  */
-             resize_root_window (root, delta, horflag ? Qt : Qnil, Qsafe,
-                                 pixelwise ? Qt : Qnil);
-             if (window_resize_check (r, horflag)
-                 && new_pixel_size == XINT (r->new_pixel))
-               {
-                 window_resize_apply (r, horflag);
-                 window_pixel_to_total (r->frame, horflag ? Qt : Qnil);
-               }
-             else
-               {
-                 /* We lost.  Delete all windows but the frame's
-                    selected one.  */
-                 root = f->selected_window;
-                 Fdelete_other_windows_internal (root, Qnil);
-                 if (horflag)
-                   {
-                     XWINDOW (root)->total_cols = new_size;
-                     XWINDOW (root)->pixel_width = new_pixel_size;
-                   }
-                 else
-                   {
-                     XWINDOW (root)->total_lines = new_size;
-                     XWINDOW (root)->pixel_height = new_pixel_size;
-                   }
-               }
-#endif /* false */
            }
        }
     }
@@ -4120,6 +4089,7 @@ resize_frame_windows (struct frame *f, int size, bool 
horflag, bool pixelwise)
        }
     }
 
+  FRAME_WINDOW_SIZES_CHANGED (f) = true;
   fset_redisplay (f);
 }
 
@@ -4561,6 +4531,7 @@ grow_mini_window (struct window *w, int delta, bool 
pixelwise)
          /* Enforce full redisplay of the frame.  */
          /* FIXME: Shouldn't window--resize-root-window-vertically do it?  */
          fset_redisplay (f);
+         FRAME_WINDOW_SIZES_CHANGED (f) = true;
          adjust_frame_glyphs (f);
          unblock_input ();
        }
@@ -4600,6 +4571,7 @@ shrink_mini_window (struct window *w, bool pixelwise)
          /* Enforce full redisplay of the frame.  */
          /* FIXME: Shouldn't window--resize-root-window-vertically do it?  */
          fset_redisplay (f);
+         FRAME_WINDOW_SIZES_CHANGED (f) = true;
          adjust_frame_glyphs (f);
          unblock_input ();
        }
diff --git a/src/xdisp.c b/src/xdisp.c
index bc149b8..242fc49 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -10784,6 +10784,9 @@ display_echo_area (struct window *w)
      reset the echo_area_buffer in question to nil at the end because
      with_echo_area_buffer will sets it to an empty buffer.  */
   bool i = display_last_displayed_message_p;
+  /* According to the C99, C11 and C++11 standards, the integral value
+     of a "bool" is always 0 or 1, so this array access is safe here,
+     if oddly typed. */
   no_message_p = NILP (echo_area_buffer[i]);
 
   window_height_changed_p
@@ -13587,6 +13590,32 @@ redisplay_internal (void)
     {
       echo_area_display (false);
 
+      /* If echo_area_display resizes the mini-window, the redisplay and
+        window_sizes_changed flags of the selected frame are set, but
+        it's too late for the hooks in window-size-change-functions,
+        which have been examined already in prepare_menu_bars.  So in
+        that case we call the hooks here only for the selected frame.  */
+      if (sf->redisplay && FRAME_WINDOW_SIZES_CHANGED (sf))
+       {
+         Lisp_Object functions;
+         ptrdiff_t count1 = SPECPDL_INDEX ();
+
+         record_unwind_save_match_data ();
+
+         /* Clear flag first in case we get an error below.  */
+         FRAME_WINDOW_SIZES_CHANGED (sf) = false;
+         functions = Vwindow_size_change_functions;
+
+         while (CONSP (functions))
+           {
+             if (!EQ (XCAR (functions), Qt))
+               call1 (XCAR (functions), selected_frame);
+             functions = XCDR (functions);
+           }
+
+         unbind_to (count1, Qnil);
+       }
+
       if (message_cleared_p)
        update_miniwindow_p = true;
 
@@ -13603,6 +13632,27 @@ redisplay_internal (void)
           && (current_buffer->clip_changed || window_outdated (w))
           && resize_mini_window (w, false))
     {
+      if (sf->redisplay)
+       {
+         Lisp_Object functions;
+         ptrdiff_t count1 = SPECPDL_INDEX ();
+
+         record_unwind_save_match_data ();
+
+         /* Clear flag first in case we get an error below.  */
+         FRAME_WINDOW_SIZES_CHANGED (sf) = false;
+         functions = Vwindow_size_change_functions;
+
+         while (CONSP (functions))
+           {
+             if (!EQ (XCAR (functions), Qt))
+               call1 (XCAR (functions), selected_frame);
+             functions = XCDR (functions);
+           }
+
+         unbind_to (count1, Qnil);
+       }
+
       /* Resized active mini-window to fit the size of what it is
          showing if its contents might have changed.  */
       must_finish = true;
@@ -16302,9 +16352,33 @@ redisplay_window (Lisp_Object window, bool 
just_this_one_p)
       if (w->cursor.vpos < 0)
        {
          /* If point does not appear, try to move point so it does
-            appear. The desired matrix has been built above, so we
-            can use it here.  */
-         new_vpos = window_box_height (w) / 2;
+            appear.  The desired matrix has been built above, so we
+            can use it here.  First see if point is in invisible
+            text, and if so, move it to the first visible buffer
+            position past that.  */
+         struct glyph_row *r = NULL;
+         Lisp_Object invprop =
+           get_char_property_and_overlay (make_number (PT), Qinvisible,
+                                          Qnil, NULL);
+
+         if (TEXT_PROP_MEANS_INVISIBLE (invprop) != 0)
+           {
+             ptrdiff_t alt_pt;
+             Lisp_Object invprop_end =
+               Fnext_single_char_property_change (make_number (PT), Qinvisible,
+                                                  Qnil, Qnil);
+
+             if (NATNUMP (invprop_end))
+               alt_pt = XFASTINT (invprop_end);
+             else
+               alt_pt = ZV;
+             r = row_containing_pos (w, alt_pt, w->desired_matrix->rows,
+                                     NULL, 0);
+           }
+         if (r)
+           new_vpos = MATRIX_ROW_BOTTOM_Y (r);
+         else  /* Give up and just move to the middle of the window.  */
+           new_vpos = window_box_height (w) / 2;
        }
 
       if (!cursor_row_fully_visible_p (w, false, false))
@@ -16721,6 +16795,7 @@ redisplay_window (Lisp_Object window, bool 
just_this_one_p)
   startp = run_window_scroll_functions (window, it.current.pos);
 
   /* Redisplay the window.  */
+  bool use_desired_matrix = false;
   if (!current_matrix_up_to_date_p
       || windows_or_buffers_changed
       || f->cursor_type_changed
@@ -16731,7 +16806,7 @@ redisplay_window (Lisp_Object window, bool 
just_this_one_p)
       || MINI_WINDOW_P (w)
       || !(used_current_matrix_p
           = try_window_reusing_current_matrix (w)))
-    try_window (window, startp, 0);
+    use_desired_matrix = (try_window (window, startp, 0) == 1);
 
   /* If new fonts have been loaded (due to fontsets), give up.  We
      have to start a new redisplay since we need to re-adjust glyph
@@ -16771,9 +16846,15 @@ redisplay_window (Lisp_Object window, bool 
just_this_one_p)
      and similar ones.  */
   if (w->cursor.vpos < 0)
     {
+      /* Prefer the desired matrix to the current matrix, if possible,
+        in the fallback calculations below.  This is because using
+        the current matrix might completely goof, e.g. if its first
+        row is after point.  */
+      struct glyph_matrix *matrix =
+       use_desired_matrix ? w->desired_matrix : w->current_matrix;
       /* First, try locating the proper glyph row for PT.  */
       struct glyph_row *row =
-       row_containing_pos (w, PT, w->current_matrix->rows, NULL, 0);
+       row_containing_pos (w, PT, matrix->rows, NULL, 0);
 
       /* Sometimes point is at the beginning of invisible text that is
         before the 1st character displayed in the row.  In that case,
@@ -16798,8 +16879,7 @@ redisplay_window (Lisp_Object window, bool 
just_this_one_p)
                alt_pos = XFASTINT (invis_end);
              else
                alt_pos = ZV;
-             row = row_containing_pos (w, alt_pos, w->current_matrix->rows,
-                                       NULL, 0);
+             row = row_containing_pos (w, alt_pos, matrix->rows, NULL, 0);
            }
        }
       /* Finally, fall back on the first row of the window after the
@@ -16807,11 +16887,11 @@ redisplay_window (Lisp_Object window, bool 
just_this_one_p)
         displaying the cursor at all.  */
       if (!row)
        {
-         row = w->current_matrix->rows;
+         row = matrix->rows;
          if (row->mode_line_p)
            ++row;
        }
-      set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0);
+      set_cursor_from_row (w, row, matrix, 0, 0, 0, 0);
     }
 
   if (!cursor_row_fully_visible_p (w, false, false))
@@ -17796,7 +17876,7 @@ row_containing_pos (struct window *w, ptrdiff_t charpos,
   while (true)
     {
       /* Give up if we have gone too far.  */
-      if (end && row >= end)
+      if ((end && row >= end) || !row->enabled_p)
        return NULL;
       /* This formerly returned if they were equal.
         I think that both quantities are of a "last plus one" type;
@@ -31370,11 +31450,13 @@ the buffer when it becomes large.  */);
   Vmessage_log_max = make_number (1000);
 
   DEFVAR_LISP ("window-size-change-functions", Vwindow_size_change_functions,
-    doc: /* Functions called before redisplay, if window sizes have changed.
+    doc: /* Functions called during redisplay, if window sizes have changed.
 The value should be a list of functions that take one argument.
-Just before redisplay, for each frame, if any of its windows have changed
-size since the last redisplay, or have been split or deleted,
-all the functions in the list are called, with the frame as argument.  */);
+During the first part of redisplay, for each frame, if any of its windows
+have changed size since the last redisplay, or have been split or deleted,
+all the functions in the list are called, with the frame as argument.
+If redisplay decides to resize the minibuffer window, it calls these
+functions on behalf of that as well.  */);
   Vwindow_size_change_functions = Qnil;
 
   DEFVAR_LISP ("window-scroll-functions", Vwindow_scroll_functions,
diff --git a/src/xfns.c b/src/xfns.c
index 313ac52..3f95f7b 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -5582,6 +5582,8 @@ x_create_tip_frame (struct x_display_info *dpyinfo,
                       "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN);
   x_default_parameter (f, parms, Qcursor_type, Qbox,
                       "cursorType", "CursorType", RES_TYPE_SYMBOL);
+  x_default_parameter (f, parms, Qalpha, Qnil,
+                      "alpha", "Alpha", RES_TYPE_NUMBER);
 
   /* Dimensions, especially FRAME_LINES (f), must be done via 
change_frame_size.
      Change will not be effected unless different from the current
@@ -5719,7 +5721,7 @@ compute_tip_xy (struct frame *f, Lisp_Object parms, 
Lisp_Object dx, Lisp_Object
   if (INTEGERP (left))
     *root_x = XINT (left);
   else if (INTEGERP (right))
-    *root_y = XINT (right) - width;
+    *root_x = XINT (right) - width;
   else if (*root_x + XINT (dx) <= 0)
     *root_x = 0; /* Can happen for negative dx */
   else if (*root_x + XINT (dx) + width
diff --git a/test/automated/data/package/macro-problem-package-1.0/macro-aux.el 
b/test/automated/data/package/macro-problem-package-1.0/macro-aux.el
new file mode 100644
index 0000000..f432322
--- /dev/null
+++ b/test/automated/data/package/macro-problem-package-1.0/macro-aux.el
@@ -0,0 +1,12 @@
+;;; macro-aux.el --- laksd                                  -*- 
lexical-binding: t; -*-
+
+;; Author: Artur Malabarba <address@hidden>
+
+;;; Code:
+
+(defun macro-aux-1 ( &rest forms)
+  "Description"
+  `(progn ,@forms))
+
+(provide 'macro-aux)
+;;; macro-aux.el ends here
diff --git 
a/test/automated/data/package/macro-problem-package-1.0/macro-problem.el 
b/test/automated/data/package/macro-problem-package-1.0/macro-problem.el
new file mode 100644
index 0000000..0533b1b
--- /dev/null
+++ b/test/automated/data/package/macro-problem-package-1.0/macro-problem.el
@@ -0,0 +1,21 @@
+;;; macro-problem.el --- laksd                                  -*- 
lexical-binding: t; -*-
+
+;; Author: Artur Malabarba <address@hidden>
+;; Keywords: tools
+;; Version: 1.0
+
+;;; Code:
+
+(require 'macro-aux)
+
+(defmacro macro-problem-1 ( &rest forms)
+  "Description"
+  `(progn ,@forms))
+
+(defun macro-problem-func ()
+  ""
+  (macro-problem-1 'a 'b)
+  (macro-aux-1 'a 'b))
+
+(provide 'macro-problem)
+;;; macro-problem.el ends here
diff --git a/test/automated/data/package/macro-problem-package-2.0/macro-aux.el 
b/test/automated/data/package/macro-problem-package-2.0/macro-aux.el
new file mode 100644
index 0000000..6a55a40
--- /dev/null
+++ b/test/automated/data/package/macro-problem-package-2.0/macro-aux.el
@@ -0,0 +1,16 @@
+;;; macro-aux.el --- laksd                                  -*- 
lexical-binding: t; -*-
+
+;; Author: Artur Malabarba <address@hidden>
+
+;;; Code:
+
+(defmacro macro-aux-1 ( &rest forms)
+  "Description"
+  `(progn ,@forms))
+
+(defmacro macro-aux-3 ( &rest _)
+  "Description"
+  90)
+
+(provide 'macro-aux)
+;;; macro-aux.el ends here
diff --git 
a/test/automated/data/package/macro-problem-package-2.0/macro-problem.el 
b/test/automated/data/package/macro-problem-package-2.0/macro-problem.el
new file mode 100644
index 0000000..cad4ed9
--- /dev/null
+++ b/test/automated/data/package/macro-problem-package-2.0/macro-problem.el
@@ -0,0 +1,30 @@
+;;; macro-problem.el --- laksd                                  -*- 
lexical-binding: t; -*-
+
+;; Author: Artur Malabarba <address@hidden>
+;; Keywords: tools
+;; Version: 2.0
+
+;;; Code:
+
+(require 'macro-aux)
+
+(defmacro macro-problem-1 ( &rest forms)
+  "Description"
+  `(progn ,(cadr (car forms))))
+
+
+(defun macro-problem-func ()
+  ""
+  (list (macro-problem-1 '1 'b)
+        (macro-aux-1 'a 'b)))
+
+(defmacro macro-problem-3 (&rest _)
+  "Description"
+  10)
+
+(defun macro-problem-10-and-90 ()
+  ""
+  (list (macro-problem-3 haha) (macro-aux-3 hehe)))
+
+(provide 'macro-problem)
+;;; macro-problem.el ends here
diff --git a/test/lisp/url/url-expand-tests.el 
b/test/automated/url-expand-tests.el
similarity index 100%
rename from test/lisp/url/url-expand-tests.el
rename to test/automated/url-expand-tests.el
diff --git a/test/automated/url-parse-tests.el 
b/test/automated/url-parse-tests.el
new file mode 100644
index 0000000..443034a
--- /dev/null
+++ b/test/automated/url-parse-tests.el
@@ -0,0 +1,167 @@
+;;; url-parse-tests.el --- Test suite for URI/URL parsing.
+
+;; Copyright (C) 2012-2015 Free Software Foundation, Inc.
+
+;; Author: Alain Schneble <address@hidden>
+;; Version: 1.0
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Test cases covering generic URI syntax as described in RFC3986,
+;; section 3. Syntax Components and 4. Usage. See also appendix
+;; A. Collected ABNF for URI, as the example given here are all
+;; productions of this grammar.
+
+;; Each tests parses a given URI string - whether relative or absolute -
+;; using `url-generic-parse-url' and compares the constructed
+;; URL-struct (Actual) against a manually `url-parse-make-urlobj'-
+;; constructed URL-struct (Expected).
+
+;;; Code:
+
+(require 'url-parse)
+(require 'ert)
+
+(ert-deftest url-generic-parse-url/generic-uri-examples ()
+  "RFC 3986, section 1.1.2. Examples / Example illustrating several URI 
schemes and variations in their common syntax components"
+  (should (equal (url-generic-parse-url "ftp://ftp.is.co.za/rfc/rfc1808.txt";) 
(url-parse-make-urlobj "ftp" nil nil "ftp.is.co.za" nil "/rfc/rfc1808.txt" nil 
nil t)))
+  (should (equal (url-generic-parse-url "http://www.ietf.org/rfc/rfc2396.txt";) 
(url-parse-make-urlobj "http" nil nil "www.ietf.org" nil "/rfc/rfc2396.txt" nil 
nil t)))
+  (should (equal (url-generic-parse-url 
"ldap://[2001:db8::7]/c=GB?objectClass?one";) (url-parse-make-urlobj "ldap" nil 
nil "[2001:db8::7]" nil "/c=GB?objectClass?one" nil nil t)))
+  (should (equal (url-generic-parse-url "mailto:address@hidden";) 
(url-parse-make-urlobj "mailto" nil nil nil nil "address@hidden" nil nil nil)))
+  (should (equal (url-generic-parse-url 
"news:comp.infosystems.www.servers.unix";) (url-parse-make-urlobj "news" nil nil 
nil nil "comp.infosystems.www.servers.unix" nil nil nil)))
+  (should (equal (url-generic-parse-url "tel:+1-816-555-1212") 
(url-parse-make-urlobj "tel" nil nil nil nil "+1-816-555-1212" nil nil nil)))
+  (should (equal (url-generic-parse-url "telnet://192.0.2.16:80/") 
(url-parse-make-urlobj "telnet" nil nil "192.0.2.16" 80 "/" nil nil t)))
+  (should (equal (url-generic-parse-url 
"urn:oasis:names:specification:docbook:dtd:xml:4.1.2") (url-parse-make-urlobj 
"urn" nil nil nil nil "oasis:names:specification:docbook:dtd:xml:4.1.2" nil nil 
nil))))
+
+(ert-deftest url-generic-parse-url/generic-uri ()
+  "RFC 3986, section 3. Syntax Components / generic URI syntax"
+  ;; empty path
+  (should (equal (url-generic-parse-url "http://host#";) (url-parse-make-urlobj 
"http" nil nil "host" nil "" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host?#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "?" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host?query#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "?query" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host?#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "?" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host?query#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "?query" "fragment" nil t)))
+  ;; absolute path /
+  (should (equal (url-generic-parse-url "http://host/#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host/?#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/?" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/?query#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/?query" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/?#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/?" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host/?query#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/?query" "fragment" nil t)))
+  ;; absolute path /foo
+  (should (equal (url-generic-parse-url "http://host/foo#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo?#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo?" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo?query#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo?query" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo?#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo?" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo?query#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo?query" "fragment" nil 
t)))
+  ;; absolute path /foo/
+  (should (equal (url-generic-parse-url "http://host/foo/#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/?#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/?" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/?query#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/?query" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/?#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/?" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/?query#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/?query" "fragment" nil 
t)))
+  ;; absolute path /foo/bar
+  (should (equal (url-generic-parse-url "http://host/foo/bar#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar?#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar?" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar?query#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar?query" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar?#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar?" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar?query#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar?query" "fragment" 
nil t)))
+  ;; absolute path /foo/bar/
+  (should (equal (url-generic-parse-url "http://host/foo/bar/#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar/" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar/#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar/" "fragment" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar/?#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar/?" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar/?query#";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar/?query" "" nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar/?#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar/?" "fragment" nil 
t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar/?query#fragment";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar/?query" "fragment" 
nil t)))
+  ;; for more examples of URIs without fragments, see tests covering section 
4.3. Absolute URI
+  )
+
+(ert-deftest url-generic-parse-url/network-path-reference ()
+  "RFC 3986, section 4.2. Relative Reference / network-path reference: a 
relative reference that begins with two slash characters"
+  (should (equal (url-generic-parse-url "//host") (url-parse-make-urlobj nil 
nil nil "host" nil "" nil nil t)))
+  (should (equal (url-generic-parse-url "//host/") (url-parse-make-urlobj nil 
nil nil "host" nil "/" nil nil t)))
+  (should (equal (url-generic-parse-url "//host/foo") (url-parse-make-urlobj 
nil nil nil "host" nil "/foo" nil nil t)))
+  (should (equal (url-generic-parse-url "//host/foo/bar") 
(url-parse-make-urlobj nil nil nil "host" nil "/foo/bar" nil nil t)))
+  (should (equal (url-generic-parse-url "//host/foo/bar/") 
(url-parse-make-urlobj nil nil nil "host" nil "/foo/bar/" nil nil t))))
+
+(ert-deftest url-generic-parse-url/absolute-path-reference ()
+  "RFC 3986, section 4.2. Relative Reference / absolute-path reference: a 
relative reference that begins with a single slash character"
+  (should (equal (url-generic-parse-url "/") (url-parse-make-urlobj nil nil 
nil nil nil "/" nil nil nil)))
+  (should (equal (url-generic-parse-url "/foo") (url-parse-make-urlobj nil nil 
nil nil nil "/foo" nil nil nil)))
+  (should (equal (url-generic-parse-url "/foo/bar") (url-parse-make-urlobj nil 
nil nil nil nil "/foo/bar" nil nil nil)))
+  (should (equal (url-generic-parse-url "/foo/bar/") (url-parse-make-urlobj 
nil nil nil nil nil "/foo/bar/" nil nil nil)))
+  (should (equal (url-generic-parse-url "/foo/bar#") (url-parse-make-urlobj 
nil nil nil nil nil "/foo/bar" "" nil nil)))
+  (should (equal (url-generic-parse-url "/foo/bar/#") (url-parse-make-urlobj 
nil nil nil nil nil "/foo/bar/" "" nil nil))))
+
+(ert-deftest url-generic-parse-url/relative-path-reference ()
+  "RFC 3986, section 4.2. Relative Reference / relative-path reference: a 
relative reference that does not begin with a slash character"
+  (should (equal (url-generic-parse-url "foo") (url-parse-make-urlobj nil nil 
nil nil nil "foo" nil nil nil)))
+  (should (equal (url-generic-parse-url "foo/bar") (url-parse-make-urlobj nil 
nil nil nil nil "foo/bar" nil nil nil)))
+  (should (equal (url-generic-parse-url "foo/bar/") (url-parse-make-urlobj nil 
nil nil nil nil "foo/bar/" nil nil nil)))
+  (should (equal (url-generic-parse-url "./foo") (url-parse-make-urlobj nil 
nil nil nil nil "./foo" nil nil nil)))
+  (should (equal (url-generic-parse-url "./foo/bar") (url-parse-make-urlobj 
nil nil nil nil nil "./foo/bar" nil nil nil)))
+  (should (equal (url-generic-parse-url "./foo/bar/") (url-parse-make-urlobj 
nil nil nil nil nil "./foo/bar/" nil nil nil)))
+  (should (equal (url-generic-parse-url "../foo") (url-parse-make-urlobj nil 
nil nil nil nil "../foo" nil nil nil)))
+  (should (equal (url-generic-parse-url "../foo/bar") (url-parse-make-urlobj 
nil nil nil nil nil "../foo/bar" nil nil nil)))
+  (should (equal (url-generic-parse-url "../foo/bar/") (url-parse-make-urlobj 
nil nil nil nil nil "../foo/bar/" nil nil nil)))
+  (should (equal (url-generic-parse-url "./this:that") (url-parse-make-urlobj 
nil nil nil nil nil "./this:that" nil nil nil)))
+  ;; for more examples of relative-path references, see tests covering section 
4.4. Same-Document Reference
+  )
+
+(ert-deftest url-generic-parse-url/absolute-uri ()
+  "RFC 3986, section 4.3. Absolute URI / absolute URI: absolute form of a URI 
without a fragment identifier"
+  ;; empty path
+  (should (equal (url-generic-parse-url "http://host";) (url-parse-make-urlobj 
"http" nil nil "host" nil "" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host?";) (url-parse-make-urlobj 
"http" nil nil "host" nil "?" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host?query";) 
(url-parse-make-urlobj "http" nil nil "host" nil "?query" nil nil t)))
+  ;; absolute path /
+  (should (equal (url-generic-parse-url "http://host/";) (url-parse-make-urlobj 
"http" nil nil "host" nil "/" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host/?";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/?" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host/?query";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/?query" nil nil t)))
+  ;; absolute path /foo
+  (should (equal (url-generic-parse-url "http://host/foo";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo?";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo?" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo?query";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo?query" nil nil t)))
+  ;; absolute path /foo/
+  (should (equal (url-generic-parse-url "http://host/foo/";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/?";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/?" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/?query";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/?query" nil nil t)))
+  ;; absolute path /foo/bar
+  (should (equal (url-generic-parse-url "http://host/foo/bar";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar?";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar?" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar?query";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar?query" nil nil t)))
+  ;; absolute path /foo/bar/
+  (should (equal (url-generic-parse-url "http://host/foo/bar/";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar/" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar/?";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar/?" nil nil t)))
+  (should (equal (url-generic-parse-url "http://host/foo/bar/?query";) 
(url-parse-make-urlobj "http" nil nil "host" nil "/foo/bar/?query" nil nil t)))
+  ;; example mentioned in RFC3986, section 5.4. Reference Resolution Examples
+  (should (equal (url-generic-parse-url "http://a/b/c/d;p?q";) 
(url-parse-make-urlobj "http" nil nil "a" nil "/b/c/d;p?q" nil nil t))))
+
+(ert-deftest url-generic-parse-url/same-document-reference ()
+  "RFC 3986, section 4.4. Same-Document Reference / same-document reference: 
empty or number sign (\"#\") followed by a fragment identifier"
+  (should (equal (url-generic-parse-url "") (url-parse-make-urlobj nil nil nil 
nil nil "" nil nil nil)))
+  (should (equal (url-generic-parse-url "#") (url-parse-make-urlobj nil nil 
nil nil nil "" "" nil nil)))
+  (should (equal (url-generic-parse-url "#foo") (url-parse-make-urlobj nil nil 
nil nil nil "" "foo" nil nil))))
+
+(provide 'url-parse-tests)
+
+;;; url-parse-tests.el ends here
diff --git a/test/etags/lua-src/test.lua b/test/etags/lua-src/test.lua
new file mode 100644
index 0000000..405eb5f
--- /dev/null
+++ b/test/etags/lua-src/test.lua
@@ -0,0 +1,36 @@
+Rectangle = {}
+function Rectangle.getPos ()
+end
+
+Circle = {}
+function Circle.getPos ()
+end
+
+Cube = {}
+function Cube.data.getFoo ()
+end
+
+Square = {}
+function Square.something:Bar ()
+end
+
+-- Comment line
+  -- Indented comment line
+
+test = {}
+
+   function test.me_22a(one, two)
+       print"me_22a"
+   end
+   local function test.me22b (one)
+       print"me_22b"
+   end
+
+
+ test.i_123 = function  (x)
+       print"i_123"
+end
+
+
+test.me_12a(1,2)
+test.i_123(1)
diff --git a/test/etags/ruby-src/test.rb b/test/etags/ruby-src/test.rb
new file mode 100644
index 0000000..9254c5b
--- /dev/null
+++ b/test/etags/ruby-src/test.rb
@@ -0,0 +1,54 @@
+module ModuleExample
+    class ClassExample
+        def class_method
+            puts "in class_method"
+        end
+        def ClassExample.singleton_class_method
+            puts "in singleton_class_method"
+        end
+        def class_method_exclamation!
+            puts "in class_method_exclamation!"
+        end
+        def class_method_question?
+            puts "in class_method_question?"
+        end
+        def class_method_equals=
+            puts "in class_method_equals="
+        end
+        def `(command)
+            return "just testing a backquote override"
+        end
+        def +(y)
+            @x + y
+        end
+        def [](y)
+            @ary[y]
+        end
+        def []=(y, val)
+            @ary[y] = val
+        end
+        def <<(y)
+            @x << y
+        end
+        def ==(y)
+            @ary.length == y.ary.length
+        end
+        def <=(y)
+            '@ary.length < y.ary.length'
+        end
+        def <=>(y)
+            nil
+        end
+        def ===(y)
+            self == y
+        end
+    end
+    def module_method
+        puts "in module_method"
+    end
+    def ModuleExample.singleton_module_method
+        puts "in singleton_module_method"
+    end
+end
+
+ModuleExample::ClassExample.singleton_class_method
diff --git a/test/etags/ruby-src/test1.ruby b/test/etags/ruby-src/test1.ruby
new file mode 100644
index 0000000..43b1a14
--- /dev/null
+++ b/test/etags/ruby-src/test1.ruby
@@ -0,0 +1,7 @@
+class A
+ def a()
+  super(" do ")
+ end
+ def b()
+ end
+end
diff --git a/test/lisp/abbrev-tests.el b/test/lisp/abbrev-tests.el
index 17aea5d..37917ec 100644
--- a/test/lisp/abbrev-tests.el
+++ b/test/lisp/abbrev-tests.el
@@ -22,10 +22,21 @@
 
 ;;; Commentary:
 
+;; `kill-all-abbrevs-test' will remove all user *and* system abbrevs
+;; if called noninteractively with the init file loaded.
+
 ;;; Code:
 
 (require 'ert)
 (require 'abbrev)
+(require 'seq)
+
+;; set up test abbrev table and abbrev entry
+(defun setup-test-abbrev-table ()
+  (defvar ert-test-abbrevs nil)
+  (define-abbrev-table 'ert-test-abbrevs '(("a-e-t" "abbrev-ert-test")))
+  (abbrev-table-put ert-test-abbrevs :ert-test "ert-test-value")
+  ert-test-abbrevs)
 
 (ert-deftest abbrev-table-p-test ()
   (should-not (abbrev-table-p 42))
@@ -70,5 +81,47 @@
     (should (abbrev-table-p new-foo-abbrev-table)))
   (should-not (string-equal (buffer-name) "*Backtrace*")))
 
+(ert-deftest kill-all-abbrevs-test ()
+  "Test undefining all defined abbrevs"
+  (unless noninteractive
+    (ert-skip "Cannot test kill-all-abbrevs in interactive mode"))
+
+  (let ((num-tables 0))
+    ;; ensure at least one abbrev exists
+    (should (abbrev-table-p (setup-test-abbrev-table)))
+    (setf num-tables (length abbrev-table-name-list))
+    (kill-all-abbrevs)
+
+    ;; no tables should have been removed/added
+    (should (= num-tables (length abbrev-table-name-list)))
+    ;; number of empty tables should be the same as number of tables
+    (should (= num-tables (length (seq-filter
+                                   (lambda (table)
+                                       (abbrev-table-empty-p (symbol-value 
table)))
+                                   abbrev-table-name-list))))))
+
+(ert-deftest abbrev-table-name-test ()
+  "Test returning name of abbrev-table"
+  (let ((ert-test-abbrevs (setup-test-abbrev-table))
+        (no-such-table nil))
+    (should (equal 'ert-test-abbrevs (abbrev-table-name ert-test-abbrevs)))
+    (should (equal nil (abbrev-table-name no-such-table)))))
+
+(ert-deftest clear-abbrev-table-test ()
+  "Test clearing single abbrev table"
+  (let ((ert-test-abbrevs (setup-test-abbrev-table)))
+    (should (equal "a-e-t" (symbol-name
+                            (abbrev-symbol "a-e-t" ert-test-abbrevs))))
+    (should (equal "abbrev-ert-test" (symbol-value
+                                      (abbrev-symbol "a-e-t" 
ert-test-abbrevs))))
+
+    (clear-abbrev-table ert-test-abbrevs)
+
+    (should (equal "nil" (symbol-name
+                          (abbrev-symbol "a-e-t" ert-test-abbrevs))))
+    (should (equal nil (symbol-value
+                        (abbrev-symbol "a-e-t" ert-test-abbrevs))))
+    (should (equal t (abbrev-table-empty-p ert-test-abbrevs)))))
+
 (provide 'abbrev-tests)
 ;;; abbrev-tests.el ends here
diff --git a/test/lisp/autorevert-tests.el b/test/lisp/autorevert-tests.el
index 6f18697..043f80d 100644
--- a/test/lisp/autorevert-tests.el
+++ b/test/lisp/autorevert-tests.el
@@ -39,7 +39,9 @@
           (null (string-match
                  (format-message "Reverting buffer `%s'." (buffer-name buffer))
                  (buffer-string)))
-        (read-event nil nil 0.1)))))
+       (if (with-current-buffer buffer auto-revert-use-notify)
+           (read-event nil nil 0.1)
+         (sleep-for 0.1))))))
 
 (ert-deftest auto-revert-test00-auto-revert-mode ()
   "Check autorevert for a file."
diff --git a/test/lisp/calendar/icalendar-tests.el 
b/test/lisp/calendar/icalendar-tests.el
index 7e05d49..829cbf2 100644
--- a/test/lisp/calendar/icalendar-tests.el
+++ b/test/lisp/calendar/icalendar-tests.el
@@ -2231,7 +2231,63 @@ END:VCALENDAR"
  Class: PUBLIC
  UID: 
040000008200E00074C5B7101A82E0080000000020FFAED0CFEFCC01000000000000000010000000575268034ECDB649A15349B1BF240F15
 "     nil)
+
+  ;; 2015-12-05, mixed line endings and empty lines, see Bug#22092.
+  (icalendar-tests--test-import
+   "BEGIN:VCALENDAR\r
+PRODID:-//www.norwegian.no//iCalendar MIMEDIR//EN\r
+VERSION:2.0\r
+METHOD:REQUEST\r
+BEGIN:VEVENT\r
+UID:RFCALITEM1\r
+SEQUENCE:1512040950\r
+DTSTAMP:20141204T095043Z\r
+ORGANIZER:address@hidden
+DTSTART:20141208T173000Z\r
+
+DTEND:20141208T215500Z\r
+
+LOCATION:Stavanger-Sola\r
+
+DESCRIPTION:Fly med Norwegian, reservasjon. Fra Stavanger til Troms&#248; 8. 
des 2014 18:30, DY545Fly med Norwegian, reservasjon . Fra Stavanger til 
Troms&#248; 8. des 2014 21:00, DY390\r
+
+X-ALT-DESC;FMTTYPE=text/html:<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 
3.2//EN\"><html><head><META NAME=\"Generator\" CONTENT=\"MS Exchange Server 
version 08.00.0681.000\"><title></title></head><body><b><font face=\"Calibri\" 
size=\"3\">Reisereferanse</p></body></html>
+SUMMARY:Norwegian til Tromsoe-Langnes -\r
+
+CATEGORIES:Appointment\r
+
+
+PRIORITY:5\r
+
+CLASS:PUBLIC\r
+
+TRANSP:OPAQUE\r
+END:VEVENT\r
+END:VCALENDAR
+"
+"&2014/12/8 18:30-22:55 Norwegian til Tromsoe-Langnes -
+ Desc: Fly med Norwegian, reservasjon. Fra Stavanger til Troms&#248; 8. des 
2014 18:30, DY545Fly med Norwegian, reservasjon . Fra Stavanger til Troms&#248; 
8. des 2014 21:00, DY390
+ Location: Stavanger-Sola
+ Organizer: address@hidden
+ Class: PUBLIC
+ UID: RFCALITEM1
+"
+"&8/12/2014 18:30-22:55 Norwegian til Tromsoe-Langnes -
+ Desc: Fly med Norwegian, reservasjon. Fra Stavanger til Troms&#248; 8. des 
2014 18:30, DY545Fly med Norwegian, reservasjon . Fra Stavanger til Troms&#248; 
8. des 2014 21:00, DY390
+ Location: Stavanger-Sola
+ Organizer: address@hidden
+ Class: PUBLIC
+ UID: RFCALITEM1
+"
+"&12/8/2014 18:30-22:55 Norwegian til Tromsoe-Langnes -
+ Desc: Fly med Norwegian, reservasjon. Fra Stavanger til Troms&#248; 8. des 
2014 18:30, DY545Fly med Norwegian, reservasjon . Fra Stavanger til Troms&#248; 
8. des 2014 21:00, DY390
+ Location: Stavanger-Sola
+ Organizer: address@hidden
+ Class: PUBLIC
+ UID: RFCALITEM1
+"
 )
+  )
 
 (provide 'icalendar-tests)
 ;;; icalendar-tests.el ends here
diff --git a/test/lisp/character-fold-tests.el 
b/test/lisp/character-fold-tests.el
index 2b1a15c..c056862 100644
--- a/test/lisp/character-fold-tests.el
+++ b/test/lisp/character-fold-tests.el
@@ -37,13 +37,13 @@
 
 
 (ert-deftest character-fold--test-consistency ()
-  (dotimes (n 100)
+  (dotimes (n 30)
     (let ((w (character-fold--random-word n)))
       ;; A folded string should always match the original string.
       (character-fold--test-search-with-contents w w))))
 
 (ert-deftest character-fold--test-lax-whitespace ()
-  (dotimes (n 100)
+  (dotimes (n 40)
     (let ((w1 (character-fold--random-word n))
           (w2 (character-fold--random-word n))
           (search-spaces-regexp "\\s-+"))
@@ -52,7 +52,73 @@
        (concat w1 " " w2))
       (character-fold--test-search-with-contents
        (concat w1 "\s\n\s\t\f\t\n\r\t" w2)
-       (concat w1 (make-string 90 ?\s) w2)))))
+       (concat w1 (make-string 10 ?\s) w2)))))
+
+(defun character-fold--test-match-exactly (string &rest strings-to-match)
+  (let ((re (concat "\\`" (character-fold-to-regexp string) "\\'")))
+    (dolist (it strings-to-match)
+      (should (string-match re it)))
+    ;; Case folding
+    (let ((case-fold-search t))
+      (dolist (it strings-to-match)
+        (should (string-match (upcase re) (downcase it)))
+        (should (string-match (downcase re) (upcase it)))))))
+
+(ert-deftest character-fold--test-some-defaults ()
+  (dolist (it '(("ffl" . "ffl") ("ffi" . "ffi")
+                ("fi" . "fi") ("ff" . "ff")
+                ("ä" . "ä")))
+    (character-fold--test-search-with-contents (cdr it) (car it))
+    (let ((multi (char-table-extra-slot character-fold-table 0))
+          (character-fold-table (make-char-table 'character-fold-table)))
+      (set-char-table-extra-slot character-fold-table 0 multi)
+      (character-fold--test-match-exactly (car it) (cdr it)))))
+
+(ert-deftest character-fold--test-fold-to-regexp ()
+  (let ((character-fold-table (make-char-table 'character-fold-table))
+        (multi  (make-char-table 'character-fold-table)))
+    (set-char-table-extra-slot character-fold-table 0 multi)
+    (aset character-fold-table ?a "xx")
+    (aset character-fold-table ?1 "44")
+    (aset character-fold-table ?\s "-!-")
+    (character-fold--test-match-exactly "a1a1" "xx44xx44")
+    (character-fold--test-match-exactly "a1  a 1" "xx44-!--!-xx-!-44")
+    (aset multi ?a '(("1" . "99")
+                     ("2" . "88")
+                     ("12" . "77")))
+    (character-fold--test-match-exactly "a" "xx")
+    (character-fold--test-match-exactly "a1" "xx44" "99")
+    (character-fold--test-match-exactly "a12" "77" "xx442" "992")
+    (character-fold--test-match-exactly "a2" "88")
+    (aset multi ?1 '(("2" . "yy")))
+    (character-fold--test-match-exactly "a1" "xx44" "99")
+    (character-fold--test-match-exactly "a12" "77" "xx442" "992")
+    ;; Support for this case is disabled.  See function definition or:
+    ;; https://lists.gnu.org/archive/html/emacs-devel/2015-11/msg02562.html
+    ;; (character-fold--test-match-exactly "a12" "xxyy")
+    ))
+
+(ert-deftest character-fold--speed-test ()
+  (dolist (string (append '("tty-set-up-initial-frame-face"
+                            
"tty-set-up-initial-frame-face-frame-faceframe-faceframe-faceframe-face")
+                          (mapcar #'character-fold--random-word '(10 50 100
+                                                                     50 100))))
+    (message "Testing %s" string)
+    ;; Make sure we didn't just fallback on the trivial search.
+    (should-not (string= (regexp-quote string)
+                         (character-fold-to-regexp string)))
+    (with-temp-buffer
+      (save-excursion (insert string))
+      (let ((time (time-to-seconds (current-time))))
+        ;; Our initial implementation of case-folding in char-folding
+        ;; created a lot of redundant paths in the regexp. Because of
+        ;; that, if a really long string "almost" matches, the regexp
+        ;; engine took a long time to realize that it doesn't match.
+        (should-not (character-fold-search-forward (concat string "c") nil 
'noerror))
+        ;; Ensure it took less than a second.
+        (should (< (- (time-to-seconds (current-time))
+                      time)
+                   1))))))
 
 (provide 'character-fold-tests)
 ;;; character-fold-tests.el ends here
diff --git a/test/lisp/emacs-lisp/package-tests.el 
b/test/lisp/emacs-lisp/package-tests.el
index 6b3069c..7206084 100644
--- a/test/lisp/emacs-lisp/package-tests.el
+++ b/test/lisp/emacs-lisp/package-tests.el
@@ -242,6 +242,20 @@ Must called from within a `tar-mode' buffer."
     (should (package-installed-p 'simple-single))
     (should (package-installed-p 'simple-depend))))
 
+(ert-deftest package-test-macro-compilation ()
+  "Install a package which includes a dependency."
+  (with-package-test (:basedir "data/package")
+    (package-install-file (expand-file-name "macro-problem-package-1.0/"))
+    (require 'macro-problem)
+    ;; `macro-problem-func' uses a macro from `macro-aux'.
+    (should (equal (macro-problem-func) '(progn a b)))
+    (package-install-file (expand-file-name "macro-problem-package-2.0/"))
+    ;; After upgrading, `macro-problem-func' depends on a new version
+    ;; of the macro from `macro-aux'.
+    (should (equal (macro-problem-func) '(1 b)))
+    ;; `macro-problem-10-and-90' depends on an entirely new macro from 
`macro-aux'.
+    (should (equal (macro-problem-10-and-90) '(10 90)))))
+
 (ert-deftest package-test-install-two-dependencies ()
   "Install a package which includes a dependency."
   (with-package-test ()
diff --git a/test/lisp/faces-tests.el b/test/lisp/faces-tests.el
index 007bc80..ff9dfc5 100644
--- a/test/lisp/faces-tests.el
+++ b/test/lisp/faces-tests.el
@@ -38,6 +38,11 @@
     (should (equal (background-color-at-point) "black"))
     (should (equal (foreground-color-at-point) "black")))
   (with-temp-buffer
+    (insert (propertize "STRING" 'face '(:foreground "black" :background 
"black")))
+    (goto-char (point-min))
+    (should (equal (background-color-at-point) "black"))
+    (should (equal (foreground-color-at-point) "black")))
+  (with-temp-buffer
     (emacs-lisp-mode)
     (setq-local font-lock-comment-face 'faces--test1)
     (setq-local font-lock-constant-face 'faces--test2)
diff --git a/test/lisp/gnus/auth-source-tests.el 
b/test/lisp/gnus/auth-source-tests.el
index 0b49b90..dd70d54 100644
--- a/test/lisp/gnus/auth-source-tests.el
+++ b/test/lisp/gnus/auth-source-tests.el
@@ -174,5 +174,50 @@
                                     (:search-function . 
auth-source-secrets-search)
                                     (:create-function . 
auth-source-secrets-create)))))
 
+(defun auth-source--test-netrc-parse-entry (entry host user port)
+  "Parse a netrc entry from buffer."
+  (auth-source-forget-all-cached)
+  (setq port (auth-source-ensure-strings port))
+  (with-temp-buffer
+    (insert entry)
+    (goto-char (point-min))
+    (let* ((check (lambda(alist)
+                   (and alist
+                        (auth-source-search-collection
+                         host
+                         (or
+                          (auth-source--aget alist "machine")
+                          (auth-source--aget alist "host")
+                          t))
+                        (auth-source-search-collection
+                         user
+                         (or
+                          (auth-source--aget alist "login")
+                          (auth-source--aget alist "account")
+                          (auth-source--aget alist "user")
+                          t))
+                        (auth-source-search-collection
+                         port
+                         (or
+                          (auth-source--aget alist "port")
+                          (auth-source--aget alist "protocol")
+                          t)))))
+          (entries (auth-source-netrc-parse-entries check 1)))
+      entries)))
+
+(ert-deftest auth-source-test-netrc-parse-entry ()
+  (should (equal (auth-source--test-netrc-parse-entry
+                  "machine mymachine1 login user1 password pass1\n" t t t)
+                 '((("password" . "pass1")
+                    ("login" . "user1")
+                    ("machine" . "mymachine1")))))
+  (should (equal (auth-source--test-netrc-parse-entry
+                  "machine mymachine1 login user1 password pass1 port 100\n"
+                  t t t)
+                 '((("port" . "100")
+                    ("password" . "pass1")
+                    ("login" . "user1")
+                    ("machine" . "mymachine1"))))))
+
 (provide 'auth-source-tests)
 ;;; auth-source-tests.el ends here
diff --git a/test/lisp/gnus/message-tests.el b/test/lisp/gnus/message-tests.el
index 49a72b0..790b5c1 100644
--- a/test/lisp/gnus/message-tests.el
+++ b/test/lisp/gnus/message-tests.el
@@ -40,9 +40,9 @@
                   "and here's a closer ")
           (let ((last-command-event ?\)))
             (ert-simulate-command '(self-insert-command 1)))
-          ;; Syntax propertization doesn't kick in batch mode
-          (when noninteractive
-            (syntax-propertize (point-max)))
+          ;; Auto syntax propertization doesn't kick in until
+          ;; parse-sexp-lookup-properties is set.
+          (setq-local parse-sexp-lookup-properties t)
           (backward-sexp)
           (should (string= "here's an opener "
                            (buffer-substring-no-properties
diff --git a/test/lisp/help-fns-tests.el b/test/lisp/help-fns-tests.el
index b8772eb..79e90f7 100644
--- a/test/lisp/help-fns-tests.el
+++ b/test/lisp/help-fns-tests.el
@@ -57,4 +57,14 @@
     (should (search-forward
              "(defgh\\\\\\[universal-argument\\]b\\`c\\'d\\\\e\\\"f X)"))))
 
+(ert-deftest help-fns-test-describe-symbol ()
+  "Test the `describe-symbol' function."
+  ;; 'describe-symbol' would originally signal an error for
+  ;; 'font-lock-comment-face'.
+  (describe-symbol 'font-lock-comment-face)
+  (with-current-buffer "*Help*"
+    (should (> (point-max) 1))
+    (goto-char (point-min))
+    (should (looking-at "^font-lock-comment-face is "))))
+
 ;;; help-fns.el ends here
diff --git a/test/lisp/json-tests.el b/test/lisp/json-tests.el
index 8f0cd6f..bb043dc 100644
--- a/test/lisp/json-tests.el
+++ b/test/lisp/json-tests.el
@@ -22,6 +22,38 @@
 (require 'ert)
 (require 'json)
 
+(defmacro json-tests--with-temp-buffer (content &rest body)
+  "Create a temporary buffer with CONTENT and evaluate BODY there.
+Point is moved to beginning of the buffer."
+  (declare (indent 1))
+  `(with-temp-buffer
+     (insert ,content)
+     (goto-char (point-min))
+     ,@body))
+
+;;; Utilities
+
+(ert-deftest test-json-join ()
+  (should (equal (json-join '() ", ")  ""))
+  (should (equal (json-join '("a" "b" "c") ", ")  "a, b, c")))
+
+(ert-deftest test-json-alist-p ()
+  (should (json-alist-p '()))
+  (should (json-alist-p '((a 1) (b 2) (c 3))))
+  (should (json-alist-p '((:a 1) (:b 2) (:c 3))))
+  (should (json-alist-p '(("a" 1) ("b" 2) ("c" 3))))
+  (should-not (json-alist-p '(:a :b :c)))
+  (should-not (json-alist-p '(:a 1 :b 2 :c 3)))
+  (should-not (json-alist-p '((:a 1) (:b 2) 3))))
+
+(ert-deftest test-json-plist-p ()
+  (should (json-plist-p '()))
+  (should (json-plist-p '(:a 1 :b 2 :c 3)))
+  (should-not (json-plist-p '(a 1 b 2 c 3)))
+  (should-not (json-plist-p '("a" 1 "b" 2 "c" 3)))
+  (should-not (json-plist-p '(:a :b :c)))
+  (should-not (json-plist-p '((:a 1) (:b 2) (:c 3)))))
+
 (ert-deftest test-json-plist-reverse ()
   (should (equal (json--plist-reverse '()) '()))
   (should (equal (json--plist-reverse '(:a 1)) '(:a 1)))
@@ -34,49 +66,32 @@
   (should (equal (json--plist-to-alist '(:a 1 :b 2 :c 3))
                  '((:a . 1) (:b . 2) (:c . 3)))))
 
-(ert-deftest test-json-encode-plist ()
-  (let ((plist '(:a 1 :b 2)))
-    (should (equal (json-encode plist) "{\"a\":1,\"b\":2}"))))
-
-(ert-deftest json-encode-simple-alist ()
-  (should (equal (json-encode '((a . 1)
-                                (b . 2)))
-                 "{\"a\":1,\"b\":2}")))
-
-(ert-deftest test-json-encode-hash-table ()
-  (let ((hash-table (make-hash-table))
-        (json-encoding-object-sort-predicate 'string<))
-    (puthash :a 1 hash-table)
-    (puthash :b 2 hash-table)
-    (puthash :c 3 hash-table)
-    (should (equal (json-encode hash-table)
-                   "{\"a\":1,\"b\":2,\"c\":3}"))))
-
-(ert-deftest test-json-encode-alist-with-sort-predicate ()
-  (let ((alist '((:c . 3) (:a . 1) (:b . 2)))
-        (json-encoding-object-sort-predicate 'string<))
-    (should (equal (json-encode alist) "{\"a\":1,\"b\":2,\"c\":3}"))))
+(ert-deftest test-json-advance ()
+  (json-tests--with-temp-buffer "{ \"a\": 1 }"
+    (json-advance 0)
+    (should (= (point) (point-min)))
+    (json-advance 3)
+    (should (= (point) (+ (point-min) 3)))))
 
-(ert-deftest test-json-encode-plist-with-sort-predicate ()
-  (let ((plist '(:c 3 :a 1 :b 2))
-        (json-encoding-object-sort-predicate 'string<))
-    (should (equal (json-encode plist) "{\"a\":1,\"b\":2,\"c\":3}"))))
+(ert-deftest test-json-peek ()
+  (json-tests--with-temp-buffer ""
+    (should (eq (json-peek) :json-eof)))
+  (json-tests--with-temp-buffer "{ \"a\": 1 }"
+    (should (equal (json-peek) ?{))))
 
-(ert-deftest json-read-simple-alist ()
-  (let ((json-object-type 'alist))
-    (should (equal (json-read-from-string "{\"a\": 1, \"b\": 2}")
-                   '((a . 1)
-                     (b . 2))))))
+(ert-deftest test-json-pop ()
+  (json-tests--with-temp-buffer ""
+    (should-error (json-pop) :type 'json-end-of-file))
+  (json-tests--with-temp-buffer "{ \"a\": 1 }"
+    (should (equal (json-pop) ?{))
+    (should (= (point) (+ (point-min) 1)))))
 
-(ert-deftest json-encode-string-with-special-chars ()
-  (should (equal (json-encode-string "a\n\fb")
-                 "\"a\\n\\fb\""))
-  (should (equal (json-encode-string "\nasdфыв\u001f\u007ffgh\t")
-                 "\"\\nasdфыв\\u001f\u007ffgh\\t\"")))
+(ert-deftest test-json-skip-whitespace ()
+  (json-tests--with-temp-buffer "\t\r\n\f\b { \"a\": 1 }"
+    (json-skip-whitespace)
+    (should (equal (char-after (point)) ?{))))
 
-(ert-deftest json-read-string-with-special-chars ()
-  (should (equal (json-read-from-string 
"\"\\nasd\\u0444\\u044b\\u0432fgh\\t\"")
-                 "\nasdфывfgh\t")))
+;;; Paths
 
 (ert-deftest test-json-path-to-position-with-objects ()
   (let* ((json-string "{\"foo\": {\"bar\": {\"baz\": \"value\"}}}")
@@ -97,5 +112,209 @@
          (matched-path (json-path-to-position 5 json-string)))
     (should (null matched-path))))
 
+;;; Keywords
+
+(ert-deftest test-json-read-keyword ()
+  (json-tests--with-temp-buffer "true"
+    (should (json-read-keyword "true")))
+  (json-tests--with-temp-buffer "true"
+    (should-error
+     (json-read-keyword "false") :type 'json-unknown-keyword))
+  (json-tests--with-temp-buffer "foo"
+    (should-error
+     (json-read-keyword "foo") :type 'json-unknown-keyword)))
+
+(ert-deftest test-json-encode-keyword ()
+  (should (equal (json-encode-keyword t) "true"))
+  (should (equal (json-encode-keyword json-false) "false"))
+  (should (equal (json-encode-keyword json-null) "null")))
+
+;;; Numbers
+
+(ert-deftest test-json-read-number ()
+  (json-tests--with-temp-buffer "3"
+    (should (= (json-read-number) 3)))
+  (json-tests--with-temp-buffer "-5"
+    (should (= (json-read-number) -5)))
+  (json-tests--with-temp-buffer "123.456"
+    (should (= (json-read-number) 123.456)))
+  (json-tests--with-temp-buffer "1e3"
+    (should (= (json-read-number) 1e3)))
+  (json-tests--with-temp-buffer "2e+3"
+    (should (= (json-read-number) 2e3)))
+  (json-tests--with-temp-buffer "3E3"
+    (should (= (json-read-number) 3e3)))
+  (json-tests--with-temp-buffer "1e-7"
+    (should (= (json-read-number) 1e-7)))
+  (json-tests--with-temp-buffer "abc"
+    (should-error (json-read-number) :type 'json-number-format)))
+
+(ert-deftest test-json-encode-number ()
+  (should (equal (json-encode-number 3) "3"))
+  (should (equal (json-encode-number -5) "-5"))
+  (should (equal (json-encode-number 123.456) "123.456")))
+
+;; Strings
+
+(ert-deftest test-json-read-escaped-char ()
+  (json-tests--with-temp-buffer "\\\""
+    (should (equal (json-read-escaped-char) ?\"))))
+
+(ert-deftest test-json-read-string ()
+  (json-tests--with-temp-buffer "\"foo \\\"bar\\\"\""
+    (should (equal (json-read-string) "foo \"bar\"")))
+  (json-tests--with-temp-buffer "\"abcαβγ\""
+    (should (equal (json-read-string) "abcαβγ")))
+  (json-tests--with-temp-buffer "\"\\nasd\\u0444\\u044b\\u0432fgh\\t\""
+    (should (equal (json-read-string) "\nasdфывfgh\t")))
+  (json-tests--with-temp-buffer "foo"
+    (should-error (json-read-string) :type 'json-string-format)))
+
+(ert-deftest test-json-encode-string ()
+  (should (equal (json-encode-string "foo") "\"foo\""))
+  (should (equal (json-encode-string "a\n\fb") "\"a\\n\\fb\""))
+  (should (equal (json-encode-string "\nasdфыв\u001f\u007ffgh\t")
+                 "\"\\nasdфыв\\u001f\u007ffgh\\t\"")))
+
+(ert-deftest test-json-encode-key ()
+  (should (equal (json-encode-key "foo") "\"foo\""))
+  (should (equal (json-encode-key 'foo) "\"foo\""))
+  (should (equal (json-encode-key :foo) "\"foo\""))
+  (should-error (json-encode-key 5) :type 'json-key-format)
+  (should-error (json-encode-key ["foo"]) :type 'json-key-format)
+  (should-error (json-encode-key '("foo")) :type 'json-key-format))
+
+;;; Objects
+
+(ert-deftest test-json-new-object ()
+  (let ((json-object-type 'alist))
+    (should (equal (json-new-object) '())))
+  (let ((json-object-type 'plist))
+    (should (equal (json-new-object) '())))
+  (let* ((json-object-type 'hash-table)
+         (json-object (json-new-object)))
+    (should (hash-table-p json-object))
+    (should (= (hash-table-count json-object) 0))))
+
+(ert-deftest test-json-add-to-object ()
+  (let* ((json-object-type 'alist)
+         (json-key-type nil)
+         (obj (json-new-object)))
+    (setq obj (json-add-to-object obj "a" 1))
+    (setq obj (json-add-to-object obj "b" 2))
+    (should (equal (assq 'a obj) '(a . 1)))
+    (should (equal (assq 'b obj) '(b . 2))))
+  (let* ((json-object-type 'plist)
+         (json-key-type nil)
+         (obj (json-new-object)))
+    (setq obj (json-add-to-object obj "a" 1))
+    (setq obj (json-add-to-object obj "b" 2))
+    (should (= (plist-get obj :a) 1))
+    (should (= (plist-get obj :b) 2)))
+  (let* ((json-object-type 'hash-table)
+         (json-key-type nil)
+         (obj (json-new-object)))
+    (setq obj (json-add-to-object obj "a" 1))
+    (setq obj (json-add-to-object obj "b" 2))
+    (should (= (gethash "a" obj) 1))
+    (should (= (gethash "b" obj) 2))))
+
+(ert-deftest test-json-read-object ()
+  (json-tests--with-temp-buffer "{ \"a\": 1, \"b\": 2 }"
+    (let ((json-object-type 'alist))
+      (should (equal (json-read-object) '((a . 1) (b . 2))))))
+  (json-tests--with-temp-buffer "{ \"a\": 1, \"b\": 2 }"
+    (let ((json-object-type 'plist))
+      (should (equal (json-read-object) '(:a 1 :b 2)))))
+  (json-tests--with-temp-buffer "{ \"a\": 1, \"b\": 2 }"
+    (let* ((json-object-type 'hash-table)
+           (hash-table (json-read-object)))
+      (should (= (gethash "a" hash-table) 1))
+      (should (= (gethash "b" hash-table) 2))))
+  (json-tests--with-temp-buffer "{ \"a\": 1 \"b\": 2 }"
+    (should-error (json-read-object) :type 'json-object-format)))
+
+(ert-deftest test-json-encode-hash-table ()
+  (let ((hash-table (make-hash-table))
+        (json-encoding-object-sort-predicate 'string<)
+        (json-encoding-pretty-print nil))
+    (puthash :a 1 hash-table)
+    (puthash :b 2 hash-table)
+    (puthash :c 3 hash-table)
+    (should (equal (json-encode hash-table)
+                   "{\"a\":1,\"b\":2,\"c\":3}"))))
+
+(ert-deftest json-encode-simple-alist ()
+  (let ((json-encoding-pretty-print nil))
+    (should (equal (json-encode '((a . 1) (b . 2)))
+                   "{\"a\":1,\"b\":2}"))))
+
+(ert-deftest test-json-encode-plist ()
+  (let ((plist '(:a 1 :b 2))
+        (json-encoding-pretty-print nil))
+    (should (equal (json-encode plist) "{\"a\":1,\"b\":2}"))))
+
+(ert-deftest test-json-encode-plist-with-sort-predicate ()
+  (let ((plist '(:c 3 :a 1 :b 2))
+        (json-encoding-object-sort-predicate 'string<)
+        (json-encoding-pretty-print nil))
+    (should (equal (json-encode plist) "{\"a\":1,\"b\":2,\"c\":3}"))))
+
+(ert-deftest test-json-encode-alist-with-sort-predicate ()
+  (let ((alist '((:c . 3) (:a . 1) (:b . 2)))
+        (json-encoding-object-sort-predicate 'string<)
+        (json-encoding-pretty-print nil))
+    (should (equal (json-encode alist) "{\"a\":1,\"b\":2,\"c\":3}"))))
+
+(ert-deftest test-json-encode-list ()
+  (let ((json-encoding-pretty-print nil))
+    (should (equal (json-encode-list '(:a 1 :b 2))
+                   "{\"a\":1,\"b\":2}"))
+    (should (equal (json-encode-list '((:a . 1) (:b . 2)))
+                   "{\"a\":1,\"b\":2}"))
+    (should (equal (json-encode-list '(1 2 3 4)) "[1,2,3,4]"))))
+
+;;; Arrays
+
+(ert-deftest test-json-read-array ()
+  (let ((json-array-type 'vector))
+    (json-tests--with-temp-buffer "[1, 2, \"a\", \"b\"]"
+      (should (equal (json-read-array) [1 2 "a" "b"]))))
+  (let ((json-array-type 'list))
+    (json-tests--with-temp-buffer "[1, 2, \"a\", \"b\"]"
+      (should (equal (json-read-array) '(1 2 "a" "b")))))
+  (json-tests--with-temp-buffer "[1 2]"
+    (should-error (json-read-array) :type 'json-error)))
+
+(ert-deftest test-json-encode-array ()
+  (let ((json-encoding-pretty-print nil))
+    (should (equal (json-encode-array [1 2 "a" "b"])
+                   "[1,2,\"a\",\"b\"]"))))
+
+;;; Reader
+
+(ert-deftest test-json-read ()
+  (json-tests--with-temp-buffer "{ \"a\": 1 }"
+    ;; We don't care exactly what the return value is (that is tested
+    ;; in `test-json-read-object'), but it should parse without error.
+    (should (json-read)))
+  (json-tests--with-temp-buffer ""
+    (should-error (json-read) :type 'json-end-of-file))
+  (json-tests--with-temp-buffer "xxx"
+    (should-error (json-read) :type 'json-readtable-error)))
+
+(ert-deftest test-json-read-from-string ()
+  (let ((json-string "{ \"a\": 1 }"))
+    (json-tests--with-temp-buffer json-string
+      (should (equal (json-read-from-string json-string)
+                     (json-read))))))
+
+;;; JSON encoder
+
+(ert-deftest test-json-encode ()
+  (should (equal (json-encode "foo") "\"foo\""))
+  (with-temp-buffer
+    (should-error (json-encode (current-buffer)) :type 'json-error)))
+
 (provide 'json-tests)
 ;;; json-tests.el ends here
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index c5cab7d..23171d6 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -1608,6 +1608,10 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
         (vc-handled-backends
          (with-parsed-tramp-file-name tramp-test-temporary-file-directory nil
            (cond
+            ((tramp-find-executable v vc-git-program (tramp-get-remote-path v))
+             '(Git))
+            ((tramp-find-executable v vc-hg-program (tramp-get-remote-path v))
+             '(Hg))
             ((tramp-find-executable v vc-bzr-program (tramp-get-remote-path v))
              (setq tramp-remote-process-environment
                    (cons (format "BZR_HOME=%s"
@@ -1618,10 +1622,6 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
               (tramp-dissect-file-name tramp-test-temporary-file-directory)
               nil 'keep-password)
              '(Bzr))
-            ((tramp-find-executable v vc-git-program (tramp-get-remote-path v))
-             '(Git))
-            ((tramp-find-executable v vc-hg-program (tramp-get-remote-path v))
-             '(Hg))
             (t nil)))))
     (skip-unless vc-handled-backends)
     (message "%s" vc-handled-backends)
@@ -1637,7 +1637,11 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
 
          (let ((default-directory tmp-name1))
            ;; Create empty repository, and register the file.
-           (vc-create-repo (car vc-handled-backends))
+           ;; Sometimes, creation of repository fails (bzr!); we skip
+           ;; the test then.
+           (condition-case nil
+               (vc-create-repo (car vc-handled-backends))
+             (error (skip-unless nil)))
            ;; The structure of VC-FILESET is not documented.  Let's
            ;; hope it won't change.
            (condition-case nil
@@ -1772,6 +1776,14 @@ Several special characters do not work properly there."
       (file-truename tramp-test-temporary-file-directory) nil
     (string-match "^HP-UX" (tramp-get-connection-property v "uname" ""))))
 
+(defun tramp--test-darwin-p ()
+  "Check, whether the remote host runs Mac OS X.
+Several special characters do not work properly there."
+  ;; We must refill the cache.  `file-truename' does it.
+  (with-parsed-tramp-file-name
+      (file-truename tramp-test-temporary-file-directory) nil
+    (string-match "^Darwin" (tramp-get-connection-property v "uname" ""))))
+
 (defun tramp--test-check-files (&rest files)
   "Run a simple but comprehensive test over every file in FILES."
   ;; We must use `file-truename' for the temporary directory, because
@@ -1987,7 +1999,10 @@ Use the `perl' command."
   (let ((tramp-connection-properties
         (append
          `((,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
-            "stat" nil))
+            "stat" nil)
+           ;; See `tramp-sh-handle-file-truename'.
+           (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+            "readlink" nil))
          tramp-connection-properties)))
     (tramp--test-special-characters)))
 
@@ -2005,21 +2020,25 @@ Use the `ls' command."
          `((,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
             "perl" nil)
            (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
-            "stat" nil))
+            "stat" nil)
+           ;; See `tramp-sh-handle-file-truename'.
+           (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+            "readlink" nil))
          tramp-connection-properties)))
     (tramp--test-special-characters)))
 
 (defun tramp--test-utf8 ()
   "Perform the test in `tramp-test32-utf8*'."
+  (tramp--instrument-test-case 10
   (let ((coding-system-for-read 'utf-8)
        (coding-system-for-write 'utf-8)
        (file-name-coding-system 'utf-8))
     (tramp--test-check-files
      (unless (tramp--test-hpux-p) "Γυρίστε το Γαλαξία με Ώτο Στοπ")
-     (unless (tramp--test-hpux-p)
+     (unless (or (tramp--test-hpux-p) (tramp--test-darwin-p))
        "أصبح بوسعك الآن تنزيل نسخة كاملة من موسوعة ويكيبيديا العربية لتصفحها 
بلا اتصال بالإنترنت")
      "银河系漫游指南系列"
-     "Автостопом по гала́ктике")))
+     "Автостопом по гала́ктике"))))
 
 (ert-deftest tramp-test32-utf8 ()
   "Check UTF8 encoding in file names and file contents."
@@ -2059,7 +2078,10 @@ Use the `perl' command."
   (let ((tramp-connection-properties
         (append
          `((,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
-            "stat" nil))
+            "stat" nil)
+           ;; See `tramp-sh-handle-file-truename'.
+           (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+            "readlink" nil))
          tramp-connection-properties)))
     (tramp--test-utf8)))
 
@@ -2077,7 +2099,10 @@ Use the `ls' command."
          `((,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
             "perl" nil)
            (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
-            "stat" nil))
+            "stat" nil)
+           ;; See `tramp-sh-handle-file-truename'.
+           (,(regexp-quote (file-remote-p tramp-test-temporary-file-directory))
+            "readlink" nil))
          tramp-connection-properties)))
     (tramp--test-utf8)))
 
diff --git a/test/lisp/progmodes/elisp-mode-tests.el 
b/test/lisp/progmodes/elisp-mode-tests.el
index 97f86a9..2d0452f 100644
--- a/test/lisp/progmodes/elisp-mode-tests.el
+++ b/test/lisp/progmodes/elisp-mode-tests.el
@@ -543,7 +543,7 @@ to (xref-elisp-test-descr-to-target xref)."
 ;; FIXME: deftype
 
 (xref-elisp-deftest find-defs-defun-c-defvar-c
-  (elisp--xref-find-definitions 'system-name)
+  (xref-backend-definitions 'elisp "system-name")
   (list
    (xref-make "(defvar system-name)"
              (xref-make-elisp-location 'system-name 'defvar "src/editfns.c"))
@@ -552,7 +552,7 @@ to (xref-elisp-test-descr-to-target xref)."
   )
 
 (xref-elisp-deftest find-defs-defun-el-defvar-c
-  (elisp--xref-find-definitions 'abbrev-mode)
+  (xref-backend-definitions 'elisp "abbrev-mode")
   ;; It's a minor mode, but the variable is defined in buffer.c
   (list
    (xref-make "(defvar abbrev-mode)"
diff --git a/test/lisp/simple-tests.el b/test/lisp/simple-tests.el
index 07b5eaa..771241a 100644
--- a/test/lisp/simple-tests.el
+++ b/test/lisp/simple-tests.el
@@ -138,6 +138,12 @@
                      (open-line 1)))
                  '("- - " . "\n(a b c d)"))))
 
+;; For a while, from 24 Oct - 21 Nov 2015, `open-line' in the Emacs
+;; development tree became sensitive to `electric-indent-mode', which
+;; it had not been before.  This sensitivity was reverted for the
+;; Emacs 25 release, so it could be discussed further (see thread
+;; "Questioning the new behavior of `open-line'." on the Emacs Devel
+;; mailing list, and bug #21884).
 (ert-deftest open-line-indent ()
   (should (equal (simple-test--dummy-buffer
                    (electric-indent-local-mode 1)
@@ -145,29 +151,34 @@
                  '("(a b" . "\n c d)")))
   (should (equal (simple-test--dummy-buffer
                    (electric-indent-local-mode 1)
-                   (open-line 1 'interactive))
-                 '("(a b" . "\n   c d)")))
+                   (open-line 1))
+                 '("(a b" . "\n c d)")))
   (should (equal (simple-test--dummy-buffer
                    (electric-indent-local-mode 1)
                    (let ((current-prefix-arg nil))
                      (call-interactively #'open-line)
                      (call-interactively #'open-line)))
-                 '("(a b" . "\n\n   c d)")))
+                 '("(a b" . "\n\n c d)")))
   (should (equal (simple-test--dummy-buffer
                    (electric-indent-local-mode 1)
-                   (open-line 5 'interactive))
-                 '("(a b" . "\n\n\n\n\n   c d)")))
+                   (open-line 5))
+                 '("(a b" . "\n\n\n\n\n c d)")))
   (should (equal (simple-test--dummy-buffer
                    (electric-indent-local-mode 1)
                    (let ((current-prefix-arg 5))
                      (call-interactively #'open-line)))
-                 '("(a b" . "\n\n\n\n\n   c d)")))
+                 '("(a b" . "\n\n\n\n\n c d)")))
   (should (equal (simple-test--dummy-buffer
                    (forward-char 1)
                    (electric-indent-local-mode 1)
-                   (open-line 1 'interactive))
-                 '("(a b" . "\n   c d)"))))
+                   (open-line 1))
+                 '("(a b " . "\nc d)"))))
 
+;; From 24 Oct - 21 Nov 2015, `open-line' took a second argument
+;; INTERACTIVE and ran `post-self-insert-hook' if the argument was
+;; true.  This test tested that.  Currently, however, `open-line'
+;; does not run run `post-self-insert-hook' at all, so for now
+;; this test just makes sure that it doesn't.
 (ert-deftest open-line-hook ()
   (let* ((x 0)
          (inc (lambda () (setq x (1+ x)))))
@@ -177,18 +188,18 @@
     (should (= x 0))
     (simple-test--dummy-buffer
       (add-hook 'post-self-insert-hook inc nil 'local)
-      (open-line 1 'interactive))
-    (should (= x 1))
+      (open-line 1))
+    (should (= x 0))
 
     (unwind-protect
         (progn
           (add-hook 'post-self-insert-hook inc)
           (simple-test--dummy-buffer
             (open-line 1))
-          (should (= x 1))
+          (should (= x 0))
           (simple-test--dummy-buffer
-            (open-line 10 'interactive))
-          (should (= x 2)))
+            (open-line 10))
+          (should (= x 0)))
       (remove-hook 'post-self-insert-hook inc))))
 
 
@@ -215,9 +226,9 @@
 
 
 ;;; auto-boundary tests
-(ert-deftest undo-auto--boundary-timer ()
+(ert-deftest undo-auto-boundary-timer ()
   (should
-   undo-auto--current-boundary-timer))
+   undo-auto-current-boundary-timer))
 
 (ert-deftest undo-auto--boundaries-added ()
   ;; The change in the buffer should have caused addition
@@ -252,5 +263,53 @@
                  '("(s1) (s4)" . " (s2) (s3) (s5)"))))
 
 
+;; Test for a regression introduced by undo-auto--boundaries changes.
+;; https://lists.gnu.org/archive/html/emacs-devel/2015-11/msg01652.html
+(defun undo-test-kill-c-a-then-undo ()
+  (with-temp-buffer
+    (switch-to-buffer (current-buffer))
+    (setq buffer-undo-list nil)
+    (insert "a\nb\n\c\n")
+    (goto-char (point-max))
+    ;; We use a keyboard macro because it adds undo events in the same
+    ;; way as if a user were involved.
+    (kmacro-call-macro nil nil nil
+                       [left
+                        ;; Delete "c"
+                        backspace
+                        left left left
+                        ;; Delete "a"
+                        backspace
+                        ;; C-/ or undo
+                        67108911
+                        ])
+    (point)))
+
+(defun undo-test-point-after-forward-kill ()
+  (with-temp-buffer
+    (switch-to-buffer (current-buffer))
+    (setq buffer-undo-list nil)
+    (insert "kill word forward")
+    ;; Move to word "word".
+    (goto-char 6)
+    (kmacro-call-macro nil nil nil
+                       [
+                        ;; kill-word
+                        C-delete
+                        ;; undo
+                        67108911
+                        ])
+    (point)))
+
+(ert-deftest undo-point-in-wrong-place ()
+  (should
+   ;; returns 5 with the bug
+   (= 2
+      (undo-test-kill-c-a-then-undo)))
+  (should
+   (= 6
+      (undo-test-point-after-forward-kill))))
+
+
 (provide 'simple-test)
 ;;; simple-test.el ends here
diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el
index ee8db59..3fcb7d3 100644
--- a/test/lisp/subr-tests.el
+++ b/test/lisp/subr-tests.el
@@ -103,5 +103,117 @@
   (should (equal (macroexpand-all '(when a b c d))
                  '(if a (progn b c d)))))
 
+(ert-deftest subr-test-version-parsing ()
+  (should (equal (version-to-list ".5") '(0 5)))
+  (should (equal (version-to-list "0.9 alpha1") '(0 9 -3 1)))
+  (should (equal (version-to-list "0.9 snapshot") '(0  9 -4)))
+  (should (equal (version-to-list "0.9-alpha1") '(0 9 -3 1)))
+  (should (equal (version-to-list "0.9-snapshot") '(0  9 -4)))
+  (should (equal (version-to-list "0.9.snapshot") '(0  9 -4)))
+  (should (equal (version-to-list "0.9_snapshot") '(0  9 -4)))
+  (should (equal (version-to-list "0.9alpha1") '(0 9 -3 1)))
+  (should (equal (version-to-list "0.9snapshot") '(0  9 -4)))
+  (should (equal (version-to-list "1.0 git") '(1  0 -4)))
+  (should (equal (version-to-list "1.0 pre2") '(1 0 -1 2)))
+  (should (equal (version-to-list "1.0-git") '(1  0 -4)))
+  (should (equal (version-to-list "1.0-pre2") '(1 0 -1 2)))
+  (should (equal (version-to-list "1.0.1-a") '(1 0 1 1)))
+  (should (equal (version-to-list "1.0.1-f") '(1 0 1 6)))
+  (should (equal (version-to-list "1.0.1.a") '(1 0 1 1)))
+  (should (equal (version-to-list "1.0.1.f") '(1 0 1 6)))
+  (should (equal (version-to-list "1.0.1_a") '(1 0 1 1)))
+  (should (equal (version-to-list "1.0.1_f") '(1 0 1 6)))
+  (should (equal (version-to-list "1.0.1a") '(1 0 1 1)))
+  (should (equal (version-to-list "1.0.1f") '(1 0 1 6)))
+  (should (equal (version-to-list "1.0.7.5") '(1 0 7 5)))
+  (should (equal (version-to-list "1.0.git") '(1  0 -4)))
+  (should (equal (version-to-list "1.0.pre2") '(1 0 -1 2)))
+  (should (equal (version-to-list "1.0_git") '(1  0 -4)))
+  (should (equal (version-to-list "1.0_pre2") '(1 0 -1 2)))
+  (should (equal (version-to-list "1.0git") '(1  0 -4)))
+  (should (equal (version-to-list "1.0pre2") '(1 0 -1 2)))
+  (should (equal (version-to-list "22.8 beta3") '(22 8 -2 3)))
+  (should (equal (version-to-list "22.8-beta3") '(22 8 -2 3)))
+  (should (equal (version-to-list "22.8.beta3") '(22 8 -2 3)))
+  (should (equal (version-to-list "22.8_beta3") '(22 8 -2 3)))
+  (should (equal (version-to-list "22.8beta3") '(22 8 -2 3)))
+  (should (equal (version-to-list "6.9.30 Beta") '(6 9 30 -2)))
+  (should (equal (version-to-list "6.9.30-Beta") '(6 9 30 -2)))
+  (should (equal (version-to-list "6.9.30.Beta") '(6 9 30 -2)))
+  (should (equal (version-to-list "6.9.30Beta") '(6 9 30 -2)))
+  (should (equal (version-to-list "6.9.30_Beta") '(6 9 30 -2)))
+
+  (should (equal
+            (error-message-string (should-error (version-to-list 
"OTP-18.1.5")))
+            "Invalid version syntax: `OTP-18.1.5' (must start with a number)"))
+  (should (equal
+            (error-message-string (should-error (version-to-list "")))
+            "Invalid version syntax: `' (must start with a number)"))
+  (should (equal
+            (error-message-string (should-error (version-to-list "1.0..7.5")))
+            "Invalid version syntax: `1.0..7.5'"))
+  (should (equal
+            (error-message-string (should-error (version-to-list 
"1.0prepre2")))
+            "Invalid version syntax: `1.0prepre2'"))
+  (should (equal
+            (error-message-string (should-error (version-to-list "22.8X3")))
+            "Invalid version syntax: `22.8X3'"))
+  (should (equal
+            (error-message-string (should-error (version-to-list 
"beta22.8alpha3")))
+            "Invalid version syntax: `beta22.8alpha3' (must start with a 
number)"))
+  (should (equal
+            (error-message-string (should-error (version-to-list "honk")))
+            "Invalid version syntax: `honk' (must start with a number)"))
+  (should (equal
+            (error-message-string (should-error (version-to-list 9)))
+            "Version must be a string"))
+
+  (let ((version-separator "_"))
+    (should (equal (version-to-list "_5") '(0 5)))
+    (should (equal (version-to-list "0_9 alpha1") '(0 9 -3 1)))
+    (should (equal (version-to-list "0_9 snapshot") '(0  9 -4)))
+    (should (equal (version-to-list "0_9-alpha1") '(0 9 -3 1)))
+    (should (equal (version-to-list "0_9-snapshot") '(0  9 -4)))
+    (should (equal (version-to-list "0_9.alpha1") '(0 9 -3 1)))
+    (should (equal (version-to-list "0_9.snapshot") '(0  9 -4)))
+    (should (equal (version-to-list "0_9alpha1") '(0 9 -3 1)))
+    (should (equal (version-to-list "0_9snapshot") '(0  9 -4)))
+    (should (equal (version-to-list "1_0 git") '(1  0 -4)))
+    (should (equal (version-to-list "1_0 pre2") '(1 0 -1 2)))
+    (should (equal (version-to-list "1_0-git") '(1  0 -4)))
+    (should (equal (version-to-list "1_0.pre2") '(1 0 -1 2)))
+    (should (equal (version-to-list "1_0_1-a") '(1 0 1 1)))
+    (should (equal (version-to-list "1_0_1-f") '(1 0 1 6)))
+    (should (equal (version-to-list "1_0_1.a") '(1 0 1 1)))
+    (should (equal (version-to-list "1_0_1.f") '(1 0 1 6)))
+    (should (equal (version-to-list "1_0_1_a") '(1 0 1 1)))
+    (should (equal (version-to-list "1_0_1_f") '(1 0 1 6)))
+    (should (equal (version-to-list "1_0_1a") '(1 0 1 1)))
+    (should (equal (version-to-list "1_0_1f") '(1 0 1 6)))
+    (should (equal (version-to-list "1_0_7_5") '(1 0 7 5)))
+    (should (equal (version-to-list "1_0_git") '(1  0 -4)))
+    (should (equal (version-to-list "1_0pre2") '(1 0 -1 2)))
+    (should (equal (version-to-list "22_8 beta3") '(22 8 -2 3)))
+    (should (equal (version-to-list "22_8-beta3") '(22 8 -2 3)))
+    (should (equal (version-to-list "22_8.beta3") '(22 8 -2 3)))
+    (should (equal (version-to-list "22_8beta3") '(22 8 -2 3)))
+    (should (equal (version-to-list "6_9_30 Beta") '(6 9 30 -2)))
+    (should (equal (version-to-list "6_9_30-Beta") '(6 9 30 -2)))
+    (should (equal (version-to-list "6_9_30.Beta") '(6 9 30 -2)))
+    (should (equal (version-to-list "6_9_30Beta") '(6 9 30 -2)))
+
+    (should (equal
+              (error-message-string (should-error (version-to-list 
"1_0__7_5")))
+              "Invalid version syntax: `1_0__7_5'"))
+    (should (equal
+              (error-message-string (should-error (version-to-list 
"1_0prepre2")))
+              "Invalid version syntax: `1_0prepre2'"))
+    (should (equal
+              (error-message-string (should-error (version-to-list "22.8X3")))
+              "Invalid version syntax: `22.8X3'"))
+    (should (equal
+              (error-message-string (should-error (version-to-list 
"beta22_8alpha3")))
+              "Invalid version syntax: `beta22_8alpha3' (must start with a 
number)"))))
+
 (provide 'subr-tests)
 ;;; subr-tests.el ends here
diff --git a/test/manual/etags/CTAGS.good b/test/manual/etags/CTAGS.good
index 9291d34..245f670 100644
--- a/test/manual/etags/CTAGS.good
+++ b/test/manual/etags/CTAGS.good
@@ -46,6 +46,7 @@ $user_comment_lc      php-src/lce_functions.php       115
 ($string,$flag,@string,@temp,@last     perl-src/yagrip.pl      40
 (a-forth-constant      forth-src/test-forth.fth        /^constant 
(a-forth-constant$/
 (another-forth-word    forth-src/test-forth.fth        /^: 
(another-forth-word) ( -- )$/
++      ruby-src/test.rb        /^        def +(y)$/
 +      tex-src/texinfo.tex     /^\\def+{{\\tt \\char 43}}$/
 /.notdef       ps-src/rfc1245.ps       /^\/.notdef \/.notdef \/.notdef 
\/.notdef \/.notdef \/.not/
 /.notdef       ps-src/rfc1245.ps       /^\/.notdef \/.notdef \/.notdef 
\/.notdef \/.notdef \/.not/
@@ -177,6 +178,9 @@ $user_comment_lc    php-src/lce_functions.php       115
 /yen   ps-src/rfc1245.ps       /^\/yen \/.notdef \/.notdef \/.notdef \/.notdef 
\/.notdef /
 :a-forth-dictionary-entry      forth-src/test-forth.fth        /^create 
:a-forth-dictionary-entry$/
 <      tex-src/texinfo.tex     /^\\def<{{\\tt \\less}}$/
+<<     ruby-src/test.rb        /^        def <<(y)$/
+<=     ruby-src/test.rb        /^        def <=(y)$/
+<=>    ruby-src/test.rb        /^        def <=>(y)$/
 =      tex-src/texinfo.tex     /^\\global\\let\\section = \\numberedsec$/
 =      tex-src/texinfo.tex     /^\\global\\let\\subsection = \\numberedsubsec$/
 =      tex-src/texinfo.tex     /^\\global\\let\\subsubsection = 
\\numberedsubsubsec$/
@@ -191,6 +195,8 @@ $user_comment_lc    php-src/lce_functions.php       115
 =      tex-src/texinfo.tex     /^\\global\\let\\subsubsection = 
\\numberedsubsubsec$/
 =      tex-src/texinfo.tex     /^\\global\\def={{\\tt \\char 61}}}$/
 =/f    ada-src/etags-test-for.ada      /^   function "=" (L, R : 
System.Address) return Boo/
+==     ruby-src/test.rb        /^        def ==(y)$/
+===    ruby-src/test.rb        /^        def ===(y)$/
 =\indexdummyfont       tex-src/texinfo.tex     /^\\let\\cite=\\indexdummyfont$/
 =\relax        tex-src/texinfo.tex     /^\\let\\chapter=\\relax$/
 =\relax        tex-src/texinfo.tex     /^\\let\\section=\\relax$/
@@ -220,6 +226,7 @@ A   cp-src/c.C      73
 A      cp-src/c.C      117
 A      cp-src/fail.C   7
 A      cp-src/fail.C   23
+A      ruby-src/test1.ruby     /^class A$/
 ADDRESS        c-src/emacs/src/gmalloc.c       /^#define ADDRESS(B)    ((void 
*) (((B) - 1) * BLOCKSIZ/
 ALIGNOF_STRUCT_LISP_VECTOR     c-src/emacs/src/lisp.h  1378
 ALLOCATED_BEFORE_DUMPING       c-src/emacs/src/gmalloc.c       /^#define 
ALLOCATED_BEFORE_DUMPING(P) \\$/
@@ -306,6 +313,7 @@ BUFFERP     c-src/emacs/src/lisp.h  /^BUFFERP (Lisp_Object 
a)$/
 BUFFERSIZE     objc-src/Subprocess.h   43
 BUFFER_OBJFWDP c-src/emacs/src/lisp.h  /^BUFFER_OBJFWDP (union Lisp_Fwd *a)$/
 BYTE_MARK_STACK        c-src/emacs/src/lisp.h  3181
+Bar    lua-src/test.lua        /^function Square.something:Bar ()$/
 Bar    perl-src/kai-test.pl    /^package Bar;$/
 Bar::f4        perl-src/kai-test.pl    /^sub Bar::f4 {$/
 Bar::f5        perl-src/kai-test.pl    /^sub f5 {$/
@@ -425,9 +433,12 @@ C_entries  c-src/etags.c   /^C_entries (int c_ext, FILE 
*inf)$/
 C_stab_entry   c-src/etags.c   2271
 C_symtype      c-src/etags.c   /^C_symtype (char *str, int len, int c_ext)$/
 ChangeFileType pas-src/common.pas      /^function ChangeFileType; (*(FileName 
: NameString;/
+Circle.getPos  lua-src/test.lua        /^function Circle.getPos ()$/
 Cjava_entries  c-src/etags.c   /^Cjava_entries (FILE *inf)$/
 Cjava_help     c-src/etags.c   551
 Cjava_suffixes c-src/etags.c   549
+ClassExample   ruby-src/test.rb        /^    class ClassExample$/
+ClassExample.singleton_class_method    ruby-src/test.rb        /^        def 
ClassExample.singleton_class_method$/
 Clear/p        ada-src/2ataspri.adb    /^   procedure Clear (Cell : in out 
TAS_Cell) is$/
 Clear/p        ada-src/2ataspri.ads    /^   procedure Clear        (Cell : in 
out TAS_Cell)/
 Cobol_help     c-src/etags.c   558
@@ -458,6 +469,7 @@ Create_LL_Task/p    ada-src/2ataspri.adb    /^   procedure 
Create_LL_Task$/
 Create_LL_Task/p       ada-src/2ataspri.ads    /^   procedure Create_LL_Task$/
 Cstar_entries  c-src/etags.c   /^Cstar_entries (FILE *inf)$/
 Cstar_suffixes c-src/etags.c   562
+Cube.data.getFoo       lua-src/test.lua        /^function Cube.data.getFoo ()$/
 D      cp-src/fail.C   41
 D      cp-src/fail.C   /^              D() : ::A::T2::T(97), x(1066) {}$/
 DAEMON_RUNNING c-src/emacs/src/lisp.h  4258
@@ -926,6 +938,8 @@ Mconway.cpp cp-src/conway.cpp       /^void main(void)$/
 Metags c-src/etags.c   /^main (int argc, char **argv)$/
 Mfail  cp-src/fail.C   /^main()$/
 Mkai-test.pl   perl-src/kai-test.pl    /^package main;$/
+ModuleExample  ruby-src/test.rb        /^module ModuleExample$/
+ModuleExample.singleton_module_method  ruby-src/test.rb        /^    def 
ModuleExample.singleton_module_method$/
 More_Lisp_Bits c-src/emacs/src/lisp.h  801
 MoveLayerAfter lua-src/allegro.lua     /^function MoveLayerAfter (this_one)$/
 MoveLayerBefore        lua-src/allegro.lua     /^function MoveLayerBefore 
(this_one)$/
@@ -1193,6 +1207,7 @@ Range     cp-src/Range.h  /^  Range (double b, double l, 
double i)$/
 ReadVacation   cp-src/functions.cpp    /^void ReadVacation ( char *filename ) 
{$/
 Read_Lock/p    ada-src/2ataspri.adb    /^   procedure Read_Lock (L : in out 
Lock; Ceiling_V/
 Read_Lock/p    ada-src/2ataspri.ads    /^   procedure Read_Lock (L : in out 
Lock; Ceiling_V/
+Rectangle.getPos       lua-src/test.lua        /^function Rectangle.getPos ()$/
 ReleaseNameString      pas-src/common.pas      /^procedure ReleaseNameString; 
(* (var NSP: NameStri/
 RemoveLayer    lua-src/allegro.lua     /^function RemoveLayer ()$/
 RemoveUnderlineControl pas-src/common.pas      /^function 
RemoveUnderlineControl; (*($/
@@ -1309,6 +1324,7 @@ SimpleCalc        objcpp-src/SimpleCalc.H /address@hidden 
SimpleCalc:Object$/
 SkipBlanks     pas-src/common.pas      /^function SkipBlanks; (*($/
 SkipChars      pas-src/common.pas      /^function SkipChars; (*($/
 SkipSpaces     pas-src/common.pas      /^procedure SkipSpaces; (* (Str : 
NameString; var I /
+Square.something:Bar   lua-src/test.lua        /^function Square.something:Bar 
()$/
 StartDay       cp-src/functions.cpp    /^Date StartDay(Date a,int 
days){\/\/Function to calcu/
 StripPath      pas-src/common.pas      /^function StripPath; (*($/
 SubString      pas-src/common.pas      /^function SubString; (*($/
@@ -1647,6 +1663,8 @@ Yacc_entries      c-src/etags.c   /^Yacc_entries (FILE 
*inf)$/
 Yacc_help      c-src/etags.c   693
 Yacc_suffixes  c-src/etags.c   691
 Z      c-src/h.h       100
+[]     ruby-src/test.rb        /^        def [](y)$/
+[]=    ruby-src/test.rb        /^        def []=(y, val)$/
 \      tex-src/texinfo.tex     /^\\def\\ {{\\fontdimen2\\font=\\tclosesave{} 
}}%$/
 \      tex-src/texinfo.tex     /^\\gdef\\sepspaces{\\def {\\ }}}$/
 \'     tex-src/texinfo.tex     /^\\def\\'{{'}}$/
@@ -2353,6 +2371,7 @@ _malloc_thread_enabled_p  c-src/emacs/src/gmalloc.c       
519
 _realloc       c-src/emacs/src/gmalloc.c       /^_realloc (void *ptr, size_t 
size)$/
 _realloc_internal      c-src/emacs/src/gmalloc.c       /^_realloc_internal 
(void *ptr, size_t size)$/
 _realloc_internal_nolock       c-src/emacs/src/gmalloc.c       
/^_realloc_internal_nolock (void *ptr, size_t size)$/
+`      ruby-src/test.rb        /^        def `(command)$/
 a      c.c     152
 a      c.c     180
 a      c.c     /^a()$/
@@ -2360,6 +2379,7 @@ a c.c     /^a ()$/
 a      c-src/h.h       40
 a      c-src/h.h       103
 a      cp-src/c.C      132
+a      ruby-src/test1.ruby     /^ def a()$/
 a-forth-constant!      forth-src/test-forth.fth        /^99 constant 
a-forth-constant!$/
 a-forth-value? forth-src/test-forth.fth        /^55 value a-forth-value?$/
 a-forth-word   forth-src/test-forth.fth        /^: a-forth-word ( a b c -- 
a*b+c )  + * ;$/
@@ -2484,6 +2504,7 @@ b c-src/h.h       41
 b      c-src/h.h       103
 b      c-src/h.h       104
 b      cp-src/c.C      132
+b      ruby-src/test1.ruby     /^ def b()$/
 backslash=0    tex-src/texinfo.tex     /^\\let\\indexbackslash=0  %overridden 
during \\printin/
 bar    c-src/c.c       /^void bar() {while(0) {}}$/
 bar    c.c     143
@@ -2599,6 +2620,10 @@ childDidExit     objc-src/Subprocess.m   /^- 
childDidExit$/
 chunks_free    c-src/emacs/src/gmalloc.c       313
 chunks_used    c-src/emacs/src/gmalloc.c       311
 cjava  c-src/etags.c   2936
+class_method   ruby-src/test.rb        /^        def class_method$/
+class_method_equals=   ruby-src/test.rb        /^        def 
class_method_equals=$/
+class_method_exclamation!      ruby-src/test.rb        /^        def 
class_method_exclamation!$/
+class_method_question? ruby-src/test.rb        /^        def 
class_method_question?$/
 classifyLine   php-src/lce_functions.php       /^      function 
classifyLine($line)$/
 clear  cp-src/conway.hpp       /^    void clear(void) { alive = 0; }$/
 clear-abbrev-table     c-src/abbrev.c  /^DEFUN ("clear-abbrev-table", 
Fclear_abbrev_table, /
@@ -2988,8 +3013,11 @@ generic_object   cp-src/clheir.cpp       
/^generic_object::generic_object(void)$/
 generic_object cp-src/clheir.hpp       13
 getArchs       objc-src/PackInsp.m     /^-(void)getArchs$/
 getDomainNames php-src/lce_functions.php       /^      function 
getDomainNames()$/
+getFoo lua-src/test.lua        /^function Cube.data.getFoo ()$/
 getPOReader    php-src/lce_functions.php       /^      function 
&getPOReader($domain)$/
 getPath        objc-src/PackInsp.m     /^-(const char *)getPath:(char *)buf 
forType:(const /
+getPos lua-src/test.lua        /^function Rectangle.getPos ()$/
+getPos lua-src/test.lua        /^function Circle.getPos ()$/
 getTextDomains php-src/lce_functions.php       /^  function 
getTextDomains($lines)$/
 get_compressor_from_suffix     c-src/etags.c   /^get_compressor_from_suffix 
(char *file, char **ext/
 get_contiguous_space   c-src/emacs/src/gmalloc.c       /^get_contiguous_space 
(ptrdiff_t size, void *positi/
@@ -3397,6 +3425,8 @@ mcCSC     cp-src/c.C      6
 mcheck c-src/emacs/src/gmalloc.c       /^mcheck (void (*func) (enum 
mcheck_status))$/
 mcheck_status  c-src/emacs/src/gmalloc.c       283
 mcheck_used    c-src/emacs/src/gmalloc.c       2012
+me22b  lua-src/test.lua        /^   local function test.me22b (one)$/
+me_22a lua-src/test.lua        /^   function test.me_22a(one, two)$/
 memalign       c-src/emacs/src/gmalloc.c       /^memalign (size_t alignment, 
size_t size)$/
 member prol-src/natded.prolog  /^member(X,[X|_]).$/
 memclear       c-src/emacs/src/lisp.h  /^memclear (void *p, ptrdiff_t nbytes)$/
@@ -3420,6 +3450,7 @@ miti      html-src/softwarelibero.html    /^Sfatiamo 
alcuni miti$/
 modifier_names c-src/emacs/src/keyboard.c      6319
 modifier_symbols       c-src/emacs/src/keyboard.c      6327
 modify_event_symbol    c-src/emacs/src/keyboard.c      /^modify_event_symbol 
(ptrdiff_t symbol_num, int mod/
+module_method  ruby-src/test.rb        /^    def module_method$/
 more_aligned_int       c.c     165
 morecore_nolock        c-src/emacs/src/gmalloc.c       /^morecore_nolock 
(size_t size)$/
 morecore_recursing     c-src/emacs/src/gmalloc.c       604
@@ -4180,6 +4211,8 @@ test      c-src/emacs/src/lisp.h  1871
 test   cp-src/c.C      86
 test   erl-src/gs_dialog.erl   /^test() ->$/
 test   php-src/ptest.php       /^test $/
+test.me22b     lua-src/test.lua        /^   local function test.me22b (one)$/
+test.me_22a    lua-src/test.lua        /^   function test.me_22a(one, two)$/
 test_undefined c-src/emacs/src/keyboard.c      /^test_undefined (Lisp_Object 
binding)$/
 texttreelist   prol-src/natded.prolog  /^texttreelist([]).$/
 this   c-src/a/b/b.c   1
diff --git a/test/manual/etags/ETAGS.good_1 b/test/manual/etags/ETAGS.good_1
index e1e0daf..2ae4ec4 100644
--- a/test/manual/etags/ETAGS.good_1
+++ b/test/manual/etags/ETAGS.good_1
@@ -2084,17 +2084,17 @@ void agent::move(move53,1353
 
 cp-src/clheir.hpp,423
 class generic_object13,520
-    virtual void compute_next_state(21,842
-    virtual void step(22,888
-const int max_num_directions 31,1219
-class location:location33,1289
-    location(43,1642
-class irregular_location:irregular_location47,1686
-    irregular_location(51,1762
-class discrete_location:discrete_location56,1889
-    discrete_location(62,2044
-    void assign_neighbor(66,2184
-class agent:agent75,2508
+    virtual void compute_next_state(21,843
+    virtual void step(22,889
+const int max_num_directions 31,1220
+class location:location33,1290
+    location(43,1643
+class irregular_location:irregular_location47,1687
+    irregular_location(51,1763
+class discrete_location:discrete_location56,1890
+    discrete_location(62,2045
+    void assign_neighbor(66,2185
+class agent:agent75,2509
 
 cp-src/fail.C,294
 struct A 7,263
@@ -2218,28 +2218,28 @@ el-src/emacs/lisp/progmodes/etags.el,5069
 (defun next-file 1685,67976
 (defvar tags-loop-operate 1760,70890
 (defvar tags-loop-scan1763,70984
-(defun tags-loop-eval 1771,71314
-(defun tags-loop-continue 1782,71643
-(defun tags-search 1850,73949
-(defun tags-query-replace 1871,74775
-(defun tags-complete-tags-table-file 1896,75999
-(defun list-tags 1906,76378
-(defun tags-apropos 1934,77331
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
-(defun select-tags-table 1964,78396
-(defvar select-tags-table-mode-map 2019,80523
-(define-derived-mode select-tags-table-mode 2030,80906
-(defun select-tags-table-select 2034,81090
-(defun select-tags-table-quit 2043,81456
-(defun complete-tag 2049,81611
-(defconst etags--xref-limit 2074,82552
-(defvar etags-xref-find-definitions-tag-order 2076,82587
-(defun etags-xref-find 2082,82877
-(defun etags--xref-find-definitions 2096,83406
-(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
+(defun tags-loop-eval 1771,71313
+(defun tags-loop-continue 1782,71642
+(defun tags-search 1850,73948
+(defun tags-query-replace 1871,74774
+(defun tags-complete-tags-table-file 1896,75998
+(defun list-tags 1906,76377
+(defun tags-apropos 1934,77330
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78156
+(defun select-tags-table 1964,78395
+(defvar select-tags-table-mode-map 2019,80522
+(define-derived-mode select-tags-table-mode 2030,80905
+(defun select-tags-table-select 2034,81089
+(defun select-tags-table-quit 2043,81455
+(defun complete-tag 2049,81610
+(defconst etags--xref-limit 2074,82551
+(defvar etags-xref-find-definitions-tag-order 2076,82586
+(defun etags-xref-find 2082,82876
+(defun etags--xref-find-definitions 2096,83405
+(defclass xref-etags-location 2129,85120
+(defun xref-make-etags-location 2135,85343
+(cl-defmethod xref-location-marker 2139,85498
+(cl-defmethod xref-location-line 2146,85742
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
@@ -2336,49 +2336,63 @@ function MoveLayerBottom 223,5079
 function MoveLayerBefore 236,5457
 function MoveLayerAfter 258,6090
 
+lua-src/test.lua,442
+function Rectangle.getPos 2,15
+function Rectangle.getPos getPos2,15
+function Circle.getPos 6,61
+function Circle.getPos getPos6,61
+function Cube.data.getFoo 10,102
+function Cube.data.getFoo getFoo10,102
+function Square.something:Bar 14,148
+function Square.something:Bar Bar14,148
+   function test.me_22a(22,241
+   function test.me_22a(me_22a22,241
+   local function test.me22b 25,297
+   local function test.me22b me22b25,297
+
 make-src/Makefile,1133
 LATEST=1,0
-NONSRCS=35,1578
-CPPFLAGS=49,2191
-LDFLAGS=50,2260
-FASTCFLAGS=55,2531
-FILTER=58,2642
-       @-$($72,3064
-       @-$($73,3113
-       @-$($74,3177
-       @-$($75,3223
-       @-$($76,3291
-       @-$($77,3383
-       @$(81,3466
-       @$(82,3514
-       @$(83,3577
-       @$(84,3622
-       @$(85,3689
-       @$(86,3780
-${CHECKOBJS}: CFLAGS=88,3806
-       @env CHECKEROPTS=92,3922
-       @$(98,4094
-       @$(106,4250
-       @$(110,4374
-       @$(114,4500
-       @for i in $(SRCS); do echo $$i;140,5315
-       $(160,6053
-       $(163,6114
-       $(166,6177
-       $(169,6228
-       $(172,6317
-       sdiff --suppress-common-lines --width=width186,6614
-       sdiff --suppress-common-lines --width=width189,6703
-       sdiff --suppress-common-lines --width=width192,6791
-       sdiff --suppress-common-lines --width=width195,6880
-       TEXTAGS=204,7122
-       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
-       ${RUN} etags12 --members -o $@ --regex=regex207,7239
-       ${RUN} ./ctags -o $@ --regex=regex213,7388
-       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
-       TEXTAGS=219,7583
-       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
-       ${RUN} ./extags -e --regex-c=c222,7710
+NONSRCS=35,1577
+CPPFLAGS=49,2190
+LDFLAGS=50,2259
+FASTCFLAGS=55,2530
+FILTER=58,2641
+       @-$($72,3063
+       @-$($73,3112
+       @-$($74,3176
+       @-$($75,3222
+       @-$($76,3290
+       @-$($77,3382
+       @$(81,3465
+       @$(82,3513
+       @$(83,3576
+       @$(84,3621
+       @$(85,3688
+       @$(86,3779
+${CHECKOBJS}: CFLAGS=88,3805
+       @env CHECKEROPTS=92,3921
+       @$(98,4093
+       @$(106,4249
+       @$(110,4373
+       @$(114,4499
+       @for i in $(SRCS); do echo $$i;140,5320
+       $(160,6058
+       $(163,6119
+       $(166,6182
+       $(169,6233
+       $(172,6322
+       sdiff --suppress-common-lines --width=width186,6619
+       sdiff --suppress-common-lines --width=width189,6708
+       sdiff --suppress-common-lines --width=width192,6796
+       sdiff --suppress-common-lines --width=width195,6885
+       TEXTAGS=204,7127
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7127
+       ${RUN} etags12 --members -o $@ --regex=regex207,7244
+       ${RUN} ./ctags -o $@ --regex=regex213,7393
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7469
+       TEXTAGS=219,7588
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7588
+       ${RUN} ./extags -e --regex-c=c222,7715
 
 objc-src/Subprocess.h,98
 #define Subprocess 41,1217
@@ -2963,6 +2977,31 @@ class Configure(760,24879
     def save(797,26022
     def nosave(807,26310
 
+ruby-src/test.rb,594
+module ModuleExample1,0
+    class ClassExample2,21
+        def class_method3,44
+        def ClassExample.singleton_class_method6,116
+        def class_method_exclamation!9,221
+        def class_method_question?12,319
+        def class_method_equals=class_method_equals=15,411
+        def `(18,499
+        def +(21,589
+        def [](24,637
+        def []=([]=27,687
+        def <<(30,749
+        def ==(==33,799
+        def <=(<=36,869
+        def <=>(<=>39,940
+        def ===(===42,987
+    def module_method46,1048
+    def ModuleExample.singleton_module_method49,1110
+
+ruby-src/test1.ruby,37
+class A1,0
+ def a(2,8
+ def b(5,38
+
 tex-src/testenv.tex,52
 \newcommand{\nm}\nm4,77
 \section{blah}blah8,139
diff --git a/test/manual/etags/ETAGS.good_2 b/test/manual/etags/ETAGS.good_2
index 8b07422..3ec5b21 100644
--- a/test/manual/etags/ETAGS.good_2
+++ b/test/manual/etags/ETAGS.good_2
@@ -2642,24 +2642,24 @@ extern void step_everybody(11,485
 class generic_object13,520
     generic_object(17,582
     ~generic_object(19,724
-    virtual void compute_next_state(21,842
-    virtual void step(22,888
-const int max_num_directions 31,1219
-class location:location33,1289
-    location(43,1642
-    ~location(44,1661
-class irregular_location:irregular_location47,1686
-    irregular_location(51,1762
-    ~irregular_location(53,1854
-class discrete_location:discrete_location56,1889
-    void clear_neighbors(60,2004
-    discrete_location(62,2044
-    ~discrete_location(65,2154
-    void assign_neighbor(66,2184
-class agent:agent75,2508
-    agent(79,2578
-    ~agent(80,2591
-    void move(81,2605
+    virtual void compute_next_state(21,843
+    virtual void step(22,889
+const int max_num_directions 31,1220
+class location:location33,1290
+    location(43,1643
+    ~location(44,1662
+class irregular_location:irregular_location47,1687
+    irregular_location(51,1763
+    ~irregular_location(53,1855
+class discrete_location:discrete_location56,1890
+    void clear_neighbors(60,2005
+    discrete_location(62,2045
+    ~discrete_location(65,2155
+    void assign_neighbor(66,2185
+class agent:agent75,2509
+    agent(79,2579
+    ~agent(80,2592
+    void move(81,2606
 
 cp-src/fail.C,315
 struct A 7,263
@@ -2787,28 +2787,28 @@ el-src/emacs/lisp/progmodes/etags.el,5188
 (defun next-file 1685,67976
 (defvar tags-loop-operate 1760,70890
 (defvar tags-loop-scan1763,70984
-(defun tags-loop-eval 1771,71314
-(defun tags-loop-continue 1782,71643
-(defun tags-search 1850,73949
-(defun tags-query-replace 1871,74775
-(defun tags-complete-tags-table-file 1896,75999
-(defun list-tags 1906,76378
-(defun tags-apropos 1934,77331
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
-(defun select-tags-table 1964,78396
-(defvar select-tags-table-mode-map 2019,80523
-(define-derived-mode select-tags-table-mode 2030,80906
-(defun select-tags-table-select 2034,81090
-(defun select-tags-table-quit 2043,81456
-(defun complete-tag 2049,81611
-(defconst etags--xref-limit 2074,82552
-(defvar etags-xref-find-definitions-tag-order 2076,82587
-(defun etags-xref-find 2082,82877
-(defun etags--xref-find-definitions 2096,83406
-(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
+(defun tags-loop-eval 1771,71313
+(defun tags-loop-continue 1782,71642
+(defun tags-search 1850,73948
+(defun tags-query-replace 1871,74774
+(defun tags-complete-tags-table-file 1896,75998
+(defun list-tags 1906,76377
+(defun tags-apropos 1934,77330
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78156
+(defun select-tags-table 1964,78395
+(defvar select-tags-table-mode-map 2019,80522
+(define-derived-mode select-tags-table-mode 2030,80905
+(defun select-tags-table-select 2034,81089
+(defun select-tags-table-quit 2043,81455
+(defun complete-tag 2049,81610
+(defconst etags--xref-limit 2074,82551
+(defvar etags-xref-find-definitions-tag-order 2076,82586
+(defun etags-xref-find 2082,82876
+(defun etags--xref-find-definitions 2096,83405
+(defclass xref-etags-location 2129,85120
+(defun xref-make-etags-location 2135,85343
+(cl-defmethod xref-location-marker 2139,85498
+(cl-defmethod xref-location-line 2146,85742
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
@@ -2905,50 +2905,64 @@ function MoveLayerBottom 223,5079
 function MoveLayerBefore 236,5457
 function MoveLayerAfter 258,6090
 
+lua-src/test.lua,442
+function Rectangle.getPos 2,15
+function Rectangle.getPos getPos2,15
+function Circle.getPos 6,61
+function Circle.getPos getPos6,61
+function Cube.data.getFoo 10,102
+function Cube.data.getFoo getFoo10,102
+function Square.something:Bar 14,148
+function Square.something:Bar Bar14,148
+   function test.me_22a(22,241
+   function test.me_22a(me_22a22,241
+   local function test.me22b 25,297
+   local function test.me22b me22b25,297
+
 make-src/Makefile,1156
 LATEST=1,0
-NONSRCS=35,1578
-CPPFLAGS=49,2191
-LDFLAGS=50,2260
-FASTCFLAGS=55,2531
-FILTER=58,2642
-       @-$($72,3064
-       @-$($73,3113
-       @-$($74,3177
-       @-$($75,3223
-       @-$($76,3291
-       @-$($77,3383
-       @$(81,3466
-       @$(82,3514
-       @$(83,3577
-       @$(84,3622
-       @$(85,3689
-       @$(86,3780
-${CHECKOBJS}: CFLAGS=88,3806
-       @env CHECKEROPTS=92,3922
-       @$(98,4094
-       @$(106,4250
-       @$(110,4374
-       @$(114,4500
-       @for i in $(140,5315
-       @for i in $(SRCS); do echo $$i;140,5315
-       $(160,6053
-       $(163,6114
-       $(166,6177
-       $(169,6228
-       $(172,6317
-       sdiff --suppress-common-lines --width=width186,6614
-       sdiff --suppress-common-lines --width=width189,6703
-       sdiff --suppress-common-lines --width=width192,6791
-       sdiff --suppress-common-lines --width=width195,6880
-       TEXTAGS=204,7122
-       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
-       ${RUN} etags12 --members -o $@ --regex=regex207,7239
-       ${RUN} ./ctags -o $@ --regex=regex213,7388
-       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
-       TEXTAGS=219,7583
-       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
-       ${RUN} ./extags -e --regex-c=c222,7710
+NONSRCS=35,1577
+CPPFLAGS=49,2190
+LDFLAGS=50,2259
+FASTCFLAGS=55,2530
+FILTER=58,2641
+       @-$($72,3063
+       @-$($73,3112
+       @-$($74,3176
+       @-$($75,3222
+       @-$($76,3290
+       @-$($77,3382
+       @$(81,3465
+       @$(82,3513
+       @$(83,3576
+       @$(84,3621
+       @$(85,3688
+       @$(86,3779
+${CHECKOBJS}: CFLAGS=88,3805
+       @env CHECKEROPTS=92,3921
+       @$(98,4093
+       @$(106,4249
+       @$(110,4373
+       @$(114,4499
+       @for i in $(140,5320
+       @for i in $(SRCS); do echo $$i;140,5320
+       $(160,6058
+       $(163,6119
+       $(166,6182
+       $(169,6233
+       $(172,6322
+       sdiff --suppress-common-lines --width=width186,6619
+       sdiff --suppress-common-lines --width=width189,6708
+       sdiff --suppress-common-lines --width=width192,6796
+       sdiff --suppress-common-lines --width=width195,6885
+       TEXTAGS=204,7127
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7127
+       ${RUN} etags12 --members -o $@ --regex=regex207,7244
+       ${RUN} ./ctags -o $@ --regex=regex213,7393
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7469
+       TEXTAGS=219,7588
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7588
+       ${RUN} ./extags -e --regex-c=c222,7715
 
 objc-src/Subprocess.h,98
 #define Subprocess 41,1217
@@ -3534,6 +3548,31 @@ class Configure(760,24879
     def save(797,26022
     def nosave(807,26310
 
+ruby-src/test.rb,594
+module ModuleExample1,0
+    class ClassExample2,21
+        def class_method3,44
+        def ClassExample.singleton_class_method6,116
+        def class_method_exclamation!9,221
+        def class_method_question?12,319
+        def class_method_equals=class_method_equals=15,411
+        def `(18,499
+        def +(21,589
+        def [](24,637
+        def []=([]=27,687
+        def <<(30,749
+        def ==(==33,799
+        def <=(<=36,869
+        def <=>(<=>39,940
+        def ===(===42,987
+    def module_method46,1048
+    def ModuleExample.singleton_module_method49,1110
+
+ruby-src/test1.ruby,37
+class A1,0
+ def a(2,8
+ def b(5,38
+
 tex-src/testenv.tex,52
 \newcommand{\nm}\nm4,77
 \section{blah}blah8,139
diff --git a/test/manual/etags/ETAGS.good_3 b/test/manual/etags/ETAGS.good_3
index 37eaafb..43b84ee 100644
--- a/test/manual/etags/ETAGS.good_3
+++ b/test/manual/etags/ETAGS.good_3
@@ -2391,25 +2391,25 @@ void agent::move(move53,1353
 cp-src/clheir.hpp,682
 class generic_object13,520
     int where_in_registry;15,547
-    virtual void compute_next_state(21,842
-    virtual void step(22,888
-const int max_num_directions 31,1219
-class location:location33,1289
-    location(43,1642
-class irregular_location:irregular_location47,1686
-    double x,49,1734
-    double x, y,49,1734
-    double x, y, z;49,1734
-    irregular_location(51,1762
-class discrete_location:discrete_location56,1889
-    int x,58,1936
-    int x, y,58,1936
-    int x, y, z;58,1936
-    class location *neighbors[neighbors59,1953
-    discrete_location(62,2044
-    void assign_neighbor(66,2184
-class agent:agent75,2508
-    location *where;where77,2549
+    virtual void compute_next_state(21,843
+    virtual void step(22,889
+const int max_num_directions 31,1220
+class location:location33,1290
+    location(43,1643
+class irregular_location:irregular_location47,1687
+    double x,49,1735
+    double x, y,49,1735
+    double x, y, z;49,1735
+    irregular_location(51,1763
+class discrete_location:discrete_location56,1890
+    int x,58,1937
+    int x, y,58,1937
+    int x, y, z;58,1937
+    class location *neighbors[neighbors59,1954
+    discrete_location(62,2045
+    void assign_neighbor(66,2185
+class agent:agent75,2509
+    location *where;where77,2550
 
 cp-src/fail.C,330
 struct A 7,263
@@ -2535,28 +2535,28 @@ el-src/emacs/lisp/progmodes/etags.el,5069
 (defun next-file 1685,67976
 (defvar tags-loop-operate 1760,70890
 (defvar tags-loop-scan1763,70984
-(defun tags-loop-eval 1771,71314
-(defun tags-loop-continue 1782,71643
-(defun tags-search 1850,73949
-(defun tags-query-replace 1871,74775
-(defun tags-complete-tags-table-file 1896,75999
-(defun list-tags 1906,76378
-(defun tags-apropos 1934,77331
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
-(defun select-tags-table 1964,78396
-(defvar select-tags-table-mode-map 2019,80523
-(define-derived-mode select-tags-table-mode 2030,80906
-(defun select-tags-table-select 2034,81090
-(defun select-tags-table-quit 2043,81456
-(defun complete-tag 2049,81611
-(defconst etags--xref-limit 2074,82552
-(defvar etags-xref-find-definitions-tag-order 2076,82587
-(defun etags-xref-find 2082,82877
-(defun etags--xref-find-definitions 2096,83406
-(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
+(defun tags-loop-eval 1771,71313
+(defun tags-loop-continue 1782,71642
+(defun tags-search 1850,73948
+(defun tags-query-replace 1871,74774
+(defun tags-complete-tags-table-file 1896,75998
+(defun list-tags 1906,76377
+(defun tags-apropos 1934,77330
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78156
+(defun select-tags-table 1964,78395
+(defvar select-tags-table-mode-map 2019,80522
+(define-derived-mode select-tags-table-mode 2030,80905
+(defun select-tags-table-select 2034,81089
+(defun select-tags-table-quit 2043,81455
+(defun complete-tag 2049,81610
+(defconst etags--xref-limit 2074,82551
+(defvar etags-xref-find-definitions-tag-order 2076,82586
+(defun etags-xref-find 2082,82876
+(defun etags--xref-find-definitions 2096,83405
+(defclass xref-etags-location 2129,85120
+(defun xref-make-etags-location 2135,85343
+(cl-defmethod xref-location-marker 2139,85498
+(cl-defmethod xref-location-line 2146,85742
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
@@ -2653,49 +2653,63 @@ function MoveLayerBottom 223,5079
 function MoveLayerBefore 236,5457
 function MoveLayerAfter 258,6090
 
+lua-src/test.lua,442
+function Rectangle.getPos 2,15
+function Rectangle.getPos getPos2,15
+function Circle.getPos 6,61
+function Circle.getPos getPos6,61
+function Cube.data.getFoo 10,102
+function Cube.data.getFoo getFoo10,102
+function Square.something:Bar 14,148
+function Square.something:Bar Bar14,148
+   function test.me_22a(22,241
+   function test.me_22a(me_22a22,241
+   local function test.me22b 25,297
+   local function test.me22b me22b25,297
+
 make-src/Makefile,1133
 LATEST=1,0
-NONSRCS=35,1578
-CPPFLAGS=49,2191
-LDFLAGS=50,2260
-FASTCFLAGS=55,2531
-FILTER=58,2642
-       @-$($72,3064
-       @-$($73,3113
-       @-$($74,3177
-       @-$($75,3223
-       @-$($76,3291
-       @-$($77,3383
-       @$(81,3466
-       @$(82,3514
-       @$(83,3577
-       @$(84,3622
-       @$(85,3689
-       @$(86,3780
-${CHECKOBJS}: CFLAGS=88,3806
-       @env CHECKEROPTS=92,3922
-       @$(98,4094
-       @$(106,4250
-       @$(110,4374
-       @$(114,4500
-       @for i in $(SRCS); do echo $$i;140,5315
-       $(160,6053
-       $(163,6114
-       $(166,6177
-       $(169,6228
-       $(172,6317
-       sdiff --suppress-common-lines --width=width186,6614
-       sdiff --suppress-common-lines --width=width189,6703
-       sdiff --suppress-common-lines --width=width192,6791
-       sdiff --suppress-common-lines --width=width195,6880
-       TEXTAGS=204,7122
-       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
-       ${RUN} etags12 --members -o $@ --regex=regex207,7239
-       ${RUN} ./ctags -o $@ --regex=regex213,7388
-       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
-       TEXTAGS=219,7583
-       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
-       ${RUN} ./extags -e --regex-c=c222,7710
+NONSRCS=35,1577
+CPPFLAGS=49,2190
+LDFLAGS=50,2259
+FASTCFLAGS=55,2530
+FILTER=58,2641
+       @-$($72,3063
+       @-$($73,3112
+       @-$($74,3176
+       @-$($75,3222
+       @-$($76,3290
+       @-$($77,3382
+       @$(81,3465
+       @$(82,3513
+       @$(83,3576
+       @$(84,3621
+       @$(85,3688
+       @$(86,3779
+${CHECKOBJS}: CFLAGS=88,3805
+       @env CHECKEROPTS=92,3921
+       @$(98,4093
+       @$(106,4249
+       @$(110,4373
+       @$(114,4499
+       @for i in $(SRCS); do echo $$i;140,5320
+       $(160,6058
+       $(163,6119
+       $(166,6182
+       $(169,6233
+       $(172,6322
+       sdiff --suppress-common-lines --width=width186,6619
+       sdiff --suppress-common-lines --width=width189,6708
+       sdiff --suppress-common-lines --width=width192,6796
+       sdiff --suppress-common-lines --width=width195,6885
+       TEXTAGS=204,7127
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7127
+       ${RUN} etags12 --members -o $@ --regex=regex207,7244
+       ${RUN} ./ctags -o $@ --regex=regex213,7393
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7469
+       TEXTAGS=219,7588
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7588
+       ${RUN} ./extags -e --regex-c=c222,7715
 
 objc-src/Subprocess.h,98
 #define Subprocess 41,1217
@@ -3307,6 +3321,31 @@ class Configure(760,24879
     def save(797,26022
     def nosave(807,26310
 
+ruby-src/test.rb,594
+module ModuleExample1,0
+    class ClassExample2,21
+        def class_method3,44
+        def ClassExample.singleton_class_method6,116
+        def class_method_exclamation!9,221
+        def class_method_question?12,319
+        def class_method_equals=class_method_equals=15,411
+        def `(18,499
+        def +(21,589
+        def [](24,637
+        def []=([]=27,687
+        def <<(30,749
+        def ==(==33,799
+        def <=(<=36,869
+        def <=>(<=>39,940
+        def ===(===42,987
+    def module_method46,1048
+    def ModuleExample.singleton_module_method49,1110
+
+ruby-src/test1.ruby,37
+class A1,0
+ def a(2,8
+ def b(5,38
+
 tex-src/testenv.tex,52
 \newcommand{\nm}\nm4,77
 \section{blah}blah8,139
diff --git a/test/manual/etags/ETAGS.good_4 b/test/manual/etags/ETAGS.good_4
index 2b631d1..434fe13 100644
--- a/test/manual/etags/ETAGS.good_4
+++ b/test/manual/etags/ETAGS.good_4
@@ -2248,17 +2248,17 @@ void agent::move(move53,1353
 
 cp-src/clheir.hpp,423
 class generic_object13,520
-    virtual void compute_next_state(21,842
-    virtual void step(22,888
-const int max_num_directions 31,1219
-class location:location33,1289
-    location(43,1642
-class irregular_location:irregular_location47,1686
-    irregular_location(51,1762
-class discrete_location:discrete_location56,1889
-    discrete_location(62,2044
-    void assign_neighbor(66,2184
-class agent:agent75,2508
+    virtual void compute_next_state(21,843
+    virtual void step(22,889
+const int max_num_directions 31,1220
+class location:location33,1290
+    location(43,1643
+class irregular_location:irregular_location47,1687
+    irregular_location(51,1763
+class discrete_location:discrete_location56,1890
+    discrete_location(62,2045
+    void assign_neighbor(66,2185
+class agent:agent75,2509
 
 cp-src/fail.C,294
 struct A 7,263
@@ -2382,28 +2382,28 @@ el-src/emacs/lisp/progmodes/etags.el,5069
 (defun next-file 1685,67976
 (defvar tags-loop-operate 1760,70890
 (defvar tags-loop-scan1763,70984
-(defun tags-loop-eval 1771,71314
-(defun tags-loop-continue 1782,71643
-(defun tags-search 1850,73949
-(defun tags-query-replace 1871,74775
-(defun tags-complete-tags-table-file 1896,75999
-(defun list-tags 1906,76378
-(defun tags-apropos 1934,77331
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
-(defun select-tags-table 1964,78396
-(defvar select-tags-table-mode-map 2019,80523
-(define-derived-mode select-tags-table-mode 2030,80906
-(defun select-tags-table-select 2034,81090
-(defun select-tags-table-quit 2043,81456
-(defun complete-tag 2049,81611
-(defconst etags--xref-limit 2074,82552
-(defvar etags-xref-find-definitions-tag-order 2076,82587
-(defun etags-xref-find 2082,82877
-(defun etags--xref-find-definitions 2096,83406
-(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
+(defun tags-loop-eval 1771,71313
+(defun tags-loop-continue 1782,71642
+(defun tags-search 1850,73948
+(defun tags-query-replace 1871,74774
+(defun tags-complete-tags-table-file 1896,75998
+(defun list-tags 1906,76377
+(defun tags-apropos 1934,77330
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78156
+(defun select-tags-table 1964,78395
+(defvar select-tags-table-mode-map 2019,80522
+(define-derived-mode select-tags-table-mode 2030,80905
+(defun select-tags-table-select 2034,81089
+(defun select-tags-table-quit 2043,81455
+(defun complete-tag 2049,81610
+(defconst etags--xref-limit 2074,82551
+(defvar etags-xref-find-definitions-tag-order 2076,82586
+(defun etags-xref-find 2082,82876
+(defun etags--xref-find-definitions 2096,83405
+(defclass xref-etags-location 2129,85120
+(defun xref-make-etags-location 2135,85343
+(cl-defmethod xref-location-marker 2139,85498
+(cl-defmethod xref-location-line 2146,85742
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
@@ -2500,49 +2500,63 @@ function MoveLayerBottom 223,5079
 function MoveLayerBefore 236,5457
 function MoveLayerAfter 258,6090
 
+lua-src/test.lua,442
+function Rectangle.getPos 2,15
+function Rectangle.getPos getPos2,15
+function Circle.getPos 6,61
+function Circle.getPos getPos6,61
+function Cube.data.getFoo 10,102
+function Cube.data.getFoo getFoo10,102
+function Square.something:Bar 14,148
+function Square.something:Bar Bar14,148
+   function test.me_22a(22,241
+   function test.me_22a(me_22a22,241
+   local function test.me22b 25,297
+   local function test.me22b me22b25,297
+
 make-src/Makefile,1133
 LATEST=1,0
-NONSRCS=35,1578
-CPPFLAGS=49,2191
-LDFLAGS=50,2260
-FASTCFLAGS=55,2531
-FILTER=58,2642
-       @-$($72,3064
-       @-$($73,3113
-       @-$($74,3177
-       @-$($75,3223
-       @-$($76,3291
-       @-$($77,3383
-       @$(81,3466
-       @$(82,3514
-       @$(83,3577
-       @$(84,3622
-       @$(85,3689
-       @$(86,3780
-${CHECKOBJS}: CFLAGS=88,3806
-       @env CHECKEROPTS=92,3922
-       @$(98,4094
-       @$(106,4250
-       @$(110,4374
-       @$(114,4500
-       @for i in $(SRCS); do echo $$i;140,5315
-       $(160,6053
-       $(163,6114
-       $(166,6177
-       $(169,6228
-       $(172,6317
-       sdiff --suppress-common-lines --width=width186,6614
-       sdiff --suppress-common-lines --width=width189,6703
-       sdiff --suppress-common-lines --width=width192,6791
-       sdiff --suppress-common-lines --width=width195,6880
-       TEXTAGS=204,7122
-       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
-       ${RUN} etags12 --members -o $@ --regex=regex207,7239
-       ${RUN} ./ctags -o $@ --regex=regex213,7388
-       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
-       TEXTAGS=219,7583
-       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
-       ${RUN} ./extags -e --regex-c=c222,7710
+NONSRCS=35,1577
+CPPFLAGS=49,2190
+LDFLAGS=50,2259
+FASTCFLAGS=55,2530
+FILTER=58,2641
+       @-$($72,3063
+       @-$($73,3112
+       @-$($74,3176
+       @-$($75,3222
+       @-$($76,3290
+       @-$($77,3382
+       @$(81,3465
+       @$(82,3513
+       @$(83,3576
+       @$(84,3621
+       @$(85,3688
+       @$(86,3779
+${CHECKOBJS}: CFLAGS=88,3805
+       @env CHECKEROPTS=92,3921
+       @$(98,4093
+       @$(106,4249
+       @$(110,4373
+       @$(114,4499
+       @for i in $(SRCS); do echo $$i;140,5320
+       $(160,6058
+       $(163,6119
+       $(166,6182
+       $(169,6233
+       $(172,6322
+       sdiff --suppress-common-lines --width=width186,6619
+       sdiff --suppress-common-lines --width=width189,6708
+       sdiff --suppress-common-lines --width=width192,6796
+       sdiff --suppress-common-lines --width=width195,6885
+       TEXTAGS=204,7127
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7127
+       ${RUN} etags12 --members -o $@ --regex=regex207,7244
+       ${RUN} ./ctags -o $@ --regex=regex213,7393
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7469
+       TEXTAGS=219,7588
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7588
+       ${RUN} ./extags -e --regex-c=c222,7715
 
 objc-src/Subprocess.h,98
 #define Subprocess 41,1217
@@ -3127,6 +3141,31 @@ class Configure(760,24879
     def save(797,26022
     def nosave(807,26310
 
+ruby-src/test.rb,594
+module ModuleExample1,0
+    class ClassExample2,21
+        def class_method3,44
+        def ClassExample.singleton_class_method6,116
+        def class_method_exclamation!9,221
+        def class_method_question?12,319
+        def class_method_equals=class_method_equals=15,411
+        def `(18,499
+        def +(21,589
+        def [](24,637
+        def []=([]=27,687
+        def <<(30,749
+        def ==(==33,799
+        def <=(<=36,869
+        def <=>(<=>39,940
+        def ===(===42,987
+    def module_method46,1048
+    def ModuleExample.singleton_module_method49,1110
+
+ruby-src/test1.ruby,37
+class A1,0
+ def a(2,8
+ def b(5,38
+
 tex-src/testenv.tex,52
 \newcommand{\nm}\nm4,77
 \section{blah}blah8,139
diff --git a/test/manual/etags/ETAGS.good_5 b/test/manual/etags/ETAGS.good_5
index 544a166..425e252 100644
--- a/test/manual/etags/ETAGS.good_5
+++ b/test/manual/etags/ETAGS.good_5
@@ -3113,32 +3113,32 @@ class generic_object13,520
     int where_in_registry;15,547
     generic_object(17,582
     ~generic_object(19,724
-    virtual void compute_next_state(21,842
-    virtual void step(22,888
-const int max_num_directions 31,1219
-class location:location33,1289
-    location(43,1642
-    ~location(44,1661
-class irregular_location:irregular_location47,1686
-    double x,49,1734
-    double x, y,49,1734
-    double x, y, z;49,1734
-    irregular_location(51,1762
-    ~irregular_location(53,1854
-class discrete_location:discrete_location56,1889
-    int x,58,1936
-    int x, y,58,1936
-    int x, y, z;58,1936
-    class location *neighbors[neighbors59,1953
-    void clear_neighbors(60,2004
-    discrete_location(62,2044
-    ~discrete_location(65,2154
-    void assign_neighbor(66,2184
-class agent:agent75,2508
-    location *where;where77,2549
-    agent(79,2578
-    ~agent(80,2591
-    void move(81,2605
+    virtual void compute_next_state(21,843
+    virtual void step(22,889
+const int max_num_directions 31,1220
+class location:location33,1290
+    location(43,1643
+    ~location(44,1662
+class irregular_location:irregular_location47,1687
+    double x,49,1735
+    double x, y,49,1735
+    double x, y, z;49,1735
+    irregular_location(51,1763
+    ~irregular_location(53,1855
+class discrete_location:discrete_location56,1890
+    int x,58,1937
+    int x, y,58,1937
+    int x, y, z;58,1937
+    class location *neighbors[neighbors59,1954
+    void clear_neighbors(60,2005
+    discrete_location(62,2045
+    ~discrete_location(65,2155
+    void assign_neighbor(66,2185
+class agent:agent75,2509
+    location *where;where77,2550
+    agent(79,2579
+    ~agent(80,2592
+    void move(81,2606
 
 cp-src/fail.C,351
 struct A 7,263
@@ -3268,28 +3268,28 @@ el-src/emacs/lisp/progmodes/etags.el,5188
 (defun next-file 1685,67976
 (defvar tags-loop-operate 1760,70890
 (defvar tags-loop-scan1763,70984
-(defun tags-loop-eval 1771,71314
-(defun tags-loop-continue 1782,71643
-(defun tags-search 1850,73949
-(defun tags-query-replace 1871,74775
-(defun tags-complete-tags-table-file 1896,75999
-(defun list-tags 1906,76378
-(defun tags-apropos 1934,77331
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
-(defun select-tags-table 1964,78396
-(defvar select-tags-table-mode-map 2019,80523
-(define-derived-mode select-tags-table-mode 2030,80906
-(defun select-tags-table-select 2034,81090
-(defun select-tags-table-quit 2043,81456
-(defun complete-tag 2049,81611
-(defconst etags--xref-limit 2074,82552
-(defvar etags-xref-find-definitions-tag-order 2076,82587
-(defun etags-xref-find 2082,82877
-(defun etags--xref-find-definitions 2096,83406
-(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
+(defun tags-loop-eval 1771,71313
+(defun tags-loop-continue 1782,71642
+(defun tags-search 1850,73948
+(defun tags-query-replace 1871,74774
+(defun tags-complete-tags-table-file 1896,75998
+(defun list-tags 1906,76377
+(defun tags-apropos 1934,77330
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78156
+(defun select-tags-table 1964,78395
+(defvar select-tags-table-mode-map 2019,80522
+(define-derived-mode select-tags-table-mode 2030,80905
+(defun select-tags-table-select 2034,81089
+(defun select-tags-table-quit 2043,81455
+(defun complete-tag 2049,81610
+(defconst etags--xref-limit 2074,82551
+(defvar etags-xref-find-definitions-tag-order 2076,82586
+(defun etags-xref-find 2082,82876
+(defun etags--xref-find-definitions 2096,83405
+(defclass xref-etags-location 2129,85120
+(defun xref-make-etags-location 2135,85343
+(cl-defmethod xref-location-marker 2139,85498
+(cl-defmethod xref-location-line 2146,85742
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
@@ -3386,50 +3386,64 @@ function MoveLayerBottom 223,5079
 function MoveLayerBefore 236,5457
 function MoveLayerAfter 258,6090
 
+lua-src/test.lua,442
+function Rectangle.getPos 2,15
+function Rectangle.getPos getPos2,15
+function Circle.getPos 6,61
+function Circle.getPos getPos6,61
+function Cube.data.getFoo 10,102
+function Cube.data.getFoo getFoo10,102
+function Square.something:Bar 14,148
+function Square.something:Bar Bar14,148
+   function test.me_22a(22,241
+   function test.me_22a(me_22a22,241
+   local function test.me22b 25,297
+   local function test.me22b me22b25,297
+
 make-src/Makefile,1156
 LATEST=1,0
-NONSRCS=35,1578
-CPPFLAGS=49,2191
-LDFLAGS=50,2260
-FASTCFLAGS=55,2531
-FILTER=58,2642
-       @-$($72,3064
-       @-$($73,3113
-       @-$($74,3177
-       @-$($75,3223
-       @-$($76,3291
-       @-$($77,3383
-       @$(81,3466
-       @$(82,3514
-       @$(83,3577
-       @$(84,3622
-       @$(85,3689
-       @$(86,3780
-${CHECKOBJS}: CFLAGS=88,3806
-       @env CHECKEROPTS=92,3922
-       @$(98,4094
-       @$(106,4250
-       @$(110,4374
-       @$(114,4500
-       @for i in $(140,5315
-       @for i in $(SRCS); do echo $$i;140,5315
-       $(160,6053
-       $(163,6114
-       $(166,6177
-       $(169,6228
-       $(172,6317
-       sdiff --suppress-common-lines --width=width186,6614
-       sdiff --suppress-common-lines --width=width189,6703
-       sdiff --suppress-common-lines --width=width192,6791
-       sdiff --suppress-common-lines --width=width195,6880
-       TEXTAGS=204,7122
-       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
-       ${RUN} etags12 --members -o $@ --regex=regex207,7239
-       ${RUN} ./ctags -o $@ --regex=regex213,7388
-       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
-       TEXTAGS=219,7583
-       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
-       ${RUN} ./extags -e --regex-c=c222,7710
+NONSRCS=35,1577
+CPPFLAGS=49,2190
+LDFLAGS=50,2259
+FASTCFLAGS=55,2530
+FILTER=58,2641
+       @-$($72,3063
+       @-$($73,3112
+       @-$($74,3176
+       @-$($75,3222
+       @-$($76,3290
+       @-$($77,3382
+       @$(81,3465
+       @$(82,3513
+       @$(83,3576
+       @$(84,3621
+       @$(85,3688
+       @$(86,3779
+${CHECKOBJS}: CFLAGS=88,3805
+       @env CHECKEROPTS=92,3921
+       @$(98,4093
+       @$(106,4249
+       @$(110,4373
+       @$(114,4499
+       @for i in $(140,5320
+       @for i in $(SRCS); do echo $$i;140,5320
+       $(160,6058
+       $(163,6119
+       $(166,6182
+       $(169,6233
+       $(172,6322
+       sdiff --suppress-common-lines --width=width186,6619
+       sdiff --suppress-common-lines --width=width189,6708
+       sdiff --suppress-common-lines --width=width192,6796
+       sdiff --suppress-common-lines --width=width195,6885
+       TEXTAGS=204,7127
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7127
+       ${RUN} etags12 --members -o $@ --regex=regex207,7244
+       ${RUN} ./ctags -o $@ --regex=regex213,7393
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7469
+       TEXTAGS=219,7588
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7588
+       ${RUN} ./extags -e --regex-c=c222,7715
 
 objc-src/Subprocess.h,98
 #define Subprocess 41,1217
@@ -4042,6 +4056,31 @@ class Configure(760,24879
     def save(797,26022
     def nosave(807,26310
 
+ruby-src/test.rb,594
+module ModuleExample1,0
+    class ClassExample2,21
+        def class_method3,44
+        def ClassExample.singleton_class_method6,116
+        def class_method_exclamation!9,221
+        def class_method_question?12,319
+        def class_method_equals=class_method_equals=15,411
+        def `(18,499
+        def +(21,589
+        def [](24,637
+        def []=([]=27,687
+        def <<(30,749
+        def ==(==33,799
+        def <=(<=36,869
+        def <=>(<=>39,940
+        def ===(===42,987
+    def module_method46,1048
+    def ModuleExample.singleton_module_method49,1110
+
+ruby-src/test1.ruby,37
+class A1,0
+ def a(2,8
+ def b(5,38
+
 tex-src/testenv.tex,52
 \newcommand{\nm}\nm4,77
 \section{blah}blah8,139
diff --git a/test/manual/etags/ETAGS.good_6 b/test/manual/etags/ETAGS.good_6
index f3d17b1..39522db 100644
--- a/test/manual/etags/ETAGS.good_6
+++ b/test/manual/etags/ETAGS.good_6
@@ -3113,32 +3113,32 @@ class generic_object13,520
     int where_in_registry;generic_object::where_in_registry15,547
     generic_object(generic_object::generic_object17,582
     ~generic_object(generic_object::~generic_object19,724
-    virtual void compute_next_state(generic_object::compute_next_state21,842
-    virtual void step(generic_object::step22,888
-const int max_num_directions 31,1219
-class location:location33,1289
-    location(location::location43,1642
-    ~location(location::~location44,1661
-class irregular_location:irregular_location47,1686
-    double x,irregular_location::x49,1734
-    double x, y,irregular_location::y49,1734
-    double x, y, z;irregular_location::z49,1734
-    irregular_location(irregular_location::irregular_location51,1762
-    ~irregular_location(irregular_location::~irregular_location53,1854
-class discrete_location:discrete_location56,1889
-    int x,discrete_location::x58,1936
-    int x, y,discrete_location::y58,1936
-    int x, y, z;discrete_location::z58,1936
-    class location *neighbors[discrete_location::neighbors59,1953
-    void clear_neighbors(discrete_location::clear_neighbors60,2004
-    discrete_location(discrete_location::discrete_location62,2044
-    ~discrete_location(discrete_location::~discrete_location65,2154
-    void assign_neighbor(discrete_location::assign_neighbor66,2184
-class agent:agent75,2508
-    location *where;agent::where77,2549
-    agent(agent::agent79,2578
-    ~agent(agent::~agent80,2591
-    void move(agent::move81,2605
+    virtual void compute_next_state(generic_object::compute_next_state21,843
+    virtual void step(generic_object::step22,889
+const int max_num_directions 31,1220
+class location:location33,1290
+    location(location::location43,1643
+    ~location(location::~location44,1662
+class irregular_location:irregular_location47,1687
+    double x,irregular_location::x49,1735
+    double x, y,irregular_location::y49,1735
+    double x, y, z;irregular_location::z49,1735
+    irregular_location(irregular_location::irregular_location51,1763
+    ~irregular_location(irregular_location::~irregular_location53,1855
+class discrete_location:discrete_location56,1890
+    int x,discrete_location::x58,1937
+    int x, y,discrete_location::y58,1937
+    int x, y, z;discrete_location::z58,1937
+    class location *neighbors[discrete_location::neighbors59,1954
+    void clear_neighbors(discrete_location::clear_neighbors60,2005
+    discrete_location(discrete_location::discrete_location62,2045
+    ~discrete_location(discrete_location::~discrete_location65,2155
+    void assign_neighbor(discrete_location::assign_neighbor66,2185
+class agent:agent75,2509
+    location *where;agent::where77,2550
+    agent(agent::agent79,2579
+    ~agent(agent::~agent80,2592
+    void move(agent::move81,2606
 
 cp-src/fail.C,438
 struct A 7,263
@@ -3268,28 +3268,28 @@ el-src/emacs/lisp/progmodes/etags.el,5188
 (defun next-file 1685,67976
 (defvar tags-loop-operate 1760,70890
 (defvar tags-loop-scan1763,70984
-(defun tags-loop-eval 1771,71314
-(defun tags-loop-continue 1782,71643
-(defun tags-search 1850,73949
-(defun tags-query-replace 1871,74775
-(defun tags-complete-tags-table-file 1896,75999
-(defun list-tags 1906,76378
-(defun tags-apropos 1934,77331
-(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
-(defun select-tags-table 1964,78396
-(defvar select-tags-table-mode-map 2019,80523
-(define-derived-mode select-tags-table-mode 2030,80906
-(defun select-tags-table-select 2034,81090
-(defun select-tags-table-quit 2043,81456
-(defun complete-tag 2049,81611
-(defconst etags--xref-limit 2074,82552
-(defvar etags-xref-find-definitions-tag-order 2076,82587
-(defun etags-xref-find 2082,82877
-(defun etags--xref-find-definitions 2096,83406
-(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
+(defun tags-loop-eval 1771,71313
+(defun tags-loop-continue 1782,71642
+(defun tags-search 1850,73948
+(defun tags-query-replace 1871,74774
+(defun tags-complete-tags-table-file 1896,75998
+(defun list-tags 1906,76377
+(defun tags-apropos 1934,77330
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78156
+(defun select-tags-table 1964,78395
+(defvar select-tags-table-mode-map 2019,80522
+(define-derived-mode select-tags-table-mode 2030,80905
+(defun select-tags-table-select 2034,81089
+(defun select-tags-table-quit 2043,81455
+(defun complete-tag 2049,81610
+(defconst etags--xref-limit 2074,82551
+(defvar etags-xref-find-definitions-tag-order 2076,82586
+(defun etags-xref-find 2082,82876
+(defun etags--xref-find-definitions 2096,83405
+(defclass xref-etags-location 2129,85120
+(defun xref-make-etags-location 2135,85343
+(cl-defmethod xref-location-marker 2139,85498
+(cl-defmethod xref-location-line 2146,85742
 
 erl-src/gs_dialog.erl,98
 -define(VERSION2,32
@@ -3386,50 +3386,64 @@ function MoveLayerBottom 223,5079
 function MoveLayerBefore 236,5457
 function MoveLayerAfter 258,6090
 
+lua-src/test.lua,442
+function Rectangle.getPos 2,15
+function Rectangle.getPos getPos2,15
+function Circle.getPos 6,61
+function Circle.getPos getPos6,61
+function Cube.data.getFoo 10,102
+function Cube.data.getFoo getFoo10,102
+function Square.something:Bar 14,148
+function Square.something:Bar Bar14,148
+   function test.me_22a(22,241
+   function test.me_22a(me_22a22,241
+   local function test.me22b 25,297
+   local function test.me22b me22b25,297
+
 make-src/Makefile,1156
 LATEST=1,0
-NONSRCS=35,1578
-CPPFLAGS=49,2191
-LDFLAGS=50,2260
-FASTCFLAGS=55,2531
-FILTER=58,2642
-       @-$($72,3064
-       @-$($73,3113
-       @-$($74,3177
-       @-$($75,3223
-       @-$($76,3291
-       @-$($77,3383
-       @$(81,3466
-       @$(82,3514
-       @$(83,3577
-       @$(84,3622
-       @$(85,3689
-       @$(86,3780
-${CHECKOBJS}: CFLAGS=88,3806
-       @env CHECKEROPTS=92,3922
-       @$(98,4094
-       @$(106,4250
-       @$(110,4374
-       @$(114,4500
-       @for i in $(140,5315
-       @for i in $(SRCS); do echo $$i;140,5315
-       $(160,6053
-       $(163,6114
-       $(166,6177
-       $(169,6228
-       $(172,6317
-       sdiff --suppress-common-lines --width=width186,6614
-       sdiff --suppress-common-lines --width=width189,6703
-       sdiff --suppress-common-lines --width=width192,6791
-       sdiff --suppress-common-lines --width=width195,6880
-       TEXTAGS=204,7122
-       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
-       ${RUN} etags12 --members -o $@ --regex=regex207,7239
-       ${RUN} ./ctags -o $@ --regex=regex213,7388
-       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
-       TEXTAGS=219,7583
-       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
-       ${RUN} ./extags -e --regex-c=c222,7710
+NONSRCS=35,1577
+CPPFLAGS=49,2190
+LDFLAGS=50,2259
+FASTCFLAGS=55,2530
+FILTER=58,2641
+       @-$($72,3063
+       @-$($73,3112
+       @-$($74,3176
+       @-$($75,3222
+       @-$($76,3290
+       @-$($77,3382
+       @$(81,3465
+       @$(82,3513
+       @$(83,3576
+       @$(84,3621
+       @$(85,3688
+       @$(86,3779
+${CHECKOBJS}: CFLAGS=88,3805
+       @env CHECKEROPTS=92,3921
+       @$(98,4093
+       @$(106,4249
+       @$(110,4373
+       @$(114,4499
+       @for i in $(140,5320
+       @for i in $(SRCS); do echo $$i;140,5320
+       $(160,6058
+       $(163,6119
+       $(166,6182
+       $(169,6233
+       $(172,6322
+       sdiff --suppress-common-lines --width=width186,6619
+       sdiff --suppress-common-lines --width=width189,6708
+       sdiff --suppress-common-lines --width=width192,6796
+       sdiff --suppress-common-lines --width=width195,6885
+       TEXTAGS=204,7127
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7127
+       ${RUN} etags12 --members -o $@ --regex=regex207,7244
+       ${RUN} ./ctags -o $@ --regex=regex213,7393
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7469
+       TEXTAGS=219,7588
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7588
+       ${RUN} ./extags -e --regex-c=c222,7715
 
 objc-src/Subprocess.h,98
 #define Subprocess 41,1217
@@ -4042,6 +4056,31 @@ class Configure(760,24879
     def save(797,26022
     def nosave(807,26310
 
+ruby-src/test.rb,594
+module ModuleExample1,0
+    class ClassExample2,21
+        def class_method3,44
+        def ClassExample.singleton_class_method6,116
+        def class_method_exclamation!9,221
+        def class_method_question?12,319
+        def class_method_equals=class_method_equals=15,411
+        def `(18,499
+        def +(21,589
+        def [](24,637
+        def []=([]=27,687
+        def <<(30,749
+        def ==(==33,799
+        def <=(<=36,869
+        def <=>(<=>39,940
+        def ===(===42,987
+    def module_method46,1048
+    def ModuleExample.singleton_module_method49,1110
+
+ruby-src/test1.ruby,37
+class A1,0
+ def a(2,8
+ def b(5,38
+
 tex-src/testenv.tex,52
 \newcommand{\nm}\nm4,77
 \section{blah}blah8,139
diff --git a/test/manual/etags/Makefile b/test/manual/etags/Makefile
index f5cf2ae..4d9f358 100644
--- a/test/manual/etags/Makefile
+++ b/test/manual/etags/Makefile
@@ -13,7 +13,7 @@ FORTHSRC=$(addprefix ./forth-src/,test-forth.fth)
 FSRC=$(addprefix ./f-src/,entry.for entry.strange_suffix entry.strange)
 HTMLSRC=$(addprefix ./html-src/,softwarelibero.html index.shtml algrthms.html 
software.html)
 #JAVASRC=$(addprefix ./java-src/, )
-LUASRC=$(addprefix ./lua-src/,allegro.lua)
+LUASRC=$(addprefix ./lua-src/,allegro.lua test.lua)
 MAKESRC=$(addprefix ./make-src/,Makefile)
 OBJCSRC=$(addprefix ./objc-src/,Subprocess.h Subprocess.m PackInsp.h 
PackInsp.m)
 OBJCPPSRC=$(addprefix ./objcpp-src/,SimpleCalc.H SimpleCalc.M)
@@ -23,12 +23,13 @@ PHPSRC=$(addprefix ./php-src/,lce_functions.php ptest.php 
sendmail.php)
 PSSRC=$(addprefix ./ps-src/,rfc1245.ps)
 PROLSRC=$(addprefix ./prol-src/,ordsets.prolog natded.prolog)
 PYTSRC=$(addprefix ./pyt-src/,server.py)
+RBSRC=$(addprefix ./ruby-src/,test.rb test1.ruby)
 TEXSRC=$(addprefix ./tex-src/,testenv.tex gzip.texi texinfo.tex nonewline.tex)
 YSRC=$(addprefix ./y-src/,parse.y parse.c atest.y cccp.c cccp.y)
 SRCS=${ADASRC} ${ASRC} ${CSRC} ${CPSRC} ${ELSRC} ${ERLSRC} ${FSRC}\
      ${FORTHSRC} ${HTMLSRC} ${JAVASRC} ${LUASRC} ${MAKESRC} ${OBJCSRC}\
      ${OBJCPPSRC} ${PASSRC} ${PHPSRC} ${PERLSRC} ${PSSRC} ${PROLSRC} ${PYTSRC}\
-     ${TEXSRC} ${YSRC}
+     ${RBSRC} ${TEXSRC} ${YSRC}
 NONSRCS=./f-src/entry.strange ./erl-src/lists.erl ./cp-src/clheir.hpp.gz
 
 ETAGS_PROG=../../../lib-src/etags
diff --git a/test/manual/indent/js.js b/test/manual/indent/js.js
index d897b9f..9a1e0dc 100644
--- a/test/manual/indent/js.js
+++ b/test/manual/indent/js.js
@@ -76,6 +76,20 @@ class A {
   }
 }
 
+if (true)
+  1
+else
+  2
+
+Foobar
+  .find()
+  .catch((err) => {
+    return 2;
+  })
+  .then((num) => {
+    console.log(num);
+  });
+
 // Local Variables:
 // indent-tabs-mode: nil
 // js-indent-level: 2
diff --git a/test/src/keymap-tests.el b/test/src/keymap-tests.el
index 973b240..524563f 100644
--- a/test/src/keymap-tests.el
+++ b/test/src/keymap-tests.el
@@ -23,7 +23,7 @@
 
 (require 'ert)
 
-(ert-deftest keymap-store_in_keymap-FASTINT-on-nonchars ()
+(ert-deftest keymap-store_in_keymap-XFASTINT-on-non-characters ()
   "Check for bug fixed in \"Fix assertion violation in define-key\",
 commit 86c19714b097aa477d339ed99ffb5136c755a046."
   (let ((def (lookup-key Buffer-menu-mode-map [32])))



reply via email to

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